17
17
18
18
package ru.tech.imageresizershrinker.core.crash
19
19
20
- import android.content.Intent
21
20
import android.graphics.Bitmap
22
- import android.os.Build
23
- import android.os.Bundle
24
- import androidx.compose.animation.AnimatedVisibility
25
- import androidx.compose.foundation.layout.Arrangement
26
- import androidx.compose.foundation.layout.Column
27
- import androidx.compose.foundation.layout.Row
28
- import androidx.compose.foundation.layout.Spacer
29
- import androidx.compose.foundation.layout.displayCutoutPadding
30
- import androidx.compose.foundation.layout.fillMaxWidth
31
- import androidx.compose.foundation.layout.height
32
- import androidx.compose.foundation.layout.navigationBarsPadding
33
- import androidx.compose.foundation.layout.padding
34
- import androidx.compose.foundation.layout.size
35
- import androidx.compose.foundation.layout.statusBarsPadding
36
- import androidx.compose.foundation.layout.width
37
- import androidx.compose.foundation.rememberScrollState
38
- import androidx.compose.foundation.shape.RoundedCornerShape
39
- import androidx.compose.foundation.text.selection.SelectionContainer
40
- import androidx.compose.foundation.verticalScroll
41
- import androidx.compose.material.icons.Icons
42
- import androidx.compose.material.icons.rounded.BugReport
43
- import androidx.compose.material.icons.rounded.ContentCopy
44
- import androidx.compose.material.icons.rounded.RestartAlt
45
- import androidx.compose.material3.ButtonDefaults
46
- import androidx.compose.material3.Icon
47
- import androidx.compose.material3.MaterialTheme
48
- import androidx.compose.material3.Text
49
- import androidx.compose.ui.Alignment
50
- import androidx.compose.ui.Modifier
51
- import androidx.compose.ui.platform.LocalUriHandler
52
- import androidx.compose.ui.res.stringResource
53
- import androidx.compose.ui.text.font.FontWeight
54
- import androidx.compose.ui.text.style.TextAlign
55
- import androidx.compose.ui.unit.dp
56
- import androidx.compose.ui.unit.sp
21
+ import androidx.compose.runtime.Composable
57
22
import androidx.exifinterface.media.ExifInterface
58
- import com.t8rin.dynamic.theme.ColorTuple
59
- import com.t8rin.dynamic.theme.extractPrimaryColor
60
23
import dagger.hilt.android.AndroidEntryPoint
61
24
import ru.tech.imageresizershrinker.core.crash.components.CrashHandler
62
- import ru.tech.imageresizershrinker.core.domain.ISSUE_TRACKER
63
- import ru.tech.imageresizershrinker.core.domain.TELEGRAM_GROUP_LINK
64
25
import ru.tech.imageresizershrinker.core.domain.image.ImageGetter
65
- import ru.tech.imageresizershrinker.core.resources.BuildConfig
66
- import ru.tech.imageresizershrinker.core.resources.R
67
- import ru.tech.imageresizershrinker.core.resources.emoji.Emoji
68
- import ru.tech.imageresizershrinker.core.resources.icons.Github
69
- import ru.tech.imageresizershrinker.core.resources.icons.ImageToolboxBroken
70
- import ru.tech.imageresizershrinker.core.resources.icons.Telegram
71
- import ru.tech.imageresizershrinker.core.settings.presentation.model.toUiState
72
- import ru.tech.imageresizershrinker.core.ui.shapes.IconShapeDefaults
73
- import ru.tech.imageresizershrinker.core.ui.theme.Black
74
- import ru.tech.imageresizershrinker.core.ui.theme.Blue
75
- import ru.tech.imageresizershrinker.core.ui.theme.ImageToolboxThemeSurface
76
- import ru.tech.imageresizershrinker.core.ui.theme.White
77
- import ru.tech.imageresizershrinker.core.ui.theme.outlineVariant
78
- import ru.tech.imageresizershrinker.core.ui.utils.helper.AppActivityClass
79
- import ru.tech.imageresizershrinker.core.ui.utils.helper.AppVersion
80
- import ru.tech.imageresizershrinker.core.ui.utils.provider.ImageToolboxCompositionLocals
81
- import ru.tech.imageresizershrinker.core.ui.utils.provider.LocalScreenSize
82
- import ru.tech.imageresizershrinker.core.ui.utils.provider.rememberLocalEssentials
83
- import ru.tech.imageresizershrinker.core.ui.utils.provider.setContentWithWindowSizeClass
84
- import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedButton
85
- import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedFloatingActionButton
86
- import ru.tech.imageresizershrinker.core.ui.widget.other.ExpandableItem
87
- import ru.tech.imageresizershrinker.core.ui.widget.other.ToastHost
88
- import ru.tech.imageresizershrinker.core.ui.widget.text.AutoSizeText
89
26
import javax.inject.Inject
90
27
91
28
@AndroidEntryPoint
92
29
class CrashActivity : CrashHandler () {
93
30
94
- override fun onCreate (savedInstanceState : Bundle ? ) {
95
- super .onCreate(savedInstanceState)
96
-
97
- val crashReason = getCrashReason()
98
- val exName = crashReason.split(" \n\n " )[0 ].trim()
99
- val ex = crashReason.split(" \n\n " ).drop(1 ).joinToString(" \n\n " )
100
-
101
- val title = " [Bug] App Crash: $exName "
102
- val deviceInfo =
103
- " Device: ${Build .MODEL } (${Build .BRAND } - ${Build .DEVICE } ), SDK: ${Build .VERSION .SDK_INT } (${Build .VERSION .RELEASE } ), App: $AppVersion (${BuildConfig .VERSION_CODE } )\n\n "
104
- val body = " $deviceInfo$ex "
105
-
106
- setContentWithWindowSizeClass {
107
- ImageToolboxCompositionLocals (
108
- settingsState = getSettingsState().toUiState(
109
- allEmojis = Emoji .allIcons(),
110
- allIconShapes = IconShapeDefaults .shapes,
111
- onGetEmojiColorTuple = ::getColorTupleFromEmoji
112
- )
113
- ) {
114
- val essentials = rememberLocalEssentials()
115
- val createClip: (String ) -> Unit = {
116
- essentials.copyToClipboard(it)
117
- essentials.showToast(
118
- icon = Icons .Rounded .ContentCopy ,
119
- message = getString(R .string.copied),
120
- )
121
- }
122
-
123
- val linkHandler = LocalUriHandler .current
124
-
125
- ImageToolboxThemeSurface {
126
- Column (
127
- modifier = Modifier
128
- .align(Alignment .Center )
129
- .verticalScroll(rememberScrollState())
130
- .displayCutoutPadding(),
131
- verticalArrangement = Arrangement .Center ,
132
- horizontalAlignment = Alignment .CenterHorizontally
133
- ) {
134
- Spacer (modifier = Modifier .height(16 .dp))
135
- Icon (
136
- imageVector = Icons .Outlined .ImageToolboxBroken ,
137
- contentDescription = null ,
138
- modifier = Modifier
139
- .size(80 .dp)
140
- .statusBarsPadding()
141
- )
142
- Spacer (modifier = Modifier .height(8 .dp))
143
- Text (
144
- text = stringResource(R .string.something_went_wrong_emphasis),
145
- fontWeight = FontWeight .SemiBold ,
146
- textAlign = TextAlign .Center ,
147
- fontSize = 22 .sp,
148
- modifier = Modifier .padding(16 .dp)
149
- )
150
- Spacer (modifier = Modifier .height(24 .dp))
151
- val screenWidth = LocalScreenSize .current.width - 32 .dp
152
- Row (
153
- modifier = Modifier
154
- .padding(horizontal = 16 .dp)
155
- .fillMaxWidth(),
156
- horizontalArrangement = Arrangement .Center ,
157
- verticalAlignment = Alignment .CenterVertically
158
- ) {
159
- EnhancedButton (
160
- onClick = {
161
- linkHandler.openUri(TELEGRAM_GROUP_LINK )
162
- createClip(title + " \n\n " + body)
163
- },
164
- modifier = Modifier
165
- .padding(end = 8 .dp)
166
- .weight(1f )
167
- .width(screenWidth / 2f )
168
- .height(50 .dp),
169
- containerColor = Blue ,
170
- contentColor = White ,
171
- borderColor = MaterialTheme .colorScheme.outlineVariant(
172
- onTopOf = Blue
173
- ),
174
- contentPadding = ButtonDefaults .ButtonWithIconContentPadding
175
- ) {
176
- Row (
177
- verticalAlignment = Alignment .CenterVertically ,
178
- horizontalArrangement = Arrangement .Center
179
- ) {
180
- Icon (
181
- imageVector = Icons .Rounded .Telegram ,
182
- contentDescription = stringResource(R .string.telegram)
183
- )
184
- Spacer (modifier = Modifier .width(8 .dp))
185
- AutoSizeText (
186
- text = stringResource(id = R .string.contact_me),
187
- maxLines = 1
188
- )
189
- }
190
- }
191
- EnhancedButton (
192
- onClick = {
193
- linkHandler.openUri(" $ISSUE_TRACKER /new?title=$title &body=$body " )
194
- createClip(title + " \n\n " + body)
195
- },
196
- modifier = Modifier
197
- .weight(1f )
198
- .width(screenWidth / 2f )
199
- .height(50 .dp),
200
- containerColor = Black ,
201
- contentColor = White ,
202
- borderColor = MaterialTheme .colorScheme.outlineVariant(
203
- onTopOf = Black
204
- ),
205
- contentPadding = ButtonDefaults .ButtonWithIconContentPadding
206
- ) {
207
- Row (
208
- verticalAlignment = Alignment .CenterVertically ,
209
- horizontalArrangement = Arrangement .Center
210
- ) {
211
- Icon (
212
- imageVector = Icons .Rounded .Github ,
213
- contentDescription = stringResource(R .string.github)
214
- )
215
- Spacer (modifier = Modifier .width(8 .dp))
216
- AutoSizeText (
217
- text = stringResource(id = R .string.create_issue),
218
- maxLines = 1
219
- )
220
- }
221
- }
222
- }
223
- Spacer (modifier = Modifier .height(16 .dp))
224
- ExpandableItem (
225
- shape = RoundedCornerShape (24 .dp),
226
- modifier = Modifier
227
- .fillMaxWidth()
228
- .padding(horizontal = 16 .dp)
229
- .navigationBarsPadding(),
230
- visibleContent = {
231
- Icon (
232
- imageVector = Icons .Rounded .BugReport ,
233
- contentDescription = null ,
234
- modifier = Modifier .padding(
235
- start = 16 .dp,
236
- top = 16 .dp,
237
- bottom = 16 .dp
238
- )
239
- )
240
- AutoSizeText (
241
- text = exName,
242
- fontWeight = FontWeight .Bold ,
243
- textAlign = TextAlign .Start ,
244
- modifier = Modifier
245
- .padding(16 .dp)
246
- .weight(1f )
247
- )
248
- },
249
- expandableContent = {
250
- AnimatedVisibility (visible = it) {
251
- SelectionContainer {
252
- Text (
253
- text = ex,
254
- textAlign = TextAlign .Center ,
255
- modifier = Modifier .padding(16 .dp)
256
- )
257
- }
258
- }
259
- }
260
- )
261
- Spacer (modifier = Modifier .height(80 .dp))
262
- }
263
- Row (
264
- Modifier
265
- .padding(8 .dp)
266
- .navigationBarsPadding()
267
- .displayCutoutPadding()
268
- .align(Alignment .BottomCenter )
269
- ) {
270
- EnhancedFloatingActionButton (
271
- modifier = Modifier
272
- .weight(1f , false ),
273
- onClick = {
274
- startActivity(
275
- Intent (
276
- this @CrashActivity,
277
- AppActivityClass
278
- )
279
- )
280
- },
281
- content = {
282
- Spacer (Modifier .width(16 .dp))
283
- Icon (
284
- imageVector = Icons .Rounded .RestartAlt ,
285
- contentDescription = stringResource(R .string.restart_app)
286
- )
287
- Spacer (Modifier .width(16 .dp))
288
- AutoSizeText (
289
- text = stringResource(R .string.restart_app),
290
- maxLines = 1
291
- )
292
- Spacer (Modifier .width(16 .dp))
293
- }
294
- )
295
- Spacer (Modifier .width(8 .dp))
296
- EnhancedFloatingActionButton (
297
- containerColor = MaterialTheme .colorScheme.tertiaryContainer,
298
- onClick = {
299
- createClip(title + " \n\n " + body)
300
- }
301
- ) {
302
- Icon (
303
- imageVector = Icons .Rounded .ContentCopy ,
304
- contentDescription = stringResource(R .string.copy)
305
- )
306
- }
307
- }
308
-
309
- ToastHost ()
310
- }
311
- }
312
- }
313
- }
314
-
315
31
@Inject
316
32
lateinit var imageGetter: ImageGetter <Bitmap , ExifInterface >
317
33
318
- private suspend fun getColorTupleFromEmoji (
319
- emojiUri : String
320
- ): ColorTuple ? = imageGetter
321
- .getImage(data = emojiUri)
322
- ?.extractPrimaryColor()
323
- ?.let { ColorTuple (it) }
34
+ @Composable
35
+ override fun Content () = CrashRootContent ()
324
36
325
- }
37
+ }
0 commit comments