Skip to content

Commit

Permalink
Add terms and privacy policy dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
ismartcoding committed Feb 21, 2024
1 parent 5fb4f3a commit ea49b6c
Show file tree
Hide file tree
Showing 21 changed files with 136 additions and 7 deletions.
10 changes: 5 additions & 5 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -153,26 +153,26 @@ dependencies {
val kgraphql = "0.19.0"
val ktor = "3.0.0-beta-1"
val media3 = "1.2.1"
val compose = "1.6.0"
val compose = "1.6.1"

implementation(platform("androidx.compose:compose-bom:2023.10.01"))
implementation(platform("androidx.compose:compose-bom:2024.01.00"))

// https://github.com/google/accompanist/releases
implementation("androidx.activity:activity-compose:1.8.2")
implementation("androidx.compose.runtime:runtime:$compose")
implementation("androidx.compose.ui:ui:$compose")
implementation("androidx.compose.foundation:foundation:$compose")
implementation("androidx.compose.foundation:foundation-layout:$compose")
implementation("androidx.compose.material3:material3:1.2.0-rc01")
implementation("androidx.compose.material3:material3:1.2.0")
implementation("androidx.compose.material:material-icons-extended:$compose")
implementation("com.google.accompanist:accompanist-drawablepainter:0.34.0")
// implementation("androidx.constraintlayout:constraintlayout-compose:1.1.0-alpha12")

// https://developer.android.com/jetpack/androidx/releases/navigation
implementation("androidx.navigation:navigation-compose:2.7.6")
implementation("androidx.navigation:navigation-compose:2.7.7")

releaseImplementation(platform("com.google.firebase:firebase-bom:32.2.3"))
releaseImplementation("com.google.firebase:firebase-crashlytics-ktx:18.6.1")
releaseImplementation("com.google.firebase:firebase-crashlytics-ktx:18.6.2")

// Media3
implementation("androidx.media3:media3-exoplayer:$media3")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,11 @@ object WebPreference : BasePreference<Boolean>() {
}
}

object AgreeTermsPreference : BasePreference<Boolean>() {
override val default = false
override val key = booleanPreferencesKey("agree_terms")
}

object ExchangeRatePreference : BasePreference<String>() {
override val default = ""
override val key = stringPreferencesKey("exchange")
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/java/com/ismartcoding/plain/helpers/UrlHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,12 @@ object UrlHelper {

return "https://policy.plain.icu/policy.html"
}

fun getTermsUrl(): String {
if (BuildConfig.CHANNEL == AppChannelType.CHINA.name) {
return "https://policy.plain.icu/policy-cn.html"
}

return "https://policy.plain.icu/terms.html"
}
}
63 changes: 61 additions & 2 deletions app/src/main/java/com/ismartcoding/plain/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,20 @@ package com.ismartcoding.plain.ui

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.database.CursorWindow
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.text.SpannableString
import android.text.Spanned
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.view.View
import android.view.WindowManager
import android.widget.TextView
import android.widget.Toast
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
Expand All @@ -26,14 +33,18 @@ import com.ismartcoding.lib.channel.receiveEvent
import com.ismartcoding.lib.channel.sendEvent
import com.ismartcoding.lib.extensions.*
import com.ismartcoding.lib.helpers.CoroutinesHelper.coIO
import com.ismartcoding.lib.helpers.CoroutinesHelper.coMain
import com.ismartcoding.lib.helpers.CoroutinesHelper.withIO
import com.ismartcoding.lib.logcat.LogCat
import com.ismartcoding.plain.BuildConfig
import com.ismartcoding.plain.R
import com.ismartcoding.plain.data.*
import com.ismartcoding.plain.data.enums.AppChannelType
import com.ismartcoding.plain.data.enums.ExportFileType
import com.ismartcoding.plain.data.enums.Language
import com.ismartcoding.plain.data.enums.PickFileTag
import com.ismartcoding.plain.data.enums.PickFileType
import com.ismartcoding.plain.data.preference.AgreeTermsPreference
import com.ismartcoding.plain.data.preference.KeepScreenOnPreference
import com.ismartcoding.plain.data.preference.SettingsProvider
import com.ismartcoding.plain.data.preference.SystemScreenTimeoutPreference
Expand All @@ -45,12 +56,14 @@ import com.ismartcoding.plain.features.locale.LocaleHelper
import com.ismartcoding.plain.features.locale.LocaleHelper.getStringF
import com.ismartcoding.plain.helpers.AppHelper
import com.ismartcoding.plain.helpers.ScreenHelper
import com.ismartcoding.plain.helpers.UrlHelper
import com.ismartcoding.plain.mediaProjectionManager
import com.ismartcoding.plain.services.NotificationListenerMonitorService
import com.ismartcoding.plain.services.ScreenMirrorService
import com.ismartcoding.plain.ui.extensions.*
import com.ismartcoding.plain.ui.helpers.DialogHelper
import com.ismartcoding.plain.ui.helpers.FilePickHelper
import com.ismartcoding.plain.ui.helpers.WebHelper
import com.ismartcoding.plain.ui.models.MainViewModel
import com.ismartcoding.plain.ui.models.ShowMessageEvent
import com.ismartcoding.plain.ui.page.Main
Expand All @@ -63,6 +76,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.lang.ref.WeakReference
import kotlin.system.exitProcess

class MainActivity : AppCompatActivity() {
private var pickFileType = PickFileType.IMAGE
Expand Down Expand Up @@ -159,11 +173,18 @@ class MainActivity : AppCompatActivity() {
}
}

checkNotificationPermission()

AudioPlayer.ensurePlayer(this@MainActivity)
coIO {
try {
if (BuildConfig.CHANNEL == AppChannelType.CHINA.name && !AgreeTermsPreference.getAsync(this@MainActivity)) {
coMain {
showTermsAndPrivacyDialog(this@MainActivity)
}
} else {
coMain {
checkNotificationPermission()
}
}
startService(Intent(this@MainActivity, NotificationListenerMonitorService::class.java))
} catch (ex: Exception) {
LogCat.e(ex.toString())
Expand Down Expand Up @@ -323,6 +344,44 @@ class MainActivity : AppCompatActivity() {
pickFileActivityLauncher.launch(FilePickHelper.getPickFileIntent(event.multiple))
}

private fun showTermsAndPrivacyDialog(context: Context) {
val message = "请您认真阅读《用户协议》和《隐私政策》的全部条款,接受后可开始使用我们的服务。"

val startIndexUserAgreement = message.indexOf("《用户协议》")
val startIndexPrivacyPolicy = message.indexOf("《隐私政策》")

val spannableString = SpannableString(message)
spannableString.setSpan(object : ClickableSpan() {
override fun onClick(widget: View) {
WebHelper.open(context, UrlHelper.getTermsUrl())
}
}, startIndexUserAgreement, startIndexUserAgreement + 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
spannableString.setSpan(object : ClickableSpan() {
override fun onClick(widget: View) {
WebHelper.open(context, UrlHelper.getPolicyUrl())
}
}, startIndexPrivacyPolicy, startIndexPrivacyPolicy + 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
val dialog = MaterialAlertDialogBuilder(context)
.setTitle("温馨提示")
.setCancelable(false)
.setPositiveButton("同意并继续") { _, _ ->
checkNotificationPermission()
coIO {
AgreeTermsPreference.putAsync(context, true)
}
}
.setNegativeButton("不同意") { _, _ ->
exitProcess(0)
}
.create()

dialog.setView(TextView(context).apply {
text = spannableString
movementMethod = LinkMovementMethod.getInstance()
}, context.dp2px(24), context.dp2px(28), context.dp2px(24), context.dp2px(28))
dialog.show()
}

companion object {
lateinit var instance: WeakReference<MainActivity>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,13 @@ fun AboutPage(
WebHelper.open(context, "https://ko-fi.com/ismartcoding")
},
)
PListItem(
title = stringResource(R.string.terms_of_use),
showMore = true,
onClick = {
WebHelper.open(context, UrlHelper.getTermsUrl())
},
)
PListItem(
title = stringResource(R.string.privacy_policy),
showMore = true,
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-bn/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">পাসওয়ার্ড তৈরি করুন</string>
<string name="allow_remote_access_from_pc">পিসি থেকে দূরবর্তী অ্যাক্সেস অনুমোদন দিন</string>
<string name="privacy_policy">গোপনীয়তা নীতি</string>
<string name="terms_of_use">ব্যবহারের শর্তাবলী</string>
<string name="grant_permission">অনুমতি দান করুন</string>
<string name="system_alert_window_warning">‘অন্য অ্যাপস উপর প্রদর্শন’ অনুমতি দেওয়া গুরুত্বপূর্ণ। এই অনুমতি না থাকলে, যদি অ্যাপটি ব্যাকগ্রাউন্ডে চলছে, আপনি অ্যাপ দ্বারা সৃষ্টিকৃত মৌলিক সিস্টেম ডায়ালগ, যেমন অনইনস্টলেশন নিশ্চিতকরণ ডায়ালগ, অনুমতি দেওয়া না থাকলে আপনি এটি হারতে পারেন।</string>
<string name="advanced_https">এইচটিপিএস (উন্নত)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">Passwort generieren</string>
<string name="allow_remote_access_from_pc">Remote-Zugriff vom PC erlauben</string>
<string name="privacy_policy">Datenschutzrichtlinie</string>
<string name="terms_of_use">Nutzungsbedingungen</string>
<string name="grant_permission">Berechtigung erteilen</string>
<string name="system_alert_window_warning">Die Gewährung der \'Über anderen Apps anzeigen\'-Berechtigung ist unerlässlich. Ohne diese Berechtigung könnten bei laufender App im Hintergrund wichtige Systemdialoge, wie etwa Deinstallationsbestätigungsdialoge, übersehen werden.</string>
<string name="advanced_https">HTTPS (Fortgeschritten)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">Generar contraseña</string>
<string name="allow_remote_access_from_pc">Permitir acceso remoto desde PC</string>
<string name="privacy_policy">Política de privacidad</string>
<string name="terms_of_use">Términos de uso</string>
<string name="grant_permission">Conceder permiso</string>
<string name="system_alert_window_warning">Conceder el permiso de \'Mostrar sobre otras aplicaciones\' es esencial. Sin este permiso, si la aplicación se está ejecutando en segundo plano, podrías perder diálogos cruciales del sistema provocados por la aplicación, como los diálogos de confirmación de desinstalación.</string>
<string name="advanced_https">HTTPS (Avanzado)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-fr/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">Générer un mot de passe</string>
<string name="allow_remote_access_from_pc">Autoriser l\'accès à distance depuis un PC</string>
<string name="privacy_policy">Politique de confidentialité</string>
<string name="terms_of_use">Conditions d\'utilisation</string>
<string name="grant_permission">Accorder l\'autorisation</string>
<string name="system_alert_window_warning">Accorder l\'autorisation \'Affichage par-dessus d\'autres applications\' est essentiel. Sans cette autorisation, si l\'application est en cours d\'exécution en arrière-plan, vous pourriez manquer des dialogues système cruciaux déclenchés par l\'application, tels que les dialogues de confirmation de désinstallation.</string>
<string name="advanced_https">HTTPS (Avancé)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-hi/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">पासवर्ड बनाएं</string>
<string name="allow_remote_access_from_pc">पीसी से दूरस्थ पहुंच की अनुमति दें</string>
<string name="privacy_policy">गोपनीयता नीति</string>
<string name="terms_of_use">उपयोग की शर्तें</string>
<string name="grant_permission">अनुमति प्रदान करें</string>
<string name="system_alert_window_warning">‘अन्य एप्लिकेशन्स पर प्रदर्शन’ अनुमति देना अत्यंत आवश्यक है। इस अनुमति के बिना, यदि ऐप बैकग्राउंड में चल रहा है, तो आप एप्लिकेशन द्वारा उत्पन्न होने वाले महत्वपूर्ण सिस्टम डायलॉग, जैसे कि अनइंस्टॉल की पुष्टि करने वाले डायलॉग, को छू सकते हैं।</string>
<string name="advanced_https">एचटीटपीएस (उन्नत)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-it/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">Genera password</string>
<string name="allow_remote_access_from_pc">Consenti l\'accesso remoto dal PC</string>
<string name="privacy_policy">Informativa sulla privacy</string>
<string name="terms_of_use">Termini di utilizzo</string>
<string name="grant_permission">Concedi il permesso</string>
<string name="system_alert_window_warning">Concedere il permesso \'Mostra sopra le altre app\' è essenziale. Senza questo permesso, se l\'app è in esecuzione in background, potresti perdere dialoghi di sistema cruciali generati dall\'app, come i dialoghi di conferma della disinstallazione.</string>
<string name="advanced_https">HTTPS (Avanzato)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-ja/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">パスワードを生成</string>
<string name="allow_remote_access_from_pc">PCからのリモートアクセスを許可する</string>
<string name="privacy_policy">プライバシーポリシー</string>
<string name="terms_of_use">利用規約</string>
<string name="grant_permission">許可を付与</string>
<string name="system_alert_window_warning">「他のアプリの上に表示」の許可を付与することが不可欠です。この許可がないと、アプリがバックグラウンドで実行されている場合に、アンインストール確認ダイアログなど、アプリによってトリガーされた重要なシステムダイアログが見逃される可能性があります。</string>
<string name="advanced_https">HTTPS(高度)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-ko/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">비밀번호 생성</string>
<string name="allow_remote_access_from_pc">PC에서 원격 액세스 허용</string>
<string name="privacy_policy">개인 정보 보호 정책</string>
<string name="terms_of_use">이용 약관</string>
<string name="grant_permission">권한 부여</string>
<string name="system_alert_window_warning">\'다른 앱 위에 표시\' 권한을 부여하는 것이 중요합니다. 이 권한이 없으면 앱이 백그라운드에서 실행 중인 경우 앱에 의해 생성된 중요한 시스템 대화 상자, 예를 들면 언인스톨 확인 대화 상자 등을 놓칠 수 있습니다.</string>
<string name="advanced_https">HTTPS (고급)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-nl/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">Genereer wachtwoord</string>
<string name="allow_remote_access_from_pc">Toegang op afstand vanaf de pc toestaan</string>
<string name="privacy_policy">Privacybeleid</string>
<string name="terms_of_use">Gebruiksvoorwaarden</string>
<string name="grant_permission">Toestemming verlenen</string>
<string name="system_alert_window_warning">Het verlenen van de \'Weergeven over andere apps\'-toestemming is essentieel. Zonder deze toestemming kunnen bij een app die op de achtergrond draait, cruciale systeemdialogen, zoals bevestigingsdialogen voor verwijdering, worden gemist.</string>
<string name="advanced_https">HTTPS (Geavanceerd)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-pt/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">Gerar senha</string>
<string name="allow_remote_access_from_pc">Permitir acesso remoto a partir do PC</string>
<string name="privacy_policy">Política de Privacidade</string>
<string name="terms_of_use">Termos de Uso</string>
<string name="grant_permission">Conceder permissão</string>
<string name="system_alert_window_warning">Conceder a permissão \'Exibir sobre outros aplicativos\' é essencial. Sem esta permissão, se o aplicativo estiver em execução em segundo plano, você pode perder diálogos cruciais do sistema disparados pelo aplicativo, como diálogos de confirmação de desinstalação.</string>
<string name="advanced_https">HTTPS (Avançado)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-ru/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">Сгенерировать пароль</string>
<string name="allow_remote_access_from_pc">Разрешить удаленный доступ с ПК</string>
<string name="privacy_policy">Политика конфиденциальности</string>
<string name="terms_of_use">Условия использования</string>
<string name="grant_permission">Предоставить разрешение</string>
<string name="system_alert_window_warning">Предоставление разрешения \'Показывать поверх других приложений\' является неотъемлемым. Без этого разрешения приложение, работающее в фоновом режиме, может пропустить важные системные диалоги, вызванные приложением, такие как диалоги подтверждения удаления.</string>
<string name="advanced_https">HTTPS (Расширенный)</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-ta/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="generate_password">கடவுச்சொல் உருவாக்கு</string>
<string name="allow_remote_access_from_pc">கணினியிலிருந்து தொலைநோக்கி அணுகல் அனுமதி</string>
<string name="privacy_policy">தனியுரிமை கொள்கை</string>
<string name="terms_of_use">பயன்பாடு விதிகள்</string>
<string name="grant_permission">அனுமதி அளிக்கவும்</string>
<string name="system_alert_window_warning">‘மற்ற பயன்பாடுகளின் மேல் காட்ட’ அனுமதி அளிக்குதல் முக்கியம். இந்த அனுமதி இல்லையின், பயன்பாடு பின்னர் ஓடி விடுகின்றதும், ஐப்பிள் உருவாக்கப்பட்ட குறுக்கேற்ற சிஸ்டம் டயலாக், உடைந்தது அனப்ரூபியேஷன் டயலாக் போன்றவற்றை விட நீங்கள் அவசியமாக காட்டாதல்.</string>
<string name="advanced_https">எசடிடபிஎஸ் (உயர்த்துதல்)</string>
Expand Down
Loading

0 comments on commit ea49b6c

Please sign in to comment.