package com.artifex.mupdfdemo; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.RectF; import android.os.Handler; class ProgressDialogX extends ProgressDialog { public ProgressDialogX(Context context) { super(context); } private boolean mCancelled = false; public boolean isCancelled() { return mCancelled; } @Override public void cancel() { mCancelled = true; super.cancel(); } } public abstract class SearchTask { private static final int SEARCH_PROGRESS_DELAY = 200; private final Context mContext; private final MuPDFCore mCore; private final Handler mHandler; private final AlertDialog.Builder mAlertBuilder; private AsyncTask mSearchTask; public SearchTask(Context context, MuPDFCore core) { mContext = context; mCore = core; mHandler = new Handler(); mAlertBuilder = new AlertDialog.Builder(context); } protected abstract void onTextFound(SearchTaskResult result); public void stop() { if (mSearchTask != null) { mSearchTask.cancel(true); mSearchTask = null; } } public void go(final String text, int direction, int displayPage, int searchPage) { if (mCore == null) return; stop(); final int increment = direction; final int startIndex = searchPage == -1 ? displayPage : searchPage + increment; final ProgressDialogX progressDialog = new ProgressDialogX(mContext); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setTitle(mContext.getString(R.string.searching_)); progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { stop(); } }); progressDialog.setMax(mCore.countPages()); mSearchTask = new AsyncTask() { @Override protected SearchTaskResult doInBackground(Void... params) { int index = startIndex; while (0 <= index && index < mCore.countPages() && !isCancelled()) { publishProgress(index); RectF searchHits[] = mCore.searchPage(index, text); if (searchHits != null && searchHits.length > 0) return new SearchTaskResult(text, index, searchHits); index += increment; } return null; } @Override protected void onPostExecute(SearchTaskResult result) { progressDialog.cancel(); if (result != null) { onTextFound(result); } else { mAlertBuilder.setTitle(SearchTaskResult.get() == null ? R.string.text_not_found : R.string.no_further_occurrences_found); AlertDialog alert = mAlertBuilder.create(); alert.setButton(AlertDialog.BUTTON_POSITIVE, mContext.getString(R.string.dismiss), (DialogInterface.OnClickListener)null); alert.show(); } } @Override protected void onCancelled() { progressDialog.cancel(); } @Override protected void onProgressUpdate(Integer... values) { progressDialog.setProgress(values[0].intValue()); } @Override protected void onPreExecute() { super.onPreExecute(); mHandler.postDelayed(new Runnable() { public void run() { if (!progressDialog.isCancelled()) { progressDialog.show(); progressDialog.setProgress(startIndex); } } }, SEARCH_PROGRESS_DELAY); } }; mSearchTask.execute(); } }