diff --git a/app/build.gradle b/app/build.gradle index 35ab82695..cb98b8a8a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -404,7 +404,6 @@ dependencies { implementation Deps.mozilla_lib_crash implementation Deps.mozilla_lib_push_firebase debugImplementation Deps.leakcanary - releaseImplementation Deps.leakcanary_noop implementation Deps.androidx_legacy implementation Deps.androidx_paging diff --git a/app/src/debug/java/org/mozilla/fenix/DebugFenixApplication.kt b/app/src/debug/java/org/mozilla/fenix/DebugFenixApplication.kt index 9ea6d234a..d9002f19a 100644 --- a/app/src/debug/java/org/mozilla/fenix/DebugFenixApplication.kt +++ b/app/src/debug/java/org/mozilla/fenix/DebugFenixApplication.kt @@ -4,40 +4,22 @@ package org.mozilla.fenix -import android.content.Context -import android.content.SharedPreferences import androidx.preference.PreferenceManager -import com.squareup.leakcanary.AndroidHeapDumper -import com.squareup.leakcanary.HeapDumper -import com.squareup.leakcanary.LeakCanary -import com.squareup.leakcanary.internal.LeakCanaryInternals -import org.mozilla.fenix.R.string.pref_key_leakcanary +import leakcanary.AppWatcher +import leakcanary.LeakCanary import org.mozilla.fenix.ext.getPreferenceKey -import java.io.File class DebugFenixApplication : FenixApplication() { - private var heapDumper: ToggleableHeapDumper? = null - override fun setupLeakCanary() { - val leakDirectoryProvider = LeakCanaryInternals.getLeakDirectoryProvider(this) - val defaultDumper = AndroidHeapDumper(this, leakDirectoryProvider) - heapDumper = ToggleableHeapDumper(this, defaultDumper) - LeakCanary.refWatcher(this) - .heapDumper(heapDumper) - .buildAndInstall() + val isEnabled = PreferenceManager.getDefaultSharedPreferences(this) + .getBoolean(getPreferenceKey(R.string.pref_key_leakcanary), false) + + updateLeakCanaryState(isEnabled) } - override fun toggleLeakCanary(newValue: Boolean) { - heapDumper?.enabled = newValue - } - - internal class ToggleableHeapDumper( - context: Context, - private val defaultDumper: HeapDumper - ) : HeapDumper { - var prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) - var enabled = prefs.getBoolean(context.getPreferenceKey(pref_key_leakcanary), false) - override fun dumpHeap(): File? = if (enabled) defaultDumper.dumpHeap() else HeapDumper.RETRY_LATER + override fun updateLeakCanaryState(isEnabled: Boolean) { + AppWatcher.config = AppWatcher.config.copy(enabled = isEnabled) + LeakCanary.config = LeakCanary.config.copy(dumpHeap = isEnabled) } } diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index d2b6b190b..d24815f5d 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -137,7 +137,7 @@ open class FenixApplication : Application() { // no-op, LeakCanary is disabled by default } - open fun toggleLeakCanary(newValue: Boolean) { + open fun updateLeakCanaryState(isEnabled: Boolean) { // no-op, LeakCanary is disabled by default } diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index 92d7d107f..1e7306440 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -26,7 +26,6 @@ import mozilla.components.concept.sync.Profile import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags -import org.mozilla.fenix.FenixApplication import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.R.string.pref_key_about @@ -54,6 +53,7 @@ import org.mozilla.fenix.R.string.pref_key_tracking_protection_settings import org.mozilla.fenix.R.string.pref_key_your_rights import org.mozilla.fenix.components.PrivateShortcutCreateManager import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.metrics @@ -85,15 +85,24 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { super.onCreate(savedInstanceState) // Observe account changes to keep the UI up-to-date. - requireComponents.backgroundServices.accountManager.register(this, owner = this, autoPause = true) + requireComponents.backgroundServices.accountManager.register( + this, + owner = this, + autoPause = true + ) // It's important to update the account UI state in onCreate, even though we also call it in onResume, since // that ensures we'll never display an incorrect state in the UI. For example, if user is signed-in, and we // don't perform this call in onCreate, we'll briefly display a "Sign In" preference, which will then get // replaced by the correct account information once this call is ran in onResume shortly after. - updateAccountUIState(context!!, requireComponents.backgroundServices.accountManager.accountProfile()) + updateAccountUIState( + context!!, + requireComponents.backgroundServices.accountManager.accountProfile() + ) - preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener) + preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener( + preferenceChangeListener + ) } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -139,12 +148,16 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { } findPreference(getPreferenceKey(pref_key_add_private_browsing_shortcut))?.apply { - isVisible = !PrivateShortcutCreateManager.doesPrivateBrowsingPinnedShortcutExist(context) + isVisible = + !PrivateShortcutCreateManager.doesPrivateBrowsingPinnedShortcutExist(context) } setupPreferences() - updateAccountUIState(context!!, requireComponents.backgroundServices.accountManager.accountProfile()) + updateAccountUIState( + context!!, + requireComponents.backgroundServices.accountManager.accountProfile() + ) updatePreferenceVisibilityForFeatureFlags() } @@ -187,7 +200,10 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { } resources.getString(pref_key_help) -> { (activity as HomeActivity).openToBrowserAndLoad( - searchTermOrURL = SupportUtils.getSumoURLForTopic(context!!, SupportUtils.SumoTopic.HELP), + searchTermOrURL = SupportUtils.getSumoURLForTopic( + context!!, + SupportUtils.SumoTopic.HELP + ), newTab = true, from = BrowserDirection.FromSettings ) @@ -228,7 +244,10 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { } resources.getString(pref_key_privacy_link) -> { requireContext().let { context -> - val intent = SupportUtils.createCustomTabIntent(context, SupportUtils.getPrivacyNoticeUrl()) + val intent = SupportUtils.createCustomTabIntent( + context, + SupportUtils.getPrivacyNoticeUrl() + ) startActivity(intent) } } @@ -247,7 +266,9 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { override fun onDestroy() { super.onDestroy() - preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener) + preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener( + preferenceChangeListener + ) } private fun getClickListenerForSignIn(): OnPreferenceClickListener { @@ -266,7 +287,8 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { if (!Config.channel.isReleased) { preferenceLeakCanary?.setOnPreferenceChangeListener { _, newValue -> - (context?.applicationContext as FenixApplication).toggleLeakCanary(newValue as Boolean) + val isEnabled = newValue == true + context?.application?.updateLeakCanaryState(isEnabled) true } } @@ -290,7 +312,8 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { } private fun navigateToTrackingProtectionSettings() { - val directions = SettingsFragmentDirections.actionSettingsFragmentToTrackingProtectionFragment() + val directions = + SettingsFragmentDirections.actionSettingsFragmentToTrackingProtectionFragment() Navigation.findNavController(view!!).navigate(directions) } @@ -311,7 +334,8 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { } private fun navigateToDefaultBrowserSettingsFragment() { - val directions = SettingsFragmentDirections.actionSettingsFragmentToDefaultBrowserSettingsFragment() + val directions = + SettingsFragmentDirections.actionSettingsFragmentToDefaultBrowserSettingsFragment() Navigation.findNavController(view!!).navigate(directions) } @@ -337,7 +361,8 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { } private fun navigateToDeleteBrowsingData() { - val directions = SettingsFragmentDirections.actionSettingsFragmentToDeleteBrowsingDataFragment() + val directions = + SettingsFragmentDirections.actionSettingsFragmentToDeleteBrowsingDataFragment() Navigation.findNavController(view!!).navigate(directions) } @@ -350,7 +375,10 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { override fun onAuthenticated(account: OAuthAccount, authType: AuthType) { lifecycleScope.launch { context?.let { - updateAccountUIState(it, it.components.backgroundServices.accountManager.accountProfile()) + updateAccountUIState( + it, + it.components.backgroundServices.accountManager.accountProfile() + ) } } } @@ -358,7 +386,10 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { override fun onLoggedOut() { lifecycleScope.launch { context?.let { - updateAccountUIState(it, it.components.backgroundServices.accountManager.accountProfile()) + updateAccountUIState( + it, + it.components.backgroundServices.accountManager.accountProfile() + ) } } } @@ -374,7 +405,10 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { override fun onAuthenticationProblems() { lifecycleScope.launch { context?.let { - updateAccountUIState(it, it.components.backgroundServices.accountManager.accountProfile()) + updateAccountUIState( + it, + it.components.backgroundServices.accountManager.accountProfile() + ) } } } @@ -389,7 +423,11 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { val preferenceFirefoxAccount = findPreference(context.getPreferenceKey(pref_key_account)) val preferenceFirefoxAccountAuthError = - findPreference(context.getPreferenceKey(pref_key_account_auth_error)) + findPreference( + context.getPreferenceKey( + pref_key_account_auth_error + ) + ) val accountPreferenceCategory = findPreference(context.getPreferenceKey(pref_key_account_category)) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 2ff799007..56241284a 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -12,7 +12,7 @@ object Versions { const val rxBindings = "3.0.0-alpha2" const val anko = "0.10.8" const val sentry = "1.7.10" - const val leakcanary = "1.6.3" + const val leakcanary = "2.0-beta-3" const val leanplum = "5.2.3" const val osslicenses_plugin = "0.9.5" const val osslicenses_library = "17.0.0" @@ -162,7 +162,6 @@ object Deps { const val sentry = "io.sentry:sentry-android:${Versions.sentry}" const val leakcanary = "com.squareup.leakcanary:leakcanary-android:${Versions.leakcanary}" - const val leakcanary_noop = "com.squareup.leakcanary:leakcanary-android-no-op:${Versions.leakcanary}" const val leanplum = "com.leanplum:leanplum-core:${Versions.leanplum}" const val leanplumMessaging = "com.leanplum:leanplum-fcm:${Versions.leanplum}"