Separate stacks into Home and others.

Change-Id: I9434ee6cd9e8a8baf24d4e4ee5a15e99cf11f227
diff --git a/services/java/com/android/server/wm/DisplayContent.java b/services/java/com/android/server/wm/DisplayContent.java
index bcefc41..61aa0de 100644
--- a/services/java/com/android/server/wm/DisplayContent.java
+++ b/services/java/com/android/server/wm/DisplayContent.java
@@ -20,6 +20,8 @@
 import android.view.Display;
 import android.view.DisplayInfo;
 
+import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
+
 import java.io.PrintWriter;
 import java.util.ArrayList;
 
@@ -193,6 +195,15 @@
         return false;
     }
 
+    void removeStackBox(StackBox box) {
+        final TaskStack stack = box.mStack;
+        if (stack != null && stack.mStackId == HOME_STACK_ID) {
+            // Never delete the home stack, even if it is empty.
+            return;
+        }
+        mStackBoxes.remove(box);
+    }
+
     /**
      * Reorder a StackBox within mStackBox. The StackBox to reorder is the one containing the
      * specified TaskStack.
diff --git a/services/java/com/android/server/wm/StackBox.java b/services/java/com/android/server/wm/StackBox.java
index 4bdb406..31d1d52 100644
--- a/services/java/com/android/server/wm/StackBox.java
+++ b/services/java/com/android/server/wm/StackBox.java
@@ -18,6 +18,8 @@
 
 import android.graphics.Rect;
 
+import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
+
 import java.io.PrintWriter;
 import java.util.ArrayList;
 
@@ -200,6 +202,10 @@
     /** Remove this box and propagate its sibling's content up to their parent.
      * @return The first stackId of the resulting StackBox. */
     int removeStack() {
+        if (mParent == null) {
+            mDisplayContent.removeStackBox(this);
+            return HOME_STACK_ID;
+        }
         if (mParent.mFirst == this) {
             mParent.absorb(mParent.mSecond);
         } else {
@@ -219,8 +225,8 @@
         pw.print(prefix); pw.print("mFirst="); pw.println(mFirst);
         pw.print(prefix); pw.print("mSecond="); pw.println(mSecond);
         pw.print(prefix); pw.print("mBounds="); pw.print(mBounds.toShortString());
-            pw.print("mVertical="); pw.print(mVertical);
-            pw.print("layoutNeeded="); pw.println(layoutNeeded);
+            pw.print(" mVertical="); pw.print(mVertical);
+            pw.print(" layoutNeeded="); pw.println(layoutNeeded);
         if (mStack != null) {
             pw.print(prefix); pw.print("mStack="); pw.println(mStack);
             mStack.dump(prefix + "  ", pw);
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 12dd56e..d3382cc 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -16,29 +16,9 @@
 
 package com.android.server.wm;
 
-import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
-import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
-import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
-import static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
-import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND;
-import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
-import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
-import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
-import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
-import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
-import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
-import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
-import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
-import static android.view.WindowManager.LayoutParams.TYPE_BOOT_PROGRESS;
-import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
-import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
-import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
-import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD;
-import static android.view.WindowManager.LayoutParams.TYPE_RECENTS_OVERLAY;
-import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
-import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
-import static android.view.WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND;
-import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
+import static android.view.WindowManager.LayoutParams.*;
+
+import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
 
 import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
 
@@ -4698,7 +4678,7 @@
             mStackIdToStack.delete(stackId);
             return stack.remove();
         }
-        return -1;
+        return HOME_STACK_ID;
     }
 
     public void moveTaskToStack(int taskId, int stackId, boolean toTop) {
@@ -7689,8 +7669,8 @@
 
         i -= lastBelow;
         if (i != numRemoved) {
-            Slog.w(TAG, "Rebuild removed " + numRemoved
-                    + " windows but added " + i);
+            Slog.w(TAG, "Rebuild removed " + numRemoved + " windows but added " + i,
+                    new RuntimeException("here").fillInStackTrace());
             for (i=0; i<numRemoved; i++) {
                 WindowState ws = mRebuildTmp[i];
                 if (ws.mRebuilding) {