use of com.ichi2.anki.AnkiActivity in project AnkiChinaAndroid by ankichinateam.
the class CustomStudyDialog method onLimitsExtended.
private void onLimitsExtended(boolean jumpToReviewer) {
AnkiActivity activity = getAnkiActivity();
if (jumpToReviewer) {
activity.startActivityForResultWithoutAnimation(new Intent(activity, Reviewer.class), AnkiActivity.REQUEST_REVIEW);
} else {
listener.onExtendStudyLimits();
}
activity.dismissAllDialogFragments();
}
use of com.ichi2.anki.AnkiActivity in project AnkiChinaAndroid by ankichinateam.
the class DatabaseErrorDialog method onCreateDialog.
@Override
public MaterialDialog onCreateDialog(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int mType = getArguments().getInt("dialogType");
Resources res = getResources();
MaterialDialog.Builder builder = new MaterialDialog.Builder(getActivity());
builder.cancelable(true).title(getTitle());
boolean sqliteInstalled = false;
try {
sqliteInstalled = Runtime.getRuntime().exec("sqlite3 --version").waitFor() == 0;
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
switch(mType) {
case DIALOG_LOAD_FAILED:
{
// the activity
return builder.cancelable(false).content(getMessage()).iconAttr(R.attr.dialogErrorIcon).positiveText(res.getString(R.string.error_handling_options)).negativeText(res.getString(R.string.close)).onPositive((inner_dialog, which) -> ((DeckPicker) getActivity()).showDatabaseErrorDialog(DIALOG_ERROR_HANDLING)).onNegative((inner_dialog, which) -> exit()).show();
}
case DIALOG_DB_ERROR:
{
// Database Check failed to execute successfully; give user the option of either choosing from repair
// options, submitting an error report, or closing the activity
MaterialDialog dialog = builder.cancelable(false).content(getMessage()).iconAttr(R.attr.dialogErrorIcon).positiveText(res.getString(R.string.error_handling_options)).negativeText(res.getString(R.string.answering_error_report)).neutralText(res.getString(R.string.close)).onPositive((inner_dialog, which) -> ((DeckPicker) getActivity()).showDatabaseErrorDialog(DIALOG_ERROR_HANDLING)).onNegative((inner_dialog, which) -> {
((DeckPicker) getActivity()).sendErrorReport();
dismissAllDialogFragments();
}).onNeutral((inner_dialog, which) -> exit()).show();
dialog.getCustomView().findViewById(R.id.md_buttonDefaultNegative).setEnabled(((DeckPicker) getActivity()).hasErrorFiles());
return dialog;
}
case DIALOG_ERROR_HANDLING:
{
// The user has asked to see repair options; allow them to choose one of the repair options or go back
// to the previous dialog
ArrayList<String> options = new ArrayList<>();
ArrayList<Integer> values = new ArrayList<>();
if (!((AnkiActivity) getActivity()).colIsOpen()) {
// retry
options.add(res.getString(R.string.backup_retry_opening));
values.add(0);
} else {
// fix integrity
options.add(res.getString(R.string.check_db));
values.add(1);
}
// repair db with sqlite
if (sqliteInstalled) {
options.add(res.getString(R.string.backup_error_menu_repair));
values.add(2);
}
// // restore from backup
options.add(res.getString(R.string.backup_restore));
values.add(3);
// delete old collection and build new one
options.add(res.getString(R.string.backup_full_sync_from_server));
values.add(4);
// delete old collection and build new one
options.add(res.getString(R.string.backup_del_collection));
values.add(5);
String[] titles = new String[options.size()];
mRepairValues = new int[options.size()];
for (int i = 0; i < options.size(); i++) {
titles[i] = options.get(i);
mRepairValues[i] = values.get(i);
}
return builder.iconAttr(R.attr.dialogErrorIcon).negativeText(res.getString(R.string.dialog_cancel)).items(titles).itemsCallback((materialDialog, view, which, charSequence) -> {
switch(mRepairValues[which]) {
case 0:
((DeckPicker) getActivity()).restartActivity();
return;
case 1:
((DeckPicker) getActivity()).showDatabaseErrorDialog(DIALOG_CONFIRM_DATABASE_CHECK);
return;
case 2:
((DeckPicker) getActivity()).showDatabaseErrorDialog(DIALOG_REPAIR_COLLECTION);
return;
case 3:
((DeckPicker) getActivity()).showDatabaseErrorDialog(DIALOG_RESTORE_BACKUP);
return;
case 4:
((DeckPicker) getActivity()).showDatabaseErrorDialog(DIALOG_FULL_SYNC_FROM_SERVER);
return;
case 5:
((DeckPicker) getActivity()).showDatabaseErrorDialog(DIALOG_NEW_COLLECTION);
return;
default:
throw new RuntimeException("Unknown dialog selection: " + mRepairValues[which]);
}
}).show();
}
case DIALOG_REPAIR_COLLECTION:
{
// Allow user to run BackupManager.repairCollection()
return builder.content(getMessage()).iconAttr(R.attr.dialogErrorIcon).positiveText(res.getString(R.string.dialog_positive_repair)).negativeText(res.getString(R.string.dialog_cancel)).onPositive((inner_dialog, which) -> {
((DeckPicker) getActivity()).repairCollection();
dismissAllDialogFragments();
}).show();
}
case DIALOG_RESTORE_BACKUP:
{
// Allow user to restore one of the backups
String path = CollectionHelper.getInstance().getCollectionPath(getActivity());
File[] files = BackupManager.getBackups(new File(path));
mBackups = new File[files.length];
for (int i = 0; i < files.length; i++) {
mBackups[i] = files[files.length - 1 - i];
}
if (mBackups.length == 0) {
builder.title(res.getString(R.string.backup_restore)).content(getMessage()).positiveText(res.getString(R.string.dialog_ok)).onPositive((inner_dialog, which) -> ((DeckPicker) getActivity()).showDatabaseErrorDialog(DIALOG_ERROR_HANDLING));
} else {
String[] dates = new String[mBackups.length];
for (int i = 0; i < mBackups.length; i++) {
dates[i] = mBackups[i].getName().replaceAll(".*-(\\d{4}-\\d{2}-\\d{2})-(\\d{2})-(\\d{2}).apkg", "$1 ($2:$3 h)");
}
builder.title(res.getString(R.string.backup_restore_select_title)).negativeText(res.getString(R.string.dialog_cancel)).onNegative((inner_dialog, which) -> dismissAllDialogFragments()).items(dates).itemsCallbackSingleChoice(dates.length, (materialDialog, view, which, charSequence) -> {
if (mBackups[which].length() > 0) {
// restore the backup if it's valid
((DeckPicker) getActivity()).restoreFromBackup(mBackups[which].getPath());
dismissAllDialogFragments();
} else {
// otherwise show an error dialog
new MaterialDialog.Builder(getActivity()).title(R.string.backup_error).content(R.string.backup_invalid_file_error).positiveText(R.string.dialog_ok).build().show();
}
return true;
});
}
MaterialDialog materialDialog = builder.build();
materialDialog.setOnKeyListener((dialog, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Timber.i("DIALOG_RESTORE_BACKUP caught hardware back button");
dismissAllDialogFragments();
return true;
}
return false;
});
return materialDialog;
}
case DIALOG_NEW_COLLECTION:
{
// Allow user to create a new empty collection
return builder.content(getMessage()).positiveText(res.getString(R.string.dialog_positive_create)).negativeText(res.getString(R.string.dialog_cancel)).onPositive((inner_dialog, which) -> {
CollectionHelper ch = CollectionHelper.getInstance();
Time time = ch.getTimeSafe(getContext());
ch.closeCollection(false, "DatabaseErrorDialog: Before Create New Collection");
String path1 = CollectionHelper.getCollectionPath(getActivity());
if (BackupManager.moveDatabaseToBrokenFolder(path1, false, time)) {
((DeckPicker) getActivity()).restartActivity();
} else {
((DeckPicker) getActivity()).showDatabaseErrorDialog(DIALOG_LOAD_FAILED);
}
}).show();
}
case DIALOG_CONFIRM_DATABASE_CHECK:
{
// Confirmation dialog for database check
return builder.content(getMessage()).positiveText(res.getString(R.string.dialog_ok)).negativeText(res.getString(R.string.dialog_cancel)).onPositive((inner_dialog, which) -> {
((DeckPicker) getActivity()).integrityCheck();
dismissAllDialogFragments();
}).show();
}
case DIALOG_CONFIRM_RESTORE_BACKUP:
{
// Confirmation dialog for backup restore
return builder.content(getMessage()).positiveText(res.getString(R.string.dialog_continue)).negativeText(res.getString(R.string.dialog_cancel)).onPositive((inner_dialog, which) -> ((DeckPicker) getActivity()).showDatabaseErrorDialog(DIALOG_RESTORE_BACKUP)).show();
}
case DIALOG_FULL_SYNC_FROM_SERVER:
{
// Allow user to do a full-sync from the server
return builder.content(getMessage()).positiveText(res.getString(R.string.dialog_positive_overwrite)).negativeText(res.getString(R.string.dialog_cancel)).onPositive((inner_dialog, which) -> {
((DeckPicker) getActivity()).sync("download");
dismissAllDialogFragments();
}).show();
}
case DIALOG_DB_LOCKED:
{
// If the database is locked, all we can do is ask the user to exit.
return builder.content(getMessage()).positiveText(res.getString(R.string.close)).cancelable(false).onPositive((inner_dialog, which) -> exit()).show();
}
default:
return null;
}
}
use of com.ichi2.anki.AnkiActivity in project AnkiChinaAndroid by ankichinateam.
the class AnkiActivity method onCreate.
@Override
protected void onCreate(Bundle savedInstanceState) {
Timber.i("AnkiActivity::onCreate - %s-%d", mActivityName, getStatusBarColorAttr());
// The hardware buttons should control the music volume
setVolumeControlStream(AudioManager.STREAM_MUSIC);
// Set the theme
TypedValue value = new TypedValue();
getTheme().resolveAttribute(getStatusBarColorAttr(), value, true);
Timber.i("AnkiActivity::onCreate - %s-%d", mActivityName, value.resourceId);
Themes.setTheme(this, isStatusBarTransparent(), getStatusBarColorAttr());
super.onCreate(savedInstanceState);
// Disable the notifications bar if running under the test monkey.
if (AdaptionUtil.isUserATestClient()) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
mCustomTabActivityHelper = new CustomTabActivityHelper();
}
use of com.ichi2.anki.AnkiActivity in project AnkiChinaAndroid by ankichinateam.
the class AnkiActivity method showDialogFragment.
public static void showDialogFragment(AnkiActivity activity, DialogFragment newFragment) {
// DialogFragment.show() will take care of adding the fragment
// in a transaction. We also want to remove any currently showing
// dialog, so make our own transaction and take care of that here.
FragmentManager manager = activity.getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
Fragment prev = manager.findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
// save transaction to the back stack
ft.addToBackStack("dialog");
newFragment.show(ft, "dialog");
manager.executePendingTransactions();
}
use of com.ichi2.anki.AnkiActivity in project Anki-Android by ankidroid.
the class AnkiActivity method onCreate.
// #9332: UI Visibility -> Insets
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
Timber.i("AnkiActivity::onCreate - %s", mActivityName);
// The hardware buttons should control the music volume
setVolumeControlStream(AudioManager.STREAM_MUSIC);
// Set the theme
Themes.setTheme(this);
Themes.disableXiaomiForceDarkMode(this);
super.onCreate(savedInstanceState);
// Disable the notifications bar if running under the test monkey.
if (AdaptionUtil.isUserATestClient()) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
mCustomTabActivityHelper = new CustomTabActivityHelper();
}
Aggregations