diff --git a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesAboutFragment.kt b/app/src/main/java/de/mm20/launcher2/fragment/PreferencesAboutFragment.kt index 280be8db..67726743 100644 --- a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesAboutFragment.kt +++ b/app/src/main/java/de/mm20/launcher2/fragment/PreferencesAboutFragment.kt @@ -5,6 +5,7 @@ import android.content.pm.PackageManager import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat @@ -14,6 +15,7 @@ import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.debug.DebugInformationDumper import de.mm20.launcher2.licenses.AppLicense import de.mm20.launcher2.licenses.OpenSourceLicenses +import kotlinx.coroutines.launch class PreferencesAboutFragment : PreferenceFragmentCompat() { @@ -77,8 +79,10 @@ class PreferencesAboutFragment : PreferenceFragmentCompat() { R.anim.preference_fragment_parent_enter, R.anim.preference_fragment_child_exit ) - .replace(android.R.id.content, - PreferencesLicenseFragment(l)) + .replace( + android.R.id.content, + PreferencesLicenseFragment(l) + ) .addToBackStack(null) .commit() true @@ -90,29 +94,35 @@ class PreferencesAboutFragment : PreferenceFragmentCompat() { true } findPreference("export_debug")?.setOnPreferenceClickListener { - Toast.makeText( - activity, - getString( - R.string.debug_export_information_file, - DebugInformationDumper().dump(requireContext()) - ), - Toast.LENGTH_SHORT - ).show() + lifecycleScope.launch { + val path = DebugInformationDumper().dump(requireContext()) + Toast.makeText( + activity, + getString( + R.string.debug_export_information_file, + path + ), + Toast.LENGTH_SHORT + ).show() + } true } findPreference("export_databases")?.setOnPreferenceClickListener { MaterialDialog(requireContext()).show { message(res = R.string.debug_export_databases_warning) positiveButton(res = R.string.dialog_continue, click = { - Toast.makeText( - activity, - getString( - R.string.debug_export_information_file, - DebugInformationDumper().exportDatabases(requireContext()) - ), - Toast.LENGTH_SHORT - ).show() - it.dismiss() + lifecycleScope.launch { + val path = DebugInformationDumper().exportDatabases(requireContext()) + Toast.makeText( + activity, + getString( + R.string.debug_export_information_file, + path + ), + Toast.LENGTH_SHORT + ).show() + it.dismiss() + } }) negativeButton(res = android.R.string.cancel, click = { it.cancel() @@ -130,8 +140,10 @@ class PreferencesAboutFragment : PreferenceFragmentCompat() { R.anim.preference_fragment_parent_enter, R.anim.preference_fragment_child_exit ) - .replace(android.R.id.content, - PreferencesLicenseFragment(AppLicense.get(requireContext()))) + .replace( + android.R.id.content, + PreferencesLicenseFragment(AppLicense.get(requireContext())) + ) .addToBackStack(null) .commit() true diff --git a/base/src/main/java/de/mm20/launcher2/debug/DebugInformationDumper.kt b/base/src/main/java/de/mm20/launcher2/debug/DebugInformationDumper.kt index 3666a726..ea0a8394 100644 --- a/base/src/main/java/de/mm20/launcher2/debug/DebugInformationDumper.kt +++ b/base/src/main/java/de/mm20/launcher2/debug/DebugInformationDumper.kt @@ -3,8 +3,6 @@ package de.mm20.launcher2.debug import android.content.Context import android.os.Build import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File import java.text.SimpleDateFormat @@ -12,32 +10,38 @@ import java.util.* class DebugInformationDumper { - fun dump(context: Context): String { + suspend fun dump(context: Context): String { val df = SimpleDateFormat("yyyy-MM-dd-HHmmss") - val file = File(context.getExternalFilesDir(null), "kvaesitso-log-${df.format(Date(System.currentTimeMillis()))}") - val fos = file.outputStream().writer() - fos.write("Device: ${Build.DEVICE}\n") - fos.write("SDK version: ${Build.VERSION.SDK_INT}\n") - fos.write("====================================\n") - Thread { - val input = Runtime.getRuntime().exec("/system/bin/sh -c logcat").inputStream.bufferedReader() + val file = File( + context.getExternalFilesDir(null), + "kvaesitso-log-${df.format(Date(System.currentTimeMillis()))}" + ) + withContext(Dispatchers.IO) { + val timeout = System.currentTimeMillis() + 5000 + val fos = file.outputStream().writer() + fos.write("Device: ${Build.DEVICE}\n") + fos.write("SDK version: ${Build.VERSION.SDK_INT}\n") + fos.write("====================================\n") + val input = + Runtime.getRuntime().exec("/system/bin/sh -c logcat").inputStream.bufferedReader() var line = input.readLine() - while (line != null) { + while (line != null && System.currentTimeMillis() < timeout) { line = input.readLine() fos.write("$line\n") } fos.close() - }.start() + } return file.absolutePath } - fun exportDatabases(context: Context): String { + suspend fun exportDatabases(context: Context): String { val df = SimpleDateFormat("yyyy-MM-dd-HHmmss") - val exportFile = File(context.getExternalFilesDir(null), "room-${df.format(Date(System.currentTimeMillis()))}.db") - GlobalScope.launch { - withContext(Dispatchers.IO) { - context.getDatabasePath("room").copyTo(exportFile) - } + val exportFile = File( + context.getExternalFilesDir(null), + "room-${df.format(Date(System.currentTimeMillis()))}.db" + ) + withContext(Dispatchers.IO) { + context.getDatabasePath("room").copyTo(exportFile) } return exportFile.absolutePath }