Using a single launcher layout for all configurations

Bug: 71709920
Change-Id: Ib23112bc1636007cb41e1919a855bbf5298884b6
diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml
deleted file mode 100644
index bcaba81..0000000
--- a/res/layout-land/launcher.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!-- Full screen view projects under the status bar and contains the background -->
-<com.android.launcher3.LauncherRootView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/launcher"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="?attr/workspaceStatusBarScrim"
-    android:fitsSystemWindows="true">
-
-    <com.android.launcher3.dragndrop.DragLayer
-        android:id="@+id/drag_layer"
-        android:clipChildren="false"
-        android:clipToPadding="false"
-        android:importantForAccessibility="no"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-        <!-- The workspace contains 5 screens of cells -->
-        <!-- DO NOT CHANGE THE ID -->
-        <com.android.launcher3.Workspace
-            android:theme="@style/HomeScreenElementTheme"
-            android:id="@+id/workspace"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_gravity="center"
-            launcher:pageIndicator="@id/page_indicator" />
-
-        <com.android.launcher3.pageindicators.PageIndicatorLandscape
-            android:id="@+id/page_indicator"
-            android:theme="@style/HomeScreenElementTheme"
-            android:layout_width="@dimen/dynamic_grid_min_page_indicator_size"
-            android:layout_height="@dimen/dynamic_grid_min_page_indicator_size"
-            android:layout_gravity="bottom|left"
-            android:background="@drawable/all_apps_handle_landscape" />
-
-        <include layout="@layout/overview_panel"
-            android:id="@+id/overview_panel"
-            android:visibility="gone" />
-
-        <com.android.launcher3.views.AllAppsScrim
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:id="@+id/all_apps_scrim" />
-
-        <!-- DO NOT CHANGE THE ID -->
-        <include layout="@layout/hotseat"
-            android:id="@+id/hotseat"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent" />
-
-        <include
-            android:id="@+id/drop_target_bar"
-            layout="@layout/drop_target_bar" />
-
-        <include layout="@layout/all_apps"
-            android:id="@+id/apps_view"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:visibility="invisible" />
-
-    </com.android.launcher3.dragndrop.DragLayer>
-
-</com.android.launcher3.LauncherRootView>
diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml
deleted file mode 100644
index eb9c34c..0000000
--- a/res/layout-port/launcher.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!-- Full screen view projects under the status bar and contains the background -->
-<com.android.launcher3.LauncherRootView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res-auto"
-
-    android:id="@+id/launcher"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="?attr/workspaceStatusBarScrim"
-    android:fitsSystemWindows="true">
-
-    <com.android.launcher3.dragndrop.DragLayer
-        android:id="@+id/drag_layer"
-        android:clipChildren="false"
-        android:importantForAccessibility="no"
-        android:clipToPadding="false"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-        <!-- The workspace contains 5 screens of cells -->
-        <!-- DO NOT CHANGE THE ID -->
-        <com.android.launcher3.Workspace
-            android:theme="@style/HomeScreenElementTheme"
-            android:id="@+id/workspace"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_gravity="center"
-            launcher:pageIndicator="@+id/page_indicator">
-        </com.android.launcher3.Workspace>
-
-        <include layout="@layout/overview_panel"
-            android:id="@+id/overview_panel"
-            android:visibility="gone" />
-
-        <com.android.launcher3.views.AllAppsScrim
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:id="@+id/all_apps_scrim" />
-
-        <!-- DO NOT CHANGE THE ID -->
-        <include layout="@layout/hotseat"
-            android:id="@+id/hotseat"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent" />
-
-        <!-- Keep these behind the workspace so that they are not visible when
-             we go into AllApps -->
-        <include layout="@layout/page_indicator"
-            android:id="@+id/page_indicator" />
-
-        <include
-            android:id="@+id/drop_target_bar"
-            layout="@layout/drop_target_bar" />
-
-        <include layout="@layout/all_apps"
-            android:id="@+id/apps_view"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:visibility="invisible" />
-    </com.android.launcher3.dragndrop.DragLayer>
-
-</com.android.launcher3.LauncherRootView>
diff --git a/res/layout-sw720dp/launcher.xml b/res/layout/launcher.xml
similarity index 73%
rename from res/layout-sw720dp/launcher.xml
rename to res/layout/launcher.xml
index fa1a100..314359b 100644
--- a/res/layout-sw720dp/launcher.xml
+++ b/res/layout/launcher.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2007 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -13,8 +12,6 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
-<!-- Full screen view projects under the status bar and contains the background -->
 <com.android.launcher3.LauncherRootView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:launcher="http://schemas.android.com/apk/res-auto"
@@ -26,49 +23,54 @@
 
     <com.android.launcher3.dragndrop.DragLayer
         android:id="@+id/drag_layer"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
         android:clipChildren="false"
         android:clipToPadding="false"
-        android:importantForAccessibility="no"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:importantForAccessibility="no">
 
         <!-- The workspace contains 5 screens of cells -->
         <!-- DO NOT CHANGE THE ID -->
         <com.android.launcher3.Workspace
-            android:theme="@style/HomeScreenElementTheme"
-            android:layout_gravity="center"
             android:id="@+id/workspace"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            launcher:pageIndicator="@id/page_indicator">
-        </com.android.launcher3.Workspace>
+            android:layout_gravity="center"
+            android:theme="@style/HomeScreenElementTheme"
+            launcher:pageIndicator="@+id/page_indicator" />
 
-        <include layout="@layout/overview_panel"
+        <include
             android:id="@+id/overview_panel"
+            layout="@layout/overview_panel"
             android:visibility="gone" />
 
         <com.android.launcher3.views.AllAppsScrim
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:id="@+id/all_apps_scrim" />
-
-        <!-- DO NOT CHANGE THE ID -->
-        <include layout="@layout/hotseat"
-            android:id="@+id/hotseat"
+            android:id="@+id/all_apps_scrim"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
 
+        <!-- DO NOT CHANGE THE ID -->
+        <include
+            android:id="@+id/hotseat"
+            layout="@layout/hotseat"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+
+        <!-- Keep these behind the workspace so that they are not visible when
+         we go into AllApps -->
+        <com.android.launcher3.pageindicators.WorkspacePageIndicator
+            android:id="@+id/page_indicator"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dynamic_grid_min_page_indicator_size"
+            android:theme="@style/HomeScreenElementTheme" />
+
         <include
             android:id="@+id/drop_target_bar"
             layout="@layout/drop_target_bar" />
 
-        <!-- Keep these behind the workspace so that they are not visible when
-             we go into AllApps -->
-        <include layout="@layout/page_indicator"
-                 android:id="@+id/page_indicator" />
-
-        <include layout="@layout/all_apps"
+        <include
             android:id="@+id/apps_view"
+            layout="@layout/all_apps"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:visibility="invisible" />
diff --git a/res/layout/page_indicator.xml b/res/layout/page_indicator.xml
deleted file mode 100644
index 7de0cde..0000000
--- a/res/layout/page_indicator.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<com.android.launcher3.pageindicators.PageIndicatorLine
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:theme="@style/HomeScreenElementTheme"
-    android:layout_width="match_parent"
-    android:layout_height="@dimen/dynamic_grid_min_page_indicator_size" />
diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorLandscape.java b/src/com/android/launcher3/pageindicators/PageIndicatorLandscape.java
deleted file mode 100644
index d76998a..0000000
--- a/src/com/android/launcher3/pageindicators/PageIndicatorLandscape.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.pageindicators;
-
-import static com.android.launcher3.LauncherState.ALL_APPS;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup.MarginLayoutParams;
-import android.widget.FrameLayout;
-
-import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.Insettable;
-import com.android.launcher3.Launcher;
-import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
-import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
-
-/**
- * Simply draws the caret drawable bottom-right aligned in the view. This ensures that we can have
- * a view with as large an area as we want (for touching) while maintaining a caret of size
- * all_apps_caret_size.  Used only for the landscape layout.
- */
-public class PageIndicatorLandscape extends PageIndicator implements OnClickListener, Insettable {
-    // all apps pull up handle drawable.
-
-    private final Launcher mLauncher;
-
-    public PageIndicatorLandscape(Context context) {
-        this(context, null);
-    }
-
-    public PageIndicatorLandscape(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public PageIndicatorLandscape(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        setOnClickListener(this);
-        mLauncher = Launcher.getLauncher(context);
-        setOnFocusChangeListener(mLauncher.mFocusHandler);
-    }
-
-    @Override
-    public void onClick(View view) {
-        Launcher l = Launcher.getLauncher(getContext());
-        if (!l.isInState(ALL_APPS)) {
-            l.getUserEventDispatcher().logActionOnControl(
-                    Action.Touch.TAP, ControlType.ALL_APPS_BUTTON);
-            l.getStateManager().goToState(ALL_APPS);
-        }
-    }
-
-    @Override
-    public void setInsets(Rect insets) {
-        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
-        DeviceProfile grid = mLauncher.getDeviceProfile();
-        if (insets.left > insets.right) {
-            lp.leftMargin = grid.hotseatBarSidePaddingPx;
-            lp.rightMargin = insets.right;
-            lp.gravity =  Gravity.RIGHT | Gravity.BOTTOM;
-        } else {
-            lp.leftMargin = insets.left;
-            lp.rightMargin = grid.hotseatBarSidePaddingPx;
-            lp.gravity = Gravity.LEFT | Gravity.BOTTOM;
-        }
-        lp.bottomMargin = grid.workspacePadding.bottom;
-        setLayoutParams(lp);
-    }
-}
diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorLine.java b/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java
similarity index 66%
rename from src/com/android/launcher3/pageindicators/PageIndicatorLine.java
rename to src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java
index 8c9642c..f3b0d61 100644
--- a/src/com/android/launcher3/pageindicators/PageIndicatorLine.java
+++ b/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java
@@ -1,5 +1,9 @@
 package com.android.launcher3.pageindicators;
 
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+
+import static com.android.launcher3.LauncherState.ALL_APPS;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
@@ -15,6 +19,8 @@
 import android.util.AttributeSet;
 import android.util.Property;
 import android.view.Gravity;
+import android.view.View;
+import android.view.View.OnClickListener;
 import android.view.ViewConfiguration;
 import android.widget.FrameLayout;
 
@@ -24,13 +30,17 @@
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.dynamicui.WallpaperColorInfo;
+import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
 
 /**
- * A PageIndicator that briefly shows a fraction of a line when moving between pages.
+ * A PageIndicator that briefly shows a fraction of a line when moving between pages in
+ * portrait mode. In Landscape simply draws the caret drawable bottom-corner aligned in
+ * the drag-layer.
  *
  * The fraction is 1 / number of pages and the position is based on the progress of the page scroll.
  */
-public class PageIndicatorLine extends PageIndicator implements Insettable {
+public class WorkspacePageIndicator extends PageIndicator implements Insettable, OnClickListener {
 
     private static final int LINE_ANIMATE_DURATION = ViewConfiguration.getScrollBarFadeDuration();
     private static final int LINE_FADE_DELAY = ViewConfiguration.getScrollDefaultDelay();
@@ -59,59 +69,61 @@
     private Paint mLinePaint;
     private final int mLineHeight;
 
-    private static final Property<PageIndicatorLine, Integer> PAINT_ALPHA
-            = new Property<PageIndicatorLine, Integer>(Integer.class, "paint_alpha") {
+    private boolean mIsLandscapeUi;
+
+    private static final Property<WorkspacePageIndicator, Integer> PAINT_ALPHA
+            = new Property<WorkspacePageIndicator, Integer>(Integer.class, "paint_alpha") {
         @Override
-        public Integer get(PageIndicatorLine obj) {
+        public Integer get(WorkspacePageIndicator obj) {
             return obj.mLinePaint.getAlpha();
         }
 
         @Override
-        public void set(PageIndicatorLine obj, Integer alpha) {
+        public void set(WorkspacePageIndicator obj, Integer alpha) {
             obj.mLinePaint.setAlpha(alpha);
-            obj.invalidate();
+            obj.invalidateIfPortrait();
         }
     };
 
-    private static final Property<PageIndicatorLine, Float> NUM_PAGES
-            = new Property<PageIndicatorLine, Float>(Float.class, "num_pages") {
+    private static final Property<WorkspacePageIndicator, Float> NUM_PAGES
+            = new Property<WorkspacePageIndicator, Float>(Float.class, "num_pages") {
         @Override
-        public Float get(PageIndicatorLine obj) {
+        public Float get(WorkspacePageIndicator obj) {
             return obj.mNumPagesFloat;
         }
 
         @Override
-        public void set(PageIndicatorLine obj, Float numPages) {
+        public void set(WorkspacePageIndicator obj, Float numPages) {
             obj.mNumPagesFloat = numPages;
-            obj.invalidate();
+            obj.invalidateIfPortrait();
         }
     };
 
-    private static final Property<PageIndicatorLine, Integer> TOTAL_SCROLL
-            = new Property<PageIndicatorLine, Integer>(Integer.class, "total_scroll") {
+    private static final Property<WorkspacePageIndicator, Integer> TOTAL_SCROLL
+            = new Property<WorkspacePageIndicator, Integer>(Integer.class, "total_scroll") {
         @Override
-        public Integer get(PageIndicatorLine obj) {
+        public Integer get(WorkspacePageIndicator obj) {
             return obj.mTotalScroll;
         }
 
         @Override
-        public void set(PageIndicatorLine obj, Integer totalScroll) {
+        public void set(WorkspacePageIndicator obj, Integer totalScroll) {
             obj.mTotalScroll = totalScroll;
-            obj.invalidate();
+            obj.invalidateIfPortrait();
         }
     };
 
     private Runnable mHideLineRunnable = () -> animateLineToAlpha(0);
 
-    public PageIndicatorLine(Context context) {
+    public WorkspacePageIndicator(Context context) {
         this(context, null);
     }
 
-    public PageIndicatorLine(Context context, AttributeSet attrs) {
+    public WorkspacePageIndicator(Context context, AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public PageIndicatorLine(Context context, AttributeSet attrs, int defStyle) {
+    public WorkspacePageIndicator(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
 
         Resources res = context.getResources();
@@ -128,7 +140,7 @@
 
     @Override
     protected void onDraw(Canvas canvas) {
-        if (mTotalScroll == 0 || mNumPagesFloat == 0) {
+        if (mTotalScroll == 0 || mNumPagesFloat == 0 || mIsLandscapeUi) {
             return;
         }
 
@@ -155,7 +167,7 @@
         } else if (mTotalScroll != totalScroll) {
             animateToTotalScroll(totalScroll);
         } else {
-            invalidate();
+            invalidateIfPortrait();
         }
 
         if (mShouldAutoHide) {
@@ -233,10 +245,53 @@
     @Override
     public void setInsets(Rect insets) {
         DeviceProfile grid = mLauncher.getDeviceProfile();
+        mIsLandscapeUi = grid.isVerticalBarLayout();
         FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
-        lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
-        lp.height = grid.pageIndicatorSizePx;
-        lp.bottomMargin = grid.hotseatBarSizePx + insets.bottom;
+
+        if (mIsLandscapeUi) {
+            if (insets.left > insets.right) {
+                lp.leftMargin = grid.hotseatBarSidePaddingPx;
+                lp.rightMargin = insets.right;
+                lp.gravity =  Gravity.RIGHT | Gravity.BOTTOM;
+            } else {
+                lp.leftMargin = insets.left;
+                lp.rightMargin = grid.hotseatBarSidePaddingPx;
+                lp.gravity = Gravity.LEFT | Gravity.BOTTOM;
+            }
+            lp.bottomMargin = grid.workspacePadding.bottom;
+            lp.width = lp.height = getResources()
+                    .getDimensionPixelSize(R.dimen.dynamic_grid_min_page_indicator_size);
+
+            setBackgroundResource(R.drawable.all_apps_handle_landscape);
+            setOnFocusChangeListener(mLauncher.mFocusHandler);
+            setOnClickListener(this);
+
+        } else {
+            lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
+            lp.height = grid.pageIndicatorSizePx;
+            lp.bottomMargin = grid.hotseatBarSizePx + insets.bottom;
+            lp.width = MATCH_PARENT;
+
+            setBackgroundResource(0);
+            setOnFocusChangeListener(null);
+            setOnClickListener(null);
+        }
+
         setLayoutParams(lp);
     }
+
+    private void invalidateIfPortrait() {
+        if (!mIsLandscapeUi) {
+            invalidate();
+        }
+    }
+
+    @Override
+    public void onClick(View view) {
+        if (!mLauncher.isInState(ALL_APPS)) {
+            mLauncher.getUserEventDispatcher().logActionOnControl(
+                    Action.Touch.TAP, ControlType.ALL_APPS_BUTTON);
+            mLauncher.getStateManager().goToState(ALL_APPS);
+        }
+    }
 }