/* * Copyright (C) 2012 The CyanogenMod Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.cyanogenmod.filemanager.ui.policy; import android.content.Context; import android.os.AsyncTask; import android.text.Spanned; import android.widget.Toast; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.ui.dialogs.MessageProgressDialog; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.ExceptionUtil; /** * A class with the convenience methods for resolve actions */ public abstract class ActionsPolicy { /** * An interface for using in conjunction with AsyncTask for have * a */ protected interface BackgroundCallable { /** * Method that returns the resource identifier of the icon of the dialog * * @return int The resource identifier of the icon of the dialog */ int getDialogIcon(); /** * Method that returns the resource identifier of the title of the dialog * * @return int The resource identifier of the title of the dialog */ int getDialogTitle(); /** * Method that returns if the dialog is cancellable * * @return boolean If the dialog is cancellable */ boolean isDialogCancellable(); /** * Method invoked when need to update the progress of the dialog * * @return Spanned The text to show in the progress */ Spanned requestProgress(); /** * The method where the operation is done in background * * @param params The parameters * @throws Throwable If the operation failed, must be launch and exception */ void doInBackground(Object... params) throws Throwable; /** * Method invoked when the operation was successfully */ void onSuccess(); } /** * A task class for run operations in the background. It uses a dialog while * perform the operation. * * @see BackgroundCallable */ protected static class BackgroundAsyncTask extends AsyncTask<Object, Spanned, Throwable> { private final Context mCtx; private final BackgroundCallable mCallable; private MessageProgressDialog mDialog; /** * Constructor of <code>BackgroundAsyncTask</code> * * @param ctx The current context * @param callable The {@link BackgroundCallable} interface */ public BackgroundAsyncTask(Context ctx, BackgroundCallable callable) { super(); this.mCtx = ctx; this.mCallable = callable; } @Override protected void onPreExecute() { // Create the waiting dialog while doing some stuff on background final BackgroundAsyncTask task = this; this.mDialog = new MessageProgressDialog( this.mCtx, this.mCallable.getDialogIcon(), this.mCallable.getDialogTitle(), R.string.waiting_dialog_msg, this.mCallable.isDialogCancellable()); this.mDialog.setOnCancelListener(new MessageProgressDialog.OnCancelListener() { @Override public boolean onCancel() { return task.cancel(true); } }); Spanned progress = this.mCallable.requestProgress(); this.mDialog.setProgress(progress); this.mDialog.show(); } @Override protected Throwable doInBackground(Object... params) { try { this.mCallable.doInBackground(params); // Success return null; } catch (Throwable ex) { // Capture the exception return ex; } } @Override protected void onPostExecute(Throwable result) { // Close the waiting dialog this.mDialog.dismiss(); // Check the result (no relaunch, this is responsibility of callable doInBackground) if (result != null) { ExceptionUtil.translateException(this.mCtx, result, false, false); } else { //Operation complete. this.mCallable.onSuccess(); } } @Override protected void onCancelled() { //Operation complete. this.mCallable.onSuccess(); } @Override protected void onProgressUpdate(Spanned... values) { this.mDialog.setProgress(values[0]); } /** * @hide */ void onRequestProgress() { Spanned mProgress = this.mCallable.requestProgress(); publishProgress(mProgress); } } /** * Method that shows a message when the operation is complete successfully * * @param ctx The current context * @hide */ protected static void showOperationSuccessMsg(Context ctx) { DialogHelper.showToast(ctx, R.string.msgs_success, Toast.LENGTH_SHORT); } }