Skip to content

Commit 9f054e5

Browse files
committed
Plainapp as default pdf viewer #205
1 parent 7f09450 commit 9f054e5

File tree

4 files changed

+49
-24
lines changed

4 files changed

+49
-24
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
android:name=".MainApp"
9797
android:allowBackup="true"
9898
android:enableOnBackInvokedCallback="true"
99+
android:banner="@mipmap/ic_launcher"
99100
android:icon="@mipmap/ic_launcher"
100101
android:label="@string/app_name"
101102
android:largeHeap="true"
@@ -122,13 +123,23 @@
122123
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
123124
</intent-filter>
124125

125-
<!-- <intent-filter>-->
126-
<!-- <action android:name="android.intent.action.VIEW" />-->
127-
<!-- <category android:name="android.intent.category.DEFAULT" />-->
128-
<!-- <data android:scheme="content" />-->
129-
<!-- <data android:scheme="file" />-->
130-
<!-- <data android:mimeType="*/*" />-->
131-
<!-- </intent-filter>-->
126+
<!-- Support for text files -->
127+
<intent-filter>
128+
<action android:name="android.intent.action.VIEW" />
129+
<category android:name="android.intent.category.DEFAULT" />
130+
<data android:scheme="content" />
131+
<data android:scheme="file" />
132+
<data android:mimeType="text/*" />
133+
</intent-filter>
134+
135+
<!-- Support for PDF files -->
136+
<intent-filter>
137+
<action android:name="android.intent.action.VIEW" />
138+
<category android:name="android.intent.category.DEFAULT" />
139+
<data android:scheme="content" />
140+
<data android:scheme="file" />
141+
<data android:mimeType="application/pdf" />
142+
</intent-filter>
132143

133144
<intent-filter>
134145
<action android:name="android.intent.action.SEND" />

app/src/main/java/com/ismartcoding/plain/ui/MainActivity.kt

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import com.ismartcoding.lib.isTPlus
4747
import com.ismartcoding.lib.logcat.LogCat
4848
import com.ismartcoding.plain.BuildConfig
4949
import com.ismartcoding.plain.R
50-
import com.ismartcoding.plain.data.DPlaylistAudio
5150
import com.ismartcoding.plain.db.DMessageContent
5251
import com.ismartcoding.plain.db.DMessageText
5352
import com.ismartcoding.plain.db.DMessageType
@@ -99,6 +98,7 @@ import com.ismartcoding.plain.ui.models.AudioPlaylistViewModel
9998
import com.ismartcoding.plain.ui.models.MainViewModel
10099
import com.ismartcoding.plain.ui.nav.Routing
101100
import com.ismartcoding.plain.ui.nav.navigatePdf
101+
import com.ismartcoding.plain.ui.nav.navigateTextFile
102102
import com.ismartcoding.plain.ui.page.Main
103103
import com.ismartcoding.plain.web.HttpServerManager
104104
import com.ismartcoding.plain.web.models.toModel
@@ -463,23 +463,15 @@ class MainActivity : AppCompatActivity() {
463463
if (uri != null) {
464464
val mimeType = contentResolver.getType(uri)
465465
if (mimeType != null) {
466-
if (mimeType.startsWith("audio/") ||
467-
setOf("application/ogg", "application/x-ogg", "application/itunes").contains(mimeType)
468-
) {
469-
Permissions.checkNotification(this@MainActivity, R.string.audio_notification_prompt) {
470-
AudioPlayer.play(this@MainActivity, DPlaylistAudio.fromPath(this@MainActivity, uri.toString()))
471-
}
472-
} else if (mimeType.startsWith("text/")) {
473-
// TextEditorDialog(uri).show()
474-
} else if (mimeType.startsWith("image/") || mimeType.startsWith("video/")) {
475-
// val link = uri.toString()
476-
// PreviewDialog().show(
477-
// items = arrayListOf(PreviewItem(link, uri)),
478-
// initKey = link,
479-
// )
466+
if (mimeType.startsWith("text/")) {
467+
navControllerState.value?.navigateTextFile(uri.toString())
480468
} else if (mimeType == "application/pdf") {
481469
navControllerState.value?.navigatePdf(uri)
470+
} else {
471+
DialogHelper.showMessage(LocaleHelper.getString(R.string.not_supported_error))
482472
}
473+
} else {
474+
DialogHelper.showMessage(LocaleHelper.getString(R.string.not_supported_error))
483475
}
484476
}
485477
} else if (intent.action == Intent.ACTION_SEND) {

app/src/main/java/com/ismartcoding/plain/ui/models/TextFileViewModel.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ismartcoding.plain.ui.models
22

33
import android.content.Context
4+
import android.net.Uri
45
import android.webkit.WebView
56
import androidx.compose.runtime.mutableStateOf
67
import androidx.lifecycle.ViewModel
@@ -26,6 +27,7 @@ class TextFileViewModel : ViewModel() {
2627
val webView = mutableStateOf<WebView?>(null)
2728
val content = mutableStateOf("")
2829
val oldContent = mutableStateOf<String?>(null)
30+
val isExternalFile = mutableStateOf(false)
2931

3032
suspend fun loadConfigAsync(context: Context) {
3133
wrapContent.value = EditorWrapContentPreference.getAsync(context)
@@ -36,7 +38,21 @@ class TextFileViewModel : ViewModel() {
3638
if (mediaId.isNotEmpty()) {
3739
file.value = FileMediaStoreHelper.getByIdAsync(context, mediaId)
3840
}
39-
content.value = File(path).readText()
41+
42+
// Set external file flag
43+
isExternalFile.value = path.startsWith("content://")
44+
45+
// Handle content:// URIs and regular file paths
46+
content.value = if (path.startsWith("content://")) {
47+
// For content:// URIs, use ContentResolver
48+
val uri = Uri.parse(path)
49+
context.contentResolver.openInputStream(uri)?.use { inputStream ->
50+
inputStream.bufferedReader().readText()
51+
} ?: ""
52+
} else {
53+
// For regular file paths, use File.readText()
54+
File(path).readText()
55+
}
4056
} catch (e: Exception) {
4157
DialogHelper.showErrorDialog(e.toString())
4258
LogCat.e(e.toString())

app/src/main/java/com/ismartcoding/plain/ui/page/TextFilePage.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ fun TextFilePage(
9494
return@PTopAppBar
9595
}
9696
if (textFileVM.readOnly.value) {
97-
if (type != TextFileType.APP_LOG.name) {
97+
if (type != TextFileType.APP_LOG.name && !textFileVM.isExternalFile.value) {
9898
PIconButton(
9999
icon = R.drawable.square_pen,
100100
contentDescription = stringResource(R.string.edit),
@@ -110,6 +110,12 @@ fun TextFilePage(
110110
tint = MaterialTheme.colorScheme.onSurface,
111111
) {
112112
scope.launch {
113+
// Prevent saving external files (content URIs)
114+
if (textFileVM.isExternalFile.value) {
115+
DialogHelper.showMessage(R.string.not_supported_error)
116+
return@launch
117+
}
118+
113119
DialogHelper.showLoading()
114120
withIO { File(path).writeText(textFileVM.content.value) }
115121
textFileVM.oldContent.value = textFileVM.content.value

0 commit comments

Comments
 (0)