Add LeakCanary to nighly builds

This commit is contained in:
Koitharu
2025-07-17 20:42:12 +03:00
parent 8142a6811b
commit c987fc234b
10 changed files with 108 additions and 2 deletions

View File

@@ -52,6 +52,7 @@ import java.net.SocketException
import java.net.SocketTimeoutException
import java.net.UnknownHostException
import java.util.Locale
import java.util.zip.ZipException
private const val MSG_NO_SPACE_LEFT = "No space left on device"
private const val MSG_CONNECTION_RESET = "Connection reset"
@@ -92,6 +93,7 @@ private fun Throwable.getDisplayMessageOrNull(resources: Resources): String? = w
}
}
is ZipException -> resources.getString(R.string.error_corrupted_zip, this.message.orEmpty())
is SQLiteFullException -> resources.getString(R.string.error_no_space_left)
is UnsupportedFileException -> resources.getString(R.string.text_file_not_supported)
is BadBackupFormatException -> resources.getString(R.string.unsupported_backup_message)

View File

@@ -859,4 +859,5 @@
<string name="main_screen">Main screen</string>
<string name="main_screen_fab">Show floating Continue button</string>
<string name="main_screen_fab_summary">Allows to continue reading in a one click. This button will not appear in incognito mode or when the history is empty</string>
<string name="error_corrupted_zip">Corrupted ZIP archive (%s)</string>
</resources>

View File

@@ -1,5 +1,34 @@
package org.koitharu.kotatsu
import android.content.Context
import android.content.SharedPreferences
import androidx.preference.PreferenceManager
import leakcanary.LeakCanary
import org.koitharu.kotatsu.core.BaseApp
class KotatsuApp : BaseApp()
class KotatsuApp : BaseApp(), SharedPreferences.OnSharedPreferenceChangeListener {
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
configureLeakCanary(isEnabled = prefs.getBoolean(KEY_LEAK_CANARY, false))
prefs.registerOnSharedPreferenceChangeListener(this)
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
if (key == KEY_LEAK_CANARY) {
configureLeakCanary(sharedPreferences.getBoolean(KEY_LEAK_CANARY, false))
}
}
private fun configureLeakCanary(isEnabled: Boolean) {
LeakCanary.config = LeakCanary.config.copy(
dumpHeap = isEnabled,
)
}
private companion object {
const val KEY_LEAK_CANARY = "debug.leak_canary"
}
}

View File

@@ -0,0 +1,32 @@
package org.koitharu.kotatsu.settings
import android.os.Bundle
import androidx.preference.Preference
import leakcanary.LeakCanary
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.ui.BasePreferenceFragment
import org.koitharu.kotatsu.settings.utils.SplitSwitchPreference
class DebugSettingsFragment : BasePreferenceFragment(R.string.debug), Preference.OnPreferenceClickListener {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.pref_debug)
findPreference<SplitSwitchPreference>(KEY_LEAK_CANARY)?.let { pref ->
pref.onContainerClickListener = this
}
}
override fun onPreferenceClick(preference: Preference): Boolean = when (preference.key) {
KEY_LEAK_CANARY -> {
startActivity(LeakCanary.newLeakDisplayActivityIntent())
true
}
else -> super.onPreferenceTreeClick(preference)
}
private companion object {
const val KEY_LEAK_CANARY = "debug.leak_canary"
}
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M20,8H17.19C16.74,7.2 16.12,6.5 15.37,6L17,4.41L15.59,3L13.42,5.17C12.96,5.06 12.5,5 12,5C11.5,5 11.05,5.06 10.59,5.17L8.41,3L7,4.41L8.62,6C7.87,6.5 7.26,7.21 6.81,8H4V10H6.09C6.03,10.33 6,10.66 6,11V12H4V14H6V15C6,15.34 6.03,15.67 6.09,16H4V18H6.81C8.47,20.87 12.14,21.84 15,20.18C15.91,19.66 16.67,18.9 17.19,18H20V16H17.91C17.97,15.67 18,15.34 18,15V14H20V12H18V11C18,10.66 17.97,10.33 17.91,10H20V8M16,15A4,4 0 0,1 12,19A4,4 0 0,1 8,15V11A4,4 0 0,1 12,7A4,4 0 0,1 16,11V15M14,10V12H10V10H14M10,14H14V16H10V14Z" />
</vector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<bool name="leak_canary_add_launcher_icon" tools:node="replace">false</bool>
<bool name="leak_canary_allow_in_non_debuggable_build">true</bool>
</resources>

View File

@@ -1,3 +1,4 @@
<resources>
<string name="app_name" translatable="false">Kotatsu Nightly</string>
<string name="may_affect_performance">May affect performance</string>
</resources>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<org.koitharu.kotatsu.settings.utils.SplitSwitchPreference
android:id="@+id/action_leakcanary"
android:defaultValue="false"
android:key="leak_canary"
android:title="LeakCanary"
android:summary="@string/may_affect_performance"
app:key="debug.leak_canary" />
</androidx.preference.PreferenceScreen>

View File

@@ -1,2 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen />
<androidx.preference.PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.DebugSettingsFragment"
android:icon="@drawable/ic_debug"
android:key="debug"
android:title="@string/debug" />
</androidx.preference.PreferenceScreen>