Merge pull request #6792 from vector-im/feature/mna/enable-leakcanary
Add a developer setting to enable LeakCanary at runtime
This commit is contained in:
commit
fa8f72c909
|
@ -0,0 +1 @@
|
||||||
|
Add a developer setting to enable LeakCanary at runtime
|
|
@ -107,7 +107,9 @@ ext.groups = [
|
||||||
'com.pinterest.ktlint',
|
'com.pinterest.ktlint',
|
||||||
'com.posthog.android',
|
'com.posthog.android',
|
||||||
'com.squareup',
|
'com.squareup',
|
||||||
|
'com.squareup.curtains',
|
||||||
'com.squareup.duktape',
|
'com.squareup.duktape',
|
||||||
|
'com.squareup.leakcanary',
|
||||||
'com.squareup.moshi',
|
'com.squareup.moshi',
|
||||||
'com.squareup.okhttp3',
|
'com.squareup.okhttp3',
|
||||||
'com.squareup.okio',
|
'com.squareup.okio',
|
||||||
|
|
|
@ -576,7 +576,7 @@ dependencies {
|
||||||
debugImplementation "com.kgurgul.flipper:flipper-realm-android:2.2.0"
|
debugImplementation "com.kgurgul.flipper:flipper-realm-android:2.2.0"
|
||||||
|
|
||||||
// Activate when you want to check for leaks, from time to time.
|
// Activate when you want to check for leaks, from time to time.
|
||||||
//debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.3'
|
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
|
||||||
|
|
||||||
androidTestImplementation libs.androidx.testCore
|
androidTestImplementation libs.androidx.testCore
|
||||||
androidTestImplementation libs.androidx.testRunner
|
androidTestImplementation libs.androidx.testRunner
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
<activity android:name=".features.debug.sas.DebugSasEmojiActivity" />
|
<activity android:name=".features.debug.sas.DebugSasEmojiActivity" />
|
||||||
<activity android:name=".features.debug.features.DebugFeaturesSettingsActivity" />
|
<activity android:name=".features.debug.features.DebugFeaturesSettingsActivity" />
|
||||||
<activity android:name=".features.debug.DebugMenuActivity" />
|
<activity android:name=".features.debug.DebugMenuActivity" />
|
||||||
|
<activity android:name=".features.debug.leak.DebugMemoryLeaksActivity" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="com.facebook.flipper.android.diagnostics.FlipperDiagnosticActivity"
|
android:name="com.facebook.flipper.android.diagnostics.FlipperDiagnosticActivity"
|
||||||
|
|
|
@ -37,6 +37,7 @@ import im.vector.app.core.utils.toast
|
||||||
import im.vector.app.databinding.ActivityDebugMenuBinding
|
import im.vector.app.databinding.ActivityDebugMenuBinding
|
||||||
import im.vector.app.features.debug.analytics.DebugAnalyticsActivity
|
import im.vector.app.features.debug.analytics.DebugAnalyticsActivity
|
||||||
import im.vector.app.features.debug.features.DebugFeaturesSettingsActivity
|
import im.vector.app.features.debug.features.DebugFeaturesSettingsActivity
|
||||||
|
import im.vector.app.features.debug.leak.DebugMemoryLeaksActivity
|
||||||
import im.vector.app.features.debug.sas.DebugSasEmojiActivity
|
import im.vector.app.features.debug.sas.DebugSasEmojiActivity
|
||||||
import im.vector.app.features.debug.settings.DebugPrivateSettingsActivity
|
import im.vector.app.features.debug.settings.DebugPrivateSettingsActivity
|
||||||
import im.vector.app.features.qrcode.QrCodeScannerActivity
|
import im.vector.app.features.qrcode.QrCodeScannerActivity
|
||||||
|
@ -86,6 +87,7 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
|
||||||
views.debugAnalytics.setOnClickListener {
|
views.debugAnalytics.setOnClickListener {
|
||||||
startActivity(Intent(this, DebugAnalyticsActivity::class.java))
|
startActivity(Intent(this, DebugAnalyticsActivity::class.java))
|
||||||
}
|
}
|
||||||
|
views.debugMemoryLeaks.setOnClickListener { openMemoryLeaksSettings() }
|
||||||
views.debugTestTextViewLink.setOnClickListener { testTextViewLink() }
|
views.debugTestTextViewLink.setOnClickListener { testTextViewLink() }
|
||||||
views.debugOpenButtonStylesLight.setOnClickListener {
|
views.debugOpenButtonStylesLight.setOnClickListener {
|
||||||
startActivity(Intent(this, DebugVectorButtonStylesLightActivity::class.java))
|
startActivity(Intent(this, DebugVectorButtonStylesLightActivity::class.java))
|
||||||
|
@ -130,6 +132,10 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
|
||||||
startActivity(Intent(this, DebugPrivateSettingsActivity::class.java))
|
startActivity(Intent(this, DebugPrivateSettingsActivity::class.java))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun openMemoryLeaksSettings() {
|
||||||
|
startActivity(Intent(this, DebugMemoryLeaksActivity::class.java))
|
||||||
|
}
|
||||||
|
|
||||||
private fun renderQrCode(text: String) {
|
private fun renderQrCode(text: String) {
|
||||||
views.debugQrCode.setData(text)
|
views.debugQrCode.setData(text)
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,10 @@ import dagger.hilt.components.SingletonComponent
|
||||||
import im.vector.app.core.debug.DebugNavigator
|
import im.vector.app.core.debug.DebugNavigator
|
||||||
import im.vector.app.core.debug.DebugReceiver
|
import im.vector.app.core.debug.DebugReceiver
|
||||||
import im.vector.app.core.debug.FlipperProxy
|
import im.vector.app.core.debug.FlipperProxy
|
||||||
|
import im.vector.app.core.debug.LeakDetector
|
||||||
import im.vector.app.features.debug.DebugMenuActivity
|
import im.vector.app.features.debug.DebugMenuActivity
|
||||||
import im.vector.app.flipper.VectorFlipperProxy
|
import im.vector.app.flipper.VectorFlipperProxy
|
||||||
|
import im.vector.app.leakcanary.LeakCanaryLeakDetector
|
||||||
import im.vector.app.receivers.VectorDebugReceiver
|
import im.vector.app.receivers.VectorDebugReceiver
|
||||||
|
|
||||||
@InstallIn(SingletonComponent::class)
|
@InstallIn(SingletonComponent::class)
|
||||||
|
@ -49,4 +51,7 @@ abstract class DebugModule {
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
abstract fun bindsFlipperProxy(flipperProxy: VectorFlipperProxy): FlipperProxy
|
abstract fun bindsFlipperProxy(flipperProxy: VectorFlipperProxy): FlipperProxy
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
abstract fun bindsLeakDetector(leakDetector: LeakCanaryLeakDetector): LeakDetector
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
||||||
import im.vector.app.core.di.MavericksViewModelComponent
|
import im.vector.app.core.di.MavericksViewModelComponent
|
||||||
import im.vector.app.core.di.MavericksViewModelKey
|
import im.vector.app.core.di.MavericksViewModelKey
|
||||||
import im.vector.app.features.debug.analytics.DebugAnalyticsViewModel
|
import im.vector.app.features.debug.analytics.DebugAnalyticsViewModel
|
||||||
|
import im.vector.app.features.debug.leak.DebugMemoryLeaksViewModel
|
||||||
import im.vector.app.features.debug.settings.DebugPrivateSettingsViewModel
|
import im.vector.app.features.debug.settings.DebugPrivateSettingsViewModel
|
||||||
|
|
||||||
@InstallIn(MavericksViewModelComponent::class)
|
@InstallIn(MavericksViewModelComponent::class)
|
||||||
|
@ -39,4 +40,9 @@ interface MavericksViewModelDebugModule {
|
||||||
@IntoMap
|
@IntoMap
|
||||||
@MavericksViewModelKey(DebugPrivateSettingsViewModel::class)
|
@MavericksViewModelKey(DebugPrivateSettingsViewModel::class)
|
||||||
fun debugPrivateSettingsViewModelFactory(factory: DebugPrivateSettingsViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
|
fun debugPrivateSettingsViewModelFactory(factory: DebugPrivateSettingsViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
@IntoMap
|
||||||
|
@MavericksViewModelKey(DebugMemoryLeaksViewModel::class)
|
||||||
|
fun debugMemoryLeaksViewModelFactory(factory: DebugMemoryLeaksViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.app.features.debug.leak
|
||||||
|
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import im.vector.app.core.extensions.addFragment
|
||||||
|
import im.vector.app.core.platform.VectorBaseActivity
|
||||||
|
import im.vector.app.databinding.ActivitySimpleBinding
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class DebugMemoryLeaksActivity : VectorBaseActivity<ActivitySimpleBinding>() {
|
||||||
|
|
||||||
|
override fun getBinding() = ActivitySimpleBinding.inflate(layoutInflater)
|
||||||
|
|
||||||
|
override fun initUiAndData() {
|
||||||
|
if (isFirstCreation()) {
|
||||||
|
addFragment(
|
||||||
|
views.simpleFragmentContainer,
|
||||||
|
DebugMemoryLeaksFragment::class.java
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.app.features.debug.leak
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import com.airbnb.mvrx.fragmentViewModel
|
||||||
|
import com.airbnb.mvrx.withState
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import im.vector.app.core.epoxy.onClick
|
||||||
|
import im.vector.app.core.platform.VectorBaseFragment
|
||||||
|
import im.vector.app.databinding.FragmentDebugMemoryLeaksBinding
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class DebugMemoryLeaksFragment : VectorBaseFragment<FragmentDebugMemoryLeaksBinding>() {
|
||||||
|
|
||||||
|
private val viewModel: DebugMemoryLeaksViewModel by fragmentViewModel()
|
||||||
|
|
||||||
|
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentDebugMemoryLeaksBinding {
|
||||||
|
return FragmentDebugMemoryLeaksBinding.inflate(inflater, container, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
setViewListeners()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setViewListeners() {
|
||||||
|
views.enableMemoryLeakAnalysis.onClick {
|
||||||
|
viewModel.handle(DebugMemoryLeaksViewActions.EnableMemoryLeaksAnalysis(views.enableMemoryLeakAnalysis.isChecked))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun invalidate() = withState(viewModel) { viewState ->
|
||||||
|
views.enableMemoryLeakAnalysis.isChecked = viewState.isMemoryLeaksAnalysisEnabled
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.app.features.debug.leak
|
||||||
|
|
||||||
|
import im.vector.app.core.platform.VectorViewModelAction
|
||||||
|
|
||||||
|
sealed interface DebugMemoryLeaksViewActions : VectorViewModelAction {
|
||||||
|
data class EnableMemoryLeaksAnalysis(val isEnabled: Boolean) : DebugMemoryLeaksViewActions
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.app.features.debug.leak
|
||||||
|
|
||||||
|
import com.airbnb.mvrx.MavericksViewModelFactory
|
||||||
|
import dagger.assisted.Assisted
|
||||||
|
import dagger.assisted.AssistedFactory
|
||||||
|
import dagger.assisted.AssistedInject
|
||||||
|
import im.vector.app.core.debug.LeakDetector
|
||||||
|
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
||||||
|
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
||||||
|
import im.vector.app.core.platform.EmptyViewEvents
|
||||||
|
import im.vector.app.core.platform.VectorViewModel
|
||||||
|
import im.vector.app.features.settings.VectorPreferences
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
class DebugMemoryLeaksViewModel @AssistedInject constructor(
|
||||||
|
@Assisted initialState: DebugMemoryLeaksViewState,
|
||||||
|
private val vectorPreferences: VectorPreferences,
|
||||||
|
private val leakDetector: LeakDetector,
|
||||||
|
) : VectorViewModel<DebugMemoryLeaksViewState, DebugMemoryLeaksViewActions, EmptyViewEvents>(initialState) {
|
||||||
|
|
||||||
|
@AssistedFactory
|
||||||
|
interface Factory : MavericksAssistedViewModelFactory<DebugMemoryLeaksViewModel, DebugMemoryLeaksViewState> {
|
||||||
|
override fun create(initialState: DebugMemoryLeaksViewState): DebugMemoryLeaksViewModel
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object : MavericksViewModelFactory<DebugMemoryLeaksViewModel, DebugMemoryLeaksViewState> by hiltMavericksViewModelFactory()
|
||||||
|
|
||||||
|
init {
|
||||||
|
viewModelScope.launch {
|
||||||
|
refreshStateFromPreferences()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun handle(action: DebugMemoryLeaksViewActions) {
|
||||||
|
when (action) {
|
||||||
|
is DebugMemoryLeaksViewActions.EnableMemoryLeaksAnalysis -> handleEnableMemoryLeaksAnalysis(action)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleEnableMemoryLeaksAnalysis(action: DebugMemoryLeaksViewActions.EnableMemoryLeaksAnalysis) {
|
||||||
|
viewModelScope.launch {
|
||||||
|
vectorPreferences.enableMemoryLeakAnalysis(action.isEnabled)
|
||||||
|
leakDetector.enable(action.isEnabled)
|
||||||
|
refreshStateFromPreferences()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun refreshStateFromPreferences() {
|
||||||
|
setState { copy(isMemoryLeaksAnalysisEnabled = vectorPreferences.isMemoryLeakAnalysisEnabled()) }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.app.features.debug.leak
|
||||||
|
|
||||||
|
import com.airbnb.mvrx.MavericksState
|
||||||
|
|
||||||
|
data class DebugMemoryLeaksViewState(
|
||||||
|
val isMemoryLeaksAnalysisEnabled: Boolean = false
|
||||||
|
) : MavericksState
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.app.leakcanary
|
||||||
|
|
||||||
|
import im.vector.app.core.debug.LeakDetector
|
||||||
|
import leakcanary.LeakCanary
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class LeakCanaryLeakDetector @Inject constructor() : LeakDetector {
|
||||||
|
override fun enable(enable: Boolean) {
|
||||||
|
LeakCanary.config = LeakCanary.config.copy(dumpHeap = enable)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/coordinatorLayout"
|
android:id="@+id/coordinatorLayout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -8,8 +9,11 @@
|
||||||
tools:ignore="HardcodedText">
|
tools:ignore="HardcodedText">
|
||||||
|
|
||||||
<ScrollView
|
<ScrollView
|
||||||
|
android:id="@+id/scrollView2"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_anchor="@+id/scrollView2"
|
||||||
|
app:layout_anchorGravity="center">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -38,6 +42,12 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Analytics" />
|
android:text="Analytics" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/debug_memory_leaks"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Memory leaks" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/debug_test_text_view_link"
|
android:id="@+id/debug_test_text_view_link"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/coordinatorLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".features.debug.settings.DebugPrivateSettingsActivity"
|
||||||
|
tools:ignore="HardcodedText">
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:divider="@drawable/linear_divider"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="@dimen/layout_horizontal_margin"
|
||||||
|
android:showDividers="middle">
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/enableMemoryLeakAnalysis"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Enable memory leak analysis" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
@ -46,6 +46,7 @@ import com.vanniktech.emoji.google.GoogleEmojiProvider
|
||||||
import dagger.hilt.android.HiltAndroidApp
|
import dagger.hilt.android.HiltAndroidApp
|
||||||
import im.vector.app.config.Config
|
import im.vector.app.config.Config
|
||||||
import im.vector.app.core.debug.FlipperProxy
|
import im.vector.app.core.debug.FlipperProxy
|
||||||
|
import im.vector.app.core.debug.LeakDetector
|
||||||
import im.vector.app.core.di.ActiveSessionHolder
|
import im.vector.app.core.di.ActiveSessionHolder
|
||||||
import im.vector.app.core.pushers.FcmHelper
|
import im.vector.app.core.pushers.FcmHelper
|
||||||
import im.vector.app.core.resources.BuildMeta
|
import im.vector.app.core.resources.BuildMeta
|
||||||
|
@ -106,6 +107,7 @@ class VectorApplication :
|
||||||
@Inject lateinit var matrix: Matrix
|
@Inject lateinit var matrix: Matrix
|
||||||
@Inject lateinit var fcmHelper: FcmHelper
|
@Inject lateinit var fcmHelper: FcmHelper
|
||||||
@Inject lateinit var buildMeta: BuildMeta
|
@Inject lateinit var buildMeta: BuildMeta
|
||||||
|
@Inject lateinit var leakDetector: LeakDetector
|
||||||
|
|
||||||
// font thread handler
|
// font thread handler
|
||||||
private var fontThreadHandler: Handler? = null
|
private var fontThreadHandler: Handler? = null
|
||||||
|
@ -201,6 +203,8 @@ class VectorApplication :
|
||||||
|
|
||||||
// Initialize Mapbox before inflating mapViews
|
// Initialize Mapbox before inflating mapViews
|
||||||
Mapbox.getInstance(this)
|
Mapbox.getInstance(this)
|
||||||
|
|
||||||
|
initMemoryLeakAnalysis()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun configureEpoxy() {
|
private fun configureEpoxy() {
|
||||||
|
@ -266,4 +270,8 @@ class VectorApplication :
|
||||||
handlerThread.start()
|
handlerThread.start()
|
||||||
return Handler(handlerThread.looper)
|
return Handler(handlerThread.looper)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun initMemoryLeakAnalysis() {
|
||||||
|
leakDetector.enable(vectorPreferences.isMemoryLeakAnalysisEnabled())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.app.core.debug
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used for memory leak analysis control.
|
||||||
|
*/
|
||||||
|
interface LeakDetector {
|
||||||
|
fun enable(enable: Boolean)
|
||||||
|
}
|
|
@ -169,6 +169,7 @@ class VectorPreferences @Inject constructor(
|
||||||
private const val SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY = "SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY"
|
private const val SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY = "SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY"
|
||||||
private const val SETTINGS_DEVELOPER_MODE_FAIL_FAST_PREFERENCE_KEY = "SETTINGS_DEVELOPER_MODE_FAIL_FAST_PREFERENCE_KEY"
|
private const val SETTINGS_DEVELOPER_MODE_FAIL_FAST_PREFERENCE_KEY = "SETTINGS_DEVELOPER_MODE_FAIL_FAST_PREFERENCE_KEY"
|
||||||
private const val SETTINGS_DEVELOPER_MODE_SHOW_INFO_ON_SCREEN_KEY = "SETTINGS_DEVELOPER_MODE_SHOW_INFO_ON_SCREEN_KEY"
|
private const val SETTINGS_DEVELOPER_MODE_SHOW_INFO_ON_SCREEN_KEY = "SETTINGS_DEVELOPER_MODE_SHOW_INFO_ON_SCREEN_KEY"
|
||||||
|
private const val SETTINGS_ENABLE_MEMORY_LEAK_ANALYSIS_KEY = "SETTINGS_ENABLE_MEMORY_LEAK_ANALYSIS_KEY"
|
||||||
|
|
||||||
const val SETTINGS_LABS_MSC3061_SHARE_KEYS_HISTORY = "SETTINGS_LABS_MSC3061_SHARE_KEYS_HISTORY"
|
const val SETTINGS_LABS_MSC3061_SHARE_KEYS_HISTORY = "SETTINGS_LABS_MSC3061_SHARE_KEYS_HISTORY"
|
||||||
|
|
||||||
|
@ -269,6 +270,7 @@ class VectorPreferences @Inject constructor(
|
||||||
SETTINGS_LABS_SHOW_HIDDEN_EVENTS_PREFERENCE_KEY,
|
SETTINGS_LABS_SHOW_HIDDEN_EVENTS_PREFERENCE_KEY,
|
||||||
SETTINGS_LABS_ALLOW_EXTENDED_LOGS,
|
SETTINGS_LABS_ALLOW_EXTENDED_LOGS,
|
||||||
SETTINGS_DEVELOPER_MODE_FAIL_FAST_PREFERENCE_KEY,
|
SETTINGS_DEVELOPER_MODE_FAIL_FAST_PREFERENCE_KEY,
|
||||||
|
SETTINGS_ENABLE_MEMORY_LEAK_ANALYSIS_KEY,
|
||||||
|
|
||||||
SETTINGS_USE_RAGE_SHAKE_KEY,
|
SETTINGS_USE_RAGE_SHAKE_KEY,
|
||||||
SETTINGS_SECURITY_USE_FLAG_SECURE,
|
SETTINGS_SECURITY_USE_FLAG_SECURE,
|
||||||
|
@ -369,6 +371,16 @@ class VectorPreferences @Inject constructor(
|
||||||
return buildMeta.isDebug || (developerMode() && defaultPrefs.getBoolean(SETTINGS_DEVELOPER_MODE_FAIL_FAST_PREFERENCE_KEY, false))
|
return buildMeta.isDebug || (developerMode() && defaultPrefs.getBoolean(SETTINGS_DEVELOPER_MODE_FAIL_FAST_PREFERENCE_KEY, false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun enableMemoryLeakAnalysis(isEnabled: Boolean) {
|
||||||
|
defaultPrefs.edit(commit = true) {
|
||||||
|
putBoolean(SETTINGS_ENABLE_MEMORY_LEAK_ANALYSIS_KEY, isEnabled)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isMemoryLeakAnalysisEnabled(): Boolean {
|
||||||
|
return buildMeta.isDebug && defaultPrefs.getBoolean(SETTINGS_ENABLE_MEMORY_LEAK_ANALYSIS_KEY, false)
|
||||||
|
}
|
||||||
|
|
||||||
fun didAskUserToEnableSessionPush(): Boolean {
|
fun didAskUserToEnableSessionPush(): Boolean {
|
||||||
return defaultPrefs.getBoolean(DID_ASK_TO_ENABLE_SESSION_PUSH, false)
|
return defaultPrefs.getBoolean(DID_ASK_TO_ENABLE_SESSION_PUSH, false)
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,8 +25,9 @@ import im.vector.app.core.preference.VectorPreferenceCategory
|
||||||
import im.vector.app.core.preference.VectorSwitchPreference
|
import im.vector.app.core.preference.VectorSwitchPreference
|
||||||
import im.vector.app.features.analytics.plan.MobileScreen
|
import im.vector.app.features.analytics.plan.MobileScreen
|
||||||
import im.vector.app.features.rageshake.RageShake
|
import im.vector.app.features.rageshake.RageShake
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
class VectorSettingsAdvancedSettingsFragment : VectorSettingsBaseFragment() {
|
class VectorSettingsAdvancedSettingsFragment @Inject constructor() : VectorSettingsBaseFragment() {
|
||||||
|
|
||||||
override var titleRes = R.string.settings_advanced_settings
|
override var titleRes = R.string.settings_advanced_settings
|
||||||
override val preferenceXmlRes = R.xml.vector_settings_advanced_settings
|
override val preferenceXmlRes = R.xml.vector_settings_advanced_settings
|
||||||
|
|
|
@ -95,4 +95,4 @@
|
||||||
|
|
||||||
</im.vector.app.core.preference.VectorPreferenceCategory>
|
</im.vector.app.core.preference.VectorPreferenceCategory>
|
||||||
|
|
||||||
</androidx.preference.PreferenceScreen>
|
</androidx.preference.PreferenceScreen>
|
||||||
|
|
|
@ -24,6 +24,7 @@ import dagger.hilt.components.SingletonComponent
|
||||||
import im.vector.app.core.debug.DebugNavigator
|
import im.vector.app.core.debug.DebugNavigator
|
||||||
import im.vector.app.core.debug.DebugReceiver
|
import im.vector.app.core.debug.DebugReceiver
|
||||||
import im.vector.app.core.debug.FlipperProxy
|
import im.vector.app.core.debug.FlipperProxy
|
||||||
|
import im.vector.app.core.debug.LeakDetector
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
import org.matrix.android.sdk.api.Matrix
|
import org.matrix.android.sdk.api.Matrix
|
||||||
|
|
||||||
|
@ -57,4 +58,11 @@ object DebugModule {
|
||||||
|
|
||||||
override fun networkInterceptor(): Interceptor? = null
|
override fun networkInterceptor(): Interceptor? = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
fun providesLeakDetector() = object : LeakDetector {
|
||||||
|
override fun enable(enable: Boolean) {
|
||||||
|
// no op
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue