summaryrefslogtreecommitdiffstats
path: root/core/java/android/app/Dialog.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/app/Dialog.java')
-rw-r--r--core/java/android/app/Dialog.java64
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;
}
}
}