mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Add method for users to save error logs to a file
This commit is contained in:
		@@ -62,6 +62,12 @@ object Notifications {
 | 
			
		||||
    const val ID_BACKUP_COMPLETE = -502
 | 
			
		||||
    const val ID_RESTORE_COMPLETE = -504
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Notification channel used for crash log file sharing.
 | 
			
		||||
     */
 | 
			
		||||
    const val CHANNEL_CRASH_LOGS = "crash_logs_channel"
 | 
			
		||||
    const val ID_CRASH_LOGS = -601
 | 
			
		||||
 | 
			
		||||
    private val deprecatedChannels = listOf(
 | 
			
		||||
        "downloader_channel",
 | 
			
		||||
        "backup_restore_complete_channel"
 | 
			
		||||
@@ -143,7 +149,12 @@ object Notifications {
 | 
			
		||||
                group = GROUP_BACKUP_RESTORE
 | 
			
		||||
                setShowBadge(false)
 | 
			
		||||
                setSound(null, null)
 | 
			
		||||
            }
 | 
			
		||||
            },
 | 
			
		||||
            NotificationChannel(
 | 
			
		||||
                CHANNEL_CRASH_LOGS,
 | 
			
		||||
                context.getString(R.string.channel_crash_logs),
 | 
			
		||||
                NotificationManager.IMPORTANCE_HIGH
 | 
			
		||||
            )
 | 
			
		||||
        ).forEach(context.notificationManager::createNotificationChannel)
 | 
			
		||||
 | 
			
		||||
        // Delete old notification channels
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ import eu.kanade.tachiyomi.data.library.LibraryUpdateService
 | 
			
		||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateService.Target
 | 
			
		||||
import eu.kanade.tachiyomi.network.NetworkHelper
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
 | 
			
		||||
import eu.kanade.tachiyomi.util.CrashLogUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.onClick
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.preference
 | 
			
		||||
@@ -49,6 +50,16 @@ class SettingsAdvancedController : SettingsController() {
 | 
			
		||||
            defaultValue = true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        preference {
 | 
			
		||||
            key = "dump_crash_logs"
 | 
			
		||||
            titleRes = R.string.pref_dump_crash_logs
 | 
			
		||||
            summaryRes = R.string.pref_dump_crash_logs_summary
 | 
			
		||||
 | 
			
		||||
            onClick {
 | 
			
		||||
                CrashLogUtil(context).dumpLogs()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
 | 
			
		||||
            preference {
 | 
			
		||||
                key = "pref_disable_battery_optimization"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										54
									
								
								app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
package eu.kanade.tachiyomi.util
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.Notifications
 | 
			
		||||
import eu.kanade.tachiyomi.util.storage.getUriCompat
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.notificationBuilder
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.notificationManager
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.toast
 | 
			
		||||
import java.io.File
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
 | 
			
		||||
class CrashLogUtil(private val context: Context) {
 | 
			
		||||
 | 
			
		||||
    private val notificationBuilder = context.notificationBuilder(Notifications.CHANNEL_CRASH_LOGS) {
 | 
			
		||||
        setSmallIcon(R.drawable.ic_tachi)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun dumpLogs() {
 | 
			
		||||
        try {
 | 
			
		||||
            val file = File(context.externalCacheDir, "tachiyomi_crash_logs.txt")
 | 
			
		||||
            if (file.exists()) {
 | 
			
		||||
                file.delete()
 | 
			
		||||
            }
 | 
			
		||||
            file.createNewFile()
 | 
			
		||||
            Runtime.getRuntime().exec("logcat *:E -d -f ${file.absolutePath}")
 | 
			
		||||
 | 
			
		||||
            showNotification(file.getUriCompat(context))
 | 
			
		||||
        } catch (e: IOException) {
 | 
			
		||||
            context.toast("Failed to get logs")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun showNotification(uri: Uri) {
 | 
			
		||||
        context.notificationManager.cancel(Notifications.ID_CRASH_LOGS)
 | 
			
		||||
 | 
			
		||||
        with(notificationBuilder) {
 | 
			
		||||
            setContentTitle(context.getString(R.string.crash_log_saved))
 | 
			
		||||
 | 
			
		||||
            // Clear old actions if they exist
 | 
			
		||||
            clearActions()
 | 
			
		||||
 | 
			
		||||
            addAction(
 | 
			
		||||
                R.drawable.ic_folder_24dp,
 | 
			
		||||
                context.getString(R.string.action_open_log),
 | 
			
		||||
                NotificationReceiver.openErrorLogPendingActivity(context, uri)
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            context.notificationManager.notify(Notifications.ID_CRASH_LOGS, build())
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user