Skip to content

Commit

Permalink
Add OpenLink Option (#428)
Browse files Browse the repository at this point in the history
  • Loading branch information
S-H-Y-A committed Sep 9, 2023
1 parent ddd7284 commit 8c1b4fc
Show file tree
Hide file tree
Showing 18 changed files with 395 additions and 48 deletions.
4 changes: 4 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ dependencies {
implementation "androidx.paging:paging-runtime:$paging"
implementation "androidx.paging:paging-compose:1.0.0-alpha14"

// https://developer.android.com/jetpack/androidx/releases/paging
implementation "androidx.browser:browser:1.5.0"

// https://developer.android.com/jetpack/androidx/releases/navigation
implementation "androidx.navigation:navigation-compose:$navigation"

Expand Down Expand Up @@ -187,4 +190,5 @@ dependencies {
testImplementation "junit:junit:4.13.2"
androidTestImplementation "androidx.test.ext:junit:1.1.3"
androidTestImplementation "androidx.test.espresso:espresso-core:3.4.0"

}
12 changes: 11 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.APP_BROWSER" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
</intent>
</queries>

<application
android:name=".RYApp"
android:allowBackup="true"
Expand Down Expand Up @@ -41,4 +51,4 @@
</provider>
</application>

</manifest>
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package me.ash.reader.data.model.preference

import android.content.Context
import androidx.compose.ui.text.style.Hyphens.Companion.Auto
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.R
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put

sealed class OpenLinkPreference(val value: Int) : Preference() {
object AutoPreferCustomTabs : OpenLinkPreference(0)
object AutoPreferDefaultBrowser : OpenLinkPreference(1)
object CustomTabs : OpenLinkPreference(2)
object DefaultBrowser : OpenLinkPreference(3)
object SpecificBrowser: OpenLinkPreference(4)
object AlwaysAsk: OpenLinkPreference(5)

override fun put(context: Context, scope: CoroutineScope) {
scope.launch {
context.dataStore.put(
DataStoreKeys.OpenLink,
value
)
}
}

fun toDesc(context: Context): String =
when (this) {
AutoPreferCustomTabs -> context.getString(R.string.auto_customtabs)
AutoPreferDefaultBrowser -> context.getString(R.string.auto_default_browser)
CustomTabs -> context.getString(R.string.custom_tabs)
DefaultBrowser -> context.getString(R.string.default_browser)
SpecificBrowser -> context.getString(R.string.specific_browser)
AlwaysAsk -> context.getString(R.string.always_ask)
}

companion object {

val default = CustomTabs
val values = listOf(AutoPreferCustomTabs, AutoPreferDefaultBrowser, CustomTabs, DefaultBrowser, SpecificBrowser, AlwaysAsk)

fun fromPreferences(preferences: Preferences) =
when (preferences[DataStoreKeys.OpenLink.key]) {
0 -> AutoPreferCustomTabs
1 -> AutoPreferDefaultBrowser
2 -> CustomTabs
3 -> DefaultBrowser
4 -> SpecificBrowser
5 -> AlwaysAsk
else -> AutoPreferCustomTabs
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package me.ash.reader.data.model.preference

import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.R
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put

data class OpenLinkSpecificBrowserPreference(
val packageName: String?
) : Preference() {

override fun put(context: Context, scope: CoroutineScope) {
scope.launch {
context.dataStore.put(
DataStoreKeys.OpenLinkAppSpecificBrowser,
packageName.orEmpty()
)
}
}

fun toDesc(context: Context): String {
val pm = context.packageManager
return runCatching {
pm.run {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
getApplicationInfo(
this@OpenLinkSpecificBrowserPreference.packageName!!,
PackageManager.ApplicationInfoFlags.of(0)
)
} else {
getApplicationInfo(this@OpenLinkSpecificBrowserPreference.packageName!!, 0)
}
}
}.map {
it.loadLabel(pm)
}.getOrDefault(context.getString(R.string.open_link_specific_browser_not_selected)).let {
context.getString(R.string.specific_browser_name, it)
}
}

companion object {
val default = OpenLinkSpecificBrowserPreference(null)
fun fromPreferences(preferences: Preferences): OpenLinkSpecificBrowserPreference {
val packageName = preferences[DataStoreKeys.OpenLinkAppSpecificBrowser.key]
return OpenLinkSpecificBrowserPreference(packageName)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ fun Preferences.toSettings(): Settings {
// Interaction
initialPage = InitialPagePreference.fromPreferences(this),
initialFilter = InitialFilterPreference.fromPreferences(this),
openLink = OpenLinkPreference.fromPreferences(this),
openLinkSpecificBrowser = OpenLinkSpecificBrowserPreference.fromPreferences(this),

// Languages
languages = LanguagesPreference.fromPreferences(this),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ data class Settings(
// Interaction
val initialPage: InitialPagePreference = InitialPagePreference.default,
val initialFilter: InitialFilterPreference = InitialFilterPreference.default,
val openLink: OpenLinkPreference = OpenLinkPreference.default,
val openLinkSpecificBrowser: OpenLinkSpecificBrowserPreference = OpenLinkSpecificBrowserPreference.default,

// Languages
val languages: LanguagesPreference = LanguagesPreference.default,
Expand Down Expand Up @@ -172,6 +174,10 @@ val LocalReadingImageMaximize =
val LocalInitialPage = compositionLocalOf<InitialPagePreference> { InitialPagePreference.default }
val LocalInitialFilter =
compositionLocalOf<InitialFilterPreference> { InitialFilterPreference.default }
val LocalOpenLink =
compositionLocalOf<OpenLinkPreference> { OpenLinkPreference.default }
val LocalOpenLinkSpecificBrowser =
compositionLocalOf { OpenLinkSpecificBrowserPreference.default }

// Languages
val LocalLanguages =
Expand Down Expand Up @@ -253,6 +259,8 @@ fun SettingsProvider(
// Interaction
LocalInitialPage provides settings.initialPage,
LocalInitialFilter provides settings.initialFilter,
LocalOpenLink provides settings.openLink,
LocalOpenLinkSpecificBrowser provides settings.openLinkSpecificBrowser,

// Languages
LocalLanguages provides settings.languages,
Expand Down
12 changes: 6 additions & 6 deletions app/src/main/java/me/ash/reader/ui/component/base/WebView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import me.ash.reader.data.model.preference.LocalOpenLink
import me.ash.reader.data.model.preference.LocalOpenLinkSpecificBrowser
import me.ash.reader.ui.ext.openURL

const val INJECTION_TOKEN = "/android_asset_font/"

Expand All @@ -21,6 +24,8 @@ fun WebView(
onReceivedError: (error: WebResourceError?) -> Unit = {},
) {
val context = LocalContext.current
val openLink = LocalOpenLink.current
val openLinkSpecificBrowser = LocalOpenLinkSpecificBrowser.current
val color = MaterialTheme.colorScheme.onSurfaceVariant.toArgb()
val backgroundColor = MaterialTheme.colorScheme.surface.toArgb()
val webViewClient by remember {
Expand Down Expand Up @@ -67,12 +72,7 @@ fun WebView(
): Boolean {
if (null == request?.url) return false
val url = request.url.toString()
if (url.isNotEmpty()) context.startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse(url)
)
)
if (url.isNotEmpty()) context.openURL(url, openLink, openLinkSpecificBrowser)
return true
}

Expand Down
17 changes: 8 additions & 9 deletions app/src/main/java/me/ash/reader/ui/component/reader/Reader.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,28 +25,27 @@ import android.content.Intent
import android.net.Uri
import android.util.Log
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.runtime.Composable
import me.ash.reader.R

import me.ash.reader.data.model.preference.LocalOpenLink
import me.ash.reader.data.model.preference.LocalOpenLinkSpecificBrowser
import me.ash.reader.data.model.preference.OpenLinkPreference
import me.ash.reader.data.model.preference.OpenLinkSpecificBrowserPreference
import me.ash.reader.ui.ext.openURL
@Suppress("FunctionName")
fun LazyListScope.Reader(
context: Context,
subheadUpperCase: Boolean = false,
link: String,
content: String,
onLinkClick: (String) -> Unit
) {
Log.i("RLog", "Reader: ")
htmlFormattedText(
inputStream = content.byteInputStream(),
subheadUpperCase = subheadUpperCase,
baseUrl = link,
imagePlaceholder = R.drawable.ic_launcher_foreground,
onLinkClick = {
context.startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse(it)
)
)
}
onLinkClick = onLinkClick
)
}

0 comments on commit 8c1b4fc

Please sign in to comment.