package com.ichi2.anki.dialogs; import android.os.Bundle; import android.os.Message; import com.afollestad.materialdialogs.MaterialDialog; import com.ichi2.anki.R; import java.util.ArrayList; import java.util.List; public class MediaCheckDialog extends AsyncDialogFragment { public static final int DIALOG_CONFIRM_MEDIA_CHECK = 0; public static final int DIALOG_MEDIA_CHECK_RESULTS = 1; public interface MediaCheckDialogListener { public void showMediaCheckDialog(int dialogType); public void showMediaCheckDialog(int dialogType, List<List<String>> checkList); public void mediaCheck(); public void deleteUnused(List<String> unused); public void dismissAllDialogFragments(); } public static MediaCheckDialog newInstance(int dialogType) { MediaCheckDialog f = new MediaCheckDialog(); Bundle args = new Bundle(); args.putInt("dialogType", dialogType); f.setArguments(args); return f; } public static MediaCheckDialog newInstance(int dialogType, List<List<String>> checkList) { MediaCheckDialog f = new MediaCheckDialog(); Bundle args = new Bundle(); args.putStringArrayList("nohave", new ArrayList<>(checkList.get(0))); args.putStringArrayList("unused", new ArrayList<>(checkList.get(1))); args.putStringArrayList("invalid", new ArrayList<>(checkList.get(2))); args.putInt("dialogType", dialogType); f.setArguments(args); return f; } @Override public MaterialDialog onCreateDialog(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MaterialDialog.Builder builder = new MaterialDialog.Builder(getActivity()); builder.title(getNotificationTitle()); switch (getArguments().getInt("dialogType")) { case DIALOG_CONFIRM_MEDIA_CHECK: return builder.content(getNotificationMessage()) .positiveText(res().getString(R.string.dialog_ok)) .negativeText(res().getString(R.string.dialog_cancel)) .cancelable(true) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { ((MediaCheckDialogListener) getActivity()).mediaCheck(); ((MediaCheckDialogListener) getActivity()) .dismissAllDialogFragments(); } @Override public void onNegative(MaterialDialog dialog) { ((MediaCheckDialogListener) getActivity()) .dismissAllDialogFragments(); } }) .show(); case DIALOG_MEDIA_CHECK_RESULTS: final ArrayList<String> nohave = getArguments().getStringArrayList("nohave"); final ArrayList<String> unused = getArguments().getStringArrayList("unused"); final ArrayList<String> invalid = getArguments().getStringArrayList("invalid"); // Generate report String report = ""; if (invalid.size() > 0) { report += String.format(res().getString(R.string.check_media_invalid), invalid.size()); } if (unused.size() > 0) { if (report.length() > 0) { report += "\n"; } report += String.format(res().getString(R.string.check_media_unused), unused.size()); } if (nohave.size() > 0) { if (report.length() > 0) { report += "\n"; } report += String.format(res().getString(R.string.check_media_nohave), nohave.size()); } if (report.length() == 0) { report = res().getString(R.string.check_media_no_unused_missing); } // We also prefix the report with a message about the media db being rebuilt, since // we do a full media scan and update the db on each media check on AnkiDroid. report = res().getString(R.string.check_media_db_updated) + "\n\n" + report; builder.content(report) .cancelable(true); // If we have unused files, show a dialog with a "delete" button. Otherwise, the user only // needs to acknowledge the results, so show only an OK dialog. if (unused.size() > 0) { builder.positiveText(res().getString(R.string.dialog_ok)) .negativeText(res().getString(R.string.check_media_delete_unused)) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { ((MediaCheckDialogListener) getActivity()) .dismissAllDialogFragments(); } @Override public void onNegative(MaterialDialog dialog) { ((MediaCheckDialogListener) getActivity()).deleteUnused(unused); dismissAllDialogFragments(); } }); } else { builder.positiveText(res().getString(R.string.dialog_ok)) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { ((MediaCheckDialogListener) getActivity()).dismissAllDialogFragments(); } }); } return builder.show(); default: return null; } } public void dismissAllDialogFragments() { ((MediaCheckDialogListener) getActivity()).dismissAllDialogFragments(); } @Override public String getNotificationMessage() { switch (getArguments().getInt("dialogType")) { case DIALOG_CONFIRM_MEDIA_CHECK: return res().getString(R.string.check_media_warning); default: return res().getString(R.string.app_name); } } @Override public String getNotificationTitle() { switch (getArguments().getInt("dialogType")) { case DIALOG_CONFIRM_MEDIA_CHECK: return res().getString(R.string.check_media_title); case DIALOG_MEDIA_CHECK_RESULTS: return res().getString(R.string.check_media_acknowledge); default: return res().getString(R.string.app_name); } } @Override public Message getDialogHandlerMessage() { Message msg = Message.obtain(); msg.what = DialogHandler.MSG_SHOW_MEDIA_CHECK_COMPLETE_DIALOG; Bundle b = new Bundle(); b.putStringArrayList("nohave", getArguments().getStringArrayList("nohave")); b.putStringArrayList("unused", getArguments().getStringArrayList("unused")); b.putStringArrayList("invalid", getArguments().getStringArrayList("invalid")); b.putInt("dialogType", getArguments().getInt("dialogType")); msg.setData(b); return msg; } }