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 @@
+
+
+
+