Clarify backup reminder with time elapsed since last backup/export

This commit is contained in:
Alexander Bakker 2022-12-04 15:44:45 +01:00
parent d7e2114811
commit 8cf48a94aa
33 changed files with 126 additions and 44 deletions

View file

@ -10,21 +10,19 @@ import android.preference.PreferenceManager;
import androidx.annotation.Nullable;
import com.beemdevelopment.aegis.util.JsonUtils;
import com.beemdevelopment.aegis.util.TimeUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class Preferences {
@ -297,6 +295,36 @@ public class Preferences {
_prefs.edit().putBoolean("pref_focus_search", enabled).apply();
}
public void setLatestExportTimeNow() {
_prefs.edit().putLong("pref_export_latest", new Date().getTime()).apply();
setIsBackupReminderNeeded(false);
}
public Date getLatestBackupOrExportTime() {
List<Date> dates = new ArrayList<>();
long l = _prefs.getLong("pref_export_latest", 0);
if (l > 0) {
dates.add(new Date(l));
}
BackupResult builtinRes = getBuiltInBackupResult();
if (builtinRes != null) {
dates.add(builtinRes.getTime());
}
BackupResult androidRes = getAndroidBackupResult();
if (androidRes != null) {
dates.add(androidRes.getTime());
}
if (dates.size() == 0) {
return null;
}
return Collections.max(dates, Date::compareTo);
}
public void setBackupsLocation(Uri location) {
_prefs.edit().putString("pref_backups_location", location == null ? null : location.toString()).apply();
}
@ -466,8 +494,8 @@ public class Preferences {
return _time;
}
public String getHumanReadableTime() {
return DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(_time);
public String getElapsedSince(Context context) {
return TimeUtils.getElapsedSince(context, _time);
}
public boolean isBuiltIn() {

View file

@ -49,6 +49,7 @@ import com.beemdevelopment.aegis.ui.fragments.preferences.BackupsPreferencesFrag
import com.beemdevelopment.aegis.ui.fragments.preferences.PreferencesFragment;
import com.beemdevelopment.aegis.ui.tasks.QrDecodeTask;
import com.beemdevelopment.aegis.ui.views.EntryListView;
import com.beemdevelopment.aegis.util.TimeUtils;
import com.beemdevelopment.aegis.vault.VaultEntry;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
@ -56,6 +57,7 @@ import com.google.common.base.Strings;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -824,16 +826,17 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
});
_btnErrorBar.setVisibility(View.VISIBLE);
} else if (_prefs.isBackupsReminderNeeded()) {
_textErrorBar.setText(R.string.backup_reminder_bar_message);
_btnErrorBar.setOnClickListener(view -> {
startPreferencesActivity();
});
Date date = _prefs.getLatestBackupOrExportTime();
if (date != null) {
_textErrorBar.setText(getString(R.string.backup_reminder_bar_message_with_latest, TimeUtils.getElapsedSince(this, date)));
} else {
_textErrorBar.setText(R.string.backup_reminder_bar_message);
}
_btnErrorBar.setOnClickListener(view -> startPreferencesActivity());
_btnErrorBar.setVisibility(View.VISIBLE);
} else if (_prefs.isPlaintextBackupWarningNeeded()) {
_textErrorBar.setText(R.string.backup_plaintext_export_warning);
_btnErrorBar.setOnClickListener(view -> {
showPlaintextExportWarningOptions();
});
_btnErrorBar.setOnClickListener(view -> showPlaintextExportWarningOptions());
_btnErrorBar.setVisibility(View.VISIBLE);
} else {
_btnErrorBar.setVisibility(View.GONE);

View file

@ -404,7 +404,7 @@ public class Dialogs {
public static void showBackupErrorDialog(Context context, Preferences.BackupResult backupRes, DialogInterface.OnClickListener listener) {
String system = context.getString(backupRes.isBuiltIn() ? R.string.backup_system_builtin : R.string.backup_system_android);
String message = context.getString(R.string.backup_error_dialog_details, system, backupRes.getHumanReadableTime());
String message = context.getString(R.string.backup_error_dialog_details, system, backupRes.getElapsedSince(context));
Dialogs.showErrorDialog(context, message, backupRes.getError(), listener);
}

View file

@ -180,9 +180,9 @@ public class BackupsPreferencesFragment extends PreferencesFragment {
message = getString(R.string.backup_status_none);
} else if (res.isSuccessful()) {
color = R.color.success_color;
message = getString(R.string.backup_status_success, res.getHumanReadableTime());
message = getString(R.string.backup_status_success, res.getElapsedSince(requireContext()));
} else {
message = getString(R.string.backup_status_failed, res.getHumanReadableTime());
message = getString(R.string.backup_status_failed, res.getElapsedSince(requireContext()));
}
Spannable spannable = new SpannableString(message);

View file

@ -284,7 +284,7 @@ public class ImportExportPreferencesFragment extends PreferencesFragment {
}
// if the user creates an export, hide the backup reminder
_prefs.setIsBackupReminderNeeded(false);
_prefs.setLatestExportTimeNow();
Uri uri = FileProvider.getUriForFile(requireContext(), BuildConfig.FILE_PROVIDER_AUTHORITY, file);
Intent intent = new Intent(Intent.ACTION_SEND)
@ -496,7 +496,7 @@ public class ImportExportPreferencesFragment extends PreferencesFragment {
Dialogs.showErrorDialog(requireContext(), R.string.exporting_vault_error, e);
} else {
// if the user creates an export, hide the backup reminder
_prefs.setIsBackupReminderNeeded(false);
_prefs.setLatestExportTimeNow();
Toast.makeText(requireContext(), getString(R.string.exported_vault), Toast.LENGTH_SHORT).show();
}

View file

@ -0,0 +1,43 @@
package com.beemdevelopment.aegis.util;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
import androidx.annotation.PluralsRes;
import java.util.Date;
public class TimeUtils {
private TimeUtils() {
}
public static String getElapsedSince(Context context, Date date) {
long since = (new Date().getTime() - date.getTime()) / 1000;
if (since < 60) {
return formatElapsedSince(context, since, "seconds");
}
since /= 60;
if (since < 60) {
return formatElapsedSince(context, since, "minutes");
}
since /= 60;
if (since < 24) {
return formatElapsedSince(context, since, "hours");
}
since /= 24;
if (since < 365) {
return formatElapsedSince(context, since, "days");
}
since /= 365;
return formatElapsedSince(context, since, "years");
}
@SuppressLint("DiscouragedApi")
private static String formatElapsedSince(Context context, long since, String unit) {
Resources res = context.getResources();
@PluralsRes int id = res.getIdentifier(String.format("time_elapsed_%s", unit), "plurals", context.getPackageName());
return res.getQuantityString(id, (int) since, (int) since);
}
}