Merge "Revert "Use clear-all recent tasks call"" into ub-launcher3-edmonton-polish
diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java
index ed8b4d2..1d7c066 100644
--- a/quickstep/src/com/android/quickstep/RecentsActivity.java
+++ b/quickstep/src/com/android/quickstep/RecentsActivity.java
@@ -241,6 +241,12 @@
     }
 
     @Override
+    public void onEnterAnimationComplete() {
+        super.onEnterAnimationComplete();
+        UiFactory.onEnterAnimationComplete(this);
+    }
+
+    @Override
     public void onTrimMemory(int level) {
         super.onTrimMemory(level);
         UiFactory.onTrimMemory(this, level);
diff --git a/res/xml/device_profiles.xml b/res/xml/device_profiles.xml
index a34f225..ef6e145 100644
--- a/res/xml/device_profiles.xml
+++ b/res/xml/device_profiles.xml
@@ -133,13 +133,13 @@
         launcher:name="Nexus 7"
         launcher:minWidthDps="575"
         launcher:minHeightDps="904"
-        launcher:numRows="5"
+        launcher:numRows="6"
         launcher:numColumns="6"
         launcher:numFolderRows="4"
         launcher:numFolderColumns="5"
         launcher:iconSize="64"
         launcher:iconTextSize="14.4"
-        launcher:numHotseatIcons="7"
+        launcher:numHotseatIcons="6"
         launcher:defaultLayoutId="@xml/default_workspace_5x6"
         />
 
@@ -147,8 +147,8 @@
         launcher:name="Nexus 10"
         launcher:minWidthDps="727"
         launcher:minHeightDps="1207"
-        launcher:numRows="5"
-        launcher:numColumns="6"
+        launcher:numRows="6"
+        launcher:numColumns="7"
         launcher:numFolderRows="4"
         launcher:numFolderColumns="5"
         launcher:iconSize="76"
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 820c125..9839c12 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -59,6 +59,9 @@
 
     private static final float TALL_DEVICE_ASPECT_RATIO_THRESHOLD = 2.0f;
 
+    // To evenly space the icons, increase the left/right margins for tablets in portrait mode.
+    private static final int PORTRAIT_TABLET_LEFT_RIGHT_PADDING_MULTIPLIER = 4;
+
     // Workspace
     public final int desiredWorkspaceLeftRightMarginPx;
     public final int cellLayoutPaddingLeftRightPx;
@@ -172,7 +175,9 @@
         defaultWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(context, cn, null);
         edgeMarginPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_edge_margin);
         desiredWorkspaceLeftRightMarginPx = isVerticalBarLayout() ? 0 : edgeMarginPx;
-        cellLayoutPaddingLeftRightPx =
+        int cellLayoutPaddingLeftRightMultiplier = !isVerticalBarLayout() && isTablet
+                ? PORTRAIT_TABLET_LEFT_RIGHT_PADDING_MULTIPLIER : 1;
+        cellLayoutPaddingLeftRightPx = cellLayoutPaddingLeftRightMultiplier *
                 res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_layout_padding);
         cellLayoutBottomPaddingPx =
                 res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_layout_bottom_padding);
diff --git a/src/com/android/launcher3/util/ConfigMonitor.java b/src/com/android/launcher3/util/ConfigMonitor.java
index 2489d30..611931d 100644
--- a/src/com/android/launcher3/util/ConfigMonitor.java
+++ b/src/com/android/launcher3/util/ConfigMonitor.java
@@ -21,37 +21,102 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.Configuration;
+import android.graphics.Point;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManager.DisplayListener;
+import android.os.Handler;
 import android.util.Log;
+import android.view.Display;
+import android.view.WindowManager;
 
 /**
  * {@link BroadcastReceiver} which watches configuration changes and
  * restarts the process in case changes which affect the device profile occur.
  */
-public class ConfigMonitor extends BroadcastReceiver {
+public class ConfigMonitor extends BroadcastReceiver implements DisplayListener {
+
+    private static final String TAG = "ConfigMonitor";
+
+    private final Point mTmpPoint1 = new Point();
+    private final Point mTmpPoint2 = new Point();
 
     private final Context mContext;
     private final float mFontScale;
     private final int mDensity;
 
+    private final int mDisplayId;
+    private final Point mRealSize;
+    private final Point mSmallestSize, mLargestSize;
+
     public ConfigMonitor(Context context) {
         mContext = context;
 
         Configuration config = context.getResources().getConfiguration();
         mFontScale = config.fontScale;
         mDensity = config.densityDpi;
+
+        Display display = getDefaultDisplay(context);
+        mDisplayId = display.getDisplayId();
+
+        mRealSize = new Point();
+        display.getRealSize(mRealSize);
+
+        mSmallestSize = new Point();
+        mLargestSize = new Point();
+        display.getCurrentSizeRange(mSmallestSize, mLargestSize);
     }
 
     @Override
     public void onReceive(Context context, Intent intent) {
         Configuration config = context.getResources().getConfiguration();
         if (mFontScale != config.fontScale || mDensity != config.densityDpi) {
-            Log.d("ConfigMonitor", "Configuration changed, restarting launcher");
-            mContext.unregisterReceiver(this);
-            android.os.Process.killProcess(android.os.Process.myPid());
+            Log.d(TAG, "Configuration changed");
+            killProcess();
         }
     }
 
     public void register() {
         mContext.registerReceiver(this, new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED));
+        mContext.getSystemService(DisplayManager.class)
+                .registerDisplayListener(this, new Handler(UiThreadHelper.getBackgroundLooper()));
+    }
+
+    @Override
+    public void onDisplayAdded(int displayId) { }
+
+    @Override
+    public void onDisplayRemoved(int displayId) { }
+
+    @Override
+    public void onDisplayChanged(int displayId) {
+        if (displayId != mDisplayId) {
+            return;
+        }
+        Display display = getDefaultDisplay(mContext);
+        display.getRealSize(mTmpPoint1);
+
+        if (!mRealSize.equals(mTmpPoint1) && !mRealSize.equals(mTmpPoint1.y, mTmpPoint1.x)) {
+            Log.d(TAG, String.format("Display size changed from %s to %s", mRealSize, mTmpPoint1));
+            killProcess();
+            return;
+        }
+
+        display.getCurrentSizeRange(mTmpPoint1, mTmpPoint2);
+        if (!mSmallestSize.equals(mTmpPoint1) || !mLargestSize.equals(mTmpPoint2)) {
+            Log.d(TAG, String.format("Available size changed from [%s, %s] to [%s, %s]",
+                    mSmallestSize, mLargestSize, mTmpPoint1, mTmpPoint2));
+            killProcess();
+        }
+    }
+
+    private void killProcess() {
+        Log.d(TAG, "restarting launcher");
+        mContext.unregisterReceiver(this);
+        mContext.getSystemService(DisplayManager.class).unregisterDisplayListener(this);
+        android.os.Process.killProcess(android.os.Process.myPid());
+    }
+
+    private Display getDefaultDisplay(Context context) {
+        return context.getSystemService(WindowManager.class).getDefaultDisplay();
     }
 }