Merge "Fade overview actions on transition to Home." into sc-dev
diff --git a/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java b/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
index 350e0d1..79e50ef 100644
--- a/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
+++ b/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
@@ -21,14 +21,18 @@
 
 import android.annotation.SuppressLint;
 import android.app.assist.AssistContent;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Matrix;
+import android.net.Uri;
 import android.os.SystemClock;
+import android.provider.Settings;
 import android.text.TextUtils;
 
 import androidx.annotation.VisibleForTesting;
 
+import com.android.launcher3.BuildConfig;
 import com.android.launcher3.R;
 import com.android.quickstep.util.AssistContentRequester;
 import com.android.quickstep.views.OverviewActionsView;
@@ -45,7 +49,12 @@
     public static final String ACTION_SEARCH = "com.android.quickstep.ACTION_SEARCH";
     public static final String ELAPSED_NANOS = "niu_actions_elapsed_realtime_nanos";
     public static final String ACTIONS_URL = "niu_actions_app_url";
+    public static final String ACTIONS_ERROR_CODE = "niu_actions_app_error_code";
+    public static final int ERROR_PERMISSIONS = 1;
     private static final String TAG = "TaskOverlayFactoryGo";
+    private static final String URI_AUTHORITY =
+            BuildConfig.APPLICATION_ID + ".overview.fileprovider";
+    private static final String FAKE_FILEPATH = "shared_images/null.png";
 
     // Empty constructor required for ResourceBasedOverride
     public TaskOverlayFactoryGo(Context context) {}
@@ -64,6 +73,7 @@
     public static final class TaskOverlayGo<T extends OverviewActionsView> extends TaskOverlay {
         private String mNIUPackageName;
         private String mWebUrl;
+        private boolean mAssistPermissionsEnabled;
 
         private TaskOverlayGo(TaskThumbnailView taskThumbnailView) {
             super(taskThumbnailView);
@@ -87,6 +97,11 @@
             boolean isAllowedByPolicy = mThumbnailView.isRealSnapshot();
             getActionsView().setCallbacks(new OverlayUICallbacksGoImpl(isAllowedByPolicy, task));
 
+            checkPermissions();
+            if (!mAssistPermissionsEnabled) {
+                return;
+            }
+
             int taskId = task.key.id;
             AssistContentRequester contentRequester =
                     new AssistContentRequester(mApplicationContext);
@@ -112,7 +127,22 @@
         @VisibleForTesting
         public void sendNIUIntent(String actionType) {
             Intent intent = createNIUIntent(actionType);
-            mImageApi.shareAsDataWithExplicitIntent(/* crop */ null, intent);
+            // Only add and send the image if the appropriate permissions are held
+            if (mAssistPermissionsEnabled) {
+                mImageApi.shareAsDataWithExplicitIntent(/* crop */ null, intent);
+            } else {
+                intent.putExtra(ACTIONS_ERROR_CODE, ERROR_PERMISSIONS);
+                // The Intent recipient expects an image URI, and omitting one or using a
+                // completely invalid URI will cause the Intent parsing to crash.
+                // So we construct a URI for a nonexistent image.
+                Uri uri = new Uri.Builder()
+                        .scheme(ContentResolver.SCHEME_CONTENT)
+                        .authority(URI_AUTHORITY)
+                        .path(FAKE_FILEPATH)
+                        .build();
+                intent.setData(uri);
+                mApplicationContext.startActivity(intent);
+            }
         }
 
         private Intent createNIUIntent(String actionType) {
@@ -129,6 +159,19 @@
             return intent;
         }
 
+        /**
+         * Checks whether the Assistant has screen context permissions
+         */
+        @VisibleForTesting
+        public void checkPermissions() {
+            ContentResolver contentResolver = mApplicationContext.getContentResolver();
+            boolean structureEnabled = Settings.Secure.getInt(contentResolver,
+                    Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0) != 0;
+            boolean screenshotEnabled = Settings.Secure.getInt(contentResolver,
+                    Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0) != 0;
+            mAssistPermissionsEnabled = structureEnabled && screenshotEnabled;
+        }
+
         protected class OverlayUICallbacksGoImpl extends OverlayUICallbacksImpl
                 implements OverlayUICallbacksGo {
             public OverlayUICallbacksGoImpl(boolean isAllowedByPolicy, Task task) {
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index 99ad814..f3b1151 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -45,72 +45,40 @@
     <string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"सिफारिस गरिएका एपहरू देखाउने सुविधा सक्षम पारिएका छन्"</string>
     <string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"सिफारिस गरिएका एपहरू देखाउने सुविधा असक्षम पारिएको छ"</string>
     <string name="hotseat_prediction_content_description" msgid="4582028296938078419">"पूर्वानुमान गरिएको एप: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
-    <!-- no translation found for back_gesture_feedback_swipe_too_far_from_left_edge (340972404868601012) -->
-    <skip />
-    <!-- no translation found for back_gesture_feedback_cancelled_left_edge (6671316150388702530) -->
-    <skip />
-    <!-- no translation found for back_gesture_feedback_complete_left_edge (3220478647881674266) -->
-    <skip />
-    <!-- no translation found for back_gesture_feedback_swipe_too_far_from_right_edge (4306700023773832353) -->
-    <skip />
-    <!-- no translation found for back_gesture_feedback_cancelled_right_edge (4951916546256902552) -->
-    <skip />
-    <!-- no translation found for back_gesture_feedback_complete (7261221999760772210) -->
-    <skip />
-    <!-- no translation found for back_gesture_feedback_swipe_in_nav_bar (1148198467090405643) -->
-    <skip />
-    <!-- no translation found for back_gesture_tutorial_confirm_subtitle (5181305411668713250) -->
-    <skip />
-    <!-- no translation found for back_gesture_intro_title (19551256430224428) -->
-    <skip />
-    <!-- no translation found for back_gesture_intro_subtitle (7912576483031802797) -->
-    <skip />
-    <!-- no translation found for home_gesture_feedback_swipe_too_far_from_edge (1446774096007065298) -->
-    <skip />
-    <!-- no translation found for home_gesture_feedback_overview_detected (1557523944897393013) -->
-    <skip />
-    <!-- no translation found for home_gesture_feedback_wrong_swipe_direction (6993979358080825438) -->
-    <skip />
-    <!-- no translation found for home_gesture_feedback_complete (2324789183070815517) -->
-    <skip />
-    <!-- no translation found for home_gesture_intro_title (836590312858441830) -->
-    <skip />
-    <!-- no translation found for home_gesture_intro_subtitle (2632238748497975326) -->
-    <skip />
-    <!-- no translation found for overview_gesture_feedback_swipe_too_far_from_edge (3032757898111577225) -->
-    <skip />
-    <!-- no translation found for overview_gesture_feedback_home_detected (1411130969354020489) -->
-    <skip />
-    <!-- no translation found for overview_gesture_feedback_wrong_swipe_direction (6725820500906747925) -->
-    <skip />
-    <!-- no translation found for overview_gesture_feedback_complete (5477014491632199169) -->
-    <skip />
-    <!-- no translation found for overview_gesture_intro_title (2902054412868489378) -->
-    <skip />
-    <!-- no translation found for overview_gesture_intro_subtitle (1579517193845186042) -->
-    <skip />
-    <!-- no translation found for gesture_tutorial_confirm_title (6201516182040074092) -->
-    <skip />
-    <!-- no translation found for gesture_tutorial_action_button_label_next (2556263116424738762) -->
-    <skip />
-    <!-- no translation found for gesture_tutorial_action_button_label_done (671834508127014231) -->
-    <skip />
-    <!-- no translation found for gesture_tutorial_action_button_label_settings (2923621047916486604) -->
-    <skip />
-    <!-- no translation found for gesture_tutorial_try_again (65962545858556697) -->
-    <skip />
-    <!-- no translation found for gesture_tutorial_nice (2936275692616928280) -->
-    <skip />
-    <!-- no translation found for gesture_tutorial_step (1279786122817620968) -->
-    <skip />
+    <string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"स्क्रिनको सबैभन्दा बायाँ किनाराबाट स्वाइप गर्नुहोस्।"</string>
+    <string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"स्क्रिनको बायाँ किनाराबाट मध्य भागसम्म स्वाइप गर्नुहोस् अनि औँला उठाउनुहोस्।"</string>
+    <string name="back_gesture_feedback_complete_left_edge" msgid="3220478647881674266">"यत्ति हो! अब दायाँ किनाराबाट स्वाइप गरी हेर्नुहोस्।"</string>
+    <string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"स्क्रिनको सबैभन्दा दायाँ किनाराबाट स्वाइप गर्नुहोस्।"</string>
+    <string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"स्क्रिनको दायाँ किनाराबाट मध्य भागसम्म स्वाइप गर्नुहोस् अनि औँला उठाउनुहोस्।"</string>
+    <string name="back_gesture_feedback_complete" msgid="7261221999760772210">"तपाईंले \'पछाडि जानुहोस्\' नामक इसारा प्रयोग गर्ने तरिका सिक्नुभयो। अब होम स्क्रिनमा जाने तरिका सिक्नुहोस्।"</string>
+    <string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"स्क्रिनको फेदको धेरै नजिकसम्म स्वाइप नगर्नुहोस्।"</string>
+    <string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"\'पछाडि\' नामक इसाराको संवेदनशीलता बदल्न सेटिङमा जानुहोस्"</string>
+    <string name="back_gesture_intro_title" msgid="19551256430224428">"पछाडि जान स्वाइप गर्नुहोस्"</string>
+    <string name="back_gesture_intro_subtitle" msgid="7912576483031802797">"यसअघिको स्क्रिनमा फर्कन स्क्रिनको बायाँ वा दायाँ किनाराबाट मध्य भागसम्म स्वाइप गर्नुहोस्।"</string>
+    <string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्।"</string>
+    <string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"औँला उठाउनुअघि नरोकिनुहोस्।"</string>
+    <string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"सीधै माथितिर स्वाइप गर्नुहोस्।"</string>
+    <string name="home_gesture_feedback_complete" msgid="2324789183070815517">"तपाईंले \'होम स्क्रिनमा जानुहोस्\' नामक इसारा प्रयोग गर्ने तरिका सिक्नुभयो। अब एउटा एपबाट अर्को एपमा जाने तरिका सिक्नुहोस्।"</string>
+    <string name="home_gesture_intro_title" msgid="836590312858441830">"होम स्क्रिनमा जान स्वाइप गर्नुहोस्"</string>
+    <string name="home_gesture_intro_subtitle" msgid="2632238748497975326">"स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्। यो इसारा प्रयोग गर्दा सधैँ होम स्क्रिन खुल्छ।"</string>
+    <string name="overview_gesture_feedback_swipe_too_far_from_edge" msgid="3032757898111577225">"स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्।"</string>
+    <string name="overview_gesture_feedback_home_detected" msgid="1411130969354020489">"स्क्रिनबाट औँला उठाउनुअघि एपको विन्डोमा केही बेर छोइराख्नुहोस्।"</string>
+    <string name="overview_gesture_feedback_wrong_swipe_direction" msgid="6725820500906747925">"सीधै माथितिर स्वाइप गर्नुहोस् अनि रोकिनुहोस्।"</string>
+    <string name="overview_gesture_feedback_complete" msgid="5477014491632199169">"तपाईंले \'एउटा एपबाट अर्को एपमा जानुहोस्\' नामक इसारा प्रयोग गर्ने तरिका सिक्नुभयो। तपाईं अब आफ्नो फोन चलाउन सक्नुहुन्छ!"</string>
+    <string name="overview_gesture_intro_title" msgid="2902054412868489378">"एउटा एपबाट अर्को एपमा जान स्वाइप गर्नुहोस्"</string>
+    <string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्, छोइराख्नुहोस् अनि औँला उठाउनुहोस्।"</string>
+    <string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"सबै तयार छ"</string>
+    <string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"अर्को"</string>
+    <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"सम्पन्न भयो"</string>
+    <string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"सेटिङ"</string>
+    <string name="gesture_tutorial_try_again" msgid="65962545858556697">"फेरि प्रयास गर्नुहोस्"</string>
+    <string name="gesture_tutorial_nice" msgid="2936275692616928280">"राम्रो!"</string>
+    <string name="gesture_tutorial_step" msgid="1279786122817620968">"ट्युटोरियल <xliff:g id="CURRENT">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="action_share" msgid="2648470652637092375">"सेयर गर्नुहोस्"</string>
     <string name="action_screenshot" msgid="8171125848358142917">"स्क्रिनसट"</string>
     <string name="blocked_by_policy" msgid="2071401072261365546">"यो एप वा तपाईंको सङ्गठनले यो कारबाही गर्ने अनुमति दिँदैन"</string>
-    <!-- no translation found for skip_tutorial_dialog_title (2725643161260038458) -->
-    <skip />
+    <string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"नेभिगेसन ट्युटोरियल स्किप गर्ने हो?"</string>
     <string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"तपाईं पछि <xliff:g id="NAME">%1$s</xliff:g> एपमा गई यो ट्युटोरियल भेट्टाउन सक्नुहुन्छ"</string>
-    <!-- no translation found for gesture_tutorial_action_button_label_cancel (3809842569351264108) -->
-    <skip />
-    <!-- no translation found for gesture_tutorial_action_button_label_skip (394452764989751960) -->
-    <skip />
+    <string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"रद्द गर्नुहोस्"</string>
+    <string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"स्किप गर्नु…"</string>
 </resources>
diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
index 7aae38c..910e473 100644
--- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
@@ -443,6 +443,19 @@
         if (info == null) {
             return;
         }
+        switch (info.container) {
+            case LauncherSettings.Favorites.CONTAINER_DESKTOP:
+            case LauncherSettings.Favorites.CONTAINER_HOTSEAT:
+                // Fall through and continue it's on the workspace (we don't support swiping back
+                // to other containers like all apps or the hotseat predictions (which can change)
+                break;
+            default:
+                if (info.container >= 0) {
+                    // Also allow swiping to folders
+                    break;
+                }
+                return;
+        }
         switch (info.itemType) {
             case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
             case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 61803aa..883b029 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -1095,8 +1095,10 @@
             final RemoteAnimationTargetCompat runningTaskTarget = mRecentsAnimationTargets != null
                     ? mRecentsAnimationTargets.findTask(mGestureState.getRunningTaskId())
                     : null;
-            HomeAnimationFactory homeAnimFactory = createHomeAnimationFactory(
-                    runningTaskTarget.taskInfo.launchCookies, duration);
+            final ArrayList<IBinder> cookies = runningTaskTarget != null
+                    ? runningTaskTarget.taskInfo.launchCookies
+                    : new ArrayList<>();
+            HomeAnimationFactory homeAnimFactory = createHomeAnimationFactory(cookies, duration);
             mIsSwipingPipToHome = homeAnimFactory.supportSwipePipToHome()
                     && runningTaskTarget != null
                     && runningTaskTarget.taskInfo.pictureInPictureParams != null
diff --git a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
index dd35d68..2ea34d7 100644
--- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
+++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
@@ -244,8 +244,9 @@
             return null;
         }
 
-        // Find the associated item info for the launch cookie (if available)
-        int launchCookieItemId = -1;
+        // Find the associated item info for the launch cookie (if available), note that predicted
+        // apps actually have an id of -1, so use another default id here
+        int launchCookieItemId = -2;
         for (IBinder cookie : launchCookies) {
             Integer itemId = ObjectWrapper.unwrap(cookie);
             if (itemId != null) {
diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
index 66c24c8..3b26108 100644
--- a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
+++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
@@ -84,6 +84,7 @@
     private static final int FOLDER_HIERARCHY_OFFSET = 100;
     private static final int SEARCH_RESULT_HIERARCHY_OFFSET = 200;
     private static final int EXTENDED_CONTAINERS_HIERARCHY_OFFSET = 300;
+    private static final int ATTRIBUTE_MULTIPLIER = 100;
 
     public static final CopyOnWriteArrayList<StatsLogConsumer> LOGS_CONSUMER =
             new CopyOnWriteArrayList<>();
@@ -112,7 +113,8 @@
         }
         SysUiStatsLog.write(SysUiStatsLog.LAUNCHER_SNAPSHOT,
                 LAUNCHER_WORKSPACE_SNAPSHOT.getId() /* event_id */,
-                info.getItemCase().getNumber() /* target_id */,
+                info.getAttribute().getNumber() * ATTRIBUTE_MULTIPLIER
+                        + info.getItemCase().getNumber()  /* target_id */,
                 instanceId.getId() /* instance_id */,
                 0 /* uid */,
                 getPackageName(info) /* package_name */,
@@ -329,7 +331,8 @@
                     null /* launcher extensions, deprecated */,
                     false /* quickstep_enabled, deprecated */,
                     event.getId() /* event_id */,
-                    atomInfo.getItemCase().getNumber() /* target_id */,
+                    atomInfo.getAttribute().getNumber() * ATTRIBUTE_MULTIPLIER
+                            + atomInfo.getItemCase().getNumber() /* target_id */,
                     instanceId.getId() /* instance_id TODO */,
                     0 /* uid TODO */,
                     getPackageName(atomInfo) /* package_name */,
diff --git a/res/drawable/ic_conversations_widget_category.xml b/res/drawable/ic_conversations_widget_category.xml
new file mode 100644
index 0000000..7b13b23
--- /dev/null
+++ b/res/drawable/ic_conversations_widget_category.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="48dp"
+    android:height="48dp"
+    android:viewportWidth="48"
+    android:viewportHeight="48">
+  <path
+      android:pathData="M24,24m-24,0a24,24 0,1 1,48 0a24,24 0,1 1,-48 0"
+      android:fillColor="#81C995"/>
+  <path
+      android:pathData="M27,34C23.134,34 20,30.866 20,27C20,23.134 23.134,20 27,20C30.866,20 34,23.134 34,27C34,28.4872 33.5362,29.8662 32.7453,31"
+      android:strokeWidth="2"
+      android:fillColor="#00000000"
+      android:strokeColor="#3C4043"/>
+  <path
+      android:pathData="M35,33l-8,0l-0,2l8,0z"
+      android:fillColor="#3C4043"/>
+  <path
+      android:pathData="M21,21m-6,0a6,6 0,1 1,12 0a6,6 0,1 1,-12 0"
+      android:fillColor="#81C995"/>
+  <path
+      android:pathData="M16,25h5v2h-5z"
+      android:fillColor="#81C995"/>
+  <path
+      android:pathData="M21,28C24.866,28 28,24.866 28,21C28,17.134 24.866,14 21,14C17.134,14 14,17.134 14,21C14,22.4872 14.4638,23.8662 15.2547,25"
+      android:strokeWidth="2"
+      android:fillColor="#00000000"
+      android:strokeColor="#ffffff"/>
+  <path
+      android:pathData="M13,27h8v2h-8z"
+      android:fillColor="#ffffff"/>
+</vector>
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index c9cc372..f7de3ca 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -388,7 +388,8 @@
     }
 
     protected void pageEndTransition() {
-        if (mIsPageInTransition) {
+        if (mIsPageInTransition && !mIsBeingDragged && mScroller.isFinished()
+                && mEdgeGlowLeft.isFinished() && mEdgeGlowRight.isFinished()) {
             mIsPageInTransition = false;
             onPageEndTransition();
         }
@@ -1740,6 +1741,7 @@
     public void draw(Canvas canvas) {
         super.draw(canvas);
         drawEdgeEffect(canvas);
+        pageEndTransition();
     }
 
     protected void drawEdgeEffect(Canvas canvas) {
diff --git a/src/com/android/launcher3/views/ArrowTipView.java b/src/com/android/launcher3/views/ArrowTipView.java
index 89ff821..97c43ef 100644
--- a/src/com/android/launcher3/views/ArrowTipView.java
+++ b/src/com/android/launcher3/views/ArrowTipView.java
@@ -148,6 +148,10 @@
         LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) findViewById(
                 R.id.arrow).getLayoutParams();
         lp.gravity = gravity;
+
+        if (parent.getLayoutDirection() == LAYOUT_DIRECTION_RTL) {
+            arrowMarginStart = parent.getMeasuredWidth() - arrowMarginStart;
+        }
         if (gravity == Gravity.END) {
             lp.setMarginEnd(parent.getMeasuredWidth() - arrowMarginStart);
         } else if (gravity == Gravity.START) {
diff --git a/src/com/android/launcher3/widget/picker/WidgetsListHeader.java b/src/com/android/launcher3/widget/picker/WidgetsListHeader.java
index ccf3187..41aa437 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsListHeader.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsListHeader.java
@@ -35,7 +35,6 @@
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.LauncherAppState;
 import com.android.launcher3.R;
-import com.android.launcher3.icons.FastBitmapDrawable;
 import com.android.launcher3.icons.IconCache.ItemInfoUpdateReceiver;
 import com.android.launcher3.icons.PlaceHolderIconDrawable;
 import com.android.launcher3.icons.cache.HandlerRunnable;
@@ -174,7 +173,14 @@
     }
 
     private void setIcon(PackageItemInfo info) {
-        FastBitmapDrawable icon = info.newIcon(getContext());
+        Drawable icon;
+        switch (info.category) {
+            case PackageItemInfo.CONVERSATIONS:
+                icon = getContext().getDrawable(R.drawable.ic_conversations_widget_category);
+                break;
+            default:
+                icon = info.newIcon(getContext());
+        }
         applyDrawables(icon);
         mIconDrawable = icon;
         if (mIconDrawable != null) {