diff --git a/app/src/main/java/com/aurora/extensions/Context.kt b/app/src/main/java/com/aurora/extensions/Context.kt index 0b7491a1a..053086ec2 100644 --- a/app/src/main/java/com/aurora/extensions/Context.kt +++ b/app/src/main/java/com/aurora/extensions/Context.kt @@ -38,11 +38,9 @@ import android.view.LayoutInflater import androidx.browser.customtabs.CustomTabsIntent import androidx.core.app.ActivityCompat import androidx.core.app.ActivityOptionsCompat -import androidx.core.content.ContextCompat import com.aurora.Constants import com.aurora.gplayapi.data.models.App import com.aurora.store.R -import com.aurora.store.util.Preferences private const val TAG = "Context" @@ -115,44 +113,6 @@ fun Context.getStyledAttributeColor(id: Int): Int { return styledAttr } -fun Context.accentColor(): Int { - val color = when (Preferences.getInteger(this, Preferences.PREFERENCE_THEME_ACCENT)) { - 0 -> R.color.colorAccent - 1 -> R.color.colorAccent01 - 2 -> R.color.colorAccent02 - 3 -> R.color.colorAccent03 - 4 -> R.color.colorAccent04 - 5 -> R.color.colorAccent05 - 6 -> R.color.colorAccent06 - 7 -> R.color.colorAccent07 - 8 -> R.color.colorAccent08 - 9 -> R.color.colorAccent09 - 10 -> R.color.colorAccent10 - 11 -> R.color.colorAccent11 - 12 -> R.color.colorAccent12 - 13 -> R.color.colorAccent13 - else -> if (isSAndAbove()) R.color.colorAccent else R.color.colorAccent01 - } - return ContextCompat.getColor(this, color) -} - -fun Context.backgroundColor(): Int { - val color = when (Preferences.getInteger(this, Preferences.PREFERENCE_THEME_TYPE)) { - 1 -> R.color.colorWhite - 2 -> R.color.colorDarkBackground - 3 -> R.color.colorBlack - 4 -> R.color.colorDarkXBackground - 5 -> R.color.colorDarkordBackground - else -> null - } - - if (color == null) { - return getStyledAttributeColor(com.google.android.material.R.attr.colorSurface) - } - - return ContextCompat.getColor(this, color) -} - fun Context.isIgnoringBatteryOptimizations(): Boolean { return if (isMAndAbove()) { (getSystemService(Context.POWER_SERVICE) as PowerManager).isIgnoringBatteryOptimizations( diff --git a/app/src/main/java/com/aurora/extensions/ThemeEngine.kt b/app/src/main/java/com/aurora/extensions/ThemeEngine.kt index 634cfb3f1..82216d65d 100644 --- a/app/src/main/java/com/aurora/extensions/ThemeEngine.kt +++ b/app/src/main/java/com/aurora/extensions/ThemeEngine.kt @@ -19,73 +19,12 @@ package com.aurora.extensions -import android.app.UiModeManager -import android.content.Context -import android.graphics.Color -import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate -import androidx.core.graphics.ColorUtils -import androidx.core.view.WindowInsetsControllerCompat -import com.aurora.store.util.CommonUtil -import com.aurora.store.util.Preferences -fun AppCompatActivity.applyThemeAccent() { - val themeId = Preferences.getInteger(this, Preferences.PREFERENCE_THEME_TYPE) - val accentId = Preferences.getInteger(this, Preferences.PREFERENCE_THEME_ACCENT) - val uiModeManager = getSystemService(Context.UI_MODE_SERVICE) as UiModeManager - - val themeStyle = CommonUtil.getThemeStyleById(themeId) - val accentStyle = CommonUtil.getAccentStyleById(accentId) - - /*Apply Theme*/ - setTheme(themeStyle) - theme.applyStyle(accentStyle, true) - - when (themeId) { - 0 -> { - if (isSAndAbove()) { - uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_CUSTOM) - } else { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) - } - } - - 1 -> { - if (!isVAndAbove()) setSystemBarConfiguration(light = true) - if (isSAndAbove()) { - uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_NO) - } else { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - } - } - - else -> { - if (!isVAndAbove()) setSystemBarConfiguration(light = false) - if (isSAndAbove()) { - uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_YES) - } else { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) - } - } - } -} - -@Suppress("DEPRECATION") -private fun AppCompatActivity.setSystemBarConfiguration(light: Boolean) { - WindowInsetsControllerCompat(this.window, this.window.decorView.rootView).apply { - // Status bar color - if (isMAndAbove()) { - isAppearanceLightStatusBars = light - } else { - // Add a semi-transparent black color to the status bar & navigation bar - window.statusBarColor = ColorUtils.setAlphaComponent(Color.BLACK, 120) - window.navigationBarColor = ColorUtils.setAlphaComponent(Color.BLACK, 120) - } - - // Navigation bar color - if (isOMR1AndAbove()) { - isAppearanceLightNavigationBars = light - window.navigationBarColor = getStyledAttributeColor(android.R.attr.colorBackground) - } +fun setAppTheme(themeStyle: Int) { + when (themeStyle) { + 1 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + 2 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) + else -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) } } diff --git a/app/src/main/java/com/aurora/extensions/View.kt b/app/src/main/java/com/aurora/extensions/View.kt index 2f295783f..d6731fe82 100644 --- a/app/src/main/java/com/aurora/extensions/View.kt +++ b/app/src/main/java/com/aurora/extensions/View.kt @@ -20,10 +20,8 @@ package com.aurora.extensions import android.content.Context -import android.content.res.ColorStateList import android.view.View import android.view.inputmethod.InputMethodManager -import com.google.android.material.floatingactionbutton.FloatingActionButton fun View.isVisible() = visibility == View.VISIBLE @@ -84,10 +82,3 @@ fun View.flip(resetToZero: Boolean = true, duration: Long = 400) { fun View.getString(resourceId: Int): String { return context.getString(resourceId) } - -fun FloatingActionButton.applyColors() { - val accentColor = context.accentColor() - backgroundTintList = ColorStateList.valueOf(accentColor) - imageTintList = ColorStateList.valueOf(contrastingColor(accentColor)) -} - diff --git a/app/src/main/java/com/aurora/store/Aliases.kt b/app/src/main/java/com/aurora/store/Aliases.kt index 5dbdf03e9..d32396774 100644 --- a/app/src/main/java/com/aurora/store/Aliases.kt +++ b/app/src/main/java/com/aurora/store/Aliases.kt @@ -7,6 +7,8 @@ import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.helpers.contracts.StreamContract import com.aurora.gplayapi.helpers.contracts.TopChartsContract +typealias MR = com.google.android.material.R.attr + typealias TopChartStash = MutableMap> typealias HomeStash = MutableMap typealias CategoryStash = MutableMap> diff --git a/app/src/main/java/com/aurora/store/AuroraApp.kt b/app/src/main/java/com/aurora/store/AuroraApp.kt index 3c1ede502..bf573471b 100644 --- a/app/src/main/java/com/aurora/store/AuroraApp.kt +++ b/app/src/main/java/com/aurora/store/AuroraApp.kt @@ -25,12 +25,15 @@ import androidx.core.content.ContextCompat import androidx.hilt.work.HiltWorkerFactory import androidx.work.Configuration import com.aurora.extensions.isPAndAbove +import com.aurora.extensions.setAppTheme import com.aurora.store.data.event.EventFlow import com.aurora.store.data.receiver.PackageManagerReceiver import com.aurora.store.util.CommonUtil import com.aurora.store.util.DownloadWorkerUtil import com.aurora.store.util.NotificationUtil import com.aurora.store.util.PackageUtil +import com.aurora.store.util.Preferences +import com.google.android.material.color.DynamicColors import dagger.hilt.android.HiltAndroidApp import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel @@ -63,6 +66,13 @@ class AuroraApp : Application(), Configuration.Provider { override fun onCreate() { super.onCreate() + // Set the app theme + val themeStyle = Preferences.getInteger(this, Preferences.PREFERENCE_THEME_STYLE) + setAppTheme(themeStyle) + + // Apply dynamic colors to activities0 + DynamicColors.applyToActivitiesIfAvailable(this) + DynamicColors.wrapContextIfAvailable(this) // Required for Shizuku installer if (isPAndAbove()) HiddenApiBypass.addHiddenApiExemptions("I", "L") diff --git a/app/src/main/java/com/aurora/store/MainActivity.kt b/app/src/main/java/com/aurora/store/MainActivity.kt index 9b3d47ba5..283ad8b99 100644 --- a/app/src/main/java/com/aurora/store/MainActivity.kt +++ b/app/src/main/java/com/aurora/store/MainActivity.kt @@ -20,13 +20,11 @@ package com.aurora.store -import android.content.res.ColorStateList import android.os.Bundle import android.view.View import androidx.activity.addCallback import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity -import androidx.core.graphics.ColorUtils import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding @@ -34,8 +32,6 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.FloatingWindow import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController -import com.aurora.extensions.accentColor -import com.aurora.extensions.applyThemeAccent import com.aurora.store.data.event.BusEvent import com.aurora.store.data.event.InstallerEvent import com.aurora.store.data.model.NetworkStatus @@ -75,8 +71,6 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) - applyThemeAccent() - B = ActivityMainBinding.inflate(layoutInflater) ViewCompat.setOnApplyWindowInsetsListener(B.root) { view, windowInsets -> @@ -122,11 +116,7 @@ class MainActivity : AppCompatActivity() { } } - B.navView.apply { - val alphaColor = ColorUtils.setAlphaComponent(this@MainActivity.accentColor(), 100) - setupWithNavController(navController) - itemActiveIndicatorColor = ColorStateList.valueOf(alphaColor) - } + B.navView.setupWithNavController(navController) // Handle quick exit from back actions val defaultTab = when (Preferences.getInteger(this, PREFERENCE_DEFAULT_SELECTED_TAB)) { diff --git a/app/src/main/java/com/aurora/store/data/receiver/MigrationReceiver.kt b/app/src/main/java/com/aurora/store/data/receiver/MigrationReceiver.kt index 3b3bdd8b0..d06f430fe 100644 --- a/app/src/main/java/com/aurora/store/data/receiver/MigrationReceiver.kt +++ b/app/src/main/java/com/aurora/store/data/receiver/MigrationReceiver.kt @@ -5,20 +5,18 @@ import android.content.Context import android.content.Intent import android.util.Log import com.aurora.Constants -import com.aurora.extensions.isSAndAbove import com.aurora.store.data.work.CacheWorker import com.aurora.store.util.CertUtil import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences.PREFERENCE_DISPENSER_URLS import com.aurora.store.util.Preferences.PREFERENCE_INTRO import com.aurora.store.util.Preferences.PREFERENCE_MIGRATION_VERSION -import com.aurora.store.util.Preferences.PREFERENCE_THEME_ACCENT import com.aurora.store.util.Preferences.PREFERENCE_VENDING_VERSION import com.aurora.store.util.save import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class MigrationReceiver: BroadcastReceiver() { +class MigrationReceiver : BroadcastReceiver() { companion object { private const val TAG = "MigrationReceiver" @@ -47,7 +45,6 @@ class MigrationReceiver: BroadcastReceiver() { // 58 -> 59 if (currentVersion == 0) { CacheWorker.scheduleAutomatedCacheCleanup(context) // !1089 - if (isSAndAbove()) context.save(PREFERENCE_THEME_ACCENT, 0) context.save(PREFERENCE_DISPENSER_URLS, setOf(Constants.URL_DISPENSER)) // !1117 if (Preferences.getInteger(context, PREFERENCE_VENDING_VERSION) == -1) { context.save(PREFERENCE_VENDING_VERSION, 0) // !1049 diff --git a/app/src/main/java/com/aurora/store/util/CommonUtil.kt b/app/src/main/java/com/aurora/store/util/CommonUtil.kt index bb8a131df..44cd217db 100644 --- a/app/src/main/java/com/aurora/store/util/CommonUtil.kt +++ b/app/src/main/java/com/aurora/store/util/CommonUtil.kt @@ -23,7 +23,6 @@ import android.content.Context import android.util.Log import androidx.lifecycle.Lifecycle import androidx.lifecycle.ProcessLifecycleOwner -import com.aurora.extensions.isSAndAbove import com.aurora.store.R import com.aurora.store.data.model.ProxyInfo import java.text.DecimalFormat @@ -158,38 +157,6 @@ object CommonUtil { } } - fun getThemeStyleById(themeId: Int): Int { - return when (themeId) { - 0 -> R.style.AppTheme - 1 -> R.style.AppTheme_Light - 2 -> R.style.AppTheme_Dark - 3 -> R.style.AppTheme_Black - 4 -> R.style.AppTheme_DarkX - 5 -> R.style.AppTheme_Darkord - else -> R.style.AppTheme - } - } - - fun getAccentStyleById(accentId: Int): Int { - return when (accentId) { - 0 -> R.style.Accent00 - 1 -> R.style.Accent01 - 2 -> R.style.Accent02 - 3 -> R.style.Accent03 - 4 -> R.style.Accent04 - 5 -> R.style.Accent05 - 6 -> R.style.Accent06 - 7 -> R.style.Accent07 - 8 -> R.style.Accent08 - 9 -> R.style.Accent09 - 10 -> R.style.Accent10 - 11 -> R.style.Accent11 - 12 -> R.style.Accent12 - 13 -> R.style.Accent13 - else -> if (isSAndAbove()) R.style.Accent00 else R.style.Accent01 - } - } - fun parseProxyUrl(proxyUrl: String): ProxyInfo? { val pattern = """^(https?|socks)://(?:([^\s:@]+):([^\s:@]+)@)?([^\s:@]+):(\d+)$""".toRegex() val match = pattern.find(proxyUrl) diff --git a/app/src/main/java/com/aurora/store/util/NotificationUtil.kt b/app/src/main/java/com/aurora/store/util/NotificationUtil.kt index 65148dc69..0db77c6a8 100644 --- a/app/src/main/java/com/aurora/store/util/NotificationUtil.kt +++ b/app/src/main/java/com/aurora/store/util/NotificationUtil.kt @@ -13,12 +13,10 @@ import android.net.Uri import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.PendingIntentCompat -import androidx.core.content.ContextCompat import androidx.core.os.bundleOf import androidx.navigation.NavDeepLinkBuilder import androidx.work.WorkManager import com.aurora.Constants -import com.aurora.extensions.getStyledAttributeColor import com.aurora.store.MainActivity import com.aurora.store.R import com.aurora.store.data.activity.InstallActivity @@ -74,7 +72,6 @@ object NotificationUtil { fun getDownloadNotification(context: Context): Notification { return NotificationCompat.Builder(context, Constants.NOTIFICATION_CHANNEL_GENERAL) .setSmallIcon(android.R.drawable.stat_sys_download) - .setColor(ContextCompat.getColor(context, R.color.colorAccent)) .setContentTitle(context.getString(R.string.app_updater_service_notif_title)) .setContentText(context.getString(R.string.app_updater_service_notif_text)) .setOngoing(true) @@ -89,7 +86,6 @@ object NotificationUtil { ): Notification { val builder = NotificationCompat.Builder(context, Constants.NOTIFICATION_CHANNEL_GENERAL) builder.setContentTitle(download.displayName) - builder.color = ContextCompat.getColor(context, R.color.colorAccent) builder.setContentIntent(getContentIntentForDownloads(context)) builder.setLargeIcon(largeIcon) @@ -163,7 +159,6 @@ object NotificationUtil { return NotificationCompat.Builder(context, Constants.NOTIFICATION_CHANNEL_ALERT) .setSmallIcon(R.drawable.ic_install) .setLargeIcon(PackageUtil.getIconForPackage(context, packageName)) - .setColor(context.getStyledAttributeColor(R.color.colorAccent)) .setContentTitle(displayName) .setContentText(context.getString(R.string.installer_status_success)) .setContentIntent(getContentIntentForDetails(context, packageName)) @@ -178,7 +173,6 @@ object NotificationUtil { ): Notification { return NotificationCompat.Builder(context, Constants.NOTIFICATION_CHANNEL_ALERT) .setSmallIcon(R.drawable.ic_install) - .setColor(context.getStyledAttributeColor(R.color.colorAccent)) .setContentTitle(displayName) .setContentText(content) .setContentIntent(getContentIntentForDetails(context, packageName)) @@ -254,7 +248,6 @@ object NotificationUtil { fun getExportNotification(context: Context): Notification { return NotificationCompat.Builder(context, Constants.NOTIFICATION_CHANNEL_ALERT) .setSmallIcon(R.drawable.ic_file_copy) - .setColor(context.getStyledAttributeColor(R.color.colorAccent)) .setContentTitle(context.getString(R.string.export_app_title)) .setContentText(context.getString(R.string.export_app_summary)) .setOngoing(false) @@ -288,7 +281,6 @@ object NotificationUtil { val builder = NotificationCompat.Builder(context, Constants.NOTIFICATION_CHANNEL_ALERT) .setSmallIcon(R.drawable.ic_file_copy) - .setColor(context.getStyledAttributeColor(R.color.colorAccent)) .setContentTitle(displayName).setContentText(content) .setContentIntent(getContentIntentForExport(context, uri)) .setAutoCancel(true) diff --git a/app/src/main/java/com/aurora/store/util/Preferences.kt b/app/src/main/java/com/aurora/store/util/Preferences.kt index f6ef87476..e5e75d6b6 100644 --- a/app/src/main/java/com/aurora/store/util/Preferences.kt +++ b/app/src/main/java/com/aurora/store/util/Preferences.kt @@ -31,8 +31,7 @@ object Preferences { const val PREFERENCE_AUTH_DATA = "PREFERENCE_AUTH_DATA" const val PREFERENCE_INSTALLER_ID = "PREFERENCE_INSTALLER_ID" - const val PREFERENCE_THEME_TYPE = "PREFERENCE_THEME_TYPE" - const val PREFERENCE_THEME_ACCENT = "PREFERENCE_THEME_ACCENT" + const val PREFERENCE_THEME_STYLE = "PREFERENCE_THEME_STYLE" const val PREFERENCE_FOR_YOU = "PREFERENCE_FOR_YOU" const val PREFERENCE_DEFAULT_SELECTED_TAB = "PREFERENCE_DEFAULT_SELECTED_TAB" const val PREFERENCE_SIMILAR = "PREFERENCE_SIMILAR" diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/PermissionGroup.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/PermissionGroup.kt index ddb4336a8..e0e2cd540 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/PermissionGroup.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/PermissionGroup.kt @@ -21,14 +21,12 @@ package com.aurora.store.view.custom.layouts import android.content.Context import android.content.pm.PackageManager import android.content.pm.PermissionInfo -import android.content.res.ColorStateList import android.graphics.drawable.Drawable import android.util.AttributeSet import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import androidx.core.content.ContextCompat -import com.aurora.extensions.accentColor import com.aurora.extensions.showDialog import com.aurora.store.R import com.aurora.store.data.model.PermissionGroupInfo @@ -59,7 +57,6 @@ class PermissionGroup @JvmOverloads constructor( val imageView = findViewById(R.id.img) imageView.setImageDrawable(getPermissionGroupIcon(permissionGroupInfo)) - imageView.imageTintList = ColorStateList.valueOf(context.accentColor()) } } @@ -98,7 +95,7 @@ class PermissionGroup @JvmOverloads constructor( ) { val textView = TextView(context) textView.text = label - if (isNewPerm) textView.setTextColor(context.accentColor()) + if (isNewPerm) textView.setTextColor(ContextCompat.getColor(context, R.color.colorGreen)) textView.setOnClickListener { var title: String = permissionGroupInfo.label diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/button/UpdateButton.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/button/UpdateButton.kt index 22f4f5100..778e200de 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/button/UpdateButton.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/button/UpdateButton.kt @@ -20,12 +20,8 @@ package com.aurora.store.view.custom.layouts.button import android.content.Context -import android.content.res.ColorStateList import android.util.AttributeSet import android.widget.RelativeLayout -import com.aurora.extensions.accentColor -import com.aurora.extensions.darkenColor -import com.aurora.extensions.lightenColor import com.aurora.extensions.runOnUiThread import com.aurora.store.R import com.aurora.store.data.model.DownloadStatus @@ -54,15 +50,6 @@ class UpdateButton : RelativeLayout { private fun init(context: Context) { val view = inflate(context, R.layout.view_update_button, this) binding = ViewUpdateButtonBinding.bind(view) - - // Apply primaryColor tint to all buttons with alpha - val alphaAccent = lightenColor(context.accentColor(), alpha = 200) - binding.btnPositive.backgroundTintList = ColorStateList.valueOf(alphaAccent) - binding.btnNegative.backgroundTintList = ColorStateList.valueOf(alphaAccent) - - val textColor = darkenColor(context.accentColor()) - binding.btnPositive.setTextColor(textColor) - binding.btnNegative.setTextColor(textColor) } fun updateState(downloadStatus: DownloadStatus) { diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/UpdateHeaderView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/UpdateHeaderView.kt index 0452a4ebd..8faaf1a90 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/UpdateHeaderView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/UpdateHeaderView.kt @@ -25,8 +25,6 @@ import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.OnViewRecycled -import com.aurora.extensions.accentColor -import com.aurora.extensions.contrastingColor import com.aurora.store.databinding.ViewHeaderUpdateBinding @@ -48,7 +46,6 @@ class UpdateHeaderView @JvmOverloads constructor( @ModelProp fun action(action: String) { binding.btnAction.text = action - binding.btnAction.setTextColor(contrastingColor(context.accentColor())) } @CallbackProp diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppView.kt index 65e25dddd..9b563075f 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppView.kt @@ -26,8 +26,6 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView -import com.aurora.extensions.accentColor -import com.aurora.extensions.contrastingColor import com.aurora.store.databinding.ViewNoAppBinding import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @@ -64,7 +62,6 @@ class NoAppView @JvmOverloads constructor( @ModelProp fun actionMessage(message: String = String()) { binding.button.text = message - binding.button.setTextColor(contrastingColor(context.accentColor())) } @JvmOverloads diff --git a/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt b/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt index ed7a484dd..ea529f1ad 100644 --- a/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt @@ -26,7 +26,6 @@ import androidx.fragment.app.FragmentManager import androidx.lifecycle.Lifecycle import androidx.navigation.fragment.findNavController import androidx.viewpager2.adapter.FragmentStateAdapter -import com.aurora.extensions.applyColors import com.aurora.store.MobileNavigationDirections import com.aurora.store.R import com.aurora.store.data.providers.AuthProvider @@ -102,11 +101,8 @@ class AppsContainerFragment : BaseFragment() { tab.text = tabTitles[position] }.attach() - binding.searchFab.apply { - applyColors() - setOnClickListener { - findNavController().navigate(R.id.searchSuggestionFragment) - } + binding.searchFab.setOnClickListener { + findNavController().navigate(R.id.searchSuggestionFragment) } } diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/MoreDialogFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/MoreDialogFragment.kt index 2686032ba..edd636bcc 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/MoreDialogFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/MoreDialogFragment.kt @@ -10,31 +10,31 @@ import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.LocalContext @@ -52,14 +52,13 @@ import coil.compose.SubcomposeAsyncImage import coil.request.ImageRequest import com.aurora.Constants import com.aurora.Constants.URL_TOS -import com.aurora.extensions.accentColor -import com.aurora.extensions.backgroundColor import com.aurora.extensions.browse -import com.aurora.extensions.darkenColor import com.aurora.extensions.getStyledAttributeColor -import com.aurora.extensions.lightenColor +import com.aurora.extensions.setAppTheme +import com.aurora.store.MR import com.aurora.store.R import com.aurora.store.data.providers.AuthProvider +import com.aurora.store.util.Preferences import com.aurora.store.view.theme.AuroraTheme import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint @@ -93,17 +92,14 @@ class MoreDialogFragment : DialogFragment() { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { AuroraTheme { - if (isSystemInDarkTheme()) { - primaryColor = Color(requireContext().backgroundColor()) - onPrimaryColor = Color(lightenColor(primaryColor.toArgb(), 0.85f)) - secondaryColor = Color(darkenColor(primaryColor.toArgb(), 0.75f)) - onSecondaryColor = Color(lightenColor(secondaryColor.toArgb(), 0.85f)) - } else { - primaryColor = Color(lightenColor(requireContext().accentColor(), 0.85f)) - onPrimaryColor = Color(darkenColor(primaryColor.toArgb(), 0.15f)) - secondaryColor = Color(lightenColor(primaryColor.toArgb(), 0.75f)) - onSecondaryColor = Color(darkenColor(secondaryColor.toArgb(), 0.15f)) - } + primaryColor = + Color(requireContext().getStyledAttributeColor(MR.colorSurface)) + onPrimaryColor = + Color(requireContext().getStyledAttributeColor(MR.colorOnSurface)) + secondaryColor = + Color(requireContext().getStyledAttributeColor(MR.colorSecondaryContainer)) + onSecondaryColor = + Color(requireContext().getStyledAttributeColor(MR.colorOnSecondaryContainer)) Column( modifier = Modifier @@ -160,21 +156,30 @@ class MoreDialogFragment : DialogFragment() { @Composable fun AppBar(backgroundColor: Color = Color.Transparent, onBackgroundColor: Color) { - Box(contentAlignment = Alignment.CenterEnd) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxWidth() + .padding(4.dp, 10.dp, 4.dp, 10.dp) + ) { + ThreeStateIconButton(tint = onBackgroundColor) Text( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.wrapContentWidth(), text = stringResource(id = R.string.app_name), style = MaterialTheme.typography.titleMedium, color = onBackgroundColor, textAlign = TextAlign.Center ) - IconButton(onClick = { findNavController().navigateUp() }) { - Icon( - painter = painterResource(id = R.drawable.ic_cancel), - contentDescription = stringResource(id = R.string.action_cancel), - tint = onBackgroundColor - ) - } + + Image( + painter = painterResource(id = R.drawable.ic_cancel), + contentDescription = stringResource(id = R.string.action_cancel), + modifier = Modifier.clickable { + findNavController().navigateUp() + }, + colorFilter = ColorFilter.tint(onBackgroundColor) + ) } } @@ -306,6 +311,56 @@ class MoreDialogFragment : DialogFragment() { } } + @Composable + fun ThreeStateIconButton( + tint: Color = Color.White + ) { + var currentState by remember { + mutableStateOf( + Preferences.getInteger( + requireContext(), + Preferences.PREFERENCE_THEME_STYLE + ).let { + State.entries.getOrNull(it) + } ?: State.Auto + ) + } + + val iconRes = when (currentState) { + State.Light -> R.drawable.ic_light + State.Dark -> R.drawable.ic_dark + else -> R.drawable.ic_auto + } + + Image( + painter = painterResource(id = iconRes), + contentDescription = null, + modifier = Modifier.clickable { + currentState = when (currentState) { + State.Light -> State.Dark + State.Dark -> State.Auto + State.Auto -> State.Light + } + + Preferences.putInteger( + requireContext(), + Preferences.PREFERENCE_THEME_STYLE, + currentState.value + ) + + setAppTheme(currentState.value) + findNavController().navigateUp() + }, + colorFilter = ColorFilter.tint(tint) + ) + } + + enum class State(val value: Int) { + Auto(0), + Light(1), + Dark(2), + } + private fun getOptions(): List