diff options
Diffstat (limited to 'core/java/android/app/Dialog.java')
-rw-r--r-- | core/java/android/app/Dialog.java | 64 |
1 files changed, 54 insertions, 10 deletions
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index 222fe75..9432755 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -20,6 +20,7 @@ import com.android.internal.policy.PolicyManager; import android.content.Context; import android.content.DialogInterface; +import android.content.ComponentName; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; @@ -86,6 +87,7 @@ public class Dialog implements DialogInterface, Window.Callback, private Message mCancelMessage; private Message mDismissMessage; + private Message mShowMessage; /** * Whether to cancel the dialog when a touch is received outside of the @@ -140,7 +142,7 @@ public class Dialog implements DialogInterface, Window.Callback, w.setWindowManager(mWindowManager, null, null); w.setGravity(Gravity.CENTER); mUiThread = Thread.currentThread(); - mDismissCancelHandler = new DismissCancelHandler(this); + mListenersHandler = new ListenersHandler(this); } /** @@ -235,6 +237,8 @@ public class Dialog implements DialogInterface, Window.Callback, } mWindowManager.addView(mDecor, l); mShowing = true; + + sendShowMessage(); } /** @@ -289,11 +293,20 @@ public class Dialog implements DialogInterface, Window.Callback, } } + private void sendShowMessage() { + if (mShowMessage != null) { + // Obtain a new message so this dialog can be re-used + Message.obtain(mShowMessage).sendToTarget(); + } + } + // internal method to make sure mcreated is set properly without requiring // users to call through to super in onCreate void dispatchOnCreate(Bundle savedInstanceState) { - onCreate(savedInstanceState); - mCreated = true; + if (!mCreated) { + onCreate(savedInstanceState); + mCreated = true; + } } /** @@ -772,8 +785,22 @@ public class Dialog implements DialogInterface, Window.Callback, * This hook is called when the user signals the desire to start a search. */ public boolean onSearchRequested() { - // not during dialogs, no. - return false; + final SearchManager searchManager = (SearchManager) mContext + .getSystemService(Context.SEARCH_SERVICE); + + // can't start search without an associated activity (e.g a system dialog) + if (!searchManager.hasIdent()) { + return false; + } + + // associate search with owner activity if possible (otherwise it will default to + // global search). + final ComponentName appName = mOwnerActivity == null ? null + : mOwnerActivity.getComponentName(); + final boolean globalSearch = (appName == null); + searchManager.startSearch(null, false, appName, null, globalSearch); + dismiss(); + return true; } @@ -888,7 +915,7 @@ public class Dialog implements DialogInterface, Window.Callback, */ public void setOnCancelListener(final OnCancelListener listener) { if (listener != null) { - mCancelMessage = mDismissCancelHandler.obtainMessage(CANCEL, listener); + mCancelMessage = mListenersHandler.obtainMessage(CANCEL, listener); } else { mCancelMessage = null; } @@ -909,13 +936,26 @@ public class Dialog implements DialogInterface, Window.Callback, */ public void setOnDismissListener(final OnDismissListener listener) { if (listener != null) { - mDismissMessage = mDismissCancelHandler.obtainMessage(DISMISS, listener); + mDismissMessage = mListenersHandler.obtainMessage(DISMISS, listener); } else { mDismissMessage = null; } } /** + * Sets a listener to be invoked when the dialog is shown. + * + * @hide Pending API council approval + */ + public void setOnShowListener(OnShowListener listener) { + if (listener != null) { + mShowMessage = mListenersHandler.obtainMessage(SHOW, listener); + } else { + mShowMessage = null; + } + } + + /** * Set a message to be sent when the dialog is dismissed. * @param msg The msg to send when the dialog is dismissed. */ @@ -949,13 +989,14 @@ public class Dialog implements DialogInterface, Window.Callback, private static final int DISMISS = 0x43; private static final int CANCEL = 0x44; + private static final int SHOW = 0x45; - private Handler mDismissCancelHandler; + private Handler mListenersHandler; - private static final class DismissCancelHandler extends Handler { + private static final class ListenersHandler extends Handler { private WeakReference<DialogInterface> mDialog; - public DismissCancelHandler(Dialog dialog) { + public ListenersHandler(Dialog dialog) { mDialog = new WeakReference<DialogInterface>(dialog); } @@ -968,6 +1009,9 @@ public class Dialog implements DialogInterface, Window.Callback, case CANCEL: ((OnCancelListener) msg.obj).onCancel(mDialog.get()); break; + case SHOW: + ((OnShowListener) msg.obj).onShow(mDialog.get()); + break; } } } |