diff --git a/manager/app/src/main/AndroidManifest.xml b/manager/app/src/main/AndroidManifest.xml
index 06567350..7794d8e9 100644
--- a/manager/app/src/main/AndroidManifest.xml
+++ b/manager/app/src/main/AndroidManifest.xml
@@ -32,6 +32,16 @@
android:name="android.app.lib_name"
android:value="" />
+
+
+
+
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Settings.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Settings.kt
index b55ec3ec..df43e4f4 100644
--- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Settings.kt
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Settings.kt
@@ -1,25 +1,27 @@
package me.weishu.kernelsu.ui.screen
+import android.content.Intent
+import android.net.Uri
import android.widget.Toast
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
-import androidx.compose.material.icons.filled.Info
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
-import androidx.compose.ui.unit.dp
-import com.alorma.compose.settings.storage.base.SettingValueState
+import androidx.core.content.FileProvider
import com.alorma.compose.settings.ui.*
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
+import me.weishu.kernelsu.ui.util.getBugreportFile
+import me.weishu.kernelsu.BuildConfig
import me.weishu.kernelsu.R
import me.weishu.kernelsu.ui.util.LinkifyText
+
/**
* @author weishu
* @date 2023/1/1.
@@ -76,6 +78,26 @@ fun SettingScreen(navigator: DestinationsNavigator) {
Toast.makeText(context, "coming soon", Toast.LENGTH_SHORT).show()
}
)
+ SettingsMenuLink(title = {
+ Text(stringResource(id = R.string.send_log))
+ },
+ onClick = {
+ val bugreport = getBugreportFile(context)
+ val uri: Uri = FileProvider.getUriForFile(context, "${BuildConfig.APPLICATION_ID}.fileprovider", bugreport)
+
+ val shareIntent = Intent(Intent.ACTION_SEND)
+ shareIntent.putExtra(Intent.EXTRA_STREAM, uri)
+ shareIntent.setDataAndType(uri, "application/zip")
+ shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
+
+ context.startActivity(
+ Intent.createChooser(
+ shareIntent,
+ context.getString(R.string.send_log)
+ )
+ )
+ }
+ )
SettingsMenuLink(title = {
Text(stringResource(id = R.string.about))
},
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/LogEvent.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/LogEvent.kt
new file mode 100644
index 00000000..6c49dc38
--- /dev/null
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/LogEvent.kt
@@ -0,0 +1,69 @@
+package me.weishu.kernelsu.ui.util
+
+import android.content.Context
+import android.os.Build
+import android.system.Os
+import java.io.File
+import java.io.FileWriter
+import java.io.PrintWriter
+import java.time.LocalDateTime
+import java.time.format.DateTimeFormatter
+
+fun getBugreportFile(context: Context): File {
+
+ val bugreportDir = File(context.cacheDir, "bugreport")
+ bugreportDir.mkdirs()
+
+ val dmesgFile = File(bugreportDir, "dmesg.txt")
+ val logcatFile = File(bugreportDir, "logcat.txt")
+ val tombstonesFile = File(bugreportDir, "tombstones.tar.gz")
+ val dropboxFile = File(bugreportDir, "dropbox.tar.gz")
+
+ val shell = createRootShell()
+
+ shell.newJob().add("dmesg > ${dmesgFile.absolutePath}").exec()
+ shell.newJob().add("logcat -d > ${logcatFile.absolutePath}").exec()
+ shell.newJob().add("tar -czf ${tombstonesFile.absolutePath} /data/tombstones").exec()
+ shell.newJob().add("tar -czf ${dropboxFile.absolutePath} /data/system/dropbox").exec()
+
+ // build.prop
+ val buildInfo = File(bugreportDir, "basic.txt")
+ PrintWriter(FileWriter(buildInfo)).use { pw ->
+ pw.println("Kernel: ${System.getProperty("os.version")}")
+ pw.println("BRAND: " + Build.BRAND)
+ pw.println("MODEL: " + Build.MODEL)
+ pw.println("PRODUCT: " + Build.PRODUCT)
+ pw.println("MANUFACTURER: " + Build.MANUFACTURER)
+ pw.println("SDK: " + Build.VERSION.SDK_INT)
+ pw.println("PREVIEW_SDK: " + Build.VERSION.PREVIEW_SDK_INT)
+ pw.println("FINGERPRINT: " + Build.FINGERPRINT)
+ pw.println("DEVICE: " + Build.DEVICE)
+ val packageInfo =
+ context.packageManager.getPackageInfo(context.packageName, 0)
+ pw.println("PACKAGE: " + packageInfo.packageName)
+ pw.println("VERSION: " + packageInfo.versionName)
+
+ val uname = Os.uname()
+ pw.println("KernelRelease: ${uname.release}")
+ pw.println("KernelVersion: ${uname.version}")
+ pw.println("Mahcine: ${uname.machine}")
+ pw.println("Nodename: ${uname.nodename}")
+ pw.println("Sysname: ${uname.sysname}")
+
+ }
+
+ // modules
+ val modulesFile = File(bugreportDir, "modules.json")
+ modulesFile.writeText(listModules())
+
+ val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm")
+ val current = LocalDateTime.now().format(formatter)
+
+ val targetFile = File(context.cacheDir, "KernelSU_bugreport_${current}.tar.gz")
+
+ shell.newJob().add("tar czf ${targetFile.absolutePath} -C ${bugreportDir.absolutePath} .").exec()
+ shell.newJob().add("rm -rf ${bugreportDir.absolutePath}").exec()
+ shell.newJob().add("chmod 0644 ${targetFile.absolutePath}").exec()
+
+ return targetFile;
+}
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-zh-rCN/strings.xml b/manager/app/src/main/res/values-zh-rCN/strings.xml
index 0fa11f69..3dd542f5 100644
--- a/manager/app/src/main/res/values-zh-rCN/strings.xml
+++ b/manager/app/src/main/res/values-zh-rCN/strings.xml
@@ -49,4 +49,5 @@
刷新
显示系统应用
隐藏系统应用
+ 发送日志
diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml
index 474a010f..d19ce355 100644
--- a/manager/app/src/main/res/values/strings.xml
+++ b/manager/app/src/main/res/values/strings.xml
@@ -53,5 +53,6 @@
Refresh
Show system apps
Hide system apps
+ Send Log
diff --git a/manager/app/src/main/res/xml/filepaths.xml b/manager/app/src/main/res/xml/filepaths.xml
new file mode 100644
index 00000000..f8a9a5c5
--- /dev/null
+++ b/manager/app/src/main/res/xml/filepaths.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file