From 08b7dcb1ee0c1f8cea31845ca92ae71c538c5183 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 20 Oct 2022 20:50:54 -0400 Subject: [PATCH] Add check and request for SMS read permission to perform export. --- .../flow/ExportingSmsMessagesFragment.kt | 22 ++++++++++++++-- .../securesms/permissions/Permissions.java | 25 ++++++++++++++----- .../res/drawable/ic_messages_solid_24.xml | 12 +++++++++ app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/drawable/ic_messages_solid_24.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/exporter/flow/ExportingSmsMessagesFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/exporter/flow/ExportingSmsMessagesFragment.kt index 0a49831711..338e7c5940 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/exporter/flow/ExportingSmsMessagesFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/exporter/flow/ExportingSmsMessagesFragment.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.exporter.flow +import android.Manifest import android.content.Context import android.os.Bundle import android.text.format.Formatter @@ -16,6 +17,7 @@ import org.signal.smsexporter.SmsExportService import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.databinding.ExportingSmsMessagesFragmentBinding import org.thoughtcrime.securesms.exporter.SignalSmsExportService +import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.util.LifecycleDisposable import org.thoughtcrime.securesms.util.mb import org.thoughtcrime.securesms.util.navigation.safeNavigate @@ -87,13 +89,29 @@ class ExportingSmsMessagesFragment : Fragment(R.layout.exporting_sms_messages_fr MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.ExportingSmsMessagesFragment__you_may_not_have_enough_disk_space) .setMessage(getString(R.string.ExportingSmsMessagesFragment__you_need_approximately_s_to_export_your_messages_ensure_you_have_enough_space_before_continuing, Formatter.formatFileSize(requireContext(), estimatedRequiredSpace))) - .setPositiveButton(R.string.ExportingSmsMessagesFragment__continue_anyway) { _, _ -> SignalSmsExportService.start(requireContext()) } + .setPositiveButton(R.string.ExportingSmsMessagesFragment__continue_anyway) { _, _ -> checkPermissionsAndStartExport() } .setNegativeButton(android.R.string.cancel) { _, _ -> findNavController().safeNavigate(ExportingSmsMessagesFragmentDirections.actionDirectToExportYourSmsMessagesFragment()) } .setCancelable(false) .show() } else { - SignalSmsExportService.start(requireContext()) + checkPermissionsAndStartExport() } } } + + @Suppress("OVERRIDE_DEPRECATION") + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults) + } + + private fun checkPermissionsAndStartExport() { + Permissions.with(this) + .request(Manifest.permission.READ_SMS) + .ifNecessary() + .withRationaleDialog(getString(R.string.ExportingSmsMessagesFragment__signal_needs_the_sms_permission_to_be_able_to_export_your_sms_messages), R.drawable.ic_messages_solid_24) + .onAllGranted { SignalSmsExportService.start(requireContext()) } + .withPermanentDenialDialog(getString(R.string.ExportingSmsMessagesFragment__signal_needs_the_sms_permission_to_be_able_to_export_your_sms_messages)) { requireActivity().finish() } + .onAnyDenied { checkPermissionsAndStartExport() } + .execute() + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/permissions/Permissions.java b/app/src/main/java/org/thoughtcrime/securesms/permissions/Permissions.java index c6a36a12e8..6139261b8a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/permissions/Permissions.java +++ b/app/src/main/java/org/thoughtcrime/securesms/permissions/Permissions.java @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.permissions; import android.app.Activity; -import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -16,12 +15,14 @@ import android.view.WindowManager; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import com.annimon.stream.Stream; import com.annimon.stream.function.Consumer; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; @@ -104,7 +105,11 @@ public class Permissions { } public PermissionsBuilder withPermanentDenialDialog(@NonNull String message) { - return onAnyPermanentlyDenied(new SettingsDialogListener(permissionObject.getContext(), message)); + return withPermanentDenialDialog(message, null); + } + + public PermissionsBuilder withPermanentDenialDialog(@NonNull String message, @Nullable Runnable onDialogDismissed) { + return onAnyPermanentlyDenied(new SettingsDialogListener(permissionObject.getContext(), message, onDialogDismissed)); } public PermissionsBuilder onAllGranted(Runnable allGrantedListener) { @@ -360,11 +365,13 @@ public class Permissions { private static class SettingsDialogListener implements Runnable { private final WeakReference context; + private final Runnable onDialogDismissed; private final String message; - SettingsDialogListener(Context context, String message) { - this.message = message; - this.context = new WeakReference<>(context); + SettingsDialogListener(Context context, String message, @Nullable Runnable onDialogDismissed) { + this.message = message; + this.context = new WeakReference<>(context); + this.onDialogDismissed = onDialogDismissed; } @Override @@ -372,11 +379,17 @@ public class Permissions { Context context = this.context.get(); if (context != null) { - new AlertDialog.Builder(context) + new MaterialAlertDialogBuilder(context) .setTitle(R.string.Permissions_permission_required) .setMessage(message) + .setCancelable(false) .setPositiveButton(R.string.Permissions_continue, (dialog, which) -> context.startActivity(getApplicationSettingsIntent(context))) .setNegativeButton(android.R.string.cancel, null) + .setOnDismissListener(d -> { + if (onDialogDismissed != null) { + onDialogDismissed.run(); + } + }) .show(); } } diff --git a/app/src/main/res/drawable/ic_messages_solid_24.xml b/app/src/main/res/drawable/ic_messages_solid_24.xml new file mode 100644 index 0000000000..9268d8eb86 --- /dev/null +++ b/app/src/main/res/drawable/ic_messages_solid_24.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6a1e393ef3..5601f36cae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5366,6 +5366,8 @@ You need approximately %1$s to export your messages, ensure you have enough space before continuing. Continue anyway + + Signal needs the SMS permission to be able to export your SMS messages.