Merge pull request #140 from FunkyMuse/master

refactor: migrate dialogs to Compose
This commit is contained in:
Tibor Kaputa
2023-10-05 12:04:28 +02:00
committed by GitHub
8 changed files with 123 additions and 96 deletions

View File

@@ -4,18 +4,24 @@ import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.runtime.Composable
import com.simplemobiletools.commons.compose.extensions.enableEdgeToEdgeSimple
import com.simplemobiletools.commons.compose.extensions.onEventValue
import androidx.compose.runtime.*
import androidx.compose.runtime.snapshots.SnapshotStateList
import com.simplemobiletools.commons.compose.alert_dialog.AlertDialogState
import com.simplemobiletools.commons.compose.alert_dialog.rememberAlertDialogState
import com.simplemobiletools.commons.compose.extensions.*
import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.dialogs.DonateAlertDialog
import com.simplemobiletools.commons.dialogs.RateStarsAlertDialog
import com.simplemobiletools.commons.dialogs.WhatsNewAlertDialog
import com.simplemobiletools.commons.extensions.hideKeyboard
import com.simplemobiletools.commons.extensions.launchMoreAppsFromUsIntent
import com.simplemobiletools.commons.models.FAQItem
import com.simplemobiletools.commons.models.Release
import com.simplemobiletools.thankyou.BuildConfig
import com.simplemobiletools.thankyou.R
import com.simplemobiletools.thankyou.extensions.checkWhatsNew
import com.simplemobiletools.thankyou.extensions.startAboutActivity
import com.simplemobiletools.thankyou.screens.MainScreen
import kotlinx.collections.immutable.toImmutableList
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -23,6 +29,8 @@ class MainActivity : ComponentActivity() {
enableEdgeToEdgeSimple()
setContent {
AppThemeSurface {
val releasesList = remember { mutableStateListOf<Release>() }
val checkWhatsNewAlertDialogState = getCheckWhatsNewAlertDialogState(releasesList)
val linkColor = linkColor()
val showMoreApps = onEventValue { !resources.getBoolean(R.bool.hide_google_relations) }
MainScreen(
@@ -32,17 +40,69 @@ class MainActivity : ComponentActivity() {
openAbout = ::launchAbout,
moreAppsFromUs = ::launchMoreAppsFromUsIntent
)
AppLaunched()
CheckWhatsNew(releasesList, checkWhatsNewAlertDialogState)
}
}
appLaunched(BuildConfig.APPLICATION_ID)
checkWhatsNewDialog()
}
@Composable
private fun linkColor() = onEventValue {
when {
isWhiteTheme() || isBlackAndWhiteTheme() -> baseConfig.accentColor
else -> getProperPrimaryColor()
private fun AppLaunched(
donateAlertDialogState: AlertDialogState = getDonateAlertDialogState(),
rateStarsAlertDialogState: AlertDialogState = getRateStarsAlertDialogState(),
) {
LaunchedEffect(Unit) {
appLaunchedCompose(
appId = BuildConfig.APPLICATION_ID,
showDonateDialog = donateAlertDialogState::show,
showRateUsDialog = rateStarsAlertDialogState::show,
showUpgradeDialog = {}
)
}
}
@Composable
private fun CheckWhatsNew(
releasesList: SnapshotStateList<Release>,
checkWhatsNewAlertDialogState: AlertDialogState
) {
DisposableEffect(Unit) {
checkWhatsNewCompose(
releases = listOf(
Release(14, R.string.release_14),
Release(3, R.string.release_3)
),
currVersion = BuildConfig.VERSION_CODE,
showWhatsNewDialog = { releases ->
releasesList.addAll(releases)
checkWhatsNewAlertDialogState.show()
}
)
onDispose {
releasesList.clear()
}
}
}
@Composable
private fun getCheckWhatsNewAlertDialogState(releasesList: SnapshotStateList<Release>) = rememberAlertDialogState().apply {
DialogMember {
WhatsNewAlertDialog(alertDialogState = this, releases = releasesList.toImmutableList())
}
}
@Composable
private fun getDonateAlertDialogState() =
rememberAlertDialogState().apply {
DialogMember {
DonateAlertDialog(alertDialogState = this)
}
}
@Composable
private fun getRateStarsAlertDialogState() = rememberAlertDialogState().apply {
DialogMember {
RateStarsAlertDialog(alertDialogState = this, onRating = ::rateStarsRedirectAndThankYou)
}
}
@@ -61,12 +121,4 @@ class MainActivity : ComponentActivity() {
startAboutActivity(R.string.app_name, 0, BuildConfig.VERSION_NAME, faqItems, false)
}
private fun checkWhatsNewDialog() {
arrayListOf<Release>().apply {
add(Release(14, R.string.release_14))
add(Release(3, R.string.release_3))
checkWhatsNew(this, BuildConfig.VERSION_CODE)
}
}
}

View File

@@ -4,21 +4,12 @@ import android.annotation.SuppressLint
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.window.DialogProperties
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.simplemobiletools.commons.compose.alert_dialog.AlertDialogState
import com.simplemobiletools.commons.compose.alert_dialog.rememberAlertDialogState
import com.simplemobiletools.commons.compose.extensions.enableEdgeToEdgeSimple
import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import com.simplemobiletools.commons.compose.theme.Shapes
import com.simplemobiletools.commons.dialogs.ConfirmationAdvancedAlertDialog
import com.simplemobiletools.commons.extensions.getAppIconColors
import com.simplemobiletools.commons.extensions.toggleAppIconColor
import com.simplemobiletools.commons.helpers.isTiramisuPlus
@@ -50,8 +41,7 @@ class SettingsActivity : ComponentActivity() {
(wasUseEnglishToggledFlow || Locale.getDefault().language != "en") && !isTiramisuPlus()
}
}
val alertDialogState = rememberAlertDialogState()
ConfirmationHideLauncherDialog(alertDialogState)
val confirmHideIconAlertDialogState = getConfirmHideIconAlertDialogState()
SettingsScreen(
displayLanguage = displayLanguage,
@@ -65,7 +55,7 @@ class SettingsActivity : ComponentActivity() {
isHidingLauncherIcon = hideLauncherIconFlow,
hideLauncherIconClick = { isChecked ->
if (isChecked) {
alertDialogState.show()
confirmHideIconAlertDialogState.show()
} else {
toggleHideLauncherIcon()
preferences.hideLauncherIcon = false
@@ -79,39 +69,22 @@ class SettingsActivity : ComponentActivity() {
}
@Composable
private fun ConfirmationHideLauncherDialog(alertDialogState: AlertDialogState) {
alertDialogState.DialogMember {
AlertDialog(
modifier = Modifier.fillMaxWidth(0.9f),
properties = DialogProperties(usePlatformDefaultWidth = false),
onDismissRequest = alertDialogState::hide,
confirmButton = {
TextButton(onClick = {
alertDialogState.hide()
preferences.hideLauncherIcon = true
private fun getConfirmHideIconAlertDialogState() =
rememberAlertDialogState().apply {
DialogMember {
ConfirmationAdvancedAlertDialog(
alertDialogState = this,
messageId = R.string.hide_launcher_icon_explanation,
positive = R.string.ok,
negative = R.string.cancel
) { hideIcon ->
preferences.hideLauncherIcon = hideIcon
if (hideIcon) {
toggleHideLauncherIcon()
}) {
Text(text = stringResource(id = R.string.ok))
}
},
dismissButton = {
TextButton(onClick = {
alertDialogState.hide()
preferences.hideLauncherIcon = false
}) {
Text(text = stringResource(id = R.string.cancel))
}
},
shape = Shapes.large,
text = {
Text(
text = stringResource(id = R.string.hide_launcher_icon_explanation),
color = MaterialTheme.colorScheme.onSurface
)
},
)
}
}
}
}
private fun toggleHideLauncherIcon() {
val appId = BuildConfig.APPLICATION_ID

View File

@@ -8,9 +8,7 @@ import android.os.Build
import android.provider.Settings
import androidx.annotation.RequiresApi
import com.simplemobiletools.commons.activities.AboutActivity
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.activities.CustomizationActivity
import com.simplemobiletools.commons.compose.theme.getAppLauncherName
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.WhatsNewDialog
import com.simplemobiletools.commons.extensions.baseConfig

View File

@@ -1,13 +1,12 @@
package com.simplemobiletools.thankyou.helpers
import android.content.Context
import com.simplemobiletools.commons.extensions.sharedPreferencesCallback
import com.simplemobiletools.commons.helpers.BaseConfig
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filterNotNull
class Config(context: Context) : BaseConfig(context) {
companion object {
const val HIDE_LAUNCHER_ICON = "hide_launcher_icon"
fun newInstance(context: Context) = Config(context)
}
@@ -15,7 +14,7 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(HIDE_LAUNCHER_ICON, false)
set(hideLauncherIcon) = prefs.edit().putBoolean(HIDE_LAUNCHER_ICON, hideLauncherIcon).apply()
val hideLauncherIconFlow: Flow<Boolean> = prefs.run { sharedPreferencesCallback { hideLauncherIcon } }.filterNotNull()
val wasUseEnglishToggledFlow: Flow<Boolean> = prefs.run { sharedPreferencesCallback { wasUseEnglishToggled } }.filterNotNull()
val useEnglishFlow: Flow<Boolean> = prefs.run { sharedPreferencesCallback { useEnglish } }.filterNotNull()
val hideLauncherIconFlow: Flow<Boolean> = ::hideLauncherIcon.asFlowNonNull()
val wasUseEnglishToggledFlow: Flow<Boolean> = ::wasUseEnglishToggled.asFlowNonNull()
val useEnglishFlow: Flow<Boolean> = ::useEnglish.asFlowNonNull()
}

View File

@@ -1,4 +0,0 @@
package com.simplemobiletools.thankyou.helpers
// Shared Preferences
const val HIDE_LAUNCHER_ICON = "hide_launcher_icon"

View File

@@ -25,6 +25,7 @@ import com.simplemobiletools.commons.compose.menus.ActionMenu
import com.simplemobiletools.commons.compose.menus.OverflowMode
import com.simplemobiletools.commons.compose.settings.scaffold.*
import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import com.simplemobiletools.commons.compose.theme.SimpleTheme
import kotlinx.collections.immutable.toImmutableList
@Composable
@@ -33,24 +34,13 @@ internal fun MainScreen(
openSettings: () -> Unit,
openAbout: () -> Unit,
moreAppsFromUs: () -> Unit,
linkColor: Int,
linkColor: Color,
) {
SettingsLazyScaffold(customTopBar = { scrolledColor: Color, _: MutableInteractionSource, scrollBehavior: TopAppBarScrollBehavior, statusBarColor: Int, colorTransitionFraction: Float, contrastColor: Color ->
TopAppBar(
title = {},
actions = {
val actionMenus = remember {
val settings =
ActionItem(R.string.settings, icon = Icons.Filled.Settings, doAction = openSettings, overflowMode = OverflowMode.NEVER_OVERFLOW)
val about = ActionItem(R.string.about, icon = Icons.Outlined.Info, doAction = openAbout, overflowMode = OverflowMode.NEVER_OVERFLOW)
val list = if (showMoreApps) {
listOf(settings, about, ActionItem(R.string.more_apps_from_us, doAction = moreAppsFromUs, overflowMode = OverflowMode.ALWAYS_OVERFLOW))
} else {
listOf(settings, about)
}
list.toImmutableList()
}
val actionMenus = rememberActionItems(openSettings, openAbout, showMoreApps, moreAppsFromUs)
var isMenuVisible by remember { mutableStateOf(false) }
ActionMenu(items = actionMenus, numIcons = 2, isMenuVisible = isMenuVisible, onMenuToggle = { isMenuVisible = it }, iconsColor = scrolledColor)
},
@@ -60,7 +50,7 @@ internal fun MainScreen(
windowInsets = topAppBarInsets()
)
}) { paddingValues ->
val textColor = MaterialTheme.colorScheme.onSurface.toArgb()
val textColor = SimpleTheme.colorScheme.onSurface.toArgb()
AndroidView(
factory = { context ->
@@ -77,17 +67,36 @@ internal fun MainScreen(
.padding(bottom = paddingValues.calculateBottomPadding())
.padding(40.dp),
update = { textView ->
textView.setLinkTextColor(linkColor)
textView.setLinkTextColor(linkColor.toArgb())
textView.setTextColor(textColor)
}
)
}
}
@Composable
private fun rememberActionItems(
openSettings: () -> Unit,
openAbout: () -> Unit,
showMoreApps: Boolean,
moreAppsFromUs: () -> Unit
) = remember {
val settings =
ActionItem(R.string.settings, icon = Icons.Filled.Settings, doAction = openSettings, overflowMode = OverflowMode.NEVER_OVERFLOW)
val about = ActionItem(R.string.about, icon = Icons.Outlined.Info, doAction = openAbout, overflowMode = OverflowMode.NEVER_OVERFLOW)
val list = if (showMoreApps) {
listOf(settings, about, ActionItem(R.string.more_apps_from_us, doAction = moreAppsFromUs, overflowMode = OverflowMode.ALWAYS_OVERFLOW))
} else {
listOf(settings, about)
}
list.toImmutableList()
}
@Composable
@MyDevices
private fun MainScreenPreview() {
AppThemeSurface {
MainScreen(showMoreApps = true, openSettings = {}, openAbout = {}, moreAppsFromUs = {}, linkColor = MaterialTheme.colorScheme.onSurface.toArgb())
MainScreen(showMoreApps = true, openSettings = {}, openAbout = {}, moreAppsFromUs = {}, linkColor = SimpleTheme.colorScheme.onSurface)
}
}

View File

@@ -1,7 +1,6 @@
package com.simplemobiletools.thankyou.screens
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import com.simplemobiletools.commons.R
@@ -12,6 +11,7 @@ import com.simplemobiletools.commons.compose.settings.SettingsPreferenceComponen
import com.simplemobiletools.commons.compose.settings.SettingsTitleTextComponent
import com.simplemobiletools.commons.compose.settings.scaffold.SettingsScaffold
import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import com.simplemobiletools.commons.compose.theme.SimpleTheme
import com.simplemobiletools.commons.compose.theme.divider_grey
import com.simplemobiletools.commons.helpers.isTiramisuPlus
@@ -53,7 +53,7 @@ internal fun SettingsScreen(
label = stringResource(id = R.string.language),
value = displayLanguage,
doOnPreferenceClick = onSetupLanguagePress,
preferenceLabelColor = MaterialTheme.colorScheme.onSurface,
preferenceLabelColor = SimpleTheme.colorScheme.onSurface,
)
}
SettingsCheckBoxComponent(

View File

@@ -2,18 +2,18 @@
#jetbrains
kotlin = "1.9.10"
#Simple tools
simple-commons = "b7dd6ad428"
simple-commons = "b72ded2a75"
#Compose
composeActivity = "1.8.0-beta01"
compose = "1.6.0-alpha05"
composeActivity = "1.8.0-rc01"
compose = "1.6.0-alpha06"
composeCompiler = "1.5.3"
composeMaterial3 = "1.2.0-alpha07"
composeMaterial3 = "1.2.0-alpha08"
#Androidx
androidx-customView = "1.2.0-alpha02"
androidx-customViewPooling = "1.0.0"
androidx-lifecycle = "2.7.0-alpha02"
#Gradle
gradlePlugins-agp = "8.1.1"
gradlePlugins-agp = "8.1.2"
app-build-compileSDKVersion = "34"
app-build-targetSDK = "34"
app-build-minimumSDK = "23"