Add license screen to settings page.

This commit is contained in:
Nicholas 2023-05-22 15:35:19 -04:00
parent 92888778c2
commit 61f50cfe60
8 changed files with 131 additions and 0 deletions

View file

@ -4,6 +4,7 @@ plugins {
id 'com.android.application'
id 'kotlin-android'
id 'com.google.protobuf'
id 'com.google.android.gms.oss-licenses-plugin'
id 'androidx.navigation.safeargs'
id 'org.jlleitschuh.gradle.ktlint'
id 'org.jetbrains.kotlin.android'
@ -467,6 +468,7 @@ dependencies {
implementation libs.androidx.legacy.preference
implementation libs.androidx.gridlayout
implementation libs.androidx.exifinterface
implementation libs.androidx.compose.rxjava3
implementation libs.androidx.constraintlayout
implementation libs.androidx.multidex
implementation libs.androidx.navigation.fragment.ktx

View file

@ -44,6 +44,13 @@ class HelpSettingsFragment : DSLSettingsFragment(R.string.preferences__help) {
}
)
clickPref(
title = DSLSettingsText.from(R.string.HelpSettingsFragment__licenses),
onClick = {
Navigation.findNavController(requireView()).safeNavigate(R.id.action_helpSettingsFragment_to_licenseFragment)
}
)
externalLinkPref(
title = DSLSettingsText.from(R.string.HelpSettingsFragment__terms_amp_privacy_policy),
linkId = R.string.terms_and_privacy_policy_url

View file

@ -0,0 +1,72 @@
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.components.settings.app.help
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.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.rxjava3.subscribeAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.fragment.findNavController
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.schedulers.Schedulers
import org.signal.core.ui.Scaffolds
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.compose.ComposeFragment
class LicenseFragment : ComposeFragment() {
private val TAG = Log.tag(LicenseFragment::class.java)
@Composable
override fun FragmentContent() {
val textState: State<String> = Single.fromCallable {
requireContext().resources.openRawResource(R.raw.third_party_licenses).bufferedReader().use { it.readText() }
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeAsState(initial = "")
Scaffolds.Settings(
title = stringResource(id = R.string.HelpSettingsFragment__licenses),
onNavigationClick = findNavController()::popBackStack,
navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24),
navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close)
) {
LicenseScreen(licenseText = textState.value, modifier = Modifier.padding(it))
}
}
}
@Composable
fun LicenseScreen(licenseText: String, modifier: Modifier = Modifier) {
Column(
modifier = modifier
.padding(horizontal = 24.dp)
.verticalScroll(rememberScrollState())
) {
Text(
text = licenseText,
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(vertical = 16.dp)
)
}
}
@Preview
@Composable
fun LicenseFragmentPreview() {
LicenseScreen("Lorem ipsum")
}

View file

@ -409,6 +409,13 @@
app:exitAnim="@anim/fragment_open_exit"
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_close_exit" />
<action
android:id="@+id/action_helpSettingsFragment_to_licenseFragment"
app:destination="@id/licenseFragment"
app:enterAnim="@anim/fragment_open_enter"
app:exitAnim="@anim/fragment_open_exit"
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_close_exit" />
</fragment>
<fragment
@ -423,6 +430,11 @@
app:nullable="false" />
</fragment>
<fragment
android:id="@+id/licenseFragment"
android:name="org.thoughtcrime.securesms.components.settings.app.help.LicenseFragment"
android:label="license_fragment" />
<activity
android:id="@+id/submitDebugLogActivity"
android:name="org.thoughtcrime.securesms.logsubmit.SubmitDebugLogActivity"

View file

@ -4325,6 +4325,8 @@
<string name="HelpSettingsFragment__contact_us">Contact us</string>
<string name="HelpSettingsFragment__version">Version</string>
<string name="HelpSettingsFragment__debug_log">Debug log</string>
<!-- Header for the screen that displays the licenses of the open-source software dependencies of the Signal app-->
<string name="HelpSettingsFragment__licenses">Licenses</string>
<string name="HelpSettingsFragment__terms_amp_privacy_policy">Terms &amp; Privacy Policy</string>
<string name="HelpFragment__copyright_signal_messenger">Copyright Signal Messenger</string>
<string name="HelpFragment__licenced_under_the_agplv3">Licensed under the GNU AGPLv3</string>

View file

@ -21,6 +21,7 @@ buildscript {
classpath 'com.android.tools.build:gradle:7.4.2'
classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.5.3'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.17'
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.6'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath libs.ktlint
classpath 'app.cash.exhaustive:exhaustive-gradle:0.1.1'

View file

@ -27,6 +27,7 @@ dependencyResolutionManagement {
alias('androidx-compose-material3').to('androidx.compose.material3', 'material3').withoutVersion()
alias('androidx-compose-ui-tooling-preview').to('androidx.compose.ui', 'ui-tooling-preview').withoutVersion()
alias('androidx-compose-ui-tooling-core').to('androidx.compose.ui', 'ui-tooling').withoutVersion()
alias('androidx-compose-rxjava3').to('androidx.compose.runtime:runtime-rxjava3:1.4.2')
alias('ktlint-twitter-compose').to('com.twitter.compose.rules:ktlint:0.0.26')
// Accompanist

View file

@ -572,6 +572,22 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="e7ec58f6c62c49f04f1f75eeeb82356016e37e7093f7ed9882e678e1f251863f" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime" version="1.4.2">
<artifact name="runtime-1.4.2.aar">
<sha256 value="41ff5a9fbbcb8a7403345b5426e454d73278878d469b088893ecb917cc7fd84c" origin="Generated by Gradle"/>
</artifact>
<artifact name="runtime-1.4.2.module">
<sha256 value="328c920d5c707fa7ee885cf8c81e4a228d6f9db3dd0d93bf334eead762b6da7f" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime-rxjava3" version="1.4.2">
<artifact name="runtime-rxjava3-1.4.2.aar">
<sha256 value="685877e672f95cf7368ada6e3af07eee107529b6962bf2272b4b1c8d22da7200" origin="Generated by Gradle"/>
</artifact>
<artifact name="runtime-rxjava3-1.4.2.module">
<sha256 value="3882039985f75cdad43e6bda258e222ca943181729d5783c5958dfb5e87f8b24" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime-saveable" version="1.0.1">
<artifact name="runtime-saveable-1.0.1.module">
<sha256 value="c0d6f142542d8d74f65481ef6526d2be265f01f812a112948fcde87a458f4fb6" origin="Generated by Gradle"/>
@ -593,6 +609,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="93c8a47a9333f2e274941228cf06cefe6c8be88f49a58b13a0416dcae1872507" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime-saveable" version="1.4.2">
<artifact name="runtime-saveable-1.4.2.aar">
<sha256 value="aedd018f6dd11a5c0883d730066611016ed30dfb13692630f529876a52e5ec54" origin="Generated by Gradle"/>
</artifact>
<artifact name="runtime-saveable-1.4.2.module">
<sha256 value="3677ee9c263f671944711b36e2455b4cde9e83c9266508cd2a45d9dc01a3abc6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui" version="1.0.1">
<artifact name="ui-1.0.1.module">
<sha256 value="57031a6ac9b60e5b56792ebf5cde6e16812ff566ed9190cbd188b00b46c13779" origin="Generated by Gradle"/>
@ -3103,6 +3127,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="96f6e6d9f5e5db840ee3da20449e16828ed4ba2c07783dde3397d13aaf814e19" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.android.gms" name="oss-licenses-plugin" version="0.10.6">
<artifact name="oss-licenses-plugin-0.10.6.jar">
<sha256 value="4da482ab65264b1e09b0d9c18c314398aed6639c84acf80f2df07b10da413675" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.android.gms" name="play-services-auth" version="20.3.0">
<artifact name="play-services-auth-20.3.0.aar">
<sha256 value="657f3bf85af4970f94bd6b87bdf2e67e7bfbdaacfd9635974826bcc634bda8a6" origin="Generated by Gradle"/>
@ -3416,6 +3445,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="cf697452fbe7f6bdfdf65043797a16cd627b1dd4248be4b572fcb73f8c032cc0" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.protobuf" name="protobuf-java" version="3.19.1">
<artifact name="protobuf-java-3.19.1.jar">
<sha256 value="24f7d0d91797ed230a6d3da93cd80590a4c3aa9a27249f6025b5c6da078edde7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.protobuf" name="protobuf-java-util" version="3.17.2">
<artifact name="protobuf-java-util-3.17.2.jar">
<sha256 value="849925333aac23f46f9a154a52e441117017d5673e04e5636993bcc3cf1924d9" origin="Generated by Gradle"/>