@ -2,14 +2,20 @@ package eu.kanade.tachiyomi
import android.app.ActivityManager
import android.app.Application
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.res.Configuration
import android.os.Build
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.getSystemService
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.multidex.MultiDex
import coil.ImageLoader
import coil.ImageLoaderFactory
@ -22,6 +28,9 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
import eu.kanade.tachiyomi.util.system.LocaleHelper
import eu.kanade.tachiyomi.util.system.notification
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.acra.ACRA
import org.acra.annotation.AcraCore
import org.acra.annotation.AcraHttpSender
@ -45,6 +54,8 @@ open class App : Application(), LifecycleObserver, ImageLoaderFactory {
private val preferences : PreferencesHelper by injectLazy ( )
private val disableIncognitoReceiver = DisableIncognitoReceiver ( )
override fun onCreate ( ) {
super . onCreate ( )
if ( BuildConfig . DEBUG ) Timber . plant ( Timber . DebugTree ( ) )
@ -65,6 +76,34 @@ open class App : Application(), LifecycleObserver, ImageLoaderFactory {
// Reset Incognito Mode on relaunch
preferences . incognitoMode ( ) . set ( false )
// Show notification to disable Incognito Mode when it's enabled
preferences . incognitoMode ( ) . asFlow ( )
. onEach { enabled ->
val notificationManager = NotificationManagerCompat . from ( this )
if ( enabled ) {
disableIncognitoReceiver . register ( )
val notification = notification ( Notifications . CHANNEL _INCOGNITO _MODE ) {
setContentTitle ( getString ( R . string . pref _incognito _mode ) )
setContentText ( getString ( R . string . notification _incognito _text ) )
setSmallIcon ( R . drawable . ic _glasses _black _24dp )
setOngoing ( true )
val pendingIntent = PendingIntent . getBroadcast (
this @App ,
0 ,
Intent ( ACTION _DISABLE _INCOGNITO _MODE ) ,
PendingIntent . FLAG _ONE _SHOT
)
setContentIntent ( pendingIntent )
}
notificationManager . notify ( Notifications . ID _INCOGNITO _MODE , notification )
} else {
disableIncognitoReceiver . unregister ( )
notificationManager . cancel ( Notifications . ID _INCOGNITO _MODE )
}
}
. launchIn ( ProcessLifecycleOwner . get ( ) . lifecycleScope )
}
override fun attachBaseContext ( base : Context ) {
@ -111,4 +150,30 @@ open class App : Application(), LifecycleObserver, ImageLoaderFactory {
protected open fun setupNotificationChannels ( ) {
Notifications . createChannels ( this )
}
private inner class DisableIncognitoReceiver : BroadcastReceiver ( ) {
private var registered = false
override fun onReceive ( context : Context , intent : Intent ) {
preferences . incognitoMode ( ) . set ( false )
}
fun register ( ) {
if ( ! registered ) {
registerReceiver ( this , IntentFilter ( ACTION _DISABLE _INCOGNITO _MODE ) )
registered = true
}
}
fun unregister ( ) {
if ( registered ) {
unregisterReceiver ( this )
registered = false
}
}
}
companion object {
private const val ACTION _DISABLE _INCOGNITO _MODE = " tachi.action.DISABLE_INCOGNITO_MODE "
}
}