55package com.fox2code.mmm
66
77import android.annotation.SuppressLint
8+ import android.app.Activity
89import android.app.ActivityManager
910import android.app.ActivityManager.RunningAppProcessInfo
11+ import android.app.Application
12+ import android.app.Application.ActivityLifecycleCallbacks
1013import android.content.Context
1114import android.content.Intent
1215import android.content.SharedPreferences
1316import android.content.pm.PackageManager
1417import android.content.res.Resources
1518import android.os.Build
19+ import android.os.Bundle
1620import android.os.SystemClock
1721import android.util.Log
1822import androidx.annotation.StyleRes
23+ import androidx.appcompat.app.AppCompatActivity
1924import androidx.core.app.NotificationManagerCompat
2025import androidx.emoji2.text.DefaultEmojiCompatConfig
2126import androidx.emoji2.text.EmojiCompat
2227import androidx.security.crypto.EncryptedSharedPreferences
2328import androidx.security.crypto.MasterKey
2429import androidx.work.Configuration
25- import com.fox2code.foxcompat.app.FoxActivity
26- import com.fox2code.foxcompat.app.FoxApplication
2730import com.fox2code.foxcompat.app.internal.FoxProcessExt
2831import com.fox2code.foxcompat.view.FoxThemeWrapper
2932import com.fox2code.mmm.installer.InstallerInitializer
@@ -58,29 +61,36 @@ import java.util.Random
5861import kotlin.math.abs
5962
6063@Suppress(" unused" , " MemberVisibilityCanBePrivate" )
61- class MainApplication : FoxApplication (), Configuration.Provider {
64+ class MainApplication : Application (), Configuration.Provider, ActivityLifecycleCallbacks {
6265
6366 var isTainted = false
6467
65- @JvmField
68+ var lastActivity: AppCompatActivity ? = null
69+
6670 var modulesHaveUpdates = false
6771
68- @JvmField
6972 var updateModuleCount = 0
7073
71- @JvmField
7274 var updateModules: List <String > = ArrayList ()
7375
7476 @StyleRes
7577 private var managerThemeResId = R .style.Theme_MagiskModuleManager
7678 private var markwonThemeContext: FoxThemeWrapper ? = null
7779
78- @JvmField
7980 var markwon: Markwon ? = null
8081 private var existingKey: CharArray? = null
8182
82- @JvmField
8383 var tracker: Tracker ? = null
84+ get() {
85+ if (field == null ) {
86+ field = TrackerBuilder .createDefault(BuildConfig .ANALYTICS_ENDPOINT , 1 )
87+ .build(Matomo .getInstance(this ))
88+ val tracker = field!!
89+ tracker.startNewSession()
90+ tracker.dispatchInterval = 1000
91+ }
92+ return field
93+ }
8494 private var makingNewKey = false
8595 private var isCrashHandler = false
8696
@@ -124,7 +134,7 @@ class MainApplication : FoxApplication(), Configuration.Provider {
124134 return existingKey!!
125135 }
126136
127- fun getMarkwon (): Markwon ? {
137+ fun reallyGetMarkwon (): Markwon ? {
128138 if (isCrashHandler) return null
129139 if (markwon != null ) return markwon
130140 var contextThemeWrapper = markwonThemeContext
@@ -140,7 +150,7 @@ class MainApplication : FoxApplication(), Configuration.Provider {
140150 )
141151 )
142152 ).build()
143- return markwon .also { this .markwon = it }
153+ return reallyGetMarkwon() .also { this .markwon = it }
144154 }
145155
146156 override fun getWorkManagerConfiguration (): Configuration {
@@ -194,32 +204,23 @@ class MainApplication : FoxApplication(), Configuration.Provider {
194204 markwon = null
195205 }
196206
197- @SuppressLint(" NonConstantResourceId" )
198- override fun isLightTheme (): Boolean {
199- return when (getSharedPreferences(" mmm" )!! .getString(" pref_theme" , " system" )) {
200- " system" -> isSystemLightTheme
201- " dark" , " black" -> false
207+ val isLightTheme: Boolean
208+ get() = when (managerThemeResId) {
209+ R .style.Theme_MagiskModuleManager ,
210+ R .style.Theme_MagiskModuleManager_Monet ,
211+ R .style.Theme_MagiskModuleManager_Dark ,
212+ R .style.Theme_MagiskModuleManager_Monet_Dark ,
213+ R .style.Theme_MagiskModuleManager_Black ,
214+ R .style.Theme_MagiskModuleManager_Monet_Black -> false
215+
202216 else -> true
203217 }
204- }
205218
206219 private val isSystemLightTheme: Boolean
207220 get() = (this .resources.configuration.uiMode and android.content.res.Configuration .UI_MODE_NIGHT_MASK ) != android.content.res.Configuration .UI_MODE_NIGHT_YES
208221 val isDarkTheme: Boolean
209222 get() = ! this .isLightTheme
210223
211- @Synchronized
212- fun getTracker (): Tracker ? {
213- if (tracker == null ) {
214- tracker = TrackerBuilder .createDefault(BuildConfig .ANALYTICS_ENDPOINT , 1 )
215- .build(Matomo .getInstance(this ))
216- val tracker = tracker!!
217- tracker.startNewSession()
218- tracker.dispatchInterval = 1000
219- }
220- return tracker
221- }
222-
223224 override fun onCreate () {
224225 supportedLocales.addAll(
225226 listOf (
@@ -251,6 +252,7 @@ class MainApplication : FoxApplication(), Configuration.Provider {
251252 if (INSTANCE == null ) INSTANCE = this
252253 relPackageName = this .packageName
253254 super .onCreate()
255+ registerActivityLifecycleCallbacks(this )
254256 initialize(this )
255257 // Initialize Timber
256258 configTimber()
@@ -274,15 +276,14 @@ class MainApplication : FoxApplication(), Configuration.Provider {
274276 if (BuildConfig .DEBUG ) Timber .d(" AMM is running in debug mode" )
275277 // analytics
276278 if (BuildConfig .DEBUG ) Timber .d(" Initializing matomo" )
277- getTracker()
278279 if (! isMatomoAllowed()) {
279280 if (BuildConfig .DEBUG ) Timber .d(" Matomo is not allowed" )
280281 tracker!! .isOptOut = true
281282 } else {
282283 tracker!! .isOptOut = false
283284 }
284285 if (getSharedPreferences(" matomo" )!! .getBoolean(" install_tracked" , false )) {
285- TrackHelper .track().download().with (INSTANCE !! .getTracker() )
286+ TrackHelper .track().download().with (INSTANCE !! .tracker )
286287 if (BuildConfig .DEBUG ) Timber .d(" Sent install event to matomo" )
287288 getSharedPreferences(" matomo" )!! .edit().putBoolean(" install_tracked" , true ).apply ()
288289 } else {
@@ -345,22 +346,12 @@ class MainApplication : FoxApplication(), Configuration.Provider {
345346 Timber .w(" ANDROIDACY_CLIENT_ID is empty, disabling AndroidacyRepoData 1" )
346347 editor.apply ()
347348 }
348- getMarkwon ()
349+ reallyGetMarkwon ()
349350 }
350351
351352 private val intent: Intent ?
352353 get() = this .packageManager.getLaunchIntentForPackage(this .packageName)
353354
354- override fun onCreateFoxActivity (compatActivity : FoxActivity ) {
355- super .onCreateFoxActivity(compatActivity)
356- compatActivity.setTheme(managerThemeResId)
357- }
358-
359- override fun onRefreshUI (compatActivity : FoxActivity ) {
360- super .onRefreshUI(compatActivity)
361- compatActivity.setThemeRecreate(managerThemeResId)
362- }
363-
364355 override fun onConfigurationChanged (newConfig : android.content.res.Configuration ) {
365356 val newTimeFormatLocale = newConfig.locales[0 ]
366357 if (timeFormatLocale != = newTimeFormatLocale) {
@@ -503,7 +494,6 @@ class MainApplication : FoxApplication(), Configuration.Provider {
503494 private var relPackageName = BuildConfig .APPLICATION_ID
504495
505496 @SuppressLint(" StaticFieldLeak" )
506- @JvmStatic
507497 var INSTANCE : MainApplication ? = null
508498 private set
509499 get() {
@@ -514,7 +504,6 @@ class MainApplication : FoxApplication(), Configuration.Provider {
514504 return field
515505 }
516506
517- @JvmStatic
518507 var isFirstBoot = false
519508 private var mSharedPrefs: HashMap <Any , Any >? = null
520509 var updateCheckBg: String? = null
@@ -555,7 +544,6 @@ class MainApplication : FoxApplication(), Configuration.Provider {
555544 }
556545
557546 @Suppress(" NAME_SHADOWING" )
558- @JvmStatic
559547 fun getSharedPreferences (name : String ): SharedPreferences ? {
560548 // encryptedSharedPreferences is used
561549 var name = name
@@ -627,7 +615,6 @@ class MainApplication : FoxApplication(), Configuration.Provider {
627615 val isBlurEnabled: Boolean
628616 get() = getSharedPreferences(" mmm" )!! .getBoolean(" pref_enable_blur" , false )
629617
630- @JvmStatic
631618 val isDeveloper: Boolean
632619 get() {
633620 return if (BuildConfig .DEBUG ) true else getSharedPreferences(" mmm" )!! .getBoolean(
@@ -645,7 +632,6 @@ class MainApplication : FoxApplication(), Configuration.Provider {
645632 " mmm"
646633 )!! .getBoolean(" pref_use_magisk_install_command" , false ) && isDeveloper && ! InstallerInitializer .isKsu
647634
648- @JvmStatic
649635 val isBackgroundUpdateCheckEnabled: Boolean
650636 get() {
651637 if (updateCheckBg != null ) {
@@ -677,22 +663,44 @@ class MainApplication : FoxApplication(), Configuration.Provider {
677663 val bootSharedPreferences: SharedPreferences ?
678664 get() = getSharedPreferences(" mmm_boot" )
679665
680- @JvmStatic
681666 fun formatTime (timeStamp : Long ): String {
682667 // new Date(x) also get the local timestamp for format
683668 return timeFormat.format(Date (timeStamp))
684669 }
685670
686- @JvmStatic
687671 val isNotificationPermissionGranted: Boolean
688672 get() = NotificationManagerCompat .from((INSTANCE )!! ).areNotificationsEnabled()
689673
690- @JvmStatic
691674 fun isMatomoAllowed (): Boolean {
692675 return getSharedPreferences(" mmm" )!! .getBoolean(
693676 " pref_analytics_enabled" ,
694677 BuildConfig .DEFAULT_ENABLE_ANALYTICS
695678 )
696679 }
697680 }
681+
682+ override fun onActivityCreated (activity : Activity , savedInstanceState : Bundle ? ) {
683+ lastActivity = activity as AppCompatActivity
684+ activity.setTheme(managerThemeResId)
685+ }
686+
687+ override fun onActivityStarted (activity : Activity ) {
688+ }
689+
690+ override fun onActivityResumed (activity : Activity ) {
691+ lastActivity = activity as AppCompatActivity
692+ activity.setTheme(managerThemeResId)
693+ }
694+
695+ override fun onActivityPaused (activity : Activity ) {
696+ }
697+
698+ override fun onActivityStopped (activity : Activity ) {
699+ }
700+
701+ override fun onActivitySaveInstanceState (activity : Activity , outState : Bundle ) {
702+ }
703+
704+ override fun onActivityDestroyed (activity : Activity ) {
705+ }
698706}
0 commit comments