Skip to content

Commit c391dcb

Browse files
committed
allow setting a default opening method for specific file types
1 parent 785bf29 commit c391dcb

File tree

10 files changed

+97
-2
lines changed

10 files changed

+97
-2
lines changed

app/src/main/java/com/raival/compose/file/explorer/screen/main/tab/files/holder/LocalFileHolder.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ import com.raival.compose.file.explorer.App.Companion.globalClass
1111
import com.raival.compose.file.explorer.R
1212
import com.raival.compose.file.explorer.common.drawableToBitmap
1313
import com.raival.compose.file.explorer.common.emptyString
14+
import com.raival.compose.file.explorer.common.fromJson
1415
import com.raival.compose.file.explorer.common.hasParent
1516
import com.raival.compose.file.explorer.common.isNot
1617
import com.raival.compose.file.explorer.common.toFormattedSize
1718
import com.raival.compose.file.explorer.screen.main.tab.files.misc.ContentCount
19+
import com.raival.compose.file.explorer.screen.main.tab.files.misc.DefaultOpeningMethods
1820
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType
1921
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType.anyFileType
2022
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType.codeFileType
@@ -97,6 +99,16 @@ class LocalFileHolder(val file: File) : ContentHolder() {
9799
skipSupportedExtensions: Boolean,
98100
customMimeType: String?
99101
) {
102+
val defaultOpeningMethods =
103+
fromJson<DefaultOpeningMethods>(globalClass.preferencesManager.defaultOpeningMethods)
104+
?: DefaultOpeningMethods()
105+
defaultOpeningMethods.openingMethods.forEach {
106+
if (it.extension == extension) {
107+
openFileWithPackage(context, it.packageName, it.className)
108+
return
109+
}
110+
}
111+
100112
if (!skipSupportedExtensions && handleSupportedFiles(context)) {
101113
return
102114
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.raival.compose.file.explorer.screen.main.tab.files.misc
2+
3+
data class DefaultOpeningMethods(
4+
val openingMethods: List<OpeningMethod> = listOf()
5+
)
6+
7+
data class OpeningMethod(
8+
val extension: String,
9+
val packageName: String,
10+
val className: String
11+
)

app/src/main/java/com/raival/compose/file/explorer/screen/main/tab/files/ui/dialog/FileOptionsMenuDialog.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import androidx.compose.material.icons.rounded.FormatColorText
1717
import androidx.compose.material.icons.rounded.Home
1818
import androidx.compose.material.icons.rounded.Info
1919
import androidx.compose.material.icons.rounded.Merge
20+
import androidx.compose.material.icons.rounded.OpenInNewOff
2021
import androidx.compose.material.icons.rounded.Share
2122
import androidx.compose.material3.HorizontalDivider
2223
import androidx.compose.material3.Icon
@@ -40,13 +41,16 @@ import androidx.core.content.pm.ShortcutManagerCompat.isRequestPinShortcutSuppor
4041
import com.raival.compose.file.explorer.App.Companion.globalClass
4142
import com.raival.compose.file.explorer.R
4243
import com.raival.compose.file.explorer.common.emptyString
44+
import com.raival.compose.file.explorer.common.fromJson
4345
import com.raival.compose.file.explorer.common.isNot
46+
import com.raival.compose.file.explorer.common.toJson
4447
import com.raival.compose.file.explorer.common.ui.BottomSheetDialog
4548
import com.raival.compose.file.explorer.common.ui.Space
4649
import com.raival.compose.file.explorer.screen.main.tab.files.FilesTab
4750
import com.raival.compose.file.explorer.screen.main.tab.files.holder.LocalFileHolder
4851
import com.raival.compose.file.explorer.screen.main.tab.files.holder.VirtualFileHolder
4952
import com.raival.compose.file.explorer.screen.main.tab.files.holder.ZipFileHolder
53+
import com.raival.compose.file.explorer.screen.main.tab.files.misc.DefaultOpeningMethods
5054
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType.apkBundleFileType
5155
import com.raival.compose.file.explorer.screen.main.tab.files.task.ApksMergeTask
5256
import com.raival.compose.file.explorer.screen.main.tab.files.task.ApksMergeTaskParameters
@@ -277,6 +281,18 @@ fun FileOptionsMenuDialog(
277281
tab.unselectAllFiles()
278282
}
279283
}
284+
285+
if (isSingleFile && targetContentHolder is LocalFileHolder) {
286+
FileOption(Icons.Rounded.OpenInNewOff, "Remove default opening method") {
287+
fromJson<DefaultOpeningMethods>(globalClass.preferencesManager.defaultOpeningMethods)?.let {
288+
globalClass.preferencesManager.defaultOpeningMethods =
289+
DefaultOpeningMethods(
290+
it.openingMethods.filter { it.extension != targetContentHolder.file.extension }
291+
).toJson()
292+
}
293+
onDismissRequest()
294+
}
295+
}
280296
}
281297
}
282298
}

app/src/main/java/com/raival/compose/file/explorer/screen/main/tab/files/ui/dialog/OpenWithAppListDialog.kt

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,40 @@ import androidx.compose.foundation.layout.fillMaxWidth
99
import androidx.compose.foundation.layout.padding
1010
import androidx.compose.foundation.lazy.LazyColumn
1111
import androidx.compose.foundation.lazy.itemsIndexed
12+
import androidx.compose.material3.DropdownMenu
13+
import androidx.compose.material3.DropdownMenuItem
1214
import androidx.compose.material3.HorizontalDivider
1315
import androidx.compose.material3.LinearProgressIndicator
1416
import androidx.compose.material3.Text
1517
import androidx.compose.runtime.Composable
1618
import androidx.compose.runtime.LaunchedEffect
19+
import androidx.compose.runtime.getValue
1720
import androidx.compose.runtime.mutableStateListOf
1821
import androidx.compose.runtime.mutableStateOf
1922
import androidx.compose.runtime.remember
2023
import androidx.compose.runtime.rememberCoroutineScope
24+
import androidx.compose.runtime.setValue
2125
import androidx.compose.ui.Modifier
2226
import androidx.compose.ui.platform.LocalContext
2327
import androidx.compose.ui.res.stringResource
2428
import androidx.compose.ui.text.font.FontWeight
2529
import androidx.compose.ui.text.style.TextAlign
2630
import androidx.compose.ui.unit.dp
2731
import androidx.compose.ui.unit.sp
32+
import com.raival.compose.file.explorer.App.Companion.globalClass
2833
import com.raival.compose.file.explorer.R
2934
import com.raival.compose.file.explorer.common.emptyString
35+
import com.raival.compose.file.explorer.common.fromJson
36+
import com.raival.compose.file.explorer.common.toJson
3037
import com.raival.compose.file.explorer.common.ui.BottomSheetDialog
3138
import com.raival.compose.file.explorer.common.ui.DynamicSelectTextField
3239
import com.raival.compose.file.explorer.common.ui.Space
3340
import com.raival.compose.file.explorer.screen.main.tab.files.FilesTab
3441
import com.raival.compose.file.explorer.screen.main.tab.files.holder.LocalFileHolder
3542
import com.raival.compose.file.explorer.screen.main.tab.files.holder.OpenWithActivityHolder
43+
import com.raival.compose.file.explorer.screen.main.tab.files.misc.DefaultOpeningMethods
3644
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileMimeType.anyFileType
45+
import com.raival.compose.file.explorer.screen.main.tab.files.misc.OpeningMethod
3746
import com.raival.compose.file.explorer.screen.main.tab.files.ui.ItemRow
3847
import com.raival.compose.file.explorer.screen.main.tab.files.ui.ItemRowIcon
3948
import kotlinx.coroutines.Dispatchers
@@ -122,10 +131,13 @@ fun OpenWithAppListDialog(
122131

123132
LazyColumn {
124133
itemsIndexed(appsList, key = { index, item -> item.id }) { index, item ->
125-
Modifier
126-
.fillMaxWidth()
134+
var showOptionsMenu by remember(item.id) {
135+
mutableStateOf(false)
136+
}
137+
127138
Column(
128139
Modifier
140+
.fillMaxWidth()
129141
.animateItem()
130142
.combinedClickable(
131143
onClick = {
@@ -135,6 +147,9 @@ fun OpenWithAppListDialog(
135147
item.name
136148
)
137149
onDismissRequest()
150+
},
151+
onLongClick = {
152+
showOptionsMenu = true
138153
}
139154
)
140155
) {
@@ -158,6 +173,35 @@ fun OpenWithAppListDialog(
158173
modifier = Modifier.padding(start = 56.dp),
159174
thickness = 0.5.dp
160175
)
176+
177+
DropdownMenu(
178+
expanded = showOptionsMenu,
179+
onDismissRequest = { showOptionsMenu = false }
180+
) {
181+
DropdownMenuItem(
182+
text = { Text(text = stringResource(R.string.set_as_default_for_this_type)) },
183+
onClick = {
184+
val defOpeningMethods: DefaultOpeningMethods =
185+
fromJson(globalClass.preferencesManager.defaultOpeningMethods)
186+
?: DefaultOpeningMethods()
187+
globalClass.preferencesManager.defaultOpeningMethods =
188+
DefaultOpeningMethods(
189+
(defOpeningMethods.openingMethods.filter { it.extension != contentHolder.extension } + OpeningMethod(
190+
extension = contentHolder.extension,
191+
packageName = item.packageName,
192+
className = item.name
193+
))
194+
).toJson()
195+
contentHolder.openFileWithPackage(
196+
context,
197+
item.packageName,
198+
item.name
199+
)
200+
showOptionsMenu = false
201+
onDismissRequest()
202+
}
203+
)
204+
}
161205
}
162206
}
163207
}

app/src/main/java/com/raival/compose/file/explorer/screen/preferences/PreferencesManager.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.raival.compose.file.explorer.common.fromJson
1414
import com.raival.compose.file.explorer.common.toJson
1515
import com.raival.compose.file.explorer.screen.main.startup.StartupTabs
1616
import com.raival.compose.file.explorer.screen.main.tab.files.holder.ContentHolder
17+
import com.raival.compose.file.explorer.screen.main.tab.files.misc.DefaultOpeningMethods
1718
import com.raival.compose.file.explorer.screen.main.tab.files.misc.FileSortingPrefs
1819
import com.raival.compose.file.explorer.screen.main.tab.files.misc.SortingMethod.SORT_BY_NAME
1920
import com.raival.compose.file.explorer.screen.main.tab.home.data.getDefaultHomeLayout
@@ -122,6 +123,12 @@ class PreferencesManager {
122123
getPreferencesKey = { booleanPreferencesKey(it) }
123124
)
124125

126+
var defaultOpeningMethods by prefMutableState(
127+
keyName = "defaultOpeningMethods",
128+
defaultValue = DefaultOpeningMethods().toJson(),
129+
getPreferencesKey = { stringPreferencesKey(it) }
130+
)
131+
125132
//---------- Text Editor -------------//
126133
var pinLineNumber by prefMutableState(
127134
keyName = "pinLineNumber",

app/src/main/res/values-fa/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,4 +386,5 @@
386386
<string name="line">خط %1$d</string>
387387
<string name="file_too_large_to_edit">حجم این فایل خیلی زیاد است ممکن است برنامه نتواند به خوبی ان را اجرارکند شما میتوانید از یک ویرایشگر حرفه ای کمک بگیرید</string>
388388
<string name="title_activity_video_player">پخش‌کننده ویدیو</string>
389+
<string name="set_as_default_for_this_type">تنظیم به عنوان پیش فرض برای این نوع</string>
389390
</resources>

app/src/main/res/values-pt-rBR/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,4 +386,5 @@
386386
<string name="line">Linha %1$d</string>
387387
<string name="file_too_large_to_edit">Arquivo muito grande, considere usar um editor de texto dedicado em vez disso.</string>
388388
<string name="title_activity_video_player">Player de Vídeo</string>
389+
<string name="set_as_default_for_this_type">Definir como padrão para este tipo</string>
389390
</resources>

app/src/main/res/values-ru/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,4 +386,5 @@
386386
<string name="line">Строка %1$d</string>
387387
<string name="file_too_large_to_edit">Файл слишком большой, рассмотрите возможность использования специального текстового редактора.</string>
388388
<string name="title_activity_video_player">Видеоплеер</string>
389+
<string name="set_as_default_for_this_type">Установить по умолчанию для этого типа</string>
389390
</resources>

app/src/main/res/values-zh/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,4 +386,5 @@
386386
<string name="line">行 %1$d</string>
387387
<string name="file_too_large_to_edit">文件过大,请考虑使用专用文本编辑器。</string>
388388
<string name="title_activity_video_player">视频播放器</string>
389+
<string name="set_as_default_for_this_type">设置为此类型的默认应用</string>
389390
</resources>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,4 +387,5 @@
387387
<string name="line">Line %1$d</string>
388388
<string name="file_too_large_to_edit">File too large, consider using a dedicated text editor instead.</string>
389389
<string name="title_activity_video_player">Vidoe Player</string>
390+
<string name="set_as_default_for_this_type">Set as default for this type</string>
390391
</resources>

0 commit comments

Comments
 (0)