From d64a1767fc1f20410b41dea7e704ae687bcb3388 Mon Sep 17 00:00:00 2001 From: rushiiMachine <33725716+rushiiMachine@users.noreply.github.com> Date: Sun, 6 Apr 2025 22:50:03 -0700 Subject: [PATCH] feat(LogScreen): add log sharing --- app/src/main/AndroidManifest.xml | 10 +++ .../manager/manager/InstallLogManager.kt | 35 ++++++++++ .../manager/ui/screens/log/LogScreen.kt | 27 +++----- .../manager/ui/screens/log/LogScreenModel.kt | 68 ++++++++++++------- .../ui/screens/log/components/LogAppBar.kt | 33 +++++++++ app/src/main/res/drawable/ic_save.xml | 9 +++ app/src/main/res/drawable/ic_share.xml | 9 +++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/provider_paths.xml | 6 ++ 9 files changed, 155 insertions(+), 43 deletions(-) create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/screens/log/components/LogAppBar.kt create mode 100644 app/src/main/res/drawable/ic_save.xml create mode 100644 app/src/main/res/drawable/ic_share.xml create mode 100644 app/src/main/res/xml/provider_paths.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7aa6547..ca3884f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,6 +34,16 @@ android:name=".installers.pm.PMIntentReceiver" android:exported="false" /> + + + + Unit, + onExportLog: () -> Unit, + onShareLog: () -> Unit, ) { Scaffold( topBar = { - TopAppBar( - title = { Text(stringResource(R.string.log_title)) }, - navigationIcon = { BackButton() }, + LogAppBar( + onExportLog = onExportLog, + onShareLog = onShareLog, ) }, ) { paddingValues -> @@ -118,15 +120,6 @@ fun LogScreenContent( // ) // } // } - - item("SAVE_BUTTON") { - MainActionButton( - text = stringResource(R.string.log_action_export), - icon = painterResource(R.drawable.ic_download), - onClick = onSaveLog, - modifier = Modifier.padding(top = 10.dp), - ) - } } } } diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/log/LogScreenModel.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/log/LogScreenModel.kt index cbf9595..9f5b9bc 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/log/LogScreenModel.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/log/LogScreenModel.kt @@ -1,17 +1,17 @@ package com.aliucord.manager.ui.screens.log -import android.annotation.SuppressLint import android.app.Application +import android.content.Intent +import android.util.Log import androidx.compose.runtime.* +import androidx.core.content.FileProvider import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.screenModelScope +import com.aliucord.manager.BuildConfig import com.aliucord.manager.R import com.aliucord.manager.manager.InstallLogData import com.aliucord.manager.manager.InstallLogManager import com.aliucord.manager.util.* -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale class LogScreenModel( private val installId: String, @@ -34,33 +34,49 @@ class LogScreenModel( fun saveLog() = screenModelScope.launchBlock { val data = data ?: return@launchBlock - @SuppressLint("SimpleDateFormat") - val formattedDate = SimpleDateFormat("yyyy-MM-dd hh-mm-s a", Locale.ENGLISH) - .format(Date(data.installDate.toEpochMilliseconds())) + val formattedDate = data.getFormattedInstallDate() + val content = data.getLogFileContents() - val content = buildString { - appendLine("////////////////// Installation Info //////////////////") - append("Install ID: ") - appendLine(data.id) - append("Install time: ") - appendLine(formattedDate) - append("Result: ") - appendLine(if (data.isError) "Failure" else "Success") + application.saveFile("Aliucord Install $formattedDate.log", content) + } - append("\n\n") - appendLine("////////////////// Environment Info //////////////////") - appendLine(data.environmentInfo) + /** + * Writes the log to internal cache and launches a share intent of the log file. + */ + fun shareLog() = screenModelScope.launchBlock { + val data = data ?: return@launchBlock + val formattedDate = data.getFormattedInstallDate() + val formattedName = "Aliucord Install $formattedDate.log" + val content = data.getLogFileContents() - append("\n\n") - appendLine("////////////////// Error Stacktrace //////////////////") - appendLine(data.errorStacktrace ?: "None") + val file = application.cacheDir.resolve(formattedName) + val fileUri = FileProvider.getUriForFile( + /* context = */ application, + /* authority = */ "${BuildConfig.APPLICATION_ID}.provider", + /* file = */ file, + /* displayName = */ formattedName, + ) - append("\n\n") - appendLine("////////////////// Installation Log //////////////////") - appendLine(data.installationLog) + val intent = Intent(Intent.ACTION_SEND) + .setType("text/*") + .putExtra(Intent.EXTRA_STREAM, fileUri) + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + .let { + Intent.createChooser( + /* target = */ it, + /* title = */ application.getString(R.string.log_action_share), + ) + } + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + + try { + file.writeText(content) + file.deleteOnExit() + application.startActivity(intent) + } catch (t: Throwable) { + Log.w(BuildConfig.TAG, "Failed to share log", t) + application.showToast(R.string.status_failed) } - - application.saveFile("Aliucord Manager $formattedDate.log", content) } private fun loadLogData() = screenModelScope.launchBlock { diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/log/components/LogAppBar.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/log/components/LogAppBar.kt new file mode 100644 index 0000000..a9d92b8 --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/log/components/LogAppBar.kt @@ -0,0 +1,33 @@ +package com.aliucord.manager.ui.screens.log.components + +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import com.aliucord.manager.R +import com.aliucord.manager.ui.components.BackButton + +@Composable +fun LogAppBar( + onExportLog: () -> Unit, + onShareLog: () -> Unit, +) { + TopAppBar( + title = { Text(stringResource(R.string.log_title)) }, + navigationIcon = { BackButton() }, + actions = { + IconButton(onClick = onExportLog) { + Icon( + painter = painterResource(R.drawable.ic_save), + contentDescription = stringResource(R.string.log_action_export), + ) + } + IconButton(onClick = onShareLog) { + Icon( + painter = painterResource(R.drawable.ic_share), + contentDescription = stringResource(R.string.log_action_share), + ) + } + }, + ) +} diff --git a/app/src/main/res/drawable/ic_save.xml b/app/src/main/res/drawable/ic_save.xml new file mode 100644 index 0000000..ed5766a --- /dev/null +++ b/app/src/main/res/drawable/ic_save.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_share.xml b/app/src/main/res/drawable/ic_share.xml new file mode 100644 index 0000000..c3c2187 --- /dev/null +++ b/app/src/main/res/drawable/ic_share.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3487bc2..61bb47f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -192,6 +192,7 @@ Error Stacktrace Installation Log Export log + Share log Active installation Progress notifications sent during a minimized installation diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml new file mode 100644 index 0000000..f3830f2 --- /dev/null +++ b/app/src/main/res/xml/provider_paths.xml @@ -0,0 +1,6 @@ + + + +