Fix issue #1999179: search -> click result -> press home = search dialog is shown then hidden

Re-arrange various things to ensure that the search dialog is told about system windows being
closed before it is told about the navigation back to home.
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 3aeac53..447512a 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -1085,6 +1085,7 @@
             reply.writeInt(result);
             return true;
         }
+        
         case KILL_APPLICATION_WITH_UID_TRANSACTION: {
             data.enforceInterface(IActivityManager.descriptor);
             String pkg = data.readString();
@@ -1093,6 +1094,14 @@
             reply.writeNoException();
             return true;
         }
+        
+        case CLOSE_SYSTEM_DIALOGS_TRANSACTION: {
+            data.enforceInterface(IActivityManager.descriptor);
+            String reason = data.readString();
+            closeSystemDialogs(reason);
+            reply.writeNoException();
+            return true;
+        }
         }
         
         return super.onTransact(code, data, reply, flags);
@@ -2376,6 +2385,7 @@
         data.recycle();
         return result;
     }
+    
     public void killApplicationWithUid(String pkg, int uid) throws RemoteException {
         Parcel data = Parcel.obtain();
         Parcel reply = Parcel.obtain();
@@ -2387,6 +2397,17 @@
         data.recycle();
         reply.recycle();
     }
+    
+    public void closeSystemDialogs(String reason) throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeString(reason);
+        mRemote.transact(CLOSE_SYSTEM_DIALOGS_TRANSACTION, data, reply, 0);
+        reply.readException();
+        data.recycle();
+        reply.recycle();
+    }
         
     private IBinder mRemote;
 }
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index b1b5282..f6ef549 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -268,7 +268,9 @@
             throws RemoteException;
 
     public void killApplicationWithUid(String pkg, int uid) throws RemoteException;
-        
+    
+    public void closeSystemDialogs(String reason) throws RemoteException;
+    
     /*
      * Private non-Binder interfaces
      */
@@ -424,4 +426,5 @@
     int UNREGISTER_ACTIVITY_WATCHER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+93;
     int START_ACTIVITY_IN_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+94;
     int KILL_APPLICATION_WITH_UID_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+95;
+    int CLOSE_SYSTEM_DIALOGS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+96;
 }
diff --git a/core/java/android/app/IActivityWatcher.aidl b/core/java/android/app/IActivityWatcher.aidl
index 5d36e3f..6737545 100644
--- a/core/java/android/app/IActivityWatcher.aidl
+++ b/core/java/android/app/IActivityWatcher.aidl
@@ -23,4 +23,5 @@
  */
 oneway interface IActivityWatcher {
     void activityResuming(int activityId);
+    void closingSystemDialogs(String reason);
 }
diff --git a/core/java/android/server/search/SearchDialogWrapper.java b/core/java/android/server/search/SearchDialogWrapper.java
index b8a9875..49718cb 100644
--- a/core/java/android/server/search/SearchDialogWrapper.java
+++ b/core/java/android/server/search/SearchDialogWrapper.java
@@ -63,6 +63,8 @@
     private static final int MSG_STOP_SEARCH = 2;
     // arg1 is activity id
     private static final int MSG_ACTIVITY_RESUMING = 3;
+    // obj is the reason
+    private static final int MSG_CLOSING_SYSTEM_DIALOGS = 4;
 
     private static final String KEY_INITIAL_QUERY = "q";
     private static final String KEY_LAUNCH_ACTIVITY = "a";
@@ -127,8 +129,7 @@
     private void registerBroadcastReceiver() {
         if (!mReceiverRegistered) {
             IntentFilter filter = new IntentFilter(
-                    Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
-            filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
+                    Intent.ACTION_CONFIGURATION_CHANGED);
             mContext.registerReceiver(mBroadcastReceiver, filter, null,
                     mSearchUiThread);
             mReceiverRegistered = true;
@@ -149,12 +150,7 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
-            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
-                if (!"search".equals(intent.getStringExtra("reason"))) {
-                    if (DBG) debug(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
-                    performStopSearch();
-                }
-            } else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
+            if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
                 if (DBG) debug(Intent.ACTION_CONFIGURATION_CHANGED);
                 performOnConfigurationChanged();
             }
@@ -219,6 +215,18 @@
         mSearchUiThread.sendMessage(msg);
     }
 
+    /**
+     * Handles closing of system windows/dialogs
+     * Can be called from any thread.
+     */
+    public void closingSystemDialogs(String reason) {
+        if (DBG) debug("closingSystemDialogs(reason=" + reason + ")");
+        Message msg = Message.obtain();
+        msg.what = MSG_CLOSING_SYSTEM_DIALOGS;
+        msg.obj = reason;
+        mSearchUiThread.sendMessage(msg);
+    }
+
     //
     // Implementation methods that run on the search UI thread
     //
@@ -244,6 +252,9 @@
                 case MSG_ACTIVITY_RESUMING:
                     performActivityResuming(msg.arg1);
                     break;
+                case MSG_CLOSING_SYSTEM_DIALOGS:
+                    performClosingSystemDialogs((String)msg.obj);
+                    break;
             }
         }
 
@@ -330,6 +341,19 @@
     }
 
     /**
+     * Updates due to system dialogs being closed
+     * This must be called on the search UI thread.
+     */
+    void performClosingSystemDialogs(String reason) {
+        if (DBG) debug("performClosingSystemDialogs(): mStartedIdent="
+                + mStartedIdent + ", reason: " + reason);
+        if (!"search".equals(reason)) {
+            if (DBG) debug(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+            performStopSearch();
+        }
+    }
+
+    /**
      * Must be called from the search UI thread.
      */
     void performOnConfigurationChanged() {
diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java
index fdeb8f9..afed4a4 100644
--- a/core/java/android/server/search/SearchManagerService.java
+++ b/core/java/android/server/search/SearchManagerService.java
@@ -138,6 +138,11 @@
             if (mSearchDialog == null) return;
             mSearchDialog.activityResuming(activityId);
         }
+        public void closingSystemDialogs(String reason) {
+            if (DBG) Log.i("foo", "********************** closing dialogs: " + reason);
+            if (mSearchDialog == null) return;
+            mSearchDialog.closingSystemDialogs(reason);
+        }
     };
     
     /**
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 5ea59ca..51ee41a 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -4760,6 +4760,34 @@
         }
     }
 
+    public void closeSystemDialogs(String reason) {
+        Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+        if (reason != null) {
+            intent.putExtra("reason", reason);
+        }
+        
+        final int uid = Binder.getCallingUid();
+        final long origId = Binder.clearCallingIdentity();
+        synchronized (this) {
+            int i = mWatchers.beginBroadcast();
+            while (i > 0) {
+                i--;
+                IActivityWatcher w = mWatchers.getBroadcastItem(i);
+                if (w != null) {
+                    try {
+                        w.closingSystemDialogs(reason);
+                    } catch (RemoteException e) {
+                    }
+                }
+            }
+            mWatchers.finishBroadcast();
+            
+            broadcastIntentLocked(null, null, intent, null,
+                    null, 0, null, null, null, false, false, -1, uid);
+        }
+        Binder.restoreCallingIdentity(origId);
+    }
+    
     private void restartPackageLocked(final String packageName, int uid) {
         uninstallPackageLocked(packageName, uid, false);
         Intent intent = new Intent(Intent.ACTION_PACKAGE_RESTARTED,