mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-24 10:35:19 +00:00
Backup dialog cleanup.
This commit is contained in:
parent
c0785e4da7
commit
e0892853a7
@ -1499,6 +1499,7 @@
|
|||||||
<string name="BackupDialog_disable_and_delete_all_local_backups">Disable and delete all local backups?</string>
|
<string name="BackupDialog_disable_and_delete_all_local_backups">Disable and delete all local backups?</string>
|
||||||
<string name="BackupDialog_delete_backups_statement">Delete backups</string>
|
<string name="BackupDialog_delete_backups_statement">Delete backups</string>
|
||||||
<string name="BackupDialog_copied_to_clipboard">Copied to clipboard</string>
|
<string name="BackupDialog_copied_to_clipboard">Copied to clipboard</string>
|
||||||
|
<string name="BackupDialog_activation_error">Failed to activate backups. Please try again or contact support.</string>
|
||||||
<string name="ChatsPreferenceFragment_signal_requires_external_storage_permission_in_order_to_create_backups">Session requires external storage permission in order to create backups, but it has been permanently denied. Please continue to app settings, select \"Permissions\" and enable \"Storage\".</string>
|
<string name="ChatsPreferenceFragment_signal_requires_external_storage_permission_in_order_to_create_backups">Session requires external storage permission in order to create backups, but it has been permanently denied. Please continue to app settings, select \"Permissions\" and enable \"Storage\".</string>
|
||||||
<string name="ChatsPreferenceFragment_last_backup_s">Last backup: %s</string>
|
<string name="ChatsPreferenceFragment_last_backup_s">Last backup: %s</string>
|
||||||
<string name="ChatsPreferenceFragment_in_progress">In progress</string>
|
<string name="ChatsPreferenceFragment_in_progress">In progress</string>
|
||||||
|
@ -4,32 +4,36 @@ package org.thoughtcrime.securesms.backup;
|
|||||||
import android.content.ClipData;
|
import android.content.ClipData;
|
||||||
import android.content.ClipboardManager;
|
import android.content.ClipboardManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
|
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import network.loki.messenger.R;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.components.SwitchPreferenceCompat;
|
import org.thoughtcrime.securesms.components.SwitchPreferenceCompat;
|
||||||
import org.thoughtcrime.securesms.service.LocalBackupListener;
|
import org.thoughtcrime.securesms.logging.Log;
|
||||||
import org.thoughtcrime.securesms.util.BackupDirSelector;
|
import org.thoughtcrime.securesms.util.BackupDirSelector;
|
||||||
import org.thoughtcrime.securesms.util.BackupUtil;
|
import org.thoughtcrime.securesms.util.BackupUtil;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import network.loki.messenger.R;
|
||||||
|
|
||||||
public class BackupDialog {
|
public class BackupDialog {
|
||||||
|
private static final String TAG = "BackupDialog";
|
||||||
|
|
||||||
public static void showEnableBackupDialog(
|
public static void showEnableBackupDialog(
|
||||||
@NonNull Context context,
|
@NonNull Context context,
|
||||||
@NonNull SwitchPreferenceCompat preference,
|
@NonNull SwitchPreferenceCompat preference,
|
||||||
@NonNull BackupDirSelector backupDirSelector) {
|
@NonNull BackupDirSelector backupDirSelector) {
|
||||||
|
|
||||||
String[] password = BackupUtil.generateBackupPassphrase();
|
String[] password = BackupUtil.generateBackupPassphrase();
|
||||||
AlertDialog dialog = new AlertDialog.Builder(context)
|
String passwordSt = Util.join(password, " ");
|
||||||
|
|
||||||
|
AlertDialog dialog = new AlertDialog.Builder(context)
|
||||||
.setTitle(R.string.BackupDialog_enable_local_backups)
|
.setTitle(R.string.BackupDialog_enable_local_backups)
|
||||||
.setView(R.layout.backup_enable_dialog)
|
.setView(R.layout.backup_enable_dialog)
|
||||||
.setPositiveButton(R.string.BackupDialog_enable_backups, null)
|
.setPositiveButton(R.string.BackupDialog_enable_backups, null)
|
||||||
@ -42,9 +46,16 @@ public class BackupDialog {
|
|||||||
CheckBox confirmationCheckBox = dialog.findViewById(R.id.confirmation_check);
|
CheckBox confirmationCheckBox = dialog.findViewById(R.id.confirmation_check);
|
||||||
if (confirmationCheckBox.isChecked()) {
|
if (confirmationCheckBox.isChecked()) {
|
||||||
backupDirSelector.selectBackupDir(true, uri -> {
|
backupDirSelector.selectBackupDir(true, uri -> {
|
||||||
BackupPassphrase.set(context, Util.join(password, " "));
|
try {
|
||||||
TextSecurePreferences.setBackupEnabled(context, true);
|
BackupUtil.enableBackups(context, passwordSt);
|
||||||
LocalBackupListener.schedule(context);
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "Failed to activate backups.", e);
|
||||||
|
Toast.makeText(context,
|
||||||
|
context.getString(R.string.BackupDialog_activation_error),
|
||||||
|
Toast.LENGTH_LONG)
|
||||||
|
.show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
preference.setChecked(true);
|
preference.setChecked(true);
|
||||||
created.dismiss();
|
created.dismiss();
|
||||||
@ -71,7 +82,7 @@ public class BackupDialog {
|
|||||||
textView.setOnClickListener(v -> checkBox.toggle());
|
textView.setOnClickListener(v -> checkBox.toggle());
|
||||||
|
|
||||||
dialog.findViewById(R.id.number_table).setOnClickListener(v -> {
|
dialog.findViewById(R.id.number_table).setOnClickListener(v -> {
|
||||||
((ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("text", Util.join(password, " ")));
|
((ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("text", passwordSt));
|
||||||
Toast.makeText(context, R.string.BackupDialog_copied_to_clipboard, Toast.LENGTH_LONG).show();
|
Toast.makeText(context, R.string.BackupDialog_copied_to_clipboard, Toast.LENGTH_LONG).show();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -84,10 +95,7 @@ public class BackupDialog {
|
|||||||
.setMessage(R.string.BackupDialog_disable_and_delete_all_local_backups)
|
.setMessage(R.string.BackupDialog_disable_and_delete_all_local_backups)
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
.setPositiveButton(R.string.BackupDialog_delete_backups_statement, (dialog, which) -> {
|
.setPositiveButton(R.string.BackupDialog_delete_backups_statement, (dialog, which) -> {
|
||||||
BackupPassphrase.set(context, null);
|
BackupUtil.disableBackups(context, true);
|
||||||
TextSecurePreferences.setBackupEnabled(context, false);
|
|
||||||
BackupUtil.deleteAllBackupFiles(context);
|
|
||||||
BackupUtil.setBackupDirUri(context, null);
|
|
||||||
preference.setChecked(false);
|
preference.setChecked(false);
|
||||||
})
|
})
|
||||||
.create()
|
.create()
|
||||||
|
@ -170,7 +170,6 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment {
|
|||||||
ApplicationContext.getInstance(getContext())
|
ApplicationContext.getInstance(getContext())
|
||||||
.getJobManager()
|
.getJobManager()
|
||||||
.add(new LocalBackupJob());
|
.add(new LocalBackupJob());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,10 @@ import org.thoughtcrime.securesms.backup.FullBackupExporter
|
|||||||
import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider
|
import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||||
import org.thoughtcrime.securesms.database.model.BackupFileRecord
|
import org.thoughtcrime.securesms.database.model.BackupFileRecord
|
||||||
|
import org.thoughtcrime.securesms.service.LocalBackupListener
|
||||||
import org.whispersystems.libsignal.util.ByteUtil
|
import org.whispersystems.libsignal.util.ByteUtil
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import java.lang.IllegalStateException
|
||||||
import java.security.SecureRandom
|
import java.security.SecureRandom
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@ -28,6 +30,44 @@ import kotlin.jvm.Throws
|
|||||||
object BackupUtil {
|
object BackupUtil {
|
||||||
private const val TAG = "BackupUtil"
|
private const val TAG = "BackupUtil"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set app-wide configuration to enable the backups and schedule them.
|
||||||
|
*
|
||||||
|
* Make sure that the backup dir is selected prior activating the backup.
|
||||||
|
* Use [BackupDirSelector] or [setBackupDirUri] manually.
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
@Throws(IOException::class)
|
||||||
|
fun enableBackups(context: Context, password: String) {
|
||||||
|
val backupDir = getBackupDirUri(context)
|
||||||
|
if (backupDir == null || validateDirAccess(context, backupDir)) {
|
||||||
|
throw IOException("Backup dir is not set or invalid.")
|
||||||
|
}
|
||||||
|
|
||||||
|
BackupPassphrase.set(context, password)
|
||||||
|
TextSecurePreferences.setBackupEnabled(context, true)
|
||||||
|
LocalBackupListener.schedule(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set app-wide configuration to disable the backups.
|
||||||
|
*
|
||||||
|
* This call resets the backup dir value.
|
||||||
|
* Make sure to call [setBackupDirUri] prior next call to [enableBackups].
|
||||||
|
*
|
||||||
|
* @param deleteBackupFiles if true, deletes all the previously created backup files
|
||||||
|
* (if the app has access to them)
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
fun disableBackups(context: Context, deleteBackupFiles: Boolean) {
|
||||||
|
BackupPassphrase.set(context, null)
|
||||||
|
TextSecurePreferences.setBackupEnabled(context, false)
|
||||||
|
if (deleteBackupFiles) {
|
||||||
|
deleteAllBackupFiles(context)
|
||||||
|
}
|
||||||
|
setBackupDirUri(context, null)
|
||||||
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun getLastBackupTimeString(context: Context, locale: Locale): String {
|
fun getLastBackupTimeString(context: Context, locale: Locale): String {
|
||||||
val timestamp = DatabaseFactory.getLokiBackupFilesDatabase(context).getLastBackupFileTime()
|
val timestamp = DatabaseFactory.getLokiBackupFilesDatabase(context).getLastBackupFileTime()
|
||||||
|
@ -141,7 +141,7 @@ public class TextSecurePreferences {
|
|||||||
private static final String ACTIVE_SIGNED_PRE_KEY_ID = "pref_active_signed_pre_key_id";
|
private static final String ACTIVE_SIGNED_PRE_KEY_ID = "pref_active_signed_pre_key_id";
|
||||||
private static final String NEXT_SIGNED_PRE_KEY_ID = "pref_next_signed_pre_key_id";
|
private static final String NEXT_SIGNED_PRE_KEY_ID = "pref_next_signed_pre_key_id";
|
||||||
|
|
||||||
public static final String BACKUP_ENABLED = "pref_backup_enabled";
|
public static final String BACKUP_ENABLED = "pref_backup_enabled_v2";
|
||||||
private static final String BACKUP_PASSPHRASE = "pref_backup_passphrase";
|
private static final String BACKUP_PASSPHRASE = "pref_backup_passphrase";
|
||||||
private static final String ENCRYPTED_BACKUP_PASSPHRASE = "pref_encrypted_backup_passphrase";
|
private static final String ENCRYPTED_BACKUP_PASSPHRASE = "pref_encrypted_backup_passphrase";
|
||||||
private static final String BACKUP_TIME = "pref_backup_next_time";
|
private static final String BACKUP_TIME = "pref_backup_next_time";
|
||||||
|
Loading…
Reference in New Issue
Block a user