Skip to content

Commit 6ca5114

Browse files
committed
fix: Crash on .mpp icon load
1 parent 4ef9744 commit 6ca5114

2 files changed

Lines changed: 33 additions & 6 deletions

File tree

app/src/main/java/app/morphe/manager/ui/screen/shared/FilePicker.kt

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
package app.morphe.manager.ui.screen.shared
77

88
import android.content.pm.PackageInfo
9+
import android.graphics.Bitmap
910
import android.graphics.BitmapFactory
11+
import android.graphics.Canvas
1012
import android.os.Environment
1113
import android.util.LruCache
14+
import androidx.appcompat.content.res.AppCompatResources
1215
import androidx.compose.foundation.Image
1316
import androidx.compose.foundation.background
1417
import androidx.compose.foundation.clickable
@@ -31,7 +34,7 @@ import androidx.compose.ui.graphics.ImageBitmap
3134
import androidx.compose.ui.graphics.asImageBitmap
3235
import androidx.compose.ui.graphics.vector.ImageVector
3336
import androidx.compose.ui.layout.ContentScale
34-
import androidx.compose.ui.res.painterResource
37+
import androidx.compose.ui.platform.LocalContext
3538
import androidx.compose.ui.res.stringResource
3639
import androidx.compose.ui.text.font.FontWeight
3740
import androidx.compose.ui.text.style.TextOverflow
@@ -49,6 +52,7 @@ import java.io.File
4952
import java.text.SimpleDateFormat
5053
import java.util.Date
5154
import java.util.Locale
55+
import androidx.core.graphics.createBitmap
5256

5357
// Exact MIME type → extensions
5458
private val MIME_EXTENSION_MAP: Map<String, Set<String>> = mapOf(
@@ -168,8 +172,19 @@ fun FilePicker(
168172
) {
169173
val prefs: PreferencesManager = koinInject()
170174
val pm: PM = koinInject()
175+
val context = LocalContext.current
171176
val coroutineScope = rememberCoroutineScope()
172177
val allowedExtensions = remember(mimeTypes) { resolveAllowedExtensions(mimeTypes) }
178+
val mppIcon: ImageBitmap? = remember(context) {
179+
runCatching {
180+
val drawable = AppCompatResources.getDrawable(context, R.drawable.ic_mpp) ?: return@runCatching null
181+
val size = 96
182+
val bmp = createBitmap(size, size)
183+
drawable.setBounds(0, 0, size, size)
184+
drawable.draw(Canvas(bmp))
185+
bmp.asImageBitmap()
186+
}.getOrNull()
187+
}
173188
val roots = remember { storageRoots() }
174189

175190
val downloadsDir = remember {
@@ -387,14 +402,13 @@ fun FilePicker(
387402
isImage -> null
388403
else -> Icons.AutoMirrored.Outlined.InsertDriveFile
389404
}
390-
val iconRes = if (isMpp) R.drawable.ic_notification else null
391405
val detail = if (!isDir) {
392406
"${formatBytes(file.length())} · ${formatModDate(file.lastModified())}"
393407
} else null
394408

395409
FilePickerRow(
396410
icon = icon,
397-
iconRes = iconRes,
411+
iconBitmap = if (isMpp) mppIcon else null,
398412
thumbnail = thumbnail,
399413
packageInfo = packageInfo,
400414
name = file.name,
@@ -442,7 +456,7 @@ private fun FilePickerRow(
442456
name: String,
443457
detail: String?,
444458
packageInfo: PackageInfo? = null,
445-
iconRes: Int? = null,
459+
iconBitmap: ImageBitmap? = null,
446460
thumbnail: ImageBitmap? = null,
447461
isSelected: Boolean = false,
448462
onClick: () -> Unit
@@ -476,9 +490,9 @@ private fun FilePickerRow(
476490
.size(22.dp)
477491
.clip(RoundedCornerShape(4.dp))
478492
)
479-
} else if (iconRes != null) {
493+
} else if (iconBitmap != null) {
480494
Icon(
481-
painter = painterResource(iconRes),
495+
bitmap = iconBitmap,
482496
contentDescription = null,
483497
tint = iconTint,
484498
modifier = Modifier.size(22.dp)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!-- Copyright 2025 Morphe. This is copyrighted content, and not licensed under open source terms.
3+
See https://github.com/MorpheApp/morphe-branding -->
4+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
5+
android:width="24dp"
6+
android:height="24dp"
7+
android:viewportWidth="24"
8+
android:viewportHeight="24">
9+
10+
<path
11+
android:fillColor="?attr/colorControlNormal"
12+
android:pathData="M3.79688,2.5 C1.63503,2.5,1,4.0832,1,5.0332 L1,8.45313 L1,19.0938 C1.06358,20.4237,2.20771,21.5,3.54297,21.5 C4.87823,21.5,6.02235,20.4237,6.08594,19.0938 L6.08594,10.543 C7.86628,12.5696,8.88439,16.053,12,16.1797 C15.052,16.053,16.2609,12.633,17.9141,10.543 C17.9141,10.543,20.7746,5.85656,23,5.47656 C23,3.70323,22.3014,2.5,20.2031,2.5 C18.0413,2.5,16.5145,5.66721,15.4336,7.06055 C14.3527,8.45388,13.8439,9.97266,12,9.97266 C10.1561,9.97266,9.58375,8.39055,8.56641,7.06055 C7.48548,5.66721,5.95872,2.5,3.79688,2.5 Z M22.7793,7.08008 C21.6973,7.04724,18.2658,11.3755,17.9141,13.7109 L17.9141,19.0938 C17.9777,20.4237,19.1218,21.5,20.457,21.5 C21.7923,21.5,22.9364,20.4237,23,19.0938 L23,7.1875 C22.9454,7.11823,22.871,7.08286,22.7793,7.08008 Z" />
13+
</vector>

0 commit comments

Comments
 (0)