diff --git a/README.md b/README.md index 7c8ac80..8ed68cf 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,18 @@ An Android client for Open-Feeedback https://github.com/HugoGresse/open-feedback The Composable `OpenFeedback` is the entry point to vote on a session. It'll make calls between the Firebase which host your OpenFeedback instance and your mobile application. It is -mandatory to pass the `OpenFeedbackState` to give the Firebase configuration and your open-feedback -configuration which is common for all sessions of your event. +mandatory to pass the `OpenFeedbackFirebaseConfig` to give the Firebase instance which is common +for all sessions of your event. + +Note that it is mandatory to keep this instance unique in your application because it creates the +`FirebaseApp` instance which is the active connection between your mobile application and the +OpenFeedback Firebase host. Consider to save this configuration in your custom `Application` class +or in singleton in your dependency injection. ```kotlin // In your Application class -val firebaseConfig = FirebaseConfig( +val openfeedbackFirebaseConfig = OpenFeedbackFirebaseConfig( + context = applicationContext, projectId = "", applicationId = "", apiKey = "", @@ -23,7 +29,7 @@ val firebaseConfig = FirebaseConfig( // In your Compose screen OpenFeedback( - config = MyApp.firebaseConfig, + config = (application as MyApp).openfeedbackFirebaseConfig, projectId = "", sessionId = "", language = "" @@ -32,7 +38,12 @@ OpenFeedback( That's all! -If you want to see an example, please check the [sample-app](sample-app/src/main/java/io/openfeedback/android/sample/MainActivity.kt). +See the [sample-app](sample-app/src/main/java/io/openfeedback/android/sample/MainActivity.kt) app +module if you want to see this implementation in action. + +If you are interested to create your own UI, you can use the component `OpenFeedbackLayout`. This +`Composable` takes OpenFeedback Model UI in input and you can use `OpenFeedbackViewModel` in the +viewmodel artifact to get the data from the Firebase host. ## Installation @@ -43,11 +54,14 @@ repositories { mavenCentral() } +val openfeedbackVersion = "0.0.6" dependencies { // Material 2 - implementation("io.openfeedback:feedback-android-sdk-m2:0.0.6") + implementation("io.openfeedback:feedback-android-sdk-m2:$openfeedbackVersion") // Material 3 - implementation("io.openfeedback:feedback-android-sdk-m3:0.0.6") + implementation("io.openfeedback:feedback-android-sdk-m3:$openfeedbackVersion") + // ViewModel + implementation("io.openfeedback:feedback-android-sdk-viewmodel:$openfeedbackVersion") } ``` diff --git a/openfeedback-m2/src/main/java/io/openfeedback/android/m2/OpenFeedbackLayout.kt b/openfeedback-m2/src/main/java/io/openfeedback/android/m2/OpenFeedbackLayout.kt index 99ace12..1355cb9 100644 --- a/openfeedback-m2/src/main/java/io/openfeedback/android/m2/OpenFeedbackLayout.kt +++ b/openfeedback-m2/src/main/java/io/openfeedback/android/m2/OpenFeedbackLayout.kt @@ -11,7 +11,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import io.openfeedback.android.FirebaseConfig +import io.openfeedback.android.viewmodels.OpenFeedbackFirebaseConfig import io.openfeedback.android.viewmodels.OpenFeedbackUiState import io.openfeedback.android.viewmodels.OpenFeedbackViewModel import io.openfeedback.android.viewmodels.models.UISessionFeedback @@ -19,18 +19,16 @@ import io.openfeedback.android.viewmodels.models.UIVoteItem @Composable fun OpenFeedback( - config: FirebaseConfig, + config: OpenFeedbackFirebaseConfig, projectId: String, sessionId: String, language: String, modifier: Modifier = Modifier, loading: @Composable () -> Unit = { Loading(modifier = modifier) } ) { - val context = LocalContext.current val viewModel: OpenFeedbackViewModel = viewModel( factory = OpenFeedbackViewModel.Factory.create( - context = context, - firebaseConfig = config, + firebaseApp = config.firebaseApp, projectId = projectId, sessionId = sessionId, language = language diff --git a/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/OpenFeedbackLayout.kt b/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/OpenFeedbackLayout.kt index 2a7ada9..d75b8ba 100644 --- a/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/OpenFeedbackLayout.kt +++ b/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/OpenFeedbackLayout.kt @@ -1,42 +1,50 @@ package io.openfeedback.android.m3 +import android.content.res.Configuration +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import io.openfeedback.android.FirebaseConfig +import io.openfeedback.android.viewmodels.OpenFeedbackFirebaseConfig import io.openfeedback.android.viewmodels.OpenFeedbackUiState import io.openfeedback.android.viewmodels.OpenFeedbackViewModel +import io.openfeedback.android.viewmodels.models.UIDot import io.openfeedback.android.viewmodels.models.UISessionFeedback import io.openfeedback.android.viewmodels.models.UIVoteItem +@OptIn(ExperimentalMaterial3Api::class) @Composable fun OpenFeedback( - config: FirebaseConfig, + config: OpenFeedbackFirebaseConfig, projectId: String, sessionId: String, language: String, modifier: Modifier = Modifier, loading: @Composable () -> Unit = { Loading(modifier = modifier) } ) { - val context = LocalContext.current + val configuration = LocalConfiguration.current val viewModel: OpenFeedbackViewModel = viewModel( factory = OpenFeedbackViewModel.Factory.create( - context = context, - firebaseConfig = config, + firebaseApp = config.firebaseApp, projectId = projectId, sessionId = sessionId, language = language ) ) + val columnCount = if (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) 4 else 2 val uiState = viewModel.uiState.collectAsState() when (uiState.value) { is OpenFeedbackUiState.Loading -> loading() @@ -45,7 +53,16 @@ fun OpenFeedback( OpenFeedbackLayout( sessionFeedback = session, modifier = modifier, - onClick = { voteItem -> viewModel.vote(voteItem = voteItem) } + columnCount = columnCount, + content = { + VoteCard( + voteModel = it, + onClick = { voteItem -> viewModel.vote(voteItem = voteItem) }, + modifier = Modifier + .height(100.dp) + .fillMaxWidth() + ) + } ) } } @@ -56,10 +73,19 @@ fun OpenFeedback( fun OpenFeedbackLayout( sessionFeedback: UISessionFeedback, modifier: Modifier = Modifier, - onClick: (voteItem: UIVoteItem) -> Unit + columnCount: Int = 2, + horizontalArrangement: Arrangement.Horizontal = Arrangement.spacedBy(8.dp), + verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(8.dp), + content: @Composable ColumnScope.(UIVoteItem) -> Unit ) { Column(modifier = modifier) { - VoteItems(voteItems = sessionFeedback.voteItem, onClick = onClick) + VoteItems( + voteItems = sessionFeedback.voteItem, + columnCount = columnCount, + horizontalArrangement = horizontalArrangement, + verticalArrangement = verticalArrangement, + content = content + ) Box( modifier = Modifier .fillMaxWidth() @@ -70,3 +96,40 @@ fun OpenFeedbackLayout( } } } + +@OptIn(ExperimentalMaterial3Api::class) +@Preview +@Composable +private fun OpenFeedbackLayoutPreview() { + MaterialTheme { + OpenFeedbackLayout( + sessionFeedback = UISessionFeedback( + comments = emptyList(), + listOf( + UIVoteItem( + id = "", + text = "Fun", + dots = listOf(UIDot(x = .5f, y = .5f, color = "FF00CC")), + votedByUser = true + ), + UIVoteItem( + id = "", + text = "Fun", + dots = listOf(UIDot(x = .5f, y = .5f, color = "FF00CC")), + votedByUser = true + ) + ) + ), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + VoteCard( + voteModel = it, + onClick = {}, + modifier = Modifier + .height(100.dp) + .fillMaxWidth() + ) + } + } +} diff --git a/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/VoteCard.kt b/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/VoteCard.kt index 1c4376a..d3f14f9 100644 --- a/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/VoteCard.kt +++ b/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/VoteCard.kt @@ -1,33 +1,35 @@ package io.openfeedback.android.m3 import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.drawscope.Fill import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import io.openfeedback.android.viewmodels.models.UIDot import io.openfeedback.android.viewmodels.models.UIVoteItem @ExperimentalMaterial3Api @Composable -internal fun VoteCard( +fun VoteCard( voteModel: UIVoteItem, modifier: Modifier = Modifier, style: TextStyle = MaterialTheme.typography.bodyMedium, backgroundColor: Color = MaterialTheme.colorScheme.surface, - contentColor: Color = MaterialTheme.colorScheme.onSurface, + contentColor: Color = contentColorFor(backgroundColor = backgroundColor), shape: Shape = MaterialTheme.shapes.medium, onClick: (voteItem: UIVoteItem) -> Unit ) { @@ -39,23 +41,32 @@ internal fun VoteCard( modifier = modifier, onClick = { onClick(voteModel) } ) { - Box(modifier = Modifier.height(100.dp)) { - Canvas(modifier = Modifier.fillMaxSize()) { - voteModel.dots.forEach { dot -> - val offset = Offset(x = this.size.width * dot.x, y = this.size.height * dot.y) - drawCircle( - color = Color( - dot.color.substring(0, 2).toInt(16), - dot.color.substring(2, 4).toInt(16), - dot.color.substring(4, 6).toInt(16), - 255 / 3 - ), - radius = 30.dp.value, - center = offset, - style = Fill - ) + Box( + modifier = Modifier + .drawBehind { + voteModel.dots.forEach { dot -> + val offset = + Offset(x = this.size.width * dot.x, y = this.size.height * dot.y) + drawCircle( + color = Color( + dot.color + .substring(0, 2) + .toInt(16), + dot.color + .substring(2, 4) + .toInt(16), + dot.color + .substring(4, 6) + .toInt(16), + 255 / 3 + ), + radius = 30.dp.value, + center = offset, + style = Fill + ) + } } - } + ) { Text( text = voteModel.text, style = style, @@ -65,3 +76,21 @@ internal fun VoteCard( } } } + +@OptIn(ExperimentalMaterial3Api::class) +@Preview +@Composable +private fun VoteCardPreview() { + MaterialTheme { + VoteCard( + voteModel = UIVoteItem( + id = "", + text = "Fun", + dots = listOf(UIDot(x = .5f, y = .5f, color = "FF00CC")), + votedByUser = true + ), + onClick = {}, + modifier = Modifier.size(height = 100.dp, width = 200.dp) + ) + } +} diff --git a/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/VoteItems.kt b/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/VoteItems.kt index f446aab..4327426 100644 --- a/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/VoteItems.kt +++ b/openfeedback-m3/src/main/kotlin/io/openfeedback/android/m3/VoteItems.kt @@ -1,13 +1,18 @@ package io.openfeedback.android.m3 import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import io.openfeedback.android.viewmodels.models.UIDot import io.openfeedback.android.viewmodels.models.UIVoteItem @ExperimentalMaterial3Api @@ -16,26 +21,62 @@ internal fun VoteItems( voteItems: List, modifier: Modifier = Modifier, columnCount: Int = 2, - onClick: (voteItem: UIVoteItem) -> Unit + horizontalArrangement: Arrangement.Horizontal = Arrangement.spacedBy(8.dp), + verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(8.dp), + content: @Composable ColumnScope.(UIVoteItem) -> Unit ) { - val spaceGrid = 8.dp Row( modifier = modifier, - horizontalArrangement = Arrangement.spacedBy(spaceGrid) + horizontalArrangement = horizontalArrangement ) { 0.until(columnCount).forEach { column -> - Box(modifier = Modifier.weight(1f)) { - Column(verticalArrangement = Arrangement.spacedBy(spaceGrid)) { - voteItems.filterIndexed { index, _ -> + Column( + verticalArrangement = verticalArrangement, + modifier = Modifier.weight(1f) + ) { + voteItems + .filterIndexed { index, _ -> index % columnCount == column - }.forEach { voteItem -> - VoteCard( - voteModel = voteItem, - onClick = onClick - ) } - } + .forEach { voteItem -> + content(voteItem) + } } } } } + +@OptIn(ExperimentalMaterial3Api::class) +@Preview +@Composable +private fun VoteItemsPreview() { + MaterialTheme { + VoteItems( + voteItems = listOf( + UIVoteItem( + id = "", + text = "Fun", + dots = listOf(UIDot(x = .5f, y = .5f, color = "FF00CC")), + votedByUser = true + ), + UIVoteItem( + id = "", + text = "Fun", + dots = listOf(UIDot(x = .5f, y = .5f, color = "FF00CC")), + votedByUser = true + ) + ), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + content = { + VoteCard( + voteModel = it, + onClick = {}, + modifier = Modifier + .height(100.dp) + .fillMaxWidth() + ) + } + ) + } +} diff --git a/openfeedback/src/main/java/io/openfeedback/android/sources/FirebaseFactory.kt b/openfeedback-viewmodel/src/main/java/io/openfeedback/android/viewmodels/FirebaseFactory.kt similarity index 79% rename from openfeedback/src/main/java/io/openfeedback/android/sources/FirebaseFactory.kt rename to openfeedback-viewmodel/src/main/java/io/openfeedback/android/viewmodels/FirebaseFactory.kt index 41f5c70..dd75797 100644 --- a/openfeedback/src/main/java/io/openfeedback/android/sources/FirebaseFactory.kt +++ b/openfeedback-viewmodel/src/main/java/io/openfeedback/android/viewmodels/FirebaseFactory.kt @@ -1,14 +1,13 @@ -package io.openfeedback.android.sources +package io.openfeedback.android.viewmodels import android.content.Context import com.google.firebase.FirebaseApp import com.google.firebase.FirebaseOptions -import io.openfeedback.android.FirebaseConfig -object FirebaseFactory { +internal object FirebaseFactory { fun create( context: Context, - config: FirebaseConfig, + config: OpenFeedbackFirebaseConfig, appName: String = "openfeedback" ): FirebaseApp { val options = FirebaseOptions.Builder() diff --git a/openfeedback-viewmodel/src/main/java/io/openfeedback/android/viewmodels/OpenFeedbackFirebaseConfig.kt b/openfeedback-viewmodel/src/main/java/io/openfeedback/android/viewmodels/OpenFeedbackFirebaseConfig.kt new file mode 100644 index 0000000..a194ad6 --- /dev/null +++ b/openfeedback-viewmodel/src/main/java/io/openfeedback/android/viewmodels/OpenFeedbackFirebaseConfig.kt @@ -0,0 +1,16 @@ +package io.openfeedback.android.viewmodels + +import android.content.Context +import androidx.compose.runtime.Immutable + +@Immutable +data class OpenFeedbackFirebaseConfig( + val context: Context, + val projectId: String, + val applicationId: String, + val apiKey: String, + val databaseUrl: String, + val appName: String = "openfeedback" +) { + val firebaseApp = FirebaseFactory.create(context, this, appName) +} diff --git a/openfeedback-viewmodel/src/main/java/io/openfeedback/android/viewmodels/OpenFeedbackViewModel.kt b/openfeedback-viewmodel/src/main/java/io/openfeedback/android/viewmodels/OpenFeedbackViewModel.kt index fa3d99f..300996c 100644 --- a/openfeedback-viewmodel/src/main/java/io/openfeedback/android/viewmodels/OpenFeedbackViewModel.kt +++ b/openfeedback-viewmodel/src/main/java/io/openfeedback/android/viewmodels/OpenFeedbackViewModel.kt @@ -1,15 +1,12 @@ package io.openfeedback.android.viewmodels -import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import com.google.firebase.FirebaseApp -import io.openfeedback.android.FirebaseConfig import io.openfeedback.android.OpenFeedbackRepository import io.openfeedback.android.caches.OptimisticVoteCaching import io.openfeedback.android.model.VoteStatus -import io.openfeedback.android.sources.FirebaseFactory import io.openfeedback.android.sources.OpenFeedbackAuth import io.openfeedback.android.sources.OpenFeedbackFirestore import io.openfeedback.android.viewmodels.mappers.convertToUiSessionFeedback @@ -27,14 +24,14 @@ sealed class OpenFeedbackUiState { } class OpenFeedbackViewModel( - private val firebase: FirebaseApp, + private val firebaseApp: FirebaseApp, private val projectId: String, private val sessionId: String, private val language: String ) : ViewModel() { private val repository = OpenFeedbackRepository( - auth = OpenFeedbackAuth.Factory.create(firebase), - firestore = OpenFeedbackFirestore.Factory.create(firebase), + auth = OpenFeedbackAuth.Factory.create(firebaseApp), + firestore = OpenFeedbackFirestore.Factory.create(firebaseApp), optimisticVoteCaching = OptimisticVoteCaching() ) @@ -75,14 +72,13 @@ class OpenFeedbackViewModel( object Factory { fun create( - context: Context, - firebaseConfig: FirebaseConfig, + firebaseApp: FirebaseApp, projectId: String, sessionId: String, language: String ) = object : ViewModelProvider.Factory { override fun create(modelClass: Class): T = OpenFeedbackViewModel( - firebase = FirebaseFactory.create(context, firebaseConfig), + firebaseApp = firebaseApp, projectId = projectId, sessionId = sessionId, language = language diff --git a/openfeedback/src/main/java/io/openfeedback/android/FirebaseConfig.kt b/openfeedback/src/main/java/io/openfeedback/android/FirebaseConfig.kt deleted file mode 100644 index e9412af..0000000 --- a/openfeedback/src/main/java/io/openfeedback/android/FirebaseConfig.kt +++ /dev/null @@ -1,8 +0,0 @@ -package io.openfeedback.android - -class FirebaseConfig( - val projectId: String, - val applicationId: String, - val apiKey: String, - val databaseUrl: String -) \ No newline at end of file diff --git a/sample-app/src/main/AndroidManifest.xml b/sample-app/src/main/AndroidManifest.xml index c325d1e..3edf783 100644 --- a/sample-app/src/main/AndroidManifest.xml +++ b/sample-app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + android:exported="true" + android:theme="@style/AppTheme.NoActionBar"> @@ -20,4 +21,4 @@ - \ No newline at end of file + diff --git a/sample-app/src/main/java/io/openfeedback/android/sample/MainActivity.kt b/sample-app/src/main/java/io/openfeedback/android/sample/MainActivity.kt index 1412b47..b3a1e74 100644 --- a/sample-app/src/main/java/io/openfeedback/android/sample/MainActivity.kt +++ b/sample-app/src/main/java/io/openfeedback/android/sample/MainActivity.kt @@ -21,7 +21,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import io.openfeedback.android.FirebaseConfig +import io.openfeedback.android.viewmodels.OpenFeedbackFirebaseConfig import io.openfeedback.android.m2.OpenFeedback import io.openfeedback.android.sample.theme.DesignSystem import io.openfeedback.android.sample.theme.OpenFeedbackTheme @@ -31,12 +31,7 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val projectId = "mMHR63ARZQpPidFQISyc" - val firebaseConfig = FirebaseConfig( - projectId = "openfeedback-b7ab9", - applicationId = "1:765209934800:android:a6bb09f3deabc2277297d5", - apiKey = "AIzaSyC_cfbh8xKwF8UPxCeasGcsHyK4s5yZFeA", - databaseUrl = "https://openfeedback-b7ab9.firebaseio.com" - ) + val openFeedbackFirebaseConfig = (application as MainApplication).openFeedbackFirebaseConfig setContent { var designSystem by rememberSaveable { mutableStateOf(DesignSystem.M2) } val isDark = isSystemInDarkTheme() @@ -55,7 +50,7 @@ class MainActivity : AppCompatActivity() { when (designSystem) { DesignSystem.M2 -> Scaffold { OpenFeedback( - config = firebaseConfig, + config = openFeedbackFirebaseConfig, projectId = projectId, sessionId = "173222", language = "en", @@ -66,7 +61,7 @@ class MainActivity : AppCompatActivity() { } DesignSystem.M3 -> androidx.compose.material3.Scaffold { io.openfeedback.android.m3.OpenFeedback( - config = firebaseConfig, + config = openFeedbackFirebaseConfig, projectId = projectId, sessionId = "173222", language = "en", diff --git a/sample-app/src/main/java/io/openfeedback/android/sample/MainApplication.kt b/sample-app/src/main/java/io/openfeedback/android/sample/MainApplication.kt new file mode 100644 index 0000000..bc4e0ee --- /dev/null +++ b/sample-app/src/main/java/io/openfeedback/android/sample/MainApplication.kt @@ -0,0 +1,19 @@ +package io.openfeedback.android.sample + +import android.app.Application +import io.openfeedback.android.viewmodels.OpenFeedbackFirebaseConfig + +class MainApplication: Application() { + lateinit var openFeedbackFirebaseConfig: OpenFeedbackFirebaseConfig + + override fun onCreate() { + super.onCreate() + openFeedbackFirebaseConfig = OpenFeedbackFirebaseConfig( + context = this, + projectId = "openfeedback-b7ab9", + applicationId = "1:765209934800:android:a6bb09f3deabc2277297d5", + apiKey = "AIzaSyC_cfbh8xKwF8UPxCeasGcsHyK4s5yZFeA", + databaseUrl = "https://openfeedback-b7ab9.firebaseio.com" + ) + } +}