From f9c8e4f85ac59ae946d51bc00508d571e7153937 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 27 Jun 2019 16:01:11 +0200 Subject: [PATCH] Show disclaimer at first launch (Fixes #215) --- .../riotredesign/core/extensions/TextView.kt | 33 ++++++++- .../core/utils/ExternalApplicationsUtil.kt | 16 ++++- .../features/disclaimer/DisclaimerDialog.kt | 68 +++++++++++++++++++ .../features/home/HomeActivity.kt | 3 + .../features/login/LoginActivity.kt | 7 ++ .../disclaimer_top_banner_foreground.xml | 38 +++++++++++ .../res/layout/dialog_disclaimer_content.xml | 58 ++++++++++++++++ vector/src/main/res/values/strings_riotX.xml | 6 ++ 8 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 vector/src/main/java/im/vector/riotredesign/features/disclaimer/DisclaimerDialog.kt create mode 100644 vector/src/main/res/drawable/disclaimer_top_banner_foreground.xml create mode 100644 vector/src/main/res/layout/dialog_disclaimer_content.xml diff --git a/vector/src/main/java/im/vector/riotredesign/core/extensions/TextView.kt b/vector/src/main/java/im/vector/riotredesign/core/extensions/TextView.kt index f2a6b467..6ee8619b 100644 --- a/vector/src/main/java/im/vector/riotredesign/core/extensions/TextView.kt +++ b/vector/src/main/java/im/vector/riotredesign/core/extensions/TextView.kt @@ -16,8 +16,15 @@ package im.vector.riotredesign.core.extensions +import android.text.Spannable +import android.text.SpannableString +import android.text.style.ForegroundColorSpan import android.widget.TextView +import androidx.annotation.AttrRes +import androidx.annotation.StringRes import androidx.core.view.isVisible +import im.vector.riotredesign.features.themes.ThemeUtils + /** * Set a text in the TextView, or set visibility to GONE if the text is null @@ -30,4 +37,28 @@ fun TextView.setTextOrHide(newText: String?, hideWhenBlank: Boolean = true) { this.text = newText isVisible = true } -} \ No newline at end of file +} + +/** + * Set text with a colored part + * @param fullTextRes the resource id of the full text. Value MUST contains a parameter for string, which will be replaced by the colored part + * @param coloredTextRes the resource id of the colored part of the text + * @param colorAttribute attribute of the color + */ +fun TextView.setTextWithColoredPart(@StringRes fullTextRes: Int, + @StringRes coloredTextRes: Int, + @AttrRes colorAttribute: Int) { + val coloredPart = resources.getString(coloredTextRes) + // Insert colored part into the full text + val fullText = resources.getString(fullTextRes, coloredPart) + val color = ThemeUtils.getColor(context, colorAttribute) + + val foregroundSpan = ForegroundColorSpan(color) + + val index = fullText.indexOf(coloredPart) + + text = SpannableString(fullText) + .apply { + setSpan(foregroundSpan, index, index + coloredPart.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + } +} diff --git a/vector/src/main/java/im/vector/riotredesign/core/utils/ExternalApplicationsUtil.kt b/vector/src/main/java/im/vector/riotredesign/core/utils/ExternalApplicationsUtil.kt index 4a68043a..acc3f643 100644 --- a/vector/src/main/java/im/vector/riotredesign/core/utils/ExternalApplicationsUtil.kt +++ b/vector/src/main/java/im/vector/riotredesign/core/utils/ExternalApplicationsUtil.kt @@ -258,6 +258,20 @@ fun shareMedia(context: Context, file: File, mediaMimeType: String?) { sendIntent.putExtra(Intent.EXTRA_STREAM, mediaUri) context.startActivity(sendIntent) - + } +} + +/** + * Open the play store to the provided application Id, default to this app + */ +fun openPlayStore(activity: Activity, appId: String = BuildConfig.APPLICATION_ID) { + try { + activity.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$appId"))) + } catch (activityNotFoundException: ActivityNotFoundException) { + try { + activity.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=$appId"))) + } catch (activityNotFoundException: ActivityNotFoundException) { + activity.toast(R.string.error_no_external_application_found) + } } } diff --git a/vector/src/main/java/im/vector/riotredesign/features/disclaimer/DisclaimerDialog.kt b/vector/src/main/java/im/vector/riotredesign/features/disclaimer/DisclaimerDialog.kt new file mode 100644 index 00000000..bf4a4094 --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/disclaimer/DisclaimerDialog.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.disclaimer + +import android.app.Activity +import android.preference.PreferenceManager +import android.view.ViewGroup +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.core.content.edit +import im.vector.riotredesign.BuildConfig +import im.vector.riotredesign.R +import im.vector.riotredesign.core.extensions.setTextWithColoredPart +import im.vector.riotredesign.core.utils.openPlayStore + +// Increase this value to show again the disclaimer dialog after an upgrade of the application +private const val CURRENT_DISCLAIMER_VALUE = 1 + +private const val SHARED_PREF_KEY = "LAST_DISCLAIMER_VERSION_VALUE" + +fun showDisclaimerDialog(activity: Activity) { + val sharedPrefs = PreferenceManager.getDefaultSharedPreferences(activity) + + if (sharedPrefs.getInt(SHARED_PREF_KEY, 0) < CURRENT_DISCLAIMER_VALUE) { + sharedPrefs.edit { + putInt(SHARED_PREF_KEY, CURRENT_DISCLAIMER_VALUE) + } + + val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_disclaimer_content, null) + + val textView = (dialogLayout as ViewGroup).findViewById(R.id.dialogDisclaimerContentLine2) + @Suppress("ConstantConditionIf") + if (BuildConfig.FLAVOR == "gplay") { + + textView.setTextWithColoredPart( + R.string.alpha_disclaimer_content_line_2_gplay, + R.string.alpha_disclaimer_content_line_2_gplay_colored_part, + R.attr.colorAccent + ) + + textView.setOnClickListener { + openPlayStore(activity) + } + } else { + textView.setText(R.string.alpha_disclaimer_content_line_2_fdroid) + } + + AlertDialog.Builder(activity) + .setView(dialogLayout) + .setCancelable(false) + .setPositiveButton(R.string._continue, null) + .show() + } +} diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/riotredesign/features/home/HomeActivity.kt index 572d865e..3080c7ef 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/HomeActivity.kt @@ -40,6 +40,7 @@ import im.vector.riotredesign.core.platform.VectorBaseActivity import im.vector.riotredesign.core.pushers.PushersManager import im.vector.riotredesign.features.crypto.keysrequest.KeyRequestHandler import im.vector.riotredesign.features.crypto.verification.IncomingVerificationRequestHandler +import im.vector.riotredesign.features.disclaimer.showDisclaimerDialog import im.vector.riotredesign.features.notifications.NotificationDrawerManager import im.vector.riotredesign.features.rageshake.BugReporter import im.vector.riotredesign.features.rageshake.VectorUncaughtExceptionHandler @@ -151,6 +152,8 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable { .setPositiveButton(R.string.yes) { _, _ -> BugReporter.openBugReportScreen(this) } .setNegativeButton(R.string.no) { _, _ -> BugReporter.deleteCrashFile(this) } .show() + } else { + showDisclaimerDialog(this) } //Force remote backup state update to update the banner if needed diff --git a/vector/src/main/java/im/vector/riotredesign/features/login/LoginActivity.kt b/vector/src/main/java/im/vector/riotredesign/features/login/LoginActivity.kt index a3c4d426..ec37423e 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/login/LoginActivity.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/login/LoginActivity.kt @@ -31,6 +31,7 @@ import im.vector.matrix.android.api.session.sync.FilterService import im.vector.riotredesign.R import im.vector.riotredesign.core.extensions.showPassword import im.vector.riotredesign.core.platform.VectorBaseActivity +import im.vector.riotredesign.features.disclaimer.showDisclaimerDialog import im.vector.riotredesign.features.home.HomeActivity import im.vector.riotredesign.features.notifications.PushRuleTriggerListener import io.reactivex.Observable @@ -57,6 +58,12 @@ class LoginActivity : VectorBaseActivity() { homeServerField.setText(DEFAULT_HOME_SERVER_URI) } + override fun onResume() { + super.onResume() + + showDisclaimerDialog(this) + } + private fun authenticate() { passwordShown = false renderPasswordField() diff --git a/vector/src/main/res/drawable/disclaimer_top_banner_foreground.xml b/vector/src/main/res/drawable/disclaimer_top_banner_foreground.xml new file mode 100644 index 00000000..c031da1e --- /dev/null +++ b/vector/src/main/res/drawable/disclaimer_top_banner_foreground.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/vector/src/main/res/layout/dialog_disclaimer_content.xml b/vector/src/main/res/layout/dialog_disclaimer_content.xml new file mode 100644 index 00000000..c45933eb --- /dev/null +++ b/vector/src/main/res/layout/dialog_disclaimer_content.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 5e6b532a..073d9dfc 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -3,6 +3,12 @@ + Welcome to the beta! + "While Riot X is in early development, some features may be missing and you may experience bugs." + "The latest feature list is always in the %1$s, and if you find bugs please submit a report in the top left menu of Home, and we’ll fix them as quickly as we can." + + "Play Store description" + "If you find bugs please submit a report in the top left menu of Home, and we’ll fix them as quickly as we can." "Import e2e keys from file \"%1$s\"."