1
1
package com.skyd.anivu.ui.activity
2
2
3
- import android.content.ClipData
4
- import android.content.ClipboardManager
5
3
import android.content.Context
6
4
import android.content.Intent
7
5
import android.net.Uri
8
6
import android.os.Build
9
7
import android.os.Bundle
10
- import android.os.Process
11
- import android.widget.TextView
8
+ import androidx.activity.ComponentActivity
9
+ import androidx.activity.compose.setContent
12
10
import androidx.activity.enableEdgeToEdge
13
- import androidx.appcompat.app.AppCompatActivity
14
- import com.google.android.material.dialog.MaterialAlertDialogBuilder
11
+ import androidx.compose.foundation.layout.Arrangement
12
+ import androidx.compose.foundation.layout.Column
13
+ import androidx.compose.foundation.layout.Row
14
+ import androidx.compose.foundation.layout.Spacer
15
+ import androidx.compose.foundation.layout.fillMaxWidth
16
+ import androidx.compose.foundation.layout.height
17
+ import androidx.compose.foundation.layout.padding
18
+ import androidx.compose.foundation.layout.size
19
+ import androidx.compose.foundation.layout.width
20
+ import androidx.compose.foundation.rememberScrollState
21
+ import androidx.compose.foundation.text.selection.SelectionContainer
22
+ import androidx.compose.foundation.verticalScroll
23
+ import androidx.compose.material.icons.Icons
24
+ import androidx.compose.material.icons.filled.BugReport
25
+ import androidx.compose.material3.Button
26
+ import androidx.compose.material3.Icon
27
+ import androidx.compose.material3.MaterialTheme
28
+ import androidx.compose.material3.Scaffold
29
+ import androidx.compose.material3.SnackbarHost
30
+ import androidx.compose.material3.SnackbarHostState
31
+ import androidx.compose.material3.Text
32
+ import androidx.compose.material3.TextButton
33
+ import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
34
+ import androidx.compose.runtime.Composable
35
+ import androidx.compose.runtime.CompositionLocalProvider
36
+ import androidx.compose.runtime.remember
37
+ import androidx.compose.runtime.rememberCoroutineScope
38
+ import androidx.compose.ui.Modifier
39
+ import androidx.compose.ui.platform.ClipboardManager
40
+ import androidx.compose.ui.platform.LocalClipboardManager
41
+ import androidx.compose.ui.platform.LocalContext
42
+ import androidx.compose.ui.res.stringResource
43
+ import androidx.compose.ui.text.AnnotatedString
44
+ import androidx.compose.ui.unit.dp
15
45
import com.skyd.anivu.R
16
46
import com.skyd.anivu.config.Const.GITHUB_NEW_ISSUE_URL
17
47
import com.skyd.anivu.ext.getAppVersionCode
18
48
import com.skyd.anivu.ext.getAppVersionName
19
49
import com.skyd.anivu.ext.openBrowser
20
- import com.skyd.anivu.ext.sp
21
- import com.skyd.anivu.ui.component.showToast
22
- import kotlin.system.exitProcess
50
+ import com.skyd.anivu.ext.showSnackbar
51
+ import com.skyd.anivu.model.preference.SettingsProvider
52
+ import com.skyd.anivu.ui.local.LocalDarkMode
53
+ import com.skyd.anivu.ui.local.LocalWindowSizeClass
54
+ import com.skyd.anivu.ui.theme.AniVuTheme
23
55
24
56
25
57
/* *
26
58
* CrashActivity, do not extends BaseActivity
27
59
*/
28
- class CrashActivity : AppCompatActivity () {
60
+ class CrashActivity : ComponentActivity () {
29
61
companion object {
30
62
const val CRASH_INFO = " crashInfo"
31
63
@@ -37,23 +69,11 @@ class CrashActivity : AppCompatActivity() {
37
69
}
38
70
}
39
71
40
- private fun copyToClipboard (crashInfo : String? ) {
41
- val cm = getSystemService(Context .CLIPBOARD_SERVICE ) as ClipboardManager
42
- cm.setPrimaryClip(ClipData .newPlainText(" Exception trace stack" , crashInfo))
43
- }
44
-
45
- private fun exitApp () {
46
- finish()
47
- Process .killProcess(Process .myPid())
48
- exitProcess(1 )
49
- }
50
-
51
72
override fun onCreate (savedInstanceState : Bundle ? ) {
52
73
enableEdgeToEdge()
53
74
super .onCreate(savedInstanceState)
54
75
55
76
val crashInfo = intent.getStringExtra(CRASH_INFO )
56
-
57
77
val message = buildString {
58
78
append(" VersionName: " ).append(getAppVersionName()).append(" \n " )
59
79
append(" VersionCode: " ).append(getAppVersionCode()).append(" \n " )
@@ -64,31 +84,94 @@ class CrashActivity : AppCompatActivity() {
64
84
append(" Crash Info: \n " )
65
85
append(crashInfo)
66
86
}
67
- MaterialAlertDialogBuilder (this )
68
- .setIcon(R .drawable.ic_error_24)
69
- .setTitle(getString(R .string.crashed))
70
- .setMessage(message)
71
- .setCancelable(false )
72
- .setPositiveButton(getString(R .string.submit_an_issue_on_github)) { _, _ ->
73
- copyToClipboard(message)
74
- Uri .parse(GITHUB_NEW_ISSUE_URL ).openBrowser(this )
75
- exitApp()
76
- }
77
- .setNegativeButton(getString(R .string.close)) { _, _ ->
78
- exitApp()
79
- }
80
- .setNeutralButton(getString(android.R .string.copy)) { _, _ ->
81
- copyToClipboard(message)
82
- getString(R .string.copied).showToast()
83
- exitApp()
87
+
88
+ setContent {
89
+ CompositionLocalProvider (
90
+ LocalWindowSizeClass provides calculateWindowSizeClass(this )
91
+ ) {
92
+ SettingsProvider {
93
+ AniVuTheme (darkTheme = LocalDarkMode .current) {
94
+ CrashScreen (
95
+ message = message,
96
+ onReport = {
97
+ Uri .parse(GITHUB_NEW_ISSUE_URL ).openBrowser(this )
98
+ }
99
+ )
100
+ }
101
+ }
84
102
}
85
- .show()
86
- .apply {
87
- window?.decorView?.findViewById<TextView >(android.R .id.message)?.apply {
88
- setTextIsSelectable(true )
89
- textSize = 3.5f .sp
103
+ }
104
+ }
105
+ }
106
+
107
+ @Composable
108
+ private fun CrashScreen (
109
+ message : String ,
110
+ onReport : () -> Unit ,
111
+ ) {
112
+ val snackbarHostState = remember { SnackbarHostState () }
113
+ val context = LocalContext .current
114
+ val scope = rememberCoroutineScope()
115
+ val clipboardManager = LocalClipboardManager .current
116
+
117
+ Scaffold (
118
+ snackbarHost = { SnackbarHost (hostState = snackbarHostState) },
119
+ ) {
120
+ Column (
121
+ modifier = Modifier
122
+ .verticalScroll(rememberScrollState())
123
+ .padding(it)
124
+ .padding(20 .dp)
125
+ ) {
126
+ Spacer (modifier = Modifier .height(40 .dp))
127
+ Icon (
128
+ modifier = Modifier .size(40 .dp),
129
+ imageVector = Icons .Default .BugReport ,
130
+ contentDescription = null ,
131
+ )
132
+
133
+ Spacer (modifier = Modifier .height(30 .dp))
134
+ Text (
135
+ text = stringResource(id = R .string.crashed),
136
+ style = MaterialTheme .typography.headlineLarge,
137
+ )
138
+
139
+ Spacer (modifier = Modifier .height(30 .dp))
140
+ Row (modifier = Modifier .fillMaxWidth(), horizontalArrangement = Arrangement .End ) {
141
+ TextButton (onClick = {
142
+ copyToClipboard(message, clipboardManager)
143
+ snackbarHostState.showSnackbar(
144
+ scope = scope,
145
+ message = context.getString(R .string.copied),
146
+ )
147
+ }) {
148
+ Text (text = stringResource(id = R .string.crash_screen_copy_crash_log))
149
+ }
150
+
151
+ Spacer (modifier = Modifier .width(12 .dp))
152
+
153
+ Button (onClick = {
154
+ copyToClipboard(message, clipboardManager)
155
+ onReport()
156
+ }) {
157
+ Text (text = stringResource(id = R .string.submit_an_issue_on_github))
90
158
}
91
159
}
92
- setFinishOnTouchOutside(false )
160
+
161
+ Spacer (modifier = Modifier .height(20 .dp))
162
+ Text (
163
+ text = stringResource(R .string.crash_screen_crash_log),
164
+ style = MaterialTheme .typography.titleLarge,
165
+ )
166
+
167
+ Spacer (modifier = Modifier .height(10 .dp))
168
+ SelectionContainer {
169
+ Text (text = message, style = MaterialTheme .typography.bodyMedium)
170
+ }
171
+ }
93
172
}
173
+ }
174
+
175
+ private fun copyToClipboard (text : String , clipboardManager : ClipboardManager ) {
176
+ clipboardManager.setText(AnnotatedString (text))
94
177
}
0 commit comments