package com.ichi2.anki.dialogs; import android.content.DialogInterface; import android.content.res.Resources; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.View; import com.afollestad.materialdialogs.MaterialDialog; import com.ichi2.anki.CollectionHelper; import com.ichi2.anki.R; import com.ichi2.anki.UIUtils; import com.ichi2.libanki.Utils; import com.ichi2.themes.Themes; import java.io.File; import java.util.List; public class ImportDialog extends DialogFragment { private int mType = 0; public static final int DIALOG_IMPORT_HINT = 0; public static final int DIALOG_IMPORT_SELECT = 1; public static final int DIALOG_IMPORT_ADD_CONFIRM = 2; public static final int DIALOG_IMPORT_REPLACE_CONFIRM = 3; public interface ImportDialogListener { public void showImportDialog(int id, String message); public void showImportDialog(int id); public void importAdd(String importPath); public void importReplace(String importPath); public void dismissAllDialogFragments(); } /** * A set of dialogs which deal with importing a file * * @param dialogType An integer which specifies which of the sub-dialogs to show * @param dialogMessage An optional string which can be used to show a custom message * or specify import path */ public static ImportDialog newInstance(int dialogType, String dialogMessage) { ImportDialog f = new ImportDialog(); Bundle args = new Bundle(); args.putInt("dialogType", dialogType); args.putString("dialogMessage", dialogMessage); f.setArguments(args); return f; } @Override public MaterialDialog onCreateDialog(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mType = getArguments().getInt("dialogType"); Resources res = getResources(); MaterialDialog.Builder builder = new MaterialDialog.Builder(getActivity()); builder.cancelable(true); switch (mType) { case DIALOG_IMPORT_HINT: // Instruct the user that they need to put their APKG files into the AnkiDroid directory return builder.title(res.getString(R.string.import_title)) .content(res.getString(R.string.import_hint, CollectionHelper.getCurrentAnkiDroidDirectory(getActivity()))) .positiveText(res.getString(R.string.dialog_ok)) .negativeText(res.getString(R.string.dialog_cancel)) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { ((ImportDialogListener) getActivity()).showImportDialog(DIALOG_IMPORT_SELECT); } @Override public void onNegative(MaterialDialog dialog) { dismissAllDialogFragments(); } }) .show(); case DIALOG_IMPORT_SELECT: // Allow user to choose from the list of available APKG files List<File> fileList = Utils.getImportableDecks(getActivity()); if (fileList.size() == 0) { UIUtils.showThemedToast(getActivity(), getResources().getString(R.string.upgrade_import_no_file_found, "'.apkg'"), false); return builder.showListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { dialog.cancel(); } }).show(); } else { String[] tts = new String[fileList.size()]; final String[] importValues = new String[fileList.size()]; for (int i = 0; i < tts.length; i++) { tts[i] = fileList.get(i).getName().replace(".apkg", ""); importValues[i] = fileList.get(i).getAbsolutePath(); } return builder.title(res.getString(R.string.import_select_title)) .items(tts) .itemsCallback(new MaterialDialog.ListCallback() { @Override public void onSelection(MaterialDialog materialDialog, View view, int i, CharSequence charSequence) { String importPath = importValues[i]; // If the apkg file is called "collection.apkg", we assume the collection will be replaced if (filenameFromPath(importPath).equals("collection.apkg")) { ((ImportDialogListener) getActivity()).showImportDialog(DIALOG_IMPORT_REPLACE_CONFIRM, importPath); // Otherwise we add the file since exported decks / shared decks can't be imported via replace anyway } else { ((ImportDialogListener) getActivity()).showImportDialog(DIALOG_IMPORT_ADD_CONFIRM, importPath); } } }) .show(); } case DIALOG_IMPORT_ADD_CONFIRM: return builder.title(res.getString(R.string.import_title)) .content(res.getString(R.string.import_message_add_confirm, filenameFromPath(getArguments().getString("dialogMessage")))) .positiveText(res.getString(R.string.import_message_add)) .negativeText(res.getString(R.string.dialog_cancel)) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { ((ImportDialogListener) getActivity()).importAdd(getArguments().getString("dialogMessage")); dismissAllDialogFragments(); } }) .show(); case DIALOG_IMPORT_REPLACE_CONFIRM: return builder.title(res.getString(R.string.import_title)) .content(res.getString(R.string.import_message_replace_confirm, getArguments().getString("dialogMessage"))) .positiveText(res.getString(R.string.dialog_positive_replace)) .negativeText(res.getString(R.string.dialog_cancel)) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { ((ImportDialogListener) getActivity()).importReplace(getArguments().getString("dialogMessage")); dismissAllDialogFragments(); } }) .show(); default: return null; } } public void dismissAllDialogFragments() { ((ImportDialogListener) getActivity()).dismissAllDialogFragments(); } private static String filenameFromPath (String path) { return path.split("/")[path.split("/").length - 1]; } }