diff --git a/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt b/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt index aba174cc24..0a1bc88b4b 100644 --- a/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt +++ b/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt @@ -14,11 +14,13 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect @@ -79,7 +81,7 @@ internal class PermissionStep : OnboardingStep { } Column { - PermissionItem( + PermissionCheckbox( title = stringResource(MR.strings.onboarding_permission_install_apps), subtitle = stringResource(MR.strings.onboarding_permission_install_apps_description), granted = installGranted, @@ -95,7 +97,7 @@ internal class PermissionStep : OnboardingStep { // no-op. resulting checks is being done on resume }, ) - PermissionItem( + PermissionCheckbox( title = stringResource(MR.strings.onboarding_permission_notifications), subtitle = stringResource(MR.strings.onboarding_permission_notifications_description), granted = notificationGranted, @@ -103,7 +105,7 @@ internal class PermissionStep : OnboardingStep { ) } - PermissionItem( + PermissionCheckbox( title = stringResource(MR.strings.onboarding_permission_ignore_battery_opts), subtitle = stringResource(MR.strings.onboarding_permission_ignore_battery_opts_description), granted = batteryGranted, @@ -116,26 +118,33 @@ internal class PermissionStep : OnboardingStep { }, ) - PermissionItem( + HorizontalDivider( + modifier = Modifier.padding(vertical = 8.dp), + color = MaterialTheme.colorScheme.onPrimaryContainer, + ) + + PermissionSwitch( title = stringResource(MR.strings.onboarding_permission_crashlytics), subtitle = stringResource(MR.strings.onboarding_permission_crashlytics_description), granted = allowCrashLogs, - onButtonClick = { - allowCrashLogs = !allowCrashLogs + onToggleChange = { + allowCrashLogs = it securityPreferences.crashlytics().set(allowCrashLogs) }, ) - PermissionItem( + PermissionSwitch( title = stringResource(MR.strings.onboarding_permission_analytics), subtitle = stringResource(MR.strings.onboarding_permission_analytics_description), granted = allowAnalytics, - onButtonClick = { - allowAnalytics = !allowAnalytics + onToggleChange = { + allowAnalytics = it securityPreferences.analytics().set(allowAnalytics) }, ) + } + } @Composable @@ -153,7 +162,7 @@ internal class PermissionStep : OnboardingStep { } @Composable - private fun PermissionItem( + private fun PermissionCheckbox( title: String, subtitle: String, granted: Boolean, @@ -166,6 +175,7 @@ internal class PermissionStep : OnboardingStep { supportingContent = { Text(text = subtitle) }, trailingContent = { OutlinedButton( + enabled = !granted, onClick = onButtonClick, ) { if (granted) { @@ -182,4 +192,27 @@ internal class PermissionStep : OnboardingStep { colors = ListItemDefaults.colors(containerColor = Color.Transparent), ) } + + @Composable + private fun PermissionSwitch( + title: String, + subtitle: String, + granted: Boolean, + modifier: Modifier = Modifier, + onToggleChange: (Boolean) -> Unit, + ) { + ListItem( + modifier = modifier, + headlineContent = { Text(text = title) }, + supportingContent = { Text(text = subtitle) }, + trailingContent = { + Switch( + checked = granted, + onCheckedChange = onToggleChange, + ) + }, + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + ) + } + } diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index eefef59ca5..e07b4f389e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -78,7 +78,6 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor override fun onCreate() { super.onCreate() patchInjekt() - Firebase.setup(applicationContext, securityPreferences) GlobalExceptionHandler.initialize(applicationContext, CrashActivity::class.java) @@ -97,6 +96,8 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor Injekt.importModule(AppModule(this)) Injekt.importModule(DomainModule()) + Firebase.setup(applicationContext, securityPreferences, ProcessLifecycleOwner.get().lifecycleScope) + setupNotificationChannels() ProcessLifecycleOwner.get().lifecycle.addObserver(this) diff --git a/app/src/standard/java/mihon/core/firebase/Firebase.kt b/app/src/standard/java/mihon/core/firebase/Firebase.kt index 489360be7e..47713adf1b 100644 --- a/app/src/standard/java/mihon/core/firebase/Firebase.kt +++ b/app/src/standard/java/mihon/core/firebase/Firebase.kt @@ -5,14 +5,16 @@ import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.crashlytics.FirebaseCrashlytics import eu.kanade.tachiyomi.core.security.SecurityPreferences import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.CoroutineScope object Firebase { - fun setup(context: Context, preference: SecurityPreferences) { + fun setup(context: Context, preference: SecurityPreferences, scope: CoroutineScope) { preference.analytics().changes().onEach { enabled -> FirebaseAnalytics.getInstance(context).setAnalyticsCollectionEnabled(enabled) - } + }.launchIn(scope) preference.crashlytics().changes().onEach { enabled -> FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(enabled) - } + }.launchIn(scope) } }