Skip to content

Commit 8c639f5

Browse files
committed
Code refactoring
1 parent cb2ee8c commit 8c639f5

File tree

12 files changed

+891
-794
lines changed

12 files changed

+891
-794
lines changed

app/src/main/java/ru/tech/imageresizershrinker/app/presentation/AppActivity.kt

+4-10
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@
1818
package ru.tech.imageresizershrinker.app.presentation
1919

2020
import android.content.Intent
21-
import android.os.Bundle
21+
import androidx.compose.runtime.Composable
2222
import com.arkivanov.decompose.retainedComponent
2323
import dagger.hilt.android.AndroidEntryPoint
2424
import ru.tech.imageresizershrinker.core.crash.components.M3Activity
2525
import ru.tech.imageresizershrinker.core.ui.utils.helper.ContextUtils.parseImageFromIntent
26-
import ru.tech.imageresizershrinker.core.ui.utils.provider.setContentWithWindowSizeClass
2726
import ru.tech.imageresizershrinker.feature.root.presentation.RootContent
2827
import ru.tech.imageresizershrinker.feature.root.presentation.screenLogic.RootComponent
2928
import javax.inject.Inject
@@ -38,15 +37,10 @@ class AppActivity : M3Activity() {
3837
retainedComponent(factory = rootComponentFactory::invoke)
3938
}
4039

41-
override fun onCreate(savedInstanceState: Bundle?) {
42-
super.onCreate(savedInstanceState)
40+
@Composable
41+
override fun Content() = RootContent(component = component)
4342

44-
if (savedInstanceState == null) parseImage(intent)
45-
46-
setContentWithWindowSizeClass {
47-
RootContent(component = component)
48-
}
49-
}
43+
override fun onFirstLaunch() = parseImage(intent)
5044

5145
override fun onNewIntent(intent: Intent) {
5246
super.onNewIntent(intent)

app/src/main/res/resources.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@
1414
# You should have received a copy of the Apache License
1515
# along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
1616
#
17-
unqualifiedResLocale=en-US
17+
unqualifiedResLocale=en

core/crash/src/main/java/ru/tech/imageresizershrinker/core/crash/CrashActivity.kt

+4-292
Original file line numberDiff line numberDiff line change
@@ -17,309 +17,21 @@
1717

1818
package ru.tech.imageresizershrinker.core.crash
1919

20-
import android.content.Intent
2120
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
5722
import androidx.exifinterface.media.ExifInterface
58-
import com.t8rin.dynamic.theme.ColorTuple
59-
import com.t8rin.dynamic.theme.extractPrimaryColor
6023
import dagger.hilt.android.AndroidEntryPoint
6124
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
6425
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
8926
import javax.inject.Inject
9027

9128
@AndroidEntryPoint
9229
class CrashActivity : CrashHandler() {
9330

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-
31531
@Inject
31632
lateinit var imageGetter: ImageGetter<Bitmap, ExifInterface>
31733

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()
32436

325-
}
37+
}

0 commit comments

Comments
 (0)