system bar color tweaks

This commit is contained in:
Phillip Thelen 2025-02-11 15:21:54 +01:00
parent be77530a09
commit 699a31fd52
11 changed files with 96 additions and 56 deletions

View file

@ -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()
}
}
}

View file

@ -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

View file

@ -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<Toolbar>(R.id.toolbar)

View file

@ -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() {

View file

@ -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

View file

@ -282,17 +282,25 @@ open class MainActivity : BaseActivity(), SnackbarActivity {
drawerView: View,
slideOffset: Float
) {
if (!isUsingNightModeResources()) {
if (slideOffset < 0.5f && isOpeningDrawer == null) {
if (!isUsingNightModeResources()) {
window.updateStatusBarColor(getThemeColor(R.attr.colorPrimaryDark), false)
}
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
}
}

View file

@ -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() {

View file

@ -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)

View file

@ -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<VB : ViewBinding> : BaseFragment<VB>() {
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()
}
}
setHasOptionsMenu(true)
@ -94,6 +91,25 @@ abstract class BaseMainFragment<VB : ViewBinding> : BaseFragment<VB>() {
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")

View file

@ -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
}
}

View file

@ -1,2 +1,2 @@
NAME=4.7.0
CODE=12351
CODE=12361