From 802cdd4c46f2b0e127149ed4f753abb80c096cea Mon Sep 17 00:00:00 2001 From: Nik Clayton Date: Tue, 3 Oct 2023 12:56:30 +0200 Subject: [PATCH] feat: Embed the privacy policy in the app (#139) Instead of linking to the privacy policy embed it in the app as a string of HTML. The string is created with a new `markdown2resource` plugin, which converts `PRIVACY.md` to HTML and generates a Java class with the HTML content. Create `PrivacyPolicyActivity` to display the HTML in a `WebView`, and link to it from `AboutActivity`. --- app/build.gradle | 6 + app/lint-baseline.xml | 13 +- app/src/main/AndroidManifest.xml | 1 + app/src/main/java/app/pachli/AboutActivity.kt | 6 +- .../java/app/pachli/PrivacyPolicyActivity.kt | 32 ++++ .../java/app/pachli/di/ActivitiesModule.kt | 4 + app/src/main/res/layout/activity_about.xml | 5 +- .../res/layout/activity_privacy_policy.xml | 21 +++ app/src/main/res/values/strings.xml | 2 +- plugins/markdown2resource/README.md | 56 +++++++ plugins/markdown2resource/build.gradle.kts | 50 ++++++ .../Markdown2ResourcePlugin.kt | 156 ++++++++++++++++++ settings.gradle | 2 + 13 files changed, 337 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/app/pachli/PrivacyPolicyActivity.kt create mode 100644 app/src/main/res/layout/activity_privacy_policy.xml create mode 100644 plugins/markdown2resource/README.md create mode 100644 plugins/markdown2resource/build.gradle.kts create mode 100644 plugins/markdown2resource/src/main/kotlin/app/pachli/plugins/markdown2resource/Markdown2ResourcePlugin.kt diff --git a/app/build.gradle b/app/build.gradle index 5ea7f0fd1..9ea14c4f5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,6 +5,8 @@ plugins { alias(libs.plugins.kotlin.kapt) alias(libs.plugins.kotlin.parcelize) alias(libs.plugins.aboutlibraries) + + id "app.pachli.plugins.markdown2resource" } apply from: 'gitTools.gradle' @@ -139,6 +141,10 @@ aboutLibraries { prettyPrint = true } +markdown2resource { + files = [ layout.projectDirectory.file('../PRIVACY.md') ] +} + // library versions are in PROJECT_ROOT/gradle/libs.versions.toml dependencies { implementation libs.kotlinx.coroutines.android diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index f46fb7cd5..9f8bb0d86 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -47,7 +47,7 @@ errorLine2=" ~~~~~~~~~~~~"> @@ -2064,17 +2064,6 @@ column="9"/> - - - - + diff --git a/app/src/main/java/app/pachli/AboutActivity.kt b/app/src/main/java/app/pachli/AboutActivity.kt index 9a0c1c397..b5e69a285 100644 --- a/app/src/main/java/app/pachli/AboutActivity.kt +++ b/app/src/main/java/app/pachli/AboutActivity.kt @@ -73,7 +73,11 @@ class AboutActivity : BottomSheetActivity(), Injectable { binding.aboutLicenseInfoTextView.setClickableTextWithoutUnderlines(R.string.about_pachli_license) binding.aboutWebsiteInfoTextView.setClickableTextWithoutUnderlines(R.string.about_project_site) binding.aboutBugsFeaturesInfoTextView.setClickableTextWithoutUnderlines(R.string.about_bug_feature_request_site) - binding.aboutPrivacyPolicyTextView.setClickableTextWithoutUnderlines(R.string.about_privacy_policy) + + binding.aboutPrivacyPolicyTextView.setOnClickListener { + val intent = Intent(this, PrivacyPolicyActivity::class.java) + startActivity(intent) + } binding.appProfileButton.setOnClickListener { viewUrl(BuildConfig.SUPPORT_ACCOUNT_URL) diff --git a/app/src/main/java/app/pachli/PrivacyPolicyActivity.kt b/app/src/main/java/app/pachli/PrivacyPolicyActivity.kt new file mode 100644 index 000000000..53ea5fe88 --- /dev/null +++ b/app/src/main/java/app/pachli/PrivacyPolicyActivity.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2023 Pachli Association + * + * This file is a part of Pachli. + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Pachli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Pachli; if not, + * see . + */ + +package app.pachli + +import android.os.Bundle +import android.util.Base64 +import app.pachli.databinding.ActivityPrivacyPolicyBinding + +class PrivacyPolicyActivity : BaseActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val binding = ActivityPrivacyPolicyBinding.inflate(layoutInflater) + setContentView(binding.root) + val encoded = Base64.encodeToString(markdownR.html.PRIVACY_md.toByteArray(), Base64.NO_PADDING) + binding.policy.loadData(encoded, "text/html", "base64") + } +} diff --git a/app/src/main/java/app/pachli/di/ActivitiesModule.kt b/app/src/main/java/app/pachli/di/ActivitiesModule.kt index bf2f1a6aa..8285d818f 100644 --- a/app/src/main/java/app/pachli/di/ActivitiesModule.kt +++ b/app/src/main/java/app/pachli/di/ActivitiesModule.kt @@ -21,6 +21,7 @@ import app.pachli.EditProfileActivity import app.pachli.LicenseActivity import app.pachli.ListsActivity import app.pachli.MainActivity +import app.pachli.PrivacyPolicyActivity import app.pachli.SplashActivity import app.pachli.StatusListActivity import app.pachli.TabPreferenceActivity @@ -128,4 +129,7 @@ abstract class ActivitiesModule { @ContributesAndroidInjector abstract fun contributesEditFilterActivity(): EditFilterActivity + + @ContributesAndroidInjector + abstract fun contributesPrivacyPolicyActivity(): PrivacyPolicyActivity } diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 1c0d93ce2..07eb791c0 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -169,19 +169,18 @@ app:layout_constraintStart_toStartOf="@+id/aboutWebsiteInfoTextView" app:layout_constraintTop_toBottomOf="@id/aboutWebsiteInfoTextView" /> - -