Browse Source

Show open source library license in a custom screen (#9645)

Show open source library license in a custom screen.
Alessandro Jean 1 year ago
parent
commit
6ed2748846

+ 1 - 1
app/src/main/java/eu/kanade/presentation/more/settings/screen/AboutScreen.kt

@@ -129,7 +129,7 @@ object AboutScreen : Screen() {
                 item {
                     TextPreferenceWidget(
                         title = stringResource(R.string.licenses),
-                        onPreferenceClick = { navigator.push(LicensesScreen()) },
+                        onPreferenceClick = { navigator.push(OpenSourceLicensesScreen()) },
                     )
                 }
 

+ 94 - 0
app/src/main/java/eu/kanade/presentation/more/settings/screen/OpenSourceLibraryLicenseScreen.kt

@@ -0,0 +1,94 @@
+package eu.kanade.presentation.more.settings.screen
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ArrowBack
+import androidx.compose.material.icons.filled.Public
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
+import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalUriHandler
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+import androidx.core.text.HtmlCompat
+import cafe.adriel.voyager.navigator.LocalNavigator
+import cafe.adriel.voyager.navigator.currentOrThrow
+import com.google.android.material.textview.MaterialTextView
+import eu.kanade.presentation.components.AppBar
+import eu.kanade.presentation.components.AppBarActions
+import eu.kanade.presentation.util.Screen
+import eu.kanade.tachiyomi.R
+import tachiyomi.presentation.core.components.material.Scaffold
+
+class OpenSourceLibraryLicenseScreen(
+    private val name: String,
+    private val website: String?,
+    private val license: String,
+) : Screen() {
+
+    @Composable
+    override fun Content() {
+        val navigator = LocalNavigator.currentOrThrow
+        val uriHandler = LocalUriHandler.current
+
+        Scaffold(
+            topBar = {
+                TopAppBar(
+                    title = {
+                        Text(
+                            text = name,
+                            maxLines = 1,
+                        )
+                    },
+                    navigationIcon = {
+                        IconButton(onClick = navigator::pop) {
+                            Icon(imageVector = Icons.Default.ArrowBack, contentDescription = null)
+                        }
+                    },
+                    actions = {
+                        if (!website.isNullOrEmpty()) {
+                            AppBarActions(
+                                listOf(
+                                    AppBar.Action(
+                                        title = stringResource(R.string.website),
+                                        icon = Icons.Default.Public,
+                                        onClick = { uriHandler.openUri(website) },
+                                    ),
+                                ),
+                            )
+                        }
+                    },
+                    scrollBehavior = it,
+                )
+            },
+        ) { contentPadding ->
+            Column(
+                modifier = Modifier
+                    .verticalScroll(rememberScrollState())
+                    .padding(contentPadding)
+                    .padding(16.dp),
+            ) {
+                HtmlLicenseText(html = license)
+            }
+        }
+    }
+
+    @Composable
+    private fun HtmlLicenseText(html: String) {
+        AndroidView(
+            factory = {
+                MaterialTextView(it)
+            },
+            update = {
+                it.text = HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_COMPACT)
+            },
+        )
+    }
+}

+ 10 - 1
app/src/main/java/eu/kanade/presentation/more/settings/screen/LicensesScreen.kt → app/src/main/java/eu/kanade/presentation/more/settings/screen/OpenSourceLicensesScreen.kt

@@ -9,12 +9,13 @@ import cafe.adriel.voyager.navigator.LocalNavigator
 import cafe.adriel.voyager.navigator.currentOrThrow
 import com.mikepenz.aboutlibraries.ui.compose.LibrariesContainer
 import com.mikepenz.aboutlibraries.ui.compose.LibraryDefaults
+import com.mikepenz.aboutlibraries.ui.compose.util.htmlReadyLicenseContent
 import eu.kanade.presentation.components.AppBar
 import eu.kanade.presentation.util.Screen
 import eu.kanade.tachiyomi.R
 import tachiyomi.presentation.core.components.material.Scaffold
 
-class LicensesScreen : Screen() {
+class OpenSourceLicensesScreen : Screen() {
 
     @Composable
     override fun Content() {
@@ -38,6 +39,14 @@ class LicensesScreen : Screen() {
                     badgeBackgroundColor = MaterialTheme.colorScheme.primary,
                     badgeContentColor = MaterialTheme.colorScheme.onPrimary,
                 ),
+                onLibraryClick = {
+                    val libraryLicenseScreen = OpenSourceLibraryLicenseScreen(
+                        name = it.name,
+                        website = it.website,
+                        license = it.licenses.firstOrNull()?.htmlReadyLicenseContent.orEmpty(),
+                    )
+                    navigator.push(libraryLicenseScreen)
+                },
             )
         }
     }