mirror of
https://github.com/beemdevelopment/Aegis.git
synced 2025-05-16 15:02:54 +00:00
Clarify backup reminder with time elapsed since last backup/export
This commit is contained in:
parent
d7e2114811
commit
8cf48a94aa
33 changed files with 126 additions and 44 deletions
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue