1
0
Fork 0
fenix/app/src/debug/java/org/mozilla/fenix/DebugFenixApplication.kt

70 lines
2.8 KiB
Kotlin

/* This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix
import android.content.Context
import android.content.SharedPreferences
import androidx.preference.PreferenceManager
import com.facebook.flipper.android.AndroidFlipperClient
import com.facebook.flipper.android.utils.FlipperUtils
import com.facebook.flipper.plugins.inspector.DescriptorMapping
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin
import com.facebook.flipper.plugins.leakcanary.LeakCanaryFlipperPlugin
import com.facebook.flipper.plugins.leakcanary.RecordLeakService
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin
import com.facebook.soloader.SoLoader
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 org.mozilla.fenix.ext.getPreferenceKey
import java.io.File
class DebugFenixApplication : FenixApplication() {
override fun onCreate() {
SoLoader.init(this, false)
if (FlipperUtils.shouldEnableFlipper(this)) {
AndroidFlipperClient.getInstance(this).apply {
addPlugin(InspectorFlipperPlugin(this@DebugFenixApplication,
DescriptorMapping.withDefaults()))
addPlugin(LeakCanaryFlipperPlugin())
addPlugin(SharedPreferencesFlipperPlugin(this@DebugFenixApplication,
this@DebugFenixApplication.packageName + "_preferences"))
start()
}
}
super.onCreate()
}
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)
.listenerServiceClass(RecordLeakService::class.java)
.heapDumper(heapDumper)
.buildAndInstall()
}
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
}
}