Merge branch 'ub-launcher3-master' into launcher3merge2018-09-13

Test: none
Change-Id: I8dce25b79bf67c9af06ed362fc4153c711e8f788
diff --git a/res/layout/snackbar.xml b/res/layout/snackbar.xml
index 419fb82..bca3308 100644
--- a/res/layout/snackbar.xml
+++ b/res/layout/snackbar.xml
@@ -25,17 +25,23 @@
         android:gravity="center_vertical"
         android:paddingLeft="8dp"
         android:paddingRight="8dp"
-        android:textSize="14sp"
-        android:textColor="?android:attr/textColorPrimary"/>
+        android:lines="1"
+        android:ellipsize="end"
+        android:textSize="@dimen/snackbar_max_text_size"
+        android:textColor="?android:attr/textColorPrimary"
+        android:theme="@style/TextTitle"/>
     <TextView
         android:id="@+id/action"
         android:layout_height="@dimen/snackbar_content_height"
         android:layout_width="wrap_content"
         android:layout_weight="0"
         android:gravity="center"
-        android:padding="8dp"
+        android:paddingLeft="8dp"
+        android:paddingRight="8dp"
         android:background="?android:attr/selectableItemBackground"
         android:textStyle="bold"
-        android:textColor="?android:attr/textColorPrimary"
-        android:textAllCaps="true"/>
+        android:textSize="@dimen/snackbar_max_text_size"
+        android:textColor="?android:attr/colorAccent"
+        android:theme="@style/TextTitle"
+        android:capitalize="sentences"/>
 </merge>
\ No newline at end of file
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index fae5dac..aea06aa 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -114,8 +114,7 @@
     <string name="action_move_here" msgid="2170188780612570250">"මෙතනට අයිතමය ගෙන එන්න"</string>
     <string name="item_added_to_workspace" msgid="4211073925752213539">"අයිතමය මුල් තිරය වෙත එකතු කරන ලදි"</string>
     <string name="item_removed" msgid="851119963877842327">"අයිතමය ඉවත් කරන ලදි"</string>
-    <!-- no translation found for undo (4151576204245173321) -->
-    <skip />
+    <string name="undo" msgid="4151576204245173321">"අස් කරන්න"</string>
     <string name="action_move" msgid="4339390619886385032">"අයිතමය ගෙනයන්න"</string>
     <string name="move_to_empty_cell" msgid="2833711483015685619">"පේළිය <xliff:g id="NUMBER_0">%1$s</xliff:g> තීරුව <xliff:g id="NUMBER_1">%2$s</xliff:g> වෙත ගෙන යන්න"</string>
     <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g> ස්ථානය වෙත ගෙන යන්න"</string>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index e7bd64c..8adae36 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -230,5 +230,10 @@
     <dimen name="snackbar_height">48dp</dimen>
     <dimen name="snackbar_content_height">32dp</dimen>
     <dimen name="snackbar_padding">8dp</dimen>
-    <dimen name="snackbar_margin">16dp</dimen>
+    <dimen name="snackbar_min_margin_left_right">6dp</dimen>
+    <dimen name="snackbar_max_margin_left_right">72dp</dimen>
+    <dimen name="snackbar_margin_bottom">30dp</dimen>
+    <dimen name="snackbar_elevation">3dp</dimen>
+    <dimen name="snackbar_min_text_size">12sp</dimen>
+    <dimen name="snackbar_max_text_size">14sp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6d73dcb..eb6b284 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -262,7 +262,7 @@
     <!-- Accessibility confirmation for item removed. [CHAR_LIMIT=50]-->
     <string name="item_removed">Item removed</string>
 
-    <!-- Action shown in snackbar to undo item removal. [CHAR_LIMIT=15] -->
+    <!-- Action shown in snackbar to undo item removal. [CHAR_LIMIT=20] -->
     <string name="undo">Undo</string>
 
     <!-- Accessibility action to move an item on the workspace. [CHAR_LIMIT=30] -->
diff --git a/src/com/android/launcher3/util/ConfigMonitor.java b/src/com/android/launcher3/util/ConfigMonitor.java
index 611931d..5dd0d08 100644
--- a/src/com/android/launcher3/util/ConfigMonitor.java
+++ b/src/com/android/launcher3/util/ConfigMonitor.java
@@ -111,8 +111,12 @@
 
     private void killProcess() {
         Log.d(TAG, "restarting launcher");
-        mContext.unregisterReceiver(this);
-        mContext.getSystemService(DisplayManager.class).unregisterDisplayListener(this);
+        try {
+            mContext.unregisterReceiver(this);
+            mContext.getSystemService(DisplayManager.class).unregisterDisplayListener(this);
+        } catch (Exception e) {
+            // We are going to die anyway, ignore any error die to race condition in registering.
+        }
         android.os.Process.killProcess(android.os.Process.myPid());
     }
 
diff --git a/src/com/android/launcher3/views/Snackbar.java b/src/com/android/launcher3/views/Snackbar.java
index f515360..04b637b 100644
--- a/src/com/android/launcher3/views/Snackbar.java
+++ b/src/com/android/launcher3/views/Snackbar.java
@@ -20,6 +20,7 @@
 import android.content.res.Resources;
 import android.graphics.Rect;
 import android.util.AttributeSet;
+import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.MotionEvent;
 import android.widget.TextView;
@@ -60,7 +61,7 @@
         snackbar.setOrientation(HORIZONTAL);
         snackbar.setGravity(Gravity.CENTER_VERTICAL);
         Resources res = launcher.getResources();
-        snackbar.setElevation(res.getDimension(R.dimen.deep_shortcuts_elevation));
+        snackbar.setElevation(res.getDimension(R.dimen.snackbar_elevation));
         int padding = res.getDimensionPixelSize(R.dimen.snackbar_padding);
         snackbar.setPadding(padding, padding, padding, padding);
         snackbar.setBackgroundResource(R.drawable.round_rect_primary);
@@ -72,14 +73,45 @@
         DragLayer.LayoutParams params = (DragLayer.LayoutParams) snackbar.getLayoutParams();
         params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
         params.height = res.getDimensionPixelSize(R.dimen.snackbar_height);
-        int margin = res.getDimensionPixelSize(R.dimen.snackbar_margin);
+        int maxMarginLeftRight = res.getDimensionPixelSize(R.dimen.snackbar_max_margin_left_right);
+        int minMarginLeftRight = res.getDimensionPixelSize(R.dimen.snackbar_min_margin_left_right);
+        int marginBottom = res.getDimensionPixelSize(R.dimen.snackbar_margin_bottom);
         Rect insets = launcher.getDeviceProfile().getInsets();
-        params.width = dragLayer.getWidth() - margin * 2 -  insets.left - insets.right;
-        params.setMargins(0, margin + insets.top, 0, margin + insets.bottom);
+        int maxWidth = dragLayer.getWidth() - minMarginLeftRight * 2 - insets.left - insets.right;
+        int minWidth = dragLayer.getWidth() - maxMarginLeftRight * 2 - insets.left - insets.right;
+        params.width = minWidth;
+        params.setMargins(0, 0, 0, marginBottom + insets.bottom);
 
-        ((TextView) snackbar.findViewById(R.id.label)).setText(labelStringResId);
-        ((TextView) snackbar.findViewById(R.id.action)).setText(actionStringResId);
-        snackbar.findViewById(R.id.action).setOnClickListener(v -> {
+        TextView labelView = snackbar.findViewById(R.id.label);
+        TextView actionView = snackbar.findViewById(R.id.action);
+        String labelText = res.getString(labelStringResId);
+        String actionText = res.getString(actionStringResId);
+        int totalContentWidth = (int) (labelView.getPaint().measureText(labelText)
+                + actionView.getPaint().measureText(actionText))
+                + labelView.getPaddingRight() + labelView.getPaddingLeft()
+                + actionView.getPaddingRight() + actionView.getPaddingLeft()
+                + padding * 2;
+        if (totalContentWidth > params.width) {
+            // The text doesn't fit in our standard width so update width to accommodate.
+            if (totalContentWidth <= maxWidth) {
+                params.width = totalContentWidth;
+            } else {
+                // One line will be cut off, fallback to 2 lines and smaller font. (This should only
+                // happen in some languages if system display and font size are set to largest.)
+                int textHeight = res.getDimensionPixelSize(R.dimen.snackbar_content_height);
+                float textSizePx = res.getDimension(R.dimen.snackbar_min_text_size);
+                labelView.setLines(2);
+                labelView.getLayoutParams().height = textHeight * 2;
+                actionView.getLayoutParams().height = textHeight * 2;
+                labelView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx);
+                actionView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx);
+                params.height += textHeight;
+                params.width = maxWidth;
+            }
+        }
+        labelView.setText(labelText);
+        actionView.setText(actionText);
+        actionView.setOnClickListener(v -> {
             if (onActionClicked != null) {
                 onActionClicked.run();
             }
diff --git a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java
index dd286bd..42817c1 100644
--- a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java
+++ b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java
@@ -17,9 +17,9 @@
 package com.android.launcher3.tapl;
 
 import android.graphics.Point;
-import androidx.test.uiautomator.UiObject2;
 
 import androidx.annotation.NonNull;
+import androidx.test.uiautomator.UiObject2;
 
 /**
  * Operations on AllApps opened from Overview.
@@ -44,6 +44,7 @@
                 allAppsContainer, "search_container_all_apps");
         final Point start = qsb.getVisibleCenter();
         final int endY = (int) (mLauncher.getDevice().getDisplayHeight() * 0.6);
+        LauncherInstrumentation.log("AllAppsFromOverview.switchBackToOverview before swipe");
         mLauncher.swipe(start.x, start.y, start.x, endY);
 
         return new Overview(mLauncher);
diff --git a/tests/tapl/com/android/launcher3/tapl/AppIcon.java b/tests/tapl/com/android/launcher3/tapl/AppIcon.java
index 17bf5fc..ea47503 100644
--- a/tests/tapl/com/android/launcher3/tapl/AppIcon.java
+++ b/tests/tapl/com/android/launcher3/tapl/AppIcon.java
@@ -43,6 +43,7 @@
      * Clicks the icon to launch its app.
      */
     public Background launch() {
+        LauncherInstrumentation.log("AppIcon.launch before click");
         LauncherInstrumentation.assertTrue(
                 "Launching an app didn't open a new window: " + mIcon.getText(),
                 mIcon.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS));
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index 434e421..441fc65 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -24,6 +24,7 @@
 import android.os.Bundle;
 import android.os.Parcelable;
 import android.provider.Settings;
+import android.util.Log;
 import android.view.accessibility.AccessibilityEvent;
 
 import androidx.annotation.NonNull;
@@ -47,6 +48,8 @@
  */
 public final class LauncherInstrumentation {
 
+    private static final String TAG = "Tapl";
+
     // Types for launcher containers that the user is interacting with. "Background" is a
     // pseudo-container corresponding to inactive launcher covered by another app.
     enum ContainerType {
@@ -119,6 +122,10 @@
         return mSwipeUpEnabledOverride != null ? mSwipeUpEnabledOverride : mSwipeUpEnabled;
     }
 
+    static void log(String message) {
+        Log.d(TAG, message);
+    }
+
     private static void fail(String message) {
         Assert.fail("http://go/tapl : " + message);
     }
@@ -144,6 +151,7 @@
     }
 
     private UiObject2 verifyContainerType(ContainerType containerType) {
+        log("verifyContainerType: " + containerType);
         switch (containerType) {
             case WORKSPACE: {
                 waitUntilGone(APPS_RES_ID);
diff --git a/tests/tapl/com/android/launcher3/tapl/Overview.java b/tests/tapl/com/android/launcher3/tapl/Overview.java
index db0e6c5..9841274 100644
--- a/tests/tapl/com/android/launcher3/tapl/Overview.java
+++ b/tests/tapl/com/android/launcher3/tapl/Overview.java
@@ -17,14 +17,14 @@
 package com.android.launcher3.tapl;
 
 import android.graphics.Point;
+
+import androidx.annotation.NonNull;
 import androidx.test.uiautomator.Direction;
 import androidx.test.uiautomator.UiObject2;
 
 import java.util.Collections;
 import java.util.List;
 
-import androidx.annotation.NonNull;
-
 /**
  * Overview pane.
  */
@@ -46,6 +46,7 @@
      */
     public void flingForward() {
         final UiObject2 overview = verifyActiveContainer();
+        LauncherInstrumentation.log("Overview.flingForward before fling");
         overview.fling(Direction.LEFT, DEFAULT_FLING_SPEED);
         mLauncher.waitForIdle();
         verifyActiveContainer();
@@ -56,6 +57,7 @@
      */
     public void flingBackward() {
         final UiObject2 overview = verifyActiveContainer();
+        LauncherInstrumentation.log("Overview.flingBackward before fling");
         overview.fling(Direction.RIGHT, DEFAULT_FLING_SPEED);
         mLauncher.waitForIdle();
         verifyActiveContainer();
@@ -95,6 +97,7 @@
         // Swipe from navbar to the top.
         final UiObject2 navBar = mLauncher.getSystemUiObject("navigation_bar_frame");
         final Point start = navBar.getVisibleCenter();
+        LauncherInstrumentation.log("Overview.switchToAllApps before swipe");
         mLauncher.swipe(start.x, start.y, start.x, 0);
 
         return new AllAppsFromOverview(mLauncher);