125 lines
6.0 KiB
Java
125 lines
6.0 KiB
Java
package org.thoughtcrime.securesms.backup;
|
|
|
|
|
|
import android.content.ClipData;
|
|
import android.content.ClipboardManager;
|
|
import android.content.Context;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.widget.Button;
|
|
import android.widget.CheckBox;
|
|
import android.widget.EditText;
|
|
import android.widget.TextView;
|
|
import android.widget.Toast;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.appcompat.app.AlertDialog;
|
|
|
|
import org.thoughtcrime.securesms.R;
|
|
import org.thoughtcrime.securesms.components.SwitchPreferenceCompat;
|
|
import org.thoughtcrime.securesms.registration.fragments.RestoreBackupFragment;
|
|
import org.thoughtcrime.securesms.service.LocalBackupListener;
|
|
import org.thoughtcrime.securesms.util.BackupUtil;
|
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
|
import org.thoughtcrime.securesms.util.Util;
|
|
import org.thoughtcrime.securesms.util.text.AfterTextChanged;
|
|
|
|
public class BackupDialog {
|
|
|
|
public static void showEnableBackupDialog(@NonNull Context context, @NonNull SwitchPreferenceCompat preference) {
|
|
String[] password = BackupUtil.generateBackupPassphrase();
|
|
AlertDialog dialog = new AlertDialog.Builder(context)
|
|
.setTitle(R.string.BackupDialog_enable_local_backups)
|
|
.setView(R.layout.backup_enable_dialog)
|
|
.setPositiveButton(R.string.BackupDialog_enable_backups, null)
|
|
.setNegativeButton(android.R.string.cancel, null)
|
|
.create();
|
|
|
|
dialog.setOnShowListener(created -> {
|
|
Button button = ((AlertDialog) created).getButton(AlertDialog.BUTTON_POSITIVE);
|
|
button.setOnClickListener(v -> {
|
|
CheckBox confirmationCheckBox = dialog.findViewById(R.id.confirmation_check);
|
|
if (confirmationCheckBox.isChecked()) {
|
|
BackupPassphrase.set(context, Util.join(password, " "));
|
|
TextSecurePreferences.setNextBackupTime(context, 0);
|
|
TextSecurePreferences.setBackupEnabled(context, true);
|
|
LocalBackupListener.schedule(context);
|
|
|
|
preference.setChecked(true);
|
|
created.dismiss();
|
|
} else {
|
|
Toast.makeText(context, R.string.BackupDialog_please_acknowledge_your_understanding_by_marking_the_confirmation_check_box, Toast.LENGTH_LONG).show();
|
|
}
|
|
});
|
|
});
|
|
|
|
dialog.show();
|
|
|
|
CheckBox checkBox = dialog.findViewById(R.id.confirmation_check);
|
|
TextView textView = dialog.findViewById(R.id.confirmation_text);
|
|
|
|
((TextView)dialog.findViewById(R.id.code_first)).setText(password[0]);
|
|
((TextView)dialog.findViewById(R.id.code_second)).setText(password[1]);
|
|
((TextView)dialog.findViewById(R.id.code_third)).setText(password[2]);
|
|
|
|
((TextView)dialog.findViewById(R.id.code_fourth)).setText(password[3]);
|
|
((TextView)dialog.findViewById(R.id.code_fifth)).setText(password[4]);
|
|
((TextView)dialog.findViewById(R.id.code_sixth)).setText(password[5]);
|
|
|
|
textView.setOnClickListener(v -> checkBox.toggle());
|
|
|
|
dialog.findViewById(R.id.number_table).setOnClickListener(v -> {
|
|
((ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("text", Util.join(password, " ")));
|
|
Toast.makeText(context, R.string.BackupDialog_copied_to_clipboard, Toast.LENGTH_LONG).show();
|
|
});
|
|
|
|
|
|
}
|
|
|
|
public static void showDisableBackupDialog(@NonNull Context context, @NonNull SwitchPreferenceCompat preference) {
|
|
new AlertDialog.Builder(context)
|
|
.setTitle(R.string.BackupDialog_delete_backups)
|
|
.setMessage(R.string.BackupDialog_disable_and_delete_all_local_backups)
|
|
.setNegativeButton(android.R.string.cancel, null)
|
|
.setPositiveButton(R.string.BackupDialog_delete_backups_statement, (dialog, which) -> {
|
|
BackupPassphrase.set(context, null);
|
|
TextSecurePreferences.setBackupEnabled(context, false);
|
|
BackupUtil.deleteAllBackups();
|
|
preference.setChecked(false);
|
|
})
|
|
.create()
|
|
.show();
|
|
}
|
|
|
|
public static void showVerifyBackupPassphraseDialog(@NonNull Context context) {
|
|
View view = LayoutInflater.from(context).inflate(R.layout.enter_backup_passphrase_dialog, null);
|
|
EditText prompt = view.findViewById(R.id.restore_passphrase_input);
|
|
AlertDialog dialog = new AlertDialog.Builder(context)
|
|
.setTitle(R.string.BackupDialog_enter_backup_passphrase_to_verify)
|
|
.setView(view)
|
|
.setPositiveButton(R.string.BackupDialog_verify, null)
|
|
.setNegativeButton(android.R.string.cancel, null)
|
|
.show();
|
|
|
|
Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
|
|
positiveButton.setEnabled(false);
|
|
|
|
RestoreBackupFragment.PassphraseAsYouTypeFormatter formatter = new RestoreBackupFragment.PassphraseAsYouTypeFormatter();
|
|
|
|
prompt.addTextChangedListener(new AfterTextChanged(editable -> {
|
|
formatter.afterTextChanged(editable);
|
|
positiveButton.setEnabled(editable.length() == BackupUtil.PASSPHRASE_LENGTH);
|
|
}));
|
|
|
|
positiveButton.setOnClickListener(v -> {
|
|
String passphrase = prompt.getText().toString();
|
|
if (passphrase.equals(BackupPassphrase.get(context))) {
|
|
Toast.makeText(context, R.string.BackupDialog_you_successfully_entered_your_backup_passphrase, Toast.LENGTH_SHORT).show();
|
|
dialog.dismiss();
|
|
} else {
|
|
Toast.makeText(context, R.string.BackupDialog_passphrase_was_not_correct, Toast.LENGTH_SHORT).show();
|
|
}
|
|
});
|
|
}
|
|
}
|