Prevent dream service finishSelf before it was attached

Bring back stopSelf logic to prevent dream service finishSelf before any
token attached.

Fix: 150818348
Test: manual test, won't throw exp while leaving dream service.
Merged-In: I31bb4f32013b9fa0aa2263b94117060e4d3a7341
Change-Id: I31bb4f32013b9fa0aa2263b94117060e4d3a7341
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index e70311f..efe28d9 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -906,22 +906,27 @@
             if (!mActivity.isFinishing()) {
                 // In case the activity is not finished yet, do it now.
                 mActivity.finishAndRemoveTask();
-                return;
             }
-        } else if (!mWindowless) {
-            Slog.w(TAG, "Finish was called before the dream was attached.");
+            return;
         }
 
-        if (!mFinished) {
-            mFinished = true;
+        if (mFinished) {
+            return;
+        }
+        mFinished = true;
 
-            try {
-                // finishSelf will unbind the dream controller from the dream service. This will
-                // trigger DreamService.this.onDestroy and DreamService.this will die.
-                mDreamManager.finishSelf(mDreamToken, true /*immediate*/);
-            } catch (RemoteException ex) {
-                // system server died
-            }
+        if (mDreamToken == null) {
+            Slog.w(TAG, "Finish was called before the dream was attached.");
+            stopSelf();
+            return;
+        }
+
+        try {
+            // finishSelf will unbind the dream controller from the dream service. This will
+            // trigger DreamService.this.onDestroy and DreamService.this will die.
+            mDreamManager.finishSelf(mDreamToken, true /*immediate*/);
+        } catch (RemoteException ex) {
+            // system server died
         }
     }