Add check and request for SMS read permission to perform export.
This commit is contained in:
parent
dfdf68b7b5
commit
08b7dcb1ee
4 changed files with 53 additions and 8 deletions
|
@ -1,5 +1,6 @@
|
||||||
package org.thoughtcrime.securesms.exporter.flow
|
package org.thoughtcrime.securesms.exporter.flow
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.format.Formatter
|
import android.text.format.Formatter
|
||||||
|
@ -16,6 +17,7 @@ import org.signal.smsexporter.SmsExportService
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.databinding.ExportingSmsMessagesFragmentBinding
|
import org.thoughtcrime.securesms.databinding.ExportingSmsMessagesFragmentBinding
|
||||||
import org.thoughtcrime.securesms.exporter.SignalSmsExportService
|
import org.thoughtcrime.securesms.exporter.SignalSmsExportService
|
||||||
|
import org.thoughtcrime.securesms.permissions.Permissions
|
||||||
import org.thoughtcrime.securesms.util.LifecycleDisposable
|
import org.thoughtcrime.securesms.util.LifecycleDisposable
|
||||||
import org.thoughtcrime.securesms.util.mb
|
import org.thoughtcrime.securesms.util.mb
|
||||||
import org.thoughtcrime.securesms.util.navigation.safeNavigate
|
import org.thoughtcrime.securesms.util.navigation.safeNavigate
|
||||||
|
@ -87,13 +89,29 @@ class ExportingSmsMessagesFragment : Fragment(R.layout.exporting_sms_messages_fr
|
||||||
MaterialAlertDialogBuilder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setTitle(R.string.ExportingSmsMessagesFragment__you_may_not_have_enough_disk_space)
|
.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)))
|
.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()) }
|
.setNegativeButton(android.R.string.cancel) { _, _ -> findNavController().safeNavigate(ExportingSmsMessagesFragmentDirections.actionDirectToExportYourSmsMessagesFragment()) }
|
||||||
.setCancelable(false)
|
.setCancelable(false)
|
||||||
.show()
|
.show()
|
||||||
} else {
|
} 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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.permissions;
|
||||||
|
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
@ -16,12 +15,14 @@ import android.view.WindowManager;
|
||||||
|
|
||||||
import androidx.annotation.DrawableRes;
|
import androidx.annotation.DrawableRes;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.app.ActivityCompat;
|
import androidx.core.app.ActivityCompat;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
import com.annimon.stream.Stream;
|
import com.annimon.stream.Stream;
|
||||||
import com.annimon.stream.function.Consumer;
|
import com.annimon.stream.function.Consumer;
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.signal.core.util.logging.Log;
|
import org.signal.core.util.logging.Log;
|
||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
|
@ -104,7 +105,11 @@ public class Permissions {
|
||||||
}
|
}
|
||||||
|
|
||||||
public PermissionsBuilder withPermanentDenialDialog(@NonNull String message) {
|
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) {
|
public PermissionsBuilder onAllGranted(Runnable allGrantedListener) {
|
||||||
|
@ -360,11 +365,13 @@ public class Permissions {
|
||||||
private static class SettingsDialogListener implements Runnable {
|
private static class SettingsDialogListener implements Runnable {
|
||||||
|
|
||||||
private final WeakReference<Context> context;
|
private final WeakReference<Context> context;
|
||||||
|
private final Runnable onDialogDismissed;
|
||||||
private final String message;
|
private final String message;
|
||||||
|
|
||||||
SettingsDialogListener(Context context, String message) {
|
SettingsDialogListener(Context context, String message, @Nullable Runnable onDialogDismissed) {
|
||||||
this.message = message;
|
this.message = message;
|
||||||
this.context = new WeakReference<>(context);
|
this.context = new WeakReference<>(context);
|
||||||
|
this.onDialogDismissed = onDialogDismissed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -372,11 +379,17 @@ public class Permissions {
|
||||||
Context context = this.context.get();
|
Context context = this.context.get();
|
||||||
|
|
||||||
if (context != null) {
|
if (context != null) {
|
||||||
new AlertDialog.Builder(context)
|
new MaterialAlertDialogBuilder(context)
|
||||||
.setTitle(R.string.Permissions_permission_required)
|
.setTitle(R.string.Permissions_permission_required)
|
||||||
.setMessage(message)
|
.setMessage(message)
|
||||||
|
.setCancelable(false)
|
||||||
.setPositiveButton(R.string.Permissions_continue, (dialog, which) -> context.startActivity(getApplicationSettingsIntent(context)))
|
.setPositiveButton(R.string.Permissions_continue, (dialog, which) -> context.startActivity(getApplicationSettingsIntent(context)))
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
.setOnDismissListener(d -> {
|
||||||
|
if (onDialogDismissed != null) {
|
||||||
|
onDialogDismissed.run();
|
||||||
|
}
|
||||||
|
})
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
12
app/src/main/res/drawable/ic_messages_solid_24.xml
Normal file
12
app/src/main/res/drawable/ic_messages_solid_24.xml
Normal 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>
|
|
@ -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>
|
<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 -->
|
<!-- Alert dialog button to continue with exporting sms after seeing the lack of storage warning -->
|
||||||
<string name="ExportingSmsMessagesFragment__continue_anyway">Continue anyway</string>
|
<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 -->
|
<!-- ChooseANewDefaultSmsAppFragment -->
|
||||||
<!-- Title of the screen -->
|
<!-- Title of the screen -->
|
||||||
|
|
Loading…
Add table
Reference in a new issue