diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/backup/CreateBackupSheet.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/backup/CreateBackupSheet.kt
index 04206270..c950c92b 100644
--- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/backup/CreateBackupSheet.kt
+++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/backup/CreateBackupSheet.kt
@@ -42,7 +42,7 @@ fun CreateBackupSheet(
val backupLauncher = rememberLauncherForActivityResult(
- contract = ActivityResultContracts.CreateDocument("application/vendor.de.mm20.launcher2.backup"),
+ contract = ActivityResultContracts.CreateDocument("application/vnd.de.mm20.launcher2.backup"),
onResult = {
if (it != null) viewModel.createBackup(it)
}
diff --git a/core/base/src/main/res/drawable/ic_file_backup.xml b/core/base/src/main/res/drawable/ic_file_backup.xml
new file mode 100644
index 00000000..e6575877
--- /dev/null
+++ b/core/base/src/main/res/drawable/ic_file_backup.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/core/base/src/main/res/drawable/ic_file_theme.xml b/core/base/src/main/res/drawable/ic_file_theme.xml
new file mode 100644
index 00000000..879e8ab0
--- /dev/null
+++ b/core/base/src/main/res/drawable/ic_file_theme.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml
index 0d176c46..220425b6 100644
--- a/core/i18n/src/main/res/values/strings.xml
+++ b/core/i18n/src/main/res/values/strings.xml
@@ -145,6 +145,8 @@
Form
%1$s backup
+
+ %1$s theme
%1$s file
diff --git a/data/files/src/main/java/de/mm20/launcher2/files/FileSerialization.kt b/data/files/src/main/java/de/mm20/launcher2/files/FileSerialization.kt
index f660d6b5..2fbfcf8b 100644
--- a/data/files/src/main/java/de/mm20/launcher2/files/FileSerialization.kt
+++ b/data/files/src/main/java/de/mm20/launcher2/files/FileSerialization.kt
@@ -51,7 +51,7 @@ class LocalFileDeserializer(
if (!java.io.File(path).exists()) return null
val directory = java.io.File(path).isDirectory
val id = cursor.getLong(0)
- val mimeType = cursor.getStringOrNull(3)
+ val mimeType = cursor.getStringOrNull(3).takeIf { it != "application/octet-stream" }
?: if (directory) "resource/folder" else LocalFile.getMimetypeByFileExtension(
path.substringAfterLast(
'.'
diff --git a/data/files/src/main/java/de/mm20/launcher2/files/providers/LocalFileProvider.kt b/data/files/src/main/java/de/mm20/launcher2/files/providers/LocalFileProvider.kt
index 9bebb7bb..a8a7d022 100644
--- a/data/files/src/main/java/de/mm20/launcher2/files/providers/LocalFileProvider.kt
+++ b/data/files/src/main/java/de/mm20/launcher2/files/providers/LocalFileProvider.kt
@@ -44,7 +44,7 @@ internal class LocalFileProvider(
val path = cursor.getString(3)
if (!java.io.File(path).exists()) continue
val directory = java.io.File(path).isDirectory
- val mimeType = (cursor.getStringOrNull(4)
+ val mimeType = (cursor.getStringOrNull(4).takeIf { it != "application/octet-stream" }
?: if (directory) "resource/folder" else LocalFile.getMimetypeByFileExtension(
path.substringAfterLast(
'.'
diff --git a/data/files/src/main/java/de/mm20/launcher2/search/data/File.kt b/data/files/src/main/java/de/mm20/launcher2/search/data/File.kt
index c6fc7c63..8dedb75a 100644
--- a/data/files/src/main/java/de/mm20/launcher2/search/data/File.kt
+++ b/data/files/src/main/java/de/mm20/launcher2/search/data/File.kt
@@ -49,6 +49,8 @@ interface File : SavableSearchable {
"application/vnd.android.package-archive" -> R.drawable.ic_file_android to R.color.lightgreen
"application/vnd.google-apps.form" -> R.drawable.ic_file_form to R.color.deeppurple
"application/vnd.google-apps.drawing" -> R.drawable.ic_file_picture to R.color.teal
+ "application/vnd.de.mm20.launcher2.backup" -> R.drawable.ic_file_backup to R.color.brown
+ "application/vnd.de.mm20.launcher2.theme" -> R.drawable.ic_file_theme to R.color.amber
else -> R.drawable.ic_file_generic to R.color.bluegrey
}
}
@@ -64,12 +66,18 @@ interface File : SavableSearchable {
fun getFileType(context: Context): String {
if (isDirectory) return context.getString(R.string.file_type_directory)
- if (mimeType == "application/vendor.de.mm20.launcher2.backup") {
+ if (mimeType == "application/vnd.de.mm20.launcher2.backup") {
return context.getString(
R.string.file_type_launcherbackup,
context.getString(R.string.app_name)
)
}
+ if (mimeType == "application/vnd.de.mm20.launcher2.theme") {
+ return context.getString(
+ R.string.file_type_launchertheme,
+ context.getString(R.string.app_name)
+ )
+ }
val resource = when (mimeType) {
"application/zip",
"application/x-zip-compressed",
@@ -118,10 +126,6 @@ interface File : SavableSearchable {
}
if (resource == R.string.file_type_none && label.matches(Regex(".+\\..+"))) {
val extension = label.substringAfterLast(".").uppercase(Locale.getDefault())
- if (extension == "kvaesitso") return context.getString(
- R.string.file_type_launcherbackup,
- context.getString(R.string.app_name)
- )
return context.getString(R.string.file_type_generic, extension)
}
return context.getString(resource)
diff --git a/data/files/src/main/java/de/mm20/launcher2/search/data/LocalFile.kt b/data/files/src/main/java/de/mm20/launcher2/search/data/LocalFile.kt
index 3fca9c7b..242995da 100644
--- a/data/files/src/main/java/de/mm20/launcher2/search/data/LocalFile.kt
+++ b/data/files/src/main/java/de/mm20/launcher2/search/data/LocalFile.kt
@@ -223,7 +223,8 @@ data class LocalFile(
"ogg" -> "audio/ogg"
"wav" -> "audio/wav"
"mp4" -> "video/mp4"
- "kvaesitso" -> "application/vendor.de.mm20.launcher2.backup"
+ "kvaesitso" -> "application/vnd.de.mm20.launcher2.backup"
+ "kvtheme" -> "application/vnd.de.mm20.launcher2.theme"
else -> "application/octet-stream"
}
}