|
|
@@ -0,0 +1,151 @@
|
|
|
+package com.sduduzog.slimlauncher.utils
|
|
|
+
|
|
|
+import android.annotation.TargetApi
|
|
|
+import android.app.Activity
|
|
|
+import android.content.Context
|
|
|
+import android.content.SharedPreferences
|
|
|
+import android.content.res.Configuration
|
|
|
+import android.os.Build
|
|
|
+import android.util.TypedValue
|
|
|
+import android.view.View
|
|
|
+import android.view.Window
|
|
|
+import android.view.WindowInsets
|
|
|
+import android.view.WindowInsetsController
|
|
|
+import android.view.WindowManager
|
|
|
+import androidx.annotation.RequiresApi
|
|
|
+import androidx.appcompat.app.AppCompatActivity
|
|
|
+import com.sduduzog.slimlauncher.R
|
|
|
+import dagger.Module
|
|
|
+import dagger.Provides
|
|
|
+import dagger.hilt.InstallIn
|
|
|
+import dagger.hilt.android.components.ActivityComponent
|
|
|
+import dagger.hilt.android.qualifiers.ActivityContext
|
|
|
+
|
|
|
+@Module
|
|
|
+@InstallIn(ActivityComponent::class)
|
|
|
+open class SystemUiManager internal constructor(internal val context: Context) {
|
|
|
+ internal val window: Window = (context as Activity).window
|
|
|
+ internal val settings: SharedPreferences = context.getSharedPreferences(
|
|
|
+ context.getString(R.string.prefs_settings),
|
|
|
+ AppCompatActivity.MODE_PRIVATE
|
|
|
+ )
|
|
|
+
|
|
|
+ companion object {
|
|
|
+ @Provides
|
|
|
+ fun createInstance(@ActivityContext context: Context): SystemUiManager {
|
|
|
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
|
+ (context as Activity).window.attributes.layoutInDisplayCutoutMode =
|
|
|
+ WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
|
|
+ return LSystemUiManager(context)
|
|
|
+ }
|
|
|
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
|
|
+ return MSystemUiManager(context)
|
|
|
+ }
|
|
|
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
|
|
|
+ return OSystemUiManager(context)
|
|
|
+ }
|
|
|
+ return SystemUiManager(context)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @TargetApi(Build.VERSION_CODES.R)
|
|
|
+ open fun setSystemUiVisibility() {
|
|
|
+ val insetsController = window.insetsController
|
|
|
+
|
|
|
+ if (isSystemUiHidden()) {
|
|
|
+ insetsController?.hide(WindowInsets.Type.statusBars())
|
|
|
+ } else {
|
|
|
+ insetsController?.show(WindowInsets.Type.statusBars())
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isLightModeTheme()) {
|
|
|
+ insetsController?.setSystemBarsAppearance(
|
|
|
+ WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
|
|
|
+ WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
|
|
|
+ )
|
|
|
+ insetsController?.setSystemBarsAppearance(
|
|
|
+ WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS,
|
|
|
+ WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS
|
|
|
+ )
|
|
|
+ } else {
|
|
|
+ insetsController?.setSystemBarsAppearance(
|
|
|
+ 0,
|
|
|
+ WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
|
|
|
+ )
|
|
|
+ insetsController?.setSystemBarsAppearance(
|
|
|
+ 0,
|
|
|
+ WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @TargetApi(Build.VERSION_CODES.O)
|
|
|
+ open fun setSystemUiColors() {
|
|
|
+ val primaryColor = getPrimaryColor()
|
|
|
+ window.statusBarColor = primaryColor
|
|
|
+ window.navigationBarColor = primaryColor
|
|
|
+ }
|
|
|
+
|
|
|
+ internal fun getPrimaryColor(): Int {
|
|
|
+ val primaryColor = TypedValue()
|
|
|
+ context.theme.resolveAttribute(R.attr.colorPrimary, primaryColor, true)
|
|
|
+ return primaryColor.data
|
|
|
+ }
|
|
|
+
|
|
|
+ internal fun isSystemUiHidden(): Boolean {
|
|
|
+ return settings.getBoolean(
|
|
|
+ context.getString(R.string.prefs_settings_key_toggle_status_bar),
|
|
|
+ false
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ internal fun isLightModeTheme(): Boolean {
|
|
|
+ val theme = settings.getInt(context.getString(R.string.prefs_settings_key_theme), 0)
|
|
|
+ val uiMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
|
|
|
+ return listOf(
|
|
|
+ 6,
|
|
|
+ 3,
|
|
|
+ 5
|
|
|
+ ).contains(theme) || (theme == 0 && uiMode == Configuration.UI_MODE_NIGHT_NO)
|
|
|
+ }
|
|
|
+
|
|
|
+ private open class OSystemUiManager(context: Context) : SystemUiManager(context) {
|
|
|
+ @RequiresApi(Build.VERSION_CODES.O)
|
|
|
+ override fun setSystemUiVisibility() {
|
|
|
+ window.decorView.systemUiVisibility =
|
|
|
+ getLightUiBarFlags() or getToggleStatusBarFlags()
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequiresApi(Build.VERSION_CODES.O)
|
|
|
+ open fun getLightUiBarFlags(): Int {
|
|
|
+ return if (isLightModeTheme()) View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR else 0
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun getToggleStatusBarFlags(): Int {
|
|
|
+ return View.SYSTEM_UI_FLAG_LAYOUT_STABLE or if (isSystemUiHidden()) View.SYSTEM_UI_FLAG_FULLSCREEN else 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private open class MSystemUiManager(context: Context) : OSystemUiManager(context) {
|
|
|
+ @RequiresApi(Build.VERSION_CODES.M)
|
|
|
+ override fun setSystemUiColors() {
|
|
|
+ window.statusBarColor = getPrimaryColor()
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequiresApi(Build.VERSION_CODES.M)
|
|
|
+ override fun getLightUiBarFlags(): Int {
|
|
|
+ return if (isLightModeTheme()) View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR else 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private class LSystemUiManager(context: Context) : MSystemUiManager(context) {
|
|
|
+ override fun setSystemUiColors() {}
|
|
|
+
|
|
|
+ override fun getLightUiBarFlags(): Int {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|