am 9c902ca4: am 33669f35: Merge "Kill dreams that do not create a timely service connection." into jb-mr1.1-dev

* commit '9c902ca4732f8c2a5afda4047415d1de6d3db493':
  Kill dreams that do not create a timely service connection.
diff --git a/services/java/com/android/server/dreams/DreamController.java b/services/java/com/android/server/dreams/DreamController.java
index 1ab6a77..45ae2c5 100644
--- a/services/java/com/android/server/dreams/DreamController.java
+++ b/services/java/com/android/server/dreams/DreamController.java
@@ -44,6 +44,9 @@
 final class DreamController {
     private static final String TAG = "DreamController";
 
+    // How long we wait for a newly bound dream to create the service connection
+    private static final int DREAM_CONNECTION_TIMEOUT = 5 * 1000;
+
     private final Context mContext;
     private final Handler mHandler;
     private final Listener mListener;
@@ -58,6 +61,16 @@
 
     private DreamRecord mCurrentDream;
 
+    private final Runnable mStopUnconnectedDreamRunnable = new Runnable() {
+        @Override
+        public void run() {
+            if (mCurrentDream != null && mCurrentDream.mBound && !mCurrentDream.mConnected) {
+                Slog.w(TAG, "Bound dream did not connect in the time allotted");
+                stopDream();
+            }
+        }
+    };
+
     public DreamController(Context context, Handler handler, Listener listener) {
         mContext = context;
         mHandler = handler;
@@ -116,6 +129,7 @@
         }
 
         mCurrentDream.mBound = true;
+        mHandler.postDelayed(mStopUnconnectedDreamRunnable, DREAM_CONNECTION_TIMEOUT);
     }
 
     public void stopDream() {
@@ -128,6 +142,8 @@
         Slog.i(TAG, "Stopping dream: name=" + oldDream.mName
                 + ", isTest=" + oldDream.mIsTest + ", userId=" + oldDream.mUserId);
 
+        mHandler.removeCallbacks(mStopUnconnectedDreamRunnable);
+
         if (oldDream.mSentStartBroadcast) {
             mContext.sendBroadcastAsUser(mDreamingStoppedIntent, UserHandle.ALL);
         }
@@ -200,6 +216,7 @@
         public final int mUserId;
 
         public boolean mBound;
+        public boolean mConnected;
         public IDreamService mService;
         public boolean mSentStartBroadcast;
 
@@ -231,6 +248,7 @@
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
+                    mConnected = true;
                     if (mCurrentDream == DreamRecord.this && mService == null) {
                         attach(IDreamService.Stub.asInterface(service));
                     }