Add check and request for SMS read permission to perform export.

This commit is contained in:
Cody Henthorne 2022-10-20 20:50:54 -04:00
parent dfdf68b7b5
commit 08b7dcb1ee
4 changed files with 53 additions and 8 deletions

View file

@ -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<String?>, 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()
}
}

View file

@ -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> 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();
}
}

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M1.5,9C1.5,5.686 4.6333,3 8.5,3C11.3471,3 13.8406,4.4937 14.9246,6.6276C14.4647,6.5439 13.9882,6.5 13.5,6.5C9.682,6.5 6.5,9.2566 6.5,12.6578C6.5,13.4296 6.6613,14.1681 6.9559,14.8489C6.6572,14.79 6.3616,14.7141 6.0707,14.6213L3.032,15.634C2.6847,15.75 2.4493,15.5486 2.5093,15.1873L2.9353,12.63C2.0245,11.6391 1.5132,10.3458 1.5,9Z"
android:fillColor="#000000"/>
<path
android:pathData="M13.5,8.3334C16.2619,8.3334 18.5,10.2418 18.5,12.5965C18.4906,13.5527 18.1253,14.4716 17.4748,15.1757L17.779,16.9927C17.8219,17.2494 17.6538,17.3925 17.4057,17.31L15.2352,16.5905C14.6742,16.7685 14.0889,16.8592 13.5,16.8596C10.7381,16.8596 8.5,14.9511 8.5,12.5965C8.5,10.2418 10.7729,8.3334 13.5,8.3334Z"
android:fillColor="#000000"/>
</vector>

View file

@ -5366,6 +5366,8 @@
<string name="ExportingSmsMessagesFragment__you_need_approximately_s_to_export_your_messages_ensure_you_have_enough_space_before_continuing">You need approximately %1$s to export your messages, ensure you have enough space before continuing.</string>
<!-- Alert dialog button to continue with exporting sms after seeing the lack of storage warning -->
<string name="ExportingSmsMessagesFragment__continue_anyway">Continue anyway</string>
<!-- Dialog text shown when Signal isn't granted the sms permission needed to export messages, different than being selected as the sms app -->
<string name="ExportingSmsMessagesFragment__signal_needs_the_sms_permission_to_be_able_to_export_your_sms_messages">Signal needs the SMS permission to be able to export your SMS messages.</string>
<!-- ChooseANewDefaultSmsAppFragment -->
<!-- Title of the screen -->