package com.circlegate.liban.dialog; import java.util.ArrayList; import java.util.List; import com.circlegate.liban.R; import com.circlegate.liban.base.CommonClasses.IGlobalContext; import com.circlegate.liban.fragment.BaseRetainFragment; import com.circlegate.liban.task.TaskErrors.ITaskError; import com.circlegate.liban.task.TaskInterfaces.ITaskContext; import com.circlegate.liban.task.TaskInterfaces.ITaskResult; import com.circlegate.liban.utils.FragmentUtils; import com.circlegate.liban.utils.LogUtils; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.speech.RecognizerIntent; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.view.View; import android.view.View.OnClickListener; import android.widget.Toast; import eu.inmite.android.lib.dialogs.BaseDialogFragment; public class DialogsFragment extends BaseRetainFragment { private static final String TAG = DialogsFragment.class.getSimpleName(); protected static final String FRAGMENT_TAG = DialogsFragment.class.getName(); protected static final String DIALOG_FRAGMENT_TAG = FRAGMENT_TAG + ".Dialog"; protected DialogFragment dialog; private String currCallerFragmentTag; private boolean wasShownDialogToFinish = false; // po nastaveni na true uz nepovolim zobrazeni zadneho dalsiho dialogu! - ceka se, dokud uzivatel v danem dialogu neklikne na OK, cimz dojde k ukonceni aktivity public interface IDialogsFragmentActivity { DialogsFragment getDialogsFragment(); } public static <T extends FragmentActivity & IDialogsFragmentActivity> DialogsFragment getInstance(T activity) { FragmentManager fm = activity.getSupportFragmentManager(); DialogsFragment f = (DialogsFragment)fm.findFragmentByTag(FRAGMENT_TAG); if (f == null) { f = new DialogsFragment(); fm.beginTransaction().add(f, FRAGMENT_TAG).commit(); } return f; } // // Livecycle callbacks // @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); this.dialog = (DialogFragment)getFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case IGlobalContext.RQC_SPEECH_RECOGNITION: if (resultCode == Activity.RESULT_OK) { ArrayList<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); if (results != null && results.size() > 0) { final RecognizedTextSetter listener; if (this.currCallerFragmentTag == null) { listener = (RecognizedTextSetter)getActivity(); } else { listener = (RecognizedTextSetter) FragmentUtils.findFragmentByNestedTag(getActivity(), this.currCallerFragmentTag); } if (listener != null) { listener.onRecognizedText(results.get(0)); } } } break; default: super.onActivityResult(requestCode, resultCode, data); break; } } // // Dialogs // public boolean getWasShownDialogToFinish() { return this.wasShownDialogToFinish; } public void showErrorMsg(final ITaskContext context, final ITaskResult res, final boolean finish) { LogUtils.e(TAG, "showErrorMsg(1): " + res.getError().getMsg(context).toString()); if (!canShowNewDialog()) return; if (!isReadyToCommitFragments()) { addPendingTask(new Runnable() { public void run() { showErrorMsg(context, res, finish); } }); } else { wasShownDialogToFinish = finish; DialogFragment newDialog = res.getError() instanceof ITaskErrorWtDialog ? ((ITaskErrorWtDialog)res.getError()).createDialog(context, finish) : ErrorMsgDialog.newInstance(res.getError().getMsg(context), finish); this.dialog = FragmentUtils.showDialogRemoveOldOne(getFragmentManager(), this.dialog, newDialog, DIALOG_FRAGMENT_TAG); } } public void showErrorMsgAndExit(final CharSequence msg, final String optionalDetailLog) { LogUtils.e(TAG, "showErrorMsgAndExit: " + msg.toString()); if (!canShowNewDialog()) return; if (!isReadyToCommitFragments()) { addPendingTask(new Runnable() { public void run() { showErrorMsgAndExit(msg, optionalDetailLog); } }); } else { wasShownDialogToFinish = true; DialogFragment newDialog = ErrorMsgDialog.newInstance(msg, true/*optionalDetailLog*/); this.dialog = FragmentUtils.showDialogRemoveOldOne(getFragmentManager(), this.dialog, newDialog, DIALOG_FRAGMENT_TAG); } } public void showErrorMsg(final CharSequence msg) { showPromptDialog(getResourcesSafe().getString(R.string.error), msg); } public void showWarningMsg(final CharSequence msg) { showPromptDialog(getResourcesSafe().getString(R.string.warning), msg); } public void showMsgNoTitle(final CharSequence msg) { showPromptDialog("", msg); } public void showPromptDialog(final CharSequence title, final CharSequence msg) { LogUtils.e(TAG, "showPromptDialog: " + title + ": " + msg.toString()); if (!canShowNewDialog()) return; if (!isReadyToCommitFragments()) { addPendingTask(new Runnable() { public void run() { showPromptDialog(title, msg); } }); } else { this.dialog = PromptDialog.show(getFragmentManager(), this.dialog, DIALOG_FRAGMENT_TAG, null, title, msg, false); } } public void showProgressDialog(final CharSequence msg) { showProgressDialog(msg, true); } public void showProgressDialog(final CharSequence msg, final boolean cancelable) { if (!canShowNewDialog()) return; if (!isReadyToCommitFragments()) { addPendingTask(new Runnable() { public void run() { showProgressDialog(msg, cancelable); } }); } else { this.dialog = ProgressDialog.show(getFragmentManager(), this.dialog, DIALOG_FRAGMENT_TAG, null, msg, cancelable, false, null); } } public void hideProgressDialog() { if (!isReadyToCommitFragments()) { addPendingTask(new Runnable() { public void run() { hideProgressDialog(); } }); } else { FragmentManager fm = getFragmentManager(); if (this.dialog == null) this.dialog = (DialogFragment)fm.findFragmentByTag(DIALOG_FRAGMENT_TAG); if (this.dialog instanceof ProgressDialog) { fm.beginTransaction().remove(this.dialog).commit(); this.dialog = null; } } } public void showSpeechRecognitionActivity(final String msg, final String fragmentTag) { if (!canShowNewDialog()) return; if (!isReadyToCommitFragments()) { addPendingTask(new Runnable() { public void run() { showSpeechRecognitionActivity(msg, fragmentTag); } }); } else { this.currCallerFragmentTag = fragmentTag; PackageManager pm = getActivity().getPackageManager(); List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); if (activities.size() == 0) { Toast.makeText(getActivity(), R.string.voice_recognition_not_available, Toast.LENGTH_LONG).show(); } else { Intent itVoiceRec = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); itVoiceRec.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); itVoiceRec.putExtra(RecognizerIntent.EXTRA_PROMPT, msg); startActivityForResult(itVoiceRec, IGlobalContext.RQC_SPEECH_RECOGNITION); } } } // // PRIVATE // private boolean canShowNewDialog() { if (wasShownDialogToFinish) { LogUtils.e(TAG, "Can't show new dialog after showing dialog to finish activity!"); return false; } else return true; } // // INNER CLASSES // public interface RecognizedTextSetter { void onRecognizedText(String text); } public interface ITaskErrorWtDialog extends ITaskError { DialogFragment createDialog(ITaskContext context, boolean finish); } public static class ErrorMsgDialog extends BaseDialogFragment { private boolean finish; public static ErrorMsgDialog newInstance(CharSequence msg, boolean finish) { Bundle b = new Bundle(); b.putCharSequence("msg", msg); b.putBoolean("finish", finish); ErrorMsgDialog ret = new ErrorMsgDialog(); ret.setArguments(b); ret.setCancelable(true); return ret; } @Override protected Builder build(Builder b, Bundle savedInstanceState) { Bundle args = getArguments(); final CharSequence errorMsg = args.getCharSequence("msg"); this.finish = args.getBoolean("finish"); b.setTitle(getString(R.string.error)); b.setMessage(errorMsg); b.setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick(View v) { dismiss(); if (finish && getActivity() != null) getActivity().finish(); } }); return b; } @Override public void onCancel(DialogInterface dialog) { super.onCancel(dialog); if (finish && getActivity() != null) getActivity().finish(); } } }