diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/WindowExtensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/WindowExtensions.kt index 88aaf9dbb..dc62136d3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/WindowExtensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/WindowExtensions.kt @@ -3,8 +3,11 @@ package com.habitrpg.android.habitica.extensions import android.os.Build import android.view.View import android.view.Window +import android.view.WindowInsetsController import com.habitrpg.android.habitica.R import com.habitrpg.common.habitica.extensions.getThemeColor +import kotlin.and +import kotlin.or fun Window.updateStatusBarColor( color: Int, @@ -18,3 +21,18 @@ fun Window.updateStatusBarColor( decorView.systemUiVisibility = if (isLight) View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR else View.SYSTEM_UI_FLAG_VISIBLE } + +@Suppress("DEPRECATION") +fun Window.setNavigationBarDarkIcons(dark: Boolean) { + when { + Build.VERSION_CODES.R <= Build.VERSION.SDK_INT -> insetsController?.setSystemBarsAppearance( + if (dark) WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS else 0, + WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS + ) + else -> decorView.systemUiVisibility = if (dark) { + decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR + } else { + decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() + } + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt index 8d923d2e4..6dc4c2cf7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt @@ -94,7 +94,8 @@ abstract class BaseActivity : AppCompatActivity() { private val defaultNavigationBarStyle by lazy { SystemBarStyle.auto(ContextCompat.getColor(this, R.color.white_50_alpha), - ContextCompat.getColor(this, R.color.black_50_alpha) + ContextCompat.getColor(this, R.color.black_50_alpha), + { _ -> true} ) } internal var navigationBarStyle: SystemBarStyle? = null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt index aa804dff5..779fb9ab7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt @@ -23,9 +23,6 @@ class GemPurchaseActivity : PurchaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { showSubscription = !(intent.extras?.containsKey("openSubscription") == true && intent.extras?.getBoolean("openSubscription") == false) - if (showSubscription) { - navigationBarStyle = SystemBarStyle.dark(ContextCompat.getColor(this, R.color.background_brand_30)) - } super.onCreate(savedInstanceState) val toolbar = findViewById(R.id.toolbar) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt index 2a957ede3..63aa23261 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt @@ -1,13 +1,15 @@ package com.habitrpg.android.habitica.ui.activities import android.content.Intent +import android.os.Build import android.os.Bundle import android.view.View import android.view.ViewGroup -import android.view.WindowManager import androidx.activity.SystemBarStyle import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter @@ -16,6 +18,7 @@ import androidx.viewpager.widget.ViewPager import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.ContentRepository import com.habitrpg.android.habitica.databinding.ActivityIntroBinding +import com.habitrpg.android.habitica.extensions.setNavigationBarDarkIcons import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.viewpagerindicator.IconPagerAdapter @@ -40,7 +43,6 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan } public override fun onCreate(savedInstanceState: Bundle?) { - navigationBarStyle = SystemBarStyle.dark(ContextCompat.getColor(this, R.color.black_50_alpha)) super.onCreate(savedInstanceState) setupIntro() @@ -52,9 +54,18 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan lifecycleScope.launch(ExceptionHandler.coroutine()) { contentRepository.retrieveContent() } + } - window.statusBarColor = ContextCompat.getColor(this, R.color.black_20_alpha) - window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) + override fun onResume() { + super.onResume() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.navigationBarColor = ContextCompat.getColor(this, R.color.black) + window.isNavigationBarContrastEnforced = false + val controller = WindowCompat.getInsetsController(window, window.decorView) + controller.isAppearanceLightNavigationBars = false + controller.isAppearanceLightStatusBars = false + window.setNavigationBarDarkIcons(false) + } } private fun setupIntro() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt index aac6955eb..3ef95ce92 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt @@ -41,6 +41,7 @@ import com.habitrpg.android.habitica.extensions.updateStatusBarColor import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard import com.habitrpg.android.habitica.extensions.AuthenticationErrors +import com.habitrpg.android.habitica.extensions.setNavigationBarDarkIcons import com.habitrpg.android.habitica.ui.viewmodels.AuthenticationViewModel import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.common.habitica.helpers.launchCatching @@ -71,7 +72,6 @@ class LoginActivity : BaseActivity() { } override fun onCreate(savedInstanceState: Bundle?) { - navigationBarStyle = SystemBarStyle.dark(ContextCompat.getColor(this, R.color.black_50_alpha)) super.onCreate(savedInstanceState) supportActionBar?.hide() // Set default values to avoid null-responses when requesting unedited settings @@ -84,6 +84,17 @@ class LoginActivity : BaseActivity() { setupViewmodelObserving() } + override fun onResume() { + super.onResume() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.isNavigationBarContrastEnforced = false + val controller = WindowCompat.getInsetsController(window, window.decorView) + controller.isAppearanceLightNavigationBars = false + controller.isAppearanceLightStatusBars = false + window.setNavigationBarDarkIcons(false) + } + } + private fun setupViewmodelObserving() { lifecycleLaunchWhen(Lifecycle.State.RESUMED) { viewModel.showAuthProgress.collect { showProgress -> @@ -155,14 +166,6 @@ class LoginActivity : BaseActivity() { } } - override fun loadTheme( - sharedPreferences: SharedPreferences, - forced: Boolean, - ) { - super.loadTheme(sharedPreferences, forced) - window.updateStatusBarColor(R.color.black_20_alpha, false) - } - private fun resetLayout() { val isRegistering = viewModel.isRegistering.value binding.email.isVisible = isRegistering diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 51ea66896..1a6d765c9 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -282,17 +282,25 @@ open class MainActivity : BaseActivity(), SnackbarActivity { drawerView: View, slideOffset: Float ) { - if (!isUsingNightModeResources()) { - if (slideOffset < 0.5f && isOpeningDrawer == null) { + if (slideOffset < 0.5f && isOpeningDrawer == null) { + if (!isUsingNightModeResources()) { window.updateStatusBarColor(getThemeColor(R.attr.colorPrimaryDark), false) - isOpeningDrawer = true - } else if (slideOffset > 0.5f && isOpeningDrawer == null) { + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window?.isNavigationBarContrastEnforced = true + } + isOpeningDrawer = true + } else if (slideOffset > 0.5f && isOpeningDrawer == null) { + if (!isUsingNightModeResources()) { window.updateStatusBarColor( getThemeColor(R.attr.headerBackgroundColor), true ) - isOpeningDrawer = false } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window?.isNavigationBarContrastEnforced = !binding.content.bottomNavigation.isVisible + } + isOpeningDrawer = false } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt index 4bd1669ac..788f28d86 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt @@ -107,20 +107,6 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { binding.previousButton.setOnClickListener { previousClicked() } binding.nextButton.setOnClickListener { nextClicked() } - - if (this.isUsingNightModeResources()) { - window.statusBarColor = ContextCompat.getColor(this, R.color.black_20_alpha) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - window.insetsController?.setSystemBarsAppearance( - 0, - WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS - ) - } else { - @Suppress("DEPRECATION") - window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - } - } } override fun onDestroy() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt index 135df9f71..83f1ef4ff 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt @@ -12,10 +12,14 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.windowInsetsTopHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults @@ -160,6 +164,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { Color.White } Column(Modifier.background(HabiticaTheme.colors.primaryBackgroundFor(task))) { + Spacer(Modifier.windowInsetsTopHeight(WindowInsets.systemBars)) Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(vertical = 2.dp) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt index 20497ac61..5e91aa989 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments import android.graphics.PorterDuff +import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.Menu @@ -8,6 +9,7 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.view.WindowInsetsController import androidx.core.os.bundleOf import androidx.core.view.WindowCompat import androidx.viewbinding.ViewBinding @@ -16,6 +18,7 @@ import com.google.android.material.tabs.TabLayout import com.google.firebase.analytics.FirebaseAnalytics import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.UserRepository +import com.habitrpg.android.habitica.extensions.setNavigationBarDarkIcons import com.habitrpg.android.habitica.helpers.SoundManager import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper @@ -50,16 +53,10 @@ abstract class BaseMainFragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val window = activity?.window - if (window != null) { - val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView) - if (this.usesBottomNavigation) { - bottomNavigation?.visibility = View.VISIBLE - windowInsetsController.isAppearanceLightNavigationBars = false - } else { - bottomNavigation?.visibility = View.GONE - windowInsetsController.isAppearanceLightNavigationBars = requireActivity().isUsingNightModeResources() - } + if (this.usesBottomNavigation) { + bottomNavigation?.visibility = View.VISIBLE + } else { + bottomNavigation?.visibility = View.GONE } setHasOptionsMenu(true) @@ -94,6 +91,25 @@ abstract class BaseMainFragment : BaseFragment() { super.onResume() mainActivity?.showBackButton = showsBackButton mainActivity?.supportActionBar?.setDisplayHomeAsUpEnabled(true) + + val window = activity?.window + if (window != null) { + val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView) + if (this.usesBottomNavigation) { + windowInsetsController.isAppearanceLightNavigationBars = false + view?.systemUiVisibility + window.setNavigationBarDarkIcons(false) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.isNavigationBarContrastEnforced = false + } + } else { + windowInsetsController.isAppearanceLightNavigationBars = requireActivity().isUsingNightModeResources() + window.setNavigationBarDarkIcons(!requireActivity().isUsingNightModeResources()) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.isNavigationBarContrastEnforced = true + } + } + } } @Deprecated("Use onCreateOptionsMenu(Menu, MenuInflater) instead") diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt index 7413e90dd..f57b4d190 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.content.SharedPreferences import android.content.res.ColorStateList import android.graphics.drawable.GradientDrawable +import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -620,11 +621,6 @@ class NavigationDrawerFragment : DialogFragment() { adapter.updateItems(items) } - override fun onResume() { - super.onResume() - getItemWithIdentifier(SIDEBAR_SHOPS_CUSTOMIZATIONS)?.isVisible = configManager.enableCustomizationShop() - } - fun setSelection( transitionId: Int?, bundle: Bundle? = null, @@ -726,17 +722,16 @@ class NavigationDrawerFragment : DialogFragment() { containerView?.isVisible = false } } - fun toggleDrawer() { val containerView = fragmentContainerView if (containerView != null && containerView.parent is DrawerLayout) { if (drawerLayout?.isDrawerOpen(containerView) == true) { - drawerLayout?.closeDrawer(containerView) + closeDrawer() } else { - drawerLayout?.openDrawer(containerView) + openDrawer() } } else { - containerView?.isVisible = containerView?.isVisible != true + containerView?.isVisible = containerView.isVisible != true } } diff --git a/version.properties b/version.properties index b37a9120b..d5a6e3e5d 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ NAME=4.7.0 -CODE=12351 +CODE=12361 \ No newline at end of file