refactor: migrate to latest commons and compose

This commit is contained in:
FunkyMuse 2023-10-04 17:28:57 +02:00
parent 51bd8a736c
commit 1a7070c278
9 changed files with 51 additions and 190 deletions

View File

@ -8,23 +8,18 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.runtime.snapshots.SnapshotStateList
import com.simplemobiletools.commons.compose.alert_dialog.AlertDialogState import com.simplemobiletools.commons.compose.alert_dialog.AlertDialogState
import com.simplemobiletools.commons.compose.alert_dialog.rememberAlertDialogState import com.simplemobiletools.commons.compose.alert_dialog.rememberAlertDialogState
import com.simplemobiletools.commons.compose.extensions.enableEdgeToEdgeSimple import com.simplemobiletools.commons.compose.extensions.*
import com.simplemobiletools.commons.compose.extensions.linkColor
import com.simplemobiletools.commons.compose.extensions.onEventValue
import com.simplemobiletools.commons.compose.theme.AppThemeSurface import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import com.simplemobiletools.commons.dialogs.DonateAlertDialog import com.simplemobiletools.commons.dialogs.DonateAlertDialog
import com.simplemobiletools.commons.dialogs.RateStarsAlertDialog import com.simplemobiletools.commons.dialogs.RateStarsAlertDialog
import com.simplemobiletools.commons.dialogs.UpgradeToProAlertDialog
import com.simplemobiletools.commons.dialogs.WhatsNewAlertDialog import com.simplemobiletools.commons.dialogs.WhatsNewAlertDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.hideKeyboard
import com.simplemobiletools.commons.extensions.launchMoreAppsFromUsIntent
import com.simplemobiletools.commons.models.FAQItem import com.simplemobiletools.commons.models.FAQItem
import com.simplemobiletools.commons.models.Release import com.simplemobiletools.commons.models.Release
import com.simplemobiletools.thankyou.BuildConfig import com.simplemobiletools.thankyou.BuildConfig
import com.simplemobiletools.thankyou.R import com.simplemobiletools.thankyou.R
import com.simplemobiletools.thankyou.extensions.startAboutActivity import com.simplemobiletools.thankyou.extensions.startAboutActivity
import com.simplemobiletools.thankyou.helpers.appLaunchedCompose
import com.simplemobiletools.thankyou.helpers.checkWhatsNewCompose
import com.simplemobiletools.thankyou.helpers.upgradeToPro
import com.simplemobiletools.thankyou.screens.MainScreen import com.simplemobiletools.thankyou.screens.MainScreen
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
@ -55,14 +50,13 @@ class MainActivity : ComponentActivity() {
private fun AppLaunched( private fun AppLaunched(
donateAlertDialogState: AlertDialogState = getDonateAlertDialogState(), donateAlertDialogState: AlertDialogState = getDonateAlertDialogState(),
rateStarsAlertDialogState: AlertDialogState = getRateStarsAlertDialogState(), rateStarsAlertDialogState: AlertDialogState = getRateStarsAlertDialogState(),
upgradeToProAlertDialogState: AlertDialogState = getUpgradeToProAlertDialogState()
) { ) {
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
appLaunchedCompose( appLaunchedCompose(
appId = BuildConfig.APPLICATION_ID, appId = BuildConfig.APPLICATION_ID,
showDonateDialog = donateAlertDialogState::show, showDonateDialog = donateAlertDialogState::show,
showRateUsDialog = rateStarsAlertDialogState::show, showRateUsDialog = rateStarsAlertDialogState::show,
showUpgradeDialog = upgradeToProAlertDialogState::show showUpgradeDialog = {}
) )
} }
} }
@ -90,16 +84,6 @@ class MainActivity : ComponentActivity() {
} }
} }
@Composable
private fun getUpgradeToProAlertDialogState() = rememberAlertDialogState().apply {
DialogMember {
UpgradeToProAlertDialog(
alertDialogState = this, onMoreInfoClick = ::upgradeToPro, onUpgradeClick = ::launchUpgradeToProIntent
)
}
}
@Composable @Composable
private fun getCheckWhatsNewAlertDialogState(releasesList: SnapshotStateList<Release>) = rememberAlertDialogState().apply { private fun getCheckWhatsNewAlertDialogState(releasesList: SnapshotStateList<Release>) = rememberAlertDialogState().apply {
DialogMember { DialogMember {
@ -118,13 +102,7 @@ class MainActivity : ComponentActivity() {
@Composable @Composable
private fun getRateStarsAlertDialogState() = rememberAlertDialogState().apply { private fun getRateStarsAlertDialogState() = rememberAlertDialogState().apply {
DialogMember { DialogMember {
RateStarsAlertDialog(alertDialogState = this) { stars -> RateStarsAlertDialog(alertDialogState = this, onRating = ::rateStarsRedirectAndThankYou)
if (stars == 5) {
redirectToRateUs()
}
toast(com.simplemobiletools.commons.R.string.thank_you)
baseConfig.wasAppRated = true
}
} }
} }

View File

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

View File

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

View File

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

View File

@ -1,10 +0,0 @@
package com.simplemobiletools.thankyou.helpers
import androidx.compose.material3.Typography
// Shared Preferences
const val HIDE_LAUNCHER_ICON = "hide_launcher_icon"
val typography = Typography(
)

View File

@ -1,86 +0,0 @@
package com.simplemobiletools.thankyou.helpers
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
import androidx.activity.ComponentActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.models.Release
import com.simplemobiletools.thankyou.R
fun ComponentActivity.appLaunchedCompose(
appId: String,
showUpgradeDialog: () -> Unit,
showDonateDialog: () -> Unit,
showRateUsDialog: () -> Unit
) {
baseConfig.internalStoragePath = getInternalStoragePath()
updateSDCardPath()
baseConfig.appId = appId
if (baseConfig.appRunCount == 0) {
baseConfig.wasOrangeIconChecked = true
checkAppIconColor()
} else if (!baseConfig.wasOrangeIconChecked) {
baseConfig.wasOrangeIconChecked = true
val primaryColor = resources.getColor(R.color.color_primary)
if (baseConfig.appIconColor != primaryColor) {
getAppIconColors().forEachIndexed { index, color ->
toggleAppIconColor(appId, index, color, false)
}
val defaultClassName = "${baseConfig.appId.removeSuffix(".debug")}.activities.SplashActivity"
packageManager.setComponentEnabledSetting(
ComponentName(baseConfig.appId, defaultClassName),
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
PackageManager.DONT_KILL_APP
)
val orangeClassName = "${baseConfig.appId.removeSuffix(".debug")}.activities.SplashActivity.Orange"
packageManager.setComponentEnabledSetting(
ComponentName(baseConfig.appId, orangeClassName),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
baseConfig.appIconColor = primaryColor
baseConfig.lastIconColor = primaryColor
}
}
baseConfig.appRunCount++
if (baseConfig.appRunCount % 30 == 0 && !isAProApp()) {
if (!resources.getBoolean(R.bool.hide_google_relations)) {
if (getCanAppBeUpgraded()) {
showUpgradeDialog()
} else if (!isOrWasThankYouInstalled()) {
showDonateDialog()
}
}
}
if (baseConfig.appRunCount % 40 == 0 && !baseConfig.wasAppRated) {
if (!resources.getBoolean(R.bool.hide_google_relations)) {
showRateUsDialog()
}
}
}
fun ComponentActivity.checkWhatsNewCompose(releases: List<Release>, currVersion: Int, showWhatsNewDialog: (List<Release>) -> Unit) {
if (baseConfig.lastVersion == 0) {
baseConfig.lastVersion = currVersion
return
}
val newReleases = arrayListOf<Release>()
releases.filterTo(newReleases) { it.id > baseConfig.lastVersion }
if (newReleases.isNotEmpty()) {
showWhatsNewDialog(newReleases)
}
baseConfig.lastVersion = currVersion
}
fun ComponentActivity.upgradeToPro() {
launchViewIntent("https://simplemobiletools.com/upgrade_to_pro")
}

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.menus.OverflowMode
import com.simplemobiletools.commons.compose.settings.scaffold.* import com.simplemobiletools.commons.compose.settings.scaffold.*
import com.simplemobiletools.commons.compose.theme.AppThemeSurface import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import com.simplemobiletools.commons.compose.theme.SimpleTheme
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
@Composable @Composable
@ -39,18 +40,7 @@ internal fun MainScreen(
TopAppBar( TopAppBar(
title = {}, title = {},
actions = { actions = {
val actionMenus = remember { val actionMenus = rememberActionItems(openSettings, openAbout, showMoreApps, moreAppsFromUs)
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()
}
var isMenuVisible by remember { mutableStateOf(false) } var isMenuVisible by remember { mutableStateOf(false) }
ActionMenu(items = actionMenus, numIcons = 2, isMenuVisible = isMenuVisible, onMenuToggle = { isMenuVisible = it }, iconsColor = scrolledColor) ActionMenu(items = actionMenus, numIcons = 2, isMenuVisible = isMenuVisible, onMenuToggle = { isMenuVisible = it }, iconsColor = scrolledColor)
}, },
@ -60,7 +50,7 @@ internal fun MainScreen(
windowInsets = topAppBarInsets() windowInsets = topAppBarInsets()
) )
}) { paddingValues -> }) { paddingValues ->
val textColor = MaterialTheme.colorScheme.onSurface.toArgb() val textColor = SimpleTheme.colorScheme.onSurface.toArgb()
AndroidView( AndroidView(
factory = { context -> factory = { context ->
@ -84,10 +74,29 @@ internal fun MainScreen(
} }
} }
@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 @Composable
@MyDevices @MyDevices
private fun MainScreenPreview() { private fun MainScreenPreview() {
AppThemeSurface { AppThemeSurface {
MainScreen(showMoreApps = true, openSettings = {}, openAbout = {}, moreAppsFromUs = {}, linkColor = MaterialTheme.colorScheme.onSurface) MainScreen(showMoreApps = true, openSettings = {}, openAbout = {}, moreAppsFromUs = {}, linkColor = SimpleTheme.colorScheme.onSurface)
} }
} }

View File

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

View File

@ -2,7 +2,7 @@
#jetbrains #jetbrains
kotlin = "1.9.10" kotlin = "1.9.10"
#Simple tools #Simple tools
simple-commons = "a32b3b41a5" simple-commons = "dfe8acfbf9"
#Compose #Compose
composeActivity = "1.8.0-rc01" composeActivity = "1.8.0-rc01"
compose = "1.6.0-alpha06" compose = "1.6.0-alpha06"