diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/DefaultActivityLifecycleCallbacks.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/DefaultActivityLifecycleCallbacks.kt new file mode 100644 index 000000000..dd83e4dc7 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/DefaultActivityLifecycleCallbacks.kt @@ -0,0 +1,22 @@ +package org.koitharu.kotatsu.base.ui + +import android.app.Activity +import android.app.Application.ActivityLifecycleCallbacks +import android.os.Bundle + +interface DefaultActivityLifecycleCallbacks : ActivityLifecycleCallbacks { + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) = Unit + + override fun onActivityStarted(activity: Activity) = Unit + + override fun onActivityResumed(activity: Activity) = Unit + + override fun onActivityPaused(activity: Activity) = Unit + + override fun onActivityStopped(activity: Activity) = Unit + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) = Unit + + override fun onActivityDestroyed(activity: Activity) = Unit +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActivityRecreationHandle.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActivityRecreationHandle.kt index 985205ed6..e50c92479 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActivityRecreationHandle.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActivityRecreationHandle.kt @@ -1,14 +1,14 @@ package org.koitharu.kotatsu.base.ui.util import android.app.Activity -import android.app.Application.ActivityLifecycleCallbacks import android.os.Bundle -import java.util.* +import org.koitharu.kotatsu.base.ui.DefaultActivityLifecycleCallbacks +import java.util.WeakHashMap import javax.inject.Inject import javax.inject.Singleton @Singleton -class ActivityRecreationHandle @Inject constructor() : ActivityLifecycleCallbacks { +class ActivityRecreationHandle @Inject constructor() : DefaultActivityLifecycleCallbacks { private val activities = WeakHashMap() @@ -16,16 +16,6 @@ class ActivityRecreationHandle @Inject constructor() : ActivityLifecycleCallback activities[activity] = Unit } - override fun onActivityStarted(activity: Activity) = Unit - - override fun onActivityResumed(activity: Activity) = Unit - - override fun onActivityPaused(activity: Activity) = Unit - - override fun onActivityStopped(activity: Activity) = Unit - - override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) = Unit - override fun onActivityDestroyed(activity: Activity) { activities.remove(activity) } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt index 1b9c8109c..459ac9e8b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt @@ -18,8 +18,6 @@ import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import dagger.multibindings.ElementsIntoSet -import java.util.concurrent.TimeUnit -import javax.inject.Singleton import kotlinx.coroutines.Dispatchers import okhttp3.CookieJar import okhttp3.OkHttpClient @@ -40,9 +38,12 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.search.ui.MangaSuggestionsProvider import org.koitharu.kotatsu.settings.backup.BackupObserver import org.koitharu.kotatsu.sync.domain.SyncController +import org.koitharu.kotatsu.utils.IncognitoModeIndicator import org.koitharu.kotatsu.utils.ext.isLowRamDevice import org.koitharu.kotatsu.utils.image.CoilImageGetter import org.koitharu.kotatsu.widget.WidgetUpdater +import java.util.concurrent.TimeUnit +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) @@ -152,9 +153,11 @@ interface AppModule { fun provideActivityLifecycleCallbacks( appProtectHelper: AppProtectHelper, activityRecreationHandle: ActivityRecreationHandle, + incognitoModeIndicator: IncognitoModeIndicator, ): Set<@JvmSuppressWildcards Application.ActivityLifecycleCallbacks> = arraySetOf( appProtectHelper, activityRecreationHandle, + incognitoModeIndicator, ) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/AppProtectHelper.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/AppProtectHelper.kt index c94cdd153..4d09d621a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/AppProtectHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/AppProtectHelper.kt @@ -1,16 +1,16 @@ package org.koitharu.kotatsu.main.ui.protect import android.app.Activity -import android.app.Application import android.content.Intent import android.os.Bundle +import org.acra.dialog.CrashReportDialog +import org.koitharu.kotatsu.base.ui.DefaultActivityLifecycleCallbacks +import org.koitharu.kotatsu.core.prefs.AppSettings import javax.inject.Inject import javax.inject.Singleton -import org.acra.dialog.CrashReportDialog -import org.koitharu.kotatsu.core.prefs.AppSettings @Singleton -class AppProtectHelper @Inject constructor(private val settings: AppSettings) : Application.ActivityLifecycleCallbacks { +class AppProtectHelper @Inject constructor(private val settings: AppSettings) : DefaultActivityLifecycleCallbacks { private var isUnlocked = settings.appPassword.isNullOrEmpty() @@ -27,16 +27,6 @@ class AppProtectHelper @Inject constructor(private val settings: AppSettings) : } } - override fun onActivityStarted(activity: Activity) = Unit - - override fun onActivityResumed(activity: Activity) = Unit - - override fun onActivityPaused(activity: Activity) = Unit - - override fun onActivityStopped(activity: Activity) = Unit - - override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) = Unit - override fun onActivityDestroyed(activity: Activity) { if (activity !is ProtectActivity && activity.isFinishing && activity.isTaskRoot) { restoreLock() diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/IncognitoModeIndicator.kt b/app/src/main/java/org/koitharu/kotatsu/utils/IncognitoModeIndicator.kt new file mode 100644 index 000000000..8ca72f3eb --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/utils/IncognitoModeIndicator.kt @@ -0,0 +1,46 @@ +package org.koitharu.kotatsu.utils + +import android.app.Activity +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.base.ui.DefaultActivityLifecycleCallbacks +import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.prefs.observeAsFlow +import org.koitharu.kotatsu.utils.ext.getThemeColor +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class IncognitoModeIndicator @Inject constructor( + private val settings: AppSettings, +) : DefaultActivityLifecycleCallbacks { + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + if (activity !is AppCompatActivity) { + return + } + settings.observeAsFlow( + key = AppSettings.KEY_INCOGNITO_MODE, + valueProducer = { isIncognitoModeEnabled }, + ).flowOn(Dispatchers.IO) + .flowWithLifecycle(activity.lifecycle) + .onEach { updateStatusBar(activity, it) } + .launchIn(activity.lifecycleScope) + } + + private fun updateStatusBar(activity: AppCompatActivity, isIncognitoModeEnabled: Boolean) { + activity.window.statusBarColor = if (isIncognitoModeEnabled) { + ContextCompat.getColor(activity, R.color.status_bar_incognito) + } else { + activity.getThemeColor(android.R.attr.statusBarColor) + } + } +} diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 8241e3ac4..ef901bd78 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -8,5 +8,6 @@ #66FFFFFF #29FFFFFF #1FFFFFFF + #260052 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a066547bb..bd13e4c65 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -21,5 +21,5 @@ #66000000 #29000000 #1F000000 - + #334800E0