Merge "Read the starting surface icon size from framework" into sc-dev
diff --git a/Android.bp b/Android.bp
index 7e6a565..45d022f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -16,6 +16,8 @@
default_applicable_licenses: ["packages_apps_Launcher3_license"],
}
+min_launcher3_sdk_version = "26"
+
// Added automatically by a large-scale-change
// See: http://go/android-license-faq
license {
@@ -92,7 +94,7 @@
srcs: ["src_plugins/**/*.java"],
sdk_version: "current",
- min_sdk_version: "28",
+ min_sdk_version: min_launcher3_sdk_version,
}
// Library with all the dependencies for building Launcher3
@@ -110,11 +112,12 @@
"androidx.preference_preference",
"androidx.slice_slice-view",
"androidx.cardview_cardview",
+ "com.google.android.material_material",
"iconloader_base",
],
manifest: "AndroidManifest-common.xml",
sdk_version: "current",
- min_sdk_version: "26",
+ min_sdk_version: min_launcher3_sdk_version,
lint: {
baseline_filename: "lint-baseline-res-lib.xml",
},
@@ -128,7 +131,7 @@
srcs: ["src_build_config/**/*.java"],
static_libs: ["Launcher3ResLib"],
sdk_version: "current",
- min_sdk_version: "26",
+ min_sdk_version: min_launcher3_sdk_version,
manifest: "AndroidManifest-common.xml",
lint: {
baseline_filename: "lint-baseline-common-deps-lib.xml",
@@ -160,8 +163,8 @@
},
sdk_version: "current",
- min_sdk_version: "26",
- target_sdk_version: "29",
+ min_sdk_version: min_launcher3_sdk_version,
+ target_sdk_version: "current",
privileged: true,
system_ext_specific: true,
@@ -195,7 +198,7 @@
"SystemUI-statsd",
],
manifest: "quickstep/AndroidManifest.xml",
- min_sdk_version: "28",
+ min_sdk_version: "current",
}
@@ -244,7 +247,7 @@
"go/AndroidManifest.xml",
"AndroidManifest-common.xml",
],
- min_sdk_version: "29",
+ min_sdk_version: "current",
lint: {
baseline_filename: "lint-baseline-go-res-lib.xml",
},
diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml
index d725a16..4eecf29 100644
--- a/AndroidManifest-common.xml
+++ b/AndroidManifest-common.xml
@@ -144,7 +144,7 @@
<activity
android:name="com.android.launcher3.settings.SettingsActivity"
android:label="@string/settings_button_text"
- android:theme="@style/HomeSettingsTheme"
+ android:theme="@style/HomeSettings.Theme"
android:exported="true"
android:autoRemoveFromRecents="true">
<intent-filter>
diff --git a/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java b/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java
index c6ae6be..72b8d3f 100644
--- a/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java
+++ b/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java
@@ -109,6 +109,7 @@
case TestProtocol.REQUEST_VIEW_LEAK: {
if (sLeaks == null) sLeaks = new LinkedList();
sLeaks.add(new View(mContext));
+ sLeaks.add(new View(mContext));
return response;
}
diff --git a/go/quickstep/res/layout/overview_actions_container.xml b/go/quickstep/res/layout/overview_actions_container.xml
index b36214b..e7da196 100644
--- a/go/quickstep/res/layout/overview_actions_container.xml
+++ b/go/quickstep/res/layout/overview_actions_container.xml
@@ -29,10 +29,6 @@
android:orientation="horizontal">
<Space
- android:layout_width="@dimen/go_overview_button_width"
- android:layout_height="1dp" />
-
- <Space
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1" />
@@ -50,9 +46,8 @@
</LinearLayout>
<Space
- android:layout_width="0dp"
- android:layout_height="1dp"
- android:layout_weight="1" />
+ android:layout_width="@dimen/go_overview_button_container_margin"
+ android:layout_height="1dp" />
<LinearLayout
style="@style/GoOverviewActionButtonContainer">
@@ -68,9 +63,8 @@
</LinearLayout>
<Space
- android:layout_width="0dp"
- android:layout_height="1dp"
- android:layout_weight="1" />
+ android:layout_width="@dimen/go_overview_button_container_margin"
+ android:layout_height="1dp" />
<LinearLayout
style="@style/GoOverviewActionButtonContainer">
@@ -90,10 +84,6 @@
android:layout_height="1dp"
android:layout_weight="1" />
- <Space
- android:layout_width="@dimen/go_overview_button_width"
- android:layout_height="1dp" />
-
<!-- Will be enabled in a future version. -->
<LinearLayout
style="@style/GoOverviewActionButtonContainer"
diff --git a/go/quickstep/res/layout/overview_panel.xml b/go/quickstep/res/layout/overview_panel.xml
new file mode 100644
index 0000000..241b63d
--- /dev/null
+++ b/go/quickstep/res/layout/overview_panel.xml
@@ -0,0 +1,39 @@
+<?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.
+-->
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <com.android.quickstep.views.LauncherRecentsView
+ android:id="@+id/overview_panel"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:accessibilityPaneTitle="@string/accessibility_recent_apps"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:background="?attr/overviewBackgroundColor"
+ android:visibility="invisible" />
+
+ <com.android.quickstep.views.SplitPlaceholderView
+ android:id="@+id/split_placeholder"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/split_placeholder_size"
+ android:background="@android:color/darker_gray"
+ android:visibility="gone" />
+
+ <include
+ android:id="@+id/overview_actions_view"
+ layout="@layout/overview_actions_container" />
+
+</merge>
diff --git a/go/quickstep/res/values-gu/strings.xml b/go/quickstep/res/values-gu/strings.xml
new file mode 100644
index 0000000..e9fbdc2
--- /dev/null
+++ b/go/quickstep/res/values-gu/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_share_drop_target_label" msgid="5804774105974539508">"ઍપ શેર કરો"</string>
+ <string name="action_listen" msgid="2370304050784689486">"સાંભળો"</string>
+ <string name="action_translate" msgid="8028378961867277746">"Translate"</string>
+ <string name="action_search" msgid="6269564710943755464">"Lens"</string>
+</resources>
diff --git a/go/quickstep/res/values/attrs.xml b/go/quickstep/res/values/attrs.xml
new file mode 100644
index 0000000..3adf462
--- /dev/null
+++ b/go/quickstep/res/values/attrs.xml
@@ -0,0 +1,23 @@
+<?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.
+-->
+<resources>
+ <!-- Attributes used for Overview theming -->
+ <attr name="overviewBackgroundColor" format="color" />
+ <attr name="overviewButtonTextColor" format="color" />
+ <attr name="overviewButtonIconColor" format="color" />
+ <attr name="overviewButtonBackgroundColor" format="color" />
+</resources>
\ No newline at end of file
diff --git a/go/quickstep/res/values/colors.xml b/go/quickstep/res/values/colors.xml
index 9383770..f815f54 100644
--- a/go/quickstep/res/values/colors.xml
+++ b/go/quickstep/res/values/colors.xml
@@ -16,6 +16,10 @@
-->
<resources>
<!-- Overview -->
- <color name="go_overview_button_icon_color">#3C4043</color>
+ <color name="go_overview_background_color">#DADADA</color>
+ <color name="go_overview_background_color_dark">#000000</color>
+ <color name="go_overview_text_color">#3C4043</color>
+ <color name="go_overview_text_color_dark">#F8F9FA</color>
<color name="go_overview_button_color">#70FFFFFF</color>
+ <color name="go_overview_button_color_dark">#303030</color>
</resources>
diff --git a/go/quickstep/res/values/dimens.xml b/go/quickstep/res/values/dimens.xml
index da684fa..55cd138 100644
--- a/go/quickstep/res/values/dimens.xml
+++ b/go/quickstep/res/values/dimens.xml
@@ -22,6 +22,7 @@
<dimen name="go_overview_button_width">60dp</dimen>
<dimen name="go_overview_button_height">60dp</dimen>
<dimen name="go_overview_button_container_width">80dp</dimen>
+ <dimen name="go_overview_button_container_margin">16dp</dimen>
<dimen name="go_overview_button_caption_margin">8dp</dimen>
<dimen name="overview_actions_height">96dp</dimen>
<dimen name="overview_proactive_row_height">0dp</dimen>
diff --git a/go/quickstep/res/values/styles.xml b/go/quickstep/res/values/styles.xml
index 9b3fe67..59f7377 100644
--- a/go/quickstep/res/values/styles.xml
+++ b/go/quickstep/res/values/styles.xml
@@ -15,9 +15,25 @@
limitations under the License.
-->
<resources>
+ <!-- App themes -->
+ <style name="AppTheme" parent="@style/LauncherTheme">
+ <item name="overviewBackgroundColor">@color/go_overview_background_color</item>
+ <item name="overviewButtonTextColor">@color/go_overview_text_color</item>
+ <item name="overviewButtonIconColor">@color/go_overview_text_color</item>
+ <item name="overviewButtonBackgroundColor">@color/go_overview_button_color</item>
+ </style>
+
+ <style name="AppTheme.Dark" parent="@style/LauncherTheme.Dark">
+ <item name="overviewBackgroundColor">@color/go_overview_background_color_dark</item>
+ <item name="overviewButtonTextColor">@color/go_overview_text_color_dark</item>
+ <item name="overviewButtonIconColor">@color/go_overview_text_color_dark</item>
+ <item name="overviewButtonBackgroundColor">@color/go_overview_button_color_dark</item>
+ </style>
+
+ <!-- Overview -->
<style name="GoOverviewActionButton">
- <item name="android:tint">@color/go_overview_button_icon_color</item>
- <item name="android:backgroundTint">@color/go_overview_button_color</item>
+ <item name="android:tint">?attr/overviewButtonIconColor</item>
+ <item name="android:backgroundTint">?attr/overviewButtonBackgroundColor</item>
<item name="android:background">@drawable/round_rect_button</item>
<item name="android:layout_width">@dimen/go_overview_button_width</item>
<item name="android:layout_height">@dimen/go_overview_button_height</item>
@@ -27,7 +43,7 @@
<style name="GoOverviewActionButtonCaption">
<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textSize">14dp</item>
- <item name="android:textColor">@color/go_overview_button_icon_color</item>
+ <item name="android:textColor">?attr/overviewButtonTextColor</item>
<item name="android:lineHeight">20dp</item>
<item name="android:textAlignment">center</item>
<item name="android:importantForAccessibility">no</item>
diff --git a/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java b/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
index 9077675..754782b 100644
--- a/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
+++ b/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
@@ -25,14 +25,13 @@
import android.content.Context;
import android.content.Intent;
import android.graphics.Matrix;
-import android.net.Uri;
import android.os.SystemClock;
+import android.os.UserManager;
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;
@@ -53,9 +52,6 @@
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) {}
@@ -96,7 +92,10 @@
}
getActionsView().updateDisabledFlags(DISABLED_ROTATED, rotated);
- boolean isAllowedByPolicy = mThumbnailView.isRealSnapshot();
+ // Disable Overview Actions for Work Profile apps
+ boolean isManagedProfileTask =
+ UserManager.get(mApplicationContext).isManagedProfile(task.key.userId);
+ boolean isAllowedByPolicy = mThumbnailView.isRealSnapshot() && !isManagedProfileTask;
getActionsView().setCallbacks(new OverlayUICallbacksGoImpl(isAllowedByPolicy, task));
mTaskPackageName = task.key.getPackageName();
@@ -127,23 +126,13 @@
/**
* Creates and sends an Intent corresponding to the button that was clicked
*/
- @VisibleForTesting
- public void sendNIUIntent(String actionType) {
+ private void sendNIUIntent(String actionType) {
Intent intent = createNIUIntent(actionType);
// 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);
}
}
diff --git a/quickstep/res/drawable/bg_wellbeing_toast.xml b/quickstep/res/drawable/bg_wellbeing_toast.xml
index 65730f6..4dc981f 100644
--- a/quickstep/res/drawable/bg_wellbeing_toast.xml
+++ b/quickstep/res/drawable/bg_wellbeing_toast.xml
@@ -13,7 +13,9 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
- <solid android:color="#E61A73E8" />
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:priv-android="http://schemas.android.com/apk/prv/res/android"
+ android:shape="rectangle">
+ <solid android:color="?priv-android:attr/colorAccentPrimary" />
<corners android:radius="?android:attr/dialogCornerRadius" />
</shape>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_action_button_background.xml b/quickstep/res/drawable/gesture_tutorial_action_button_background.xml
index 6fc2b76..ac6a52a 100644
--- a/quickstep/res/drawable/gesture_tutorial_action_button_background.xml
+++ b/quickstep/res/drawable/gesture_tutorial_action_button_background.xml
@@ -13,8 +13,19 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <corners android:radius="50dp"/>
- <solid android:color="@color/gesture_tutorial_primary_color"/>
-</shape>
\ No newline at end of file
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape
+ android:id="@android:id/mask"
+ android:shape="rectangle">
+ <corners android:radius="50dp"/>
+ </shape>
+ </item>
+ <item>
+ <shape
+ android:shape="rectangle">
+ <corners android:radius="50dp"/>
+ <solid android:color="@color/gesture_tutorial_primary_color"/>
+ </shape>
+ </item>
+</layer-list>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_back_left.xml b/quickstep/res/drawable/gesture_tutorial_loop_back_left.xml
index 8bf305c..d2909ff 100644
--- a/quickstep/res/drawable/gesture_tutorial_loop_back_left.xml
+++ b/quickstep/res/drawable/gesture_tutorial_loop_back_left.xml
@@ -85,7 +85,7 @@
<path
android:name="_R_G_L_0_G_D_0_P_0"
android:fillAlpha="0.25"
- android:fillColor="#84ba69"
+ android:fillColor="@color/gesture_tutorial_primary_color"
android:fillType="nonZero"
android:pathData=" M12.5 -446 C12.5,-446 12.5,446 12.5,446 C12.5,446 -12.5,446 -12.5,446 C-12.5,446 -12.5,-446 -12.5,-446 C-12.5,-446 12.5,-446 12.5,-446c " />
</group>
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_back_right.xml b/quickstep/res/drawable/gesture_tutorial_loop_back_right.xml
index 812c54c..c20b252 100644
--- a/quickstep/res/drawable/gesture_tutorial_loop_back_right.xml
+++ b/quickstep/res/drawable/gesture_tutorial_loop_back_right.xml
@@ -81,7 +81,7 @@
<path
android:name="_R_G_L_1_G_D_0_P_0"
android:fillAlpha="0.25"
- android:fillColor="#84ba69"
+ android:fillColor="@color/gesture_tutorial_primary_color"
android:fillType="nonZero"
android:pathData=" M12.5 -446 C12.5,-446 12.5,446 12.5,446 C12.5,446 -12.5,446 -12.5,446 C-12.5,446 -12.5,-446 -12.5,-446 C-12.5,-446 12.5,-446 12.5,-446c " />
</group>
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_bottom_edge.xml b/quickstep/res/drawable/gesture_tutorial_loop_bottom_edge.xml
deleted file mode 100644
index 3efb52d..0000000
--- a/quickstep/res/drawable/gesture_tutorial_loop_bottom_edge.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt">
- <target android:name="time_group">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="2000"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <aapt:attr name="android:drawable">
- <vector
- android:width="412dp"
- android:height="892dp"
- android:viewportHeight="892"
- android:viewportWidth="412">
- <group android:name="_R_G">
- <group
- android:name="_R_G_L_0_G"
- android:translateX="206"
- android:translateY="874.5">
- <path
- android:name="_R_G_L_0_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#84ba69"
- android:fillType="nonZero"
- android:pathData=" M206 -17.5 C206,-17.5 206,17.5 206,17.5 C206,17.5 -206,17.5 -206,17.5 C-206,17.5 -206,-17.5 -206,-17.5 C-206,-17.5 206,-17.5 206,-17.5c " />
- </group>
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-</animated-vector>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_gesture_back_right.xml b/quickstep/res/drawable/gesture_tutorial_loop_gesture_back_right.xml
deleted file mode 100644
index c41d077..0000000
--- a/quickstep/res/drawable/gesture_tutorial_loop_gesture_back_right.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt">
- <target android:name="_R_G_L_0_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleY"
- android:startOffset="783"
- android:valueFrom="1"
- android:valueTo="0"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="time_group">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="2000"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <aapt:attr name="android:drawable">
- <vector
- android:width="412dp"
- android:height="892dp"
- android:viewportHeight="892"
- android:viewportWidth="412">
- <group android:name="_R_G">
- <group
- android:name="_R_G_L_0_G"
- android:translateX="206"
- android:translateY="446" />
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-</animated-vector>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_gesture_home.xml b/quickstep/res/drawable/gesture_tutorial_loop_gesture_home.xml
deleted file mode 100644
index c5dd41b..0000000
--- a/quickstep/res/drawable/gesture_tutorial_loop_gesture_home.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt">
- <target android:name="_R_G_L_0_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleY"
- android:startOffset="850"
- android:valueFrom="1"
- android:valueTo="0"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="time_group">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="2000"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <aapt:attr name="android:drawable">
- <vector
- android:width="412dp"
- android:height="892dp"
- android:viewportHeight="892"
- android:viewportWidth="412">
- <group android:name="_R_G">
- <group
- android:name="_R_G_L_0_G"
- android:translateX="206"
- android:translateY="446" />
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-</animated-vector>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_gesture_left_edge.xml b/quickstep/res/drawable/gesture_tutorial_loop_gesture_left_edge.xml
deleted file mode 100644
index c41d077..0000000
--- a/quickstep/res/drawable/gesture_tutorial_loop_gesture_left_edge.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt">
- <target android:name="_R_G_L_0_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleY"
- android:startOffset="783"
- android:valueFrom="1"
- android:valueTo="0"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="time_group">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="2000"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <aapt:attr name="android:drawable">
- <vector
- android:width="412dp"
- android:height="892dp"
- android:viewportHeight="892"
- android:viewportWidth="412">
- <group android:name="_R_G">
- <group
- android:name="_R_G_L_0_G"
- android:translateX="206"
- android:translateY="446" />
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-</animated-vector>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_gesture_overview.xml b/quickstep/res/drawable/gesture_tutorial_loop_gesture_overview.xml
deleted file mode 100644
index 5d87805..0000000
--- a/quickstep/res/drawable/gesture_tutorial_loop_gesture_overview.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt">
- <target android:name="_R_G_L_0_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleY"
- android:startOffset="1500"
- android:valueFrom="1"
- android:valueTo="0"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="time_group">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="2000"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <aapt:attr name="android:drawable">
- <vector
- android:width="412dp"
- android:height="892dp"
- android:viewportHeight="892"
- android:viewportWidth="412">
- <group android:name="_R_G">
- <group
- android:name="_R_G_L_0_G"
- android:translateX="206"
- android:translateY="446" />
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-</animated-vector>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_home.xml b/quickstep/res/drawable/gesture_tutorial_loop_home.xml
index ed072a9..931f8c0 100644
--- a/quickstep/res/drawable/gesture_tutorial_loop_home.xml
+++ b/quickstep/res/drawable/gesture_tutorial_loop_home.xml
@@ -1 +1,96 @@
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="892dp" android:width="412dp" android:viewportHeight="892" android:viewportWidth="412"><group android:name="_R_G"><group android:name="_R_G_L_1_G" android:translateX="206" android:translateY="879.5"><path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="#84ba69" android:fillAlpha="0.25" android:fillType="nonZero" android:pathData=" M206 -12.5 C206,-12.5 206,12.5 206,12.5 C206,12.5 -206,12.5 -206,12.5 C-206,12.5 -206,-12.5 -206,-12.5 C-206,-12.5 206,-12.5 206,-12.5c "/></group><group android:name="_R_G_L_0_G" android:translateX="206" android:translateY="446"/></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_1_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="fillAlpha" android:duration="1000" android:startOffset="0" android:valueFrom="0.25" android:valueTo="0.75" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="fillAlpha" android:duration="1000" android:startOffset="1000" android:valueFrom="0.75" android:valueTo="0.25" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="scaleY" android:duration="0" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target><target android:name="_R_G_L_0_G"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="scaleY" android:duration="0" android:startOffset="850" android:valueFrom="1" android:valueTo="0" android:valueType="floatType"/></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="2000" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt">
+ <target android:name="_R_G_L_1_G_D_0_P_0">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator
+ android:duration="1000"
+ android:propertyName="fillAlpha"
+ android:startOffset="0"
+ android:valueFrom="0.25"
+ android:valueTo="0.75"
+ android:valueType="floatType">
+ <aapt:attr name="android:interpolator">
+ <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+ </aapt:attr>
+ </objectAnimator>
+ <objectAnimator
+ android:duration="1000"
+ android:propertyName="fillAlpha"
+ android:startOffset="1000"
+ android:valueFrom="0.75"
+ android:valueTo="0.25"
+ android:valueType="floatType">
+ <aapt:attr name="android:interpolator">
+ <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+ </aapt:attr>
+ </objectAnimator>
+ </set>
+ </aapt:attr>
+ </target>
+ <target android:name="_R_G_L_0_G">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator
+ android:duration="0"
+ android:propertyName="scaleY"
+ android:startOffset="0"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:valueType="floatType" />
+ </set>
+ </aapt:attr>
+ </target>
+ <target android:name="_R_G_L_0_G">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator
+ android:duration="0"
+ android:propertyName="scaleY"
+ android:startOffset="850"
+ android:valueFrom="1"
+ android:valueTo="0"
+ android:valueType="floatType" />
+ </set>
+ </aapt:attr>
+ </target>
+ <target android:name="time_group">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator
+ android:duration="2000"
+ android:propertyName="translateX"
+ android:startOffset="0"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:valueType="floatType" />
+ </set>
+ </aapt:attr>
+ </target>
+ <aapt:attr name="android:drawable">
+ <vector
+ android:width="412dp"
+ android:height="892dp"
+ android:viewportHeight="892"
+ android:viewportWidth="412">
+ <group android:name="_R_G">
+ <group
+ android:name="_R_G_L_1_G"
+ android:translateX="206"
+ android:translateY="879.5">
+ <path
+ android:name="_R_G_L_1_G_D_0_P_0"
+ android:fillAlpha="0.25"
+ android:fillColor="@color/gesture_tutorial_primary_color"
+ android:fillType="nonZero"
+ android:pathData=" M206 -12.5 C206,-12.5 206,12.5 206,12.5 C206,12.5 -206,12.5 -206,12.5 C-206,12.5 -206,-12.5 -206,-12.5 C-206,-12.5 206,-12.5 206,-12.5c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G"
+ android:translateX="206"
+ android:translateY="446" />
+ </group>
+ <group android:name="time_group" />
+ </vector>
+ </aapt:attr>
+</animated-vector>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_left_edge.xml b/quickstep/res/drawable/gesture_tutorial_loop_left_edge.xml
deleted file mode 100644
index 07caaea..0000000
--- a/quickstep/res/drawable/gesture_tutorial_loop_left_edge.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt">
- <target android:name="time_group">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="2000"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <aapt:attr name="android:drawable">
- <vector
- android:width="412dp"
- android:height="892dp"
- android:viewportHeight="892"
- android:viewportWidth="412">
- <group android:name="_R_G">
- <group
- android:name="_R_G_L_0_G"
- android:translateX="17.5"
- android:translateY="446">
- <path
- android:name="_R_G_L_0_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#84ba69"
- android:fillType="nonZero"
- android:pathData=" M17.5 -446 C17.5,-446 17.5,446 17.5,446 C17.5,446 -17.5,446 -17.5,446 C-17.5,446 -17.5,-446 -17.5,-446 C-17.5,-446 17.5,-446 17.5,-446c " />
- </group>
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-</animated-vector>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_overview.xml b/quickstep/res/drawable/gesture_tutorial_loop_overview.xml
index acf0c4c..a4c532b 100644
--- a/quickstep/res/drawable/gesture_tutorial_loop_overview.xml
+++ b/quickstep/res/drawable/gesture_tutorial_loop_overview.xml
@@ -1 +1,96 @@
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="892dp" android:width="412dp" android:viewportHeight="892" android:viewportWidth="412"><group android:name="_R_G"><group android:name="_R_G_L_1_G" android:translateX="206" android:translateY="879.5"><path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="#84ba69" android:fillAlpha="0.25" android:fillType="nonZero" android:pathData=" M206 -12.5 C206,-12.5 206,12.5 206,12.5 C206,12.5 -206,12.5 -206,12.5 C-206,12.5 -206,-12.5 -206,-12.5 C-206,-12.5 206,-12.5 206,-12.5c "/></group><group android:name="_R_G_L_0_G" android:translateX="206" android:translateY="446"/></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_1_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="fillAlpha" android:duration="1000" android:startOffset="0" android:valueFrom="0.25" android:valueTo="0.75" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="fillAlpha" android:duration="1000" android:startOffset="1000" android:valueFrom="0.75" android:valueTo="0.25" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="scaleY" android:duration="0" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target><target android:name="_R_G_L_0_G"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="scaleY" android:duration="0" android:startOffset="1500" android:valueFrom="1" android:valueTo="0" android:valueType="floatType"/></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="2000" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt">
+ <target android:name="_R_G_L_1_G_D_0_P_0">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator
+ android:duration="1000"
+ android:propertyName="fillAlpha"
+ android:startOffset="0"
+ android:valueFrom="0.25"
+ android:valueTo="0.75"
+ android:valueType="floatType">
+ <aapt:attr name="android:interpolator">
+ <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+ </aapt:attr>
+ </objectAnimator>
+ <objectAnimator
+ android:duration="1000"
+ android:propertyName="fillAlpha"
+ android:startOffset="1000"
+ android:valueFrom="0.75"
+ android:valueTo="0.25"
+ android:valueType="floatType">
+ <aapt:attr name="android:interpolator">
+ <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+ </aapt:attr>
+ </objectAnimator>
+ </set>
+ </aapt:attr>
+ </target>
+ <target android:name="_R_G_L_0_G">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator
+ android:duration="0"
+ android:propertyName="scaleY"
+ android:startOffset="0"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:valueType="floatType" />
+ </set>
+ </aapt:attr>
+ </target>
+ <target android:name="_R_G_L_0_G">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator
+ android:duration="0"
+ android:propertyName="scaleY"
+ android:startOffset="1500"
+ android:valueFrom="1"
+ android:valueTo="0"
+ android:valueType="floatType" />
+ </set>
+ </aapt:attr>
+ </target>
+ <target android:name="time_group">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator
+ android:duration="2000"
+ android:propertyName="translateX"
+ android:startOffset="0"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:valueType="floatType" />
+ </set>
+ </aapt:attr>
+ </target>
+ <aapt:attr name="android:drawable">
+ <vector
+ android:width="412dp"
+ android:height="892dp"
+ android:viewportHeight="892"
+ android:viewportWidth="412">
+ <group android:name="_R_G">
+ <group
+ android:name="_R_G_L_1_G"
+ android:translateX="206"
+ android:translateY="879.5">
+ <path
+ android:name="_R_G_L_1_G_D_0_P_0"
+ android:fillAlpha="0.25"
+ android:fillColor="@color/gesture_tutorial_primary_color"
+ android:fillType="nonZero"
+ android:pathData=" M206 -12.5 C206,-12.5 206,12.5 206,12.5 C206,12.5 -206,12.5 -206,12.5 C-206,12.5 -206,-12.5 -206,-12.5 C-206,-12.5 206,-12.5 206,-12.5c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G"
+ android:translateX="206"
+ android:translateY="446" />
+ </group>
+ <group android:name="time_group" />
+ </vector>
+ </aapt:attr>
+</animated-vector>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_loop_right_edge.xml b/quickstep/res/drawable/gesture_tutorial_loop_right_edge.xml
deleted file mode 100644
index d86b653..0000000
--- a/quickstep/res/drawable/gesture_tutorial_loop_right_edge.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt">
- <target android:name="time_group">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="2000"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <aapt:attr name="android:drawable">
- <vector
- android:width="412dp"
- android:height="892dp"
- android:viewportHeight="892"
- android:viewportWidth="412">
- <group android:name="_R_G">
- <group
- android:name="_R_G_L_0_G"
- android:translateX="394.5"
- android:translateY="446">
- <path
- android:name="_R_G_L_0_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#84ba69"
- android:fillType="nonZero"
- android:pathData=" M17.5 -446 C17.5,-446 17.5,446 17.5,446 C17.5,446 -17.5,446 -17.5,446 C-17.5,446 -17.5,-446 -17.5,-446 C-17.5,-446 17.5,-446 17.5,-446c " />
- </group>
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-</animated-vector>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_motion_back_left.xml b/quickstep/res/drawable/gesture_tutorial_motion_back_left_dark_mode.xml
similarity index 99%
copy from quickstep/res/drawable/gesture_tutorial_motion_back_left.xml
copy to quickstep/res/drawable/gesture_tutorial_motion_back_left_dark_mode.xml
index e944c0e..f5ad569 100644
--- a/quickstep/res/drawable/gesture_tutorial_motion_back_left.xml
+++ b/quickstep/res/drawable/gesture_tutorial_motion_back_left_dark_mode.xml
@@ -1401,7 +1401,7 @@
<path
android:name="_R_G_L_0_G_D_0_P_0"
android:fillAlpha="0"
- android:fillColor="#84ba69"
+ android:fillColor="@color/gesture_tutorial_primary_color"
android:fillType="nonZero"
android:pathData=" M-206.5 13.5 C-186.34,13.5 -170,29.84 -170,50 C-170,70.16 -186.34,86.5 -206.5,86.5 C-226.66,86.5 -243,70.16 -243,50 C-243,29.84 -226.66,13.5 -206.5,13.5c " />
</group>
diff --git a/quickstep/res/drawable/gesture_tutorial_motion_back_left.xml b/quickstep/res/drawable/gesture_tutorial_motion_back_left_light_mode.xml
similarity index 99%
rename from quickstep/res/drawable/gesture_tutorial_motion_back_left.xml
rename to quickstep/res/drawable/gesture_tutorial_motion_back_left_light_mode.xml
index e944c0e..c0eafda 100644
--- a/quickstep/res/drawable/gesture_tutorial_motion_back_left.xml
+++ b/quickstep/res/drawable/gesture_tutorial_motion_back_left_light_mode.xml
@@ -1369,7 +1369,7 @@
<path
android:name="_R_G_L_2_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#000000"
+ android:fillColor="#ffffff"
android:fillType="nonZero"
android:pathData=" M28.25 0 C28.25,31.2 2.95,56.5 -28.25,56.5 C-28.25,56.5 -28.25,-56.5 -28.25,-56.5 C2.95,-56.5 28.25,-31.2 28.25,0c " />
</group>
@@ -1389,7 +1389,7 @@
<path
android:name="_R_G_L_1_G_D_0_P_0"
android:fillAlpha="0"
- android:fillColor="#ffffff"
+ android:fillColor="#3c3e40"
android:fillType="nonZero"
android:pathData=" M3.87 -13.45 C3.07,-14.21 1.8,-14.18 1.04,-13.38 C0.28,-12.58 0.31,-11.31 1.11,-10.55 C1.11,-10.55 9.75,-2.32 9.75,-2.32 C9.75,-2.32 -14.75,-2.32 -14.75,-2.32 C-15.85,-2.32 -16.75,-1.43 -16.75,-0.32 C-16.75,0.78 -15.85,1.68 -14.75,1.68 C-14.75,1.68 9.94,1.68 9.94,1.68 C9.94,1.68 1.07,10.59 1.07,10.59 C0.29,11.37 0.29,12.64 1.08,13.42 C1.86,14.2 3.13,14.19 3.9,13.41 C3.9,13.41 16.17,1.09 16.17,1.09 C16.55,0.71 16.76,0.19 16.75,-0.35 C16.74,-0.89 16.52,-1.4 16.13,-1.77 C16.13,-1.77 3.87,-13.45 3.87,-13.45c " />
</group>
diff --git a/quickstep/res/drawable/gesture_tutorial_motion_back_right.xml b/quickstep/res/drawable/gesture_tutorial_motion_back_right_dark_mode.xml
similarity index 99%
rename from quickstep/res/drawable/gesture_tutorial_motion_back_right.xml
rename to quickstep/res/drawable/gesture_tutorial_motion_back_right_dark_mode.xml
index f8d649a..b898dc1 100644
--- a/quickstep/res/drawable/gesture_tutorial_motion_back_right.xml
+++ b/quickstep/res/drawable/gesture_tutorial_motion_back_right_dark_mode.xml
@@ -1402,7 +1402,7 @@
<path
android:name="_R_G_L_0_G_D_0_P_0"
android:fillAlpha="0"
- android:fillColor="#84ba69"
+ android:fillColor="@color/gesture_tutorial_primary_color"
android:fillType="nonZero"
android:pathData=" M205 13.5 C225.16,13.5 241.5,29.84 241.5,50 C241.5,70.16 225.16,86.5 205,86.5 C184.84,86.5 168.5,70.16 168.5,50 C168.5,29.84 184.84,13.5 205,13.5c " />
</group>
diff --git a/quickstep/res/drawable/gesture_tutorial_motion_back_right.xml b/quickstep/res/drawable/gesture_tutorial_motion_back_right_light_mode.xml
similarity index 99%
copy from quickstep/res/drawable/gesture_tutorial_motion_back_right.xml
copy to quickstep/res/drawable/gesture_tutorial_motion_back_right_light_mode.xml
index f8d649a..c24e5a5 100644
--- a/quickstep/res/drawable/gesture_tutorial_motion_back_right.xml
+++ b/quickstep/res/drawable/gesture_tutorial_motion_back_right_light_mode.xml
@@ -1370,7 +1370,7 @@
<path
android:name="_R_G_L_2_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#000000"
+ android:fillColor="#ffffff"
android:fillType="nonZero"
android:pathData=" M28.25 0 C28.25,31.2 2.95,56.5 -28.25,56.5 C-28.25,56.5 -28.25,-56.5 -28.25,-56.5 C2.95,-56.5 28.25,-31.2 28.25,0c " />
</group>
@@ -1390,7 +1390,7 @@
<path
android:name="_R_G_L_1_G_D_0_P_0"
android:fillAlpha="0"
- android:fillColor="#ffffff"
+ android:fillColor="#3c3e40"
android:fillType="nonZero"
android:pathData=" M3.87 -13.45 C3.07,-14.21 1.8,-14.18 1.04,-13.38 C0.28,-12.58 0.31,-11.31 1.11,-10.55 C1.11,-10.55 9.75,-2.32 9.75,-2.32 C9.75,-2.32 -14.75,-2.32 -14.75,-2.32 C-15.85,-2.32 -16.75,-1.43 -16.75,-0.32 C-16.75,0.78 -15.85,1.68 -14.75,1.68 C-14.75,1.68 9.94,1.68 9.94,1.68 C9.94,1.68 1.07,10.59 1.07,10.59 C0.29,11.37 0.29,12.64 1.08,13.42 C1.86,14.2 3.13,14.19 3.9,13.41 C3.9,13.41 16.17,1.09 16.17,1.09 C16.55,0.71 16.76,0.19 16.75,-0.35 C16.74,-0.89 16.52,-1.4 16.13,-1.77 C16.13,-1.77 3.87,-13.45 3.87,-13.45c " />
</group>
diff --git a/quickstep/res/drawable/gesture_tutorial_motion_home.xml b/quickstep/res/drawable/gesture_tutorial_motion_home_dark_mode.xml
similarity index 99%
rename from quickstep/res/drawable/gesture_tutorial_motion_home.xml
rename to quickstep/res/drawable/gesture_tutorial_motion_home_dark_mode.xml
index 9dbaee6..aff35c1 100644
--- a/quickstep/res/drawable/gesture_tutorial_motion_home.xml
+++ b/quickstep/res/drawable/gesture_tutorial_motion_home_dark_mode.xml
@@ -922,7 +922,7 @@
<path
android:name="_R_G_L_3_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#000000"
+ android:fillColor="@color/fake_wallpaper_color_dark_mode"
android:fillType="nonZero"
android:pathData=" M206 -446 C206,-446 206,446 206,446 C206,446 -206,446 -206,446 C-206,446 -206,-446 -206,-446 C-206,-446 206,-446 206,-446c " />
</group>
@@ -1243,7 +1243,7 @@
<path
android:name="_R_G_L_0_G_D_0_P_0"
android:fillAlpha="0"
- android:fillColor="#84ba69"
+ android:fillColor="@color/gesture_tutorial_primary_color"
android:fillType="nonZero"
android:pathData=" M0 411 C19.33,411 35,426.67 35,446 C35,465.33 19.33,481 0,481 C-19.33,481 -35,465.33 -35,446 C-35,426.67 -19.33,411 0,411c " />
</group>
diff --git a/quickstep/res/drawable/gesture_tutorial_motion_home.xml b/quickstep/res/drawable/gesture_tutorial_motion_home_light_mode.xml
similarity index 98%
copy from quickstep/res/drawable/gesture_tutorial_motion_home.xml
copy to quickstep/res/drawable/gesture_tutorial_motion_home_light_mode.xml
index 9dbaee6..98d97ad 100644
--- a/quickstep/res/drawable/gesture_tutorial_motion_home.xml
+++ b/quickstep/res/drawable/gesture_tutorial_motion_home_light_mode.xml
@@ -588,11 +588,11 @@
android:duration="150"
android:propertyName="fillColor"
android:startOffset="350"
- android:valueFrom="#202124"
+ android:valueFrom="#6e7175"
android:valueTo="#bac4d6"
android:valueType="colorType">
<aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,0.69 1.0,1.0" />
+ <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,0.674 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
@@ -605,11 +605,11 @@
android:duration="150"
android:propertyName="fillColor"
android:startOffset="350"
- android:valueFrom="#202124"
+ android:valueFrom="#6e7175"
android:valueTo="#bac4d6"
android:valueType="colorType">
<aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,0.69 1.0,1.0" />
+ <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,0.676 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
@@ -622,11 +622,11 @@
android:duration="150"
android:propertyName="fillColor"
android:startOffset="350"
- android:valueFrom="#3c4043"
+ android:valueFrom="#9a9a9a"
android:valueTo="#bac4d6"
android:valueType="colorType">
<aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,0.69 1.0,1.0" />
+ <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.833,0.584 1.0,1.0" />
</aapt:attr>
</objectAnimator>
</set>
@@ -922,7 +922,7 @@
<path
android:name="_R_G_L_3_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#000000"
+ android:fillColor="@color/fake_wallpaper_color_light_mode"
android:fillType="nonZero"
android:pathData=" M206 -446 C206,-446 206,446 206,446 C206,446 -206,446 -206,446 C-206,446 -206,-446 -206,-446 C-206,-446 206,-446 206,-446c " />
</group>
@@ -937,7 +937,7 @@
<path
android:name="_R_G_L_2_G_L_4_G_D_0_P_0"
android:fillAlpha="0"
- android:fillColor="#3c4043"
+ android:fillColor="#d9d9da"
android:fillType="nonZero"
android:pathData=" M180 0 C180,0 180,0 180,0 C180,13.8 168.8,25 155,25 C155,25 -155,25 -155,25 C-168.8,25 -180,13.8 -180,0 C-180,0 -180,0 -180,0 C-180,-13.8 -168.8,-25 -155,-25 C-155,-25 155,-25 155,-25 C168.8,-25 180,-13.8 180,0c " />
</group>
@@ -1195,7 +1195,7 @@
<path
android:name="_R_G_L_1_G_L_1_G_L_2_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#202124"
+ android:fillColor="#6e7175"
android:fillType="nonZero"
android:pathData=" M206 -0.27 C206,-0.27 206,49.73 206,49.73 C206,49.73 -206,49.73 -206,49.73 C-206,49.73 -206,-0.27 -206,-0.27 C-206,-0.27 206,-0.27 206,-0.27c " />
</group>
@@ -1206,7 +1206,7 @@
<path
android:name="_R_G_L_1_G_L_1_G_L_1_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#202124"
+ android:fillColor="#6e7175"
android:fillType="nonZero"
android:pathData=" M206 -32.5 C206,-32.5 206,32.5 206,32.5 C206,42.43 197.93,50.5 188,50.5 C188,50.5 -188,50.5 -188,50.5 C-197.93,50.5 -206,42.43 -206,32.5 C-206,32.5 -206,-32.5 -206,-32.5 C-206,-42.43 -197.93,-50.5 -188,-50.5 C-188,-50.5 188,-50.5 188,-50.5 C197.93,-50.5 206,-42.43 206,-32.5c " />
</group>
@@ -1217,7 +1217,7 @@
<path
android:name="_R_G_L_1_G_L_1_G_L_0_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#3c4043"
+ android:fillColor="#9a9a9a"
android:fillType="nonZero"
android:pathData=" M190 0 C190,0 190,0 190,0 C190,10.21 181.71,18.5 171.5,18.5 C171.5,18.5 -171.5,18.5 -171.5,18.5 C-181.71,18.5 -190,10.21 -190,0 C-190,0 -190,0 -190,0 C-190,-10.21 -181.71,-18.5 -171.5,-18.5 C-171.5,-18.5 171.5,-18.5 171.5,-18.5 C181.71,-18.5 190,-10.21 190,0c " />
</group>
diff --git a/quickstep/res/drawable/gesture_tutorial_motion_overview.xml b/quickstep/res/drawable/gesture_tutorial_motion_overview_dark_mode.xml
similarity index 99%
rename from quickstep/res/drawable/gesture_tutorial_motion_overview.xml
rename to quickstep/res/drawable/gesture_tutorial_motion_overview_dark_mode.xml
index 4751fa9..b007d20 100644
--- a/quickstep/res/drawable/gesture_tutorial_motion_overview.xml
+++ b/quickstep/res/drawable/gesture_tutorial_motion_overview_dark_mode.xml
@@ -860,7 +860,7 @@
<path
android:name="_R_G_L_5_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#000000"
+ android:fillColor="@color/fake_wallpaper_color_dark_mode"
android:fillType="nonZero"
android:pathData=" M206 -446 C206,-446 206,446 206,446 C206,446 -206,446 -206,446 C-206,446 -206,-446 -206,-446 C-206,-446 206,-446 206,-446c " />
</group>
@@ -1600,7 +1600,7 @@
<path
android:name="_R_G_L_1_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#3c4043"
+ android:fillColor="@color/gesture_tutorial_fake_previous_task_view_color"
android:fillType="nonZero"
android:pathData=" M135 -301 C135,-301 135,311 135,311 C135,319.28 128.28,326 120,326 C120,326 -120,326 -120,326 C-128.28,326 -135,319.28 -135,311 C-135,311 -135,-301 -135,-301 C-135,-309.28 -128.28,-316 -120,-316 C-120,-316 120,-316 120,-316 C128.28,-316 135,-309.28 135,-301c " />
</group>
@@ -1612,7 +1612,7 @@
<path
android:name="_R_G_L_0_G_D_0_P_0"
android:fillAlpha="0"
- android:fillColor="#84ba69"
+ android:fillColor="@color/gesture_tutorial_primary_color"
android:fillType="nonZero"
android:pathData=" M0 406 C21.54,406 39,423.46 39,445 C39,466.54 21.54,484 0,484 C-21.54,484 -39,466.54 -39,445 C-39,423.46 -21.54,406 0,406c " />
</group>
diff --git a/quickstep/res/drawable/mock_webpage.xml b/quickstep/res/drawable/mock_webpage_dark_mode.xml
similarity index 100%
rename from quickstep/res/drawable/mock_webpage.xml
rename to quickstep/res/drawable/mock_webpage_dark_mode.xml
diff --git a/quickstep/res/drawable/mock_webpage_light_mode.xml b/quickstep/res/drawable/mock_webpage_light_mode.xml
new file mode 100644
index 0000000..98abb92
--- /dev/null
+++ b/quickstep/res/drawable/mock_webpage_light_mode.xml
@@ -0,0 +1,263 @@
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt">
+ <target android:name="time_group">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator
+ android:duration="83"
+ android:propertyName="translateX"
+ android:startOffset="0"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:valueType="floatType" />
+ </set>
+ </aapt:attr>
+ </target>
+ <aapt:attr name="android:drawable">
+ <vector
+ android:width="412dp"
+ android:height="892dp"
+ android:viewportHeight="892"
+ android:viewportWidth="412">
+ <group android:name="_R_G">
+ <group android:name="_R_G_L_0_G">
+ <group android:name="_R_G_L_0_G_L_4_G">
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_11_G"
+ android:scaleX="0.87473"
+ android:scaleY="0.98643"
+ android:translateX="206"
+ android:translateY="472.769">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_11_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#dadce0"
+ android:fillType="nonZero"
+ android:pathData=" M235.5 -407 C235.5,-407 235.5,407 235.5,407 C235.5,416.93 227.43,425 217.5,425 C217.5,425 -217.5,425 -217.5,425 C-227.43,425 -235.5,416.93 -235.5,407 C-235.5,407 -235.5,-407 -235.5,-407 C-235.5,-416.93 -227.43,-425 -217.5,-425 C-217.5,-425 217.5,-425 217.5,-425 C227.43,-425 235.5,-416.93 235.5,-407c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_10_G"
+ android:translateX="182.5"
+ android:translateY="831">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_10_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M158.5 -3 C158.5,-3 158.5,3 158.5,3 C158.5,7.42 154.92,11 150.5,11 C150.5,11 -150.5,11 -150.5,11 C-154.92,11 -158.5,7.42 -158.5,3 C-158.5,3 -158.5,-3 -158.5,-3 C-158.5,-7.42 -154.92,-11 -150.5,-11 C-150.5,-11 150.5,-11 150.5,-11 C154.92,-11 158.5,-7.42 158.5,-3c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_9_G"
+ android:translateX="186"
+ android:translateY="801">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_9_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M162 -3 C162,-3 162,3 162,3 C162,7.42 158.42,11 154,11 C154,11 -154,11 -154,11 C-158.42,11 -162,7.42 -162,3 C-162,3 -162,-3 -162,-3 C-162,-7.42 -158.42,-11 -154,-11 C-154,-11 154,-11 154,-11 C158.42,-11 162,-7.42 162,-3c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_8_G"
+ android:translateX="119"
+ android:translateY="755">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_8_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M95 -3 C95,-3 95,3 95,3 C95,7.42 91.42,11 87,11 C87,11 -87,11 -87,11 C-91.42,11 -95,7.42 -95,3 C-95,3 -95,-3 -95,-3 C-95,-7.42 -91.42,-11 -87,-11 C-87,-11 87,-11 87,-11 C91.42,-11 95,-7.42 95,-3c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_7_G"
+ android:translateX="182.5"
+ android:translateY="725">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_7_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M158.5 -3 C158.5,-3 158.5,3 158.5,3 C158.5,7.42 154.92,11 150.5,11 C150.5,11 -150.5,11 -150.5,11 C-154.92,11 -158.5,7.42 -158.5,3 C-158.5,3 -158.5,-3 -158.5,-3 C-158.5,-7.42 -154.92,-11 -150.5,-11 C-150.5,-11 150.5,-11 150.5,-11 C154.92,-11 158.5,-7.42 158.5,-3c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_6_G"
+ android:translateX="197.5"
+ android:translateY="695">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_6_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M173.5 -3 C173.5,-3 173.5,3 173.5,3 C173.5,7.42 169.92,11 165.5,11 C165.5,11 -165.5,11 -165.5,11 C-169.92,11 -173.5,7.42 -173.5,3 C-173.5,3 -173.5,-3 -173.5,-3 C-173.5,-7.42 -169.92,-11 -165.5,-11 C-165.5,-11 165.5,-11 165.5,-11 C169.92,-11 173.5,-7.42 173.5,-3c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_5_G"
+ android:translateX="192"
+ android:translateY="665">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_5_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M168 -3 C168,-3 168,3 168,3 C168,7.42 164.42,11 160,11 C160,11 -160,11 -160,11 C-164.42,11 -168,7.42 -168,3 C-168,3 -168,-3 -168,-3 C-168,-7.42 -164.42,-11 -160,-11 C-160,-11 160,-11 160,-11 C164.42,-11 168,-7.42 168,-3c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_4_G"
+ android:translateX="105.5"
+ android:translateY="360">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_4_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M23.5 -2 C23.5,-2 23.5,2 23.5,2 C23.5,4.21 21.71,6 19.5,6 C19.5,6 -19.5,6 -19.5,6 C-21.71,6 -23.5,4.21 -23.5,2 C-23.5,2 -23.5,-2 -23.5,-2 C-23.5,-4.21 -21.71,-6 -19.5,-6 C-19.5,-6 19.5,-6 19.5,-6 C21.71,-6 23.5,-4.21 23.5,-2c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_3_G"
+ android:translateX="47.5"
+ android:translateY="360">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_3_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M23.5 -2 C23.5,-2 23.5,2 23.5,2 C23.5,4.21 21.71,6 19.5,6 C19.5,6 -19.5,6 -19.5,6 C-21.71,6 -23.5,4.21 -23.5,2 C-23.5,2 -23.5,-2 -23.5,-2 C-23.5,-4.21 -21.71,-6 -19.5,-6 C-19.5,-6 19.5,-6 19.5,-6 C21.71,-6 23.5,-4.21 23.5,-2c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_2_G"
+ android:translateX="142.5"
+ android:translateY="328">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_2_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M118.5 -10 C118.5,-10 118.5,10 118.5,10 C118.5,14.42 114.92,18 110.5,18 C110.5,18 -110.5,18 -110.5,18 C-114.92,18 -118.5,14.42 -118.5,10 C-118.5,10 -118.5,-10 -118.5,-10 C-118.5,-14.42 -114.92,-18 -110.5,-18 C-110.5,-18 110.5,-18 110.5,-18 C114.92,-18 118.5,-14.42 118.5,-10c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_1_G"
+ android:translateX="186"
+ android:translateY="284">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_1_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M162 -10 C162,-10 162,10 162,10 C162,14.42 158.42,18 154,18 C154,18 -154,18 -154,18 C-158.42,18 -162,14.42 -162,10 C-162,10 -162,-10 -162,-10 C-162,-14.42 -158.42,-18 -154,-18 C-154,-18 154,-18 154,-18 C158.42,-18 162,-14.42 162,-10c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_4_G_L_0_G"
+ android:translateX="155"
+ android:translateY="240">
+ <path
+ android:name="_R_G_L_0_G_L_4_G_L_0_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M131 -10 C131,-10 131,10 131,10 C131,14.42 127.42,18 123,18 C123,18 -123,18 -123,18 C-127.42,18 -131,14.42 -131,10 C-131,10 -131,-10 -131,-10 C-131,-14.42 -127.42,-18 -123,-18 C-123,-18 123,-18 123,-18 C127.42,-18 131,-14.42 131,-10c " />
+ </group>
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_3_G"
+ android:translateX="24"
+ android:translateY="390">
+ <group
+ android:name="_R_G_L_0_G_L_3_G_L_0_G"
+ android:translateX="182"
+ android:translateY="120">
+ <path
+ android:name="_R_G_L_0_G_L_3_G_L_0_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bdc1c6"
+ android:fillType="nonZero"
+ android:pathData=" M182 -98 C182,-98 182,98 182,98 C182,110.14 172.14,120 160,120 C160,120 -160,120 -160,120 C-172.14,120 -182,110.14 -182,98 C-182,98 -182,-98 -182,-98 C-182,-110.14 -172.14,-120 -160,-120 C-160,-120 160,-120 160,-120 C172.14,-120 182,-110.14 182,-98c " />
+ </group>
+ </group>
+ <group android:name="_R_G_L_0_G_L_2_G">
+ <group
+ android:name="_R_G_L_0_G_L_2_G_L_2_G"
+ android:translateX="206"
+ android:translateY="145">
+ <path
+ android:name="_R_G_L_0_G_L_2_G_L_2_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#e8eaed"
+ android:fillType="nonZero"
+ android:pathData=" M206 -95.63 C206,-95.63 206,42.37 206,42.37 C206,43.47 205.1,44.37 204,44.37 C204,44.37 -204,44.37 -204,44.37 C-205.1,44.37 -206,43.47 -206,42.37 C-206,42.37 -206,-95.63 -206,-95.63 C-206,-96.73 -205.1,-97.63 -204,-97.63 C-204,-97.63 204,-97.63 204,-97.63 C205.1,-97.63 206,-96.73 206,-95.63c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_2_G_L_1_G"
+ android:translateX="206"
+ android:translateY="145">
+ <path
+ android:name="_R_G_L_0_G_L_2_G_L_1_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#80868b"
+ android:fillType="nonZero"
+ android:pathData=" M109 -14 C109,-14 109,14 109,14 C109,15.1 108.1,16 107,16 C107,16 -107,16 -107,16 C-108.1,16 -109,15.1 -109,14 C-109,14 -109,-14 -109,-14 C-109,-15.1 -108.1,-16 -107,-16 C-107,-16 107,-16 107,-16 C108.1,-16 109,-15.1 109,-14c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_2_G_L_0_G"
+ android:translateX="46"
+ android:translateY="145">
+ <path
+ android:name="_R_G_L_0_G_L_2_G_L_0_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#80868b"
+ android:fillType="nonZero"
+ android:pathData=" M22 -14 C22,-14 22,14 22,14 C22,18.42 18.42,22 14,22 C14,22 -14,22 -14,22 C-18.42,22 -22,18.42 -22,14 C-22,14 -22,-14 -22,-14 C-22,-18.42 -18.42,-22 -14,-22 C-14,-22 14,-22 14,-22 C18.42,-22 22,-18.42 22,-14c " />
+ </group>
+ </group>
+ <group android:name="_R_G_L_0_G_L_1_G">
+ <group
+ android:name="_R_G_L_0_G_L_1_G_L_2_G"
+ android:translateX="206"
+ android:translateY="51">
+ <path
+ android:name="_R_G_L_0_G_L_1_G_L_2_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#6e7175"
+ android:fillType="nonZero"
+ android:pathData=" M206 -0.27 C206,-0.27 206,49.73 206,49.73 C206,49.73 -206,49.73 -206,49.73 C-206,49.73 -206,-0.27 -206,-0.27 C-206,-0.27 206,-0.27 206,-0.27c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_1_G_L_1_G"
+ android:translateX="206"
+ android:translateY="50.5">
+ <path
+ android:name="_R_G_L_0_G_L_1_G_L_1_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#6e7175"
+ android:fillType="nonZero"
+ android:pathData=" M206 -32.5 C206,-32.5 206,32.5 206,32.5 C206,42.43 197.93,50.5 188,50.5 C188,50.5 -188,50.5 -188,50.5 C-197.93,50.5 -206,42.43 -206,32.5 C-206,32.5 -206,-32.5 -206,-32.5 C-206,-42.43 -197.93,-50.5 -188,-50.5 C-188,-50.5 188,-50.5 188,-50.5 C197.93,-50.5 206,-42.43 206,-32.5c " />
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_1_G_L_0_G"
+ android:translateX="206"
+ android:translateY="66.5">
+ <path
+ android:name="_R_G_L_0_G_L_1_G_L_0_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#9a9a9a"
+ android:fillType="nonZero"
+ android:pathData=" M190 0 C190,0 190,0 190,0 C190,10.21 181.71,18.5 171.5,18.5 C171.5,18.5 -171.5,18.5 -171.5,18.5 C-181.71,18.5 -190,10.21 -190,0 C-190,0 -190,0 -190,0 C-190,-10.21 -181.71,-18.5 -171.5,-18.5 C-171.5,-18.5 171.5,-18.5 171.5,-18.5 C181.71,-18.5 190,-10.21 190,0c " />
+ </group>
+ </group>
+ <group
+ android:name="_R_G_L_0_G_L_0_G"
+ android:scaleY="0"
+ android:translateX="206"
+ android:translateY="446">
+ <path
+ android:name="_R_G_L_0_G_L_0_G_D_0_P_0"
+ android:fillAlpha="1"
+ android:fillColor="#bac4d6"
+ android:fillType="nonZero"
+ android:pathData=" M206.06 -430.06 C206.06,-430.06 206,431 206,431 C206,446 189.75,446 189.79,446 C189.79,446 -189.98,446 -189.98,446 C-189.94,446 -206,446 -206,431 C-206,431 -206,-430 -206,-430 C-206,-446 -189.97,-446 -190.01,-446 C-190.01,-446 188.98,-446.06 188.98,-446.06 C188.94,-446.06 206,-446 206.06,-430.06c " />
+ </group>
+ </group>
+ </group>
+ <group android:name="time_group" />
+ </vector>
+ </aapt:attr>
+</animated-vector>
\ No newline at end of file
diff --git a/quickstep/res/drawable/task_menu_bg.xml b/quickstep/res/drawable/task_menu_bg.xml
index a60defc..be1b387 100644
--- a/quickstep/res/drawable/task_menu_bg.xml
+++ b/quickstep/res/drawable/task_menu_bg.xml
@@ -16,5 +16,6 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="?attr/popupColorPrimary" />
+ <solid android:color="@android:color/transparent"/>
+ <corners android:radius="@dimen/task_menu_corner_radius"/>
</shape>
diff --git a/quickstep/res/drawable/tutorial_step_indicator_pill.xml b/quickstep/res/drawable/tutorial_step_indicator_pill.xml
new file mode 100644
index 0000000..94a8748
--- /dev/null
+++ b/quickstep/res/drawable/tutorial_step_indicator_pill.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners android:radius="10dp"/>
+ <size android:width="16dp" android:height="6dp"/>
+</shape>
\ No newline at end of file
diff --git a/quickstep/res/layout/digital_wellbeing_toast.xml b/quickstep/res/layout/digital_wellbeing_toast.xml
index 83594e4..c4642e4 100644
--- a/quickstep/res/layout/digital_wellbeing_toast.xml
+++ b/quickstep/res/layout/digital_wellbeing_toast.xml
@@ -16,12 +16,13 @@
-->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:priv-android="http://schemas.android.com/apk/prv/res/android"
+ style="@style/TextTitle"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/bg_wellbeing_toast"
- android:fontFamily="sans-serif"
android:forceHasOverlappingRendering="false"
android:gravity="center"
android:importantForAccessibility="noHideDescendants"
- android:textColor="@android:color/white"
+ android:textColor="?priv-android:attr/textColorOnAccent"
android:textSize="14sp"/>
\ No newline at end of file
diff --git a/quickstep/res/layout/gesture_tutorial_fragment.xml b/quickstep/res/layout/gesture_tutorial_fragment.xml
index 5f82730..1e8d0e0 100644
--- a/quickstep/res/layout/gesture_tutorial_fragment.xml
+++ b/quickstep/res/layout/gesture_tutorial_fragment.xml
@@ -20,13 +20,20 @@
android:layout_height="match_parent"
android:clipChildren="false">
- <ImageView
+ <RelativeLayout
android:id="@+id/gesture_tutorial_fake_launcher_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_alignParentBottom="true"
- android:layout_marginBottom="70dp" />
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ImageView
+ android:id="@+id/gesture_tutorial_fake_hotseat_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerHorizontal="true"
+ android:layout_alignParentBottom="true"
+ android:layout_marginBottom="70dp"/>
+
+ </RelativeLayout>
<com.android.launcher3.views.ClipIconView
android:id="@+id/gesture_tutorial_fake_icon_view"
@@ -88,27 +95,15 @@
android:padding="24dp"
android:background="@drawable/bg_sandbox_feedback">
- <ImageButton
- android:id="@+id/gesture_tutorial_fragment_close_button"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:src="@drawable/close_icon"
- android:background="@drawable/bg_sandbox_close_button"
- android:contentDescription="@string/gesture_tutorial_close_button_content_description"
-
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent"/>
-
<TextView
android:id="@+id/gesture_tutorial_fragment_feedback_title"
style="@style/TextAppearance.GestureTutorial.Feedback.Title"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintTop_toBottomOf="@id/gesture_tutorial_fragment_close_button"/>
+ app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/gesture_tutorial_fragment_feedback_subtitle"
@@ -121,19 +116,16 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/gesture_tutorial_fragment_feedback_title"/>
- <TextView
+ <com.android.quickstep.interaction.TutorialStepIndicator
android:id="@+id/gesture_tutorial_fragment_feedback_tutorial_step"
- style="@style/TextAppearance.GestureTutorial.Feedback.Subtext"
- android:layout_width="0dp"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintEnd_toStartOf="@id/gesture_tutorial_fragment_action_button"
+ app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/gesture_tutorial_fragment_action_button"
app:layout_constraintBottom_toBottomOf="@id/gesture_tutorial_fragment_action_button"/>
- <!-- android:stateListAnimator="@null" removes shadow and normal on click behavior (increase
- of elevation and shadow) which is replaced by ripple effect in android:foreground -->
<Button
android:id="@+id/gesture_tutorial_fragment_action_button"
style="@style/TextAppearance.GestureTutorial.ButtonLabel"
@@ -144,14 +136,27 @@
android:paddingBottom="8dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
+ android:text="@string/gesture_tutorial_action_button_label_next"
android:background="@drawable/gesture_tutorial_action_button_background"
- android:foreground="?android:attr/selectableItemBackgroundBorderless"
android:stateListAnimator="@null"
android:visibility="invisible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/gesture_tutorial_fragment_feedback_subtitle"/>
+ <Button
+ style="@style/TextAppearance.GestureTutorial.Feedback.Subtext"
+ android:id="@+id/gesture_tutorial_fragment_close_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/gesture_tutorial_action_button_label_skip"
+ android:background="?android:attr/selectableItemBackgroundBorderless"
+
+ app:layout_constraintTop_toTopOf="@id/gesture_tutorial_fragment_action_button"
+ app:layout_constraintBottom_toBottomOf="@id/gesture_tutorial_fragment_action_button"
+ app:layout_constraintStart_toStartOf="@id/gesture_tutorial_fragment_action_button"
+ app:layout_constraintEnd_toEndOf="@id/gesture_tutorial_fragment_action_button"/>
+
</androidx.constraintlayout.widget.ConstraintLayout>
</com.android.quickstep.interaction.RootSandboxLayout>
\ No newline at end of file
diff --git a/quickstep/res/layout/task_menu.xml b/quickstep/res/layout/task_menu.xml
index a219bca..763e45e 100644
--- a/quickstep/res/layout/task_menu.xml
+++ b/quickstep/res/layout/task_menu.xml
@@ -20,18 +20,20 @@
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:background="@drawable/task_menu_bg"
- android:paddingBottom="@dimen/task_card_menu_shadow_height"
android:orientation="vertical"
android:visibility="invisible">
<TextView
android:id="@+id/task_name"
+ android:background="?android:attr/colorPrimary"
+ android:textColor="?android:attr/textColorPrimary"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:layout_marginTop="16dp"
- android:layout_marginBottom="16dp"
- android:textSize="12sp"/>
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:layout_marginBottom="2dp"
+ android:paddingTop="@dimen/task_menu_vertical_padding"
+ android:paddingBottom="@dimen/task_menu_vertical_padding"
+ android:textSize="16sp"/>
<LinearLayout
android:id="@+id/menu_option_layout"
@@ -39,6 +41,6 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
android:divider="@drawable/all_apps_divider"
- android:showDividers="beginning" />
+ android:showDividers="middle" />
</com.android.quickstep.views.TaskMenuView>
\ No newline at end of file
diff --git a/quickstep/res/layout/task_view_menu_option.xml b/quickstep/res/layout/task_view_menu_option.xml
index a7d6e89..19ca3e3 100644
--- a/quickstep/res/layout/task_view_menu_option.xml
+++ b/quickstep/res/layout/task_view_menu_option.xml
@@ -21,7 +21,7 @@
android:orientation="vertical"
android:paddingTop="@dimen/task_card_menu_option_vertical_padding"
android:paddingBottom="@dimen/task_card_menu_option_vertical_padding"
- android:background="?android:attr/selectableItemBackground"
+ android:background="?android:attr/colorPrimary"
android:theme="@style/PopupItem" >
<View
@@ -30,7 +30,7 @@
android:layout_height="@dimen/system_shortcut_icon_size"
android:layout_marginStart="@dimen/task_menu_option_start_margin"
android:layout_gravity="center_horizontal"
- android:backgroundTint="?android:attr/textColorTertiary"/>
+ android:backgroundTint="?android:attr/textColorPrimary"/>
<TextView
style="@style/BaseIcon"
@@ -38,9 +38,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/task_menu_option_start_margin"
- android:textSize="12sp"
+ android:textSize="14sp"
android:textColor="?android:attr/textColorPrimary"
- android:fontFamily="sans-serif"
android:focusable="false" />
</LinearLayout>
diff --git a/quickstep/res/layout/taskbar.xml b/quickstep/res/layout/taskbar.xml
index c436221..e680233 100644
--- a/quickstep/res/layout/taskbar.xml
+++ b/quickstep/res/layout/taskbar.xml
@@ -14,7 +14,7 @@
limitations under the License.
-->
-<com.android.launcher3.taskbar.TaskbarContainerView
+<com.android.launcher3.taskbar.TaskbarDragLayer
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/taskbar_container"
android:layout_width="wrap_content"
@@ -52,4 +52,4 @@
android:layout_height="wrap_content"
android:visibility="gone"/>
-</com.android.launcher3.taskbar.TaskbarContainerView>
\ No newline at end of file
+</com.android.launcher3.taskbar.TaskbarDragLayer>
\ No newline at end of file
diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index 69d5d1f..468628e 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Voorspelde program: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Maak seker dat jy van die rand heel links af swiep."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Maak seker dat jy van die linkerrand na die middel van die skerm swiep en laat los."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Mooi so! Swiep nou van die regterkant om terug te gaan"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Swiep van regs na middel van skerm om terug te gaan na laaste skerm."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Maak seker dat jy van die rand heel regs af swiep."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Maak seker dat jy van die regterrand na die middel van die skerm swiep en laat los."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Jy het die \"gaan terug\"-gebaar voltooi. Nou kan jy leer hoe om tussen programme te wissel."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Jy het geleer hoe om van links af te swiep om terug te gaan."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Jy het geleer hoe om van regs af te swiep om terug te gaan. Nou kan jy leer hoe om tussen programme te wissel."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Jy het die \"gaan terug\"-gebaar voltooi."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Maak seker dat jy nie te naby aan die onderkant van die skerm swiep nie."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Gaan na Instellings om sensitiwiteit van teruggebaar te verander"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Swiep van links af om terug te gaan"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Swiep van linkerkant na middel van skerm om terug te gaan na laaste skerm waarop jy was."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Swiep van links af om terug te gaan"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Swiep van regs af om terug te gaan"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Swiep van links af na middel van skerm om terug te gaan na laaste skerm waarop jy was."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Swiep van regs af na middel van skerm om terug te gaan na laaste skerm. Probeer dit nou."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Maak seker dat jy van die onderrand van die skerm af opswiep."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Maak seker jy onderbreek nie voordat jy laat los nie."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Maak seker jy swiep reguit op."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Swiep op van die onderkant van jou skerm af, hou en laat los dan."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Gereed"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Volgende"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Klaar"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Instellings"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Probeer weer"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Mooi so!"</string>
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index 8e3fe8a..3b3366d 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"የተገመተው መተግበሪያ፦ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"ጥሩ! አሁን ወደ ኋላ ለመመለስ ከቀኝ ያንሸራትቱ"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"እንዲሁም ከቀኝ ጠርዝ ወደ ማያ ገጹ መሃል በማንሸራተት ወደ መጨረሻው ማያ ገጽ መመለስ ይችላሉ።"</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_with_follow_up" msgid="8653374779579748392">"ወደኋላ የመመለስ ምልክትን አጠናቀዋል። ቀጥሎም መተግበሪያዎችን እንዴት መቀየር እንደሚችሉ ይወቁ።"</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"ወደ ኋላ ለመመለስ ከግራ ጀምሮ እንዴት ማንሸራተት እንደሚችሉ አውቀዋል።"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"ወደ ኋላ ለመመለስ ከቀኝ ጀምሮ እንዴት ማንሸራተት እንደሚችሉ አውቀዋል። ቀጥለው መተግበሪያዎችን እንዴት መቀየር እንደሚችሉ ይወቁ።"</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"ወደኋላ የመመለስ ምልክትን አጠናቀዋል።"</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="5538727561353262952">"ወደ ኋላ ለመመለስ ከግራ ጀምረው ያንሸራትቱ"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"ወደነበሩበት የመጨረሻው ማያ ገጽ ለመመለስ ከግራ ጠርዝ ወደ ማያ ገጹ መሃል ያንሸራትቱ።"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"ወደ ኋላ ለመመለስ ከግራ ጀምረው ያንሸራትቱ"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"ወደ ኋላ ለመመለስ ከቀኝ ጀምረው ያንሸራቱ"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"ወደነበሩበት የመጨረሻው ማያ ገጽ ለመመለስ ከግራ ጠርዝ ወደ ማያ ገጹ መሃል ያንሸራትቱ።"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"እንዲሁም ከቀኝ ጠርዝ ወደ ማያ ገጹ መሃል በማንሸራተት ወደ መጨረሻው ማያ ገጽ መመለስ ይችላሉ። አሁኑኑ ይሞክሩት።"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml
index b716419..1a6597d 100644
--- a/quickstep/res/values-ar/strings.xml
+++ b/quickstep/res/values-ar/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"التطبيق المتوقع: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"أحسنت. والآن مرِّر سريعًا من اليسار للرجوع."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"يمكنك أيضًا الرجوع إلى الشاشة السابقة عن طريق التمرير سريعًا من الحافة اليسرى إلى وسط الشاشة"</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_with_follow_up" msgid="8653374779579748392">"لقد أكملت التدريب على إيماءة الرجوع. تعرّف بعد ذلك على كيفية التبديل بين التطبيقات."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"لقد تعلمت كيفية التمرير سريعًا من اليمين للرجوع."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"لقد تعلمت كيفية التمرير سريعًا من اليسار للرجوع. تعرّف بعد ذلك على كيفية التبديل بين التطبيقات."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"لقد أكملت التدريب على إيماءة الرجوع."</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="5538727561353262952">"مرِّر سريعًا من اليسار للرجوع."</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"للرجوع إلى الشاشة السابقة، مرِّر سريعًا من الحافة اليمنى إلى وسط الشاشة"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"مرِّر سريعًا من اليمين للرجوع."</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"مرِّر سريعًا من اليسار للرجوع."</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"للرجوع إلى الشاشة السابقة، مرِّر سريعًا من الحافة اليمنى إلى وسط الشاشة"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"يمكنك أيضًا الرجوع للشاشة السابقة بالتمرير سريعًا من الحافة اليسرى إلى وسط الشاشة. جرِّب ذلك الآن."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml
index 0832b1b..bf61006 100644
--- a/quickstep/res/values-as/strings.xml
+++ b/quickstep/res/values-as/strings.xml
@@ -47,43 +47,33 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"পূৰ্বানুমান কৰা এপ্: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
- <skip />
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"বাওঁফালৰ পৰা ছোৱাইপ কৰি কেনেকৈ উভতি যাব লাগে, সেইটো আপুনি জানিলে।"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"সোঁফালৰ পৰা ছোৱাইপ কৰি কেনেকৈ উভতি যাব লাগে, সেইটো আপুনি জানিলে। ইয়াৰ পাছত, এপ্ কেনেকৈ সলনি কৰিব সেয়া জানক।"</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"আপুনি উভতি যাওক নিৰ্দেশটো সম্পূৰ্ণ কৰিলে।"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"আপুনি স্ক্ৰীনৰ তলৰ অংশৰ বেছি ওচৰলৈ ছোৱাইপ নকৰাটো নিশ্চিত কৰক।"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"উভতি যোৱাৰ নির্দেশটোৰ সংবেদনশীলতা সলনি কৰিবলৈ ছেটিঙলৈ যাওক"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
- <skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
- <skip />
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"উভতি যাবলৈ বাওঁফালৰ পৰা ছোৱাইপ কৰক"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"উভতি যাবলৈ সোঁফালৰ পৰা ছোৱাইপ কৰক"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"আপুনি পূৰ্বে থকা অন্তিম স্ক্ৰীনখনলৈ উভতি যাবলৈ স্ক্ৰীনখনৰ বাওঁ প্ৰান্তৰৰ পৰা মাজলৈ ছোৱাইপ কৰক।"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"আপুনি স্ক্ৰীনখনৰ সোঁ প্ৰান্তৰৰ পৰা মাজলৈ ছোৱাইপ কৰিও অন্তিম স্ক্ৰীনখনলৈ উভতি যাব পাৰে। এতিয়াই চেষ্টা কৰি চাওক।"</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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"আপুনি গৃহ স্ক্ৰীনলৈ যোৱাৰ নিৰ্দেশটো সম্পূৰ্ণ কৰিলে। ইয়াৰ পাছত, গৃহ স্ক্ৰীনলৈ কেনেকৈ যাব সেয়া জানক।"</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"আপুনি গৃহ স্ক্ৰীনলৈ যোৱাৰ নিৰ্দেশটো সম্পূৰ্ণ কৰিলে।"</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"আপুনি নিৰ্দেশসমূহ কেনেকৈ ব্যৱহাৰ কৰিব লাগে সেয়া জানিলে। নিৰ্দেশসমূহ অফ কৰিবলৈ, ছেটিঙলৈ যাওক।"</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"আপুনি এপ্ সলনি কৰাৰ নিৰ্দেশটো সম্পূৰ্ণ কৰিলে।"</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>
diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml
index 674302d..dceab09 100644
--- a/quickstep/res/values-az/strings.xml
+++ b/quickstep/res/values-az/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Proqnozlaşdırılan tətbiq: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Ən sol tərəfdən sürüşdürdüyünüzə əmin olun."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Ekranın sol kənarından ortasına sürüşdürüb buraxın."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Əla! İndi geri qayıtmaq üçün sağdan sürüşdürün"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Həmçinin ekranın sağ kənarından ortasına sürüşdürərək son ekrana qayıda bilərsiniz."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Ən sağ tərəfdən sürüşdürdüyünüzə əmin olun."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Ekranın sağ kənarından ortasına sürüşdürüb buraxın."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Geri getmə jestini tamamladınız. Sonra tətbiqləri keçirməyi öyrənin."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Geri qayıtmaq üçün soldan sürüşdürmək qaydasını öyrəndiniz."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Geri qayıtmaq üçün sağdan sürüşdürmək qaydasını öyrəndiniz. Sonra tətbiqləri keçirməyi öyrənin."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Geri getmə jestini tamamladınız."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Ekranın altına çox yaxın sürüşdürmədiyinizə əmin olun."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Geri qayıtma jestinin həssaslığını dəyişmək üçün Ayarlara keçin"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Geri qayıtmaq üçün soldan sürüşdürün"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Son ekrana qayıtmaq üçün ekranın sol kənarından ortasına doğru sürüşdürün."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Geri qayıtmaq üçün soldan sürüşdürün"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Geri qayıtmaq üçün sağdan sürüşdürün"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Son ekrana qayıtmaq üçün ekranın sol kənarından ortasına doğru sürüşdürün."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Həmçinin ekranın sağ kənarından ortasına sürüşdürərək son ekrana qayıda bilərsiniz. İndi sınayın."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Ekranın aşağı kənarından yuxarı sürüşdürdüyünüzə əmin olun."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Buraxmazdan əvvəl durdurmadığınıza əmin olun."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Birbaşa yuxarı sürüşdürdüyünüzə əmin olun."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Ekranın aşağısından yuxarı doğru sürüşdürüb saxlayın, sonra buraxın."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Tam hazır"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Sonra"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Oldu"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Ayarlar"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Yenə sınayın"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Əla!"</string>
diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml
index 4519deb..d37a640 100644
--- a/quickstep/res/values-b+sr+Latn/strings.xml
+++ b/quickstep/res/values-b+sr+Latn/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predviđamo aplikaciju: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Obavezno prevucite od same leve ivice."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Obavezno prevucite od leve ivice do sredine ekrana i otpustite."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Svaka čast! Sada prevucite zdesna da biste se vratili"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Vratite se na poslednji ekran prevlačenjem zdesna ka sredini."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Obavezno prevucite od same desne ivice."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Obavezno prevucite od desne ivice do sredine ekrana i otpustite."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Dovršili ste pokret za povratak. Sada saznajte kako da promenite aplikacije."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Naučili ste kako da prevlačite sleva da biste se vratili."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Naučili ste kako da prevlačite zdesna da biste se vratili. Sada naučite da menjate aplikacije."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Dovršili ste pokret za povratak."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Nikako ne prevlačite previše blizu dna ekrana."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Osetljivost pok. za nazad možete da promenite u Podešavanjima"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Prevucite sa leve strane da biste se vratili"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Da biste se vratili na poslednji ekran, prevucite od leve ivice ka sredini ekrana."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Prevucite sleva da biste se vratili"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Prevucite zdesna da biste se vratili"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Da biste se vratili na poslednji ekran, prevucite od leve ivice ka sredini ekrana."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Možete da se vratite na poslednji ekran i prevlačenjem od desne ivice ka sredini ekrana. Isprobajte."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Obavezno prevucite nagore od donje ivice ekrana."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Nikako ne stajte pre otpuštanja."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Obavezno prevucite pravo nagore."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Prevucite nagore od dna ekrana, zadržite, pa pustite."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"To je to"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Dalje"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Gotovo"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Podešavanja"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Probajte ponovo"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Svaka čast!"</string>
diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml
index 20e09ca..e0ae63b 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Праграма з падказкі: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Выдатна! Каб вярнуцца, правядзіце пальцам ад правага краю"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Каб вярнуцца, правядзіце ад правага краю ў цэнтр экрана."</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_with_follow_up" msgid="8653374779579748392">"Вы навучыліся рабіць жэст вяртання. А зараз даведайцеся, як пераключацца паміж праграмамі."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Вы даведаліся, як праводзіць пальцам злева ўправа для вяртання."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Вы даведаліся, як гартаць справа для вяртання. Цяпер даведайцеся, як пераключацца паміж праграмамі."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Вы навучыліся рабіць жэст вяртання."</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="5538727561353262952">"Каб вярнуцца назад, правядзіце пальцам ад левага краю"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Каб вярнуцца на папярэдні экран, правядзіце пальцам ад левага краю ў цэнтр экрана."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Каб вярнуцца назад, правядзіце пальцам ад левага краю"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Каб вярнуцца назад, правядзіце пальцам ад правага краю"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Каб вярнуцца на папярэдні экран, правядзіце пальцам ад левага краю ў цэнтр экрана."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Для вяртання на папярэдні экран таксама можна правесці ад правага краю ў цэнтр экрана. Паспрабуйце."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml
index 1e02bfc..47317a7 100644
--- a/quickstep/res/values-bg/strings.xml
+++ b/quickstep/res/values-bg/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Предвидено приложение: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Чудесно! Прекарайте пръст от дясно, за да се върнете назад"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Можете да се върнете на последния екран, като прекарате пръст от десния край на екрана до средата."</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_with_follow_up" msgid="8653374779579748392">"Изпълнихте жеста за връщане назад. В следващия урок ще научите как се превключва между приложения."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Научихте как да се връщате назад с прекарване на пръст от левия край на екрана."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Научихте жеста за връщане с плъзгане от дясно. Сега научете как се превключва между приложения."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Изпълнихте жеста за връщане назад."</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="5538727561353262952">"Прекарайте пръст от ляво, за да се върнете назад"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"За да се върнете на последния активен екран, прекарайте пръст от левия край на екрана до средата."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Връщане назад с прекарване на пръст от левия край"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Връщане назад с прекарване на пръст от десния край"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"За да се върнете на последния активен екран, прекарайте пръст от левия край на екрана до средата."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Прекарайте пръст от десния край до средата за връщане към последния екран. Изпробвайте сега."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml
index b37c56b..0fd888d 100644
--- a/quickstep/res/values-bn/strings.xml
+++ b/quickstep/res/values-bn/strings.xml
@@ -47,43 +47,39 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"আপনার প্রয়োজন হতে পারে এমন অ্যাপ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_back_right_follow_up (2100639504811809267) -->
<skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_overview_follow_up (9176400654037014471) -->
<skip />
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"আপনি ফিরে যাওয়ার জেসচার সম্পর্কে জেনেছেন।"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"স্ক্রিনের নিচের প্রান্তের খুব কাছে পর্যন্ত যাতে সোয়াইপ না করেন সেটি ভাল করে দেখে নিন।"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"ফিরে যাওয়ার জেসচারের সেন্সিটিভিটি পরিবর্তন করতে, সেটিংসে যান"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
+ <!-- no translation found for back_left_gesture_intro_title (5197184481779330065) -->
<skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
+ <!-- no translation found for back_right_gesture_intro_title (7431951986971898074) -->
+ <skip />
+ <!-- no translation found for back_left_gesture_intro_subtitle (7672761376577628602) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_subtitle (2735828029197816509) -->
<skip />
<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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"আপনি হোম স্ক্রিনে যাওয়ার জেসচার সম্পর্কে জেনেছেন। এরপর, ফিরে কীভাবে যাবেন তা জেনে নিন।"</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"আপনি হোম স্ক্রিনে যাওয়ার জেসচার সম্পর্কে জেনেছেন।"</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"ইঙ্গিত কীভাবে ব্যবহার করতে হয় আপনি তা শিখে ফেলেছেন। ইঙ্গিত বন্ধ করতে, সেটিংসে যান।"</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"আপনি একটি অ্যাপ থেকে অন্য অ্যাপে যাওয়ার জেসচার সম্পর্কে জেনেছেন।"</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>
diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml
index 10d8f16..4ec2e06 100644
--- a/quickstep/res/values-bs/strings.xml
+++ b/quickstep/res/values-bs/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predviđena aplikacija: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Obratite pažnju da prevučete s krajnjeg lijevog ruba."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Obratite pažnju da prevučete s lijevog ruba prema sredini ekrana, a zatim pustite."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Lijepo! Sada prevucite zdesna ulijevo da se vratite"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Na posljednji ekran se možete vratiti i prevlačenjem od desnog ruba do sredine ekrana."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Obratite pažnju da prevučete s krajnjeg desnog ruba."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Obratite pažnju da prevučete s desnog ruba prema sredini ekrana, a zatim pustite."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Završili ste pokret za vraćanje. Sljedeće naučite kako prebacivati između aplikacija."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Naučili ste kako prevući slijeva nadesno da se vratite."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Naučili ste kako prevući zdesna da se vratite. Sljedeće naučite kako prebacivati između aplikacija."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Završili ste pokret za vraćanje."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Obratite pažnju da ne prevučete preblizu donjem dijelu ekrana."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Promijenite osjetljivost pokreta za povratak u Postavkama"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Prevucite slijeva nadesno da se vratite"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Da se vratite na posljednji ekran na kojem ste bili, prevucite od lijevog ruba do sredine ekrana."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Prevucite slijeva nadesno da se vratite"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Prevucite prstom zdesna ulijevo da se vratite"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Da se vratite na posljednji ekran na kojem ste bili, prevucite od lijevog ruba do sredine ekrana."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Na posljednji ekran se možete vratiti i prevlačenjem od desnog ruba do sredine ekrana. Isprobajte."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Obratite pažnju da prevučete prema gore s donjeg ruba ekrana."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Obratite pažnju da ne zastanete prije puštanja."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Obratite pažnju da prevučete ravno prema gore."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Prevucite s dna ekrana prema gore, zadržite, a zatim pustite."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Sve je spremno"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Naprijed"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Gotovo"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Postavke"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Pokušaj ponovo"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Lijepo!"</string>
diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml
index 0b81884..f93051a 100644
--- a/quickstep/res/values-ca/strings.xml
+++ b/quickstep/res/values-ca/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicció d\'aplicació: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Assegura\'t de lliscar des de l\'extrem esquerre de la pantalla."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Assegura\'t de lliscar des de la vora esquerra cap al centre de la pantalla i deixa anar."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Molt bé! Ara llisca des de la dreta per tornar enrere."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"També pots tornar a la darrera pantalla lliscant des de l\'extrem dret cap al centre."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Assegura\'t de lliscar des de l\'extrem dret de la pantalla."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Assegura\'t de lliscar des de la vora dreta cap al centre de la pantalla i deixa anar."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Has completat el gest per tornar enrere. Ara, descobreix com pots canviar d\'aplicació."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Has après com pots lliscar des de l\'esquerra per tornar enrere."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Has après com pots lliscar des de la dreta per tornar enrere. Ara, descobreix com pots canviar d\'app."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Has completat el gest per tornar enrere."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Assegura\'t de no lliscar massa a prop de la part inferior de la pantalla."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Per canviar la sensibilitat del gest, ves a Configuració"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Llisca des de l\'esquerra per tornar enrere"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Per tornar a la darrera pantalla, llisca des de l\'extrem esquerre cap al centre de la pantalla."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Llisca des de l\'esquerra per tornar enrere"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Llisca des de la dreta per tornar enrere"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Per tornar a la darrera pantalla, llisca des de l\'extrem esquerre cap al centre de la pantalla."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"També pots tornar a la darrera pantalla lliscant des de l\'extrem dret cap al centre. Prova-ho ara."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Assegura\'t de lliscar des de la vora inferior de la pantalla."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Assegura\'t de no aturar-te abans de deixar anar."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Assegura\'t de lliscar directament cap amunt."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Llisca cap amunt des de la part inferior de la pantalla, mantén premut i deixa anar."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Tot a punt"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Següent"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Fet"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Configuració"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Torna-ho a provar"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Molt bé!"</string>
diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml
index d5feff7..b8d24cf 100644
--- a/quickstep/res/values-cs/strings.xml
+++ b/quickstep/res/values-cs/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Předpokládaná aplikace: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Přejeďte prstem z úplného levého okraje obrazovky."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Přejeďte prstem z levého okraje doprostřed obrazovky a zdvihněte prst."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Skvělé! Teď se přejetím prstem zprava vraťte"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Přejetím prstem z pravého okraje doprostřed obrazovky se také můžete vrátit zpět na poslední obrazovku."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Přejeďte prstem z úplného pravého okraje obrazovky."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Přejeďte prstem z pravého okraje doprostřed obrazovky a zdvihněte prst."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Dokončili jste gesto pro přechod zpět. Teď se naučíte přepínat aplikace."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Naučili jste se, jak se vrátit zpět přejetím prstem zleva."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Naučili jste se, jak se vrátit zpět přejetím prstem zprava. Teď se naučíte přepínat aplikace."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Dokončili jste gesto pro přechod zpět."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Dejte pozor, abyste prstem nepřejížděli moc blízko ke spodnímu okraji obrazovky."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Citlivost gesta pro přechod zpět můžete změnit v Nastavení"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Pokud se chcete vrátit, přejeďte prstem zleva"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Na poslední obrazovku se můžete vrátit přejetím prstem z levého okraje doprostřed obrazovky."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Pokud se chcete vrátit, přejeďte prstem zleva"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Přejetím prstem zprava se vrátíte zpět"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Na poslední obrazovku se můžete vrátit přejetím prstem z levého okraje doprostřed obrazovky."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Přejetím prstem z pravého okraje doprostřed obrazovky se také můžete vrátit zpět na poslední obrazovku. Zkuste to."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Přejeďte prstem nahoru z dolního okraje obrazovky."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Před zdvihnutím prstu nedělejte pauzu."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Přejeďte prstem přímo nahoru."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Přejeďte prstem nahoru z dolního okraje obrazovky, podržte obrazovku a potom prst uvolněte."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Vše je nastaveno"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Další"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Hotovo"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Nastavení"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Zkusit znovu"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Skvělé!"</string>
diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml
index c2d94a1..9c9d624 100644
--- a/quickstep/res/values-da/strings.xml
+++ b/quickstep/res/values-da/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"App, du forventes at skulle bruge: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Stryg fra kanten yderst til venstre."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Stryg fra venstre kant mod midten af skærmen, og løft fingeren."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Sådan! Prøv derefter at stryge fra højre for at gå tilbage"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Du kan også gå tilbage til den seneste skærm ved at stryge mod midten af skærmen fra højre kant."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Stryg fra kanten yderst til højre."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Stryg fra højre kant mod midten af skærmen, og løft fingeren."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Du har fuldført bevægelsen for Gå tilbage. Som det næste kan du se, hvordan du skifter app."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Du har lært, hvordan du stryger fra venstre for at gå tilbage."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Du har lært, hvordan du stryger fra højre for at gå tilbage. Nu skal du se, hvordan du skifter app."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Du har fuldført bevægelsen for Gå tilbage."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Undgå at stryge for tæt på bunden af skærmen."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Juster følsomheden for bevægelsen Gå tilbage i Indstillinger"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Stryg fra venstre for at gå tilbage"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Stryg mod midten af skærmen fra venstre kant for at gå tilbage til den seneste skærm, du var på."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Stryg fra venstre for at gå tilbage"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Stryg fra højre for at gå tilbage"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Stryg mod midten af skærmen fra venstre kant for at gå tilbage til den seneste skærm, du var på."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Du kan også gå tilbage til den seneste skærm ved at stryge mod midten af skærmen fra højre kant. Prøv det nu."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Stryg opad fra bunden af skærmen."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Undlad at holde fingeren stille, indtil du løfter fingeren."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Stryg lige opad."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Stryg opad fra bunden af skærmen, hold fingeren stille, og løft den."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Så er du klar"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Næste"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Luk"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Indstillinger"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Prøv igen"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Sådan!"</string>
diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml
index 14f123f..4b5fd27 100644
--- a/quickstep/res/values-de/strings.xml
+++ b/quickstep/res/values-de/strings.xml
@@ -47,16 +47,23 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Vorgeschlagene App: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Wische vom äußersten linken Bildschirmrand."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Wische vom linken Bildschirmrand zur Bildschirmmitte und lass los."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Sehr gut! Wische von rechts nach links, um zurückzugehen."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Du kannst auch zum letzten Bildschirm zurückgehen, indem du vom rechten Bildschirmrand zur Mitte wischst."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Wische vom äußersten rechten Bildschirmrand."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Wische vom rechten Bildschirmrand zur Bildschirmmitte und lass los."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Du hast die „Zurück“-Touch-Geste abgeschlossen. Gleich lernst du, wie man zwischen Apps wechselt."</string>
+ <!-- no translation found for back_gesture_feedback_complete_with_back_right_follow_up (2100639504811809267) -->
+ <skip />
+ <!-- no translation found for back_gesture_feedback_complete_with_overview_follow_up (9176400654037014471) -->
+ <skip />
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Du hast die „Zurück“-Touch-Geste abgeschlossen."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Wische nicht zu nah am unteren Bildschirmrand."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Du kannst die Empfindlichkeit von „Zurück“ in den Einstellungen ändern"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Von links nach rechts wischen, um zurückzugehen"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Wenn du zum letzten Bildschirm zurückgehen möchtest, wische vom linken Bildschirmrand zur Mitte."</string>
+ <!-- no translation found for back_left_gesture_intro_title (5197184481779330065) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_title (7431951986971898074) -->
+ <skip />
+ <!-- no translation found for back_left_gesture_intro_subtitle (7672761376577628602) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_subtitle (2735828029197816509) -->
+ <skip />
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Wische vom unteren Bildschirmrand nach oben."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Achte darauf, nicht innezuhalten, bevor du loslässt."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Wische gerade nach oben."</string>
@@ -73,7 +80,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Wische auf dem Bildschirm von unten nach oben, halte ihn gedrückt und lass ihn dann los."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Fertig"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Weiter"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Fertig"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Einstellungen"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Wiederholen"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Sehr gut!"</string>
diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml
index ecc574f..67209b6 100644
--- a/quickstep/res/values-el/strings.xml
+++ b/quickstep/res/values-el/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Εφαρμογή από πρόβλεψη: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Ωραία! Τώρα σύρετε από τα δεξιά για επιστροφή"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Μπορείτε να επιστρέψετε στην τελευταία οθόνη με σάρωση από το δεξί άκρο προς το κέντρο της οθόνης."</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_with_follow_up" msgid="8653374779579748392">"Ολοκληρώσατε την κίνηση επιστροφής. Στη συνέχεια, μάθετε πώς να κάνετε εναλλαγή εφαρμογών."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Μάθατε πώς να σύρετε από τα αριστερά για επιστροφή."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Μάθατε πώς να σύρετε από τα δεξιά για επιστροφή. Στη συνέχεια, μάθετε πώς να κάνετε εναλλαγή εφαρμ."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Ολοκληρώσατε την κίνηση επιστροφής."</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="5538727561353262952">"Για να επιστρέψετε, σύρετε από τα αριστερά"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Για να επιστρέψετε στην τελευταία οθόνη, σύρετε από το αριστερό άκρο προς το κέντρο της οθόνης."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Για να επιστρέψετε, σύρετε από τα αριστερά"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Για να επιστρέψετε, σύρετε από τα δεξιά"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Για να επιστρέψετε στην τελευταία οθόνη, σύρετε από το αριστερό άκρο προς το κέντρο της οθόνης."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Επιστρέψτε στην τελευταία οθόνη σύροντας από τα δεξιά προς το κέντρο της οθόνης. Δοκιμάστε το τώρα."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml
index 882f98a..86ae07f 100644
--- a/quickstep/res/values-en-rAU/strings.xml
+++ b/quickstep/res/values-en-rAU/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicted app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Make sure that you swipe from the far-left edge."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Make sure that you swipe from the left edge to the middle of the screen and let go."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Nice! Now swipe from the right to go back"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"You can also go back to the last screen by swiping from the right edge to the middle of the screen."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Make sure that you swipe from the far-right edge."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Make sure that you swipe from the right edge to the middle of the screen and let go."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"You completed the go back gesture. Next, learn how to switch apps."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"You learned how to swipe from the left to go back."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"You learned how to swipe from the right to go back. Next, learn how to switch apps."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"You completed the go back gesture."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Make sure that you don\'t swipe too close to the bottom of the screen."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"To change sensitivity of the back gesture, go to Settings"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Swipe from the left to go back"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"To go back to the last screen you were on, swipe from the left edge to the middle of the screen."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Swipe from the left to go back"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Swipe from the right to go back"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"To go back to the last screen you were on, swipe from the left edge to the middle of the screen."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"You can also go back to the last screen by swiping from the right edge to the middle of the screen. Try it now."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Make sure that you swipe up from the bottom edge of the screen."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Make sure that you don\'t pause before letting go."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Make sure that you swipe straight up."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Swipe up from the bottom of your screen, hold, then release."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"All set"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Next"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Done"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Settings"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Try again"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Nice!"</string>
diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml
index 882f98a..86ae07f 100644
--- a/quickstep/res/values-en-rCA/strings.xml
+++ b/quickstep/res/values-en-rCA/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicted app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Make sure that you swipe from the far-left edge."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Make sure that you swipe from the left edge to the middle of the screen and let go."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Nice! Now swipe from the right to go back"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"You can also go back to the last screen by swiping from the right edge to the middle of the screen."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Make sure that you swipe from the far-right edge."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Make sure that you swipe from the right edge to the middle of the screen and let go."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"You completed the go back gesture. Next, learn how to switch apps."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"You learned how to swipe from the left to go back."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"You learned how to swipe from the right to go back. Next, learn how to switch apps."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"You completed the go back gesture."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Make sure that you don\'t swipe too close to the bottom of the screen."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"To change sensitivity of the back gesture, go to Settings"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Swipe from the left to go back"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"To go back to the last screen you were on, swipe from the left edge to the middle of the screen."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Swipe from the left to go back"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Swipe from the right to go back"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"To go back to the last screen you were on, swipe from the left edge to the middle of the screen."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"You can also go back to the last screen by swiping from the right edge to the middle of the screen. Try it now."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Make sure that you swipe up from the bottom edge of the screen."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Make sure that you don\'t pause before letting go."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Make sure that you swipe straight up."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Swipe up from the bottom of your screen, hold, then release."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"All set"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Next"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Done"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Settings"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Try again"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Nice!"</string>
diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml
index 882f98a..86ae07f 100644
--- a/quickstep/res/values-en-rGB/strings.xml
+++ b/quickstep/res/values-en-rGB/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicted app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Make sure that you swipe from the far-left edge."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Make sure that you swipe from the left edge to the middle of the screen and let go."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Nice! Now swipe from the right to go back"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"You can also go back to the last screen by swiping from the right edge to the middle of the screen."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Make sure that you swipe from the far-right edge."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Make sure that you swipe from the right edge to the middle of the screen and let go."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"You completed the go back gesture. Next, learn how to switch apps."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"You learned how to swipe from the left to go back."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"You learned how to swipe from the right to go back. Next, learn how to switch apps."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"You completed the go back gesture."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Make sure that you don\'t swipe too close to the bottom of the screen."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"To change sensitivity of the back gesture, go to Settings"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Swipe from the left to go back"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"To go back to the last screen you were on, swipe from the left edge to the middle of the screen."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Swipe from the left to go back"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Swipe from the right to go back"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"To go back to the last screen you were on, swipe from the left edge to the middle of the screen."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"You can also go back to the last screen by swiping from the right edge to the middle of the screen. Try it now."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Make sure that you swipe up from the bottom edge of the screen."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Make sure that you don\'t pause before letting go."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Make sure that you swipe straight up."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Swipe up from the bottom of your screen, hold, then release."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"All set"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Next"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Done"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Settings"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Try again"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Nice!"</string>
diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml
index 882f98a..86ae07f 100644
--- a/quickstep/res/values-en-rIN/strings.xml
+++ b/quickstep/res/values-en-rIN/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicted app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Make sure that you swipe from the far-left edge."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Make sure that you swipe from the left edge to the middle of the screen and let go."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Nice! Now swipe from the right to go back"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"You can also go back to the last screen by swiping from the right edge to the middle of the screen."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Make sure that you swipe from the far-right edge."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Make sure that you swipe from the right edge to the middle of the screen and let go."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"You completed the go back gesture. Next, learn how to switch apps."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"You learned how to swipe from the left to go back."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"You learned how to swipe from the right to go back. Next, learn how to switch apps."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"You completed the go back gesture."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Make sure that you don\'t swipe too close to the bottom of the screen."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"To change sensitivity of the back gesture, go to Settings"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Swipe from the left to go back"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"To go back to the last screen you were on, swipe from the left edge to the middle of the screen."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Swipe from the left to go back"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Swipe from the right to go back"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"To go back to the last screen you were on, swipe from the left edge to the middle of the screen."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"You can also go back to the last screen by swiping from the right edge to the middle of the screen. Try it now."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Make sure that you swipe up from the bottom edge of the screen."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Make sure that you don\'t pause before letting go."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Make sure that you swipe straight up."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Swipe up from the bottom of your screen, hold, then release."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"All set"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Next"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Done"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Settings"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Try again"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Nice!"</string>
diff --git a/quickstep/res/values-en-rXC/strings.xml b/quickstep/res/values-en-rXC/strings.xml
index ce7dccc..f7663dc 100644
--- a/quickstep/res/values-en-rXC/strings.xml
+++ b/quickstep/res/values-en-rXC/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicted app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Make sure you swipe from the far-left edge."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Make sure you swipe from the left edge to the middle of the screen and let go."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Nice! Now swipe from the right to go back"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"You can also go back to the last screen by swiping from the right edge to the middle of the screen."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Make sure you swipe from the far-right edge."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Make sure you swipe from the right edge to the middle of the screen and let go."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"You completed the go back gesture. Next up, learn how to switch apps."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"You learned how to swipe from the left to go back."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"You learned how to swipe from the right to go back. Next up, learn how to switch apps."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"You completed the go back gesture."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Make sure you don\'t swipe too close to the bottom of the screen."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"To change the sensitivity of the back gesture, go to Settings"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Swipe from the left to go back"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"To go back to the last screen you were on, swipe from the left edge to the middle of the screen."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Swipe from the left to go back"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Swipe from the right to go back"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"To go back to the last screen you were on, swipe from the left edge to the middle of the screen."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"You can also go back to the last screen by swiping from the right edge to the middle of the screen. Try it now."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Make sure you swipe up from the bottom edge of the screen."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Make sure you don\'t pause before letting go."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Make sure you swipe straight up."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Swipe up from the bottom of your screen, hold, then release."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"All set"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Next"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Done"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Settings"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Try again"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Nice!"</string>
diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml
index f8aa17d..34d43d6 100644
--- a/quickstep/res/values-es-rUS/strings.xml
+++ b/quickstep/res/values-es-rUS/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicción de app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Asegúrate de deslizar el dedo bien desde el borde izquierdo."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Asegúrate de deslizar el dedo del borde izquierdo hacia el centro de la pantalla y, luego, suéltalo."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"¡Genial! Ahora, desliza el dedo desde la derecha para volver"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Desliza de derecha al centro para volver a última pantalla."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Asegúrate de deslizar el dedo bien desde el borde derecho."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Asegúrate de deslizar el dedo del borde derecho hacia el centro de la pantalla y, luego, suéltalo."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Completaste el gesto \"Atrás\". A continuación, obtén información para cambiar de app."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Aprendiste cómo deslizar el dedo desde la izquierda para volver."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Aprendiste a deslizar el dedo desde la derecha para volver. Ahora, descubre cómo cambiar de app."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Completaste el gesto \"Atrás\"."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Asegúrate de no hacerlo muy cerca de la parte inferior de la pantalla."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Cambia sensibilidad de gesto \"Atrás\" en Configuración"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Para volver, desliza el dedo desde la izquierda"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Para volver a la última pantalla, desliza el dedo del borde izquierdo al centro de la pantalla."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Para volver, desliza el dedo desde la izquierda"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Para volver, desliza el dedo desde la derecha"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Para volver a la última pantalla, desliza el dedo del borde izquierdo al centro de la pantalla."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Desliza de derecha al centro para volver a última pantalla. Pruébalo ahora."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Asegúrate de deslizar el dedo hacia arriba desde la borde inferior de la pantalla."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Asegúrate de no detenerte antes de soltarlo."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Asegúrate de deslizar el dedo derecho hacia arriba."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Desliza el dedo hacia arriba desde la parte inferior de la pantalla, mantenlo presionado y, luego, suéltalo."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Listo"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Siguiente"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Listo"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Configuración"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Reintentar"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"¡Genial!"</string>
diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml
index 9be5db1..c2cb08e 100644
--- a/quickstep/res/values-es/strings.xml
+++ b/quickstep/res/values-es/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplicación sugerida: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Desliza el dedo desde el extremo izquierdo."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Desliza el dedo desde el borde izquierdo de la pantalla hasta el centro y levántalo."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"¡Muy bien! Desliza el dedo desde la derecha para volver"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"También puedes deslizar el dedo del borde derecho al centro para volver a la pantalla anterior."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Desliza el dedo desde el extremo derecho."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Desliza el dedo desde el borde derecho de la pantalla hasta el centro y levántalo."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Has completado el gesto para volver. Ahora, descubre cómo cambiar de aplicación."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Ya sabes deslizar el dedo desde la izquierda para ir atrás."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Ya sabes deslizar el dedo desde la derecha para ir atrás. Descubre ahora cómo cambiar de aplicación."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Has completado el gesto para volver."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"No deslices el dedo demasiado cerca de la parte inferior de la pantalla."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Para cambiar la sensibilidad del gesto, ve a Ajustes"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Desliza el dedo desde la izquierda para volver"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Si quieres volver a la pantalla anterior, desliza el dedo del borde izquierdo al centro."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Desliza el dedo desde la izquierda para ir atrás"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Desliza el dedo desde la derecha para ir atrás"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Para volver a la pantalla anterior, desliza el dedo desde el borde izquierdo al centro."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"También puedes ir atrás deslizando el dedo del borde derecho al centro. Pruébalo ahora."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Desliza el dedo hacia arriba desde el borde inferior de la pantalla."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"No hagas ninguna pausa antes de levantar el dedo."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Desliza el dedo directamente hacia arriba."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Desliza el dedo hacia arriba desde la parte inferior de la pantalla, mantenlo pulsado y levántalo."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Todo listo"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Siguiente"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Hecho"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Ajustes"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Reintentar"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"¡Muy bien!"</string>
diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml
index 9241d30..88f11cd 100644
--- a/quickstep/res/values-et/strings.xml
+++ b/quickstep/res/values-et/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Ennustatud rakendus: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Pühkige kindlasti vasakpoolsest servast."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Pühkige ekraanikuva vasakust servast keskele ja eemaldage sõrm."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Tubli töö! Nüüd pühkige tagasiliikumiseks paremalt vasakule."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Eelmisele ekraanikuvale naasmiseks võite ka ekraanikuva paremast servast keskele pühkida."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Pühkige kindlasti parempoolsest servast."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Pühkige ekraanikuva paremast servast keskele ja eemaldage sõrm."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Tegite tagasiliikumise liigutuse. Järgmisena vaadake, kuidas rakenduste vahel vahetada."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Õppisite, kuidas tagasiliikumiseks vasakult pühkida."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Õppisite, kuidas tagasiliikumiseks paremalt pühkida. Nüüd vaadake, kuidas rakenduste vahel vahetada."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Tegite tagasiliikumise liigutuse."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Veenduge, et te ei pühiks liiga ekraanikuva allosa lähedalt."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Tagasiliigutuse tundlikkuse muutmiseks avage menüü Seaded"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Tagasiliikumiseks pühkige vasakult paremale"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Eelmisele ekraanikuvale naasmiseks pühkige vasakust servast ekraanikuva keskele."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Tagasiliikumiseks pühkige vasakult paremale"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Tagasiliikumiseks pühkige paremalt vasakule"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Eelmisele ekraanikuvale naasmiseks pühkige vasakust servast ekraanikuva keskele."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Eelmisele ekraanikuvale naasmiseks võite ka kuva paremast servast keskele pühkida. Proovige kohe."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Pühkige kindlasti ekraanikuva alumisest servast üles."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Veenduge, et te enne vabastamist liigutust ei peataks."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Pühkige kindlasti otse üles."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Pühkige ekraanikuva alaosast üles, hoidke ja seejärel vabastage."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Valmis"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Järgmine"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Valmis"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Seaded"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Proovige uuesti"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Tubli töö!"</string>
diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml
index f810b42..19ad2f0 100644
--- a/quickstep/res/values-eu/strings.xml
+++ b/quickstep/res/values-eu/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Iragarritako aplikazioa: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Ziurtatu hatza ezkerreko ertzetik pasatzen duzula."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Ziurtatu hatza pantailaren ezkerreko ertzetik erdialdera pasatzen eta askatzen duzula."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Ederki! Orain, atzera egiteko, pasatu hatza eskuinetik."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Aurreko pantailara itzultzeko beste modu bat: pasatu hatza pantailaren eskuineko ertzetik erdialdera."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Ziurtatu hatza eskuineko ertzetik pasatzen duzula."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Ziurtatu hatza pantailaren eskuineko ertzetik erdialdera pasatzen eta askatzen duzula."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Ikasi duzu atzera egiteko keinua. Jarraian, ikasi aplikazioa aldatzen."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Hatza ezkerretik pasatuta atzera egiten ikasi duzu."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Hatza eskuinetik pasatuta atzera egiten ikasi duzu. Jarraian, ikasi aplikazioa aldatzen."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Ikasi duzu atzera egiteko keinua."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Ziurtatu hatza ez duzula pantailaren behealdetik gertuegi pasatzen."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Keinuaren sentikortasuna aldatzeko, joan ezarpenetara"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Atzera egiteko, pasatu hatza ezkerretik"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Aurreko pantailara itzultzeko, pasatu hatza pantailaren ezkerreko ertzetik erdialdera."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Atzera egiteko, pasatu hatza ezkerretik"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Atzera egiteko, pasatu hatza eskuinetik"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Aurreko pantailara itzultzeko, pasatu hatza pantailaren ezkerreko ertzetik erdialdera"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Aurreko pantailara itzultzeko beste modu bat: pasatu hatza pantailaren eskuineko ertzetik erdialdera. Proba ezazu."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Ziurtatu hatza pantailaren beheko ertzetik gora pasatzen duzula."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Ziurtatu askatu aurretik ez duzula hatza gelditzen."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Ziurtatu hatza zuzen gora pasatzen duzula."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Pasatu hatza pantailaren behealdetik gora, eduki pantaila sakatuta eta altxatu hatza."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Dena prest"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Hurrengoa"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Eginda"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Ezarpenak"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Saiatu berriro"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Ederki!"</string>
diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml
index ccde33a..721b968 100644
--- a/quickstep/res/values-fa/strings.xml
+++ b/quickstep/res/values-fa/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"برنامه پیشبینیشده: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"عالی! اکنون از سمت راست تند بکشید تا به عقب بروید"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"با تند کشیدن از لبه سمت راست به وسط صفحه هم میتوانید به عقب بروید."</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_with_follow_up" msgid="8653374779579748392">"اشاره برگشتن را تکمیل کردید. مورد بعدی، با نحوه جابهجا شدن بین برنامهها آشنا شوید."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"یاد گرفتید چگونه برای رفتن به عقب از سمت چپ تند بکشید."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"یاد گرفتید چگونه برای رفتن به عقب از سمت راست تند بکشید. مورد بعدی، با نحوه جابهجا شدن بین برنامهها آشنا شوید."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"اشاره برگشتن را تکمیل کردید."</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="5538727561353262952">"برای برگشتن به عقب، از سمت چپ تند بکشید"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"برای برگشتن به آخرین صفحهای که در آن بودید، از لبه سمت چپ تند به وسط صفحه بکشید."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"برای برگشتن به عقب، از سمت چپ تند بکشید"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"برای رفتن به عقب، از سمت راست تند بکشید"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"برای برگشتن به آخرین صفحهای که در آن بودید، از لبه سمت چپ تند بهوسط صفحه بکشید."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"با تند کشیدن از لبه سمت راست به وسط صفحه هم میتوانید به عقب بروید. امتحان کنید."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml
index e903138..5c19b23 100644
--- a/quickstep/res/values-fi/strings.xml
+++ b/quickstep/res/values-fi/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Ennakoitu sovellus: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Muista pyyhkäistä aivan vasemmasta reunasta."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Pyyhkäise näytön vasemmasta reunasta keskelle ja päästä irti."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Hienoa! Palaa nyt takaisin pyyhkäisemällä oikeasta reunasta"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Voit myös palata edelliseen näkymään pyyhkäisemällä näytön oikeasta reunasta keskelle."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Muista pyyhkäistä aivan oikeasta reunasta."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Pyyhkäise näytön oikeasta reunasta keskelle ja päästä irti."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Olet oppinut Takaisin-eleen. Opettele seuraavaksi vaihtamaan sovellusta."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Nyt osaat palata takaisin pyyhkäisemällä vasemmasta reunasta."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Osaat palata takaisin pyyhkäisemällä oikeasta reunasta. Opettele seuraavaksi vaihtamaan sovellusta."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Olet oppinut Takaisin-eleen."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Varo, ettet pyyhkäise liian lähellä alareunaa."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Voit muuttaa Takaisin-eleen herkkyyttä asetuksista"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Palaa takaisin pyyhkäisemällä vasemmasta reunasta"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Voit palata edelliseen näkymään pyyhkäisemällä näytön vasemmasta reunasta keskelle."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Palaa takaisin pyyhkäisemällä vasemmasta reunasta"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Palaa takaisin pyyhkäisemällä oikeasta reunasta"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Voit palata edelliseen näkymään pyyhkäisemällä näytön vasemmasta reunasta keskelle."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Voit myös palata edelliseen näkymään pyyhkäisemällä näytön oikeasta reunasta keskelle. Kokeile nyt."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Pyyhkäise ylös näytön alareunasta."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Varo keskeyttämästä ennen kuin päästät irti."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Muista pyyhkäistä suoraan ylöspäin."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Pyyhkäise ylöspäin näytön alareunasta ja päästä irti."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Valmista"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Seuraava"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Valmis"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Asetukset"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Yritä uudelleen"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Hienoa!"</string>
diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml
index 1aa67e0..7910dc1 100644
--- a/quickstep/res/values-fr-rCA/strings.xml
+++ b/quickstep/res/values-fr-rCA/strings.xml
@@ -47,33 +47,39 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Application prédite : <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Assurez-vous de balayer l\'écran à partir de l\'extrémité gauche."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Assurez-vous de balayer l\'écran de l\'extrémité gauche jusqu\'au centre, puis de lever le doigt."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Bien! Maintenant, balayez à partir de la droite pour revenir."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Vous pouvez aussi revenir à l\'écran précédent en balayant du côté droit jusqu\'au centre de l\'écran."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Assurez-vous de balayer l\'écran à partir de l\'extrémité droite."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Assurez-vous de balayer l\'écran de l\'extrémité droite jusqu\'au centre, puis de lever le doigt."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Vous avez appris le geste de retour. Ensuite, vous apprendrez comment basculer entre les applications."</string>
- <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Vous avez appris le geste de retour."</string>
+ <!-- no translation found for back_gesture_feedback_complete_with_back_right_follow_up (2100639504811809267) -->
+ <skip />
+ <!-- no translation found for back_gesture_feedback_complete_with_overview_follow_up (9176400654037014471) -->
+ <skip />
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Vous avez appris le geste de retour en arrière."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Assurez-vous de ne pas balayer trop près du bas de l\'écran."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Modifiez la sensibilité du geste de retour dans Paramètres"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Balayez l\'écran vers la gauche pour revenir en arrière"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Pour revenir à l\'écran précédent, balayez du côté gauche jusqu\'au centre de l\'écran."</string>
+ <!-- no translation found for back_left_gesture_intro_title (5197184481779330065) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_title (7431951986971898074) -->
+ <skip />
+ <!-- no translation found for back_left_gesture_intro_subtitle (7672761376577628602) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_subtitle (2735828029197816509) -->
+ <skip />
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Assurez-vous de balayer l\'écran à partir de l\'extrémité inférieure vers le haut."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Assurez-vous de ne pas interrompre le geste avant de lever le doigt."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Assurez-vous de balayer l\'écran en ligne droite vers le haut."</string>
- <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"Vous avez appris le geste pour revenir à l\'écran d\'accueil. Apprenez ensuite à revenir en arrière."</string>
- <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"Vous avez appris le geste pour revenir à l\'écran d\'accueil."</string>
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"Vous avez appris le geste de retour à l\'écran d\'accueil. Maintenant, apprenez à revenir en arrière."</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"Vous avez appris le geste de retour à l\'écran d\'accueil."</string>
<string name="home_gesture_intro_title" msgid="836590312858441830">"Balayer pour revenir à l\'écran d\'accueil"</string>
<string name="home_gesture_intro_subtitle" msgid="2632238748497975326">"Balayez l\'écran du bas vers le haut. Ce geste vous ramène toujours à l\'écran d\'accueil."</string>
<string name="overview_gesture_feedback_swipe_too_far_from_edge" msgid="3032757898111577225">"Assurez-vous de balayer l\'écran à partir de l\'extrémité inférieure vers le haut."</string>
<string name="overview_gesture_feedback_home_detected" msgid="1411130969354020489">"Essayez de tenir la fenêtre plus longtemps avant de relâcher."</string>
<string name="overview_gesture_feedback_wrong_swipe_direction" msgid="6725820500906747925">"Assurez-vous de balayer l\'écran vers le haut, puis de faire une pause."</string>
<string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"Vous avez appris à utiliser les gestes. Pour les désactiver, accédez au menu Paramètres."</string>
- <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"Vous avez appris le geste pour basculer entre les applications."</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"Vous avez appris le geste de changement d\'application."</string>
<string name="overview_gesture_intro_title" msgid="2902054412868489378">"Balayer pour basculer entre les applications"</string>
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Balayez l\'écran de bas en haut, maintenez le doigt en place, puis relâchez-le."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Terminé"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Suivant"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Terminé"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Paramètres"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Réessayer"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bien!"</string>
diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml
index e010152..2b3b6bb 100644
--- a/quickstep/res/values-fr/strings.xml
+++ b/quickstep/res/values-fr/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Application prédite : <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Veillez à balayer l\'écran depuis le bord gauche."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Veillez à bien balayer l\'écran depuis le bord gauche jusqu\'au centre avant de relever le doigt."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Bravo ! Pour revenir en arrière, balayez l\'écran depuis la droite."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Pour revenir à l\'écran précédent, balayez l\'écran depuis le bord droit jusqu\'au centre."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Veillez à balayer l\'écran depuis le bord droit."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Veillez à bien balayer l\'écran depuis le bord droit jusqu\'au centre avant de relever le doigt."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Vous avez appris le geste pour revenir en arrière. Apprenez ensuite à passer d\'une appli à l\'autre."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Vous avez appris comment balayer l\'écran depuis la gauche pour revenir en arrière."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Vous avez appris à balayer depuis droite pour revenir en arrière. Apprenez à passer d\'une appli à l\'autre."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Vous avez appris le geste pour revenir en arrière."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Veillez à ne pas balayer l\'écran trop près du bas."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Modifiez la sensibilité du geste retour dans les paramètres"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Balayez l\'écran depuis le bord gauche pour revenir en arrière"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Pour revenir à l\'écran précédent, balayez l\'écran depuis le bord gauche jusqu\'au centre."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Balayez l\'écran depuis la gauche pour revenir en arrière"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Balayez l\'écran depuis la droite pour revenir en arrière"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Pour revenir à l\'écran précédent, balayez l\'écran depuis le bord gauche jusqu\'au centre."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Pour revenir à l\'écran précédent, balayez l\'écran depuis le bord droit jusqu\'au centre. Essayez."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Veillez à balayer l\'écran du bas vers le haut."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Veillez à ne pas marquer de pause dans votre geste avant de relever le doigt."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Veillez à balayer l\'écran vers le haut."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Balayez l\'écran du bas vers le haut, appuyez de manière prolongée, puis relevez le doigt."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Vous avez terminé"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Suivant"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"OK"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Paramètres"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Réessayez"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bravo !"</string>
diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml
index eddca5d..dca7bb6 100644
--- a/quickstep/res/values-gl/strings.xml
+++ b/quickstep/res/values-gl/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplicación predita: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Asegúrate de pasar o dedo desde o bordo esquerdo máis afastado."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Asegúrate de pasar o dedo desde o bordo esquerdo ata o medio da pantalla e avanza."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Excelente! Agora pasa o dedo desde a dereita para volver"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Podes volver á última pantalla pasando o dedo desde o bordo dereito ata a metade da pantalla."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Asegúrate de pasar o dedo desde o bordo dereito máis afastado."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Asegúrate de pasar o dedo desde o bordo dereito ata o medio da pantalla e avanza."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Completaches o xesto de volver á última pantalla. O próximo é aprender a cambiar de aplicación."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Aprendiches a pasar o dedo desde a esquerda para volver á pantalla anterior."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Aprendiches a pasar o dedo desde a dereita para volver. Agora, aprende a cambiar de aplicación."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Completaches o xesto de volver á última pantalla."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Asegúrate de non pasar o dedo demasiado preto da parte inferior da pantalla."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Podes cambiar a sensibilidade do xesto en Configuración"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Pasa o dedo desde a esquerda para volver"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Para volver á última pantalla, pasa o dedo desde o bordo esquerdo ata a metade da pantalla."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Pasa o dedo desde a esquerda para volver"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Pasar o dedo desde a dereita para volver á pantalla anterior"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Para volver á última pantalla, pasa o dedo desde o bordo esquerdo ata a metade da pantalla."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Tamén podes volver pasando o dedo desde o bordo dereito ata a metade da pantalla. Próbao agora."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Asegúrate de pasar o dedo cara arriba desde o bordo inferior da pantalla."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Asegúrate de non facer unha pausa antes de avanzar."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Asegúrate de pasar o dedo cara arriba cun movemento vertical."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Pasa o dedo cara arriba desde a parte inferior da pantalla, mantena premida e sepárao."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Todo listo"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Seguinte"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Feito"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Configuración"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Téntao de novo"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Excelente!"</string>
diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml
index a35abda..dcd0dfc 100644
--- a/quickstep/res/values-gu/strings.xml
+++ b/quickstep/res/values-gu/strings.xml
@@ -47,55 +47,47 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"પૂર્વાનુમાનિત ઍપ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_back_right_follow_up (2100639504811809267) -->
<skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_overview_follow_up (9176400654037014471) -->
<skip />
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"તમે પાછા જવાનો સંકેત પૂર્ણ કર્યો છે."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"ખાતરી કરો કે તમારાથી સ્ક્રીનની એકદમ નીચેની કિનારીની ખૂબ નજીક સુધી સ્વાઇપ ન થઈ જાય."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"પાછા જવાના સંકેતની સંવેદિતા બદલવા માટે, સેટિંગમાં જાઓ"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
+ <!-- no translation found for back_left_gesture_intro_title (5197184481779330065) -->
<skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
+ <!-- no translation found for back_right_gesture_intro_title (7431951986971898074) -->
+ <skip />
+ <!-- no translation found for back_left_gesture_intro_subtitle (7672761376577628602) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_subtitle (2735828029197816509) -->
<skip />
<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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"તમે હોમ સ્ક્રીન પર પાછા જવાનો સંકેત પૂર્ણ કર્યો છે. હવે પછી, પાછા જવાની રીત વિશે જાણો."</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"તમે હોમ સ્ક્રીન પર પાછા જવાનો સંકેત પૂર્ણ કર્યો છે."</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"સંકેતોનો ઉપયોગ કરવાની રીત વિશે તમે જાણ્યું. સંકેતો બંધ કરવા, સેટિંગમાં જાઓ."</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"તમે ઍપ સ્વિચ કરવાનો સંકેત પૂર્ણ કર્યો છે."</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>
- <!-- no translation found for allset_title (5021126669778966707) -->
- <skip />
- <!-- no translation found for allset_hint (459504134589971527) -->
- <skip />
- <!-- no translation found for allset_description (6350320429953234580) -->
- <skip />
- <!-- no translation found for allset_navigation_settings (417773244979225071) -->
- <skip />
+ <string name="allset_title" msgid="5021126669778966707">"બધું સેટ થઈ ગયું!"</string>
+ <string name="allset_hint" msgid="459504134589971527">"હોમ પર જવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string>
+ <string name="allset_description" msgid="6350320429953234580">"તમે તમારા ફોનનો ઉપયોગ કરવા માટે તૈયાર છો"</string>
+ <string name="allset_navigation_settings" msgid="417773244979225071"><annotation id="link">"ઍક્સેસિબિલિટી માટે નૅવિગેશન સેટિંગ"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"શેર કરો"</string>
<string name="action_screenshot" msgid="8171125848358142917">"સ્ક્રીનશૉટ"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ઍપ કે તમારી સંસ્થા દ્વારા આ ક્રિયા કરવાની મંજૂરી નથી"</string>
diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml
index fdf62a7..cb3022a 100644
--- a/quickstep/res/values-hi/strings.xml
+++ b/quickstep/res/values-hi/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"सुझाया गया ऐप्लिकेशन: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"बढ़िया! अब वापस जाने के लिए, स्क्रीन के दाएं किनारे से स्वाइप करें"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"आप दाएं किनारे से स्क्रीन के बीच तक स्वाइप करके भी पिछली स्क्रीन पर जा सकते हैं."</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_with_follow_up" msgid="8653374779579748392">"आपने पीछे ले जाने वाले हाथ के जेस्चर के बारे में जान लिया है. एक ऐप से दूसरे पर जाने का तरीका जानें."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"आपने स्क्रीन के बाएं किनारे से स्वाइप करके, पिछली स्क्रीन पर वापस जाने का तरीका सीख लिया है."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"आपने स्क्रीन के दाएं किनारे से स्वाइप करके, पिछली स्क्रीन पर वापस जाने का तरीका सीख लिया है. अब, एक ऐप्लिकेशन से दूसरे ऐप्लिकेशन पर जाने का तरीका जानें."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"आपने पेज पर पीछे ले जाने वाले हाथ के जेस्चर (हाव-भाव) के बारे में जान लिया है."</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="5538727561353262952">"वापस जाने के लिए, स्क्रीन के बाएं किनारे से स्वाइप करें"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"पिछली स्क्रीन पर वापस जाने के लिए, बाएं किनारे से स्क्रीन के बीच तक स्वाइप करें."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"वापस जाने के लिए, स्क्रीन के बाएं किनारे से स्वाइप करें"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"वापस जाने के लिए, स्क्रीन के दाएं किनारे से स्वाइप करें"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"पिछली स्क्रीन पर वापस जाने के लिए, स्क्रीन के बाएं किनारे से बीचों-बीच तक स्वाइप करें."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"आप स्क्रीन के दाएं किनारे से बीचों-बीच तक स्वाइप करके भी पिछली स्क्रीन पर जा सकते हैं. इसे अभी आज़माएं."</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>
@@ -67,13 +68,12 @@
<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_with_follow_up" msgid="3544611727467765026">"आपने हाथ के जेस्चर (हाव-भाव) को इस्तेमाल करना सीख लिया है. जेस्चर बंद करने के लिए, सेटिंग में जाएं."</string>
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"आपने हाथ के जेस्चर (हाव-भाव) इस्तेमाल करने सीख लिए हैं. जेस्चर बंद करने के लिए, सेटिंग में जाएं."</string>
<string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"आपने एक ऐप्लिकेशन से दूसरे पर जाने के लिए इस्तेमाल होने वाले हाथ के जेस्चर के बारे में जान लिया है."</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>
@@ -83,7 +83,7 @@
<string name="allset_description" msgid="6350320429953234580">"अब आप अपना फ़ोन इस्तेमाल कर सकते हैं"</string>
<string name="allset_navigation_settings" msgid="417773244979225071"><annotation id="link">"सुलभता के लिए नेविगेशन सेटिंग"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"शेयर करें"</string>
- <string name="action_screenshot" msgid="8171125848358142917">"स्क्रीनशॉट"</string>
+ <string name="action_screenshot" msgid="8171125848358142917">"स्क्रीनशॉट लें"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ऐप्लिकेशन या आपका संगठन इस कार्रवाई की अनुमति नहीं देता"</string>
<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>
diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml
index 7c50ae2..0e3444a 100644
--- a/quickstep/res/values-hr/strings.xml
+++ b/quickstep/res/values-hr/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predviđena aplikacija: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Pazite da prijeđete prstom od krajnjeg lijevog ruba."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Pazite da prijeđete prstom od lijevog ruba do sredine zaslona i podignite prst."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Odlično! Prijeđite prstom zdesna ulijevo da biste se vratili"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Na posljednji se zaslon možete vratiti i prelaskom od desnog ruba do sredine zaslona."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Pazite da prijeđete prstom od krajnjeg desnog ruba."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Pazite da prijeđete prstom od desnog ruba do sredine zaslona i podignite prst."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Izvršili ste pokret za povratak. Sad saznajte kako promijeniti aplikaciju."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Naučili ste kako prijeći prstom slijeva udesno da biste se vratili."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Naučili ste kako prijeći prstom zdesna ulijevo da biste se vratili. Sad saznajte kako promijeniti aplikaciju."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Izvršili ste pokret za povratak."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Pazite da ne prijeđete prstom preblizu dnu zaslona."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Osjetljivost pokreta povratka promijenite u postavkama"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Prijeđite prstom slijeva udesno da biste se vratili"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Da biste se vratili na posljednji posjećeni zaslon, prijeđite od lijevog ruba do sredine zaslona."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Prijeđite prstom slijeva udesno da biste se vratili"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Prijeđite prstom zdesna ulijevo da biste se vratili"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Da biste se vratili na posljednji posjećeni zaslon, prijeđite od lijevog ruba do sredine zaslona."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Na posljednji se zaslon možete vratiti i prelaskom od desnog ruba do sredine zaslona. Isprobajte odmah."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Pazite da prijeđete prstom prema gore od donjeg ruba zaslona."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Pazite da ne zastanete prije podizanja prsta."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Pazite da prijeđete prstom ravno prema gore."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Prijeđite prstom od dna zaslona prema gore, zadržite pritisak pa podignite prst."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Sve je spremno"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Dalje"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Gotovo"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Postavke"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Pokušajte ponovo"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Odlično!"</string>
diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml
index 6436738..5289af1 100644
--- a/quickstep/res/values-hu/strings.xml
+++ b/quickstep/res/values-hu/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Várható alkalmazás: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Csúsztasson a képernyő bal széléről."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Csúsztasson a képernyő bal széléről a képernyő közepéig, és engedje el a képernyőt."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Remek! Most csúsztasson jobbról a visszalépéshez."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"A képernyő jobb széléről a képernyő közepéig csúsztatva is visszatérhet a legutóbbi képernyőre."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Csúsztasson a képernyő jobb széléről."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Csúsztasson a képernyő jobb széléről a képernyő közepéig, és engedje el a képernyőt."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Teljesítette a visszalépési kézmozdulatot. Most megtanulhatja, hogyan válthat az appok között."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Megtanulta, hogyan léphet vissza balról csúsztatva."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Megtanulta, hogyan léphet vissza jobbról csúsztatva. A következő az appok közötti váltás."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Teljesítette a visszalépési kézmozdulatot."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Ne csúsztasson túl közel a képernyő aljához."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"A vissza mozdulat érzékenysége a Beállításokban módosítható"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"A visszalépéshez csúsztasson balról jobbra"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Ha visszatérne a legutóbbi képernyőre, csúsztasson a képernyő közepére a bal szélétől."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"A visszalépéshez csúsztasson balról jobbra"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"A visszalépéshez csúsztasson jobbról balra"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Ha visszatérne a legutóbbi képernyőre, csúsztasson a képernyő közepére a bal szélétől."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"A képernyő jobb széléről a közepéig csúsztatva is visszatérhet a legutóbbi képernyőre. Próbálja ki."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Csúsztasson felfelé a képernyő aljától."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Ne álljon meg, mielőtt elengedi a képernyőt."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Csúsztasson egyenesen felfelé."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Csúsztasson felfelé a képernyő aljáról, tartsa lenyomva az ujját, majd emelje fel."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Minden kész"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Tovább"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Kész"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Beállítások"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Újra"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Remek!"</string>
diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml
index 3ca7112..e4d9991 100644
--- a/quickstep/res/values-hy/strings.xml
+++ b/quickstep/res/values-hy/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Առաջարկվող հավելված՝ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Գերազանց է․ այժմ մատը սահեցրեք աջ եզրից՝ հետ գնալու համար"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Անցեք վերջին էկրան՝ էկրանի աջ եզրից մատը սահեցնելով դեպի կենտրոն։"</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_with_follow_up" msgid="8653374779579748392">"Դուք սովորեցիք հետ գնալու ժեստը։ Այժմ սովորենք՝ ինչպես անցնել մի հավելվածից մյուսը։"</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Դուք սովորեցիք՝ ինչպես մատը ձախից սահեցնելով հետ գնալ"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Դուք սովորեցիք՝ ինչպես մատը աջից սահեցնելով հետ գնալ։ Այժմ սովորենք՝ ինչպես անցնել մի հավելվածից մյուսը։"</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Դուք սովորեցիք հետ գնալու ժեստը։"</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="5538727561353262952">"Սահեցրեք մատը ձախից՝ հետ գնալու համար"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Վերջին էկրան վերադառնալու համար էկրանի եզրից մատը սահեցրեք դեպի կենտրոն։"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Սահեցրեք մատը ձախից՝ հետ գնալու համար"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Սահեցրեք մատը աջից՝ հետ գնալու համար"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Վերջին էկրան վերադառնալու համար էկրանի եզրից մատը սահեցրեք դեպի կենտրոն։"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Անցեք վերջին էկրան՝ էկրանի աջ եզրից մատը սահեցնելով դեպի կենտրոն։ Փորձեք հիմա։"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml
index 9efc53e..d6802d4 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplikasi yang diprediksi: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Pastikan Anda menggeser dari tepi ujung kiri."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Pastikan Anda menggeser dari tepi kiri ke tengah layar, lalu lepaskan."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Bagus! Sekarang geser dari kanan untuk kembali"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Geser dari tepi kanan ke tengah layar menuju layar terakhir."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Pastikan Anda menggeser dari tepi ujung kanan."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Pastikan Anda menggeser dari tepi kanan ke tengah layar, lalu lepaskan."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Anda telah menyelesaikan gestur kembali. Selanjutnya, pelajari cara beralih aplikasi."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Anda telah belajar cara geser dari kiri untuk kembali."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Anda telah belajar cara geser dari kanan untuk kembali. Berikutnya, pelajari cara beralih aplikasi."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Anda telah menyelesaikan gestur kembali."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Pastikan Anda tidak menggeser terlalu dekat ke bagian bawah layar."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Untuk mengubah sensitivitas gestur kembali, buka Setelan"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Geser dari kiri untuk kembali"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Untuk kembali ke layar terakhir, geser dari tepi kiri ke tengah layar."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Geser dari kiri untuk kembali"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Geser dari kanan untuk kembali"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Untuk kembali ke layar terakhir yang Anda buka, geser dari tepi kiri ke tengah layar."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Geser dari tepi kanan ke tengah layar untuk kembali ke layar terakhir. Coba sekarang."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Pastikan Anda menggeser ke atas dari tepi bawah layar."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Pastikan Anda tidak menjeda sebelum melepaskan."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Pastikan Anda menggeser lurus ke atas."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Geser ke atas dari bagian bawah layar, tahan, lalu lepaskan."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Semua siap"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Berikutnya"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Selesai"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Setelan"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Coba lagi"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bagus!"</string>
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index 2687b9c..5928bdf 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Tillaga að forriti: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Passaðu að strjúka frá jaðri vinstri brúnar."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Passaðu að strjúka frá vinstri brún skjásins að miðju hans og sleppa svo."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Flott! Strjúktu núna til hægri til að fara til baka"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Þú getur einnig farið til baka á síðasta skjá með því að strjúka frá hægri brún að miðju skjásins."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Passaðu að strjúka frá jaðri hægri brúnar."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Passaðu að strjúka frá hægri brún skjásins að miðju hans og sleppa svo."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Þú laukst við að kynna þér bendinguna „til baka“. Næst skaltu læra hvernig þú skiptir á milli forrita."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Þú lærðir að strjúka frá vinstri til að bakka."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Þú lærðir að strjúka frá hægri til að bakka. Næst skaltu læra hvernig þú skiptir á milli forrita."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Þú laukst við að kynna þér bendinguna „til baka“."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Passaðu að strjúka ekki of nálægt neðri brún skjásins."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Til að breyta næmi til baka-bendingar ferðu í stillingar"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Strjúktu frá vinstri til að fara til baka"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Strjúktu frá vinstri brún að miðju skjásins til að fara aftur til baka í síðasta skjá sem var opinn."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Strjúktu frá vinstri til að fara til baka"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Strjúktu frá hægri til að fara til baka"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Strjúktu frá vinstri brún að miðju skjásins til að fara aftur á síðasta skjá sem var opinn."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Þú getur líka farið á síðasta skjá með því að strjúka frá hægri brún að miðju skjásins. Prófa núna."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Passaðu að strjúka upp frá neðri brún skjásins."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Passaðu að stoppa ekki áður en þú sleppir."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Passaðu að strjúka beint upp."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Strjúktu upp frá neðri hluta skjásins, haltu fingrinum á skjánum og slepptu svo."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Allt til reiðu"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Áfram"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Lokið"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Stillingar"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Reyna aftur"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Flott!"</string>
diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml
index a37a102..ea7454a 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"App prevista: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Assicurati di scorrere dall\'estremità del bordo sinistro."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Assicurati di scorrere dal bordo sinistro verso il centro dello schermo e solleva il dito."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Bene! Ora scorri da destra per tornare indietro."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Puoi anche tornare all\'ultima schermata scorrendo dal bordo destro verso il centro dello schermo."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Assicurati di scorrere dall\'estremità del bordo destro."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Assicurati di scorrere dal bordo destro verso il centro dello schermo e solleva il dito."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Hai completato il gesto Indietro. Ora, impara come passare da un\'app all\'altra."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Hai imparato a scorrere da sinistra per tornare indietro."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Hai imparato a scorrere da destra per tornare indietro. Ora impara come passare da un\'app all\'altra."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Hai completato il gesto Indietro."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Assicurati di non scorrere troppo vicino alla parte inferiore dello schermo."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Usa Impostazioni per cambiare sensibilità del gesto Indietro"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Scorri da sinistra per tornare indietro"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Per tornare all\'ultima schermata mostrata, scorri dal bordo sinistro verso il centro dello schermo."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Scorri da sinistra per tornare indietro"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Scorri da destra per tornare indietro"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Per tornare all\'ultima schermata mostrata, scorri dal bordo sinistro verso il centro dello schermo."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Puoi anche tornare all\'ultima schermata scorrendo da bordo destro verso centro dello schermo. Prova."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Assicurati di scorrere verso l\'alto dal bordo inferiore dello schermo."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Assicurati di non fare pause prima di sollevare il dito."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Assicurati di scorrere verso l\'alto senza fermarti."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Scorri verso l\'alto dalla parte inferiore dello schermo, tieni premuto e rilascia."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Fatto"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Avanti"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Fine"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Impostazioni"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Riprova"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bene!"</string>
diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml
index 8d61fd4..5b89d2c 100644
--- a/quickstep/res/values-iw/strings.xml
+++ b/quickstep/res/values-iw/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"האפליקציות החזויות: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"איזה יופי! עכשיו עליך להחליק מהקצה הימני כדי לחזור"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"אפשר לחזור למסך הקודם בהחלקה מהקצה הימני של המסך אל המרכז."</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_with_follow_up" msgid="8653374779579748392">"השלמת את תנועת \'הקודם\'. בשלב הבא לומדים איך לעבור בין אפליקציות."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"למדת איך להחליק מצד שמאל כדי לחזור אחורה."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"למדת איך להחליק מצד ימין כדי לחזור אחורה. בשלב הבא לומדים איך לעבור בין אפליקציות."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"השלמת את תנועת \'הקודם\'."</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="5538727561353262952">"יש להחליק מצד שמאל כדי לחזור למסך הקודם"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"כדי לחזור למסך הקודם, יש להחליק מהקצה השמאלי של המסך אל המרכז."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"יש להחליק מצד שמאל כדי לחזור למסך הקודם"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"יש להחליק מצד ימין כדי לחזור אחורה"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"כדי לחזור למסך הקודם, יש להחליק מהקצה השמאלי של המסך אל המרכז."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"בנוסף, אפשר לחזור למסך הקודם בהחלקה מהקצה הימני של המסך אל המרכז. רוצה לנסות עכשיו?"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml
index 57fca5b..0c2a03b 100644
--- a/quickstep/res/values-ja/strings.xml
+++ b/quickstep/res/values-ja/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"予測されたアプリ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"では、右端からスワイプして前の画面に戻りましょう"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"画面の右端から中央に向かってスワイプして直前の画面に戻ることもできます。"</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_with_follow_up" msgid="8653374779579748392">"「戻る」操作を完了しました。次は、アプリを切り替える方法を覚えましょう。"</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"左側からスワイプして前の画面に戻る方法を学習しました。"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"右側からスワイプして前の画面に戻る方法を学習しました。次は、アプリを切り替える方法を覚えましょう。"</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"「戻る」操作を完了しました。"</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="5538727561353262952">"左端からスワイプすると前の画面に戻ります"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"直前の画面に戻るには、画面の左端から中央に向かってスワイプします。"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"左端からスワイプすると前の画面に戻ります"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"右側からスワイプすると前の画面に戻ります"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"直前の画面に戻るには、画面の左端から中央に向かってスワイプします。"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"画面の右端から中央に向かってスワイプして直前の画面に戻ることもできます。では、やってみましょう。"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml
index ea2e4d1..15c86b4 100644
--- a/quickstep/res/values-ka/strings.xml
+++ b/quickstep/res/values-ka/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ნაწინასწარმეტყველები აპი: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"მშვენიერია! ახლა უკან დასაბრუნებლად გადაფურცლეთ მარჯვნიდან"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"ასევე, შეგიძლიათ, დაბრუნდეთ ბოლო ეკრანზე მარჯვენა კიდიდან ეკრანის შუისკენ გადაფურცვლით."</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_with_follow_up" msgid="8653374779579748392">"თქვენ შეასრულეთ უკან დაბრუნების ჟესტი. ახლა კი შევიტყოთ, როგორ გადავრთოთ აპები."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"თქვენ ისწავლეთ მარცხნიდან გადაფურცვლა უკან დასაბრუნებლად."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"თქვენ ისწავლეთ მარჯვნიდან გადაფურცვლა უკან დასაბრუნებლად. ახლა კი შეიტყვეთ, როგორ გადართოთ აპები."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"თქვენ შეასრულეთ უკან დაბრუნების ჟესტი."</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="5538727561353262952">"უკან დასაბრუნებლად გადაფურცლეთ მარცხნიდან"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"ბოლო ნანახ ეკრანზე დასაბრუნებლად გადაფურცლეთ მარცხენა კიდიდან ეკრანის ცენტრისკენ."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"უკან დასაბრუნებლად გადაფურცლეთ მარცხნიდან"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"უკან დასაბრუნებლად გადაფურცლეთ მარჯვნიდან"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"ბოლო ნანახ ეკრანზე დასაბრუნებლად გადაფურცლეთ მარცხენა კიდიდან ეკრანის ცენტრისკენ."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"ასევე შეგიძლიათ, დაბრუნდეთ ბოლო ეკრანზე მარჯვენა კიდიდან ეკრანის შუისკენ გადაფურცვლით. ცადეთ ახლავე."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml
index 6515840..292f4cb 100644
--- a/quickstep/res/values-kk/strings.xml
+++ b/quickstep/res/values-kk/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Болжалды қолданба: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Жақсы! Енді артқа қайту үшін оң жақтан сырғытыңыз"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Экранның оң жақ шетінен ортасына қарай сырғыту арқылы соңғы ашылған экранға орала аласыз."</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_with_follow_up" msgid="8653374779579748392">"Артқа қайту қимылын аяқтадыңыз. Енді қолданбаларды ауыстыруды үйреніңіз."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Солдан оңға сырғыту арқылы артқа қайтуды үйрендіңіз."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Оңнан солға сырғыту арқылы артқа қайтуды үйрендіңіз. Енді қолданбаларды ауыстыруды үйреніңіз."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Артқа қайту қимылын аяқтадыңыз."</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="5538727561353262952">"Артқа қайту үшін сол жақтан сырғытыңыз"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Соңғы ашылған экранға оралу үшін экранның сол жақ шетінен ортасына қарай сырғытыңыз."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Артқа қайту үшін солдан оңға сырғытыңыз."</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Артқа қайту үшін оңнан солға сырғытыңыз"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Соңғы ашылған экранға оралу үшін экранның сол жағынан ортасына сырғытыңыз."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Экранның оң жағынан ортасына сырғыту арқылы соңғы ашылған экранға орала аласыз. Қазір істеп көріңіз."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml
index 5185c4c..2e8a5c4 100644
--- a/quickstep/res/values-km/strings.xml
+++ b/quickstep/res/values-km/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"កម្មវិធីដែលបានព្យាករ៖ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"ល្អ! ឥឡូវនេះ សូមអូសពីខាងស្ដាំដើម្បីថយក្រោយ"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"អ្នកក៏អាចត្រឡប់ទៅអេក្រង់ចុងក្រោយបានផងដែរ ដោយអូសពីគែមខាងស្ដាំទៅផ្នែកកណ្ដាលនៃអេក្រង់។"</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_with_follow_up" msgid="8653374779579748392">"អ្នកបានបញ្ចប់ចលនាថយក្រោយហើយ។ បន្ទាប់មកទៀត សូមស្វែងយល់ពីរបៀបប្ដូរកម្មវិធី។"</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"អ្នកបានស្វែងយល់ពីរបៀបអូសពីខាងឆ្វេង ដើម្បីថយក្រោយ។"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"អ្នកបានស្វែងយល់ពីរបៀបអូសពីខាងស្ដាំ ដើម្បីថយក្រោយ។ បន្ទាប់ទៀត សូមស្វែងយល់ពីរបៀបប្ដូរកម្មវិធី។"</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"អ្នកបានបញ្ចប់ចលនាថយក្រោយហើយ។"</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="5538727561353262952">"អូសពីឆ្វេងដើម្បីថយក្រោយ"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"ដើម្បីត្រឡប់ទៅអេក្រង់ចុងក្រោយដែលអ្នកបានចូល សូមអូសពីគែមខាងឆ្វេងទៅផ្នែកកណ្ដាលនៃអេក្រង់។"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"អូសពីខាងឆ្វេងដើម្បីថយក្រោយ"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"អូសពីខាងស្ដាំដើម្បីថយក្រោយ"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"ដើម្បីត្រឡប់ទៅអេក្រង់ចុងក្រោយដែលអ្នកបានចូល សូមអូសពីគែមខាងឆ្វេងទៅផ្នែកកណ្ដាលនៃអេក្រង់។"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"អ្នកក៏អាចត្រឡប់ទៅអេក្រង់ចុងក្រោយបានផងដែរ ដោយអូសពីគែមខាងស្ដាំទៅផ្នែកកណ្ដាលនៃអេក្រង់។ សាកល្បងឥឡូវនេះ។"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index dd3cb38..53de55a 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -47,43 +47,33 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ಶಿಫಾರಸು ಮಾಡಿದ ಆ್ಯಪ್: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
- <skip />
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"ಹಿಂದಕ್ಕೆ ಹೋಗಲು ಎಡದಿಂದ ಸ್ವೈಪ್ ಮಾಡುವುದು ಹೇಗೆಂದು ನೀವು ಕಲಿತಿರಿ."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"ಹಿಂದಕ್ಕೆ ಹೋಗಲು ಬಲದಿಂದ ಸ್ವೈಪ್ ಮಾಡುವುದು ಹೇಗೆಂದು ನೀವು ಕಲಿತಿರಿ. ಮುಂದೆ, ಆ್ಯಪ್ಗಳನ್ನು ಬದಲಿಸುವುದು ಹೇಗೆಂದು ತಿಳಿಯಿರಿ."</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"ನೀವು ಗೋ ಬ್ಯಾಕ್ ಗೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"ನೀವು ಸ್ಕ್ರೀನ್ನ ಕೆಳಭಾಗಕ್ಕೆ ಹೆಚ್ಚು ಹತ್ತಿರ ಸ್ವೈಪ್ ಮಾಡದಂತೆ ನೋಡಿಕೊಳ್ಳಿ."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"ಬ್ಯಾಕ್ ಗೆಸ್ಚರ್ನ ಸೂಕ್ಷ್ಮತೆ ಬದಲಾಯಿಸಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
- <skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
- <skip />
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"ಹಿಂದಕ್ಕೆ ಹೋಗಲು ಎಡದಿಂದ ಸ್ವೈಪ್ ಮಾಡಿ"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"ಹಿಂದಕ್ಕೆ ಹೋಗಲು ಬಲದಿಂದ ಸ್ವೈಪ್ ಮಾಡಿ"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"ಈ ಮೊದಲು ನೀವಿದ್ದ ಕೊನೆಯ ಸ್ಕ್ರೀನ್ಗೆ ಹಿಂತಿರುಗಲು, ಎಡ ಅಂಚಿನಿಂದ ಸ್ಕ್ರೀನ್ ಮಧ್ಯಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"ಬಲ ಅಂಚಿನಿಂದ ಸ್ಕ್ರೀನ್ ಮಧ್ಯಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿಯೂ ನೀವು ಕೊನೆಯ ಸ್ಕ್ರೀನ್ಗೆ ಹೋಗಬಹುದು. ಇದನ್ನು ಈಗಲೇ ಪ್ರಯತ್ನಿಸಿ."</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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"ನೀವು ಗೋ ಹೋಮ್ ಗೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ. ಮುಂದೆ, ಹಿಂದಕ್ಕೆ ಹೋಗುವುದು ಹೇಗೆ ಎಂದು ತಿಳಿಯಿರಿ."</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"ನೀವು ಗೋ ಹೋಮ್ ಗೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ."</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"ಗೆಸ್ಚರ್ಗಳನ್ನು ಬಳಕೆಯನ್ನು ನೀವು ತಿಳಿದುಕೊಂಡಿರುವಿರಿ. ಗೆಸ್ಚರ್ಗಳನ್ನು ಆಫ್ ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ."</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"ನೀವು ಆ್ಯಪ್ಗಳನ್ನು ಬದಲಾಯಿಸುವ ಗೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ."</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>
diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml
index fb35a53..b31dba9 100644
--- a/quickstep/res/values-ko/strings.xml
+++ b/quickstep/res/values-ko/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"예상 앱: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"잘하셨습니다. 이제 오른쪽에서 스와이프하여 뒤로 돌아가세요"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"오른쪽 가장자리에서 화면 중앙으로 스와이프하여 마지막 화면으로 돌아갈 수도 있습니다"</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_with_follow_up" msgid="8653374779579748392">"돌아가기 동작을 완료했습니다. 이번에는 앱 전환 방법을 알아보겠습니다."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"왼쪽에서 스와이프하여 뒤로 돌아가는 방법을 배웠습니다."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"오른쪽에서 스와이프하여 뒤로 돌아가는 방법을 배웠습니다. 이번에는 앱 전환 방법을 알아보겠습니다."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"돌아가기 동작을 완료했습니다."</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="5538727561353262952">"왼쪽에서 스와이프하여 뒤로 돌아가세요"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"마지막 화면으로 돌아가려면 왼쪽 가장자리에서 화면 중앙으로 스와이프하세요"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"왼쪽에서 스와이프하여 뒤로 돌아가세요"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"돌아가려면 오른쪽에서 스와이프하세요"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"마지막 화면으로 돌아가려면 왼쪽 가장자리에서 화면 중앙으로 스와이프하세요"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"오른쪽 가장자리에서 화면 중앙으로 스와이프해도 마지막 화면으로 돌아갈 수도 있습니다. 지금 동작을 취해 보세요"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml
index 6f63146..eb19e13 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Божомолдонгон колдонмо: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Сонун! Артка кайтуу үчүн экрандын оң четинен сүрүп коюңуз"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Акыркы экранга кайтуу үчүн экранды оң жагынан ортосуна карай сүрүңүз."</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_with_follow_up" msgid="8653374779579748392">"\"Артка\" жаңсоосу боюнча үйрөткүчтү бүтүрдүңүз. Эми колдонмолорду которуштурганды үйрөнүп алыңыз."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Артка кайтуу үчүн экранды солдон оңго карай сүрүүнү үйрөндүңүз."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Артка кайтуу үчүн экранды оңдон солго карай сүрүүнү үйрөндүңүз. Эми колдонмолорду которуштурганды үйрөнүп алыңыз."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"\"Артка\" жаңсоосу боюнча үйрөткүчтү бүтүрдүңүз."</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="5538727561353262952">"Артка кайтуу үчүн экраныңыздын сол четинен сүрүп коюңуз"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Акыркы экранга кайтуу үчүн экранды сол жагынан ортосуна карай сүрүңүз."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Артка кайтуу үчүн экранды солдон оңго карай сүрүңүз"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Артка кайтуу үчүн экранды оңдон солго карай сүрүңүз"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Акыркы экранга кайтуу үчүн экранды сол жагынан ортосуна карай сүрүңүз."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Акыркы экранга кайтуу үчүн экранды оң жагынан ортосуна карай сүрүңүз. Азыр байкап көрүңүз."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml
index 7b2ed2e..b6944eb 100644
--- a/quickstep/res/values-lo/strings.xml
+++ b/quickstep/res/values-lo/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ແອັບທີ່ຄາດເດົາໄວ້: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"ດີ! ຕອນນີ້ໃຫ້ປັດຈາກຂວາເພື່ອກັບຄືນ"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"ທ່ານສາມາດກັບໄປຫາໜ້າຈໍຫຼ້າສຸດໄດ້ໂດຍການປັດຈາກຂອບຂວາໄປຫາກາງຈໍ."</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_with_follow_up" msgid="8653374779579748392">"ທ່ານໃຊ້ທ່າທາງກັບຄືນສຳເລັດແລ້ວ. ຕໍ່ໄປ, ມາສຶກສາວິທີສະຫຼັບແອັບ."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"ທ່ານຮຽນຮູ້ວິທີປັດຈາກຊ້າຍເພື່ອກັບຄືນແລ້ວ."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"ທ່ານຮຽນຮູ້ວິທີປັດຈາກຂວາເພື່ອກັບຄືນແລ້ວ. ຕໍ່ໄປ, ມາສຶກສາວິທີສະຫຼັບແອັບ."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"ທ່ານໃຊ້ທ່າທາງກັບຄືນສຳເລັດແລ້ວ."</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="5538727561353262952">"ປັດຈາກຊ້າຍເພື່ອກັບຄືນ"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"ເພື່ອກັບຄືນໄປໜ້າຈໍຫຼ້າສຸດທີ່ທ່ານໃຊ້, ໃຫ້ປັດຈາກຂອບຊ້າຍໄປຫາກາງຈໍ."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"ປັດຈາກຊ້າຍເພື່ອກັບຄືນ"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"ປັດຈາກຂວາເພື່ອກັບຄືນ"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"ເພື່ອກັບຄືນໄປໜ້າຈໍຫຼ້າສຸດທີ່ທ່ານໃຊ້, ໃຫ້ປັດຈາກຂອບຊ້າຍໄປຫາກາງຈໍ."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"ທ່ານສາມາດກັບໄປຫາໜ້າຈໍຫຼ້າສຸດໄດ້ໂດຍການປັດຈາກຂອບຂວາໄປຫາກາງຈໍ. ລອງໃຊ້ມັນດຽວນີ້."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml
index bebefbb..d1c08f9 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Numatoma programa: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Turite perbraukti nuo kairiojo krašto."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Turite perbraukti nuo kairiojo krašto link ekrano vidurio ir pakelti pirštą."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Šaunu! Dabar perbraukite iš dešinės, kad grįžtumėte"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Į ankstesnį ekraną taip pat galite grįžti, perbraukdami nuo dešiniojo krašto link ekrano vidurio."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Turite perbraukti nuo dešiniojo krašto."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Turite perbraukti nuo dešiniojo krašto link ekrano vidurio ir pakelti pirštą."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Atlikote grįžimo atgal gestą. Toliau sužinosite, kaip perjungti programas."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Išmokote, kaip sugrįžti perbraukiant iš kairės."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Išmokote, kaip sugrįžti perbraukiant iš dešinės. Toliau sužinosite, kaip perjungti programas."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Atlikote grįžimo atgal gestą."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Nebraukite per arti ekrano apačios."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Norėd. pak. grįžimo gesto jautr., eikite į sk. „Nustatymai“"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Perbraukite iš kairės, kad grįžtumėte"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Norėdami grįžti į ankstesnį ekraną, kuriame lankėtės, perbraukite nuo kairiojo krašto link ekrano vidurio."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Perbraukite iš kairės, kad grįžtumėte"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Perbraukite iš dešinės, kad grįžtumėte"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Norėdami grįžti į ankstesnį ekraną, kuriame lankėtės, perbraukite nuo kairiojo krašto link ekrano vidurio."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Į ankst. ekr. taip pat galite grįžti, perbraukdami nuo dešiniojo kr. link ekr. vidurio. Išb. dabar."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Turite perbraukti aukštyn nuo apatinio ekrano krašto."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Nepristabdykite prieš pakeldami pirštą."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Turite tiesiai perbraukti aukštyn."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Perbraukite aukštyn nuo ekrano apačios, palaikykite ir paleiskite."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Viskas nustatyta"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Kitas"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Atlikta"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Nustatymai"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Bandykite dar kartą"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Šaunu!"</string>
diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml
index 97a8197..e825a4e 100644
--- a/quickstep/res/values-lv/strings.xml
+++ b/quickstep/res/values-lv/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Prognozētā lietotne: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Jāvelk no pašas kreisās malas."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Jāvelk no ekrāna kreisās malas uz vidu un jāatlaiž."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Lieliski! Tagad velciet no labās puses, lai pārietu atpakaļ"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Varat arī pāriet atpakaļ uz pēdējo ekrānu, velkot no labās malas uz ekrāna vidu."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Jāvelk no pašas labās malas."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Jāvelk no ekrāna labās malas uz vidu un jāatlaiž."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Jūs sekmīgi veicāt atgriešanās žestu. Tagad varat iemācīties, kā pārslēgt lietotnes."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Jūs esat apguvis, kā vilkt no kreisās malas, lai pārietu atpakaļ."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Jūs esat apguvis, kā vilkt no labās malas, lai pārietu atpakaļ. Tagad mācieties pārslēgt lietotnes."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Jūs sekmīgi veicāt atgriešanās žestu."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Nevelciet pārāk tuvu ekrāna apakšdaļai."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Atgriešanās žesta jutīguma līmeni varat mainīt iestatījumos."</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Lai pārietu atpakaļ, velciet no kreisās malas."</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Lai pārietu atpakaļ uz pēdējo izmantoto ekrānu, velciet no kreisās malas uz ekrāna vidu."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Lai pārietu atpakaļ, velciet no kreisās malas."</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Lai atgrieztos, velciet no labās malas"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Lai pārietu atpakaļ uz pēdējo izmantoto ekrānu, velciet no kreisās malas uz ekrāna vidu."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Varat arī pāriet atpakaļ uz pēdējo ekrānu, velkot no labās malas uz ekrāna vidu. Izmēģiniet tūlīt!"</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Jāvelk augšup no ekrāna apakšmalas."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Pirms atlaišanas nepārtrauciet kustību."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Jāvelk tieši uz augšu."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Velciet augšup no ekrāna apakšdaļas, turiet un pēc tam atlaidiet."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Gatavs"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Tālāk"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Gatavs"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Iestatījumi"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Mēģināt vēlreiz"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Lieliski!"</string>
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index e21f45c..1b92413 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Предвидена апликација: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Одлично! Сега повлечете оддесно за да се вратите назад"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Може да се вратите на последниот екран и со повлекување од десниот раб кон средината на екранот."</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_with_follow_up" msgid="8653374779579748392">"Завршивте со упатството за враќање назад. Следно, дознајте како да се префрлате помеѓу апликации."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Научивте како да повлекувате одлево за да одите назад."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Научивте како да повлекувате оддесно за да одите назад. Следно, дознајте како да се префрлате помеѓу апликации."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Завршивте со упатството за враќање назад."</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="5538727561353262952">"Повлечете одлево за да се вратите назад"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"За да се вратите на последниот екран на кој бевте, повлечете од левиот раб кон средината на екранот."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Повлечете одлево за да се вратите назад"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Повлечете оддесно за да се вратите назад"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"За да се вратите на последниот екран на кој бевте, повлечете од левиот раб кон средината на екранот."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Може да се вратите на последниот екран и со повлекување од десниот раб кон средината. Пробајте."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml
index 85aebde..4f5068b 100644
--- a/quickstep/res/values-ml/strings.xml
+++ b/quickstep/res/values-ml/strings.xml
@@ -47,43 +47,39 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"പ്രവചിച്ച ആപ്പ്: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_back_right_follow_up (2100639504811809267) -->
<skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_overview_follow_up (9176400654037014471) -->
<skip />
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"മടങ്ങുക ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"സ്ക്രീനിന്റെ ഏറ്റവും അടിഭാഗത്തേക്ക് സ്വെെപ്പ് ചെയ്യുന്നില്ലെന്ന് ഉറപ്പാക്കുക."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"ബാക്ക്ജെസ്റ്ററിന്റെ സെൻസിറ്റിവിറ്റി മാറ്റാൻ ക്രമീകരണത്തിൽ പോകൂ"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
+ <!-- no translation found for back_left_gesture_intro_title (5197184481779330065) -->
<skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
+ <!-- no translation found for back_right_gesture_intro_title (7431951986971898074) -->
+ <skip />
+ <!-- no translation found for back_left_gesture_intro_subtitle (7672761376577628602) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_subtitle (2735828029197816509) -->
<skip />
<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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"ഹോമിലേക്ക് പോകുക ജെസ്ച്ചർ പൂർത്തിയാക്കി. അടുത്തത്, ഹോമിലേക്ക് എങ്ങനെ പോകാമെന്ന് മനസ്സിലാക്കുക."</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"ഹോമിലേക്ക് പോകുക ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി."</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"ജെസ്ച്ചറുകൾ ഉപയോഗിക്കുന്ന രീതി നിങ്ങൾ മനസ്സിലാക്കി. ജെസ്ച്ചറുകൾ ഓഫാക്കാൻ ക്രമീകരണത്തിലേക്ക് പോകുക."</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"ആപ്പുകൾ തമ്മിൽ മാറുക ജെസ്ച്ചർ നിങ്ങൾ പൂർത്തിയാക്കി."</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>
diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml
index ea3a220..43d9a27 100644
--- a/quickstep/res/values-mn/strings.xml
+++ b/quickstep/res/values-mn/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Таамаглаж буй апп: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Янзтай! Одоо буцахын тулд баруун талаас шударна уу"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Та мөн дэлгэцийн баруун булангаас дунд хэсэг рүү шударснаар сүүлийн дэлгэц рүү буцах боломжтой."</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_with_follow_up" msgid="8653374779579748392">"Та буцах зангааг гүйцэтгэлээ. Дараа нь аппуудыг хэрхэн сэлгэх талаар мэдэж авна уу."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Та буцахын тулд зүүнээс хэрхэн шудрахыг мэдэж авлаа."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Та буцахын тулд баруунаас хэрхэн шудрахыг мэдэж авлаа Дараа нь аппыг хэрхэн сэлгэхийг мэдэж аваарай."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Та буцах зангааг гүйцэтгэлээ."</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="5538727561353262952">"Буцахын тулд зүүн талаас шударна уу"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Та байсан сүүлийн дэлгэц рүүгээ буцахын тулд дэлгэцийн баруун булангаас дунд хэсэг рүү шударна уу"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Буцахын тулд зүүн талаас шударна уу"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Буцахын тулд баруун талаас шударна уу"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Та байсан сүүлийн дэлгэц рүүгээ буцахын тулд дэлгэцийн зүүн булангаас дунд хэсэг рүү шударна уу."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Та мөн дэлгэцийн баруунаас дунд хэсэг рүү шударснаар сүүлийн дэлгэц рүү буцаж болно. Одоо туршина уу"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml
index bb1f890..0bc8e82 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -47,43 +47,39 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"पूर्वानुमान केलेले अॅप: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_back_right_follow_up (2100639504811809267) -->
<skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_overview_follow_up (9176400654037014471) -->
<skip />
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"तुम्ही गो बॅक जेश्चर पूर्ण केले."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"तुम्ही स्क्रीनच्या तळाच्या अगदी जवळून स्वाइप करत नाही याची खात्री करा."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"बॅक जेश्चरची संवेदनशीलता बदलण्यासाठी, सेटिंग्ज वर जा"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
+ <!-- no translation found for back_left_gesture_intro_title (5197184481779330065) -->
<skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
+ <!-- no translation found for back_right_gesture_intro_title (7431951986971898074) -->
+ <skip />
+ <!-- no translation found for back_left_gesture_intro_subtitle (7672761376577628602) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_subtitle (2735828029197816509) -->
<skip />
<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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"तुम्ही गो होम जेश्चर पूर्ण केले. आता, मागे कसे जायचे ते जाणून घ्या."</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"तुम्ही गो होम जेश्चर पूर्ण केले."</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"तुम्ही जेश्चर कसे वापरायचे हे शिकलात. जेश्चर बंद करण्यासाठी, सेटिंग्ज वर जा."</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"तुम्ही ॲप्स स्विच करण्याचे जेश्चर पूर्ण केले."</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>
diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml
index c458c7a..aa81471 100644
--- a/quickstep/res/values-ms/strings.xml
+++ b/quickstep/res/values-ms/strings.xml
@@ -47,43 +47,33 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Apl yang diramalkan: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Pastikan anda meleret dari hujung sebelah kiri."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Pastikan anda meleret dari tepi sebelah kiri ke tengah skrin dan lepaskan."</string>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Pastikan anda meleret dari hujung sebelah kanan."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Pastikan anda meleret dari tepi sebelah kanan ke tengah skrin dan lepaskan."</string>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
- <skip />
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Anda belajar cara meleret dari kiri untuk kembali."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Anda belajar cara meleret dari kanan untuk kembali. Seterusnya, ketahui cara menukar apl."</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Anda telah melengkapkan gerak isyarat undur."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Pastikan anda tidak meleret terlalu dekat dengan bahagian bawah skrin."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Utk mengubah kepekaan gerak isyarat undur, pergi ke Tetapan"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
- <skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
- <skip />
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Leret dari kiri untuk kembali"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Leret dari kanan untuk kembali"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Untuk kembali ke skrin terakhir yang anda berada, leret dari tepi sebelah kiri ke tengah skrin."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Anda juga boleh kembali ke skrin terakhir dengan meleret dari tepi sebelah kanan ke tengah skrin. Cubalah sekarang."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Pastikan anda meleret ke atas dari tepi sebelah bawah skrin."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Pastikan anda tidak menjeda sebelum melepaskan gerak isyarat tersebut."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Pastikan anda meleret terus ke atas."</string>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"Anda telah melengkapkan gerak isyarat pergi ke Laman Utama. Seterusnya, ketahui cara kembali."</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"Anda telah melengkapkan gerak isyarat pergi ke Laman Utama."</string>
<string name="home_gesture_intro_title" msgid="836590312858441830">"Leret untuk kembali ke laman utama"</string>
<string name="home_gesture_intro_subtitle" msgid="2632238748497975326">"Leret ke atas dari bahagian bawah skrin. Gerak isyarat ini sentiasa membawa anda ke Skrin utama."</string>
<string name="overview_gesture_feedback_swipe_too_far_from_edge" msgid="3032757898111577225">"Pastikan anda meleret ke atas dari tepi sebelah bawah skrin."</string>
<string name="overview_gesture_feedback_home_detected" msgid="1411130969354020489">"Cuba tahan tetingkap untuk tempoh yang lebih lama sebelum melepaskan."</string>
<string name="overview_gesture_feedback_wrong_swipe_direction" msgid="6725820500906747925">"Pastikan anda meleret ke atas, kemudian menjeda."</string>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"Anda mempelajari cara menggunakan gerak isyarat. Untuk mematikan gerak isyarat, pergi ke Tetapan."</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"Anda telah melengkapkan gerak isyarat menukar apl."</string>
<string name="overview_gesture_intro_title" msgid="2902054412868489378">"Leret untuk menukar apl"</string>
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Leret ke atas dari bahagian bawah skrin anda, tahan, kemudian lepaskan."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Selesai"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Seterusnya"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Selesai"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Tetapan"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Cuba lagi"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bagus!"</string>
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index 44d0962..c01ca5f 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ကြိုတင်မှန်းဆထားသော အက်ပ်− <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"ကောင်းသည်။ နောက်သို့ပြန်သွားရန် ညာဘက်မှ ပွတ်ဆွဲပါ"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"ဖန်သားပြင်၏ညာအစွန်းမှ အလယ်သို့ပွတ်ဆွဲ၍ ပြီးခဲ့သောဖန်သားပြင်သို့လည်း ပြန်သွားနိုင်သည်။"</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_with_follow_up" msgid="8653374779579748392">"နောက်ဆုတ်လက်ဟန် ရှင်းလင်းပို့ချချက် ပြီးပါပြီ။ နောက်အဆင့်တွင် အက်ပ်များပြောင်းနည်းကို လေ့လာပါ။"</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"နောက်ပြန်သွားရန် ဘယ်ဘက်မှပွတ်ဆွဲနည်းကို သိသွားပါပြီ။"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"နောက်ပြန်သွားရန် ညာဘက်မှပွတ်ဆွဲနည်းကို သိသွားပါပြီ။ နောက်အဆင့်တွင် အက်ပ်များပြောင်းနည်းကို လေ့လာပါ။"</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"နောက်ဆုတ်လက်ဟန် ရှင်းလင်းပို့ချချက် ပြီးပါပြီ။"</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="5538727561353262952">"နောက်သို့ပြန်သွားရန် ဘယ်ဘက်မှ ပွတ်ဆွဲပါ"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"သင်ရှိခဲ့သည့် ပြီးခဲ့သောဖန်သားပြင်သို့ ပြန်သွားရန် ဖန်သားပြင်၏ဘယ်အစွန်းမှ အလယ်သို့ပွတ်ဆွဲပါ။"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"နောက်သို့ပြန်သွားရန် ဘယ်ဘက်မှ ပွတ်ဆွဲပါ"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"နောက်သို့ပြန်သွားရန် ညာဘက်မှ ပွတ်ဆွဲပါ"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"သင်ရှိခဲ့သည့် ပြီးခဲ့သောဖန်သားပြင်သို့ ပြန်သွားရန် ဖန်သားပြင်၏ဘယ်အစွန်းမှ အလယ်သို့ပွတ်ဆွဲပါ။"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"ဖန်သားပြင်၏ညာအစွန်းမှ အလယ်သို့ပွတ်ဆွဲ၍ ပြီးခဲ့သောဖန်သားပြင်သို့လည်း ပြန်သွားနိုင်သည်။ ယခုပဲ စမ်းကြည့်လိုက်ပါ။"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml
index 42ba19f..fd85ab1 100644
--- a/quickstep/res/values-nb/strings.xml
+++ b/quickstep/res/values-nb/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Foreslått app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Sørg for at du sveiper fra kanten helt til venstre."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Sørg for at du sveiper fra den venstre kanten til midten av skjermen og slipper."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Bra! Sveip nå fra høyre for å gå tilbake"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Du kan også gå tilbake til forrige skjerm ved å sveipe fra høyre kant til midten av skjermen."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Sørg for at du sveiper fra kanten helt til høyre."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Sørg for at du sveiper fra den høyre kanten til midten av skjermen og slipper."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Du har fullført bevegelsen for å gå tilbake. I neste trinn lærer du hvordan du bytter app."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Du har lært hvordan du sveiper fra venstre for å gå tilbake."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Du har lært hvordan du sveiper fra høyre for å gå tilbake. I neste trinn lærer du å bytte app."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Du har fullført bevegelsen for å gå tilbake."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Sørg for at du ikke sveiper for nær bunnen av skjermen."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Gå til Innstillinger for å endre tilbakebevegelsefølsomheten"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Sveip fra venstre for å gå tilbake"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"For å gå tilbake til den forrige skjermen du var på, sveip fra venstre kant til midten av skjermen."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Sveip fra venstre for å gå tilbake"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Sveip fra høyre for å gå tilbake"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"For å gå tilbake til den forrige skjermen du var på, sveip fra venstre kant til midten av skjermen."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Du kan også gå tilbake til forrige skjerm ved å sveipe fra høyre kant til midten. Prøv nå."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Sørg for at du sveiper opp fra den nederste kanten av skjermen."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Sørg for at du ikke setter på pause før du slipper."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Sørg for at du sveiper rett opp."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Sveip opp fra bunnen av skjermen, hold og slipp."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Ferdig"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Neste"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Ferdig"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Innstillinger"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Prøv igjen"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bra!"</string>
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index cd9f79a..f04b935 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -47,43 +47,39 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"पूर्वानुमान गरिएको एप: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_back_right_follow_up (2100639504811809267) -->
<skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_overview_follow_up (9176400654037014471) -->
<skip />
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"तपाईंले \'पछाडि जानुहोस्\' नामक इसारा प्रयोग गर्ने तरिका सिक्नुभयो।"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"स्क्रिनको फेदको धेरै नजिकसम्म स्वाइप नगर्नुहोस्।"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"\'पछाडि\' नामक इसाराको संवेदनशीलता बदल्न सेटिङमा जानुहोस्"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
+ <!-- no translation found for back_left_gesture_intro_title (5197184481779330065) -->
<skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
+ <!-- no translation found for back_right_gesture_intro_title (7431951986971898074) -->
+ <skip />
+ <!-- no translation found for back_left_gesture_intro_subtitle (7672761376577628602) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_subtitle (2735828029197816509) -->
<skip />
<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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"तपाईंले \'होम स्क्रिनमा जानुहोस्\' नामक इसारा प्रयोग गर्ने तरिका सिक्नुभयो। अब पछाडि जाने तरिका सिक्नुहोस्।"</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"तपाईंले \'होम स्क्रिनमा जानुहोस्\' नामक इसारा प्रयोग गर्ने तरिका सिक्नुभयो।"</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"तपाईंले इसाराहरू प्रयोग गर्ने तरिका सिक्नुभयो। इसारा अफ गर्न सेटिङमा जानुहोस्।"</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"तपाईंले \'एउटा एपबाट अर्को एपमा जानुहोस्\' नामक इसारा प्रयोग गर्ने तरिका सिक्नुभयो।"</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>
diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml
index af043e1..d97c82b 100644
--- a/quickstep/res/values-nl/strings.xml
+++ b/quickstep/res/values-nl/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Voorspelde app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Swipe helemaal vanaf de linkerrand."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Swipe vanaf de linkerrand naar het midden van het scherm en laat los."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Mooi! Swipe nu vanaf de rechterkant om terug te gaan."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Je kunt ook teruggaan naar het laatste scherm door vanaf de rechterkant naar het midden van het scherm te swipen."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Swipe helemaal vanaf de rechterrand."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Swipe vanaf de rechterrand naar het midden van het scherm en laat los."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Je weet nu hoe je het gebaar Terug maakt. Ontdek als volgende hoe je tussen apps schakelt."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Je weet nu hoe je vanaf links kunt swipen om terug te gaan."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Je weet nu hoe je vanaf rechts kunt swipen om terug te gaan. Ontdek nu hoe je tussen apps schakelt."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Je weet nu hoe je het gebaar Terug maakt."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Swipe niet te dicht bij de onderkant van het scherm."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Open Instellingen om de gevoeligheid van Terug te wijzigen"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Swipe vanaf de linkerkant om terug te gaan"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Swipe vanaf de linkerkant naar het midden van het scherm om terug te gaan naar het vorige scherm."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Swipe vanaf de linkerkant om terug te gaan"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Swipe vanaf de rechterkant om terug te gaan"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Swipe vanaf de linkerkant naar het midden van het scherm om terug te gaan naar het vorige scherm."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Je kunt ook teruggaan naar het laatste scherm door vanaf de rechterkant naar het midden van het scherm te swipen. Probeer het nu."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Swipe vanaf de onderrand van het scherm omhoog."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Pauzeer niet voordat je loslaat."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Swipe recht omhoog."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Swipe omhoog vanaf de onderkant van het scherm, houd vast en laat dan los."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Klaar"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Volgende"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Klaar"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Instellingen"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Opnieuw"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Dat gaat lekker."</string>
diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml
index 84f52b4..24c8f74 100644
--- a/quickstep/res/values-or/strings.xml
+++ b/quickstep/res/values-or/strings.xml
@@ -47,43 +47,33 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ପୂର୍ବାନୁମାନ କରାଯାଇଥିବା ଆପ୍: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
- <skip />
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"ପଛକୁ ଫେରିବା ପାଇଁ କିପରି ବାମ ଧାରରୁ ସ୍ୱାଇପ୍ କରିବେ ତାହା ଆପଣ ଜାଣିଲେ।"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"ଆପଣ ଡାହାଣ ଧାରରୁ ସ୍ୱାଇପ୍ କରି ପଛକୁ ଫେରିବା ଜାଣିଲେ। ତା\'ପରେ, ଆପଗୁଡ଼ିକୁ କିପରି ସ୍ୱିଚ୍ କରିବେ ତାହା ଜାଣନ୍ତୁ।"</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"ଆପଣ \'ପଛକୁ ଫେରନ୍ତୁ\' ଜେଶ୍ଚର୍ ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି।"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"ଆପଣ ସ୍କ୍ରିନର ତଳଭାଗର ଅତି ନିକଟରୁ ସ୍ୱାଇପ୍ କରୁନଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ।"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"ପଛକୁ ଫେରିବା ଜେଶ୍ଚରର ସମ୍ବେଦନଶୀଳତା ବଦଳାଇବାକୁ ସେଟିଂସକୁ ଯାଆନ୍ତୁ"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
- <skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
- <skip />
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"ପଛକୁ ଫେରିବା ପାଇଁ ବାମ ଧାରରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"ପଛକୁ ଫେରିବା ପାଇଁ ଡାହାଣ ଧାରରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"ଆପଣ ଯେଉଁ ପୂର୍ବ ସ୍କ୍ରିନରେ ଥିଲେ ସେହି ସ୍କ୍ରିନକୁ ଫେରିବା ପାଇଁ, ସ୍କ୍ରିନର ବାମ ଧାରରୁ ମଝିକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ।"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"ଆପଣ ସ୍କ୍ରିନର ଡାହାଣ ଧାରରୁ ମଝିକୁ ସ୍ୱାଇପ୍ କରି ପୂର୍ବ ସ୍କ୍ରିନକୁ ବି ଫେରିପାରିବେ। ଏବେ ଏହାକୁ ବ୍ୟବହାର କରନ୍ତୁ।"</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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"ଆପଣ \'ମୂଳପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\' ଜେଶ୍ଚର୍ ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି। ତା\'ପରେ, ପଛକୁ କିପରି ଫେରିବେ ତାହା ଜାଣନ୍ତୁ।"</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"ଆପଣ \'ମୂଳପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\' ଜେଶ୍ଚର୍ ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି।"</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"ଜେଶ୍ଚରଗୁଡ଼ିକୁ କିପରି ବ୍ୟବହାର କରାଯିବ ଆପଣ ତାହା ଶିଖିଛନ୍ତି। ଜେଶ୍ଚରଗୁଡ଼ିକୁ ବନ୍ଦ କରିବାକୁ, ସେଟିଂସକୁ ଯାଆନ୍ତୁ।"</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"ଆପଣ \'ଆପଗୁଡ଼ିକୁ ସ୍ୱିଚ୍ କରନ୍ତୁ\' ଜେଶ୍ଚର୍ ସମ୍ପୂର୍ଣ୍ଣ କରିଛନ୍ତି।"</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>
diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml
index fc3ea1c..d00e6cf 100644
--- a/quickstep/res/values-pa/strings.xml
+++ b/quickstep/res/values-pa/strings.xml
@@ -47,43 +47,39 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ਪੂਰਵ ਅਨੁਮਾਨਿਤ ਐਪ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_back_right_follow_up (2100639504811809267) -->
<skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_overview_follow_up (9176400654037014471) -->
<skip />
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"ਤੁਸੀਂ \'ਵਾਪਸ ਜਾਓ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ।"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"ਇਹ ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਲੇ ਹਿੱਸੇ ਦੇ ਬਹੁਤ ਨੇੜੇ ਸਵਾਈਪ ਨਾ ਕਰੋ।"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"ਪਿੱਛੇ ਜਾਣ ਦੇ ਸੰਕੇਤ ਦੀ ਸੰਵੇਦਨਸ਼ੀਲਤਾ ਬਦਲਣ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
+ <!-- no translation found for back_left_gesture_intro_title (5197184481779330065) -->
<skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
+ <!-- no translation found for back_right_gesture_intro_title (7431951986971898074) -->
+ <skip />
+ <!-- no translation found for back_left_gesture_intro_subtitle (7672761376577628602) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_subtitle (2735828029197816509) -->
<skip />
<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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"ਤੁਸੀਂ \'ਹੋਮ \'ਤੇ ਜਾਓ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ। ਅੱਗੇ, ਜਾਣੋ ਕਿ ਪਿੱਛੇ ਕਿਵੇਂ ਜਾਣਾ ਹੈ।"</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"ਤੁਸੀਂ \'ਹੋਮ \'ਤੇ ਜਾਓ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ।"</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"ਤੁਸੀਂ ਇਸ਼ਾਰੇ ਵਰਤਣ ਬਾਰੇ ਜਾਣਿਆ। ਇਸ਼ਾਰੇ ਬੰਦ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।"</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"ਤੁਸੀਂ \'ਐਪਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰੋ\' ਦਾ ਇਸ਼ਾਰਾ ਪੂਰਾ ਕੀਤਾ।"</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>
diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml
index 6a8f188..db1d5ed 100644
--- a/quickstep/res/values-pl/strings.xml
+++ b/quickstep/res/values-pl/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Przewidywana aplikacja: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Pamiętaj, aby przesuwać palcem od samej lewej krawędzi."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Pamiętaj, aby przesuwać palcem od lewej krawędzi do środka ekranu, a potem podnieść palec."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Super! A teraz przesuń palcem od prawej strony, by powrócić"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Możesz także wrócić do ostatniego ekranu, przesuwając palcem od prawej krawędzi do środka ekranu."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Pamiętaj, aby przesuwać palcem od samej prawej krawędzi."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Pamiętaj, aby przesuwać palcem od prawej krawędzi do środka ekranu, a potem podnieść palec."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Gest przejścia wstecz został opanowany. Poćwicz teraz przełączanie aplikacji."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Wiesz już, jak przesuwać palcem od lewej strony, aby wrócić."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Wiesz już, jak przesuwać palcem od prawej strony, aby wrócić. Poćwicz teraz przełączanie aplikacji."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Gest przejścia wstecz został opanowany."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Pamiętaj, aby nie przesuwać palcem zbyt blisko dolnej części ekranu."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Czułość gestu cofania możesz zmienić w Ustawieniach"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Aby wrócić, przesuń palcem od lewej strony"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Aby wrócić do ostatniego ekranu, przesuń palcem od lewej krawędzi do środka ekranu."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Aby wrócić, przesuń palcem od lewej strony"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Aby wrócić, przesuń palcem od prawej strony"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Aby wrócić do ostatniego ekranu, przesuń palcem od lewej krawędzi do środka ekranu."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Możesz także wrócić do ostatniego ekranu, przesuwając palcem od prawej krawędzi do środka ekranu. Spróbuj to zrobić teraz."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Pamiętaj, aby przesuwać palcem od dolnej krawędzi ekranu."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Pamiętaj, aby przed podniesieniem palca nie było przerwy."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Pamiętaj, aby przesuwać palcem prosto do góry."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Przesuń palcem od dołu ekranu, przytrzymaj i puść."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Wszystko gotowe"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Dalej"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Gotowe"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Ustawienia"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Spróbuj ponownie"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Super!"</string>
diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml
index b553c4c..0163602 100644
--- a/quickstep/res/values-pt-rPT/strings.xml
+++ b/quickstep/res/values-pt-rPT/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"App prevista: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Garanta que desliza rapidamente com o dedo a partir da extremidade esquerda."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Garanta que desliza rapidamente com o dedo do limite esquerdo até ao centro do ecrã e solta."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Boa! Deslize rapidamente a partir da direita para retroceder"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Também pode voltar ao último ecrã ao deslizar rapidamente da direita para o centro do ecrã."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Garanta que desliza rapidamente com o dedo a partir da extremidade direita."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Garanta que desliza rapidamente com o dedo do limite direito até ao centro do ecrã e solta."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Concluiu o gesto para retroceder. A seguir, saiba como alternar entre apps."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Aprendeu a deslizar rapidamente a partir da esquerda para retroceder."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Aprendeu a deslizar a partir da direita para retroceder. A seguir, saiba como alternar entre apps."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Concluiu o gesto para retroceder."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Garanta que não desliza rapidamente com o dedo demasiado perto da parte inferior do ecrã."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Altere a sensibilidade do gesto para voltar nas Definições."</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Deslize rapidamente a partir da esquerda para retroceder"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Para voltar ao último ecrã, deslize rapidamente a partir do limite esquerdo para o centro do ecrã."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Deslize rapidamente a partir da esquerda para retroceder"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Deslize rapidamente a partir da direita para retroceder"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Para voltar ao último ecrã, deslize rapidamente a partir do limite esquerdo para o centro do ecrã."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Também pode voltar ao último ecrã ao deslizar da direita para o centro do ecrã. Experimente agora."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Garanta que desliza rapidamente com o dedo a partir do limite inferior do ecrã."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Garanta que não faz uma pausa antes de soltar."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Garanta que desliza rapidamente com o dedo para cima."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Deslize rapidamente para cima a partir da parte inferior do ecrã sem soltar e, em seguida, solte."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Está tudo pronto"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Seguinte"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Concluído"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Definições"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Tente novamente"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Boa!"</string>
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index 3b3148f..fa43bcb 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"App previsto: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Deslize da borda esquerda."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Deslize da borda esquerda até o meio da tela e solte."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Muito bem! Agora deslize da direita para voltar"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Para voltar à tela anterior, deslize da borda direita até o meio da tela."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Deslize da borda direita."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Deslize da borda direita até o meio da tela e solte."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Você concluiu o gesto para voltar. A seguir, aprenda a trocar de app."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Você aprendeu a deslizar da esquerda para voltar."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Você aprendeu a deslizar da direita para voltar. A seguir, aprenda a trocar de app."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Você concluiu o gesto para voltar."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Não deslize perto demais da parte inferior da tela."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Mude a sensibilidade do gesto de voltar nas configurações"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Deslize da esquerda para voltar"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Para voltar à tela anterior, deslize da borda esquerda até o meio da tela."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Deslize da esquerda para voltar"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Deslizar da direita para voltar"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Para voltar à tela anterior, deslize da borda esquerda até o meio da tela."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Para voltar à tela anterior, deslize da borda direita até o meio da tela. Faça um teste."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Deslize da borda inferior da tela para cima."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Não pare antes de soltar."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Deslize para cima."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Deslize de baixo para cima na tela, mantenha-a pressionada e depois solte."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Tudo pronto"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Próxima"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Concluído"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Configurações"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Tentar novamente"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Muito bem!"</string>
diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml
index 11d23d1..1e75cb5 100644
--- a/quickstep/res/values-ro/strings.xml
+++ b/quickstep/res/values-ro/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplicația estimată: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Glisați dinspre marginea stângă îndepărtată."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Glisați dinspre marginea stângă spre mijlocul ecranului și eliberați."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Bravo! Acum glisați dinspre dreapta pentru a reveni."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Reveniți la ultimul ecran glisând de la marginea dreaptă spre mijlocul ecranului."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Glisați dinspre marginea dreaptă îndepărtată."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Glisați dinspre marginea dreaptă spre mijlocul ecranului și eliberați."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Ați finalizat gestul „înapoi”. În continuare, aflați cum să comutați între aplicații."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Ați învățat cum să glisați dinspre stânga pentru a reveni."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Ați învățat cum să glisați dinspre dreapta pentru a reveni. În continuare, aflați cum să comutați aplicațiile."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Ați finalizat gestul „înapoi”."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Nu glisați prea aproape de partea de jos a ecranului."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Schimbați sensibilitatea gestului „Înapoi” accesând Setările"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Glisați dinspre stânga pentru a reveni"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Pentru a reveni la ultimul ecran accesat, glisați de la marginea stângă spre mijlocul ecranului."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Glisați dinspre stânga pentru a reveni"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Glisați dinspre dreapta pentru a reveni"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Pentru a reveni la ultimul ecran accesat, glisați de la marginea stângă spre mijlocul ecranului."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Reveniți la ultimul ecran glisând de la marginea dreaptă spre mijlocul ecranului. Încercați acum."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Glisați în sus dinspre marginea de jos a ecranului."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Nu întrerupeți gestul înainte de a elibera."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Glisați direct în sus."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Glisați în sus din partea de jos a ecranului, așteptați, apoi eliberați."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Gata"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Înainte"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Gata"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Setări"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Reîncercați"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bravo!"</string>
diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml
index e8a1be3..6d28815 100644
--- a/quickstep/res/values-ru/strings.xml
+++ b/quickstep/res/values-ru/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Рекомендуемое приложение: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Отлично! Теперь проведите справа налево, чтобы вернуться."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Вернуться назад можно, проведя от правого края к центру."</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_with_follow_up" msgid="8653374779579748392">"Вы выполнили жест для перехода назад. Теперь мы расскажем, как переключаться между приложениями."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Теперь вы знаете, как вернуться, проведя слева направо."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Теперь вы знаете, как вернуться, проведя справа налево. Далее мы расскажем, как переключаться между приложениями."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Вы выполнили жест для перехода назад."</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="5538727561353262952">"Чтобы вернуться, проведите слева направо."</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Чтобы вернуться к предыдущему экрану, проведите от левого края к центру."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Чтобы вернуться, проведите слева направо."</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Чтобы вернуться, проведите справа налево."</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Чтобы вернуться к предыдущему экрану, проведите от левого края к центру."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Вернуться назад можно, проведя от правого края к центру. Потренируйтесь на этом экране."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml
index f540b44..6e453ce 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"පුරෝකථනය කළ යෙදුම: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"කදිමයි! දැන් ආපසු යාමට දකුණේ සිට ස්වයිප් කරන්න"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"දකුණු මායිමේ සිට තිරයේ මැදට ස්වයිප් කර අවසාන තිරයට යා හැකිය."</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_with_follow_up" msgid="8653374779579748392">"ඔබ ආපසු යාමේ ඉංගිතය සම්පූර්ණ කරන ලදි. ඊළඟට, යෙදුම් මාරු කරන ආකාරය දැන ගන්න."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"ආපසු යාමට වමේ සිට ස්වයිප් කරන්නේ කෙසේදැයි ඔබ දැන ගත්තේය."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"ආපසු යාමට දකුණේ සිට ස්වයිප් කරන්නේ කෙසේදැයි ඔබ දැන ගත්තේය. ඊළඟට, යෙදුම් මාරු කරන ආකාරය දැන ගන්න."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"ඔබ ආපසු යාමේ ඉංගිතය සම්පූර්ණ කරන ලදි."</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="5538727561353262952">"ආපසු යාමට වමේ සිට ස්වයිප් කරන්න"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"ඔබ සිටි අවසාන තිරයට ආපසු යාමට, වම් මායිමෙන් තිරයේ මැදට ස්වයිප් කරන්න."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"ආපසු යාමට වමේ සිට ස්වයිප් කරන්න"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"ආපසු යාමට දකුණින් ස්වයිප් කරන්න"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"ඔබ සිටි අවසාන තිරයට ආපසු යාමට, වම් මායිමෙන් තිරයේ මැදට ස්වයිප් කරන්න."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"දකුණු මායිමේ සිට තිරයේ මැදට ස්වයිප් කර අවසාන තිරයට යා හැකිය. දැන් එය උත්සාහ කරන්න."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml
index 95f220d..704ee61 100644
--- a/quickstep/res/values-sk/strings.xml
+++ b/quickstep/res/values-sk/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predpovedaná aplikácia: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Musite potiahnuť z úplne krajného ľavého okraja."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Musíte potiahnuť z ľavého okraja do stredu obrazovky a uvoľniť."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Výborne! Teraz prejdite späť potiahnutím sprava."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Na poslednú obrazovku sa môžete tiež vrátiť potiahnutím z pravého okraja do stredu obrazovky."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Musite potiahnuť z úplne krajného pravého okraja."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Musíte potiahnuť z pravého okraja do stredu obrazovky a uvoľniť."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Dokončili ste gesto na prechod späť. V ďalšom kroku sa naučíte, ako prepínať aplikácie."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Naučili ste sa prejsť späť potiahnutím zľava."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Naučili ste sa prejsť späť potiahnutím sprava. V ďalšom kroku sa naučíte prepínať aplikácie."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Dokončili ste gesto na prechod späť."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Nesmiete potiahnuť príliš blízko dolnej časti obrazovky."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Ak chcete zmeniť citlivosť gesta Späť, prejdite do Nastavení"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Vrátite sa potiahnutím zľava"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Na poslednú obrazovku prejdete potiahnutím z ľavého okraja do stredu obrazovky."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Späť prejdete potiahnutím zľava"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Späť prejdete potiahnutím sprava"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Na poslednú obrazovku prejdete potiahnutím z ľavého okraja do stredu obrazovky."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Na poslednú obrazovku tiež prejdete potiahnutím z pravého okraja do stredu obrazovky. Vyskúšajte to."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Musíte potiahnuť nahor z dolného okraja obrazovky."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Pred uvoľnením nesmiete zastať."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Musíte potiahnuť priamo hore."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Potiahnite nahor z dolnej časti obrazovky, pridržte a uvoľnite."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Hotovo"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Ďalej"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Hotovo"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Nastavenia"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Skúste to znova"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Výborne!"</string>
diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml
index 42b093d..19982df 100644
--- a/quickstep/res/values-sl/strings.xml
+++ b/quickstep/res/values-sl/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predvidena aplikacija: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Pazite, da ne povlečete s skrajno levega roba."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Pazite, da povlečete z levega roba do sredine zaslona in dvignete prst."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Odlično! Zdaj za pomik nazaj povlecite z desne."</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Na zadnji zaslon se lahko vrnete tudi tako, da z desnega roba povlečete do sredine zaslona."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Pazite, da ne povlečete s skrajno desnega roba."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Pazite, da povlečete z desnega roba do sredine zaslona in dvignete prst."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Izvedli ste potezo za pomik nazaj. Zdaj se naučite preklapljanja med aplikacijami."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Naučili ste se, kako povlečete z leve za vrnitev."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Naučili ste se, kako povlečete z desne za vrnitev. Zdaj se naučite preklapljanja med aplikacijami."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Izvedli ste potezo za pomik nazaj."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Pazite, da ne povlečete preblizu dna zaslona."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Občutljivost poteze za nazaj lahko spremenite v nastavitvah."</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Povlecite z leve za pomik nazaj."</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Če se želite vrniti na zadnji prikazani zaslon, povlecite z levega roba do sredine zaslona."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Povlecite z leve za vrnitev."</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Povlecite z desne za vrnitev"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Če se želite vrniti na zadnji prikazani zaslon, povlecite z levega roba do sredine zaslona."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Na zadnji zaslon se lahko vrnete tudi, če z desnega roba povlečete do sredine zaslona. Preizkusite."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Pazite, da povlečete s spodnjega roba zaslona navzgor."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Pazite, da ne zaustavite prsta, preden ga dvignete."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Pazite, da povlečete naravnost navzgor."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Povlecite navzgor z dna zaslona, pridržite, nato izpustite."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Zdaj znate"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Naprej"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Končano"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Nastavitve"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Poskusite znova"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Odlično!"</string>
diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml
index cee7183..2ff94a1 100644
--- a/quickstep/res/values-sq/strings.xml
+++ b/quickstep/res/values-sq/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplikacioni i parashikuar: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Sigurohu që të rrëshqasësh shpejt nga skaji sa më majtas."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Sigurohu që të rrëshqasësh shpejt nga skaji i majtë drejt mesit të ekranit dhe lëshoje."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Bukur! Tani rrëshqit shpejt nga e djathta për t\'u kthyer prapa"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Mund dhe të kthehesh në ekranin e fundit duke rrëshqitur shpejt nga skaji i djathtë në mes të ekranit."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Sigurohu që të rrëshqasësh shpejt nga skaji sa më djathtas."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Sigurohu që të rrëshqasësh shpejt nga skaji i djathtë drejt mesit të ekranit dhe lëshoje."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"E ke përfunduar gjestin e kthimit prapa. Në vijim do të mësosh se si t\'i ndërrosh aplikacionet."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Ke mësuar si të rrëshqasësh shpejt nga e majta për t\'u kthyer prapa."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Ke mësuar si të rrëshqasësh shpejt nga e djathta për t\'u kthyer prapa. Në vijim do të mësosh se si t\'i ndërrosh aplikacionet."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"E ke përfunduar gjestin e kthimit prapa."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Sigurohu që të mos rrëshqasësh shumë afër fundit të ekranit."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Për të ndryshuar ndjeshmërinë e gjestit të kthimit prapa, shko te \"Cilësimet\""</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Rrëshqit shpejt nga e majta për t\'u kthyer prapa"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Për t\'u kthyer në ekranin e fundit ku ishe, rrëshqit shpejt nga skaji i majtë në mes të ekranit."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Rrëshqit shpejt nga e majta për t\'u kthyer prapa"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Rrëshqit shpejt nga e djathta për t\'u kthyer prapa"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Për t\'u kthyer në ekranin e fundit ku ishe, rrëshqit shpejt nga skaji i majtë në mes të ekranit."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Mund dhe të kthehesh në ekranin e fundit duke rrëshqitur shpejt nga skaji i djathtë në mes të ekranit. Provoje tani."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Sigurohu që të rrëshqasësh shpejt lart nga skaji i poshtëm i ekranit."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Sigurohu që të mos ndalosh para se ta lëshosh."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Sigurohu që të rrëshqasësh shpejt drejt lart."</string>
@@ -73,19 +74,14 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Rrëshqit shpejt lart nga fundi i ekranit, mbaje të shtypur dhe më pas lëshoje."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Plotësisht gati"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Para"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"U krye"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Cilësimet"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Provo përsëri"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bukur!"</string>
<string name="gesture_tutorial_step" msgid="1279786122817620968">"Udhëzuesi <xliff:g id="CURRENT">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
- <!-- no translation found for allset_title (5021126669778966707) -->
- <skip />
- <!-- no translation found for allset_hint (459504134589971527) -->
- <skip />
- <!-- no translation found for allset_description (6350320429953234580) -->
- <skip />
- <!-- no translation found for allset_navigation_settings (417773244979225071) -->
- <skip />
+ <string name="allset_title" msgid="5021126669778966707">"Plotësisht gati!"</string>
+ <string name="allset_hint" msgid="459504134589971527">"Rrëshqit shpejt lart për të shkuar në ekranin bazë"</string>
+ <string name="allset_description" msgid="6350320429953234580">"Je gati për të filluar përdorimin e telefonit tënd"</string>
+ <string name="allset_navigation_settings" msgid="417773244979225071"><annotation id="link">"Cilësimet e navigimit për qasshmërinë"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"Ndaj"</string>
<string name="action_screenshot" msgid="8171125848358142917">"Pamja e ekranit"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Ky veprim nuk lejohet nga aplikacioni ose organizata jote"</string>
diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml
index 21bcda2..28754b5 100644
--- a/quickstep/res/values-sr/strings.xml
+++ b/quickstep/res/values-sr/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Предвиђамо апликацију: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Свака част! Сада превуците здесна да бисте се вратили"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Вратите се на последњи екран превлачењем здесна ка средини."</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_with_follow_up" msgid="8653374779579748392">"Довршили сте покрет за повратак. Сада сазнајте како да промените апликације."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Научили сте како да превлачите слева да бисте се вратили."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Научили сте како да превлачите здесна да бисте се вратили. Сада научите да мењате апликације."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Довршили сте покрет за повратак."</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="5538727561353262952">"Превуците са леве стране да бисте се вратили"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Да бисте се вратили на последњи екран, превуците од леве ивице ка средини екрана."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Превуците слева да бисте се вратили"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Превуците здесна да бисте се вратили"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Да бисте се вратили на последњи екран, превуците од леве ивице ка средини екрана."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Можете да се вратите на последњи екран и превлачењем од десне ивице ка средини екрана. Испробајте."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml
index dd3490b..4b4407b 100644
--- a/quickstep/res/values-sv/strings.xml
+++ b/quickstep/res/values-sv/strings.xml
@@ -47,22 +47,18 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Appförslag: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Se till att du sveper ända från vänsterkanten."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Se till att du sveper från den vänstra kanten till mitten av skärmen och sedan släpper."</string>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Se till att du sveper ända från högerkanten."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Se till att du sveper från den högra kanten till mitten av skärmen och sedan släpper."</string>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
- <skip />
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Nu kan du svepa från vänster för att gå tillbaka."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Nu kan du svepa från höger för att gå tillbaka. Nu ska du få lära dig hur du byter mellan appar."</string>
<!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
<skip />
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Se till att du inte sveper för nära skärmens nederkant."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Öppna inställningarna om du vill ändra rörelsens känslighet"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
- <skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
- <skip />
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Återgå genom att svepa från vänster"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Svep från höger för att gå tillbaka"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Återgå till den senaste skärmen du var på genom att svepa från skärmens vänstra kant till mitten."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Du kan återgå till föregående skärm genom att svepa från den högra kanten till mitten. Testa nu."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Se till att du sveper från nederkanten på skärmen."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Se till att du sveper i en jämn rörelse innan du släpper."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Se till att du sveper rakt uppåt."</string>
@@ -83,7 +79,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Svep uppåt från skärmens nederkant. Håll fingret nedtryckt och släpp sedan."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Klart"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Nästa"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Klar"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Inställningar"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Försök igen"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bra!"</string>
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index d8bfcf0..79e6483 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Programu iliyotabiriwa: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Hakikisha unatelezesha kidole kuanzia ukingo wa mbali wa kushoto."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Hakikisha unatelezesha kidole kuanzia ukingo wa kushoto kuelekea katikati ya skrini na uachilie."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Safi! Sasa telezesha kidole kuanzia kulia ili urudi nyuma"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Unaweza pia kurudi kwenye skrini iliyotangulia kwa kutelezesha kidole kuanzia ukingo wa kulia kuelekea katikati ya skrini."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Hakikisha unatelezesha kidole kuanzia ukingo wa mbali wa kulia."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Hakikisha unatelezesha kidole kuanzia ukingo wa kulia kuelekea katikati ya skrini na uachilie."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Umekamilisha ishara ya kurudi nyuma. Hatua inayofuata, jifunze jinsi ya kubadilisha programu."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Umejifunza jinsi ya kutelezesha kidole kuanzia kushoto ili kurudi nyuma."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Umejifunza jinsi ya kutelezesha kidole kuanzia kulia ili kurudi nyuma. Hatua inayofuata, jifunze jinsi ya kubadilisha programu."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Umekamilisha ishara ya kurudi nyuma."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Hakikisha hutelezeshi kidole karibu sana na sehemu ya chini ya skrini."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Kubadilisha hisi ya ishara ya nyuma, nenda kwenye Mipangilio"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Telezesha kidole kutoka kushoto ili urudi nyuma"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Ili urudi kwenye skrini iliyotangulia, telezesha kidole kuanzia ukingo wa kushoto kuelekea katikati ya skrini."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Telezesha kidole kuanzia kushoto ili urudi nyuma"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Telezesha kidole kuanzia kulia ili urudi nyuma"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Ili urudi kwenye skrini iliyotangulia, telezesha kidole kuanzia ukingo wa kushoto kuelekea katikati ya skrini."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Unaweza pia kurudi kwenye skrini iliyotangulia kwa kutelezesha kidole kuanzia ukingo wa kulia kuelekea katikati ya skrini. Ijaribu sasa."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Hakikisha unatelezesha kidole juu kuanzia ukingo wa chini wa skrini."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Hakikisha kuwa husimamishi kabla ya kuachilia."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Hakikisha unatelezesha kidole kuelekea juu."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Telezesha kidole juu kuanzia sehemu ya chini ya skrini yako, ushikilie, kisha uachilie."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Kila kitu kiko tayari"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Endelea"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Nimemaliza"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Mipangilio"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Jaribu tena"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Safi!"</string>
diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml
index d12c51c..788f525 100644
--- a/quickstep/res/values-ta/strings.xml
+++ b/quickstep/res/values-ta/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"கணித்த ஆப்ஸ்: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"அருமை! பின்செல்வதற்கு வலதுபுறத்திலிருந்து ஸ்வைப் செய்யுங்கள்"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"வலது ஓரத்திலிருந்து திரையின் மையப் பகுதிக்கு ஸ்வைப் செய்தும் முந்தைய திரைக்கு மீண்டும் செல்லலாம்."</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_with_follow_up" msgid="8653374779579748392">"பின்செல் சைகைப் பயிற்சியை முடித்துவிட்டீர்கள். அடுத்து, ஆப்ஸுக்கிடையே மாறுவது எப்படி என்பதை அறிக."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"பின்செல்வதற்கு எப்படி இடதுபுறத்திலிருந்து ஸ்வைப் செய்வதென்று கற்றுக்கொண்டீர்கள்."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"பின்செல்வதற்கு எப்படி வலதுபுறத்திலிருந்து ஸ்வைப் செய்வதென்று கற்றுக்கொண்டீர்கள். அடுத்து ஆப்ஸுக்கிடையே எப்படி மாறுவது என்பதை அறிக."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"பின்செல் சைகைப் பயிற்சியை முடித்துவிட்டீர்கள்."</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="5538727561353262952">"பின்செல்வதற்கு இடதுபுறத்திலிருந்து ஸ்வைப் செய்யுங்கள்"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"முந்தைய திரைக்கு மீண்டும் செல்ல, இடது ஓரத்திலிருந்து திரையின் மையப் பகுதிக்கு ஸ்வைப் செய்யுங்கள்."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"பின்செல்வதற்கு இடதுபுறத்திலிருந்து ஸ்வைப் செய்யுங்கள்"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"பின்செல்வதற்கு வலதுபுறத்திலிருந்து ஸ்வைப் செய்யுங்கள்"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"முந்தைய திரைக்கு மீண்டும் செல்ல, இடது ஓரத்திலிருந்து திரையின் மையப் பகுதிக்கு ஸ்வைப் செய்யுங்கள்."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"வலது ஓரத்திலிருந்து திரையின் மையப் பகுதிக்கு ஸ்வைப் செய்தும் முந்தைய திரைக்குச் செல்லலாம். இப்போதே முயலுங்கள்."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml
index 78932d5..14c83be 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -47,43 +47,39 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"సూచించబడిన యాప్: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_back_right_follow_up (2100639504811809267) -->
<skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
+ <!-- no translation found for back_gesture_feedback_complete_with_overview_follow_up (9176400654037014471) -->
<skip />
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"మీరు తిరిగి వెనక్కు వెళ్లే సంజ్ఞను పూర్తి చేశారు."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"మీరు స్క్రీన్ దిగువకు చాలా దగ్గరగా స్వైప్ చేయలేదని నిర్ధారించుకోండి."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"వెనుక సంజ్ఞ సున్నితత్వం మార్చడానికి, సెట్టింగ్లకు వెళ్లండి"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
+ <!-- no translation found for back_left_gesture_intro_title (5197184481779330065) -->
<skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
+ <!-- no translation found for back_right_gesture_intro_title (7431951986971898074) -->
+ <skip />
+ <!-- no translation found for back_left_gesture_intro_subtitle (7672761376577628602) -->
+ <skip />
+ <!-- no translation found for back_right_gesture_intro_subtitle (2735828029197816509) -->
<skip />
<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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"మీరు మొదటి ట్యాబ్కు వెళ్లే సంజ్ఞను పూర్తి చేశారు. తర్వాత, వెనుకకు ఎలా వెళ్లాలో తెలుసుకోండి."</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"మీరు మొదటి ట్యాబ్కు వెళ్లే సంజ్ఞను పూర్తి చేశారు."</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"మీరు సంజ్ఞలను ఎలా ఉపయోగించాలో నేర్చుకున్నారు. సంజ్ఞలను ఆఫ్ చేయడానికి, సెట్టింగ్లకు వెళ్లండి."</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"మీరు \'యాప్ల మధ్య మార్పు\' సంజ్ఞను పూర్తి చేశారు."</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>
diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml
index 89206db..a13b43b 100644
--- a/quickstep/res/values-th/strings.xml
+++ b/quickstep/res/values-th/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"แอปที่คาดว่าจะใช้: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"ดีมาก ทีนี้ปัดจากด้านขวาเพื่อย้อนกลับ"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"หรือจะกลับไปหน้าจอล่าสุดโดยปัดจากขอบขวาไปตรงกลางหน้าจอก็ได้"</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_with_follow_up" msgid="8653374779579748392">"คุณทำท่าทางสัมผัสเพื่อย้อนกลับเสร็จแล้ว ต่อไปดูวิธีสลับแอป"</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"คุณรู้วิธีปัดจากด้านซ้ายเพื่อย้อนกลับแล้ว"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"คุณรู้วิธีปัดจากด้านขวาเพื่อย้อนกลับแล้ว ต่อไปดูวิธีสลับแอป"</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"คุณทำท่าทางสัมผัสเพื่อย้อนกลับเสร็จแล้ว"</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="5538727561353262952">"ปัดจากด้านซ้ายเพื่อย้อนกลับ"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"หากต้องการย้อนกลับไปที่หน้าจอล่าสุดที่เปิด ให้ปัดจากขอบด้านซ้ายไปตรงกลางหน้าจอ"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"ปัดจากด้านซ้ายเพื่อย้อนกลับ"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"ปัดจากด้านขวาเพื่อย้อนกลับ"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"หากต้องการย้อนกลับไปที่หน้าจอล่าสุดที่เปิด ให้ปัดจากขอบด้านซ้ายไปตรงกลางหน้าจอ"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"หรือจะกลับไปหน้าจอล่าสุดโดยปัดจากขอบขวาไปตรงกลางหน้าจอก็ได้ ลองเลย"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml
index a4da337..eade324 100644
--- a/quickstep/res/values-tl/strings.xml
+++ b/quickstep/res/values-tl/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Hinulaang app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Tiyaking magsa-swipe ka mula sa pinakadulo sa kaliwa."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Tiyaking mag-swipe mula sa kaliwang gilid papunta sa gitna ng screen, saka iangat ang iyong daliri."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Magaling! Ngayon, mag-swipe mula sa kanan para bumalik"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Puwede ka ring mag-swipe mula sa kanan papunta sa gitna para bumalik sa nakaraang screen."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Tiyaking magsa-swipe ka mula sa pinakadulo sa kanan."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Tiyaking mag-swipe mula sa kanang gilid papunta sa gitna ng screen, saka iangat ang iyong daliri."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Nakumpleto mo na ang galaw para bumalik. Susunod, alamin kung paano magpalipat-lipat sa mga app."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Natutunan mong mag-swipe mula sa kaliwa para bumalik."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Natuto kang mag-swipe mula sa kanan para bumalik. Sunod, alamin kung paano magpalipat-lipat ng app."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Nakumpleto mo na ang galaw para bumalik."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Tiyaking hindi ka magsa-swipe nang masyadong malapit sa ibaba ng screen."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Pumunta sa Settings para baguhin ang sensitivity ng pagbalik"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Mag-swipe mula sa kaliwa para bumalik"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Mag-swipe mula sa kaliwang gilid papunta sa gitna para bumalik sa nakaraang screen na pinuntahan mo."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Mag-swipe mula sa kaliwa para bumalik"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Mag-swipe mula sa kanan para bumalik"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Mag-swipe mula sa kaliwang gilid papunta sa gitna para bumalik sa nakaraang screen na pinuntahan mo."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Puwede ka ring mag-swipe mula kanan papuntang gitna para bumalik sa naunang screen. Subukan na ito."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Tiyaking magsa-swipe ka pataas mula sa pinakaibaba ng screen."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Tiyaking hindi ka magpo-pause bago iangat ang iyong daliri."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Tiyaking magsa-swipe ka nang diretso pataas."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Mag-swipe pataas mula sa ibaba ng iyong screen, mag-hold, pagkatapos ay bitawan ito."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Handa na ang lahat"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Susunod"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Tapos na"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Mga Setting"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Subukan ulit"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Magaling!"</string>
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index 595a8a6..86f5a26 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Tahmin edilen uygulama: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Ekranın en solundan kaydırdığınızdan emin olun."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Sol kenardan ekranın ortasına doğru kaydırıp bıraktığınızdan emin olun."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Güzel! Şimdi geri gitmek için sağdan kaydırın"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"İsterseniz sağ kenardan ekranın ortasına kaydırarak son ekrana dönebilirsiniz."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Ekranın en sağından kaydırdığınızdan emin olun."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Sağ kenardan ekranın ortasına doğru kaydırıp bıraktığınızdan emin olun."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Geri dön hareketini tamamladınız. Sırada, uygulamalar arasında geçiş yapmayı öğrenmek var."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Geri dönmek için soldan kaydırmayı öğrendiniz."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Geri dönmek için sağdan kaydırmayı öğrendiniz. Sırada uygulamalar arasında geçiş yapma var."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Geri dön hareketini tamamladınız."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Ekranın alt kısmına çok yakın bir şekilde kaydırmadığınızdan emin olun."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Geri hareketinin hassasiyetini değiştirmek için Ayarlar\'a gidin"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Geri gitmek için soldan kaydırın"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Görüntülediğiniz son ekrana dönmek için sol kenardan ekranın ortasına kaydırın."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Geri gitmek için soldan kaydırın"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Geri gitmek için sağdan kaydırın"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Görüntülediğiniz son ekrana dönmek için sol kenardan ekranın ortasına doğru kaydırın."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"İsterseniz sağ kenardan ekranın ortasına doğru kaydırarak son ekrana dönebilirsiniz. Şimdi deneyin."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Ekranın alt kenarından yukarı kaydırdığınızdan emin olun."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Bırakmadan önce parmağınızı duraklatmadığınızdan emin olun."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Düz bir şekilde yukarı kaydırdığınızdan emin olun."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Ekranınızın alt tarafından yukarı doğru kaydırın, tutun ve sonra bırakın."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Hepsi bu kadar"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Sonraki"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Bitti"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Ayarlar"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Tekrar deneyin"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Güzel!"</string>
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index f350cd2..c1ab0d8 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Передбачений додаток: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"Чудово! Щоб повернутися, проведіть пальцем справа наліво"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Щоб повернутися, проведіть пальцем справа до середини."</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_with_follow_up" msgid="8653374779579748392">"Ви виконали жест \"Назад\". Тепер дізнайтеся, як переходити між додатками."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Ви навчилися проводити пальцем зліва направо, щоб повертатися."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Ви вмієте проводити пальцем справа наліво, щоб повертатися. Дізнайтеся, як переходити між додатками."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Ви виконали жест \"Назад\"."</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="5538727561353262952">"Щоб повернутися, проведіть пальцем зліва направо"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Щоб перейти на попередній екран, проведіть пальцем від лівого краю до середини екрана."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Щоб повернутися, проведіть пальцем зліва направо"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Щоб повернутися, проведіть пальцем справа наліво"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Щоб перейти на попередній екран, проведіть пальцем від лівого краю до середини екрана."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Щоб повернутися, проведіть пальцем від правого краю до середини екрана. Спробуйте зараз."</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml
index 509e234..7c01ed6 100644
--- a/quickstep/res/values-ur/strings.xml
+++ b/quickstep/res/values-ur/strings.xml
@@ -47,43 +47,33 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"پیشن گوئی کردہ ایپ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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>
- <!-- no translation found for back_gesture_feedback_title_complete_left_edge (1381455921760094003) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_subtitle_complete_left_edge (8106594510099968430) -->
- <skip />
<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>
- <!-- no translation found for back_gesture_feedback_complete_with_follow_up (8653374779579748392) -->
- <skip />
- <!-- no translation found for back_gesture_feedback_complete_without_follow_up (6405649621667113830) -->
- <skip />
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"آپ نے واپس جانے کے لیے بائیں کنارے سے سوائپ کرنے کا طریقہ سیکھ لیا۔"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"آپ نے واپس جانے کے لیے دائیں کنارے سے سوائپ کرنے کا طریقہ سیکھ لیا۔ اس کے بعد ایپس سوئچ کرنے کا طریقہ جانیں۔"</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"آپ نے واپس جائیں اشارے کو مکمل کر لیا۔"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"اس بات کو یقینی بنائیں کہ آپ اسکرین کے نچلے حصے سے زیادہ قریب سے سوائپ نہ کریں۔"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"پچھلے اشارے کی حساسیت تبدیل کرنے کے لیے ترتیبات پر جائیں"</string>
- <!-- no translation found for back_gesture_intro_title (5538727561353262952) -->
- <skip />
- <!-- no translation found for back_gesture_intro_subtitle (8139048712004626940) -->
- <skip />
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"واپس جانے کے لیے بائیں کنارے سے سوائپ کریں"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"واپس جانے کے لیے دائیں کنارے سے سوائپ کریں"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"پچھلی اسکرین جس پر آپ تھے اس پر واپس جانے کے لیے بائیں کنارے سے اسکرین کے وسط تک سوائپ کریں۔"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"آپ دائیں کنارے سے اسکرین کے وسط تک سوائپ کر کے پچھلی اسکرین پر واپس بھی جا سکتے ہیں۔ اسے ابھی آزمائیں۔"</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>
- <!-- no translation found for home_gesture_feedback_complete_with_follow_up (1427872029729605034) -->
- <skip />
- <!-- no translation found for home_gesture_feedback_complete_without_follow_up (8049099486868933882) -->
- <skip />
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="1427872029729605034">"آپ نے ہوم پر جانے کا اشارہ مکمل کر لیا۔ اس کے بعد واپس جانے کا طریقہ جانیں۔"</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="8049099486868933882">"آپ نے ہوم پر جانے کا اشارہ مکمل کر لیا۔"</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>
- <!-- no translation found for overview_gesture_feedback_complete_with_follow_up (3544611727467765026) -->
- <skip />
- <!-- no translation found for overview_gesture_feedback_complete_without_follow_up (3199486203448379152) -->
- <skip />
+ <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"آپ نے اشاروں کو استعمال کرنے کا طریقہ سیکھ لیا۔ اشاروں کو آف کرنے کے لیے ترتیبات پر جائیں۔"</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"آپ نے ایپس کو سوئچ کرنے کا اشارہ مکمل کر لیا۔"</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>
diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml
index 32579d6..156730d 100644
--- a/quickstep/res/values-uz/strings.xml
+++ b/quickstep/res/values-uz/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Taklif etilgan ilova: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Barmoqni chapdagi eng chekkadan suring."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Barmoqni ekranning chap chetidan oʻrtasigacha suring va ekrandan uzing."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Yaxshi! Endi orqaga qaytish uchun oʻngdan suring"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Shuningdek, oʻng chetdan ekran oʻrtasiga surish orqali ham oxirgi ekranga qaytish mumkin."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Barmoqni oʻngdagi eng chekkadan suring."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Barmoqni ekranning oʻng chetidan oʻrtasigacha suring va ekrandan uzing."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Ortga qaytish ishorasi darsini tamomladingiz. Endi ilovalarni almashtirishni oʻrganamiz."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Ortga qaytish uchun chapdan surishni oʻrgandingiz."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Ortga qaytish uchun oʻngdan surishni oʻrgandingiz. Endi ilovalarni almashtirishni oʻrganamiz."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Ortga qaytish ishorasi darsini tamomladingiz."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Barmoqni ekran pastiga yaqin surmaslikka harakat qiling."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Orqaga ishorasi sezuvchanligi Sozlamalardan oʻzgartiriladi"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Orqaga qaytish uchun chapdan suring"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Oxirgi ekranga qaytish uchun barmoqni ekranning chap chekkasidan oʻrtasigacha suring."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Orqaga qaytish uchun chapdan suring"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Orqaga qaytish uchun oʻngdan suring"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Oxirgi ekranga qaytish uchun barmoqni ekranning chap chekkasidan oʻrtasigacha suring."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Shuningdek, oʻng chetdan ekran oʻrtasiga surish orqali ham oxirgi ekranga qaytish mumkin. Hoziroq sinang."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Barmoqni ekranning pastki chetidan yuqoriga suring."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Barmoqni ekrandan pauzasiz qoʻyib uzing."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Barmoqni tik tepaga suring."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Ekranning pastidan tepasiga suring, bosib turing va qoʻyib yuboring."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Tayyor"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Keyingisi"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Tayyor"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Sozlamalar"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Qayta urinish"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Yaxshi!"</string>
diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml
index 4b6889a..13f1a10 100644
--- a/quickstep/res/values-vi/strings.xml
+++ b/quickstep/res/values-vi/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Ứng dụng dự đoán: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Hãy vuốt từ mép ngoài cùng bên trái."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Hãy vuốt từ mép trái tới chính giữa màn hình rồi nhấc ngón tay."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Tuyệt vời! Bây giờ, hãy vuốt từ mép phải để quay lại"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Bạn cũng có thể vuốt từ mép phải tới chính giữa màn hình để quay lại màn hình gần đây nhất."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Hãy vuốt từ mép ngoài cùng bên phải."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Hãy vuốt từ mép phải tới chính giữa màn hình rồi nhấc ngón tay."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Bạn đã thực hiện xong cử chỉ quay lại. Tiếp theo, hãy tìm hiểu cách chuyển đổi ứng dụng."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Bạn đã tìm hiểu cách vuốt từ mép trái để quay lại."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Bạn đã tìm hiểu cách vuốt từ mép phải để quay lại. Tiếp theo, hãy tìm hiểu cách chuyển đổi ứng dụng."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Bạn đã thực hiện xong cử chỉ quay lại."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Hãy nhớ không được vuốt quá gần phần cuối màn hình."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Để thay đổi độ nhạy của cử chỉ quay lại, hãy vào mục Cài đặt"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Vuốt từ mép trái để quay lại"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Để quay lại màn hình gần đây nhất mà bạn xem, hãy vuốt từ mép trái tới chính giữa màn hình."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Vuốt từ mép trái để quay lại"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Vuốt từ mép phải để quay lại"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Để quay lại màn hình gần đây nhất mà bạn xem, hãy vuốt từ mép trái tới giữa màn hình."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Bạn cũng có thể vuốt từ mép phải tới giữa màn hình để quay lại màn hình gần đây nhất. Hãy thử ngay."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Hãy vuốt lên từ mép dưới cùng của màn hình."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Hãy nhớ không được tạm dừng trước khi nhấc ngón tay."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Hãy vuốt thẳng lên."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Vuốt lên từ cuối màn hình, giữ rồi thả tay ra."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Đã hoàn tất"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Tiếp theo"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Xong"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Cài đặt"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Thử lại"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Tuyệt vời!"</string>
diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml
index b65553f..f026baf 100644
--- a/quickstep/res/values-zh-rCN/strings.xml
+++ b/quickstep/res/values-zh-rCN/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"预测的应用:<xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"太好了!现在从右侧向左滑动手指即可返回"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"如要返回上一个屏幕,您也可以从右侧边缘滑动到屏幕中间位置。"</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_with_follow_up" msgid="8653374779579748392">"您完成了“返回”手势教程。接下来了解如何切换应用。"</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"您已了解如何使用“从左侧向右滑动”手势返回。"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"您已了解如何使用“从右侧向左滑动”手势返回。接下来了解如何切换应用。"</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"您完成了“返回”手势教程。"</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="5538727561353262952">"从左侧向右滑动手指即可返回"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"如要返回您查看过的上一个屏幕,请从左侧边缘滑动到屏幕中间位置。"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"从左侧向右滑动手指即可返回"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"从右侧向左滑动手指即可返回"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"如要返回您查看过的上一个屏幕,请从左侧边缘滑动到屏幕中间位置。"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"如要返回上一个屏幕,您也可以从右侧边缘滑动到屏幕中间位置。现在就试试看吧。"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml
index feee950..5b03b02 100644
--- a/quickstep/res/values-zh-rHK/strings.xml
+++ b/quickstep/res/values-zh-rHK/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"預測應用程式:<xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"太好了!現在只要從螢幕右側往左滑動即可返回"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"從螢幕右側往中央滑動亦可返回上一個畫面。"</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_with_follow_up" msgid="8653374779579748392">"您已完成「返回」手勢的教學課程。接下來一起瞭解如何切換應用程式。"</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"您已瞭解如何使用「由左向右滑動」手勢返回。"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"您已瞭解如何透過「由右向左滑動」手勢返回。接下來一起瞭解如何切換應用程式。"</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"您已完成「返回」手勢的教學課程。"</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="5538727561353262952">"從螢幕左側往右滑動即可返回"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"如要返回上一個畫面,請從螢幕左側往中央滑動。"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"從螢幕左側往右滑動即可返回"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"由右向左滑動即可返回"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"如要返回上一個畫面,請從螢幕左側往中央滑動。"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"從螢幕右側往中央滑動亦可返回上一個畫面。立即試試吧。"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml
index 6dc5c57..f3cb458 100644
--- a/quickstep/res/values-zh-rTW/strings.xml
+++ b/quickstep/res/values-zh-rTW/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"預測的應用程式:<xliff:g id="TITLE">%1$s</xliff:g>"</string>
<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_title_complete_left_edge" msgid="1381455921760094003">"太好了!現在只要從螢幕右側往左滑動即可返回"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"從螢幕右側往中央滑動也可返回上一個畫面。"</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_with_follow_up" msgid="8653374779579748392">"你已完成「返回」手勢的教學課程。接著,一起來瞭解如何切換應用程式。"</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"你已瞭解如何使用「由左向右滑動」手勢返回。"</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"你已瞭解如何透過「由右向左滑動」手勢返回。接著,一起來瞭解如何切換應用程式。"</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"你已完成「返回」手勢的教學課程。"</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="5538727561353262952">"從螢幕左側往右滑動即可返回"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"如要返回先前的畫面,請從螢幕左側往中央滑動。"</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"從螢幕左側往右滑動即可返回"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"由右向左滑動即可返回"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"如要返回先前的畫面,請從螢幕左側往中央滑動。"</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"從螢幕右側往中央滑動也可返回上一個畫面。現在就試試看吧!"</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>
@@ -73,7 +74,6 @@
<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>
diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml
index 06d039f..1cfcb93 100644
--- a/quickstep/res/values-zu/strings.xml
+++ b/quickstep/res/values-zu/strings.xml
@@ -47,16 +47,17 @@
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Uhlelo lokusebenza olubikezelwe: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" msgid="340972404868601012">"Qiniseka ukuthi uswayiphela ekudeni emngceleni ongakwesobunxele."</string>
<string name="back_gesture_feedback_cancelled_left_edge" msgid="6671316150388702530">"Qiniseka ukuthi uswayipha kusuka emngceleni okwesobunxele kuya phakathi kwesikrini bese uyadedela."</string>
- <string name="back_gesture_feedback_title_complete_left_edge" msgid="1381455921760094003">"Kuhle! Manje swayipha kusuka kwesokudla ukuze uye emuva"</string>
- <string name="back_gesture_feedback_subtitle_complete_left_edge" msgid="8106594510099968430">"Futhi ungabuyela emuva esikrinini sangaphambilini ngokuswayipha kusuka kunqenqema langakwesokudla ukuya maphakathi nesikrini."</string>
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" msgid="4306700023773832353">"Qiniseka ukuthi uswayiphela ekudeni emngceleni ongakwesokudla."</string>
<string name="back_gesture_feedback_cancelled_right_edge" msgid="4951916546256902552">"Qiniseka ukuthi uswayipha kusuka emngceleni okwesokudla kuya phakathi kwesikrini bese uyadedela."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Ukuqedile ukuthinta kokubuyela emuva. Ngokulandelayo, funda indlela yokushintsha ama-app."</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up" msgid="2100639504811809267">"Ufunde indlela yokuswayipha kusuka kwesokunxele ukuze ubuyele emuva."</string>
+ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Ufunde indlela yokuswayipha kusuka kwesokudla ukuze ubuyele emuva. Ngokulandelayo, funda indlela yokushintsha ama-app."</string>
<string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"Ukuqedile ukuthinta kokubuyela emuva."</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Qiniseka ukuba awuswayipheli eduze kakhulu naphansi kwesikrini."</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Ukuze ushintshe ukuzwela kokuthinta emuva, iya Kumasethingi"</string>
- <string name="back_gesture_intro_title" msgid="5538727561353262952">"Swayipha kusuka kwesobunxele ukuze ubuyele emuva"</string>
- <string name="back_gesture_intro_subtitle" msgid="8139048712004626940">"Ukuze ubuyele esikrinini sangaphambilini lapho ubukade ukhona, swayipha kusuka kunqenqema lwesokunxele ukuya maphakathi nesikrini."</string>
+ <string name="back_left_gesture_intro_title" msgid="5197184481779330065">"Swayipha kusuka kwesobunxele ukuze ubuyele emuva"</string>
+ <string name="back_right_gesture_intro_title" msgid="7431951986971898074">"Swayipha kusuka kwesokudla ukubuyela emuva"</string>
+ <string name="back_left_gesture_intro_subtitle" msgid="7672761376577628602">"Ukuze ubuyele esikrinini sangaphambilini lapho ubukade ukhona, swayipha kusuka kunqenqema lwesokunxele ukuya maphakathi nesikrini."</string>
+ <string name="back_right_gesture_intro_subtitle" msgid="2735828029197816509">"Futhi ungabuyela emuva esikrinini sangaphambilini ngokuswayipha kusuka kunqenqema langakwesokudla ukuya maphakathi nesikrini. Izame manje."</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="1446774096007065298">"Qiniseka ukuthi uswayiphela phezulu kusuka emngceleni ophansi wesikrini."</string>
<string name="home_gesture_feedback_overview_detected" msgid="1557523944897393013">"Qiniseka ukuthi awumisi ngaphambi kokudedela."</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="6993979358080825438">"Qiniseka ukuthi uswayiphela ngqo phezulu."</string>
@@ -73,7 +74,6 @@
<string name="overview_gesture_intro_subtitle" msgid="1579517193845186042">"Swayiphela phezulu kusuka ngezansi kwesikrini sakho, ubambe, bese udedele."</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Konke kusethiwe"</string>
<string name="gesture_tutorial_action_button_label_next" msgid="2556263116424738762">"Okulandelayo"</string>
- <string name="gesture_tutorial_action_button_label_done" msgid="671834508127014231">"Kwenziwe"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Amasethingi"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Zama futhi"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Kuhle!"</string>
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index 420c145..c85d3dc 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -22,15 +22,17 @@
<!-- For Launchers that want to override the default dialog corner radius -->
<dimen name="task_corner_radius_override">-1dp</dimen>
+ <!-- Task Menu View -->
+ <dimen name="task_menu_corner_radius">22dp</dimen>
<dimen name="overview_proactive_row_height">48dp</dimen>
<dimen name="overview_proactive_row_bottom_margin">16dp</dimen>
- <dimen name="overview_minimum_next_prev_size">48dp</dimen>
+ <dimen name="overview_minimum_next_prev_size">50dp</dimen>
<dimen name="overview_task_margin">16dp</dimen>
<!-- Overrideable in overlay that provides the Overview Actions. -->
<dimen name="overview_actions_height">48dp</dimen>
- <dimen name="overview_actions_bottom_margin_gesture">12dp</dimen>
+ <dimen name="overview_actions_bottom_margin_gesture">28dp</dimen>
<dimen name="overview_actions_bottom_margin_three_button">8dp</dimen>
<dimen name="overview_actions_horizontal_margin">16dp</dimen>
@@ -62,17 +64,19 @@
<dimen name="quickstep_fling_threshold_speed">0.5dp</dimen>
<!-- Launcher app transition -->
- <dimen name="content_trans_y">50dp</dimen>
+ <item name="content_scale" format="float" type="dimen">0.97</item>
<dimen name="closing_window_trans_y">115dp</dimen>
<dimen name="recents_empty_message_text_size">16sp</dimen>
<dimen name="recents_empty_message_text_padding">16dp</dimen>
- <dimen name="max_shadow_radius">5dp</dimen>
+ <dimen name="max_shadow_radius">0dp</dimen>
<!-- Total space (start + end) between the task card and the edge of the screen
in various configurations -->
- <dimen name="task_card_menu_option_vertical_padding">8dp</dimen>
+ <dimen name="task_card_menu_option_vertical_padding">16dp</dimen>
+ <dimen name="task_menu_vertical_padding">8dp</dimen>
+ <dimen name="task_card_margin">8dp</dimen>
<dimen name="task_card_menu_shadow_height">3dp</dimen>
<dimen name="task_menu_option_start_margin">12dp</dimen>
<!-- Copied from framework resource:
diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml
index 2c8687c..281f735 100644
--- a/quickstep/res/values/strings.xml
+++ b/quickstep/res/values/strings.xml
@@ -95,16 +95,14 @@
<string name="back_gesture_feedback_swipe_too_far_from_left_edge">Make sure you swipe from the far-left edge.</string>
<!-- Feedback shown during interactive parts of Back gesture tutorial for left edge when the gesture is cancelled. [CHAR LIMIT=100] -->
<string name="back_gesture_feedback_cancelled_left_edge">Make sure you swipe from the left edge to the middle of the screen and let go.</string>
- <!-- Feedback title shown after completing the left back gesture before continuing on to the right edge. [CHAR LIMIT=60] -->
- <string name="back_gesture_feedback_title_complete_left_edge">Nice! Now swipe from the right to go back</string>
- <!-- Feedback subtitle shown after completing the left back gesture before continuing on to the right edge. [CHAR LIMIT=60] -->
- <string name="back_gesture_feedback_subtitle_complete_left_edge">You can also go back to the last screen by swiping from the right edge to the middle of the screen.</string>
<!-- Feedback shown during interactive parts of Back gesture tutorial for right edge when the gesture is too far from the edge. [CHAR LIMIT=100] -->
<string name="back_gesture_feedback_swipe_too_far_from_right_edge">Make sure you swipe from the far-right edge.</string>
<!-- Feedback shown during interactive parts of Back gesture tutorial for right edge when the gesture is cancelled. [CHAR LIMIT=100] -->
<string name="back_gesture_feedback_cancelled_right_edge">Make sure you swipe from the right edge to the middle of the screen and let go.</string>
<!-- Feedback shown after completing the back gesture step if the user is following the full gesture tutorial flow. [CHAR LIMIT=100] -->
- <string name="back_gesture_feedback_complete_with_follow_up">You completed the go back gesture. Next up, learn how to switch apps.</string>
+ <string name="back_gesture_feedback_complete_with_back_right_follow_up">You learned how to swipe from the left to go back.</string>
+ <!-- Feedback shown after completing the back gesture step if the user is following the full gesture tutorial flow. [CHAR LIMIT=100] -->
+ <string name="back_gesture_feedback_complete_with_overview_follow_up">You learned how to swipe from the right to go back. Next up, learn how to switch apps.</string>
<!-- Feedback shown after completing the back gesture step if the user started this tutorial individually. [CHAR LIMIT=100] -->
<string name="back_gesture_feedback_complete_without_follow_up">You completed the go back gesture.</string>
<!-- Feedback shown during interactive parts of Back gesture tutorial when the gesture is within the nav bar region. [CHAR LIMIT=100] -->
@@ -112,10 +110,14 @@
<!-- Subtitle shown on the confirmation screen after successful gesture. [CHAR LIMIT=60] -->
<string name="back_gesture_tutorial_confirm_subtitle">To change the sensitivity of the back gesture, go to Settings</string>
<!-- Feedback shown during interactive parts of Home gesture tutorial when the gesture is started too far from the edge. [CHAR LIMIT=100] -->
- <!-- Introduction title for the Back gesture tutorial. [CHAR LIMIT=100] -->
- <string name="back_gesture_intro_title">Swipe from the left to go back</string>
- <!-- Introduction subtitle for the Back gesture tutorial. [CHAR LIMIT=100] -->
- <string name="back_gesture_intro_subtitle">To go back to the last screen you were on, swipe from the left edge to the middle of the screen.</string>
+ <!-- Introduction title for the left edge Back gesture tutorial. [CHAR LIMIT=100] -->
+ <string name="back_left_gesture_intro_title">Swipe from the left to go back</string>
+ <!-- Introduction title for the right edge Back gesture tutorial. [CHAR LIMIT=100] -->
+ <string name="back_right_gesture_intro_title">Swipe from the right to go back</string>
+ <!-- Introduction subtitle for the Back left gesture tutorial. [CHAR LIMIT=200] -->
+ <string name="back_left_gesture_intro_subtitle">To go back to the last screen you were on, swipe from the left edge to the middle of the screen.</string>
+ <!-- Introduction subtitle for the Back right gesture tutorial. [CHAR LIMIT=100] -->
+ <string name="back_right_gesture_intro_subtitle">You can also go back to the last screen by swiping from the right edge to the middle of the screen. Try it now.</string>
<string name="home_gesture_feedback_swipe_too_far_from_edge">Make sure you swipe up from the bottom edge of the screen.</string>
<!-- Feedback shown during interactive parts of Home gesture tutorial when the Overview gesture is detected. [CHAR LIMIT=100] -->
@@ -176,8 +178,6 @@
<string name="gesture_tutorial_confirm_title">All set</string>
<!-- Button text shown on a button on the feedback popup to proceed to the next tutorial step. [CHAR LIMIT=14] -->
<string name="gesture_tutorial_action_button_label_next">Next</string>
- <!-- Button text shown on a button on the feedback popup to complete the tutorial. [CHAR LIMIT=14] -->
- <string name="gesture_tutorial_action_button_label_done">Done</string>
<!-- Button text shown on a button to go to Settings. [CHAR LIMIT=14] -->
<string name="gesture_tutorial_action_button_label_settings">Settings</string>
<!-- Feedback title to try again. [CHAR LIMIT=30] -->
diff --git a/quickstep/res/values/styles.xml b/quickstep/res/values/styles.xml
index 0a8ecb8..cfca124 100644
--- a/quickstep/res/values/styles.xml
+++ b/quickstep/res/values/styles.xml
@@ -77,7 +77,13 @@
<style name="TextAppearance.GestureTutorial.Feedback.Subtext"
parent="TextAppearance.GestureTutorial.Feedback.Subtitle">
<item name="android:textSize">16sp</item>
- <item name="android:textColor">#909090</item>
+ <item name="android:textColor">@color/gesture_tutorial_primary_color</item>
+ <item name="android:gravity">center</item>
+ </style>
+
+ <style name="TextAppearance.GestureTutorial.Feedback.Subtext.Dark"
+ parent="TextAppearance.GestureTutorial.Feedback.Subtext">
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
</style>
<style name="TextAppearance.GestureTutorial.ButtonLabel"
diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
index bc2c125..c13225a 100644
--- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
@@ -20,6 +20,7 @@
import static com.android.launcher3.LauncherState.FLAG_HIDE_BACK_BUTTON;
import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.LauncherState.NO_OFFSET;
+import static com.android.launcher3.model.data.ItemInfo.NO_MATCHING_ID;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.quickstep.SysUINavigationMode.Mode.TWO_BUTTONS;
import static com.android.quickstep.util.NavigationModeFeatureFlag.LIVE_TILE;
@@ -49,7 +50,7 @@
import com.android.launcher3.statehandlers.BackButtonAlphaHandler;
import com.android.launcher3.statehandlers.DepthController;
import com.android.launcher3.statemanager.StateManager.StateHandler;
-import com.android.launcher3.taskbar.TaskbarController;
+import com.android.launcher3.taskbar.LauncherTaskbarUIController;
import com.android.launcher3.taskbar.TaskbarManager;
import com.android.launcher3.taskbar.TaskbarStateHandler;
import com.android.launcher3.uioverrides.RecentsViewStateController;
@@ -96,7 +97,7 @@
private OverviewActionsView mActionsView;
private @Nullable TaskbarManager mTaskbarManager;
- private @Nullable TaskbarController mTaskbarController;
+ private @Nullable LauncherTaskbarUIController mTaskbarUIController;
private final ServiceConnection mTisBinderConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
@@ -170,7 +171,7 @@
}
@Override
- protected void onUiChangedWhileSleeping() {
+ public void onUiChangedWhileSleeping() {
// Remove the snapshot because the content view may have obvious changes.
UI_HELPER_EXECUTOR.execute(
() -> ActivityManagerWrapper.getInstance().invalidateHomeTaskSnapshot(this));
@@ -252,6 +253,7 @@
new SplitSelectStateController(mHandler, SystemUiProxy.INSTANCE.get(this))
);
overviewPanel.init(mActionsView, mSplitPlaceholderView);
+ mActionsView.setDp(getDeviceProfile());
mActionsView.updateVerticalMargin(SysUINavigationMode.getMode(this));
mAppTransitionManager = new QuickstepTransitionManager(this);
@@ -261,8 +263,8 @@
}
- public void setTaskbarController(TaskbarController taskbarController) {
- mTaskbarController = taskbarController;
+ public void setTaskbarUIController(LauncherTaskbarUIController taskbarUIController) {
+ mTaskbarUIController = taskbarUIController;
}
public <T extends OverviewActionsView> T getActionsView() {
@@ -292,8 +294,8 @@
return mDepthController;
}
- public @Nullable TaskbarController getTaskbarController() {
- return mTaskbarController;
+ public @Nullable LauncherTaskbarUIController getTaskbarUIController() {
+ return mTaskbarUIController;
}
public TaskbarStateHandler getTaskbarStateHandler() {
@@ -349,8 +351,8 @@
@Override
public float getNormalTaskbarScale() {
- if (mTaskbarController != null) {
- return mTaskbarController.getTaskbarScaleOnHome();
+ if (mTaskbarUIController != null) {
+ return mTaskbarUIController.getTaskbarScaleOnHome();
}
return super.getNormalTaskbarScale();
}
@@ -372,8 +374,8 @@
}
if ((changeBits & ACTIVITY_STATE_RESUMED) != 0) {
- if (mTaskbarController != null) {
- mTaskbarController.onLauncherResumedOrPaused(hasBeenResumed());
+ if (mTaskbarUIController != null) {
+ mTaskbarUIController.onLauncherResumedOrPaused(hasBeenResumed());
}
}
@@ -455,6 +457,8 @@
// Also allow swiping to folders
break;
}
+ // Reset any existing launch cookies associated with the cookie
+ opts.setLaunchCookie(ObjectWrapper.wrap(NO_MATCHING_ID));
return;
}
switch (info.itemType) {
@@ -465,6 +469,8 @@
// Fall through and continue if it's an app, shortcut, or widget
break;
default:
+ // Reset any existing launch cookies associated with the cookie
+ opts.setLaunchCookie(ObjectWrapper.wrap(NO_MATCHING_ID));
return;
}
opts.setLaunchCookie(ObjectWrapper.wrap(new Integer(info.id)));
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index 0ac0223..36322ce 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -23,11 +23,14 @@
import static com.android.launcher3.BaseActivity.INVISIBLE_BY_APP_TRANSITIONS;
import static com.android.launcher3.BaseActivity.INVISIBLE_BY_PENDING_FLAGS;
import static com.android.launcher3.BaseActivity.PENDING_INVISIBLE_BY_WALLPAPER_ANIMATION;
+import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
+import static com.android.launcher3.LauncherAnimUtils.VIEW_BACKGROUND_COLOR;
import static com.android.launcher3.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.BACKGROUND_APP;
import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.launcher3.Utilities.postAsyncCallback;
import static com.android.launcher3.anim.Interpolators.AGGRESSIVE_EASE;
+import static com.android.launcher3.anim.Interpolators.DEACCEL_1_5;
import static com.android.launcher3.anim.Interpolators.DEACCEL_1_7;
import static com.android.launcher3.anim.Interpolators.EXAGGERATED_EASE;
import static com.android.launcher3.anim.Interpolators.LINEAR;
@@ -50,10 +53,12 @@
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
+import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.RectF;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.CancellationSignal;
import android.os.Handler;
@@ -61,12 +66,15 @@
import android.os.SystemProperties;
import android.util.Pair;
import android.util.Size;
+import android.view.SurfaceControl;
import android.view.View;
+import android.view.ViewRootImpl;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.core.graphics.ColorUtils;
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
import com.android.launcher3.anim.AnimationSuccessListener;
@@ -75,10 +83,11 @@
import com.android.launcher3.shortcuts.DeepShortcutView;
import com.android.launcher3.statehandlers.DepthController;
import com.android.launcher3.util.ActivityOptionsWrapper;
-import com.android.launcher3.util.MultiValueAlpha;
import com.android.launcher3.util.MultiValueAlpha.AlphaProperty;
import com.android.launcher3.util.RunnableList;
+import com.android.launcher3.util.Themes;
import com.android.launcher3.views.FloatingIconView;
+import com.android.launcher3.views.ScrimView;
import com.android.launcher3.widget.LauncherAppWidgetHostView;
import com.android.quickstep.RemoteAnimationTargets;
import com.android.quickstep.SystemUiProxy;
@@ -91,6 +100,7 @@
import com.android.quickstep.views.RecentsView;
import com.android.systemui.shared.system.ActivityCompat;
import com.android.systemui.shared.system.ActivityOptionsCompat;
+import com.android.systemui.shared.system.BlurUtils;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.RemoteAnimationAdapterCompat;
@@ -160,7 +170,8 @@
private static final int CLOSING_TRANSITION_DURATION_MS = 250;
public static final int CONTENT_ALPHA_DURATION = 217;
- protected static final int CONTENT_TRANSLATION_DURATION = 350;
+ protected static final int CONTENT_SCALE_DURATION = 350;
+ protected static final int CONTENT_SCRIM_DURATION = 350;
private static final int MAX_NUM_TASKS = 5;
@@ -173,9 +184,8 @@
private final AlphaProperty mDragLayerAlpha;
final Handler mHandler;
- private final boolean mIsRtl;
- private final float mContentTransY;
+ private final float mContentScale;
private final float mClosingWindowTransY;
private final float mMaxShadowRadius;
@@ -212,11 +222,10 @@
mDragLayer = mLauncher.getDragLayer();
mDragLayerAlpha = mDragLayer.getAlphaProperty(ALPHA_INDEX_TRANSITIONS);
mHandler = new Handler(Looper.getMainLooper());
- mIsRtl = Utilities.isRtl(mLauncher.getResources());
mDeviceProfile = mLauncher.getDeviceProfile();
Resources res = mLauncher.getResources();
- mContentTransY = res.getDimensionPixelSize(R.dimen.content_trans_y);
+ mContentScale = res.getFloat(R.dimen.content_scale);
mClosingWindowTransY = res.getDimensionPixelSize(R.dimen.closing_window_trans_y);
mMaxShadowRadius = res.getDimensionPixelSize(R.dimen.max_shadow_radius);
@@ -335,8 +344,7 @@
windowTargetBounds, areAllTargetsTranslucent(appTargets), rotationChange));
if (launcherClosing) {
Pair<AnimatorSet, Runnable> launcherContentAnimator =
- getLauncherContentAnimator(true /* isAppOpening */,
- new float[] {0, -mContentTransY});
+ getLauncherContentAnimator(true /* isAppOpening */);
anim.play(launcherContentAnimator.first);
anim.addListener(new AnimatorListenerAdapter() {
@Override
@@ -436,10 +444,8 @@
*
* @param isAppOpening True when this is called when an app is opening.
* False when this is called when an app is closing.
- * @param trans Array that contains the start and end translation values for the content.
*/
- private Pair<AnimatorSet, Runnable> getLauncherContentAnimator(boolean isAppOpening,
- float[] trans) {
+ private Pair<AnimatorSet, Runnable> getLauncherContentAnimator(boolean isAppOpening) {
AnimatorSet launcherAnimator = new AnimatorSet();
Runnable endListener;
@@ -447,13 +453,17 @@
? new float[] {1, 0}
: new float[] {0, 1};
+ float[] scales = isAppOpening
+ ? new float[] {1, mContentScale}
+ : new float[] {mContentScale, 1};
+
if (mLauncher.isInState(ALL_APPS)) {
// All Apps in portrait mode is full screen, so we only animate AllAppsContainerView.
final View appsView = mLauncher.getAppsView();
final float startAlpha = appsView.getAlpha();
- final float startY = appsView.getTranslationY();
+ final float startScale = SCALE_PROPERTY.get(appsView);
appsView.setAlpha(alphas[0]);
- appsView.setTranslationY(trans[0]);
+ SCALE_PROPERTY.set(appsView, scales[0]);
ObjectAnimator alpha = ObjectAnimator.ofFloat(appsView, View.ALPHA, alphas);
alpha.setDuration(CONTENT_ALPHA_DURATION);
@@ -465,30 +475,22 @@
appsView.setLayerType(View.LAYER_TYPE_NONE, null);
}
});
- ObjectAnimator transY = ObjectAnimator.ofFloat(appsView, View.TRANSLATION_Y, trans);
- transY.setInterpolator(AGGRESSIVE_EASE);
- transY.setDuration(CONTENT_TRANSLATION_DURATION);
+ ObjectAnimator scale = ObjectAnimator.ofFloat(appsView, SCALE_PROPERTY, scales);
+ scale.setInterpolator(AGGRESSIVE_EASE);
+ scale.setDuration(CONTENT_SCALE_DURATION);
launcherAnimator.play(alpha);
- launcherAnimator.play(transY);
+ launcherAnimator.play(scale);
endListener = () -> {
appsView.setAlpha(startAlpha);
- appsView.setTranslationY(startY);
+ SCALE_PROPERTY.set(appsView, startScale);
appsView.setLayerType(View.LAYER_TYPE_NONE, null);
};
} else if (mLauncher.isInState(OVERVIEW)) {
- endListener = composeViewContentAnimator(launcherAnimator, alphas, trans);
+ endListener = composeViewContentAnimator(launcherAnimator, alphas, scales);
} else {
- mDragLayerAlpha.setValue(alphas[0]);
- ObjectAnimator alpha =
- ObjectAnimator.ofFloat(mDragLayerAlpha, MultiValueAlpha.VALUE, alphas);
- alpha.setDuration(CONTENT_ALPHA_DURATION);
- alpha.setInterpolator(LINEAR);
- launcherAnimator.play(alpha);
-
List<View> viewsToAnimate = new ArrayList<>();
-
Workspace workspace = mLauncher.getWorkspace();
workspace.forEachVisiblePage(
view -> viewsToAnimate.add(((CellLayout) view).getShortcutsAndWidgets()));
@@ -499,18 +501,38 @@
viewsToAnimate.forEach(view -> {
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- launcherAnimator.play(ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, trans));
+
+ ObjectAnimator scaleAnim = ObjectAnimator.ofFloat(view, SCALE_PROPERTY, scales)
+ .setDuration(CONTENT_SCALE_DURATION);
+ scaleAnim.setInterpolator(DEACCEL_1_5);
+ launcherAnimator.play(scaleAnim);
});
+ int scrimColor = Themes.getAttrColor(mLauncher, R.attr.overviewScrimColor);
+ int scrimColorTrans = ColorUtils.setAlphaComponent(scrimColor, 0);
+ int[] colors = isAppOpening
+ ? new int[] {scrimColorTrans, scrimColor}
+ : new int[] {scrimColor, scrimColorTrans};
+ ScrimView scrimView = mLauncher.getScrimView();
+ if (scrimView.getBackground() instanceof ColorDrawable) {
+ scrimView.setBackgroundColor(colors[0]);
+
+ ObjectAnimator scrim = ObjectAnimator.ofArgb(scrimView, VIEW_BACKGROUND_COLOR,
+ colors);
+ scrim.setDuration(CONTENT_SCRIM_DURATION);
+ scrim.setInterpolator(DEACCEL_1_5);
+ launcherAnimator.play(scrim);
+ }
+
// Pause page indicator animations as they lead to layer trashing.
mLauncher.getWorkspace().getPageIndicator().pauseAnimations();
endListener = () -> {
viewsToAnimate.forEach(view -> {
- view.setTranslationY(0);
+ SCALE_PROPERTY.set(view, 1f);
view.setLayerType(View.LAYER_TYPE_NONE, null);
});
- mDragLayerAlpha.setValue(1f);
+ scrimView.setBackgroundColor(Color.TRANSPARENT);
mLauncher.getWorkspace().getPageIndicator().skipAnimationsToEnd();
};
}
@@ -522,11 +544,11 @@
*
* @param anim the animator set to add to
* @param alphas the alphas to animate to over time
- * @param trans the translation Y values to animator to over time
+ * @param scales the scale values to animator to over time
* @return listener to run when the animation ends
*/
protected Runnable composeViewContentAnimator(@NonNull AnimatorSet anim,
- float[] alphas, float[] trans) {
+ float[] alphas, float[] scales) {
RecentsView overview = mLauncher.getOverviewPanel();
ObjectAnimator alpha = ObjectAnimator.ofFloat(overview,
RecentsView.CONTENT_ALPHA, alphas);
@@ -535,14 +557,14 @@
anim.play(alpha);
overview.setFreezeViewVisibility(true);
- ObjectAnimator transY = ObjectAnimator.ofFloat(overview, View.TRANSLATION_Y, trans);
- transY.setInterpolator(AGGRESSIVE_EASE);
- transY.setDuration(CONTENT_TRANSLATION_DURATION);
- anim.play(transY);
+ ObjectAnimator scaleAnim = ObjectAnimator.ofFloat(overview, SCALE_PROPERTY, scales);
+ scaleAnim.setInterpolator(AGGRESSIVE_EASE);
+ scaleAnim.setDuration(CONTENT_SCALE_DURATION);
+ anim.play(scaleAnim);
return () -> {
overview.setFreezeViewVisibility(false);
- overview.setTranslationY(0);
+ SCALE_PROPERTY.set(overview, 1f);
mLauncher.getStateManager().reapplyState();
};
}
@@ -583,7 +605,7 @@
AnimOpenProperties prop = new AnimOpenProperties(mLauncher.getResources(), mDeviceProfile,
windowTargetBounds, launcherIconBounds, v, dragLayerBounds[0], dragLayerBounds[1],
- hasSplashScreen);
+ hasSplashScreen, floatingView.isDifferentFromAppIcon());
int left = (int) (prop.cropCenterXStart - prop.cropWidthStart / 2);
int top = (int) (prop.cropCenterYStart - prop.cropHeightStart / 2);
int right = (int) (left + prop.cropWidthStart);
@@ -691,7 +713,7 @@
floatingIconBounds.right += offsetX;
floatingIconBounds.bottom += offsetY;
- SurfaceParams[] params = new SurfaceParams[appTargets.length];
+ ArrayList<SurfaceParams> params = new ArrayList<>();
for (int i = appTargets.length - 1; i >= 0; i--) {
RemoteAnimationTargetCompat target = appTargets[i];
SurfaceParams.Builder builder = new SurfaceParams.Builder(target.leash);
@@ -743,9 +765,8 @@
.withWindowCrop(crop)
.withAlpha(1f);
}
- params[i] = builder.build();
+ params.add(builder.build());
}
- surfaceApplier.scheduleApply(params);
if (navBarTarget != null) {
final SurfaceParams.Builder navBuilder =
@@ -759,8 +780,10 @@
} else {
navBuilder.withAlpha(mNavFadeOut.value);
}
- surfaceApplier.scheduleApply(navBuilder.build());
+ params.add(navBuilder.build());
}
+
+ surfaceApplier.scheduleApply(params.toArray(new SurfaceParams[params.size()]));
}
});
@@ -791,6 +814,8 @@
SurfaceTransactionApplier surfaceApplier = new SurfaceTransactionApplier(floatingView);
openingTargets.addReleaseCheck(surfaceApplier);
+ RemoteAnimationTargetCompat navBarTarget = openingTargets.getNavBarRemoteAnimationTarget();
+
AnimatorSet animatorSet = new AnimatorSet();
ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1);
appAnimator.setDuration(APP_LAUNCH_DURATION);
@@ -832,6 +857,11 @@
windowTargetBounds.height(), 0 /* delay */, APP_LAUNCH_DURATION,
EXAGGERATED_EASE);
+ final FloatProp mNavFadeOut = new FloatProp(1f, 0f, 0, ANIMATION_NAV_FADE_OUT_DURATION,
+ NAV_FADE_OUT_INTERPOLATOR);
+ final FloatProp mNavFadeIn = new FloatProp(0f, 1f, ANIMATION_DELAY_NAV_FADE_IN,
+ ANIMATION_NAV_FADE_IN_DURATION, NAV_FADE_IN_INTERPOLATOR);
+
@Override
public void onUpdate(float percent) {
widgetBackgroundBounds.set(mDx.value - mWidth.value / 2f,
@@ -847,7 +877,7 @@
matrix.postScale(mAppWindowScale, mAppWindowScale, widgetBackgroundBounds.left,
widgetBackgroundBounds.top);
- SurfaceParams[] params = new SurfaceParams[appTargets.length];
+ ArrayList<SurfaceParams> params = new ArrayList<>();
float floatingViewAlpha = appTargetsAreTranslucent ? 1 - mPreviewAlpha.value : 1;
for (int i = appTargets.length - 1; i >= 0; i--) {
RemoteAnimationTargetCompat target = appTargets[i];
@@ -861,9 +891,23 @@
.withAlpha(mPreviewAlpha.value)
.withCornerRadius(mWindowRadius.value / mAppWindowScale);
}
- params[i] = builder.build();
+ params.add(builder.build());
}
- surfaceApplier.scheduleApply(params);
+
+ if (navBarTarget != null) {
+ final SurfaceParams.Builder navBuilder =
+ new SurfaceParams.Builder(navBarTarget.leash);
+ if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
+ navBuilder.withMatrix(matrix)
+ .withWindowCrop(appWindowCrop)
+ .withAlpha(mNavFadeIn.value);
+ } else {
+ navBuilder.withAlpha(mNavFadeOut.value);
+ }
+ params.add(navBuilder.build());
+ }
+
+ surfaceApplier.scheduleApply(params.toArray(new SurfaceParams[params.size()]));
}
});
@@ -880,12 +924,39 @@
BACKGROUND_APP.getDepth(mLauncher))
.setDuration(APP_LAUNCH_DURATION);
if (allowBlurringLauncher) {
- depthController.setSurfaceToApp(RemoteAnimationProvider.findLowestOpaqueLayerTarget(
- appTargets, MODE_OPENING));
+ final SurfaceControl dimLayer;
+ if (BlurUtils.supportsBlursOnWindows()) {
+ // Create a temporary effect layer, that lives on top of launcher, so we can apply
+ // the blur to it. The EffectLayer will be fullscreen, which will help with caching
+ // optimizations on the SurfaceFlinger side:
+ // - Results would be able to be cached as a texture
+ // - There won't be texture allocation overhead, because EffectLayers don't have
+ // buffers
+ ViewRootImpl viewRootImpl = mLauncher.getDragLayer().getViewRootImpl();
+ SurfaceControl parent = viewRootImpl != null
+ ? viewRootImpl.getSurfaceControl()
+ : null;
+ dimLayer = new SurfaceControl.Builder()
+ .setName("Blur layer")
+ .setParent(parent)
+ .setOpaque(false)
+ .setHidden(false)
+ .setEffectLayer()
+ .build();
+ } else {
+ dimLayer = null;
+ }
+
+ depthController.setSurface(dimLayer);
backgroundRadiusAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
- depthController.setSurfaceToApp(null);
+ depthController.setSurface(null);
+ if (dimLayer != null) {
+ new SurfaceControl.Transaction()
+ .remove(dimLayer)
+ .apply();
+ }
}
});
}
@@ -1201,8 +1272,7 @@
if (mLauncher.isInState(LauncherState.ALL_APPS)) {
Pair<AnimatorSet, Runnable> contentAnimator =
- getLauncherContentAnimator(false /* isAppOpening */,
- new float[] {-mContentTransY, 0});
+ getLauncherContentAnimator(false /* isAppOpening */);
contentAnimator.first.setStartDelay(LAUNCHER_RESUME_START_DELAY);
anim.play(contentAnimator.first);
anim.addListener(new AnimatorListenerAdapter() {
@@ -1305,7 +1375,7 @@
AnimOpenProperties(Resources r, DeviceProfile dp, Rect windowTargetBounds,
RectF launcherIconBounds, View view, int dragLayerLeft, int dragLayerTop,
- boolean hasSplashScreen) {
+ boolean hasSplashScreen, boolean hasDifferentAppIcon) {
// Scale the app icon to take up the entire screen. This simplifies the math when
// animating the app window position / scale.
float smallestSize = Math.min(windowTargetBounds.height(), windowTargetBounds.width());
@@ -1337,8 +1407,7 @@
: APP_LAUNCH_DOWN_CURVED_DURATION;
alphaDuration = useUpwardAnimation ? APP_LAUNCH_ALPHA_DURATION
: APP_LAUNCH_ALPHA_DOWN_DURATION;
-
- iconAlphaStart = hasSplashScreen ? 0 : 1f;
+ iconAlphaStart = hasSplashScreen && !hasDifferentAppIcon ? 0 : 1f;
final int windowIconSize = ResourceUtils.getDimenByName("starting_surface_icon_size",
r, 108);
diff --git a/quickstep/src/com/android/launcher3/appprediction/AllAppsTipView.java b/quickstep/src/com/android/launcher3/appprediction/AllAppsTipView.java
deleted file mode 100644
index 98bf483..0000000
--- a/quickstep/src/com/android/launcher3/appprediction/AllAppsTipView.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * Copyright (C) 2019 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.appprediction;
-
-import static com.android.launcher3.AbstractFloatingView.TYPE_DISCOVERY_BOUNCE;
-import static com.android.launcher3.AbstractFloatingView.TYPE_ON_BOARD_POPUP;
-import static com.android.launcher3.LauncherState.ALL_APPS;
-
-import android.os.UserManager;
-
-import com.android.launcher3.AbstractFloatingView;
-import com.android.launcher3.Launcher;
-import com.android.launcher3.LauncherState;
-import com.android.launcher3.R;
-import com.android.launcher3.Utilities;
-import com.android.launcher3.allapps.FloatingHeaderView;
-import com.android.launcher3.statemanager.StateManager.StateListener;
-import com.android.launcher3.views.ArrowTipView;
-
-/**
- * ArrowTip helper aligned just above prediction apps, shown to users that enter all apps for the
- * first time.
- */
-public class AllAppsTipView {
-
- private static final String ALL_APPS_TIP_SEEN = "launcher.all_apps_tip_seen";
-
- private static boolean showAllAppsTipIfNecessary(Launcher launcher) {
- FloatingHeaderView floatingHeaderView = launcher.getAppsView().getFloatingHeaderView();
- if (!floatingHeaderView.hasVisibleContent()
- || AbstractFloatingView.getOpenView(launcher,
- TYPE_ON_BOARD_POPUP | TYPE_DISCOVERY_BOUNCE) != null
- || !launcher.isInState(ALL_APPS)
- || hasSeenAllAppsTip(launcher)
- || launcher.getSystemService(UserManager.class).isDemoUser()
- || Utilities.IS_RUNNING_IN_TEST_HARNESS) {
- return false;
- }
-
- int[] coords = new int[2];
- floatingHeaderView.findFixedRowByType(PredictionRowView.class).getLocationOnScreen(coords);
- ArrowTipView arrowTipView = new ArrowTipView(launcher).setOnClosedCallback(() -> {
- launcher.getSharedPrefs().edit().putBoolean(ALL_APPS_TIP_SEEN, true).apply();
- // TODO: add log to WW
- });
- arrowTipView.show(launcher.getString(R.string.all_apps_prediction_tip), coords[1]);
-
- return true;
- }
-
- private static boolean hasSeenAllAppsTip(Launcher launcher) {
- return launcher.getSharedPrefs().getBoolean(ALL_APPS_TIP_SEEN, false);
- }
-
- public static void scheduleShowIfNeeded(Launcher launcher) {
- if (!hasSeenAllAppsTip(launcher)) {
- launcher.getStateManager().addStateListener(new StateListener<LauncherState>() {
- @Override
- public void onStateTransitionComplete(LauncherState finalState) {
- if (finalState == ALL_APPS) {
- if (showAllAppsTipIfNecessary(launcher)) {
- launcher.getStateManager().removeStateListener(this);
- }
- }
- }
- });
- }
- }
-}
diff --git a/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java b/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java
index 6d5975f..de04082 100644
--- a/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java
+++ b/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java
@@ -88,7 +88,6 @@
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- AllAppsTipView.scheduleShowIfNeeded(mLauncher);
}
public void setup(FloatingHeaderView parent, FloatingHeaderRow[] rows, boolean tabsHidden) {
diff --git a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java
index 5dcf84c..85e5ab0 100644
--- a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java
+++ b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java
@@ -263,8 +263,8 @@
removeOutlineDrawings();
}
- if (mLauncher.getTaskbarController() != null) {
- mLauncher.getTaskbarController().onHotseatUpdated();
+ if (mLauncher.getTaskbarUIController() != null) {
+ mLauncher.getTaskbarUIController().onHotseatUpdated();
}
}
diff --git a/quickstep/src/com/android/launcher3/model/WellbeingModel.java b/quickstep/src/com/android/launcher3/model/WellbeingModel.java
index 995c4b0..154b78b 100644
--- a/quickstep/src/com/android/launcher3/model/WellbeingModel.java
+++ b/quickstep/src/com/android/launcher3/model/WellbeingModel.java
@@ -319,12 +319,17 @@
@WorkerThread
private void updateActionsWithRetry(int retryCount, @Nullable String packageName) {
+ if (DEBUG || mIsInTest) {
+ Log.i(TAG,
+ "updateActionsWithRetry(); retryCount: " + retryCount + ", package: "
+ + packageName);
+ }
String[] packageNames = TextUtils.isEmpty(packageName)
- ? mContext.getSystemService(LauncherApps.class)
+ ? mContext.getSystemService(LauncherApps.class)
.getActivityList(null, Process.myUserHandle()).stream()
.map(li -> li.getApplicationInfo().packageName).distinct()
.toArray(String[]::new)
- : new String[] { packageName };
+ : new String[]{packageName};
mWorkerHandler.removeCallbacksAndMessages(packageName);
if (updateActions(packageNames)) {
@@ -335,12 +340,16 @@
return;
}
mWorkerHandler.postDelayed(
- () -> updateActionsWithRetry(retryCount + 1, packageName),
+ () -> {
+ if (DEBUG || mIsInTest) Log.i(TAG, "Retrying; attempt " + (retryCount + 1));
+ updateActionsWithRetry(retryCount + 1, packageName);
+ },
packageName, RETRY_TIMES_MS[retryCount]);
}
@WorkerThread
private void updateAllPackages() {
+ if (DEBUG || mIsInTest) Log.i(TAG, "updateAllPackages");
updateActionsWithRetry(0, null);
}
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
index 59d0afa..46ef698 100644
--- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
+++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
@@ -25,7 +25,9 @@
import android.animation.ObjectAnimator;
import android.os.IBinder;
import android.util.FloatProperty;
+import android.view.SurfaceControl;
import android.view.View;
+import android.view.ViewRootImpl;
import android.view.ViewTreeObserver;
import com.android.launcher3.BaseActivity;
@@ -37,9 +39,6 @@
import com.android.launcher3.statemanager.StateManager.StateHandler;
import com.android.launcher3.states.StateAnimationConfig;
import com.android.systemui.shared.system.BlurUtils;
-import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
-import com.android.systemui.shared.system.SurfaceControlCompat;
-import com.android.systemui.shared.system.TransactionCompat;
import com.android.systemui.shared.system.WallpaperManagerCompat;
/**
@@ -91,7 +90,8 @@
@Override
public void onDraw() {
View view = mLauncher.getDragLayer();
- setSurface(new SurfaceControlCompat(view));
+ ViewRootImpl viewRootImpl = view.getViewRootImpl();
+ setSurface(viewRootImpl != null ? viewRootImpl.getSurfaceControl() : null);
view.post(() -> view.getViewTreeObserver().removeOnDrawListener(this));
}
};
@@ -102,7 +102,7 @@
*/
private int mMaxBlurRadius;
private WallpaperManagerCompat mWallpaperManager;
- private SurfaceControlCompat mSurface;
+ private SurfaceControl mSurface;
/**
* Ratio from 0 to 1, where 0 is fully zoomed out, and 1 is zoomed in.
* @see android.service.wallpaper.WallpaperService.Engine#onZoomChanged(float)
@@ -157,11 +157,7 @@
/**
* Sets the specified app target surface to apply the blur to.
*/
- public void setSurfaceToApp(RemoteAnimationTargetCompat target) {
- setSurface(target == null ? null : target.leash);
- }
-
- private void setSurface(SurfaceControlCompat surface) {
+ public void setSurface(SurfaceControl surface) {
if (mSurface != surface) {
mSurface = surface;
if (surface != null) {
@@ -217,17 +213,11 @@
}
if (supportsBlur) {
- final int blur;
- if (mLauncher.isInState(LauncherState.ALL_APPS) && mDepth == 1) {
- // All apps has a solid background. We don't need to draw blurs after it's fully
- // visible. This will take us out of GPU composition, saving battery and increasing
- // performance.
- blur = 0;
- } else {
- blur = (int) (mDepth * mMaxBlurRadius);
- }
- new TransactionCompat()
+ boolean isOpaque = mLauncher.getScrimView().isFullyOpaque();
+ int blur = isOpaque ? 0 : (int) (mDepth * mMaxBlurRadius);
+ new SurfaceControl.Transaction()
.setBackgroundBlurRadius(mSurface, blur)
+ .setOpaque(mSurface, isOpaque)
.apply();
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
similarity index 93%
rename from quickstep/src/com/android/launcher3/taskbar/TaskbarController.java
rename to quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
index cdae5be..c2d107c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
@@ -38,7 +38,7 @@
* TODO: Rename to have Launcher prefix
*/
-public class TaskbarController extends TaskbarUIController {
+public class LauncherTaskbarUIController extends TaskbarUIController {
private final BaseQuickstepLauncher mLauncher;
private final TaskbarStateHandler mTaskbarStateHandler;
@@ -46,16 +46,17 @@
private final TaskbarHotseatController mHotseatController;
private final TaskbarActivityContext mContext;
- final TaskbarContainerView mTaskbarContainerView;
+ final TaskbarDragLayer mTaskbarDragLayer;
final TaskbarView mTaskbarView;
private @Nullable Animator mAnimator;
private boolean mIsAnimatingToLauncher;
- public TaskbarController(BaseQuickstepLauncher launcher, TaskbarActivityContext context) {
+ public LauncherTaskbarUIController(
+ BaseQuickstepLauncher launcher, TaskbarActivityContext context) {
mContext = context;
- mTaskbarContainerView = context.getDragLayer();
- mTaskbarView = mTaskbarContainerView.findViewById(R.id.taskbar_view);
+ mTaskbarDragLayer = context.getDragLayer();
+ mTaskbarView = mTaskbarDragLayer.findViewById(R.id.taskbar_view);
mLauncher = launcher;
mTaskbarStateHandler = mLauncher.getTaskbarStateHandler();
@@ -72,7 +73,7 @@
mHotseatController.init();
setTaskbarViewVisible(!mLauncher.hasBeenResumed());
alignRealHotseatWithTaskbar();
- mLauncher.setTaskbarController(this);
+ mLauncher.setTaskbarUIController(this);
}
@Override
@@ -86,7 +87,7 @@
mHotseatController.cleanup();
setTaskbarViewVisible(true);
mLauncher.getHotseat().setIconsAlpha(1f);
- mLauncher.setTaskbarController(null);
+ mLauncher.setTaskbarUIController(null);
}
@Override
@@ -98,7 +99,7 @@
return new TaskbarAnimationControllerCallbacks() {
@Override
public void updateTaskbarBackgroundAlpha(float alpha) {
- mTaskbarContainerView.setTaskbarBackgroundAlpha(alpha);
+ mTaskbarDragLayer.setTaskbarBackgroundAlpha(alpha);
}
@Override
@@ -108,7 +109,7 @@
@Override
public void updateImeBarVisibilityAlpha(float alpha) {
- mTaskbarContainerView.updateImeBarVisibilityAlpha(alpha);
+ mTaskbarDragLayer.updateImeBarVisibilityAlpha(alpha);
}
@Override
@@ -201,7 +202,7 @@
}
@Override
- protected void onImeVisible(TaskbarContainerView containerView, boolean isVisible) {
+ protected void onImeVisible(TaskbarDragLayer containerView, boolean isVisible) {
mTaskbarAnimationController.animateToVisibilityForIme(isVisible ? 0 : 1);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 70f2788..4ba0ee0 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -87,7 +87,7 @@
private final DeviceProfile mDeviceProfile;
private final LayoutInflater mLayoutInflater;
- private final TaskbarContainerView mTaskbarContainerView;
+ private final TaskbarDragLayer mDragLayer;
private final TaskbarIconController mIconController;
private final MyDragController mDragController;
@@ -123,9 +123,9 @@
mDeviceProfile.updateIconSize(iconScale, getResources());
mLayoutInflater = LayoutInflater.from(this).cloneInContext(this);
- mTaskbarContainerView = (TaskbarContainerView) mLayoutInflater
+ mDragLayer = (TaskbarDragLayer) mLayoutInflater
.inflate(R.layout.taskbar, null, false);
- mIconController = new TaskbarIconController(this, mTaskbarContainerView);
+ mIconController = new TaskbarIconController(this, mDragLayer);
mDragController = new MyDragController(this);
Display display = windowContext.getDisplay();
@@ -157,7 +157,7 @@
);
mIconController.init(mOnTaskbarIconClickListener, mOnTaskbarIconLongClickListener);
- mWindowManager.addView(mTaskbarContainerView, mWindowLayoutParams);
+ mWindowManager.addView(mDragLayer, mWindowLayoutParams);
}
/**
@@ -168,7 +168,7 @@
return;
}
mWindowLayoutParams.height = height;
- mWindowManager.updateViewLayout(mTaskbarContainerView, mWindowLayoutParams);
+ mWindowManager.updateViewLayout(mDragLayer, mWindowLayoutParams);
}
public boolean canShowNavButtons() {
@@ -181,8 +181,8 @@
}
@Override
- public TaskbarContainerView getDragLayer() {
- return mTaskbarContainerView;
+ public TaskbarDragLayer getDragLayer() {
+ return mDragLayer;
}
@Override
@@ -192,7 +192,7 @@
@Override
public Rect getFolderBoundingBox() {
- return mTaskbarContainerView.getFolderBoundingBox();
+ return mDragLayer.getFolderBoundingBox();
}
@Override
@@ -216,15 +216,28 @@
public void onDestroy() {
setUIController(TaskbarUIController.DEFAULT);
mIconController.onDestroy();
- mWindowManager.removeViewImmediate(mTaskbarContainerView);
+ mWindowManager.removeViewImmediate(mDragLayer);
}
void onNavigationButtonClick(@TaskbarButton int buttonType) {
mNavButtonController.onButtonClick(buttonType);
}
- public TaskbarIconController getIconController() {
- return mIconController;
+ /**
+ * Should be called when the IME visibility changes, so we can hide/show Taskbar accordingly.
+ */
+ public void setImeIsVisible(boolean isImeVisible) {
+ mIconController.setImeIsVisible(isImeVisible);
+ }
+
+ /**
+ * When in 3 button nav, the above doesn't get called since we prevent sysui nav bar from
+ * instantiating at all, which is what's responsible for sending sysui state flags over.
+ *
+ * @param vis IME visibility flag
+ */
+ public void updateImeStatus(int displayId, int vis, boolean showImeSwitcher) {
+ mIconController.updateImeStatus(displayId, vis, showImeSwitcher);
}
/**
@@ -258,9 +271,7 @@
});
} else if (tag instanceof WorkspaceItemInfo) {
WorkspaceItemInfo info = (WorkspaceItemInfo) tag;
- if (info.isDisabled()) {
- ItemClickHandler.handleDisabledItemClicked(info, this);
- } else {
+ if (!(info.isDisabled() && ItemClickHandler.handleDisabledItemClicked(info, this))) {
Intent intent = new Intent(info.getIntent())
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarAnimationController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarAnimationController.java
index 815efb9..e20ddf8 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarAnimationController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarAnimationController.java
@@ -21,7 +21,7 @@
import com.android.launcher3.BaseQuickstepLauncher;
import com.android.launcher3.Utilities;
-import com.android.launcher3.taskbar.TaskbarController.TaskbarAnimationControllerCallbacks;
+import com.android.launcher3.taskbar.LauncherTaskbarUIController.TaskbarAnimationControllerCallbacks;
import com.android.quickstep.AnimatedFloat;
import com.android.quickstep.SystemUiProxy;
import com.android.systemui.shared.system.QuickStepContract;
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarContainerView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
similarity index 90%
rename from quickstep/src/com/android/launcher3/taskbar/TaskbarContainerView.java
rename to quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
index 5034791..45ec911 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarContainerView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
@@ -35,7 +35,7 @@
/**
* Top-level ViewGroup that hosts the TaskbarView as well as Views created by it such as Folder.
*/
-public class TaskbarContainerView extends BaseDragLayer<TaskbarActivityContext> {
+public class TaskbarDragLayer extends BaseDragLayer<TaskbarActivityContext> {
private final int mFolderMargin;
private final Paint mTaskbarBackgroundPaint;
@@ -45,20 +45,20 @@
private final OnComputeInsetsListener mTaskbarInsetsComputer = this::onComputeTaskbarInsets;
- public TaskbarContainerView(@NonNull Context context) {
+ public TaskbarDragLayer(@NonNull Context context) {
this(context, null);
}
- public TaskbarContainerView(@NonNull Context context, @Nullable AttributeSet attrs) {
+ public TaskbarDragLayer(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
- public TaskbarContainerView(@NonNull Context context, @Nullable AttributeSet attrs,
+ public TaskbarDragLayer(@NonNull Context context, @Nullable AttributeSet attrs,
int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
- public TaskbarContainerView(@NonNull Context context, @Nullable AttributeSet attrs,
+ public TaskbarDragLayer(@NonNull Context context, @Nullable AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, 1 /* alphaChannelCount */);
mFolderMargin = getResources().getDimensionPixelSize(R.dimen.taskbar_folder_margin);
@@ -118,7 +118,7 @@
public void onViewRemoved(View child) {
super.onViewRemoved(child);
if (mControllerCallbacks != null) {
- mControllerCallbacks.onContainerViewRemoved();
+ mControllerCallbacks.onDragLayerViewRemoved();
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarIconController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarIconController.java
index 2a37915..683a5b9 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarIconController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarIconController.java
@@ -41,7 +41,7 @@
private final Rect mTempRect = new Rect();
private final TaskbarActivityContext mActivity;
- private final TaskbarContainerView mContainerView;
+ private final TaskbarDragLayer mDragLayer;
private final TaskbarView mTaskbarView;
private final ImeBarView mImeBarView;
@@ -49,15 +49,15 @@
@NonNull
private TaskbarUIController mUIController = TaskbarUIController.DEFAULT;
- TaskbarIconController(TaskbarActivityContext activity, TaskbarContainerView containerView) {
+ TaskbarIconController(TaskbarActivityContext activity, TaskbarDragLayer dragLayer) {
mActivity = activity;
- mContainerView = containerView;
- mTaskbarView = mContainerView.findViewById(R.id.taskbar_view);
- mImeBarView = mContainerView.findViewById(R.id.ime_bar_view);
+ mDragLayer = dragLayer;
+ mTaskbarView = mDragLayer.findViewById(R.id.taskbar_view);
+ mImeBarView = mDragLayer.findViewById(R.id.ime_bar_view);
}
public void init(OnClickListener clickListener, OnLongClickListener longClickListener) {
- mContainerView.addOnLayoutChangeListener((v, a, b, c, d, e, f, g, h) ->
+ mDragLayer.addOnLayoutChangeListener((v, a, b, c, d, e, f, g, h) ->
mUIController.alignRealHotseatWithTaskbar());
ButtonProvider buttonProvider = new ButtonProvider(mActivity);
@@ -65,11 +65,11 @@
mTaskbarView.construct(clickListener, longClickListener, buttonProvider);
mTaskbarView.getLayoutParams().height = mActivity.getDeviceProfile().taskbarSize;
- mContainerView.init(new Callbacks(), mTaskbarView);
+ mDragLayer.init(new Callbacks(), mTaskbarView);
}
public void onDestroy() {
- mContainerView.onDestroy();
+ mDragLayer.onDestroy();
}
public void setUIController(@NonNull TaskbarUIController uiController) {
@@ -96,11 +96,11 @@
*/
public void setImeIsVisible(boolean isImeVisible) {
mTaskbarView.setTouchesEnabled(!isImeVisible);
- mUIController.onImeVisible(mContainerView, isImeVisible);
+ mUIController.onImeVisible(mDragLayer, isImeVisible);
}
/**
- * Callbacks for {@link TaskbarContainerView} to interact with the icon controller
+ * Callbacks for {@link TaskbarDragLayer} to interact with the icon controller
*/
public class Callbacks {
@@ -109,7 +109,7 @@
*/
public void updateInsetsTouchability(InsetsInfo insetsInfo) {
insetsInfo.touchableRegion.setEmpty();
- if (mContainerView.getAlpha() < AlphaUpdateListener.ALPHA_CUTOFF_THRESHOLD) {
+ if (mDragLayer.getAlpha() < AlphaUpdateListener.ALPHA_CUTOFF_THRESHOLD) {
// Let touches pass through us.
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION);
} else if (mImeBarView.getVisibility() == VISIBLE) {
@@ -122,7 +122,7 @@
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_FRAME);
} else {
if (mTaskbarView.mSystemButtonContainer.getVisibility() == VISIBLE) {
- mContainerView.getDescendantRectRelativeToSelf(
+ mDragLayer.getDescendantRectRelativeToSelf(
mTaskbarView.mSystemButtonContainer, mTempRect);
insetsInfo.touchableRegion.set(mTempRect);
}
@@ -135,15 +135,15 @@
// mTaskbarView is, since its position never changes and insets rather than overlays.
insetsInfo.contentInsets.left = mTaskbarView.getLeft();
insetsInfo.contentInsets.top = mTaskbarView.getTop();
- insetsInfo.contentInsets.right = mContainerView.getWidth() - mTaskbarView.getRight();
- insetsInfo.contentInsets.bottom = mContainerView.getHeight() - mTaskbarView.getBottom();
+ insetsInfo.contentInsets.right = mDragLayer.getWidth() - mTaskbarView.getRight();
+ insetsInfo.contentInsets.bottom = mDragLayer.getHeight() - mTaskbarView.getBottom();
}
- public void onContainerViewRemoved() {
- int count = mContainerView.getChildCount();
+ public void onDragLayerViewRemoved() {
+ int count = mDragLayer.getChildCount();
// Ensure no other children present (like Folders, etc)
for (int i = 0; i < count; i++) {
- View v = mContainerView.getChildAt(i);
+ View v = mDragLayer.getChildAt(i);
if (!((v instanceof TaskbarView) || (v instanceof ImeBarView))) {
return;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index b9eec93..d026bfb 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -57,6 +57,8 @@
private static final int CHANGE_FLAGS =
CHANGE_ACTIVE_SCREEN | CHANGE_DENSITY | CHANGE_SUPPORTED_BOUNDS;
+ private boolean mUserUnlocked = false;
+
public TaskbarManager(TouchInteractionService service) {
mDisplayController = DisplayController.INSTANCE.get(service);
mSysUINavigationMode = SysUINavigationMode.INSTANCE.get(service);
@@ -90,6 +92,14 @@
}
/**
+ * Called when the user is unlocked
+ */
+ public void onUserUnlocked() {
+ mUserUnlocked = true;
+ recreateTaskbar();
+ }
+
+ /**
* Sets or clears a launcher to act as taskbar callback
*/
public void setLauncher(@Nullable BaseQuickstepLauncher launcher) {
@@ -97,7 +107,7 @@
if (mTaskbarActivityContext != null) {
mTaskbarActivityContext.setUIController(mLauncher == null
? TaskbarUIController.DEFAULT
- : new TaskbarController(launcher, mTaskbarActivityContext));
+ : new LauncherTaskbarUIController(launcher, mTaskbarActivityContext));
}
}
@@ -106,6 +116,9 @@
if (!FeatureFlags.ENABLE_TASKBAR.get()) {
return;
}
+ if (!mUserUnlocked) {
+ return;
+ }
DeviceProfile dp = LauncherAppState.getIDP(mContext).getDeviceProfile(mContext);
if (!dp.isTaskbarPresent) {
return;
@@ -115,7 +128,7 @@
mTaskbarActivityContext.init();
if (mLauncher != null) {
mTaskbarActivityContext.setUIController(
- new TaskbarController(mLauncher, mTaskbarActivityContext));
+ new LauncherTaskbarUIController(mLauncher, mTaskbarActivityContext));
}
}
@@ -126,7 +139,7 @@
public void onSystemUiFlagsChanged(int systemUiStateFlags) {
boolean isImeVisible = (systemUiStateFlags & SYSUI_STATE_IME_SHOWING) != 0;
if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.getIconController().setImeIsVisible(isImeVisible);
+ mTaskbarActivityContext.setImeIsVisible(isImeVisible);
}
}
@@ -141,8 +154,7 @@
public void updateImeStatus(int displayId, int vis, int backDisposition,
boolean showImeSwitcher) {
if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.getIconController()
- .updateImeStatus(displayId, vis, showImeSwitcher);
+ mTaskbarActivityContext.updateImeStatus(displayId, vis, showImeSwitcher);
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
index e16f5e6..50adead 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
@@ -35,7 +35,7 @@
return true;
}
- protected void onImeVisible(TaskbarContainerView container, boolean isVisible) {
+ protected void onImeVisible(TaskbarDragLayer container, boolean isVisible) {
container.updateImeBarVisibilityAlpha(isVisible ? 1 : 0);
}
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
index 5ba1fe1..d839a36 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
@@ -35,7 +35,6 @@
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.R;
-import com.android.launcher3.graphics.IconPalette;
import com.android.launcher3.icons.GraphicsUtils;
import com.android.launcher3.icons.IconNormalizer;
import com.android.launcher3.icons.LauncherIcons;
@@ -112,8 +111,7 @@
@Override
public void applyFromWorkspaceItem(WorkspaceItemInfo info) {
super.applyFromWorkspaceItem(info);
- int color = IconPalette.getMutedColor(info.bitmap.color, 0.54f);
- mPlateColor = ColorUtils.setAlphaComponent(color, 200);
+ mPlateColor = ColorUtils.setAlphaComponent(mDotParams.color, 200);
if (mIsPinned) {
setContentDescription(info.contentDescription);
} else {
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java
index 3a8de3c..1304033 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java
@@ -51,7 +51,7 @@
return RemoteViews.startPendingIntent(hostView, pendingIntent,
remoteResponse.getLaunchOptions(view));
}
- Pair<Intent, ActivityOptions> options = remoteResponse.getLaunchOptions(hostView);
+ Pair<Intent, ActivityOptions> options = remoteResponse.getLaunchOptions(view);
ActivityOptionsWrapper activityOptions = mLauncher.getAppTransitionManager()
.getActivityLaunchOptions(mLauncher, hostView);
if (Utilities.ATLEAST_S && !pendingIntent.isActivity()) {
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 45bb521..f0b02b3 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -165,7 +165,7 @@
@Override
public boolean startActivitySafely(View v, Intent intent, ItemInfo item) {
// Only pause is taskbar controller is not present
- mHotseatPredictionController.setPauseUIUpdate(getTaskbarController() == null);
+ mHotseatPredictionController.setPauseUIUpdate(getTaskbarUIController() == null);
return super.startActivitySafely(v, intent, item);
}
@@ -233,9 +233,9 @@
@Override
public void bindWorkspaceItemsChanged(List<WorkspaceItemInfo> updated) {
super.bindWorkspaceItemsChanged(updated);
- if (getTaskbarController() != null && updated.stream()
+ if (getTaskbarUIController() != null && updated.stream()
.filter(w -> w.container == CONTAINER_HOTSEAT).findFirst().isPresent()) {
- getTaskbarController().onHotseatUpdated();
+ getTaskbarUIController().onHotseatUpdated();
}
}
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index e0f430d..be927e0 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -82,6 +82,7 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimationSuccessListener;
+import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.logging.StatsLogManager.StatsLogger;
import com.android.launcher3.statemanager.BaseState;
@@ -102,10 +103,10 @@
import com.android.quickstep.util.ProtoTracer;
import com.android.quickstep.util.RecentsOrientedState;
import com.android.quickstep.util.RectFSpringAnim;
+import com.android.quickstep.util.StaggeredWorkspaceAnim;
import com.android.quickstep.util.SurfaceTransactionApplier;
import com.android.quickstep.util.SwipePipToHomeAnimator;
import com.android.quickstep.util.TransformParams;
-import com.android.quickstep.util.WorkspaceRevealAnim;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.ThumbnailData;
@@ -201,7 +202,7 @@
STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_LAUNCHER_STARTED;
public static final long MAX_SWIPE_DURATION = 350;
- public static final long HOME_DURATION = WorkspaceRevealAnim.DURATION_MS;
+ public static final long HOME_DURATION = StaggeredWorkspaceAnim.DURATION_MS;
public static final float MIN_PROGRESS_FOR_OVERVIEW = 0.7f;
private static final float SWIPE_DURATION_MULTIPLIER =
@@ -393,6 +394,9 @@
if (mStateCallback.hasStates(STATE_HANDLER_INVALIDATED)) {
return;
}
+ // RecentsView never updates the display rotation until swipe-up, force update
+ // RecentsOrientedState before passing to TaskViewSimulator.
+ mRecentsView.updateRecentsRotation();
mTaskViewSimulator.setOrientationState(mRecentsView.getPagedViewOrientedState());
// If we've already ended the gesture and are going home, don't prepare recents UI,
@@ -750,6 +754,7 @@
setIsLikelyToStartNewTask(isLikelyToStartNewTask, false /* animate */);
mStateCallback.setStateOnUiThread(STATE_GESTURE_STARTED);
mGestureStarted = true;
+ SystemUiProxy.INSTANCE.get(mContext).notifySwipeUpGestureStarted();
}
/**
@@ -1213,20 +1218,22 @@
&& (windowRotation == ROTATION_90 || windowRotation == ROTATION_270)) {
swipePipToHomeAnimator.setFromRotation(mTaskViewSimulator, windowRotation);
}
+ AnimatorPlaybackController activityAnimationToHome =
+ homeAnimFactory.createActivityAnimationToHome();
swipePipToHomeAnimator.addListener(new AnimatorListenerAdapter() {
private boolean mHasAnimationEnded;
@Override
public void onAnimationStart(Animator animation) {
if (mHasAnimationEnded) return;
- // Ensure Launcher ends in NORMAL state, we intentionally skip other callbacks
- // since they are not relevant in this swipe-pip-to-home case.
- homeAnimFactory.createActivityAnimationToHome().dispatchOnStart();
+ // Ensure Launcher ends in NORMAL state
+ activityAnimationToHome.dispatchOnStart();
}
@Override
public void onAnimationEnd(Animator animation) {
if (mHasAnimationEnded) return;
mHasAnimationEnded = true;
+ activityAnimationToHome.getAnimationPlayer().end();
if (mRecentsAnimationController == null) {
// If the recents animation is interrupted, we still end the running
// animation (not canceled) so this is still called. In that case, we can
@@ -1391,6 +1398,10 @@
mLauncherTransitionController.getNormalController().getAnimationPlayer().end();
mLauncherTransitionController = null;
}
+
+ if (mRecentsView != null) {
+ mRecentsView.abortScrollerAnimation();
+ }
}
/**
@@ -1409,7 +1420,7 @@
private void resetStateForAnimationCancel() {
boolean wasVisible = mWasLauncherAlreadyVisible || mGestureStarted;
- mActivityInterface.onTransitionCancelled(wasVisible);
+ mActivityInterface.onTransitionCancelled(wasVisible, mGestureState.getEndTarget());
// Leave the pending invisible flag, as it may be used by wallpaper open animation.
if (mActivity != null) {
diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
index 86bf119..4ae6fa8 100644
--- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
@@ -59,6 +59,7 @@
import com.android.quickstep.util.ActivityInitListener;
import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.util.SplitScreenBounds;
+import com.android.quickstep.views.OverviewActionsView;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.ThumbnailData;
@@ -85,12 +86,22 @@
mBackgroundState = backgroundState;
}
- public void onTransitionCancelled(boolean activityVisible) {
+ /**
+ * Called when the current gesture transition is cancelled.
+ * @param activityVisible Whether the user can see the changes we make here, so try to animate.
+ * @param endTarget If the gesture ended before we got cancelled, where we were headed.
+ */
+ public void onTransitionCancelled(boolean activityVisible,
+ @Nullable GestureState.GestureEndTarget endTarget) {
ACTIVITY_TYPE activity = getCreatedActivity();
if (activity == null) {
return;
}
STATE_TYPE startState = activity.getStateManager().getRestState();
+ if (endTarget != null) {
+ // We were on our way to this state when we got canceled, end there instead.
+ startState = stateFromGestureEndTarget(endTarget);
+ }
activity.getStateManager().goToState(startState, activityVisible);
}
@@ -212,7 +223,7 @@
} else {
int taskMargin = dp.overviewTaskMarginPx;
int proactiveRowAndMargin;
- if (dp.isVerticalBarLayout()) {
+ if (!TaskView.SHOW_PROACTIVE_ACTIONS || dp.isVerticalBarLayout()) {
// In Vertical Bar Layout the proactive row doesn't have its own space, it's inside
// the actions row.
proactiveRowAndMargin = 0;
@@ -223,7 +234,7 @@
}
calculateTaskSizeInternal(context, dp,
dp.overviewTaskThumbnailTopMarginPx,
- proactiveRowAndMargin + getOverviewActionsHeight(context) + taskMargin,
+ proactiveRowAndMargin + getOverviewActionsHeight(context, dp),
res.getDimensionPixelSize(R.dimen.overview_minimum_next_prev_size) + taskMargin,
outRect);
}
@@ -314,23 +325,16 @@
calculateTaskSizeInternal(
context, dp,
dp.overviewTaskMarginPx,
- getOverviewActionsHeight(context) + dp.overviewTaskMarginPx,
+ getOverviewActionsHeight(context, dp),
dp.overviewTaskMarginPx,
outRect);
}
/** Gets the space that the overview actions will take, including bottom margin. */
- public final int getOverviewActionsHeight(Context context) {
+ private int getOverviewActionsHeight(Context context, DeviceProfile dp) {
Resources res = context.getResources();
- int actionsBottomMargin = 0;
- if (getMode(context) == Mode.THREE_BUTTONS) {
- actionsBottomMargin = res.getDimensionPixelSize(
- R.dimen.overview_actions_bottom_margin_three_button);
- } else {
- actionsBottomMargin = res.getDimensionPixelSize(
- R.dimen.overview_actions_bottom_margin_gesture);
- }
- return actionsBottomMargin
+ return OverviewActionsView.getOverviewActionsBottomMarginPx(getMode(context), dp)
+ + OverviewActionsView.getOverviewActionsTopMarginPx(getMode(context), dp)
+ res.getDimensionPixelSize(R.dimen.overview_actions_height);
}
diff --git a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
index ff69180..9014774 100644
--- a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
@@ -41,7 +41,7 @@
import com.android.launcher3.statehandlers.DepthController;
import com.android.launcher3.statehandlers.DepthController.ClampedDepthProperty;
import com.android.launcher3.statemanager.StateManager;
-import com.android.launcher3.taskbar.TaskbarController;
+import com.android.launcher3.taskbar.LauncherTaskbarUIController;
import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.quickstep.GestureState.GestureEndTarget;
import com.android.quickstep.SysUINavigationMode.Mode;
@@ -163,12 +163,12 @@
}
@Nullable
- private TaskbarController getTaskbarController() {
+ private LauncherTaskbarUIController getTaskbarController() {
BaseQuickstepLauncher launcher = getCreatedActivity();
if (launcher == null) {
return null;
}
- return launcher.getTaskbarController();
+ return launcher.getTaskbarUIController();
}
@Nullable
@@ -276,13 +276,13 @@
@Override
public @Nullable Animator getParallelAnimationToLauncher(GestureEndTarget endTarget,
long duration) {
- TaskbarController taskbarController = getTaskbarController();
+ LauncherTaskbarUIController uiController = getTaskbarController();
Animator superAnimator = super.getParallelAnimationToLauncher(endTarget, duration);
- if (taskbarController == null) {
+ if (uiController == null) {
return superAnimator;
}
LauncherState toState = stateFromGestureEndTarget(endTarget);
- Animator taskbarAnimator = taskbarController.createAnimToLauncher(toState, duration);
+ Animator taskbarAnimator = uiController.createAnimToLauncher(toState, duration);
if (superAnimator == null) {
return taskbarAnimator;
} else {
@@ -300,20 +300,20 @@
@Override
public boolean deferStartingActivity(RecentsAnimationDeviceState deviceState, MotionEvent ev) {
- TaskbarController taskbarController = getTaskbarController();
- if (taskbarController == null) {
+ LauncherTaskbarUIController uiController = getTaskbarController();
+ if (uiController == null) {
return super.deferStartingActivity(deviceState, ev);
}
- return taskbarController.isEventOverAnyTaskbarItem(ev);
+ return uiController.isEventOverAnyTaskbarItem(ev);
}
@Override
public boolean shouldCancelCurrentGesture() {
- TaskbarController taskbarController = getTaskbarController();
- if (taskbarController == null) {
+ LauncherTaskbarUIController uiController = getTaskbarController();
+ if (uiController == null) {
return super.shouldCancelCurrentGesture();
}
- return taskbarController.isDraggingItem();
+ return uiController.isDraggingItem();
}
@Override
diff --git a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
index 811af7e..1bae1c5 100644
--- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
+++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
@@ -21,6 +21,7 @@
import static com.android.launcher3.Utilities.boundToRange;
import static com.android.launcher3.Utilities.dpToPx;
import static com.android.launcher3.config.FeatureFlags.PROTOTYPE_APP_CLOSE;
+import static com.android.launcher3.model.data.ItemInfo.NO_MATCHING_ID;
import static com.android.launcher3.views.FloatingIconView.SHAPE_PROGRESS_DURATION;
import static com.android.launcher3.views.FloatingIconView.getFloatingIconView;
@@ -234,7 +235,7 @@
// 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;
+ int launchCookieItemId = NO_MATCHING_ID;
for (IBinder cookie : launchCookies) {
Integer itemId = ObjectWrapper.unwrap(cookie);
if (itemId != null) {
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationController.java b/quickstep/src/com/android/quickstep/RecentsAnimationController.java
index f2bd916..462f714 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationController.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationController.java
@@ -16,7 +16,6 @@
package com.android.quickstep;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
-import static com.android.launcher3.util.Executors.THREAD_POOL_EXECUTOR;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import android.view.SurfaceControl;
@@ -102,7 +101,7 @@
*/
@UiThread
public void removeTaskTarget(@NonNull RemoteAnimationTargetCompat target) {
- THREAD_POOL_EXECUTOR.execute(() -> mController.removeTask(target.taskId));
+ UI_HELPER_EXECUTOR.execute(() -> mController.removeTask(target.taskId));
}
@UiThread
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
index e821e06..fa37901 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
@@ -561,7 +561,7 @@
return false;
}
- if (mIsOneHandedModeEnabled || mIsSwipeToNotificationEnabled) {
+ if (mIsOneHandedModeEnabled) {
final Info displayInfo = mDisplayController.getInfo();
return (mRotationTouchHelper.touchInOneHandedModeRegion(ev)
&& displayInfo.rotation != Surface.ROTATION_90
diff --git a/quickstep/src/com/android/quickstep/RotationTouchHelper.java b/quickstep/src/com/android/quickstep/RotationTouchHelper.java
index 070d725..fc7a3df 100644
--- a/quickstep/src/com/android/quickstep/RotationTouchHelper.java
+++ b/quickstep/src/com/android/quickstep/RotationTouchHelper.java
@@ -152,7 +152,7 @@
// Register for navigation mode changes
SysUINavigationMode.Mode newMode = mSysUiNavMode.addModeChangeListener(this);
- onNavigationModeChanged(newMode);
+ onNavModeChangedInternal(newMode, newMode.hasGestures);
runOnDestroy(() -> mSysUiNavMode.removeModeChangeListener(this));
mOrientationListener = new OrientationEventListener(mContext) {
@@ -245,13 +245,22 @@
@Override
public void onNavigationModeChanged(SysUINavigationMode.Mode newMode) {
+ onNavModeChangedInternal(newMode, false);
+ }
+
+ /**
+ * @param forceRegister if {@code true}, this will register {@link #mFrozenTaskListener} via
+ * {@link #setupOrientationSwipeHandler()}
+ */
+ private void onNavModeChangedInternal(SysUINavigationMode.Mode newMode, boolean forceRegister) {
mDisplayController.removeChangeListener(this);
mDisplayController.addChangeListener(this);
onDisplayInfoChanged(mContext, mDisplayController.getInfo(), CHANGE_ALL);
mOrientationTouchTransformer.setNavigationMode(newMode, mDisplayController.getInfo(),
- mContext.getResources());
- if (!mMode.hasGestures && newMode.hasGestures) {
+ mContext.getResources());
+
+ if (forceRegister || (!mMode.hasGestures && newMode.hasGestures)) {
setupOrientationSwipeHandler();
} else if (mMode.hasGestures && !newMode.hasGestures){
destroyOrientationSwipeHandlerCallback();
@@ -369,7 +378,7 @@
private void notifySysuiOfCurrentRotation(int rotation) {
UI_HELPER_EXECUTOR.execute(() -> SystemUiProxy.INSTANCE.get(mContext)
- .onQuickSwitchToNewTask(rotation));
+ .notifyPrioritizedRotation(rotation));
}
/**
diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java
index acf9992..d040904 100644
--- a/quickstep/src/com/android/quickstep/SystemUiProxy.java
+++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java
@@ -40,6 +40,8 @@
import com.android.systemui.shared.recents.ISystemUiProxy;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.system.RemoteTransitionCompat;
+import com.android.systemui.shared.system.smartspace.ISmartspaceCallback;
+import com.android.systemui.shared.system.smartspace.ISmartspaceTransitionController;
import com.android.wm.shell.onehanded.IOneHanded;
import com.android.wm.shell.pip.IPip;
import com.android.wm.shell.pip.IPipAnimationListener;
@@ -61,6 +63,7 @@
private ISystemUiProxy mSystemUiProxy;
private IPip mPip;
+ private ISmartspaceTransitionController mSmartspaceTransitionController;
private ISplitScreen mSplitScreen;
private IOneHanded mOneHanded;
private IShellTransitions mShellTransitions;
@@ -74,6 +77,7 @@
private IPipAnimationListener mPendingPipAnimationListener;
private ISplitScreenListener mPendingSplitScreenListener;
private IStartingWindowListener mPendingStartingWindowListener;
+ private ISmartspaceCallback mPendingSmartspaceCallback;
// Used to dedupe calls to SystemUI
private int mLastShelfHeight;
@@ -125,7 +129,8 @@
public void setProxy(ISystemUiProxy proxy, IPip pip, ISplitScreen splitScreen,
IOneHanded oneHanded, IShellTransitions shellTransitions,
- IStartingWindow startingWindow) {
+ IStartingWindow startingWindow,
+ ISmartspaceTransitionController smartSpaceTransitionController) {
unlinkToDeath();
mSystemUiProxy = proxy;
mPip = pip;
@@ -133,6 +138,7 @@
mOneHanded = oneHanded;
mShellTransitions = shellTransitions;
mStartingWindow = startingWindow;
+ mSmartspaceTransitionController = smartSpaceTransitionController;
linkToDeath();
// re-attach the listeners once missing due to setProxy has not been initialized yet.
if (mPendingPipAnimationListener != null && mPip != null) {
@@ -147,10 +153,14 @@
setStartingWindowListener(mPendingStartingWindowListener);
mPendingStartingWindowListener = null;
}
+ if (mPendingSmartspaceCallback != null && mSmartspaceTransitionController != null) {
+ setSmartspaceCallback(mPendingSmartspaceCallback);
+ mPendingSmartspaceCallback = null;
+ }
}
public void clearProxy() {
- setProxy(null, null, null, null, null, null);
+ setProxy(null, null, null, null, null, null, null);
}
// TODO(141886704): Find a way to remove this
@@ -341,6 +351,17 @@
}
}
+ @Override
+ public void notifySwipeUpGestureStarted() {
+ if (mSystemUiProxy != null) {
+ try {
+ mSystemUiProxy.notifySwipeUpGestureStarted();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed call notifySwipeUpGestureStarted", e);
+ }
+ }
+ }
+
/**
* Notifies that swipe-to-home action is finished.
*/
@@ -350,18 +371,18 @@
try {
mSystemUiProxy.notifySwipeToHomeFinished();
} catch (RemoteException e) {
- Log.w(TAG, "Failed call setPinnedStackAnimationType", e);
+ Log.w(TAG, "Failed call notifySwipeToHomeFinished", e);
}
}
}
@Override
- public void onQuickSwitchToNewTask(int rotation) {
+ public void notifyPrioritizedRotation(int rotation) {
if (mSystemUiProxy != null) {
try {
- mSystemUiProxy.onQuickSwitchToNewTask(rotation);
+ mSystemUiProxy.notifyPrioritizedRotation(rotation);
} catch (RemoteException e) {
- Log.w(TAG, "Failed call onQuickSwitchToNewTask with arg: " + rotation, e);
+ Log.w(TAG, "Failed call notifyPrioritizedRotation with arg: " + rotation, e);
}
}
}
@@ -631,4 +652,21 @@
mPendingStartingWindowListener = listener;
}
}
+
+
+ //
+ // SmartSpace transitions
+ //
+
+ public void setSmartspaceCallback(ISmartspaceCallback callback) {
+ if (mSmartspaceTransitionController != null) {
+ try {
+ mSmartspaceTransitionController.setSmartspace(callback);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed call setStartingWindowListener", e);
+ }
+ } else {
+ mPendingSmartspaceCallback = callback;
+ }
+ }
}
diff --git a/quickstep/src/com/android/quickstep/TaskShortcutFactory.java b/quickstep/src/com/android/quickstep/TaskShortcutFactory.java
index c06e9a9..4ec1c15 100644
--- a/quickstep/src/com/android/quickstep/TaskShortcutFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskShortcutFactory.java
@@ -231,7 +231,7 @@
@Override
public SystemShortcut getShortcut(BaseDraggingActivity activity, TaskView taskView) {
SystemShortcut shortcut = super.getShortcut(activity, taskView);
- if (FeatureFlags.ENABLE_SPLIT_SELECT.get()) {
+ if (shortcut != null && FeatureFlags.ENABLE_SPLIT_SELECT.get()) {
// Disable if there's only one recent app for split screen
shortcut.setEnabled(taskView.getRecentsView().getTaskViewCount() > 1);
}
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index d95f7b7..e52405b 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -30,6 +30,7 @@
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_SHELL_TRANSITIONS;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_SPLIT_SCREEN;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_STARTING_WINDOW;
+import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SMARTSPACE_TRANSITION_CONTROLLER;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_TRACING_ENABLED;
@@ -107,6 +108,7 @@
import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver;
import com.android.systemui.shared.system.InputConsumerController;
import com.android.systemui.shared.system.InputMonitorCompat;
+import com.android.systemui.shared.system.smartspace.ISmartspaceTransitionController;
import com.android.systemui.shared.tracing.ProtoTraceable;
import com.android.wm.shell.onehanded.IOneHanded;
import com.android.wm.shell.pip.IPip;
@@ -164,9 +166,13 @@
bundle.getBinder(KEY_EXTRA_SHELL_SHELL_TRANSITIONS));
IStartingWindow startingWindow = IStartingWindow.Stub.asInterface(
bundle.getBinder(KEY_EXTRA_SHELL_STARTING_WINDOW));
+ ISmartspaceTransitionController smartspaceTransitionController =
+ ISmartspaceTransitionController.Stub.asInterface(
+ bundle.getBinder(KEY_EXTRA_SMARTSPACE_TRANSITION_CONTROLLER));
MAIN_EXECUTOR.execute(() -> {
SystemUiProxy.INSTANCE.get(TouchInteractionService.this).setProxy(proxy, pip,
- splitscreen, onehanded, shellTransitions, startingWindow);
+ splitscreen, onehanded, shellTransitions, startingWindow,
+ smartspaceTransitionController);
TouchInteractionService.this.initInputMonitor();
preloadOverview(true /* fromInit */);
mDeviceState.runOnUserUnlocked(() -> {
@@ -325,6 +331,7 @@
mDeviceState.addNavigationModeChangedCallback(this::onNavigationModeChanged);
mDeviceState.addOneHandedModeChangedCallback(this::onOneHandedModeOverlayChanged);
mDeviceState.runOnUserUnlocked(this::onUserUnlocked);
+ mDeviceState.runOnUserUnlocked(mTaskbarManager::onUserUnlocked);
ProtoTracer.INSTANCE.get(this).add(this);
sConnected = true;
}
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OneHandedModeInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OneHandedModeInputConsumer.java
index 8d9c524..bc20902 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/OneHandedModeInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/OneHandedModeInputConsumer.java
@@ -147,12 +147,10 @@
}
private void onStartGestureDetected() {
- if (mDeviceState.isOneHandedModeEnabled()) {
- if (!mDeviceState.isOneHandedModeActive()) {
- SystemUiProxy.INSTANCE.get(mContext).startOneHandedMode();
- }
- } else if (mDeviceState.isSwipeToNotificationEnabled()) {
+ if (mDeviceState.isSwipeToNotificationEnabled()) {
SystemUiProxy.INSTANCE.get(mContext).expandNotificationPanel();
+ } else if (!mDeviceState.isOneHandedModeActive()) {
+ SystemUiProxy.INSTANCE.get(mContext).startOneHandedMode();
}
}
diff --git a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
index a0fb51c..a06f903 100644
--- a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
@@ -37,22 +37,26 @@
@Override
public Integer getIntroductionTitle() {
return mTutorialType == LEFT_EDGE_BACK_NAVIGATION
- ? R.string.back_gesture_intro_title : null;
+ ? R.string.back_left_gesture_intro_title : R.string.back_right_gesture_intro_title;
}
@Override
public Integer getIntroductionSubtitle() {
return mTutorialType == LEFT_EDGE_BACK_NAVIGATION
- ? R.string.back_gesture_intro_subtitle : null;
+ ? R.string.back_left_gesture_intro_subtitle
+ : R.string.back_right_gesture_intro_subtitle;
}
@Override
- protected int getMockAppTaskThumbnailResId() {
+ protected int getMockAppTaskThumbnailResId(boolean forDarkMode) {
return R.drawable.mock_conversation;
}
@Override
public void onBackGestureAttempted(BackGestureResult result) {
+ if (mGestureCompleted) {
+ return;
+ }
switch (mTutorialType) {
case RIGHT_EDGE_BACK_NAVIGATION:
handleAttemptFromRight(result);
@@ -76,9 +80,9 @@
hideFeedback(true);
mFakeTaskView.setBackground(AppCompatResources.getDrawable(mContext,
R.drawable.mock_conversations_list));
- int subtitleResId = mTutorialFragment.getNumSteps() == 1
+ int subtitleResId = mTutorialFragment.isAtFinalStep()
? R.string.back_gesture_feedback_complete_without_follow_up
- : R.string.back_gesture_feedback_complete_with_follow_up;
+ : R.string.back_gesture_feedback_complete_with_overview_follow_up;
showFeedback(subtitleResId, true);
break;
case BACK_CANCELLED_FROM_RIGHT:
@@ -102,10 +106,10 @@
hideFeedback(true);
mFakeTaskView.setBackground(AppCompatResources.getDrawable(mContext,
R.drawable.mock_conversations_list));
- showFeedback(
- R.string.back_gesture_feedback_title_complete_left_edge,
- R.string.back_gesture_feedback_subtitle_complete_left_edge,
- () -> mTutorialFragment.changeController(RIGHT_EDGE_BACK_NAVIGATION));
+ int subtitleResId = mTutorialFragment.isAtFinalStep()
+ ? R.string.back_gesture_feedback_complete_without_follow_up
+ : R.string.back_gesture_feedback_complete_with_back_right_follow_up;
+ showFeedback(subtitleResId, true);
break;
case BACK_CANCELLED_FROM_LEFT:
showFeedback(R.string.back_gesture_feedback_cancelled_left_edge);
@@ -123,6 +127,9 @@
@Override
public void onNavBarGestureAttempted(NavBarGestureResult result, PointF finalVelocity) {
+ if (mGestureCompleted) {
+ return;
+ }
if (mTutorialType == BACK_NAVIGATION_COMPLETE) {
if (result == NavBarGestureResult.HOME_GESTURE_COMPLETED) {
mTutorialFragment.closeTutorial();
diff --git a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialFragment.java
index 830d0ad..32f4c58 100644
--- a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialFragment.java
+++ b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialFragment.java
@@ -27,10 +27,14 @@
public class BackGestureTutorialFragment extends TutorialFragment {
@Nullable
@Override
- Integer getFeedbackVideoResId() {
+ Integer getFeedbackVideoResId(boolean forDarkMode) {
return mTutorialType == TutorialType.RIGHT_EDGE_BACK_NAVIGATION
- ? R.drawable.gesture_tutorial_motion_back_right
- : R.drawable.gesture_tutorial_motion_back_left;
+ ? (forDarkMode
+ ? R.drawable.gesture_tutorial_motion_back_right_dark_mode
+ : R.drawable.gesture_tutorial_motion_back_right_light_mode)
+ : (forDarkMode
+ ? R.drawable.gesture_tutorial_motion_back_left_dark_mode
+ : R.drawable.gesture_tutorial_motion_back_left_light_mode);
}
@Nullable
diff --git a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
index ff50a0e..83ce315 100644
--- a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
@@ -42,12 +42,15 @@
}
@Override
- protected int getMockAppTaskThumbnailResId() {
- return R.drawable.mock_webpage;
+ protected int getMockAppTaskThumbnailResId(boolean forDarkMode) {
+ return forDarkMode ? R.drawable.mock_webpage_dark_mode : R.drawable.mock_webpage_light_mode;
}
@Override
public void onBackGestureAttempted(BackGestureResult result) {
+ if (mGestureCompleted) {
+ return;
+ }
switch (mTutorialType) {
case HOME_NAVIGATION:
switch (result) {
@@ -70,7 +73,7 @@
@Override
public void onNavBarGestureAttempted(NavBarGestureResult result, PointF finalVelocity) {
- if (mHideFeedbackEndAction != null) {
+ if (mGestureCompleted) {
return;
}
switch (mTutorialType) {
@@ -80,7 +83,7 @@
mTutorialFragment.releaseGestureVideoView();
animateFakeTaskViewHome(finalVelocity, null);
showActionButton();
- int subtitleResId = mTutorialFragment.getNumSteps() == 1
+ int subtitleResId = mTutorialFragment.isAtFinalStep()
? R.string.home_gesture_feedback_complete_without_follow_up
: R.string.home_gesture_feedback_complete_with_follow_up;
showFeedback(subtitleResId, true);
diff --git a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialFragment.java
index 47964d2..9572637 100644
--- a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialFragment.java
+++ b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialFragment.java
@@ -24,8 +24,10 @@
public class HomeGestureTutorialFragment extends TutorialFragment {
@Nullable
@Override
- Integer getFeedbackVideoResId() {
- return R.drawable.gesture_tutorial_motion_home;
+ Integer getFeedbackVideoResId(boolean forDarkMode) {
+ return forDarkMode
+ ? R.drawable.gesture_tutorial_motion_home_dark_mode
+ : R.drawable.gesture_tutorial_motion_home_light_mode;
}
@Nullable
diff --git a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java
index 7b0961e..77ddb2b 100644
--- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java
@@ -49,12 +49,15 @@
}
@Override
- protected int getMockAppTaskThumbnailResId() {
+ protected int getMockAppTaskThumbnailResId(boolean forDarkMode) {
return R.drawable.mock_conversations_list;
}
@Override
public void onBackGestureAttempted(BackGestureResult result) {
+ if (mGestureCompleted) {
+ return;
+ }
switch (mTutorialType) {
case OVERVIEW_NAVIGATION:
switch (result) {
@@ -77,7 +80,7 @@
@Override
public void onNavBarGestureAttempted(NavBarGestureResult result, PointF finalVelocity) {
- if (mHideFeedbackEndAction != null) {
+ if (mGestureCompleted) {
return;
}
switch (mTutorialType) {
@@ -103,9 +106,10 @@
animset.start();
mRunningWindowAnim = SwipeUpAnimationLogic.RunningWindowAnim.wrap(animset);
onMotionPaused(true /*arbitrary value*/);
- int subtitleResId = mTutorialFragment.getNumSteps() == 1
- ? R.string.overview_gesture_feedback_complete_without_follow_up
- : R.string.overview_gesture_feedback_complete_with_follow_up;
+ int subtitleResId = mTutorialFragment.getNumSteps() > 1
+ && mTutorialFragment.isAtFinalStep()
+ ? R.string.overview_gesture_feedback_complete_with_follow_up
+ : R.string.overview_gesture_feedback_complete_without_follow_up;
showFeedback(subtitleResId, true);
break;
case HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION:
diff --git a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java
index c919b96..d2ec327 100644
--- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java
+++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialFragment.java
@@ -24,8 +24,10 @@
public class OverviewGestureTutorialFragment extends TutorialFragment {
@Nullable
@Override
- Integer getFeedbackVideoResId() {
- return R.drawable.gesture_tutorial_motion_overview;
+ Integer getFeedbackVideoResId(boolean forDarkMode) {
+ return forDarkMode
+ ? R.drawable.gesture_tutorial_motion_overview_dark_mode
+ : R.drawable.gesture_tutorial_motion_overview_light_mode;
}
@Nullable
diff --git a/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java
index 66e0400..b2183d6 100644
--- a/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java
@@ -72,7 +72,7 @@
private AnimatorListenerAdapter mResetTaskView = new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
- mFakeLauncherView.setVisibility(View.INVISIBLE);
+ mFakeHotseatView.setVisibility(View.INVISIBLE);
mFakeIconView.setVisibility(View.INVISIBLE);
if (mTutorialFragment.getActivity() != null) {
DisplayMetrics displayMetrics =
@@ -197,7 +197,7 @@
hideFeedback(true);
cancelRunningAnimation();
mFakePreviousTaskView.setVisibility(View.INVISIBLE);
- mFakeLauncherView.setVisibility(View.VISIBLE);
+ mFakeHotseatView.setVisibility(View.VISIBLE);
mShowPreviousTasks = false;
RectFSpringAnim rectAnim =
mTaskViewSwipeUpAnimation.handleSwipeUpToHome(finalVelocity);
@@ -214,7 +214,7 @@
@Override
public void setNavBarGestureProgress(@Nullable Float displacement) {
- if (mHideFeedbackEndAction != null) {
+ if (mGestureCompleted) {
return;
}
if (displacement != null) {
@@ -238,7 +238,7 @@
@Override
public void onMotionPaused(boolean unused) {
- if (mHideFeedbackEndAction != null) {
+ if (mGestureCompleted) {
return;
}
if (mShowTasks) {
@@ -299,7 +299,7 @@
@Override
public RectF getWindowTargetRect() {
int fakeHomeIconSizePx = Utilities.dpToPx(60);
- int fakeHomeIconLeft = mFakeLauncherView.getLeft();
+ int fakeHomeIconLeft = mFakeHotseatView.getLeft();
int fakeHomeIconTop = mDp.heightPx - Utilities.dpToPx(216);
return new RectF(fakeHomeIconLeft, fakeHomeIconTop,
fakeHomeIconLeft + fakeHomeIconSizePx,
diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialController.java b/quickstep/src/com/android/quickstep/interaction/TutorialController.java
index f9d5c94..c9da609 100644
--- a/quickstep/src/com/android/quickstep/interaction/TutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/TutorialController.java
@@ -15,6 +15,8 @@
*/
package com.android.quickstep.interaction;
+import static android.view.View.GONE;
+
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.drawable.Animatable2;
@@ -25,19 +27,22 @@
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.Button;
-import android.widget.ImageButton;
import android.widget.ImageView;
+import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.CallSuper;
import androidx.annotation.DrawableRes;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.content.res.AppCompatResources;
import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.views.ClipIconView;
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureAttemptCallback;
@@ -51,7 +56,6 @@
private static final String PIXEL_TIPS_APP_PACKAGE_NAME = "com.google.android.apps.tips";
private static final CharSequence DEFAULT_PIXEL_TIPS_APP_NAME = "Pixel Tips";
- private static final int FEEDBACK_VISIBLE_MS = 2500;
private static final int FEEDBACK_ANIMATION_MS = 250;
private static final int RIPPLE_VISIBLE_MS = 300;
@@ -59,22 +63,23 @@
TutorialType mTutorialType;
final Context mContext;
- final ImageButton mCloseButton;
+ final TextView mCloseButton;
final ViewGroup mFeedbackView;
final ImageView mFeedbackVideoView;
final ImageView mGestureVideoView;
- final ImageView mFakeLauncherView;
+ final RelativeLayout mFakeLauncherView;
+ final ImageView mFakeHotseatView;
final ClipIconView mFakeIconView;
final View mFakeTaskView;
final View mFakePreviousTaskView;
final View mRippleView;
final RippleDrawable mRippleDrawable;
final Button mActionButton;
- final TextView mTutorialStepView;
- private final Runnable mHideFeedbackRunnable;
- Runnable mHideFeedbackEndAction;
+ final TutorialStepIndicator mTutorialStepView;
private final AlertDialog mSkipTutorialDialog;
+ protected boolean mGestureCompleted = false;
+
TutorialController(TutorialFragment tutorialFragment, TutorialType tutorialType) {
mTutorialFragment = tutorialFragment;
mTutorialType = tutorialType;
@@ -87,6 +92,7 @@
mFeedbackVideoView = rootView.findViewById(R.id.gesture_tutorial_feedback_video);
mGestureVideoView = rootView.findViewById(R.id.gesture_tutorial_gesture_video);
mFakeLauncherView = rootView.findViewById(R.id.gesture_tutorial_fake_launcher_view);
+ mFakeHotseatView = rootView.findViewById(R.id.gesture_tutorial_fake_hotseat_view);
mFakeIconView = rootView.findViewById(R.id.gesture_tutorial_fake_icon_view);
mFakeTaskView = rootView.findViewById(R.id.gesture_tutorial_fake_task_view);
mFakePreviousTaskView =
@@ -97,12 +103,6 @@
mTutorialStepView =
rootView.findViewById(R.id.gesture_tutorial_fragment_feedback_tutorial_step);
mSkipTutorialDialog = createSkipTutorialDialog();
-
- mHideFeedbackRunnable =
- () -> mFeedbackView.animate()
- .translationY(-mFeedbackView.getTop() - mFeedbackView.getHeight())
- .setDuration(FEEDBACK_ANIMATION_MS)
- .withEndAction(this::hideFeedbackEndAction).start();
}
private void showSkipTutorialDialog() {
@@ -116,12 +116,12 @@
}
@DrawableRes
- protected int getMockLauncherResId() {
+ protected int getMockHotseatResId() {
return R.drawable.default_sandbox_mock_launcher;
}
@DrawableRes
- protected int getMockAppTaskThumbnailResId() {
+ protected int getMockAppTaskThumbnailResId(boolean forDarkMode) {
return R.drawable.default_sandbox_app_task_thumbnail;
}
@@ -154,6 +154,25 @@
return null;
}
+ void showFeedback() {
+ if (mGestureCompleted) {
+ mFeedbackView.setTranslationY(0);
+ return;
+ }
+ AnimatedVectorDrawable tutorialAnimation = mTutorialFragment.getTutorialAnimation();
+ AnimatedVectorDrawable gestureAnimation = mTutorialFragment.getGestureAnimation();
+
+ if (tutorialAnimation != null && gestureAnimation != null) {
+ TextView title = mFeedbackView.findViewById(
+ R.id.gesture_tutorial_fragment_feedback_title);
+
+ playFeedbackVideo(tutorialAnimation, gestureAnimation, () -> {
+ mFeedbackView.setTranslationY(0);
+ title.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
+ });
+ }
+ }
+
/**
* Show feedback reflecting a failed gesture attempt.
*
@@ -164,98 +183,49 @@
}
/**
- * Show feedback reflecting a failed gesture attempt.
- *
- * @param showActionButton Whether the tutorial feedback's action button should be shown.
- **/
- void showFeedback(int subtitleResId, boolean showActionButton) {
- showFeedback(subtitleResId, showActionButton ? () -> {} : null, showActionButton);
- }
-
- /**
- * Show feedback reflecting a failed gesture attempt.
- **/
- void showFeedback(int titleResId, int subtitleResId, @Nullable Runnable successEndAction) {
- showFeedback(titleResId, subtitleResId, successEndAction, false);
- }
-
- /**
* Show feedback reflecting the result of a gesture attempt.
*
- * @param successEndAction Non-null iff the gesture was successful; this is run after the
- * feedback is shown (i.e. to go to the next step)
+ * @param isGestureSuccessful Whether the tutorial feedback's action button should be shown.
**/
- void showFeedback(
- int subtitleResId, @Nullable Runnable successEndAction, boolean showActionButton) {
+ void showFeedback(int subtitleResId, boolean isGestureSuccessful) {
showFeedback(
- successEndAction == null
- ? R.string.gesture_tutorial_try_again
- : R.string.gesture_tutorial_nice,
+ isGestureSuccessful
+ ? R.string.gesture_tutorial_nice : R.string.gesture_tutorial_try_again,
subtitleResId,
- successEndAction,
- showActionButton);
+ isGestureSuccessful);
}
+
void showFeedback(
int titleResId,
int subtitleResId,
- @Nullable Runnable successEndAction,
- boolean showActionButton) {
- if (mHideFeedbackEndAction != null) {
- return;
- }
+ boolean isGestureSuccessful) {
TextView title = mFeedbackView.findViewById(R.id.gesture_tutorial_fragment_feedback_title);
title.setText(titleResId);
TextView subtitle =
mFeedbackView.findViewById(R.id.gesture_tutorial_fragment_feedback_subtitle);
subtitle.setText(subtitleResId);
- if (showActionButton) {
+ if (isGestureSuccessful) {
showActionButton();
}
- mHideFeedbackEndAction = successEndAction;
+ mGestureCompleted = isGestureSuccessful;
AnimatedVectorDrawable tutorialAnimation = mTutorialFragment.getTutorialAnimation();
AnimatedVectorDrawable gestureAnimation = mTutorialFragment.getGestureAnimation();
if (tutorialAnimation != null && gestureAnimation != null) {
- if (successEndAction == null) {
- if (tutorialAnimation.isRunning()) {
- tutorialAnimation.reset();
- }
- tutorialAnimation.registerAnimationCallback(new Animatable2.AnimationCallback() {
-
- @Override
- public void onAnimationStart(Drawable drawable) {
- super.onAnimationStart(drawable);
-
- mGestureVideoView.setVisibility(View.GONE);
- if (gestureAnimation.isRunning()) {
- gestureAnimation.stop();
- }
-
- mFeedbackView.setTranslationY(
- -mFeedbackView.getHeight() - mFeedbackView.getTop());
- mFeedbackView.setVisibility(View.VISIBLE);
- mFeedbackView.animate()
- .setDuration(FEEDBACK_ANIMATION_MS)
- .translationY(0)
- .start();
- }
-
- @Override
- public void onAnimationEnd(Drawable drawable) {
- super.onAnimationEnd(drawable);
-
- mGestureVideoView.setVisibility(View.VISIBLE);
- gestureAnimation.start();
-
- mFeedbackView.removeCallbacks(mHideFeedbackRunnable);
- mFeedbackView.post(mHideFeedbackRunnable);
-
- tutorialAnimation.unregisterAnimationCallback(this);
- }
+ if (!isGestureSuccessful) {
+ playFeedbackVideo(tutorialAnimation, gestureAnimation, () -> {
+ mFeedbackView.setTranslationY(
+ -mFeedbackView.getHeight() - mFeedbackView.getTop());
+ mFeedbackView.setVisibility(View.VISIBLE);
+ mFeedbackView.animate()
+ .setDuration(FEEDBACK_ANIMATION_MS)
+ .translationY(0)
+ .start();
+ title.postDelayed(
+ () -> title.sendAccessibilityEvent(
+ AccessibilityEvent.TYPE_VIEW_FOCUSED),
+ FEEDBACK_ANIMATION_MS);
});
-
- tutorialAnimation.start();
- mFeedbackVideoView.setVisibility(View.VISIBLE);
return;
} else {
mTutorialFragment.releaseFeedbackVideoView();
@@ -267,15 +237,13 @@
.setDuration(FEEDBACK_ANIMATION_MS)
.translationY(0)
.start();
- mFeedbackView.removeCallbacks(mHideFeedbackRunnable);
- if (!showActionButton) {
- mFeedbackView.postDelayed(mHideFeedbackRunnable, FEEDBACK_VISIBLE_MS);
- }
+ title.postDelayed(
+ () -> title.sendAccessibilityEvent(
+ AccessibilityEvent.TYPE_VIEW_FOCUSED),
+ FEEDBACK_ANIMATION_MS);
}
void hideFeedback(boolean releaseFeedbackVideo) {
- mFeedbackView.removeCallbacks(mHideFeedbackRunnable);
- mHideFeedbackEndAction = null;
mFeedbackView.clearAnimation();
mFeedbackView.setVisibility(View.INVISIBLE);
if (releaseFeedbackVideo) {
@@ -283,11 +251,41 @@
}
}
- void hideFeedbackEndAction() {
- if (mHideFeedbackEndAction != null) {
- mHideFeedbackEndAction.run();
- mHideFeedbackEndAction = null;
+ private void playFeedbackVideo(
+ @NonNull AnimatedVectorDrawable tutorialAnimation,
+ @NonNull AnimatedVectorDrawable gestureAnimation,
+ @NonNull Runnable onStartRunnable) {
+
+ if (tutorialAnimation.isRunning()) {
+ tutorialAnimation.reset();
}
+ tutorialAnimation.registerAnimationCallback(new Animatable2.AnimationCallback() {
+
+ @Override
+ public void onAnimationStart(Drawable drawable) {
+ super.onAnimationStart(drawable);
+
+ mGestureVideoView.setVisibility(GONE);
+ if (gestureAnimation.isRunning()) {
+ gestureAnimation.stop();
+ }
+
+ onStartRunnable.run();
+ }
+
+ @Override
+ public void onAnimationEnd(Drawable drawable) {
+ super.onAnimationEnd(drawable);
+
+ mGestureVideoView.setVisibility(View.VISIBLE);
+ gestureAnimation.start();
+
+ tutorialAnimation.unregisterAnimationCallback(this);
+ }
+ });
+
+ tutorialAnimation.start();
+ mFeedbackVideoView.setVisibility(View.VISIBLE);
}
void setRippleHotspot(float x, float y) {
@@ -316,38 +314,32 @@
updateSubtext();
updateDrawables();
- if (mFakeLauncherView != null) {
- mFakeLauncherView.setVisibility(View.INVISIBLE);
+ mGestureCompleted = false;
+ if (mFakeHotseatView != null) {
+ mFakeHotseatView.setVisibility(View.INVISIBLE);
}
}
void hideActionButton() {
+ mCloseButton.setVisibility(View.VISIBLE);
+ mCloseButton.setTextAppearance(Utilities.isDarkTheme(mContext)
+ ? R.style.TextAppearance_GestureTutorial_Feedback_Subtext
+ : R.style.TextAppearance_GestureTutorial_Feedback_Subtext_Dark);
+
// Invisible to maintain the layout.
mActionButton.setVisibility(View.INVISIBLE);
mActionButton.setOnClickListener(null);
}
void showActionButton() {
- int stringResId = -1;
-
- if (mContext instanceof GestureSandboxActivity) {
- GestureSandboxActivity sandboxActivity = (GestureSandboxActivity) mContext;
-
- stringResId = sandboxActivity.isTutorialComplete()
- ? R.string.gesture_tutorial_action_button_label_done
- : R.string.gesture_tutorial_action_button_label_next;
- }
-
- mActionButton.setText(stringResId == -1 ? null : mContext.getString(stringResId));
+ mCloseButton.setVisibility(GONE);
mActionButton.setVisibility(View.VISIBLE);
mActionButton.setOnClickListener(this::onActionButtonClicked);
}
private void updateSubtext() {
- mTutorialStepView.setText(mContext.getString(
- R.string.gesture_tutorial_step,
- mTutorialFragment.getCurrentStep(),
- mTutorialFragment.getNumSteps()));
+ mTutorialStepView.setTutorialProgress(
+ mTutorialFragment.getCurrentStep(), mTutorialFragment.getNumSteps());
}
private void updateDrawables() {
@@ -355,10 +347,14 @@
mTutorialFragment.getRootView().setBackground(AppCompatResources.getDrawable(
mContext, getMockWallpaperResId()));
mTutorialFragment.updateFeedbackVideo();
- mFakeLauncherView.setImageDrawable(AppCompatResources.getDrawable(
- mContext, getMockLauncherResId()));
+ mFakeLauncherView.setBackgroundColor(
+ mContext.getColor(Utilities.isDarkTheme(mContext)
+ ? R.color.fake_wallpaper_color_dark_mode
+ : R.color.fake_wallpaper_color_light_mode));
+ mFakeHotseatView.setImageDrawable(AppCompatResources.getDrawable(
+ mContext, getMockHotseatResId()));
mFakeTaskView.setBackground(AppCompatResources.getDrawable(
- mContext, getMockAppTaskThumbnailResId()));
+ mContext, getMockAppTaskThumbnailResId(Utilities.isDarkTheme(mContext))));
mFakeTaskView.animate().alpha(1).setListener(
AnimatorListeners.forSuccessCallback(() -> mFakeTaskView.animate().cancel()));
mFakePreviousTaskView.setBackground(AppCompatResources.getDrawable(
diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java
index 0220f2d..ec26022 100644
--- a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java
+++ b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java
@@ -38,6 +38,7 @@
import androidx.fragment.app.FragmentActivity;
import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
import com.android.quickstep.interaction.TutorialController.TutorialType;
abstract class TutorialFragment extends Fragment implements OnTouchListener {
@@ -57,6 +58,8 @@
@Nullable private AnimatedVectorDrawable mGestureAnimation = null;
private boolean mIntroductionShown = false;
+ private boolean mFragmentStopped = false;
+
public static TutorialFragment newInstance(TutorialType tutorialType) {
TutorialFragment fragment = getFragmentForTutorialType(tutorialType);
if (fragment == null) {
@@ -94,7 +97,7 @@
return null;
}
- @Nullable Integer getFeedbackVideoResId() {
+ @Nullable Integer getFeedbackVideoResId(boolean forDarkMode) {
return null;
}
@@ -154,6 +157,8 @@
public void onStop() {
super.onStop();
releaseFeedbackVideoView();
+ releaseGestureVideoView();
+ mFragmentStopped = true;
}
void initializeFeedbackVideoView() {
@@ -165,16 +170,19 @@
Integer introTileStringResId = mTutorialController.getIntroductionTitle();
Integer introSubtitleResId = mTutorialController.getIntroductionSubtitle();
if (introTileStringResId != null && introSubtitleResId != null) {
- mTutorialController.showFeedback(introTileStringResId,
- introSubtitleResId, null, false);
+ mTutorialController.showFeedback(introTileStringResId, introSubtitleResId, false);
mIntroductionShown = true;
}
}
}
boolean updateFeedbackVideo() {
- Integer feedbackVideoResId = getFeedbackVideoResId();
- if (feedbackVideoResId == null || getContext() == null || !updateGestureVideo()) {
+ if (getContext() == null) {
+ return false;
+ }
+ Integer feedbackVideoResId = getFeedbackVideoResId(Utilities.isDarkTheme(getContext()));
+
+ if (feedbackVideoResId == null || !updateGestureVideo()) {
return false;
}
mTutorialAnimation = (AnimatedVectorDrawable) getContext().getDrawable(feedbackVideoResId);
@@ -244,7 +252,12 @@
@Override
public void onResume() {
super.onResume();
- changeController(mTutorialType);
+ if (mFragmentStopped) {
+ mTutorialController.showFeedback();
+ mFragmentStopped = false;
+ } else {
+ changeController(mTutorialType);
+ }
}
@Override
@@ -326,6 +339,10 @@
return gestureSandboxActivity == null ? -1 : gestureSandboxActivity.getNumSteps();
}
+ boolean isAtFinalStep() {
+ return getCurrentStep() == getNumSteps();
+ }
+
@Nullable
private GestureSandboxActivity getGestureSandboxActivity() {
Context context = getContext();
diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialStepIndicator.java b/quickstep/src/com/android/quickstep/interaction/TutorialStepIndicator.java
new file mode 100644
index 0000000..eda6158
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/interaction/TutorialStepIndicator.java
@@ -0,0 +1,118 @@
+/*
+ * 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.
+ */
+package com.android.quickstep.interaction;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import androidx.appcompat.content.res.AppCompatResources;
+
+import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
+import com.android.launcher3.icons.GraphicsUtils;
+
+/** Indicator displaying the current progress through the gesture navigation tutorial. */
+public class TutorialStepIndicator extends LinearLayout {
+
+ private static final String LOG_TAG = "TutorialStepIndicator";
+
+ private int mCurrentStep = -1;
+ private int mTotalSteps = -1;
+
+ public TutorialStepIndicator(Context context) {
+ super(context);
+ }
+
+ public TutorialStepIndicator(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public TutorialStepIndicator(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public TutorialStepIndicator(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ /**
+ * Updates this indicator to display totalSteps indicator pills, with the first currentStep
+ * pills highlighted.
+ */
+ public void setTutorialProgress(int currentStep, int totalSteps) {
+ if (currentStep <= 0) {
+ Log.w(LOG_TAG, "Current step number invalid: " + currentStep + ". Assuming step 1.");
+ currentStep = 1;
+ }
+ if (totalSteps <= 0) {
+ Log.w(LOG_TAG, "Total number of steps invalid: " + totalSteps + ". Assuming 1 step.");
+ totalSteps = 1;
+ }
+ if (currentStep > totalSteps) {
+ Log.w(LOG_TAG, "Current step number greater than the total number of steps. Assuming"
+ + " final step.");
+ currentStep = totalSteps;
+ }
+ if (totalSteps < 2) {
+ setVisibility(GONE);
+ return;
+ }
+ setVisibility(VISIBLE);
+ mCurrentStep = currentStep;
+ mTotalSteps = totalSteps;
+
+ initializeStepIndicators();
+ }
+
+ private void initializeStepIndicators() {
+ for (int i = mTotalSteps; i < getChildCount(); i++) {
+ removeViewAt(i);
+ }
+ for (int i = 0; i < mTotalSteps; i++) {
+ Drawable pageIndicatorPillDrawable = AppCompatResources.getDrawable(
+ getContext(), R.drawable.tutorial_step_indicator_pill);
+
+ if (i >= getChildCount()) {
+ ImageView pageIndicatorPill = new ImageView(getContext());
+ pageIndicatorPill.setImageDrawable(pageIndicatorPillDrawable);
+
+ LinearLayout.LayoutParams lp = new LayoutParams(
+ LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+
+ lp.setMarginStart(Utilities.dpToPx(3));
+ lp.setMarginEnd(Utilities.dpToPx(3));
+
+ addView(pageIndicatorPill, lp);
+ }
+ if (pageIndicatorPillDrawable != null) {
+ if (i < mCurrentStep) {
+ pageIndicatorPillDrawable.setTint(
+ GraphicsUtils.getAttrColor(getContext(),
+ android.R.attr.textColorPrimary));
+ } else {
+ pageIndicatorPillDrawable.setTint(
+ GraphicsUtils.getAttrColor(getContext(),
+ android.R.attr.textColorPrimaryInverse));
+ }
+ }
+ }
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/util/OverviewToHomeAnim.java b/quickstep/src/com/android/quickstep/util/OverviewToHomeAnim.java
index badb41a..5cf4f0b 100644
--- a/quickstep/src/com/android/quickstep/util/OverviewToHomeAnim.java
+++ b/quickstep/src/com/android/quickstep/util/OverviewToHomeAnim.java
@@ -78,6 +78,10 @@
}
StateAnimationConfig config = new StateAnimationConfig();
+ if (playWorkspaceRevealAnim) {
+ // WorkspaceRevealAnim handles the depth, so don't interfere.
+ config.animFlags |= StateAnimationConfig.SKIP_DEPTH_CONTROLLER;
+ }
config.duration = startState.getTransitionDuration(mLauncher);
AnimatorSet stateAnim = stateManager.createAtomicAnimation(
startState, NORMAL, config);
diff --git a/quickstep/src/com/android/quickstep/util/RectFSpringAnim2.java b/quickstep/src/com/android/quickstep/util/RectFSpringAnim2.java
index 97be2b1..93b3482 100644
--- a/quickstep/src/com/android/quickstep/util/RectFSpringAnim2.java
+++ b/quickstep/src/com/android/quickstep/util/RectFSpringAnim2.java
@@ -34,8 +34,6 @@
import androidx.dynamicanimation.animation.SpringAnimation;
import androidx.dynamicanimation.animation.SpringForce;
-import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.util.DynamicResource;
@@ -43,7 +41,7 @@
import java.util.ArrayList;
import java.util.List;
-
+import java.util.Locale;
/**
* Applies spring forces to animate from a starting rect to a target rect,
@@ -193,12 +191,8 @@
* @param velocityPxPerMs Velocity of swipe in px/ms.
*/
public void start(Context context, PointF velocityPxPerMs) {
- DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(context).getDeviceProfile(context);
-
mRectXAnim = new SpringAnimation(this, RECT_CENTER_X)
.setStartValue(mCurrentCenterX)
- .setMinValue(Math.min(0, mCurrentCenterX))
- .setMaxValue(Math.max(dp.widthPx, mCurrentCenterX))
.setStartVelocity(velocityPxPerMs.x * 1000)
.setSpring(new SpringForce(mTargetX)
.setStiffness(mXStiffness)
@@ -210,8 +204,6 @@
mRectYAnim = new SpringAnimation(this, RECT_Y)
.setStartValue(mCurrentCenterY)
- .setMinValue(Math.min(0, mCurrentCenterY))
- .setMaxValue(Math.max(dp.heightPx, mCurrentCenterY))
.setStartVelocity(velocityPxPerMs.y * 1000)
.setSpring(new SpringForce(mTargetY)
.setStiffness(mYStiffness)
@@ -361,7 +353,8 @@
private Interpolator getAppCloseInterpolator(Context context) {
ResourceProvider rp = DynamicResource.provider(context);
- String path = String.format("M 0,0 C %f, %f, %f, %f, %f, %f C %f, %f, %f, %f, 1, 1",
+ String path = String.format(Locale.ENGLISH,
+ "M 0,0 C %f, %f, %f, %f, %f, %f C %f, %f, %f, %f, 1, 1",
rp.getFloat(R.dimen.c1_a),
rp.getFloat(R.dimen.c1_b),
rp.getFloat(R.dimen.c1_c),
diff --git a/quickstep/src/com/android/quickstep/views/AllAppsEduView.java b/quickstep/src/com/android/quickstep/views/AllAppsEduView.java
index 97a239c..00993e3 100644
--- a/quickstep/src/com/android/quickstep/views/AllAppsEduView.java
+++ b/quickstep/src/com/android/quickstep/views/AllAppsEduView.java
@@ -23,6 +23,7 @@
import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_7;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ALL_APPS_EDU_SHOWN;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_ALL_APPS_FADE;
+import static com.android.launcher3.states.StateAnimationConfig.ANIM_SCRIM_FADE;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -58,6 +59,9 @@
*/
public class AllAppsEduView extends AbstractFloatingView {
+ private static final float HINT_PROG_SCRIM_THRESHOLD = 0.06f;
+ private static final float HINT_PROG_CONTENT_THRESHOLD = 0.08f;
+
private Launcher mLauncher;
private AnimatorSet mAnimation;
@@ -143,7 +147,9 @@
StateAnimationConfig config = new StateAnimationConfig();
config.setInterpolator(ANIM_ALL_APPS_FADE, Interpolators.clampToProgress(ACCEL,
- 0, 0.08f));
+ HINT_PROG_SCRIM_THRESHOLD, HINT_PROG_CONTENT_THRESHOLD));
+ config.setInterpolator(ANIM_SCRIM_FADE,
+ Interpolators.clampToProgress(ACCEL, 0, HINT_PROG_CONTENT_THRESHOLD));
config.duration = secondPart;
config.userControlled = false;
AnimatorPlaybackController stateAnimationController =
@@ -153,6 +159,8 @@
AllAppsTransitionController allAppsController = mLauncher.getAllAppsController();
PendingAnimation allAppsAlpha = new PendingAnimation(config.duration);
allAppsController.setAlphas(ALL_APPS, config, allAppsAlpha);
+ mLauncher.getWorkspace().getStateTransitionAnimation().setScrim(allAppsAlpha, ALL_APPS,
+ config);
mAnimation.play(allAppsAlpha.buildAnim());
ValueAnimator intro = ValueAnimator.ofFloat(0, 1f);
@@ -219,11 +227,11 @@
int accentColor = Themes.getColorAccent(launcher);
mGradient = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
Themes.getAttrBoolean(launcher, R.attr.isMainColorDark)
- ? new int[] {0xB3FFFFFF, 0x00FFFFFF}
- : new int[] {ColorUtils.setAlphaComponent(accentColor, 127),
+ ? new int[]{0xB3FFFFFF, 0x00FFFFFF}
+ : new int[]{ColorUtils.setAlphaComponent(accentColor, 127),
ColorUtils.setAlphaComponent(accentColor, 0)});
float r = mWidthPx / 2f;
- mGradient.setCornerRadii(new float[] {r, r, r, r, 0, 0, 0, 0});
+ mGradient.setCornerRadii(new float[]{r, r, r, r, 0, 0, 0, 0});
int top = mMaxHeightPx - mCircleSizePx + mPaddingPx;
mCircle.setBounds(mPaddingPx, top, mPaddingPx + mCircleSizePx, top + mCircleSizePx);
diff --git a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
index 9adeea4..8c115e5 100644
--- a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
+++ b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
@@ -93,6 +93,8 @@
private float mModalness;
private float mModalTransformY;
+ protected DeviceProfile mDp;
+
public OverviewActionsView(Context context) {
this(context, null);
}
@@ -205,36 +207,25 @@
/** Updates vertical margins for different navigation mode or configuration changes. */
public void updateVerticalMargin(Mode mode) {
+ if (mDp == null) {
+ return;
+ }
LayoutParams actionParams = (LayoutParams) findViewById(
R.id.action_buttons).getLayoutParams();
actionParams.setMargins(
- actionParams.leftMargin, actionParams.topMargin, actionParams.rightMargin,
- getBottomVerticalMargin(mode));
+ actionParams.leftMargin, getOverviewActionsTopMarginPx(mode, mDp),
+ actionParams.rightMargin, getOverviewActionsBottomMarginPx(mode, mDp));
}
/**
* Set the device profile for this view to draw with.
*/
public void setDp(DeviceProfile dp) {
+ mDp = dp;
+ updateVerticalMargin(SysUINavigationMode.getMode(getContext()));
requestLayout();
}
- protected int getBottomVerticalMargin(Mode mode) {
- int bottomMargin;
- int orientation = getResources().getConfiguration().orientation;
- if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
- bottomMargin = 0;
- } else if (mode == Mode.THREE_BUTTONS) {
- bottomMargin = getResources()
- .getDimensionPixelSize(R.dimen.overview_actions_bottom_margin_three_button);
- } else {
- bottomMargin = getResources()
- .getDimensionPixelSize(R.dimen.overview_actions_bottom_margin_gesture);
- }
- bottomMargin += mInsets.bottom;
- return bottomMargin;
- }
-
/**
* The current task is fully modal (modalness = 1) when it is shown on its own in a modal
* way. Modalness 0 means the task is shown in context with all the other tasks.
@@ -257,4 +248,35 @@
float progress = ACCEL_DEACCEL.getInterpolation(mModalness);
return Utilities.mapRange(progress, 0, endTranslation);
}
+
+ /** Get the top margin associated with the action buttons in Overview. */
+ public static int getOverviewActionsTopMarginPx(
+ SysUINavigationMode.Mode mode, DeviceProfile dp) {
+ // In vertical bar, use the smaller task margin for the top regardless of mode
+ if (dp.isVerticalBarLayout()) {
+ return dp.overviewTaskMarginPx;
+ }
+
+ if (mode == SysUINavigationMode.Mode.THREE_BUTTONS) {
+ return dp.overviewActionsMarginThreeButtonPx;
+ }
+
+ return dp.overviewActionsMarginGesturePx;
+ }
+
+ /** Get the bottom margin associated with the action buttons in Overview. */
+ public static int getOverviewActionsBottomMarginPx(
+ SysUINavigationMode.Mode mode, DeviceProfile dp) {
+ int inset = dp.getInsets().bottom;
+
+ if (dp.isVerticalBarLayout()) {
+ return inset;
+ }
+
+ if (mode == SysUINavigationMode.Mode.THREE_BUTTONS) {
+ return dp.overviewActionsMarginThreeButtonPx + inset;
+ }
+
+ return dp.overviewActionsMarginGesturePx + inset;
+ }
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 64c3174..a0bba86 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -388,6 +388,8 @@
private final TaskOverlayFactory mTaskOverlayFactory;
+ private int mOrientation;
+
protected boolean mDisallowScrollToClearAll;
private boolean mOverlayEnabled;
protected boolean mFreezeViewVisibility;
@@ -581,6 +583,7 @@
.getDimensionPixelSize(R.dimen.recents_fast_fling_velocity);
mModel = RecentsModel.INSTANCE.get(context);
mIdp = InvariantDeviceProfile.INSTANCE.get(context);
+ mOrientation = getResources().getConfiguration().orientation;
mClearAllButton = (ClearAllButton) LayoutInflater.from(context)
.inflate(R.layout.overview_clear_all_button, this, false);
@@ -1558,6 +1561,7 @@
mRecentsAnimationController = null;
}
}
+ setEnableDrawingLiveTile(false);
mLiveTileParams.setTargetSet(null);
mLiveTileTaskViewSimulator.setDrawsBelowRecents(true);
@@ -2612,10 +2616,23 @@
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
- final int rotation = mActivity.getDisplay().getRotation();
- if (mOrientationState.setRecentsRotation(rotation)) {
- updateOrientationHandler();
+ if (LIVE_TILE.get() && mEnableDrawingLiveTile && newConfig.orientation != mOrientation) {
+ switchToScreenshot(
+ () -> finishRecentsAnimation(true /* toRecents */,
+ this::updateRecentsRotation));
+ mEnableDrawingLiveTile = false;
+ } else {
+ updateRecentsRotation();
}
+ mOrientation = newConfig.orientation;
+ }
+
+ /**
+ * Updates {@link RecentsOrientedState}'s cached RecentsView rotation.
+ */
+ public void updateRecentsRotation() {
+ final int rotation = mActivity.getDisplay().getRotation();
+ mOrientationState.setRecentsRotation(rotation);
}
public void setLayoutRotation(int touchRotation, int displayRotation) {
diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
index bff1013..c97225e 100644
--- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
@@ -24,6 +24,7 @@
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Outline;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.Gravity;
@@ -195,7 +196,7 @@
private void addMenuOptions(TaskView taskView) {
mTaskName.setText(TaskUtils.getTitle(getContext(), taskView.getTask()));
mTaskName.setOnClickListener(v -> close(true));
-
+
TaskOverlayFactory.getEnabledShortcuts(taskView, mActivity.getDeviceProfile())
.forEach(this::addMenuOption);
}
@@ -227,18 +228,24 @@
private void orientAroundTaskView(TaskView taskView) {
PagedOrientationHandler orientationHandler = taskView.getPagedOrientationHandler();
measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ float taskInsetMargin = getResources().getDimension(R.dimen.task_card_margin);
+ orientationHandler.setTaskMenuAroundTaskView(this, taskInsetMargin);
mActivity.getDragLayer().getDescendantRectRelativeToSelf(taskView, sTempRect);
Rect insets = mActivity.getDragLayer().getInsets();
BaseDragLayer.LayoutParams params = (BaseDragLayer.LayoutParams) getLayoutParams();
- // TODO(b/186583656) Move the entire menu to the center/make smaller than thumbnail width
- params.width = orientationHandler.getTaskMenuWidth(taskView.getThumbnail());
+ int padding = getResources()
+ .getDimensionPixelSize(R.dimen.task_menu_vertical_padding);
+ params.width = orientationHandler.getTaskMenuWidth(taskView.getThumbnail()) - (2 * padding);
// Gravity set to Left instead of Start as sTempRect.left measures Left distance not Start
params.gravity = Gravity.LEFT;
setLayoutParams(params);
setScaleX(taskView.getScaleX());
setScaleY(taskView.getScaleY());
- orientationHandler.setTaskMenuLayoutOrientation(
+ orientationHandler.setTaskOptionsMenuLayoutOrientation(
mActivity.getDeviceProfile(), mOptionLayout);
+ PointF additionalInset = orientationHandler.getAdditionalInsetForTaskMenu(taskInsetMargin);
+ insets.left += additionalInset.x;
+ insets.top += additionalInset.y;
setPosition(sTempRect.left - insets.left, sTempRect.top - insets.top, 0);
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java
index 02888a1..f730d2d 100644
--- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java
@@ -336,12 +336,20 @@
if (mOverlayEnabled != overlayEnabled) {
mOverlayEnabled = overlayEnabled;
- if (mOverlayEnabled) {
- getTaskOverlay().initOverlay(mTask, mThumbnailData, mPreviewPositionHelper.mMatrix,
- mPreviewPositionHelper.mIsOrientationChanged);
- } else {
- getTaskOverlay().reset();
- }
+ refreshOverlay();
+ }
+ }
+
+ /**
+ * Potentially re-init the task overlay. Be cautious when calling this as the overlay may
+ * do processing on initialization.
+ */
+ private void refreshOverlay() {
+ if (mOverlayEnabled) {
+ getTaskOverlay().initOverlay(mTask, mThumbnailData, mPreviewPositionHelper.mMatrix,
+ mPreviewPositionHelper.mIsOrientationChanged);
+ } else {
+ getTaskOverlay().reset();
}
}
@@ -382,6 +390,8 @@
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
updateThumbnailMatrix();
+
+ refreshOverlay();
}
private ColorFilter getColorFilter(float dimAmount) {
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java
index cfac32c..b2a7b1b 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskView.java
@@ -132,6 +132,12 @@
@IntDef({FLAG_UPDATE_ALL, FLAG_UPDATE_ICON, FLAG_UPDATE_THUMBNAIL})
public @interface TaskDataChanges {}
+ /**
+ * Should the layout account for space for a proactive action (or chip) to be added under
+ * the task.
+ */
+ public static final boolean SHOW_PROACTIVE_ACTIONS = false;
+
/** The maximum amount that a task view can be scrimmed, dimmed or tinted. */
public static final float MAX_PAGE_SCRIM_ALPHA = 0.4f;
diff --git a/res/color-night-v31/widgets_picker_surface.xml b/res/color-night-v31/surface.xml
similarity index 100%
rename from res/color-night-v31/widgets_picker_surface.xml
rename to res/color-night-v31/surface.xml
diff --git a/res/color-v31/home_settings_switch_thumb_color.xml b/res/color-v31/home_settings_switch_thumb_color.xml
new file mode 100644
index 0000000..91d3d9b
--- /dev/null
+++ b/res/color-v31/home_settings_switch_thumb_color.xml
@@ -0,0 +1,27 @@
+<?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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- Disabled status of thumb -->
+ <item android:state_enabled="false"
+ android:color="@color/home_settings_thumb_off_color" />
+ <!-- Toggle off status of thumb -->
+ <item android:state_checked="false"
+ android:color="@color/home_settings_thumb_off_color" />
+ <!-- Enabled or toggle on status of thumb -->
+ <item android:color="@color/home_settings_state_on_color" />
+</selector>
diff --git a/res/color-v31/home_settings_switch_track_color.xml b/res/color-v31/home_settings_switch_track_color.xml
new file mode 100644
index 0000000..50784f5
--- /dev/null
+++ b/res/color-v31/home_settings_switch_track_color.xml
@@ -0,0 +1,28 @@
+<?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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- Disabled status of thumb -->
+ <item android:state_enabled="false"
+ android:color="@color/home_settings_track_off_color"
+ android:alpha="?android:attr/disabledAlpha" />
+ <!-- Toggle off status of thumb -->
+ <item android:state_checked="false"
+ android:color="@color/home_settings_track_off_color" />
+ <!-- Enabled or toggle on status of thumb -->
+ <item android:color="@color/home_settings_track_on_color" />
+</selector>
diff --git a/res/color-v31/widgets_picker_surface.xml b/res/color-v31/surface.xml
similarity index 100%
rename from res/color-v31/widgets_picker_surface.xml
rename to res/color-v31/surface.xml
diff --git a/res/color/arrow_tip_view_content.xml b/res/color/arrow_tip_view_content.xml
index 87c733e..7d7f98b 100644
--- a/res/color/arrow_tip_view_content.xml
+++ b/res/color/arrow_tip_view_content.xml
@@ -19,5 +19,5 @@
-->
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="@android:color/white" />
+ <item android:color="?android:attr/textColorPrimaryInverse" />
</selector>
diff --git a/res/color/button_bg.xml b/res/color/button_bg.xml
new file mode 100644
index 0000000..91eed50
--- /dev/null
+++ b/res/color/button_bg.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+-->
+<selector
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="?android:attr/colorAccent" />
+</selector>
diff --git a/res/color/button_text.xml b/res/color/button_text.xml
new file mode 100644
index 0000000..7d7f98b
--- /dev/null
+++ b/res/color/button_text.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+-->
+<selector
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="?android:attr/textColorPrimaryInverse" />
+</selector>
diff --git a/res/color/widgets_picker_surface.xml b/res/color/surface.xml
similarity index 100%
rename from res/color/widgets_picker_surface.xml
rename to res/color/surface.xml
diff --git a/res/drawable-v28/widgets_bottom_sheet_background.xml b/res/drawable-v28/widgets_bottom_sheet_background.xml
new file mode 100644
index 0000000..7fb8681
--- /dev/null
+++ b/res/drawable-v28/widgets_bottom_sheet_background.xml
@@ -0,0 +1,26 @@
+<?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.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="@color/surface" />
+ <corners
+ android:topLeftRadius="?android:attr/dialogCornerRadius"
+ android:topRightRadius="?android:attr/dialogCornerRadius"
+ android:bottomLeftRadius="0dp"
+ android:bottomRightRadius="0dp"
+ />
+</shape>
\ No newline at end of file
diff --git a/res/drawable-v31/home_settings_switch_thumb.xml b/res/drawable-v31/home_settings_switch_thumb.xml
new file mode 100644
index 0000000..260d5ea
--- /dev/null
+++ b/res/drawable-v31/home_settings_switch_thumb.xml
@@ -0,0 +1,29 @@
+<?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.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:top="4dp"
+ android:left="4dp"
+ android:right="4dp"
+ android:bottom="4dp">
+ <shape android:shape="oval" >
+ <size android:height="20dp" android:width="20dp" />
+ <solid android:color="@color/home_settings_switch_thumb_color" />
+ </shape>
+ </item>
+</layer-list>
\ No newline at end of file
diff --git a/res/drawable-v31/home_settings_switch_track.xml b/res/drawable-v31/home_settings_switch_track.xml
new file mode 100644
index 0000000..502a300
--- /dev/null
+++ b/res/drawable-v31/home_settings_switch_track.xml
@@ -0,0 +1,26 @@
+<?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.
+-->
+
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle"
+ android:width="52dp"
+ android:height="28dp">
+
+ <solid android:color="@color/home_settings_switch_track_color" />
+ <corners android:radius="35dp" />
+</shape>
\ No newline at end of file
diff --git a/res/drawable/add_item_dialog_background.xml b/res/drawable/add_item_dialog_background.xml
index 16a0767..c3a8269 100644
--- a/res/drawable/add_item_dialog_background.xml
+++ b/res/drawable/add_item_dialog_background.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
- <solid android:color="@color/widgets_picker_surface" />
+ <solid android:color="@color/surface" />
<corners
android:topLeftRadius="?android:attr/dialogCornerRadius"
android:topRightRadius="?android:attr/dialogCornerRadius" />
diff --git a/res/drawable/add_item_dialog_button_background.xml b/res/drawable/add_item_dialog_button_background.xml
deleted file mode 100644
index 1b4591f..0000000
--- a/res/drawable/add_item_dialog_button_background.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<inset
- android:insetLeft="@dimen/pin_widget_button_inset_horizontal"
- android:insetRight="@dimen/pin_widget_button_inset_horizontal"
- android:insetTop="@dimen/pin_widget_button_inset_vertical"
- android:insetBottom="@dimen/pin_widget_button_inset_vertical"
- xmlns:android="http://schemas.android.com/apk/res/android">
- <ripple
- android:color="?android:attr/colorControlHighlight">
- <item>
- <shape android:tint="?android:attr/colorAccent" android:shape="rectangle">
- <corners android:radius="18dp" />
- <solid android:color="#FFFFFF" />
- <padding
- android:left="@dimen/pin_widget_button_padding_horizontal"
- android:top="@dimen/pin_widget_button_padding_vertical"
- android:right="@dimen/pin_widget_button_padding_horizontal"
- android:bottom="@dimen/pin_widget_button_padding_vertical" />
- </shape>
- </item>
- </ripple>
-</inset>
\ No newline at end of file
diff --git a/res/drawable/all_apps_divider.xml b/res/drawable/all_apps_divider.xml
index 4bd274d..53d3522 100644
--- a/res/drawable/all_apps_divider.xml
+++ b/res/drawable/all_apps_divider.xml
@@ -15,6 +15,6 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
- <solid android:color="?android:attr/colorControlHighlight" />
- <size android:height="1dp" />
+ <solid android:color="@android:color/transparent" />
+ <size android:height="2dp" />
</shape>
\ No newline at end of file
diff --git a/res/drawable/all_apps_tabs_background.xml b/res/drawable/all_apps_tabs_background.xml
index 377b653..a345dd3 100644
--- a/res/drawable/all_apps_tabs_background.xml
+++ b/res/drawable/all_apps_tabs_background.xml
@@ -13,9 +13,15 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<shape android:shape="rectangle"
- xmlns:android="http://schemas.android.com/apk/res/android"
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <solid android:color="?androidprv:attr/colorSurface" />
- <corners android:radius="@dimen/all_apps_header_pill_corner_radius" />
-</shape>
\ No newline at end of file
+ <item
+ android:top="@dimen/all_apps_tabs_vertical_padding"
+ android:bottom="@dimen/all_apps_tabs_vertical_padding
+">
+ <shape android:shape="rectangle">
+ <solid android:color="?androidprv:attr/colorSurface" />
+ <corners android:radius="@dimen/all_apps_header_pill_corner_radius" />
+ </shape>
+ </item>
+</layer-list>
\ No newline at end of file
diff --git a/res/drawable/arrow_toast_rounded_background.xml b/res/drawable/arrow_toast_rounded_background.xml
index f3f2158..1206ddd 100644
--- a/res/drawable/arrow_toast_rounded_background.xml
+++ b/res/drawable/arrow_toast_rounded_background.xml
@@ -15,5 +15,5 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/arrow_tip_view_bg" />
- <corners android:radius="8dp" />
+ <corners android:radius="@dimen/dialogCornerRadius" />
</shape>
diff --git a/res/drawable/bg_rounded_corner_bottom_sheet.xml b/res/drawable/bg_rounded_corner_bottom_sheet.xml
new file mode 100644
index 0000000..aa49bce
--- /dev/null
+++ b/res/drawable/bg_rounded_corner_bottom_sheet.xml
@@ -0,0 +1,23 @@
+<?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.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle" >
+ <solid android:color="@color/surface" />
+ <corners
+ android:topLeftRadius="@dimen/dialogCornerRadius"
+ android:topRightRadius="@dimen/dialogCornerRadius" />
+</shape>
\ No newline at end of file
diff --git a/res/drawable/bg_widgets_searchbox.xml b/res/drawable/bg_widgets_searchbox.xml
index 3230ac8..dc6d868 100644
--- a/res/drawable/bg_widgets_searchbox.xml
+++ b/res/drawable/bg_widgets_searchbox.xml
@@ -14,6 +14,6 @@
limitations under the License.
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
- <solid android:color="@color/widgets_picker_surface" />
+ <solid android:color="@color/surface" />
<corners android:radius="24dp" />
</shape>
\ No newline at end of file
diff --git a/res/drawable/button_bottom_rounded_colored_ripple.xml b/res/drawable/button_bottom_rounded_colored_ripple.xml
new file mode 100644
index 0000000..95f5234
--- /dev/null
+++ b/res/drawable/button_bottom_rounded_colored_ripple.xml
@@ -0,0 +1,32 @@
+<?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.
+-->
+
+<inset
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <ripple
+ android:color="?android:attr/colorControlHighlight">
+ <item>
+ <shape android:shape="rectangle">
+ <corners
+ android:topLeftRadius="4dp"
+ android:topRightRadius="4dp"
+ android:bottomLeftRadius="12dp"
+ android:bottomRightRadius="12dp" />
+ <solid android:color="@color/button_bg"/>
+ </shape>
+ </item>
+ </ripple>
+</inset>
\ No newline at end of file
diff --git a/res/drawable/button_rounded_colored_ripple.xml b/res/drawable/button_rounded_colored_ripple.xml
new file mode 100644
index 0000000..f6d689f
--- /dev/null
+++ b/res/drawable/button_rounded_colored_ripple.xml
@@ -0,0 +1,28 @@
+<?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.
+-->
+
+<inset
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <ripple
+ android:color="?android:attr/colorControlHighlight">
+ <item>
+ <shape android:shape="rectangle">
+ <corners android:radius="12dp"/>
+ <solid android:color="@color/button_bg"/>
+ </shape>
+ </item>
+ </ripple>
+</inset>
\ No newline at end of file
diff --git a/res/drawable/button_top_rounded_bordered_ripple.xml b/res/drawable/button_top_rounded_bordered_ripple.xml
new file mode 100644
index 0000000..f15a4a0
--- /dev/null
+++ b/res/drawable/button_top_rounded_bordered_ripple.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+
+<inset
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <ripple
+ android:color="?android:attr/colorControlHighlight">
+ <item>
+ <shape android:shape="rectangle">
+ <corners
+ android:topLeftRadius="12dp"
+ android:topRightRadius="12dp"
+ android:bottomLeftRadius="4dp"
+ android:bottomRightRadius="4dp" />
+ <solid android:color="@color/surface"/>
+ <stroke
+ android:width="2dp"
+ android:color="@color/button_bg"/>
+ </shape>
+ </item>
+ </ripple>
+</inset>
\ No newline at end of file
diff --git a/res/drawable/full_rounded_colored_ripple.xml b/res/drawable/full_rounded_colored_ripple.xml
new file mode 100644
index 0000000..d89537c
--- /dev/null
+++ b/res/drawable/full_rounded_colored_ripple.xml
@@ -0,0 +1,28 @@
+<?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.
+-->
+
+<inset
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <ripple
+ android:color="?android:attr/colorControlHighlight">
+ <item>
+ <shape android:shape="rectangle">
+ <solid android:color="@color/button_bg"/>
+ <corners android:radius="28dp"/>
+ </shape>
+ </item>
+ </ripple>
+</inset>
\ No newline at end of file
diff --git a/quickstep/res/drawable/gesture_tutorial_motion_overview.xml b/res/drawable/gesture_tutorial_motion_overview_light_mode.xml
similarity index 96%
copy from quickstep/res/drawable/gesture_tutorial_motion_overview.xml
copy to res/drawable/gesture_tutorial_motion_overview_light_mode.xml
index 4751fa9..75887c9 100644
--- a/quickstep/res/drawable/gesture_tutorial_motion_overview.xml
+++ b/res/drawable/gesture_tutorial_motion_overview_light_mode.xml
@@ -58,19 +58,6 @@
</set>
</aapt:attr>
</target>
- <target android:name="_R_G_L_3_G_L_0_G_L_28_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleY"
- android:startOffset="2083"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
<target android:name="_R_G_L_3_G_L_0_G_L_27_G">
<aapt:attr name="android:animation">
<set android:ordering="together">
@@ -860,7 +847,7 @@
<path
android:name="_R_G_L_5_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#000000"
+ android:fillColor="@color/fake_wallpaper_color_light_mode"
android:fillType="nonZero"
android:pathData=" M206 -446 C206,-446 206,446 206,446 C206,446 -206,446 -206,446 C-206,446 -206,-446 -206,-446 C-206,-446 206,-446 206,-446c " />
</group>
@@ -876,17 +863,6 @@
android:translateY="-446">
<group android:name="_R_G_L_4_G_L_0_G">
<group
- android:name="_R_G_L_4_G_L_0_G_L_28_G"
- android:translateX="206"
- android:translateY="446">
- <path
- android:name="_R_G_L_4_G_L_0_G_L_28_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#000000"
- android:fillType="nonZero"
- android:pathData=" M206 -422 C206,-422 206,422 206,422 C206,435.25 195.25,446 182,446 C182,446 -182,446 -182,446 C-195.25,446 -206,435.25 -206,422 C-206,422 -206,-422 -206,-422 C-206,-435.25 -195.25,-446 -182,-446 C-182,-446 182,-446 182,-446 C195.25,-446 206,-435.25 206,-422c " />
- </group>
- <group
android:name="_R_G_L_4_G_L_0_G_L_27_G"
android:translateX="206"
android:translateY="422.5">
@@ -1211,18 +1187,6 @@
android:name="_R_G_L_3_G_L_0_G"
android:scaleY="0">
<group
- android:name="_R_G_L_3_G_L_0_G_L_28_G"
- android:scaleY="0"
- android:translateX="206"
- android:translateY="446">
- <path
- android:name="_R_G_L_3_G_L_0_G_L_28_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#000000"
- android:fillType="nonZero"
- android:pathData=" M206 -422 C206,-422 206,422 206,422 C206,435.25 195.25,446 182,446 C182,446 -182,446 -182,446 C-195.25,446 -206,435.25 -206,422 C-206,422 -206,-422 -206,-422 C-206,-435.25 -195.25,-446 -182,-446 C-182,-446 182,-446 182,-446 C195.25,-446 206,-435.25 206,-422c " />
- </group>
- <group
android:name="_R_G_L_3_G_L_0_G_L_27_G"
android:scaleY="0"
android:translateX="206"
@@ -1600,7 +1564,7 @@
<path
android:name="_R_G_L_1_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="#3c4043"
+ android:fillColor="@color/gesture_tutorial_fake_previous_task_view_color"
android:fillType="nonZero"
android:pathData=" M135 -301 C135,-301 135,311 135,311 C135,319.28 128.28,326 120,326 C120,326 -120,326 -120,326 C-128.28,326 -135,319.28 -135,311 C-135,311 -135,-301 -135,-301 C-135,-309.28 -128.28,-316 -120,-316 C-120,-316 120,-316 120,-316 C128.28,-316 135,-309.28 135,-301c " />
</group>
diff --git a/res/drawable/widgets_bottom_sheet_background.xml b/res/drawable/widgets_bottom_sheet_background.xml
index faa414c..b877546 100644
--- a/res/drawable/widgets_bottom_sheet_background.xml
+++ b/res/drawable/widgets_bottom_sheet_background.xml
@@ -16,10 +16,10 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
- <solid android:color="@color/widgets_picker_surface" />
+ <solid android:color="@color/surface" />
<corners
- android:topLeftRadius="@dimen/bg_round_rect_radius"
- android:topRightRadius="@dimen/bg_round_rect_radius"
+ android:topLeftRadius="@dimen/default_dialog_corner_radius"
+ android:topRightRadius="@dimen/default_dialog_corner_radius"
android:bottomLeftRadius="0dp"
android:bottomRightRadius="0dp"
/>
diff --git a/res/drawable/widgets_list_bottom_ripple.xml b/res/drawable/widgets_list_bottom_ripple.xml
index 72262d4..c2debb1 100644
--- a/res/drawable/widgets_list_bottom_ripple.xml
+++ b/res/drawable/widgets_list_bottom_ripple.xml
@@ -21,6 +21,7 @@
android:color="?android:attr/colorControlHighlight">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
+ <solid android:color="@color/surface" />
<corners
android:topLeftRadius="@dimen/widget_list_content_corner_radius"
android:topRightRadius="@dimen/widget_list_content_corner_radius"
@@ -30,7 +31,7 @@
</item>
<item android:id="@android:id/background">
<shape android:shape="rectangle">
- <solid android:color="@color/widgets_picker_surface" />
+ <solid android:color="@color/surface" />
<corners
android:topLeftRadius="@dimen/widget_list_content_corner_radius"
android:topRightRadius="@dimen/widget_list_content_corner_radius"
diff --git a/res/drawable/widgets_list_middle_ripple.xml b/res/drawable/widgets_list_middle_ripple.xml
index 1136bea..83f96a0 100644
--- a/res/drawable/widgets_list_middle_ripple.xml
+++ b/res/drawable/widgets_list_middle_ripple.xml
@@ -21,6 +21,7 @@
android:color="?android:attr/colorControlHighlight">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
+ <solid android:color="@color/surface" />
<corners
android:topLeftRadius="@dimen/widget_list_content_corner_radius"
android:topRightRadius="@dimen/widget_list_content_corner_radius"
@@ -31,7 +32,7 @@
<item android:id="@android:id/background">
<shape android:shape="rectangle">
- <solid android:color="@color/widgets_picker_surface" />
+ <solid android:color="@color/surface" />
<corners
android:topLeftRadius="@dimen/widget_list_content_corner_radius"
android:topRightRadius="@dimen/widget_list_content_corner_radius"
diff --git a/res/drawable/widgets_list_single_item_ripple.xml b/res/drawable/widgets_list_single_item_ripple.xml
index a82918e..a4223a8 100644
--- a/res/drawable/widgets_list_single_item_ripple.xml
+++ b/res/drawable/widgets_list_single_item_ripple.xml
@@ -21,6 +21,7 @@
android:color="?android:attr/colorControlHighlight">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
+ <solid android:color="@color/surface" />
<corners
android:topLeftRadius="@dimen/widget_list_top_bottom_corner_radius"
android:topRightRadius="@dimen/widget_list_top_bottom_corner_radius"
@@ -30,7 +31,7 @@
</item>
<item android:id="@android:id/background">
<shape android:shape="rectangle">
- <solid android:color="@color/widgets_picker_surface" />
+ <solid android:color="@color/surface" />
<corners
android:topLeftRadius="@dimen/widget_list_top_bottom_corner_radius"
android:topRightRadius="@dimen/widget_list_top_bottom_corner_radius"
diff --git a/res/drawable/widgets_list_top_ripple.xml b/res/drawable/widgets_list_top_ripple.xml
index 4ad185c..bc0876e 100644
--- a/res/drawable/widgets_list_top_ripple.xml
+++ b/res/drawable/widgets_list_top_ripple.xml
@@ -21,6 +21,7 @@
android:color="?android:attr/colorControlHighlight">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
+ <solid android:color="@color/surface" />
<corners
android:topLeftRadius="@dimen/widget_list_top_bottom_corner_radius"
android:topRightRadius="@dimen/widget_list_top_bottom_corner_radius"
@@ -31,7 +32,7 @@
<item android:id="@android:id/background">
<shape android:shape="rectangle">
- <solid android:color="@color/widgets_picker_surface" />
+ <solid android:color="@color/surface" />
<corners
android:topLeftRadius="@dimen/widget_list_top_bottom_corner_radius"
android:topRightRadius="@dimen/widget_list_top_bottom_corner_radius"
diff --git a/res/drawable/widgets_recommendation_background.xml b/res/drawable/widgets_recommendation_background.xml
index b59de27..0550a34 100644
--- a/res/drawable/widgets_recommendation_background.xml
+++ b/res/drawable/widgets_recommendation_background.xml
@@ -19,6 +19,6 @@
-->
<shape android:shape="rectangle"
xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="@color/widgets_picker_surface" />
+ <solid android:color="@color/surface" />
<corners android:radius="@dimen/widget_list_top_bottom_corner_radius"/>
</shape>
\ No newline at end of file
diff --git a/res/layout-v31/settings_activity.xml b/res/layout-v31/settings_activity.xml
new file mode 100644
index 0000000..59e14f2
--- /dev/null
+++ b/res/layout-v31/settings_activity.xml
@@ -0,0 +1,69 @@
+<?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.
+-->
+<androidx.coordinatorlayout.widget.CoordinatorLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/content_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+ <com.google.android.material.appbar.AppBarLayout
+ android:id="@+id/app_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?android:attr/colorPrimary"
+ android:fitsSystemWindows="true"
+ android:outlineAmbientShadowColor="@android:color/transparent"
+ android:outlineSpotShadowColor="@android:color/transparent"
+ android:theme="@style/HomeSettings.CollapsingToolbar">
+
+ <com.google.android.material.appbar.CollapsingToolbarLayout
+ android:id="@+id/collapsing_toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="226dp"
+ android:clipToPadding="false"
+ app:collapsedTitleTextAppearance="@style/HomeSettings.CollapsedToolbarTitle"
+ app:contentScrim="@color/home_settings_header_collapsed"
+ app:expandedTitleMarginEnd="24dp"
+ app:expandedTitleMarginStart="24dp"
+ app:expandedTitleTextAppearance="@style/HomeSettings.ExpandedToolbarTitle"
+ app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
+ app:maxLines="3"
+ app:scrimAnimationDuration="50"
+ app:scrimVisibleHeightTrigger="174dp"
+ app:statusBarScrim="@null"
+ app:titleCollapseMode="fade"
+ app:toolbarId="@id/action_bar">
+
+ <Toolbar
+ android:id="@+id/action_bar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:theme="?android:attr/actionBarTheme"
+ android:transitionName="shared_element_view"
+ app:layout_collapseMode="pin" />
+
+ </com.google.android.material.appbar.CollapsingToolbarLayout>
+ </com.google.android.material.appbar.AppBarLayout>
+
+ <FrameLayout
+ android:id="@+id/content_frame"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior" />
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/res/layout/add_item_confirmation_activity.xml b/res/layout/add_item_confirmation_activity.xml
index 0a3fbbc..ddc9815 100644
--- a/res/layout/add_item_confirmation_activity.xml
+++ b/res/layout/add_item_confirmation_activity.xml
@@ -53,7 +53,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
- android:paddingVertical="8dp"
+ android:paddingTop="8dp"
android:text="@string/add_item_request_drag_hint"
android:textSize="14sp"
android:textColor="?android:attr/textColorSecondary"
@@ -70,28 +70,33 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:gravity="end"
- android:padding="8dp"
+ android:gravity="center_vertical|end"
+ android:paddingHorizontal="24dp"
+ android:paddingVertical="8dp"
android:orientation="horizontal">
<Button
- style="@style/Widget.DeviceDefault.Button.Rounded.Colored"
+ style="@style/Button.FullRounded.Colored"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_height="36dp"
android:paddingHorizontal="16dp"
- android:onClick="onCancelClick"
- android:text="@android:string/cancel" />
+ android:textSize="14sp"
+ android:textColor="@color/button_text"
+ android:text="@android:string/cancel"
+ android:onClick="onCancelClick"/>
<Space
- android:layout_width="4dp"
+ android:layout_width="8dp"
android:layout_height="wrap_content" />
<Button
- style="@style/Widget.DeviceDefault.Button.Rounded.Colored"
+ style="@style/Button.FullRounded.Colored"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_height="36dp"
android:paddingHorizontal="16dp"
- android:onClick="onPlaceAutomaticallyClick"
- android:text="@string/add_to_home_screen"/>
+ android:textSize="14sp"
+ android:textColor="@color/button_text"
+ android:text="@string/add_to_home_screen"
+ android:onClick="onPlaceAutomaticallyClick"/>
</LinearLayout>
</com.android.launcher3.widget.AddItemWidgetsBottomSheet>
diff --git a/res/layout/all_apps_personal_work_tabs.xml b/res/layout/all_apps_personal_work_tabs.xml
index f089f83..ebb69f6 100644
--- a/res/layout/all_apps_personal_work_tabs.xml
+++ b/res/layout/all_apps_personal_work_tabs.xml
@@ -16,13 +16,11 @@
<com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tabs"
- android:layout_width="match_parent"
+ android:layout_width="@dimen/all_apps_header_pills_width"
android:layout_height="@dimen/all_apps_header_pill_height"
+ android:layout_gravity="center_horizontal"
android:background="@drawable/all_apps_tabs_background"
- android:layout_marginLeft="@dimen/all_apps_tabs_side_padding"
- android:layout_marginRight="@dimen/all_apps_tabs_side_padding"
android:orientation="horizontal"
- android:elevation="2dp"
style="@style/TextHeadline">
<Button
diff --git a/res/layout/arrow_toast.xml b/res/layout/arrow_toast.xml
index ae60e1b..aee00a9 100644
--- a/res/layout/arrow_toast.xml
+++ b/res/layout/arrow_toast.xml
@@ -16,50 +16,25 @@
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
- <LinearLayout
+ <TextView
+ android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingStart="24dp"
- android:paddingEnd="4dp"
- android:background="@drawable/arrow_toast_rounded_background"
android:layout_gravity="center_horizontal"
+ android:gravity="center"
+ android:padding="16dp"
+ android:background="@drawable/arrow_toast_rounded_background"
android:elevation="2dp"
- android:orientation="horizontal">
-
- <TextView
- android:id="@+id/text"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:paddingTop="5dp"
- android:paddingBottom="5dp"
- android:gravity="center"
- android:layout_gravity="center_vertical"
- android:textColor="@color/arrow_tip_view_content"
- android:textSize="16sp"/>
- <ImageView
- android:id="@+id/dismiss"
- android:layout_width="40dp"
- android:layout_height="40dp"
- android:layout_gravity="center_vertical"
- android:padding="10dp"
- android:layout_marginStart="2dp"
- android:layout_marginEnd="2dp"
- android:alpha="0.7"
- android:src="@drawable/ic_remove_no_shadow"
- android:tint="@color/arrow_tip_view_content"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:contentDescription="@string/accessibility_close"/>
- </LinearLayout>
+ android:textColor="@color/arrow_tip_view_content"
+ android:textSize="14sp"/>
<View
android:id="@+id/arrow"
android:elevation="2dp"
- android:layout_width="10dp"
+ android:layout_width="@dimen/arrow_toast_arrow_width"
android:layout_height="8dp"
android:layout_marginTop="-2dp"/>
</merge>
diff --git a/res/layout/secondary_launcher.xml b/res/layout/secondary_launcher.xml
index 94fcdb9..b15a320 100644
--- a/res/layout/secondary_launcher.xml
+++ b/res/layout/secondary_launcher.xml
@@ -71,8 +71,6 @@
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="@dimen/all_apps_header_pill_height"
- android:layout_marginLeft="@dimen/all_apps_tabs_side_padding"
- android:layout_marginRight="@dimen/all_apps_tabs_side_padding"
android:orientation="horizontal"
style="@style/TextHeadline">
diff --git a/res/layout/settings_activity.xml b/res/layout/settings_activity.xml
new file mode 100644
index 0000000..c70d5bf
--- /dev/null
+++ b/res/layout/settings_activity.xml
@@ -0,0 +1,34 @@
+<?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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/content_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <Toolbar
+ android:id="@+id/action_bar"
+ style="?android:attr/actionBarStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:theme="?android:attr/actionBarTheme" />
+
+ <FrameLayout
+ android:id="@+id/content_frame"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/widget_cell_content.xml b/res/layout/widget_cell_content.xml
index 0f6fc6c..b27b505 100644
--- a/res/layout/widget_cell_content.xml
+++ b/res/layout/widget_cell_content.xml
@@ -33,14 +33,6 @@
android:layout_height="match_parent"
android:importantForAccessibility="no"
android:layout_gravity="fill"/>
-
- <ImageView
- android:id="@+id/widget_badge"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:importantForAccessibility="no"
- android:layout_gravity="end|bottom"
- android:layout_margin="@dimen/profile_badge_margin"/>
</com.android.launcher3.widget.WidgetCellPreview>
<!-- The name of the widget. -->
diff --git a/res/layout/widgets_bottom_sheet.xml b/res/layout/widgets_bottom_sheet.xml
index 08635c6..1859bd8 100644
--- a/res/layout/widgets_bottom_sheet.xml
+++ b/res/layout/widgets_bottom_sheet.xml
@@ -21,7 +21,6 @@
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:background="@drawable/widgets_bottom_sheet_background"
- android:elevation="@dimen/deep_shortcuts_elevation"
android:layout_gravity="bottom"
android:theme="?attr/widgetsTheme">
diff --git a/res/layout/widgets_edu.xml b/res/layout/widgets_edu.xml
new file mode 100644
index 0000000..280c095
--- /dev/null
+++ b/res/layout/widgets_edu.xml
@@ -0,0 +1,66 @@
+<?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.
+-->
+
+<com.android.launcher3.views.WidgetsEduView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:gravity="bottom"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/edu_view"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@drawable/bg_rounded_corner_bottom_sheet"
+ android:gravity="center_horizontal"
+ android:orientation="vertical"
+ android:paddingHorizontal="@dimen/bottom_sheet_edu_padding"
+ android:paddingTop="@dimen/bottom_sheet_edu_padding">
+
+ <TextView
+ style="@style/TextHeadline"
+ android:id="@+id/edu_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:text="@string/widget_education_header"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="24sp"
+ android:layout_marginBottom="16dp"/>
+
+ <TextView
+ android:id="@+id/edu_content"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:text="@string/widget_education_content"
+ android:textSize="14sp"
+ android:textColor="?android:attr/textColorSecondary"
+ android:layout_marginBottom="24dp"/>
+
+ <Button
+ android:id="@+id/edu_close_button"
+ style="@style/Button.Rounded.Colored"
+ android:layout_width="match_parent"
+ android:layout_height="56dp"
+ android:text="@string/widget_education_close_button"
+ android:textSize="16sp"
+ android:textColor="@color/button_text"
+ android:layout_marginBottom="8dp"/>
+ </LinearLayout>
+</com.android.launcher3.views.WidgetsEduView>
\ No newline at end of file
diff --git a/res/layout/widgets_full_sheet_paged_view.xml b/res/layout/widgets_full_sheet_paged_view.xml
index 580ca49..f0ddc2b 100644
--- a/res/layout/widgets_full_sheet_paged_view.xml
+++ b/res/layout/widgets_full_sheet_paged_view.xml
@@ -21,6 +21,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
+ android:paddingTop="@dimen/widget_picker_view_pager_top_padding"
android:descendantFocusability="afterDescendants"
launcher:pageIndicator="@+id/tabs">
diff --git a/res/layout/widgets_list_row_header.xml b/res/layout/widgets_list_row_header.xml
index a0a0456..8ab086c 100644
--- a/res/layout/widgets_list_row_header.xml
+++ b/res/layout/widgets_list_row_header.xml
@@ -49,6 +49,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
+ android:ellipsize="end"
+ android:maxLines="1"
android:textColor="?android:attr/textColorPrimary"
android:textSize="16sp"
tools:text="App name" />
@@ -74,6 +76,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_alignParentEnd="true"
+ android:enabled="false"
android:clickable="false"
android:importantForAccessibility="no"
android:button="@drawable/widgets_tray_expand_button"/>
diff --git a/res/layout/widgets_personal_work_tabs.xml b/res/layout/widgets_personal_work_tabs.xml
index 72d83e8..15275a6 100644
--- a/res/layout/widgets_personal_work_tabs.xml
+++ b/res/layout/widgets_personal_work_tabs.xml
@@ -20,10 +20,9 @@
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="@dimen/all_apps_header_pill_height"
- android:layout_marginHorizontal="16dp"
+ android:layout_marginHorizontal="32dp"
android:orientation="horizontal"
android:background="@drawable/all_apps_tabs_background"
- android:elevation="2dp"
style="@style/TextHeadline">
<Button
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 55eceee..3a25705 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -97,8 +97,7 @@
<string name="folder_name_format_exact" msgid="8626242716117004803">"ફોલ્ડર: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> આઇટમ"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ફોલ્ડર: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> કે વધુ આઇટમ"</string>
<string name="wallpaper_button_text" msgid="8404103075899945851">"વૉલપેપર"</string>
- <!-- no translation found for styles_wallpaper_button_text (8216961355289236794) -->
- <skip />
+ <string name="styles_wallpaper_button_text" msgid="8216961355289236794">"વૉલપેપર અને શૈલી"</string>
<string name="settings_button_text" msgid="8873672322605444408">"હોમ સેટિંગ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ"</string>
<string name="allow_rotation_title" msgid="7728578836261442095">"હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો"</string>
diff --git a/res/values-night-v31/colors.xml b/res/values-night-v31/colors.xml
new file mode 100644
index 0000000..2c1bc90
--- /dev/null
+++ b/res/values-night-v31/colors.xml
@@ -0,0 +1,27 @@
+<?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.
+*/
+-->
+
+<resources>
+ <color name="home_settings_header_accent">@android:color/system_accent1_100</color>
+ <color name="home_settings_header_collapsed">@android:color/system_neutral1_700</color>
+ <color name="home_settings_header_expanded">@android:color/system_neutral1_900</color>
+
+ <color name="home_settings_thumb_off_color">@android:color/system_neutral2_300</color>
+ <color name="home_settings_track_on_color">@android:color/system_accent2_700</color>
+ <color name="home_settings_track_off_color">@android:color/system_neutral1_700</color>
+</resources>
\ No newline at end of file
diff --git a/res/values-v28/dimens.xml b/res/values-v28/dimens.xml
new file mode 100644
index 0000000..ffa8cc4
--- /dev/null
+++ b/res/values-v28/dimens.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<resources>
+ <dimen name="dialogCornerRadius">?android:attr/dialogCornerRadius</dimen>
+</resources>
diff --git a/res/values-v31/colors.xml b/res/values-v31/colors.xml
index 5ade64c..53c6a35 100644
--- a/res/values-v31/colors.xml
+++ b/res/values-v31/colors.xml
@@ -28,10 +28,22 @@
<color name="workspace_text_color_light">@android:color/system_neutral1_0</color>
<color name="workspace_text_color_dark">@android:color/system_neutral1_1000</color>
+ <color name="folder_hint_text_color_light">@android:color/system_neutral1_50</color>
+ <color name="folder_hint_text_color_dark">@android:color/system_neutral2_700</color>
+
<color name="text_color_primary_dark">@android:color/system_neutral1_50</color>
<color name="text_color_secondary_dark">@android:color/system_neutral2_200</color>
<color name="text_color_tertiary_dark">@android:color/system_neutral2_400</color>
<color name="wallpaper_popup_scrim">@android:color/system_neutral1_900</color>
+ <color name="home_settings_header_accent">@android:color/system_accent1_600</color>
+ <color name="home_settings_header_collapsed">@android:color/system_neutral1_100</color>
+ <color name="home_settings_header_expanded">@android:color/system_neutral1_50</color>
+
+ <color name="home_settings_state_on_color">@android:color/system_accent1_100</color>
+ <color name="home_settings_state_off_color">@android:color/system_accent2_100</color>
+ <color name="home_settings_thumb_off_color">@android:color/system_neutral2_100</color>
+ <color name="home_settings_track_on_color">@android:color/system_accent1_600</color>
+ <color name="home_settings_track_off_color">@android:color/system_neutral2_600</color>
</resources>
diff --git a/res/values-v31/config.xml b/res/values-v31/config.xml
new file mode 100644
index 0000000..afb9e6d
--- /dev/null
+++ b/res/values-v31/config.xml
@@ -0,0 +1,20 @@
+<?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.
+ -->
+<resources>
+ <bool name="home_settings_icon_space_reserved">false</bool>
+ <bool name="home_settings_allow_divider">false</bool>
+</resources>
\ No newline at end of file
diff --git a/res/values-v31/styles.xml b/res/values-v31/styles.xml
new file mode 100644
index 0000000..0d2fce0
--- /dev/null
+++ b/res/values-v31/styles.xml
@@ -0,0 +1,95 @@
+<?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.
+*/
+-->
+
+<resources>
+
+ <style name="HomeSettings.Theme" parent="@android:style/Theme.DeviceDefault.Settings">
+ <item name="android:listPreferredItemPaddingEnd">16dp</item>
+ <item name="android:listPreferredItemPaddingStart">24dp</item>
+ <item name="android:navigationBarColor">@android:color/transparent</item>
+ <item name="android:statusBarColor">@android:color/transparent</item>
+ <item name="android:switchStyle">@style/HomeSettings.SwitchStyle</item>
+ <item name="android:textAppearanceListItem">@style/HomeSettings.PreferenceTitle</item>
+ <item name="android:windowActionBar">false</item>
+ <item name="android:windowNoTitle">true</item>
+ <item name="preferenceTheme">@style/HomeSettings.PreferenceTheme</item>
+ </style>
+
+ <style name="HomeSettings.PreferenceTheme" parent="@style/PreferenceThemeOverlay">
+ <item name="preferenceCategoryStyle">@style/HomeSettings.CategoryStyle</item>
+ <item name="preferenceCategoryTitleTextAppearance">@style/HomeSettings.CategoryTitle</item>
+ <item name="preferenceFragmentCompatStyle">@style/HomeSettings.FragmentCompatStyle</item>
+ <item name="preferenceScreenStyle">@style/HomeSettings.PreferenceScreenStyle</item>
+ <item name="preferenceStyle">@style/HomeSettings.PreferenceStyle</item>
+ <item name="switchPreferenceStyle">@style/HomeSettings.SwitchPreferenceStyle</item>
+ </style>
+
+ <style name="HomeSettings.CategoryStyle" parent="@style/Preference.Category.Material">
+ <item name="allowDividerAbove">@bool/home_settings_allow_divider</item>
+ <item name="allowDividerBelow">@bool/home_settings_allow_divider</item>
+ <item name="iconSpaceReserved">@bool/home_settings_icon_space_reserved</item>
+ </style>
+
+ <style name="HomeSettings.PreferenceStyle" parent="@style/Preference.Material">
+ <item name="iconSpaceReserved">@bool/home_settings_icon_space_reserved</item>
+ </style>
+
+ <style name="HomeSettings.PreferenceScreenStyle"
+ parent="@style/Preference.PreferenceScreen.Material">
+ <item name="iconSpaceReserved">@bool/home_settings_icon_space_reserved</item>
+ </style>
+
+ <style name="HomeSettings.SwitchPreferenceStyle"
+ parent="@style/Preference.SwitchPreference.Material">
+ <item name="iconSpaceReserved">@bool/home_settings_icon_space_reserved</item>
+ </style>
+
+ <style name="HomeSettings.SwitchStyle"
+ parent="@android:style/Widget.Material.CompoundButton.Switch">
+ <item name="android:switchMinWidth">52dp</item>
+ <item name="android:thumb">@drawable/home_settings_switch_thumb</item>
+ <item name="android:track">@drawable/home_settings_switch_track</item>
+ </style>
+
+ <style name="HomeSettings.PreferenceTitle"
+ parent="@android:style/TextAppearance.Material.Subhead">
+ <item name="android:fontFamily">google-sans</item>
+ <item name="android:textSize">20sp</item>
+ </style>
+
+ <style name="HomeSettings.CategoryTitle" parent="@android:style/TextAppearance.Material.Body2">
+ <item name="android:fontFamily">google-sans-text-medium</item>
+ </style>
+
+ <style name="HomeSettings.CollapsingToolbar" parent="@style/Theme.MaterialComponents.DayNight">
+ <item name="colorAccent">@color/home_settings_header_accent</item>
+ <item name="colorPrimary">@color/home_settings_header_expanded</item>
+ <item name="elevationOverlayColor">?attr/colorPrimary</item>
+ <item name="elevationOverlayEnabled">true</item>
+ </style>
+
+ <style name="HomeSettings.CollapsedToolbarTitle"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ <item name="android:fontFamily">google-sans</item>
+ </style>
+
+ <style name="HomeSettings.ExpandedToolbarTitle" parent="HomeSettings.CollapsedToolbarTitle">
+ <item name="android:textSize">36sp</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index eb39c9a..9c308e0 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -97,7 +97,7 @@
<string name="folder_name_format_exact" msgid="8626242716117004803">"Thư mục: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> mục"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Thư mục: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> mục trở lên"</string>
<string name="wallpaper_button_text" msgid="8404103075899945851">"Hình nền"</string>
- <string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hình nền và kiểu"</string>
+ <string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hình nền và phong cách"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Cài đặt màn hình chính"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Bị tắt bởi quản trị viên của bạn"</string>
<string name="allow_rotation_title" msgid="7728578836261442095">"Cho phép xoay Màn hình chính"</string>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index e605ca8..dc33ab8 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -19,6 +19,7 @@
<!-- Attributes used for launcher theme -->
<attr name="allAppsScrimColor" format="color" />
+ <attr name="allappsHeaderProtectionColor" format="color" />
<attr name="allAppsNavBarScrimColor" format="color" />
<attr name="allAppsTheme" format="reference" />
<attr name="popupColorPrimary" format="color" />
diff --git a/res/values/colors.xml b/res/values/colors.xml
index e6553a2..c2b07e0 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -17,7 +17,8 @@
** limitations under the License.
*/
-->
-<resources>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<!-- The color tints to apply to the text and drag view when hovering
over the delete target or the info target -->
<color name="delete_target_hover_tint">#FFC1C1C1</color>
@@ -37,6 +38,9 @@
<color name="gesture_tutorial_ripple_color">#A0C2F9</color> <!-- Light Blue -->
<color name="gesture_tutorial_fake_task_view_color">#6DA1FF</color> <!-- Light Blue -->
+ <color name="fake_wallpaper_color_dark_mode">#000000</color> <!-- Black -->
+ <color name="fake_wallpaper_color_light_mode">#f9f9f9</color> <!-- White -->
+ <!-- Must contrast fake_wallpaper_color_dark_mode and fake_wallpaper_color_light_mode -->
<color name="gesture_tutorial_fake_previous_task_view_color">#3C4043</color> <!-- Gray -->
<color name="gesture_tutorial_action_button_label_color">#FF000000</color>
<color name="gesture_tutorial_primary_color">#B7F29F</color> <!-- Light Green -->
@@ -52,11 +56,13 @@
<color name="workspace_text_color_light">#FFF</color>
<color name="workspace_text_color_dark">#FF000000</color>
+ <color name="folder_hint_text_color_light">#FFF</color>
+ <color name="folder_hint_text_color_dark">#FF000000</color>
+
<color name="text_color_primary_dark">#FFFFFFFF</color>
<color name="text_color_secondary_dark">#FFFFFFFF</color>
<color name="text_color_tertiary_dark">#CCFFFFFF</color>
<color name="wallpaper_popup_scrim">?android:attr/colorAccent</color>
<color name="wallpaper_scrim_color">#0D878787</color>
-
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 451f82b..d6a6f43 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -91,7 +91,7 @@
<dimen name="all_apps_empty_search_bg_top_offset">144dp</dimen>
<dimen name="all_apps_background_canvas_width">700dp</dimen>
<dimen name="all_apps_background_canvas_height">475dp</dimen>
- <dimen name="all_apps_header_pill_height">36dp</dimen>
+ <dimen name="all_apps_header_pill_height">48dp</dimen>
<dimen name="all_apps_header_pill_corner_radius">18dp</dimen>
<dimen name="all_apps_header_pills_width">320dp</dimen>
<dimen name="all_apps_header_tab_height">48dp</dimen>
@@ -99,12 +99,13 @@
<dimen name="all_apps_header_top_padding">36dp</dimen>
<dimen name="all_apps_work_profile_tab_footer_top_padding">16dp</dimen>
<dimen name="all_apps_work_profile_tab_footer_bottom_padding">20dp</dimen>
- <dimen name="all_apps_tabs_side_padding">32dp</dimen>
+ <dimen name="all_apps_tabs_vertical_padding">6dp</dimen>
<dimen name="all_apps_divider_height">1dp</dimen>
<dimen name="all_apps_tip_bottom_margin">8dp</dimen>
<!-- The size of corner radius of the arrow in the arrow toast. -->
<dimen name="arrow_toast_corner_radius">2dp</dimen>
+ <dimen name="arrow_toast_arrow_width">10dp</dimen>
<!-- Search bar in All Apps -->
<dimen name="all_apps_header_max_elevation">3dp</dimen>
@@ -123,6 +124,11 @@
<dimen name="recommended_widgets_table_vertical_padding">8dp</dimen>
+ <!-- Bottom margin for the search and recommended widgets container without work profile -->
+ <dimen name="search_and_recommended_widgets_container_bottom_margin">16dp</dimen>
+ <!-- Bottom margin for the search and recommended widgets container with work profile -->
+ <dimen name="search_and_recommended_widgets_container_small_bottom_margin">10dp</dimen>
+
<dimen name="widget_list_top_bottom_corner_radius">28dp</dimen>
<dimen name="widget_list_content_corner_radius">4dp</dimen>
@@ -143,9 +149,11 @@
<dimen name="widget_row_padding">8dp</dimen>
<dimen name="widget_row_divider">2dp</dimen>
- <dimen name="widget_picker_education_tip_width">120dp</dimen>
+ <dimen name="widget_picker_education_tip_max_width">308dp</dimen>
<dimen name="widget_picker_education_tip_min_margin">4dp</dimen>
+ <dimen name="widget_picker_view_pager_top_padding">10dp</dimen>
+
<!-- Padding applied to shortcut previews -->
<dimen name="shortcut_preview_padding_left">0dp</dimen>
<dimen name="shortcut_preview_padding_right">0dp</dimen>
@@ -280,6 +288,7 @@
<!-- Theming related -->
<dimen name="default_dialog_corner_radius">8dp</dimen>
+ <dimen name="dialogCornerRadius">@dimen/default_dialog_corner_radius</dimen>
<!-- Onboarding bottomsheet related -->
<dimen name="bottom_sheet_edu_padding">24dp</dimen>
@@ -294,6 +303,8 @@
<dimen name="task_thumbnail_icon_size">0dp</dimen>
<dimen name="task_thumbnail_icon_size_grid">0dp</dimen>
<dimen name="overview_task_margin">0dp</dimen>
+ <dimen name="overview_actions_bottom_margin_gesture">0dp</dimen>
+ <dimen name="overview_actions_bottom_margin_three_button">0dp</dimen>
<!-- Workspace grid visualization parameters -->
<dimen name="grid_visualization_rounding_radius">22dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index eae32b7..c851cf8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -99,6 +99,15 @@
<!-- A widget category label for grouping widgets related to conversations. [CHAR_LIMIT=30] -->
<string name="widget_category_conversations">Conversations</string>
+ <!-- Title of a dialog. This dialog lets a user know how they can use widgets on their phone.
+ [CHAR_LIMIT=NONE] -->
+ <string name="widget_education_header">Useful info at your fingertips</string>
+ <!-- Dialog text. This dialog lets a user know how they can use widgets on their phone.
+ [CHAR_LIMIT=NONE] -->
+ <string name="widget_education_content">To get info without opening apps, you can add widgets to your Home screen</string>
+ <!-- Text on the button that closes the education dialog about widgets. [CHAR_LIMIT=50] -->
+ <string name="widget_education_close_button">Got it</string>
+
<!-- All Apps -->
<!-- Search bar text in the apps view. [CHAR_LIMIT=50] -->
<string name="all_apps_search_bar_hint">Search apps</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 6d22951..0f8169e 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -33,6 +33,7 @@
<style name="LauncherTheme" parent="@style/BaseLauncherTheme">
<item name="android:textColorSecondary">#DE000000</item>
<item name="allAppsScrimColor">?android:attr/colorBackgroundFloating</item>
+ <item name="allappsHeaderProtectionColor">@color/popup_color_tertiary_light</item>
<item name="allAppsNavBarScrimColor">#66FFFFFF</item>
<item name="allAppsTheme">@style/AllAppsTheme</item>
<item name="popupColorPrimary">@color/popup_color_primary_light</item>
@@ -47,11 +48,11 @@
<item name="workspaceStatusBarScrim">@drawable/workspace_bg</item>
<item name="widgetsTheme">@style/WidgetContainerTheme</item>
<item name="folderDotColor">?android:attr/colorPrimary</item>
- <item name="folderFillColor">?android:attr/colorBackground</item>
+ <item name="folderFillColor">?android:attr/colorBackgroundFloating</item>
<item name="folderIconBorderColor">?android:attr/colorPrimary</item>
<item name="folderTextColor">?android:attr/textColorPrimary</item>
<item name="isFolderDarkText">true</item>
- <item name="folderHintColor">#89616161</item>
+ <item name="folderHintColor">@color/folder_hint_text_color_dark</item>
<item name="loadingIconColor">#CCFFFFFF</item>
<item name="iconOnlyShortcutColor">?android:attr/textColorSecondary</item>
<item name="workProfileOverlayTextColor">#FF212121</item>
@@ -70,9 +71,10 @@
</style>
<style name="LauncherTheme.DarkMainColor" parent="@style/LauncherTheme">
- <item name="folderFillColor">#FF3C4043</item> <!-- 100% GM2 800 -->
+ <item name="folderFillColor">?android:attr/colorBackgroundFloating</item>
<item name="folderTextColor">?attr/workspaceTextColor</item>
<item name="isFolderDarkText">?attr/isWorkspaceDarkText</item>
+ <item name="folderHintColor">@color/folder_hint_text_color_dark</item>
<item name="disabledIconAlpha">.254</item>
</style>
@@ -85,10 +87,11 @@
<item name="isWorkspaceDarkText">true</item>
<item name="workspaceStatusBarScrim">@null</item>
<item name="folderDotColor">#FF464646</item>
- <item name="folderFillColor">#CDFFFFFF</item>
+ <item name="folderFillColor">?android:attr/colorBackgroundFloating</item>
<item name="folderIconBorderColor">#FF80868B</item>
<item name="folderTextColor">?attr/workspaceTextColor</item>
<item name="isFolderDarkText">true</item>
+ <item name="folderHintColor">@color/folder_hint_text_color_dark</item>
</style>
<style name="LauncherTheme.Dark" parent="@style/LauncherTheme">
@@ -106,11 +109,11 @@
<item name="popupColorTertiary">@color/popup_color_tertiary_dark</item>
<item name="widgetsTheme">@style/WidgetContainerTheme.Dark</item>
<item name="folderDotColor">?android:attr/colorPrimary</item>
- <item name="folderFillColor">?android:attr/colorBackground</item>
+ <item name="folderFillColor">?android:attr/colorBackgroundFloating</item>
<item name="folderIconBorderColor">?android:attr/colorPrimary</item>
<item name="folderTextColor">?android:attr/textColorPrimary</item>
<item name="isFolderDarkText">false</item>
- <item name="folderHintColor">#89CCCCCC</item>
+ <item name="folderHintColor">@color/folder_hint_text_color_light</item>
<item name="isMainColorDark">true</item>
<item name="loadingIconColor">#99FFFFFF</item>
<item name="iconOnlyShortcutColor">#B3FFFFFF</item>
@@ -120,17 +123,19 @@
</style>
<style name="LauncherTheme.Dark.DarkMainColor" parent="@style/LauncherTheme.Dark">
- <item name="folderFillColor">#FF3C4043</item> <!-- 100% GM2 800 -->
+ <item name="folderFillColor">?android:attr/colorBackgroundFloating</item>
<item name="folderTextColor">@android:color/white</item>
<item name="isFolderDarkText">false</item>
+ <item name="folderHintColor">@color/folder_hint_text_color_light</item>
<item name="disabledIconAlpha">.54</item>
</style>
<style name="LauncherTheme.Dark.DarkText" parent="@style/LauncherTheme.Dark">
<item name="android:colorControlHighlight">#19212121</item>
- <item name="folderFillColor">#CDFFFFFF</item>
+ <item name="folderFillColor">?android:attr/colorBackgroundFloating</item>
<item name="folderTextColor">?attr/workspaceTextColor</item>
<item name="isFolderDarkText">?attr/isWorkspaceDarkText</item>
+ <item name="folderHintColor">@color/folder_hint_text_color_dark</item>
<item name="workspaceTextColor">@color/workspace_text_color_dark</item>
<item name="workspaceShadowColor">@android:color/transparent</item>
<item name="workspaceAmbientShadowColor">@android:color/transparent</item>
@@ -149,16 +154,18 @@
<style name="AppTheme.Dark.DarkMainColor" parent="@style/LauncherTheme.Dark.DarkMainColor" />
<style name="AppTheme.Dark.DarkText" parent="@style/LauncherTheme.Dark.DarkText" />
- <style name="HomeSettingsTheme" parent="@android:style/Theme.DeviceDefault.Settings">
+ <style name="HomeSettings.Theme" parent="@android:style/Theme.DeviceDefault.Settings">
<item name="android:navigationBarColor">?android:colorPrimaryDark</item>
- <item name="preferenceTheme">@style/HomeSettingsPreferenceTheme</item>
+ <item name="android:windowActionBar">false</item>
+ <item name="android:windowNoTitle">true</item>
+ <item name="preferenceTheme">@style/HomeSettings.PreferenceTheme</item>
</style>
- <style name="HomeSettingsPreferenceTheme" parent="@style/PreferenceThemeOverlay.v14.Material">
- <item name="preferenceFragmentCompatStyle">@style/HomeSettingsFragmentCompatStyle</item>
+ <style name="HomeSettings.PreferenceTheme" parent="@style/PreferenceThemeOverlay.v14.Material">
+ <item name="preferenceFragmentCompatStyle">@style/HomeSettings.FragmentCompatStyle</item>
</style>
- <style name="HomeSettingsFragmentCompatStyle" parent="@style/PreferenceFragment.Material">
+ <style name="HomeSettings.FragmentCompatStyle" parent="@style/PreferenceFragment.Material">
<item name="android:layout">@layout/home_settings</item>
</style>
@@ -235,7 +242,7 @@
<!-- Icon displayed on the workspace -->
- <style name="BaseIcon.Workspace" >
+ <style name="BaseIcon.Workspace.Shadows" parent="BaseIcon">
<item name="android:shadowRadius">2.0</item>
<item name="android:shadowColor">?attr/workspaceShadowColor</item>
<item name="ambientShadowColor">?attr/workspaceAmbientShadowColor</item>
@@ -246,6 +253,10 @@
<item name="keyShadowOffsetY">.5dp</item>
</style>
+ <!-- Intentionally empty so we can override -->
+ <style name="BaseIcon.Workspace" parent="BaseIcon.Workspace.Shadows">
+ </style>
+
<!-- Theme for the popup container -->
<style name="PopupItem">
<item name="android:colorControlHighlight">?attr/popupColorTertiary</item>
@@ -282,8 +293,24 @@
<item name="android:colorForeground">@color/all_apps_bg_hand_fill_dark</item>
</style>
- <style name="Widget.DeviceDefault.Button.Rounded.Colored" parent="@android:style/Widget.DeviceDefault.Button.Colored">
- <item name="android:background">@drawable/add_item_dialog_button_background</item>
+ <style name="Button.TopRounded.Bordered" parent="@android:style/Widget.Material.Button">
+ <item name="android:background">@drawable/button_top_rounded_bordered_ripple</item>
+ <item name="android:stateListAnimator">@null</item>
+ </style>
+
+ <style name="Button.BottomRounded.Colored" parent="@android:style/Widget.Material.Button">
+ <item name="android:background">@drawable/button_bottom_rounded_colored_ripple</item>
+ <item name="android:stateListAnimator">@null</item>
+ </style>
+
+ <style name="Button.Rounded.Colored" parent="@android:style/Widget.Material.Button">
+ <item name="android:background">@drawable/button_rounded_colored_ripple</item>
+ <item name="android:stateListAnimator">@null</item>
+ </style>
+
+ <style name="Button.FullRounded.Colored" parent="@android:style/Widget.Material.Button">
+ <item name="android:background">@drawable/full_rounded_colored_ripple</item>
+ <item name="android:stateListAnimator">@null</item>
</style>
<style name="AddItemActivityTheme" parent="@android:style/Theme.Translucent.NoTitleBar">
diff --git a/res/xml/size_limits_80x104.xml b/res/xml/size_limits_80x104.xml
index f375549..f5ca757 100644
--- a/res/xml/size_limits_80x104.xml
+++ b/res/xml/size_limits_80x104.xml
@@ -62,10 +62,10 @@
<device-padding
launcher:maxEmptySpace="9999dp">
<workspaceTopPadding
- launcher:a="0.38"
+ launcher:a="0.40"
launcher:c="36dp"/>
<workspaceBottomPadding
- launcher:a="0.62"
+ launcher:a="0.60"
launcher:c="36dp"/>
<hotseatBottomPadding
launcher:a="0"
diff --git a/robolectric_tests/Android.bp b/robolectric_tests/Android.bp
index bf32362..9ed26ff 100644
--- a/robolectric_tests/Android.bp
+++ b/robolectric_tests/Android.bp
@@ -45,9 +45,14 @@
java_resources: [":launcher3-robolectric-resources"],
static_libs: [
"truth-prebuilt",
+ "androidx.test.espresso.contrib",
+ "androidx.test.espresso.core",
+ "androidx.test.espresso.intents",
+ "androidx.test.ext.junit",
"androidx.test.runner",
"androidx.test.rules",
"mockito-robolectric-prebuilt",
+ "SystemUISharedLib",
],
robolectric_prebuilt_version: "4.5.1",
instrumentation_for: "Launcher3",
diff --git a/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java b/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java
index aab6c25..a2abfd5 100644
--- a/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java
+++ b/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java
@@ -15,7 +15,7 @@
*/
package com.android.launcher3.model;
-import static com.android.launcher3.util.Executors.createAndStartNewForegroundLooper;
+import static com.android.launcher3.util.Executors.createAndStartNewLooper;
import static com.android.launcher3.util.LauncherModelHelper.TEST_PACKAGE;
import static org.junit.Assert.assertEquals;
@@ -74,7 +74,7 @@
// Since robolectric tests run on main thread, we run the loader-UI calls on a temp thread,
// so that we can wait appropriately for the loader to complete.
- mTempMainExecutor = new LooperExecutor(createAndStartNewForegroundLooper("tempMain"));
+ mTempMainExecutor = new LooperExecutor(createAndStartNewLooper("tempMain"));
ShadowLooperExecutor sle = Shadow.extract(Executors.MAIN_EXECUTOR);
sle.setHandler(mTempMainExecutor.getHandler());
}
diff --git a/robolectric_tests/src/com/android/launcher3/settings/SettingsActivityTest.java b/robolectric_tests/src/com/android/launcher3/settings/SettingsActivityTest.java
new file mode 100644
index 0000000..85bf28e
--- /dev/null
+++ b/robolectric_tests/src/com/android/launcher3/settings/SettingsActivityTest.java
@@ -0,0 +1,137 @@
+/*
+ * 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.
+ */
+
+package com.android.launcher3.settings;
+
+import static androidx.preference.PreferenceFragmentCompat.ARG_PREFERENCE_ROOT;
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.contrib.RecyclerViewActions.actionOnItem;
+import static androidx.test.espresso.intent.Intents.intended;
+import static androidx.test.espresso.intent.matcher.BundleMatchers.hasEntry;
+import static androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent;
+import static androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra;
+import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+import static androidx.test.espresso.matcher.ViewMatchers.withText;
+
+import static com.android.launcher3.settings.SettingsActivity.EXTRA_FRAGMENT;
+import static com.android.launcher3.settings.SettingsActivity.EXTRA_FRAGMENT_ARGS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.equalTo;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.espresso.intent.Intents;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.launcher3.R;
+import com.android.systemui.shared.plugins.PluginPrefs;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class SettingsActivityTest {
+
+ private Context mApplicationContext;
+
+ @Before
+ public void setUp() {
+ mApplicationContext = ApplicationProvider.getApplicationContext();
+ Intents.init();
+ }
+
+ @After
+ public void tearDown() {
+ Intents.release();
+ }
+
+ @Test
+ public void testSettings_aboutTap_launchesActivity() {
+ ActivityScenario.launch(SettingsActivity.class);
+ onView(withId(R.id.recycler_view)).perform(
+ actionOnItem(hasDescendant(withText("About")), click()));
+
+ intended(allOf(
+ hasComponent(SettingsActivity.class.getName()),
+ hasExtra(
+ equalTo(EXTRA_FRAGMENT_ARGS),
+ hasEntry(ARG_PREFERENCE_ROOT, "about_screen"))));
+ }
+
+ @Test
+ public void testSettings_developerOptionsTap_launchesActivityWithFragment() {
+ PluginPrefs.setHasPlugins(mApplicationContext);
+ ActivityScenario.launch(SettingsActivity.class);
+ onView(withId(R.id.recycler_view)).perform(
+ actionOnItem(hasDescendant(withText("Developer Options")), click()));
+
+ intended(allOf(
+ hasComponent(SettingsActivity.class.getName()),
+ hasExtra(EXTRA_FRAGMENT, DeveloperOptionsFragment.class.getName())));
+ }
+
+ @Test
+ public void testSettings_aboutScreenIntent() {
+ Bundle fragmentArgs = new Bundle();
+ fragmentArgs.putString(ARG_PREFERENCE_ROOT, "about_screen");
+
+ Intent intent = new Intent(mApplicationContext, SettingsActivity.class)
+ .putExtra(EXTRA_FRAGMENT_ARGS, fragmentArgs);
+ ActivityScenario.launch(intent);
+
+ onView(withText("About")).check(matches(isDisplayed()));
+ onView(withText("Version")).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void testSettings_developerOptionsFragmentIntent() {
+ Intent intent = new Intent(mApplicationContext, SettingsActivity.class)
+ .putExtra(EXTRA_FRAGMENT, DeveloperOptionsFragment.class.getName());
+ ActivityScenario.launch(intent);
+
+ onView(withText("Developer Options")).check(matches(isDisplayed()));
+ onView(withId(R.id.filter_box)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void testSettings_intentWithUnknownFragment() {
+ String fragmentClass = PreferenceFragmentCompat.class.getName();
+ Intent intent = new Intent(mApplicationContext, SettingsActivity.class)
+ .putExtra(EXTRA_FRAGMENT, fragmentClass);
+
+ try {
+ ActivityScenario.launch(intent);
+ Assert.fail("Should have thrown an IllegalArgumentException.");
+ } catch (IllegalArgumentException e) {
+ assertThat(e.getMessage()).contains(fragmentClass);
+ }
+ }
+}
diff --git a/robolectric_tests/src/com/android/launcher3/testing/TestActivity.java b/robolectric_tests/src/com/android/launcher3/testing/TestActivity.java
index dbf4b3e..17d0ac1 100644
--- a/robolectric_tests/src/com/android/launcher3/testing/TestActivity.java
+++ b/robolectric_tests/src/com/android/launcher3/testing/TestActivity.java
@@ -27,7 +27,12 @@
@Override
public BaseDragLayer getDragLayer() {
- return null;
+ return new BaseDragLayer(this, /* attrs= */ null, /* alphaChannelCount= */ 1) {
+ @Override
+ public void recreateControllers() {
+ // Do nothing.
+ }
+ };
}
@Override
diff --git a/robolectric_tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java b/robolectric_tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java
index d977011..d18138f 100644
--- a/robolectric_tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java
+++ b/robolectric_tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java
@@ -20,8 +20,10 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
+import android.appwidget.AppWidgetHostView;
import android.content.Context;
import android.graphics.Point;
+import android.graphics.Rect;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.InvariantDeviceProfile;
@@ -110,6 +112,47 @@
assertThat(info.minSpanY).isEqualTo(2);
}
+ @Test
+ public void initSpans_minResizeWidthWithCellSpacingAndWidgetInset_shouldInitializeMinSpans() {
+ InvariantDeviceProfile idp = createIDP();
+ DeviceProfile dp = idp.supportedProfiles.get(0);
+ Rect padding = new Rect();
+ AppWidgetHostView.getDefaultPaddingForWidget(mContext, null, padding);
+ int maxPadding = Math.max(Math.max(padding.left, padding.right),
+ Math.max(padding.top, padding.bottom));
+ dp.cellLayoutBorderSpacingPx = maxPadding + 1;
+ Mockito.when(dp.shouldInsetWidgets()).thenReturn(true);
+
+ LauncherAppWidgetProviderInfo info = new LauncherAppWidgetProviderInfo();
+ info.minResizeWidth = CELL_SIZE * 2 + maxPadding;
+ info.minResizeHeight = CELL_SIZE * 2 + maxPadding;
+
+ info.initSpans(mContext, idp);
+
+ assertThat(info.minSpanX).isEqualTo(2);
+ assertThat(info.minSpanY).isEqualTo(2);
+ }
+
+ @Test
+ public void initSpans_minResizeWidthWithCellSpacingAndNoWidgetInset_shouldInitializeMinSpans() {
+ InvariantDeviceProfile idp = createIDP();
+ DeviceProfile dp = idp.supportedProfiles.get(0);
+ Rect padding = new Rect();
+ AppWidgetHostView.getDefaultPaddingForWidget(mContext, null, padding);
+ int maxPadding = Math.max(Math.max(padding.left, padding.right),
+ Math.max(padding.top, padding.bottom));
+ dp.cellLayoutBorderSpacingPx = maxPadding - 1;
+ Mockito.when(dp.shouldInsetWidgets()).thenReturn(false);
+ LauncherAppWidgetProviderInfo info = new LauncherAppWidgetProviderInfo();
+ info.minResizeWidth = CELL_SIZE * 2 + maxPadding;
+ info.minResizeHeight = CELL_SIZE * 2 + maxPadding;
+
+ info.initSpans(mContext, idp);
+
+ assertThat(info.minSpanX).isEqualTo(3);
+ assertThat(info.minSpanY).isEqualTo(3);
+ }
+
private InvariantDeviceProfile createIDP() {
DeviceProfile profile = Mockito.mock(DeviceProfile.class);
doAnswer(i -> {
diff --git a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListAdapterTest.java b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListAdapterTest.java
index 6b5678c..e1214ff 100644
--- a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListAdapterTest.java
+++ b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListAdapterTest.java
@@ -82,7 +82,7 @@
mTestProfile.numColumns = 5;
mUserHandle = Process.myUserHandle();
mAdapter = new WidgetsListAdapter(mContext, mMockLayoutInflater, mMockWidgetCache,
- mIconCache, null, null, null);
+ mIconCache, null, null);
mAdapter.registerAdapterDataObserver(mListener);
doAnswer(invocation -> ((ComponentWithLabel) invocation.getArgument(0))
diff --git a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java
index 12a092d..84a03d5 100644
--- a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java
+++ b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java
@@ -105,8 +105,7 @@
mWidgetPreviewLoader,
mIconCache,
/* iconClickListener= */ view -> {},
- /* iconLongClickListener= */ view -> false,
- /* searchBarUIHelper= */ null);
+ /* iconLongClickListener= */ view -> false);
mViewHolderBinder = new WidgetsListHeaderViewHolderBinder(
LayoutInflater.from(mTestActivity), mOnHeaderClickListener, widgetsListAdapter);
}
diff --git a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderViewHolderBinderTest.java b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderViewHolderBinderTest.java
index e090341..075c58d 100644
--- a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderViewHolderBinderTest.java
+++ b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderViewHolderBinderTest.java
@@ -105,8 +105,7 @@
mWidgetPreviewLoader,
mIconCache,
/* iconClickListener= */ view -> {},
- /* iconLongClickListener= */ view -> false,
- /* searchBarUIHelper= */ null);
+ /* iconLongClickListener= */ view -> false);
mViewHolderBinder = new WidgetsListSearchHeaderViewHolderBinder(
LayoutInflater.from(mTestActivity), mOnHeaderClickListener, widgetsListAdapter);
}
diff --git a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java
index 0935d1c..0c6e717 100644
--- a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java
+++ b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java
@@ -111,8 +111,7 @@
mWidgetPreviewLoader,
mIconCache,
/* iconClickListener= */ view -> {},
- /* iconLongClickListener= */ view -> false,
- /* searchBarUIHelper= */ null);
+ /* iconLongClickListener= */ view -> false);
mViewHolderBinder = new WidgetsListTableViewHolderBinder(
mContext,
LayoutInflater.from(mTestActivity),
diff --git a/robolectric_tests/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarControllerTest.java b/robolectric_tests/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarControllerTest.java
index 4e6f17c..7ac879a 100644
--- a/robolectric_tests/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarControllerTest.java
+++ b/robolectric_tests/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarControllerTest.java
@@ -22,21 +22,23 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
-import android.content.Context;
import android.view.View;
import android.widget.ImageButton;
import com.android.launcher3.ExtendedEditText;
import com.android.launcher3.search.SearchAlgorithm;
+import com.android.launcher3.testing.TestActivity;
import com.android.launcher3.widget.model.WidgetsListBaseEntry;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
import java.util.ArrayList;
@@ -44,7 +46,9 @@
public class WidgetsSearchBarControllerTest {
private WidgetsSearchBarController mController;
- private Context mContext;
+ // TODO: Replace ActivityController with ActivityScenario, which is the recommended way for
+ // activity testing.
+ private ActivityController<TestActivity> mActivityController;
private ExtendedEditText mEditText;
private ImageButton mCancelButton;
@Mock
@@ -55,13 +59,20 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mEditText = new ExtendedEditText(mContext);
- mCancelButton = new ImageButton(mContext);
+ mActivityController = Robolectric.buildActivity(TestActivity.class);
+ TestActivity testActivity = mActivityController.setup().get();
+
+ mEditText = new ExtendedEditText(testActivity);
+ mCancelButton = new ImageButton(testActivity);
mController = new WidgetsSearchBarController(
mSearchAlgorithm, mEditText, mCancelButton, mSearchModeListener);
}
+ @After
+ public void tearDown() {
+ mActivityController.destroy();
+ }
+
@Test
public void onSearchResult_shouldInformSearchModeListener() {
ArrayList<WidgetsListBaseEntry> entries = new ArrayList<>();
diff --git a/robolectric_tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java b/robolectric_tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java
index e68edd3..56d7d68 100644
--- a/robolectric_tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java
+++ b/robolectric_tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java
@@ -96,12 +96,12 @@
List<ArrayList<WidgetItem>> widgetItemInTable = WidgetsTableUtils.groupWidgetItemsIntoTable(
widgetItems, /* maxSpansPerRow= */ 5);
- // Row 0: 1x1, 2x2, 2x3
- // Row 1: 2x4
+ // Row 0: 1x1, 2x2
+ // Row 1: 2x3, 2x4
// Row 2: 4x4
assertThat(widgetItemInTable).hasSize(3);
- assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1, mWidget2x2, mWidget2x3);
- assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x4);
+ assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1, mWidget2x2);
+ assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x3, mWidget2x4);
assertThat(widgetItemInTable.get(2)).containsExactly(mWidget4x4);
}
@@ -114,12 +114,14 @@
widgetItems, /* maxSpansPerRow= */ 4);
// Row 0: 1x1, 2x2
- // Row 1: 2x3, 2x4
- // Row 2: 4x4
- assertThat(widgetItemInTable).hasSize(3);
+ // Row 1: 2x3,
+ // Row 2: 2x4,
+ // Row 3: 4x4
+ assertThat(widgetItemInTable).hasSize(4);
assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1, mWidget2x2);
- assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x3, mWidget2x4);
- assertThat(widgetItemInTable.get(2)).containsExactly(mWidget4x4);
+ assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x3);
+ assertThat(widgetItemInTable.get(2)).containsExactly(mWidget2x4);
+ assertThat(widgetItemInTable.get(3)).containsExactly(mWidget4x4);
}
@Test
@@ -131,14 +133,16 @@
widgetItems, /* maxSpansPerRow= */ 4);
// Row 0: 1x1, 2x2
- // Row 1: 2x3, 2x4
- // Row 2: 4x4
- // Row 3: shortcut3, shortcut1, shortcut2
- assertThat(widgetItemInTable).hasSize(4);
+ // Row 1: 2x3,
+ // Row 2: 2x4,
+ // Row 3: 4x4
+ // Row 4: shortcut3, shortcut1, shortcut2
+ assertThat(widgetItemInTable).hasSize(5);
assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1, mWidget2x2);
- assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x3, mWidget2x4);
- assertThat(widgetItemInTable.get(2)).containsExactly(mWidget4x4);
- assertThat(widgetItemInTable.get(3)).containsExactly(mShortcut3, mShortcut2, mShortcut1);
+ assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x3);
+ assertThat(widgetItemInTable.get(2)).containsExactly(mWidget2x4);
+ assertThat(widgetItemInTable.get(3)).containsExactly(mWidget4x4);
+ assertThat(widgetItemInTable.get(4)).containsExactly(mShortcut3, mShortcut2, mShortcut1);
}
private void initTestWidgets() {
diff --git a/src/com/android/launcher3/AbstractFloatingView.java b/src/com/android/launcher3/AbstractFloatingView.java
index b3952ca..4979b40 100644
--- a/src/com/android/launcher3/AbstractFloatingView.java
+++ b/src/com/android/launcher3/AbstractFloatingView.java
@@ -39,7 +39,6 @@
import com.android.launcher3.util.TouchController;
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.BaseDragLayer;
-import com.android.launcher3.widget.LocalColorExtractor;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -64,7 +63,8 @@
TYPE_TASK_MENU,
TYPE_OPTIONS_POPUP,
TYPE_ICON_SURFACE,
- TYPE_PIN_WIDGET_FROM_EXTERNAL_POPUP
+ TYPE_PIN_WIDGET_FROM_EXTERNAL_POPUP,
+ TYPE_WIDGETS_EDUCATION_DIALOG
})
@Retention(RetentionPolicy.SOURCE)
public @interface FloatingViewType {}
@@ -86,17 +86,19 @@
public static final int TYPE_ICON_SURFACE = 1 << 13;
public static final int TYPE_PIN_WIDGET_FROM_EXTERNAL_POPUP = 1 << 14;
+ public static final int TYPE_WIDGETS_EDUCATION_DIALOG = 1 << 15;
public static final int TYPE_ALL = TYPE_FOLDER | TYPE_ACTION_POPUP
| TYPE_WIDGETS_BOTTOM_SHEET | TYPE_WIDGET_RESIZE_FRAME | TYPE_WIDGETS_FULL_SHEET
| TYPE_ON_BOARD_POPUP | TYPE_DISCOVERY_BOUNCE | TYPE_TASK_MENU
| TYPE_OPTIONS_POPUP | TYPE_SNACKBAR | TYPE_LISTENER | TYPE_ALL_APPS_EDU
- | TYPE_ICON_SURFACE | TYPE_DRAG_DROP_POPUP | TYPE_PIN_WIDGET_FROM_EXTERNAL_POPUP;
+ | TYPE_ICON_SURFACE | TYPE_DRAG_DROP_POPUP | TYPE_PIN_WIDGET_FROM_EXTERNAL_POPUP
+ | TYPE_WIDGETS_EDUCATION_DIALOG;
// Type of popups which should be kept open during launcher rebind
public static final int TYPE_REBIND_SAFE = TYPE_WIDGETS_FULL_SHEET
| TYPE_WIDGETS_BOTTOM_SHEET | TYPE_ON_BOARD_POPUP | TYPE_DISCOVERY_BOUNCE
- | TYPE_ALL_APPS_EDU | TYPE_ICON_SURFACE;
+ | TYPE_ALL_APPS_EDU | TYPE_ICON_SURFACE | TYPE_WIDGETS_EDUCATION_DIALOG;
// Usually we show the back button when a floating view is open. Instead, hide for these types.
public static final int TYPE_HIDE_BACK_BUTTON = TYPE_ON_BOARD_POPUP | TYPE_DISCOVERY_BOUNCE
@@ -112,21 +114,12 @@
protected boolean mIsOpen;
- // Index used to get background color when using local wallpaper color extraction.
- protected int mColorExtractionIndex;
-
public AbstractFloatingView(Context context, AttributeSet attrs) {
super(context, attrs);
- init(context);
}
public AbstractFloatingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- init(context);
- }
-
- private void init(Context context) {
- mColorExtractionIndex = LocalColorExtractor.getColorIndex(context);
}
/**
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index 322c6ee..4f0ef12 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -119,7 +119,7 @@
};
private final ActivityContext mActivity;
- private Drawable mIcon;
+ private FastBitmapDrawable mIcon;
private boolean mCenterVertically;
protected final int mDisplay;
@@ -140,7 +140,7 @@
private DotInfo mDotInfo;
private DotRenderer mDotRenderer;
@ViewDebug.ExportedProperty(category = "launcher", deepExport = true)
- private DotRenderer.DrawParams mDotParams;
+ protected DotRenderer.DrawParams mDotParams;
private Animator mDotScaleAnim;
private boolean mForceHideDot;
@@ -319,7 +319,7 @@
protected void applyIconAndLabel(ItemInfoWithIcon info) {
boolean useTheme = mDisplay == DISPLAY_WORKSPACE || mDisplay == DISPLAY_FOLDER;
FastBitmapDrawable iconDrawable = info.newIcon(getContext(), useTheme);
- mDotParams.color = IconPalette.getMutedColor(info.bitmap.color, 0.54f);
+ mDotParams.color = IconPalette.getMutedColor(iconDrawable.getIconColor(), 0.54f);
setIcon(iconDrawable);
applyLabel(info);
@@ -336,16 +336,6 @@
}
/**
- * Directly set the icon and label.
- */
- @UiThread
- public void applyIconAndLabel(Drawable icon, CharSequence label) {
- setIcon(icon);
- setText(label);
- setContentDescription(label);
- }
-
- /**
* Overrides the default long press timeout.
*/
public void setLongPressTimeoutFactor(float longPressTimeoutFactor) {
@@ -369,7 +359,7 @@
}
/** Returns the icon for this view. */
- public Drawable getIcon() {
+ public FastBitmapDrawable getIcon() {
return mIcon;
}
@@ -704,7 +694,7 @@
/**
* Sets the icon for this view based on the layout direction.
*/
- protected void setIcon(Drawable icon) {
+ protected void setIcon(FastBitmapDrawable icon) {
if (mIsIconVisible) {
applyCompoundDrawables(icon);
}
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 1df9df6..bfa1769 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -1080,9 +1080,10 @@
cellToRect(targetCell[0], targetCell[1], spanX, spanY, mTempRect);
// Now get the rect in drag layer coordinates.
- getBoundsForViewInDragLayer(launcher.getDragLayer(), workspace, mTempRect, false,
+ getBoundsForViewInDragLayer(launcher.getDragLayer(), this, mTempRect, true,
mTmpFloatArray, mTempRectF);
Utilities.setRect(mTempRectF, mTempRect);
+
((LauncherAppWidgetHostView) view).handleDrag(mTempRect, pageId);
}
}
@@ -2594,7 +2595,9 @@
final int cellWidth = mCellWidth;
final int cellHeight = mCellHeight;
- final int hStartPadding = getPaddingLeft();
+ // We observe a shift of 1 pixel on the x coordinate compared to the actual cell coordinates
+ final int hStartPadding = getPaddingLeft()
+ + (int) Math.ceil(getUnusedHorizontalSpace() / 2f);
final int vStartPadding = getPaddingTop();
int x = hStartPadding + (cellX * mBorderSpacing) + (cellX * cellWidth);
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 8126673..cdc09f1 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -170,6 +170,8 @@
public int overviewTaskMarginPx;
public int overviewTaskIconSizePx;
public int overviewTaskThumbnailTopMarginPx;
+ public final int overviewActionsMarginThreeButtonPx;
+ public final int overviewActionsMarginGesturePx;
// Widgets
public final PointF appWidgetScale = new PointF(1.0f, 1.0f);
@@ -338,6 +340,10 @@
R.dimen.task_thumbnail_icon_size_grid) : res.getDimensionPixelSize(
R.dimen.task_thumbnail_icon_size);
overviewTaskThumbnailTopMarginPx = overviewTaskIconSizePx + overviewTaskMarginPx * 2;
+ overviewActionsMarginGesturePx = res.getDimensionPixelSize(
+ R.dimen.overview_actions_bottom_margin_gesture);
+ overviewActionsMarginThreeButtonPx = res.getDimensionPixelSize(
+ R.dimen.overview_actions_bottom_margin_three_button);
// Calculate all of the remaining variables.
extraSpace = updateAvailableDimensions(res);
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index b6cc6d6..dabbdd3 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -81,6 +81,8 @@
public LauncherAppState(Context context) {
this(context, LauncherFiles.APP_ICONS_DB);
+ Log.v(Launcher.TAG, "LauncherAppState initiated");
+ Preconditions.assertUIThread();
mInvariantDeviceProfile.addOnChangeListener(idp -> refreshAndReloadLauncher());
@@ -132,8 +134,6 @@
}
public LauncherAppState(Context context, @Nullable String iconCacheFileName) {
- Log.v(Launcher.TAG, "LauncherAppState initiated");
- Preconditions.assertUIThread();
mContext = context;
mInvariantDeviceProfile = InvariantDeviceProfile.INSTANCE.get(context);
@@ -142,6 +142,7 @@
iconCacheFileName, mIconProvider);
mWidgetCache = new WidgetPreviewLoader(mContext, mIconCache);
mModel = new LauncherModel(context, this, mIconCache, new AppFilter(mContext));
+ mOnTerminateCallback.add(mIconCache::close);
}
private void onNotificationSettingsChanged(boolean areNotificationDotsEnabled) {
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index b26a7ea..b423871 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -250,6 +250,15 @@
forceFinishScroller(true);
}
+ /**
+ * Immediately finishes any overscroll effect and jumps to the end of the scroller animation.
+ */
+ public void abortScrollerAnimation() {
+ mEdgeGlowLeft.finish();
+ mEdgeGlowRight.finish();
+ abortScrollerAnimation(true);
+ }
+
private void abortScrollerAnimation(boolean resetNextPage) {
mScroller.abortAnimation();
// We need to clean up the next page here to avoid computeScrollHelper from
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 2884fba..cb9e1f3 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -74,10 +74,10 @@
import com.android.launcher3.dragndrop.FolderAdaptiveIcon;
import com.android.launcher3.graphics.GridCustomizationsProvider;
import com.android.launcher3.graphics.TintedDrawableSpan;
+import com.android.launcher3.icons.BitmapInfo;
import com.android.launcher3.icons.FastBitmapDrawable;
import com.android.launcher3.icons.LauncherIcons;
import com.android.launcher3.icons.ShortcutCachingLogic;
-import com.android.launcher3.icons.ThemedIconDrawable.ThemedAdaptiveIcon;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.ItemInfoWithIcon;
import com.android.launcher3.pm.ShortcutConfigActivityInfo;
@@ -654,8 +654,8 @@
public static Drawable getFullDrawable(Launcher launcher, ItemInfo info, int width, int height,
Object[] outObj) {
Drawable icon = loadFullDrawableWithoutTheme(launcher, info, width, height, outObj);
- if (icon instanceof ThemedAdaptiveIcon) {
- icon = ((ThemedAdaptiveIcon) icon).getThemedDrawable(launcher);
+ if (icon instanceof BitmapInfo.Extender) {
+ icon = ((BitmapInfo.Extender) icon).getThemedDrawable(launcher);
}
return icon;
}
diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java
index 75d25d7..c7323d0 100644
--- a/src/com/android/launcher3/WidgetPreviewLoader.java
+++ b/src/com/android/launcher3/WidgetPreviewLoader.java
@@ -21,9 +21,7 @@
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
import android.graphics.RectF;
-import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.CancellationSignal;
@@ -35,9 +33,7 @@
import android.util.Pair;
import androidx.annotation.Nullable;
-import androidx.annotation.UiThread;
-import com.android.launcher3.icons.FastBitmapDrawable;
import com.android.launcher3.icons.GraphicsUtils;
import com.android.launcher3.icons.IconCache;
import com.android.launcher3.icons.LauncherIcons;
@@ -94,51 +90,6 @@
}
/**
- * Returns a drawable that can be used as a badge for the user or null.
- */
- @UiThread
- public Drawable getBadgeForUser(UserHandle user, int badgeSize) {
- if (mMyUser.equals(user)) {
- return null;
- }
-
- Bitmap badgeBitmap = getUserBadge(user, badgeSize);
- FastBitmapDrawable d = new FastBitmapDrawable(badgeBitmap);
- d.setFilterBitmap(true);
- d.setBounds(0, 0, badgeBitmap.getWidth(), badgeBitmap.getHeight());
- return d;
- }
-
- private Bitmap getUserBadge(UserHandle user, int badgeSize) {
- synchronized (mUserBadges) {
- Bitmap badgeBitmap = mUserBadges.get(user);
- if (badgeBitmap != null) {
- return badgeBitmap;
- }
-
- final Resources res = mContext.getResources();
- badgeBitmap = Bitmap.createBitmap(badgeSize, badgeSize, Bitmap.Config.ARGB_8888);
-
- Drawable drawable = mContext.getPackageManager().getUserBadgedDrawableForDensity(
- new BitmapDrawable(res, badgeBitmap), user,
- new Rect(0, 0, badgeSize, badgeSize),
- 0);
- if (drawable instanceof BitmapDrawable) {
- badgeBitmap = ((BitmapDrawable) drawable).getBitmap();
- } else {
- badgeBitmap.eraseColor(Color.TRANSPARENT);
- Canvas c = new Canvas(badgeBitmap);
- drawable.setBounds(0, 0, badgeSize, badgeSize);
- drawable.draw(c);
- c.setBitmap(null);
- }
-
- mUserBadges.put(user, badgeBitmap);
- return badgeBitmap;
- }
- }
-
- /**
* Generates the widget preview on {@link AsyncTask#THREAD_POOL_EXECUTOR}. Must be
* called on UI thread
*
@@ -434,27 +385,29 @@
previewHeight = Math.max((int)(scale * previewHeight), 1);
}
- // If a bitmap is passed in, we use it; otherwise, we create a bitmap of the right size
final Canvas c = new Canvas();
if (preview == null) {
+ // If no bitmap was provided, then allocate a new one with the right size.
preview = Bitmap.createBitmap(previewWidth, previewHeight, Config.ARGB_8888);
c.setBitmap(preview);
} else {
- // We use the preview bitmap height to determine where the badge will be drawn in the
- // UI. If its larger than what we need, resize the preview bitmap so that there are
- // no transparent pixels between the preview and the badge.
- if (preview.getHeight() > previewHeight) {
- preview.reconfigure(preview.getWidth(), previewHeight, preview.getConfig());
+ // If a bitmap was passed in, attempt to reconfigure the bitmap to the same dimensions
+ // as the preview.
+ try {
+ preview.reconfigure(previewWidth, previewHeight, preview.getConfig());
+ } catch (IllegalArgumentException e) {
+ // This occurs if the preview can't be reconfigured for any reason. In this case,
+ // allocate a new bitmap with the right size.
+ preview = Bitmap.createBitmap(previewWidth, previewHeight, Config.ARGB_8888);
}
- // Reusing bitmap. Clear it.
+
c.setBitmap(preview);
c.drawColor(0, PorterDuff.Mode.CLEAR);
}
// Draw the scaled preview into the final bitmap
- int x = (preview.getWidth() - previewWidth) / 2;
if (widgetPreviewExists) {
- drawable.setBounds(x, 0, x + previewWidth, previewHeight);
+ drawable.setBounds(0, 0, previewWidth, previewHeight);
drawable.draw(c);
} else {
RectF boxRect;
@@ -614,6 +567,7 @@
@Thunk long[] mVersions;
@Thunk Bitmap mBitmapToRecycle;
+ @Nullable private Bitmap mUnusedPreviewBitmap;
private boolean mSaveToDB = false;
PreviewLoadTask(WidgetCacheKey key, WidgetItem info, int previewWidth,
@@ -674,6 +628,11 @@
Pair<Bitmap, Boolean> pair = generatePreview(mActivity, mInfo, unusedBitmap,
mPreviewWidth, mPreviewHeight);
preview = pair.first;
+
+ if (preview != unusedBitmap) {
+ mUnusedPreviewBitmap = unusedBitmap;
+ }
+
this.mSaveToDB = pair.second;
}
return preview;
@@ -688,6 +647,14 @@
MODEL_EXECUTOR.post(new Runnable() {
@Override
public void run() {
+ if (mUnusedPreviewBitmap != null) {
+ // If we didn't end up using the bitmap, it can be added back into the
+ // recycled set.
+ synchronized (mUnusedBitmaps) {
+ mUnusedBitmaps.add(mUnusedPreviewBitmap);
+ }
+ }
+
if (!isCancelled() && mSaveToDB) {
// If we are still using this preview, then write it to the DB and then
// let the normal clear mechanism recycle the bitmap
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 5ba7623..d136cda 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -103,6 +103,7 @@
import com.android.launcher3.util.ItemInfoMatcher;
import com.android.launcher3.util.OverlayEdgeEffect;
import com.android.launcher3.util.PackageUserKey;
+import com.android.launcher3.util.RunnableList;
import com.android.launcher3.util.Thunk;
import com.android.launcher3.util.WallpaperOffsetInterpolator;
import com.android.launcher3.widget.LauncherAppWidgetHost;
@@ -426,10 +427,9 @@
// When a accessible drag is started by the folder, we only allow rearranging withing the
// folder.
boolean addNewPage = !(options.isAccessibleDrag && dragObject.dragSource != this);
-
if (addNewPage) {
mDeferRemoveExtraEmptyScreen = false;
- addExtraEmptyScreenOnDrag();
+ addExtraEmptyScreenOnDrag(dragObject);
if (dragObject.dragInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET
&& dragObject.dragSource != this) {
@@ -636,12 +636,19 @@
return newScreen;
}
- public void addExtraEmptyScreenOnDrag() {
+ private void addExtraEmptyScreenOnDrag(DragObject dragObject) {
boolean lastChildOnScreen = false;
boolean childOnFinalScreen = false;
if (mDragSourceInternal != null) {
- if (mDragSourceInternal.getChildCount() == 1) {
+ // When the drag view content is a LauncherAppWidgetHostView, we should increment the
+ // drag source child count by 1 because the widget in drag has been detached from its
+ // original parent, ShortcutAndWidgetContainer, and reattached to the DragView.
+ int dragSourceChildCount =
+ dragObject.dragView.getContentView() instanceof LauncherAppWidgetHostView
+ ? mDragSourceInternal.getChildCount() + 1
+ : mDragSourceInternal.getChildCount();
+ if (dragSourceChildCount == 1) {
lastChildOnScreen = true;
}
CellLayout cl = (CellLayout) mDragSourceInternal.getParent();
@@ -1921,10 +1928,16 @@
if (droppedOnOriginalCellDuringTransition) {
// Animate the item to its original position, while simultaneously exiting
// spring-loaded mode so the page meets the icon where it was picked up.
+ final RunnableList callbackList = new RunnableList();
+ final Runnable onCompleteCallback = onCompleteRunnable;
mLauncher.getDragController().animateDragViewToOriginalPosition(
- onCompleteRunnable, cell,
+ /* onComplete= */ callbackList::executeAllAndDestroy, cell,
SPRING_LOADED.getTransitionDuration(mLauncher));
- mLauncher.getStateManager().goToState(NORMAL);
+ mLauncher.getStateManager().goToState(NORMAL, /* delay= */ 0,
+ onCompleteCallback == null
+ ? null
+ : forSuccessCallback(
+ () -> callbackList.add(onCompleteCallback)));
mLauncher.getDropTargetBar().onDragEnd();
parent.onDropChild(cell);
return;
@@ -2953,10 +2966,11 @@
};
final Workspace.ItemOperator packageAndUserAndApp = (ItemInfo info, View view) ->
info != null
- && info.getTargetComponent() != null
- && TextUtils.equals(info.getTargetComponent().getPackageName(), packageName)
+ && info.itemType == ITEM_TYPE_APPLICATION
&& info.user.equals(user)
- && info.itemType == ITEM_TYPE_APPLICATION;
+ && info.getTargetComponent() != null
+ && TextUtils.equals(info.getTargetComponent().getPackageName(),
+ packageName);
final Workspace.ItemOperator packageAndUserAndAppInFolder = (info, view) -> {
if (info instanceof FolderInfo) {
FolderInfo folderInfo = (FolderInfo) info;
@@ -2973,7 +2987,7 @@
cellLayouts.add(getHotseat());
forEachVisiblePage(page -> cellLayouts.add((CellLayout) page));
- // Order: App icons, app in folder. Items in hotseat get returned first.
+ // Order: Preferred item, App icons in hotseat/workspace, app in folder in hotseat/workspace
if (ADAPTIVE_ICON_WINDOW_ANIM.get()) {
return getFirstMatch(cellLayouts, preferredItem, preferredItemInFolder,
packageAndUserAndApp, packageAndUserAndAppInFolder);
@@ -3010,34 +3024,17 @@
}
/**
+ * Finds the first view matching the ordered operators across the given cell layouts by order.
* @param cellLayouts List of CellLayouts to scan, in order of preference.
* @param operators List of operators, in order starting from best matching operator.
- * @return
*/
View getFirstMatch(Iterable<CellLayout> cellLayouts, final ItemOperator... operators) {
- // This array is filled with the first match for each operator.
- final View[] matches = new View[operators.length];
- // For efficiency, the outer loop should be CellLayout.
- for (CellLayout cellLayout : cellLayouts) {
- mapOverCellLayout(cellLayout, (info, v) -> {
- for (int i = 0; i < operators.length; ++i) {
- if (matches[i] == null && operators[i].evaluate(info, v)) {
- matches[i] = v;
- if (i == 0) {
- // We can return since this is the best match possible.
- return true;
- }
- }
+ for (ItemOperator operator : operators) {
+ for (CellLayout cellLayout : cellLayouts) {
+ View match = mapOverCellLayout(cellLayout, operator);
+ if (match != null) {
+ return match;
}
- return false;
- });
- if (matches[0] != null) {
- break;
- }
- }
- for (View match : matches) {
- if (match != null) {
- return match;
}
}
return null;
@@ -3111,16 +3108,16 @@
*/
public void mapOverItems(ItemOperator op) {
for (CellLayout layout : getWorkspaceAndHotseatCellLayouts()) {
- if (mapOverCellLayout(layout, op)) {
+ if (mapOverCellLayout(layout, op) != null) {
return;
}
}
}
- private boolean mapOverCellLayout(CellLayout layout, ItemOperator op) {
+ private View mapOverCellLayout(CellLayout layout, ItemOperator op) {
// TODO(b/128460496) Potential race condition where layout is not yet loaded
if (layout == null) {
- return false;
+ return null;
}
ShortcutAndWidgetContainer container = layout.getShortcutsAndWidgets();
// map over all the shortcuts on the workspace
@@ -3128,10 +3125,10 @@
for (int itemIdx = 0; itemIdx < itemCount; itemIdx++) {
View item = container.getChildAt(itemIdx);
if (op.evaluate((ItemInfo) item.getTag(), item)) {
- return true;
+ return item;
}
}
- return false;
+ return null;
}
void updateShortcuts(List<WorkspaceItemInfo> shortcuts) {
diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java
index c771e3e..1b9647a 100644
--- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java
+++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java
@@ -27,6 +27,7 @@
import static com.android.launcher3.LauncherState.HOTSEAT_ICONS;
import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.LauncherState.WORKSPACE_PAGE_INDICATOR;
+import static com.android.launcher3.anim.Interpolators.ACCEL_2;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import static com.android.launcher3.anim.Interpolators.ZOOM_OUT;
import static com.android.launcher3.anim.PropertySetter.NO_ANIM_PROPERTY_SETTER;
@@ -168,7 +169,7 @@
propertySetter.setViewBackgroundColor(mLauncher.getScrimView(),
state.getWorkspaceScrimColor(mLauncher),
- config.getInterpolator(ANIM_SCRIM_FADE, LINEAR));
+ config.getInterpolator(ANIM_SCRIM_FADE, ACCEL_2));
}
public void applyChildState(LauncherState state, CellLayout cl, int childIndex) {
diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java
index 9df95bf..cb20fec 100644
--- a/src/com/android/launcher3/allapps/AllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java
@@ -127,7 +127,6 @@
private Rect mInsets = new Rect();
private SearchAdapterProvider mSearchAdapterProvider;
- private final int mHeaderTopPadding;
private final int mScrimColor;
private final int mHeaderProtectionColor;
private final float mHeaderThreshold;
@@ -135,7 +134,6 @@
private int mHeaderColor;
-
public AllAppsContainerView(Context context) {
this(context, null);
}
@@ -152,9 +150,7 @@
mScrimColor = Themes.getAttrColor(context, R.attr.allAppsScrimColor);
mHeaderThreshold = getResources().getDimensionPixelSize(
R.dimen.dynamic_grid_cell_border_spacing);
- mHeaderTopPadding = context.getResources()
- .getDimensionPixelSize(R.dimen.all_apps_header_top_padding);
- mHeaderProtectionColor = context.getColor(R.color.all_apps_tab_bg);
+ mHeaderProtectionColor = Themes.getAttrColor(context, R.attr.allappsHeaderProtectionColor);
mLauncher.addOnDeviceProfileChangeListener(this);
@@ -845,7 +841,7 @@
* redraws header protection
*/
public void invalidateHeader() {
- if (mScrimView != null) {
+ if (mScrimView != null && FeatureFlags.ENABLE_DEVICE_SEARCH.get()) {
mScrimView.invalidate();
}
}
diff --git a/src/com/android/launcher3/allapps/AllAppsStore.java b/src/com/android/launcher3/allapps/AllAppsStore.java
index 355ccad..2443b83 100644
--- a/src/com/android/launcher3/allapps/AllAppsStore.java
+++ b/src/com/android/launcher3/allapps/AllAppsStore.java
@@ -17,6 +17,7 @@
import static com.android.launcher3.model.data.AppInfo.COMPONENT_KEY_COMPARATOR;
import static com.android.launcher3.model.data.AppInfo.EMPTY_ARRAY;
+import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_SHOW_DOWNLOAD_PROGRESS_MASK;
import android.view.View;
import android.view.ViewGroup;
@@ -157,11 +158,17 @@
* If this app is installed and supports incremental downloads, the progress bar will be updated
* the app's total download progress. Otherwise, the progress bar will be updated to the app's
* installation progress.
+ *
+ * If this app is fully downloaded, the app icon will be reapplied.
*/
public void updateProgressBar(AppInfo app) {
updateAllIcons((child) -> {
if (child.getTag() == app) {
- child.applyProgressLevel();
+ if ((app.runtimeStatusFlags & FLAG_SHOW_DOWNLOAD_PROGRESS_MASK) == 0) {
+ child.applyFromApplicationInfo(app);
+ } else {
+ child.applyProgressLevel();
+ }
}
});
}
diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
index 3a61609..8ec8269 100644
--- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -37,6 +37,7 @@
import com.android.launcher3.LauncherState;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatorListeners;
+import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.anim.PropertySetter;
import com.android.launcher3.config.FeatureFlags;
@@ -56,6 +57,7 @@
*/
public class AllAppsTransitionController
implements StateHandler<LauncherState>, OnDeviceProfileChangeListener {
+ private static final float CONTENT_VISIBLE_MAX_THRESHOLD = 0.5f;
public static final FloatProperty<AllAppsTransitionController> ALL_APPS_PROGRESS =
new FloatProperty<AllAppsTransitionController>("allAppsProgress") {
@@ -177,7 +179,8 @@
int visibleElements = state.getVisibleElements(mLauncher);
boolean hasAllAppsContent = (visibleElements & ALL_APPS_CONTENT) != 0;
- Interpolator allAppsFade = config.getInterpolator(ANIM_ALL_APPS_FADE, LINEAR);
+ Interpolator allAppsFade = config.getInterpolator(ANIM_ALL_APPS_FADE,
+ Interpolators.clampToProgress(LINEAR, 0, CONTENT_VISIBLE_MAX_THRESHOLD));
setter.setViewAlpha(mAppsView, hasAllAppsContent ? 1 : 0, allAppsFade);
boolean shouldProtectHeader =
diff --git a/src/com/android/launcher3/allapps/FloatingHeaderView.java b/src/com/android/launcher3/allapps/FloatingHeaderView.java
index f55ab25..450d2e2 100644
--- a/src/com/android/launcher3/allapps/FloatingHeaderView.java
+++ b/src/com/android/launcher3/allapps/FloatingHeaderView.java
@@ -52,6 +52,7 @@
private final Rect mClip = new Rect(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
private final ValueAnimator mAnimator = ValueAnimator.ofInt(0, 0);
+ private final ValueAnimator mHeaderAnimator = ValueAnimator.ofInt(0, 1).setDuration(100);
private final Point mTempOffset = new Point();
private final Paint mBGPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private final RecyclerView.OnScrollListener mOnScrollListener =
@@ -132,6 +133,7 @@
}
mFixedRows = rows.toArray(new FloatingHeaderRow[rows.size()]);
mAllRows = mFixedRows;
+ mHeaderAnimator.addUpdateListener(valueAnimator -> invalidate());
}
@Override
@@ -268,7 +270,6 @@
}
} else {
mHeaderCollapsed = false;
- invalidate();
}
mTranslationY = currentScrollY;
} else if (!mHeaderCollapsed) {
@@ -281,7 +282,8 @@
} else if (mTranslationY <= -mMaxTranslation) { // hide or stay hidden
mHeaderCollapsed = true;
mSnappedScrolledY = -mMaxTranslation;
- invalidate();
+ mHeaderAnimator.setCurrentFraction(0);
+ mHeaderAnimator.start();
}
}
}
@@ -296,8 +298,10 @@
@Override
protected void dispatchDraw(Canvas canvas) {
- if (mHeaderCollapsed && mHeaderColor != Color.TRANSPARENT) {
+ if (mHeaderCollapsed && !mCollapsed && mTabLayout.getVisibility() == VISIBLE
+ && mHeaderColor != Color.TRANSPARENT && FeatureFlags.ENABLE_DEVICE_SEARCH.get()) {
mBGPaint.setColor(mHeaderColor);
+ mBGPaint.setAlpha((int) (255 * mHeaderAnimator.getAnimatedFraction()));
canvas.drawRect(0, 0, getWidth(), getHeight() + mTranslationY, mBGPaint);
}
super.dispatchDraw(canvas);
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index 0c0c92e..40dcb1e 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -142,7 +142,7 @@
"MULTI_DB_GRID_MIRATION_ALGO", true, "Use the multi-db grid migration algorithm");
public static final BooleanFlag ENABLE_THEMED_ICONS = getDebugFlag(
- "ENABLE_THEMED_ICONS", false, "Enable themed icons on workspace");
+ "ENABLE_THEMED_ICONS", true, "Enable themed icons on workspace");
// Keep as DeviceFlag for remote disable in emergency.
public static final BooleanFlag ENABLE_OVERVIEW_SELECTIONS = new DeviceFlag(
@@ -238,7 +238,7 @@
"Sends a notification whenever launcher encounters an uncaught exception.");
public static final BooleanFlag PROTOTYPE_APP_CLOSE = getDebugFlag(
- "PROTOTYPE_APP_CLOSE", true, "Enables new app close");
+ "PROTOTYPE_APP_CLOSE", false, "Enables new app close");
public static final BooleanFlag ENABLE_WALLPAPER_SCRIM = getDebugFlag(
"ENABLE_WALLPAPER_SCRIM", false,
diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java
index f5a8ef6..e387627 100644
--- a/src/com/android/launcher3/folder/Folder.java
+++ b/src/com/android/launcher3/folder/Folder.java
@@ -32,8 +32,10 @@
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
import android.appwidget.AppWidgetHostView;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Insets;
import android.graphics.Path;
@@ -65,6 +67,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
+import androidx.core.graphics.ColorUtils;
import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.Alarm;
@@ -157,13 +160,18 @@
private static final float ICON_OVERSCROLL_WIDTH_FACTOR = 0.45f;
private static final int FOLDER_NAME_ANIMATION_DURATION = 633;
- private static final int FOLDER_COLOR_ANIMATION_DURATION = 150;
+ private static final int FOLDER_COLOR_ANIMATION_DURATION = 200;
private static final int REORDER_DELAY = 250;
private static final int ON_EXIT_CLOSE_DELAY = 400;
private static final Rect sTempRect = new Rect();
private static final int MIN_FOLDERS_FOR_HARDWARE_OPTIMIZATION = 10;
+ // Index used to get background color when using local wallpaper color extraction,
+ private static final int DARK_COLOR_EXTRACTION_INDEX = android.R.color.system_neutral1_900;
+ private static final int LIGHT_COLOR_EXTRACTION_INDEX = android.R.color.system_neutral2_500;
+ private static final int LIGHT_COLOR_L_STAR = 98;
+
private final Alarm mReorderAlarm = new Alarm();
private final Alarm mOnExitAlarm = new Alarm();
private final Alarm mOnScrollHintAlarm = new Alarm();
@@ -296,8 +304,7 @@
}
if (Utilities.ATLEAST_S) {
- mColorExtractionIndex = LocalColorExtractor.getColorIndex(
- !Themes.getAttrBoolean(getContext(), R.attr.isFolderDarkText));
+ boolean isFolderDarkText = Themes.getAttrBoolean(getContext(), R.attr.isFolderDarkText);
mColorExtractor = LocalColorExtractor.newInstance(getContext());
mColorListener = (RectF rect, SparseIntArray extractedColors) -> {
mColorChangeRunnable = () -> {
@@ -313,11 +320,14 @@
mOpenAnimationColorChangeAnimator = null;
}
- // Start a new animator to the extracted color.
- int newColor = extractedColors.get(mColorExtractionIndex);
+ // Start a new animator to the extracted color. Clamp down on the alpha
+ // to prevent folder from being transparent for too long.
GradientDrawable bg = (GradientDrawable) getBackground();
- mColorChangeAnimator = ObjectAnimator.ofArgb(bg, "color",
- bg.getColor().getDefaultColor(), newColor).setDuration(duration);
+ int currentColor = ColorUtils.setAlphaComponent(bg.getColor().getDefaultColor(),
+ 255);
+ int newColor = getExtractedColor(extractedColors, isFolderDarkText);
+ mColorChangeAnimator = ObjectAnimator.ofArgb(bg, "color", currentColor,
+ newColor).setDuration(duration);
mColorChangeAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -337,6 +347,21 @@
}
}
+ /**
+ * Returns an index used to query the color of interest from the list of extracted colors.
+ * @param hasDarkText True when dark index is wanted, False when light index is wanted.
+ */
+ @TargetApi(Build.VERSION_CODES.S)
+ private int getExtractedColor(SparseIntArray colors, boolean hasDarkText) {
+ int color = colors.get(hasDarkText
+ ? LIGHT_COLOR_EXTRACTION_INDEX
+ : DARK_COLOR_EXTRACTION_INDEX);
+ if (hasDarkText) {
+ color = ColorStateList.valueOf(color).withLStar(LIGHT_COLOR_L_STAR).getDefaultColor();
+ }
+ return color;
+ }
+
public boolean onLongClick(View v) {
// Return if global dragging is not enabled
if (!mLauncherDelegate.isDraggingEnabled()) return true;
diff --git a/src/com/android/launcher3/folder/PreviewBackground.java b/src/com/android/launcher3/folder/PreviewBackground.java
index 5ddf84f..4eab63e 100644
--- a/src/com/android/launcher3/folder/PreviewBackground.java
+++ b/src/com/android/launcher3/folder/PreviewBackground.java
@@ -89,8 +89,8 @@
private static final float ACCEPT_COLOR_MULTIPLIER = 1.5f;
// Expressed on a scale from 0 to 255.
- private static final int BG_OPACITY = 160;
- private static final int MAX_BG_OPACITY = 225;
+ private static final int BG_OPACITY = 255;
+ private static final int MAX_BG_OPACITY = 255;
private static final int SHADOW_OPACITY = 40;
private ValueAnimator mScaleAnimator;
diff --git a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java
index a03e48d..e4f5539 100644
--- a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java
+++ b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java
@@ -1,9 +1,11 @@
package com.android.launcher3.graphics;
import static com.android.launcher3.Utilities.getPrefs;
+import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.launcher3.util.Themes.KEY_THEMED_ICONS;
import static com.android.launcher3.util.Themes.isThemedIconEnabled;
+import android.annotation.TargetApi;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.pm.PackageManager;
@@ -12,14 +14,23 @@
import android.database.MatrixCursor;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.IBinder.DeathRecipient;
+import android.os.Message;
+import android.os.Messenger;
+import android.util.ArrayMap;
import android.util.Log;
import android.util.Xml;
import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.InvariantDeviceProfile.GridOption;
import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
import com.android.launcher3.config.FeatureFlags;
+import com.android.launcher3.util.Executors;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -65,6 +76,11 @@
private static final String ICON_THEMED = "/icon_themed";
private static final String BOOLEAN_VALUE = "boolean_value";
+ private static final String KEY_SURFACE_PACKAGE = "surface_package";
+ private static final String KEY_CALLBACK = "callback";
+
+ private final ArrayMap<IBinder, PreviewLifecycleObserver> mActivePreviews = new ArrayMap<>();
+
@Override
public boolean onCreate() {
return true;
@@ -177,10 +193,76 @@
return null;
}
- if (!METHOD_GET_PREVIEW.equals(method)) {
+ if (!Utilities.ATLEAST_R || !METHOD_GET_PREVIEW.equals(method)) {
return null;
}
+ return getPreview(extras);
+ }
- return new PreviewSurfaceRenderer(getContext(), extras).render();
+ @TargetApi(Build.VERSION_CODES.R)
+ private synchronized Bundle getPreview(Bundle request) {
+ PreviewLifecycleObserver observer = null;
+ try {
+ PreviewSurfaceRenderer renderer = new PreviewSurfaceRenderer(getContext(), request);
+
+ // Destroy previous
+ destroyObserver(mActivePreviews.get(renderer.getHostToken()));
+
+ observer = new PreviewLifecycleObserver(renderer);
+ mActivePreviews.put(renderer.getHostToken(), observer);
+
+ renderer.loadAsync();
+ renderer.getHostToken().linkToDeath(observer, 0);
+
+ Bundle result = new Bundle();
+ result.putParcelable(KEY_SURFACE_PACKAGE, renderer.getSurfacePackage());
+
+ Messenger messenger =
+ new Messenger(new Handler(UI_HELPER_EXECUTOR.getLooper(), observer));
+ Message msg = Message.obtain();
+ msg.replyTo = messenger;
+ result.putParcelable(KEY_CALLBACK, msg);
+ return result;
+ } catch (Exception e) {
+ Log.e(TAG, "Unable to generate preview", e);
+ if (observer != null) {
+ destroyObserver(observer);
+ }
+ return null;
+ }
+ }
+
+ private synchronized void destroyObserver(PreviewLifecycleObserver observer) {
+ if (observer == null || observer.destroyed) {
+ return;
+ }
+ observer.destroyed = true;
+ observer.renderer.getHostToken().unlinkToDeath(observer, 0);
+ Executors.MAIN_EXECUTOR.execute(observer.renderer::destroy);
+ PreviewLifecycleObserver cached = mActivePreviews.get(observer.renderer.getHostToken());
+ if (cached == observer) {
+ mActivePreviews.remove(observer.renderer.getHostToken());
+ }
+ }
+
+ private class PreviewLifecycleObserver implements Handler.Callback, DeathRecipient {
+
+ public final PreviewSurfaceRenderer renderer;
+ public boolean destroyed = false;
+
+ PreviewLifecycleObserver(PreviewSurfaceRenderer renderer) {
+ this.renderer = renderer;
+ }
+
+ @Override
+ public boolean handleMessage(Message message) {
+ destroyObserver(this);
+ return true;
+ }
+
+ @Override
+ public void binderDied() {
+ destroyObserver(this);
+ }
}
}
diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
index f5b6890..2a1aec8 100644
--- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
+++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
@@ -23,7 +23,6 @@
import static com.android.launcher3.model.ModelUtils.filterCurrentWorkspaceItems;
import static com.android.launcher3.model.ModelUtils.getMissingHotseatRanks;
import static com.android.launcher3.model.ModelUtils.sortWorkspaceItemsSpatially;
-import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
import android.annotation.TargetApi;
import android.app.Fragment;
@@ -32,7 +31,6 @@
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
-import android.content.pm.ShortcutInfo;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Rect;
@@ -43,11 +41,12 @@
import android.os.Looper;
import android.os.Process;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.WindowInsets;
+import android.view.WindowManager;
import android.widget.TextClock;
import com.android.launcher3.BubbleTextView;
@@ -57,23 +56,17 @@
import com.android.launcher3.InsettableFrameLayout;
import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.LauncherAppState;
-import com.android.launcher3.LauncherModel;
-import com.android.launcher3.LauncherSettings;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
import com.android.launcher3.WorkspaceLayoutManager;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.icons.BaseIconFactory;
import com.android.launcher3.icons.BitmapInfo;
import com.android.launcher3.icons.LauncherIcons;
-import com.android.launcher3.model.AllAppsList;
import com.android.launcher3.model.BgDataModel;
-import com.android.launcher3.model.BgDataModel.Callbacks;
import com.android.launcher3.model.BgDataModel.FixedContainerItems;
-import com.android.launcher3.model.LoaderResults;
-import com.android.launcher3.model.LoaderTask;
-import com.android.launcher3.model.ModelDelegate;
import com.android.launcher3.model.WidgetItem;
import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.data.FolderInfo;
@@ -100,13 +93,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
/**
* Utility class for generating the preview of Launcher for a given InvariantDeviceProfile.
@@ -120,8 +107,6 @@
public class LauncherPreviewRenderer extends ContextWrapper
implements ActivityContext, WorkspaceLayoutManager, LayoutInflater.Factory2 {
- private static final String TAG = "LauncherPreviewRenderer";
-
/**
* Context used just for preview. It also provides a few objects (e.g. UserCache) just for
* preview purposes.
@@ -138,9 +123,15 @@
private final ConcurrentLinkedQueue<LauncherIconsForPreview> mIconPool =
new ConcurrentLinkedQueue<>();
+ private boolean mDestroyed = false;
+
public PreviewContext(Context base, InvariantDeviceProfile idp) {
super(base);
mIdp = idp;
+ mObjectMap.put(InvariantDeviceProfile.INSTANCE, idp);
+ mObjectMap.put(LauncherAppState.INSTANCE,
+ new LauncherAppState(this, null /* iconCacheFileName */));
+
}
@Override
@@ -149,11 +140,9 @@
}
public void onDestroy() {
- CustomWidgetManager customWidgetManager = (CustomWidgetManager) mObjectMap.get(
- CustomWidgetManager.INSTANCE);
- if (customWidgetManager != null) {
- customWidgetManager.onDestroy();
- }
+ CustomWidgetManager.INSTANCE.get(this).onDestroy();
+ LauncherAppState.INSTANCE.get(this).onTerminate();
+ mDestroyed = true;
}
/**
@@ -162,17 +151,12 @@
*/
public <T> T getObject(MainThreadInitializedObject<T> mainThreadInitializedObject,
MainThreadInitializedObject.ObjectProvider<T> provider) {
+ if (FeatureFlags.IS_STUDIO_BUILD && mDestroyed) {
+ throw new RuntimeException("Context already destroyed");
+ }
if (!mAllowedObjects.contains(mainThreadInitializedObject)) {
throw new IllegalStateException("Leaking unknown objects");
}
- if (mainThreadInitializedObject == LauncherAppState.INSTANCE) {
- throw new IllegalStateException(
- "Should not use MainThreadInitializedObject to initialize this with "
- + "PreviewContext");
- }
- if (mainThreadInitializedObject == InvariantDeviceProfile.INSTANCE) {
- return (T) mIdp;
- }
if (mObjectMap.containsKey(mainThreadInitializedObject)) {
return (T) mObjectMap.get(mainThreadInitializedObject);
}
@@ -210,7 +194,6 @@
private final Context mContext;
private final InvariantDeviceProfile mIdp;
private final DeviceProfile mDp;
- private final boolean mMigrated;
private final Rect mInsets;
private final WorkspaceItemInfo mWorkspaceItemInfo;
private final LayoutInflater mHomeElementInflater;
@@ -218,18 +201,26 @@
private final Hotseat mHotseat;
private final CellLayout mWorkspace;
- public LauncherPreviewRenderer(Context context, InvariantDeviceProfile idp, boolean migrated) {
+ public LauncherPreviewRenderer(Context context, InvariantDeviceProfile idp) {
super(context);
mUiHandler = new Handler(Looper.getMainLooper());
mContext = context;
mIdp = idp;
mDp = idp.getDeviceProfile(context).copy(context);
- mMigrated = migrated;
- // TODO: get correct insets once display cutout API is available.
- mInsets = new Rect();
- mInsets.left = mInsets.right = (mDp.widthPx - mDp.availableWidthPx) / 2;
- mInsets.top = mInsets.bottom = (mDp.heightPx - mDp.availableHeightPx) / 2;
+ if (Utilities.ATLEAST_R) {
+ WindowInsets currentWindowInsets = context.getSystemService(WindowManager.class)
+ .getCurrentWindowMetrics().getWindowInsets();
+ mInsets = new Rect(
+ currentWindowInsets.getSystemWindowInsetLeft(),
+ currentWindowInsets.getSystemWindowInsetTop(),
+ currentWindowInsets.getSystemWindowInsetRight(),
+ currentWindowInsets.getSystemWindowInsetBottom());
+ } else {
+ mInsets = new Rect();
+ mInsets.left = mInsets.right = (mDp.widthPx - mDp.availableWidthPx) / 2;
+ mInsets.top = mInsets.bottom = (mDp.heightPx - mDp.availableHeightPx) / 2;
+ }
mDp.updateInsets(mInsets);
BaseIconFactory iconFactory =
@@ -265,8 +256,9 @@
}
/** Populate preview and render it. */
- public View getRenderedView() {
- populate();
+ public View getRenderedView(BgDataModel dataModel,
+ Map<ComponentKey, AppWidgetProviderInfo> widgetProviderInfoMap) {
+ populate(dataModel, widgetProviderInfoMap);
return mRootView;
}
@@ -392,38 +384,17 @@
}
}
- private void populate() {
- WorkspaceFetcher fetcher;
- PreviewContext previewContext = null;
- if (mMigrated) {
- previewContext = new PreviewContext(mContext, mIdp);
- LauncherAppState appForPreview = new LauncherAppState(
- previewContext, null /* iconCacheFileName */);
- fetcher = new WorkspaceItemsInfoFromPreviewFetcher(appForPreview);
- MODEL_EXECUTOR.execute(fetcher);
- } else {
- fetcher = new WorkspaceItemsInfoFetcher();
- LauncherAppState.getInstance(mContext).getModel().enqueueModelUpdateTask(
- (LauncherModel.ModelUpdateTask) fetcher);
- }
- WorkspaceResult workspaceResult = fetcher.get();
- if (previewContext != null) {
- previewContext.onDestroy();
- }
-
- if (workspaceResult == null) {
- return;
- }
-
+ private void populate(BgDataModel dataModel,
+ Map<ComponentKey, AppWidgetProviderInfo> widgetProviderInfoMap) {
// Separate the items that are on the current screen, and the other remaining items.
ArrayList<ItemInfo> currentWorkspaceItems = new ArrayList<>();
ArrayList<ItemInfo> otherWorkspaceItems = new ArrayList<>();
ArrayList<LauncherAppWidgetInfo> currentAppWidgets = new ArrayList<>();
ArrayList<LauncherAppWidgetInfo> otherAppWidgets = new ArrayList<>();
filterCurrentWorkspaceItems(0 /* currentScreenId */,
- workspaceResult.mWorkspaceItems, currentWorkspaceItems,
+ dataModel.workspaceItems, currentWorkspaceItems,
otherWorkspaceItems);
- filterCurrentWorkspaceItems(0 /* currentScreenId */, workspaceResult.mAppWidgets,
+ filterCurrentWorkspaceItems(0 /* currentScreenId */, dataModel.appWidgets,
currentAppWidgets, otherAppWidgets);
sortWorkspaceItemsSpatially(mIdp, currentWorkspaceItems);
for (ItemInfo itemInfo : currentWorkspaceItems) {
@@ -444,12 +415,12 @@
switch (itemInfo.itemType) {
case Favorites.ITEM_TYPE_APPWIDGET:
case Favorites.ITEM_TYPE_CUSTOM_APPWIDGET:
- if (mMigrated) {
- inflateAndAddWidgets((LauncherAppWidgetInfo) itemInfo,
- workspaceResult.mWidgetProvidersMap);
+ if (widgetProviderInfoMap != null) {
+ inflateAndAddWidgets(
+ (LauncherAppWidgetInfo) itemInfo, widgetProviderInfoMap);
} else {
inflateAndAddWidgets((LauncherAppWidgetInfo) itemInfo,
- workspaceResult.mWidgetsModel);
+ dataModel.widgetsModel);
}
break;
default:
@@ -458,8 +429,10 @@
}
IntArray ranks = getMissingHotseatRanks(currentWorkspaceItems,
mDp.numShownHotseatIcons);
- List<ItemInfo> predictions = workspaceResult.mHotseatPredictions == null
- ? Collections.emptyList() : workspaceResult.mHotseatPredictions.items;
+ FixedContainerItems hotseatpredictions =
+ dataModel.extraItems.get(CONTAINER_HOTSEAT_PREDICTION);
+ List<ItemInfo> predictions = hotseatpredictions == null
+ ? Collections.emptyList() : hotseatpredictions.items;
int count = Math.min(ranks.size(), predictions.size());
for (int i = 0; i < count; i++) {
int rank = ranks.get(i);
@@ -494,109 +467,4 @@
view.measure(makeMeasureSpec(width, EXACTLY), makeMeasureSpec(height, EXACTLY));
view.layout(0, 0, width, height);
}
-
- private static class WorkspaceItemsInfoFetcher implements LauncherModel.ModelUpdateTask,
- WorkspaceFetcher {
-
- private final FutureTask<WorkspaceResult> mTask = new FutureTask<>(this);
-
- private LauncherAppState mApp;
- private LauncherModel mModel;
- private BgDataModel mBgDataModel;
- private AllAppsList mAllAppsList;
-
- @Override
- public void init(LauncherAppState app, LauncherModel model, BgDataModel dataModel,
- AllAppsList allAppsList, Executor uiExecutor) {
- mApp = app;
- mModel = model;
- mBgDataModel = dataModel;
- mAllAppsList = allAppsList;
- }
-
- @Override
- public FutureTask<WorkspaceResult> getTask() {
- return mTask;
- }
-
- @Override
- public void run() {
- mTask.run();
- }
-
- @Override
- public WorkspaceResult call() throws Exception {
- if (!mModel.isModelLoaded()) {
- Log.d(TAG, "Workspace not loaded, loading now");
- mModel.startLoaderForResults(
- new LoaderResults(mApp, mBgDataModel, mAllAppsList, new Callbacks[0]));
- return null;
- }
-
- return new WorkspaceResult(mBgDataModel, mBgDataModel.widgetsModel, null);
- }
- }
-
- private static class WorkspaceItemsInfoFromPreviewFetcher extends LoaderTask implements
- WorkspaceFetcher {
-
- private final FutureTask<WorkspaceResult> mTask = new FutureTask<>(this);
-
- WorkspaceItemsInfoFromPreviewFetcher(LauncherAppState app) {
- super(app, null, new BgDataModel(), new ModelDelegate(), null);
- }
-
- @Override
- public FutureTask<WorkspaceResult> getTask() {
- return mTask;
- }
-
- @Override
- public void run() {
- mTask.run();
- }
-
- @Override
- public WorkspaceResult call() {
- List<ShortcutInfo> allShortcuts = new ArrayList<>();
- loadWorkspace(allShortcuts, LauncherSettings.Favorites.PREVIEW_CONTENT_URI,
- LauncherSettings.Favorites.SCREEN + " = 0 or "
- + LauncherSettings.Favorites.CONTAINER + " = "
- + LauncherSettings.Favorites.CONTAINER_HOTSEAT);
- return new WorkspaceResult(mBgDataModel, null, mWidgetProvidersMap);
- }
- }
-
- private interface WorkspaceFetcher extends Runnable, Callable<WorkspaceResult> {
- FutureTask<WorkspaceResult> getTask();
-
- default WorkspaceResult get() {
- try {
- return getTask().get(5, TimeUnit.SECONDS);
- } catch (InterruptedException | ExecutionException | TimeoutException e) {
- Log.d(TAG, "Error fetching workspace items info", e);
- return null;
- }
- }
- }
-
- private static class WorkspaceResult {
- private final ArrayList<ItemInfo> mWorkspaceItems;
- private final ArrayList<LauncherAppWidgetInfo> mAppWidgets;
- private final FixedContainerItems mHotseatPredictions;
- private final WidgetsModel mWidgetsModel;
- private final Map<ComponentKey, AppWidgetProviderInfo> mWidgetProvidersMap;
-
- private WorkspaceResult(BgDataModel dataModel,
- WidgetsModel widgetsModel,
- Map<ComponentKey, AppWidgetProviderInfo> widgetProviderInfoMap) {
- synchronized (dataModel) {
- mWorkspaceItems = dataModel.workspaceItems;
- mAppWidgets = dataModel.appWidgets;
- mHotseatPredictions = dataModel.extraItems.get(CONTAINER_HOTSEAT_PREDICTION);
- mWidgetsModel = widgetsModel;
- mWidgetProvidersMap = widgetProviderInfoMap;
- }
- }
- }
}
diff --git a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
index 6193570..a8c3d15 100644
--- a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
+++ b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
@@ -21,32 +21,49 @@
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
import android.app.WallpaperColors;
+import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
import android.hardware.display.DisplayManager;
import android.os.Bundle;
-import android.os.Handler;
import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Messenger;
+import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.Display;
import android.view.SurfaceControlViewHost;
+import android.view.SurfaceControlViewHost.SurfacePackage;
import android.view.View;
+import android.view.WindowManager.LayoutParams;
import android.view.animation.AccelerateDecelerateInterpolator;
+import androidx.annotation.UiThread;
+import androidx.annotation.WorkerThread;
+
import com.android.launcher3.InvariantDeviceProfile;
+import com.android.launcher3.LauncherAppState;
+import com.android.launcher3.LauncherSettings;
import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
+import com.android.launcher3.graphics.LauncherPreviewRenderer.PreviewContext;
+import com.android.launcher3.model.BgDataModel;
import com.android.launcher3.model.GridSizeMigrationTask;
import com.android.launcher3.model.GridSizeMigrationTaskV2;
+import com.android.launcher3.model.LoaderTask;
+import com.android.launcher3.model.ModelDelegate;
+import com.android.launcher3.model.ModelPreload;
+import com.android.launcher3.util.ComponentKey;
+import com.android.launcher3.util.RunnableList;
import com.android.launcher3.util.Themes;
import com.android.launcher3.widget.LocalColorExtractor;
+import java.util.ArrayList;
+import java.util.Map;
import java.util.concurrent.TimeUnit;
/** Render preview using surface view. */
@SuppressWarnings("NewApi")
-public class PreviewSurfaceRenderer implements IBinder.DeathRecipient {
+public class PreviewSurfaceRenderer {
+
+ private static final String TAG = "PreviewSurfaceRenderer";
private static final int FADE_IN_ANIMATION_DURATION = 200;
@@ -54,8 +71,6 @@
private static final String KEY_VIEW_WIDTH = "width";
private static final String KEY_VIEW_HEIGHT = "height";
private static final String KEY_DISPLAY_ID = "display_id";
- private static final String KEY_SURFACE_PACKAGE = "surface_package";
- private static final String KEY_CALLBACK = "callback";
private static final String KEY_COLORS = "wallpaper_colors";
private final Context mContext;
@@ -65,10 +80,13 @@
private final int mHeight;
private final Display mDisplay;
private final WallpaperColors mWallpaperColors;
+ private final RunnableList mOnDestroyCallbacks = new RunnableList();
- private SurfaceControlViewHost mSurfaceControlViewHost;
+ private final SurfaceControlViewHost mSurfaceControlViewHost;
- PreviewSurfaceRenderer(Context context, Bundle bundle) {
+ private boolean mDestroyed = false;
+
+ public PreviewSurfaceRenderer(Context context, Bundle bundle) throws Exception {
mContext = context;
String gridName = bundle.getString("name");
@@ -77,106 +95,101 @@
gridName = InvariantDeviceProfile.getCurrentGridName(context);
}
mWallpaperColors = bundle.getParcelable(KEY_COLORS);
-
mIdp = new InvariantDeviceProfile(context, gridName);
mHostToken = bundle.getBinder(KEY_HOST_TOKEN);
mWidth = bundle.getInt(KEY_VIEW_WIDTH);
mHeight = bundle.getInt(KEY_VIEW_HEIGHT);
+ mDisplay = context.getSystemService(DisplayManager.class)
+ .getDisplay(bundle.getInt(KEY_DISPLAY_ID));
- final DisplayManager displayManager = (DisplayManager) context.getSystemService(
- Context.DISPLAY_SERVICE);
- mDisplay = displayManager.getDisplay(bundle.getInt(KEY_DISPLAY_ID));
+ mSurfaceControlViewHost = MAIN_EXECUTOR
+ .submit(() -> new SurfaceControlViewHost(mContext, mDisplay, mHostToken))
+ .get(5, TimeUnit.SECONDS);
+ mOnDestroyCallbacks.add(mSurfaceControlViewHost::release);
}
- /** Handle a received surface view request. */
- Bundle render() {
- if (mSurfaceControlViewHost != null) {
- binderDied();
- }
+ public IBinder getHostToken() {
+ return mHostToken;
+ }
- SurfaceControlViewHost.SurfacePackage surfacePackage;
- try {
- mSurfaceControlViewHost = MAIN_EXECUTOR
- .submit(() -> new SurfaceControlViewHost(mContext, mDisplay, mHostToken))
- .get(5, TimeUnit.SECONDS);
- surfacePackage = mSurfaceControlViewHost.getSurfacePackage();
- mHostToken.linkToDeath(this, 0);
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
+ public SurfacePackage getSurfacePackage() {
+ return mSurfaceControlViewHost.getSurfacePackage();
+ }
- MODEL_EXECUTOR.post(() -> {
- final boolean success = doGridMigrationIfNecessary();
+ /**
+ * Destroys the preview and all associated data
+ */
+ @UiThread
+ public void destroy() {
+ mDestroyed = true;
+ mOnDestroyCallbacks.executeAllAndDestroy();
+ }
- final Context inflationContext;
- if (mWallpaperColors != null) {
- // Workaround to create a themed context
- Context context = mContext.createDisplayContext(mDisplay);
- LocalColorExtractor.newInstance(mContext)
- .applyColorsOverride(context, mWallpaperColors);
+ /**
+ * Generates the preview in background
+ */
+ public void loadAsync() {
+ MODEL_EXECUTOR.execute(this::loadModelData);
+ }
- inflationContext = new ContextThemeWrapper(context,
- Themes.getActivityThemeRes(context, mWallpaperColors.getColorHints()));
- } else {
- inflationContext = new ContextThemeWrapper(mContext, R.style.AppTheme);
+ @WorkerThread
+ private void loadModelData() {
+ final boolean migrated = doGridMigrationIfNecessary();
+
+ final Context inflationContext;
+ if (mWallpaperColors != null) {
+ // Create a themed context, without affecting the main application context
+ Context context = mContext.createDisplayContext(mDisplay);
+ if (Utilities.ATLEAST_R) {
+ context = context.createWindowContext(
+ LayoutParams.TYPE_APPLICATION_OVERLAY, null);
}
-
- MAIN_EXECUTOR.post(() -> {
- // If mSurfaceControlViewHost is null due to any reason (e.g. binder died,
- // happening when user leaves the preview screen before preview rendering finishes),
- // we should return here.
- SurfaceControlViewHost host = mSurfaceControlViewHost;
- if (host == null) {
- return;
- }
-
- View view = new LauncherPreviewRenderer(inflationContext, mIdp, success)
- .getRenderedView();
- // This aspect scales the view to fit in the surface and centers it
- final float scale = Math.min(mWidth / (float) view.getMeasuredWidth(),
- mHeight / (float) view.getMeasuredHeight());
- view.setScaleX(scale);
- view.setScaleY(scale);
- view.setPivotX(0);
- view.setPivotY(0);
- view.setTranslationX((mWidth - scale * view.getWidth()) / 2);
- view.setTranslationY((mHeight - scale * view.getHeight()) / 2);
- view.setAlpha(0);
- view.animate().alpha(1)
- .setInterpolator(new AccelerateDecelerateInterpolator())
- .setDuration(FADE_IN_ANIMATION_DURATION)
- .start();
- host.setView(view, view.getMeasuredWidth(), view.getMeasuredHeight());
- });
- });
-
- Bundle result = new Bundle();
- result.putParcelable(KEY_SURFACE_PACKAGE, surfacePackage);
-
- Handler handler = new Handler(Looper.getMainLooper(), message -> {
- binderDied();
- return true;
- });
- Messenger messenger = new Messenger(handler);
- Message msg = Message.obtain();
- msg.replyTo = messenger;
- result.putParcelable(KEY_CALLBACK, msg);
- return result;
- }
-
- @Override
- public void binderDied() {
- if (mSurfaceControlViewHost != null) {
- MAIN_EXECUTOR.execute(() -> {
- mSurfaceControlViewHost.release();
- mSurfaceControlViewHost = null;
- });
+ LocalColorExtractor.newInstance(mContext)
+ .applyColorsOverride(context, mWallpaperColors);
+ inflationContext = new ContextThemeWrapper(context,
+ Themes.getActivityThemeRes(context, mWallpaperColors.getColorHints()));
+ } else {
+ inflationContext = new ContextThemeWrapper(mContext, R.style.AppTheme);
}
- mHostToken.unlinkToDeath(this, 0);
+
+ if (migrated) {
+ PreviewContext previewContext = new PreviewContext(inflationContext, mIdp);
+ new LoaderTask(
+ LauncherAppState.getInstance(previewContext),
+ null,
+ new BgDataModel(),
+ new ModelDelegate(), null) {
+
+ @Override
+ public void run() {
+ loadWorkspace(new ArrayList<>(), LauncherSettings.Favorites.PREVIEW_CONTENT_URI,
+ LauncherSettings.Favorites.SCREEN + " = 0 or "
+ + LauncherSettings.Favorites.CONTAINER + " = "
+ + LauncherSettings.Favorites.CONTAINER_HOTSEAT);
+ MAIN_EXECUTOR.execute(() -> {
+ renderView(previewContext, mBgDataModel, mWidgetProvidersMap);
+ mOnDestroyCallbacks.add(previewContext::onDestroy);
+ });
+ }
+ }.run();
+ } else {
+ new ModelPreload() {
+
+ @Override
+ public void onComplete(boolean isSuccess) {
+ if (isSuccess) {
+ MAIN_EXECUTOR.execute(() ->
+ renderView(inflationContext, getBgDataModel(), null));
+ } else {
+ Log.e(TAG, "Model loading failed");
+ }
+ }
+ }.start(inflationContext);
+ }
}
+ @WorkerThread
private boolean doGridMigrationIfNecessary() {
boolean needsToMigrate =
MULTI_DB_GRID_MIRATION_ALGO.get()
@@ -189,4 +202,29 @@
? GridSizeMigrationTaskV2.migrateGridIfNeeded(mContext, mIdp)
: GridSizeMigrationTask.migrateGridIfNeeded(mContext, mIdp);
}
+
+ @UiThread
+ private void renderView(Context inflationContext, BgDataModel dataModel,
+ Map<ComponentKey, AppWidgetProviderInfo> widgetProviderInfoMap) {
+ if (mDestroyed) {
+ return;
+ }
+ View view = new LauncherPreviewRenderer(inflationContext, mIdp)
+ .getRenderedView(dataModel, widgetProviderInfoMap);
+ // This aspect scales the view to fit in the surface and centers it
+ final float scale = Math.min(mWidth / (float) view.getMeasuredWidth(),
+ mHeight / (float) view.getMeasuredHeight());
+ view.setScaleX(scale);
+ view.setScaleY(scale);
+ view.setPivotX(0);
+ view.setPivotY(0);
+ view.setTranslationX((mWidth - scale * view.getWidth()) / 2);
+ view.setTranslationY((mHeight - scale * view.getHeight()) / 2);
+ view.setAlpha(0);
+ view.animate().alpha(1)
+ .setInterpolator(new AccelerateDecelerateInterpolator())
+ .setDuration(FADE_IN_ANIMATION_DURATION)
+ .start();
+ mSurfaceControlViewHost.setView(view, view.getMeasuredWidth(), view.getMeasuredHeight());
+ }
}
diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java
index 297325a..8e0a388 100644
--- a/src/com/android/launcher3/icons/IconCache.java
+++ b/src/com/android/launcher3/icons/IconCache.java
@@ -131,6 +131,13 @@
}
/**
+ * Closes the cache DB. This will clear any in-memory cache.
+ */
+ public void close() {
+ mIconDb.close();
+ }
+
+ /**
* Fetches high-res icon for the provided ItemInfo and updates the caller when done.
*
* @return a request ID that can be used to cancel the request.
diff --git a/src/com/android/launcher3/model/ModelPreload.java b/src/com/android/launcher3/model/ModelPreload.java
index 713492b..756b7da 100644
--- a/src/com/android/launcher3/model/ModelPreload.java
+++ b/src/com/android/launcher3/model/ModelPreload.java
@@ -15,6 +15,8 @@
*/
package com.android.launcher3.model;
+import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
+
import android.content.Context;
import android.util.Log;
@@ -52,8 +54,14 @@
public final void run() {
mModel.startLoaderForResultsIfNotLoaded(
new LoaderResults(mApp, mBgDataModel, mAllAppsList, new Callbacks[0]));
- Log.d(TAG, "Preload completed : " + mModel.isModelLoaded());
- onComplete(mModel.isModelLoaded());
+ MODEL_EXECUTOR.post(() -> {
+ Log.d(TAG, "Preload completed : " + mModel.isModelLoaded());
+ onComplete(mModel.isModelLoaded());
+ });
+ }
+
+ public BgDataModel getBgDataModel() {
+ return mBgDataModel;
}
/**
diff --git a/src/com/android/launcher3/model/data/ItemInfo.java b/src/com/android/launcher3/model/data/ItemInfo.java
index e388965..3abcc2b 100644
--- a/src/com/android/launcher3/model/data/ItemInfo.java
+++ b/src/com/android/launcher3/model/data/ItemInfo.java
@@ -68,6 +68,8 @@
public static final boolean DEBUG = false;
public static final int NO_ID = -1;
+ // An id that doesn't match any item, including predicted apps with have an id=NO_ID
+ public static final int NO_MATCHING_ID = Integer.MIN_VALUE;
/**
* The id in the settings database for this item
diff --git a/src/com/android/launcher3/settings/DeveloperOptionsFragment.java b/src/com/android/launcher3/settings/DeveloperOptionsFragment.java
index d0a8c71..e2a69ff 100644
--- a/src/com/android/launcher3/settings/DeveloperOptionsFragment.java
+++ b/src/com/android/launcher3/settings/DeveloperOptionsFragment.java
@@ -104,6 +104,10 @@
initFlags();
loadPluginPrefs();
maybeAddSandboxCategory();
+
+ if (getActivity() != null) {
+ getActivity().setTitle("Developer Options");
+ }
}
private void filterPreferences(String query, PreferenceGroup pg) {
@@ -279,6 +283,7 @@
new String[] {
"HOME_NAVIGATION",
"LEFT_EDGE_BACK_NAVIGATION",
+ "RIGHT_EDGE_BACK_NAVIGATION",
"OVERVIEW_NAVIGATION"}));
return true;
});
@@ -290,7 +295,7 @@
launchBackTutorialPreference.setOnPreferenceClickListener(preference -> {
startActivity(launchSandboxIntent.putExtra(
"tutorial_steps",
- new String[] {"LEFT_EDGE_BACK_NAVIGATION"}));
+ new String[] {"LEFT_EDGE_BACK_NAVIGATION", "RIGHT_EDGE_BACK_NAVIGATION"}));
return true;
});
sandboxCategory.addPreference(launchBackTutorialPreference);
diff --git a/src/com/android/launcher3/settings/SettingsActivity.java b/src/com/android/launcher3/settings/SettingsActivity.java
index 883ff75..05927ef 100644
--- a/src/com/android/launcher3/settings/SettingsActivity.java
+++ b/src/com/android/launcher3/settings/SettingsActivity.java
@@ -20,11 +20,13 @@
import static com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY;
+import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
@@ -46,6 +48,9 @@
import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
+import java.util.Collections;
+import java.util.List;
+
/**
* Settings activity for Launcher. Currently implements the following setting: Allow rotation
*/
@@ -53,6 +58,10 @@
implements OnPreferenceStartFragmentCallback, OnPreferenceStartScreenCallback,
SharedPreferences.OnSharedPreferenceChangeListener{
+ /** List of fragments that can be hosted by this activity. */
+ private static final List<String> VALID_PREFERENCE_FRAGMENTS = Collections.singletonList(
+ DeveloperOptionsFragment.class.getName());
+
private static final String DEVELOPER_OPTIONS_KEY = "pref_developer_options";
private static final String FLAGS_PREFERENCE_KEY = "flag_toggler";
@@ -63,43 +72,78 @@
private static final int DELAY_HIGHLIGHT_DURATION_MILLIS = 600;
public static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted";
+ @VisibleForTesting
+ static final String EXTRA_FRAGMENT = ":settings:fragment";
+ @VisibleForTesting
+ static final String EXTRA_FRAGMENT_ARGS = ":settings:fragment_args";
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setContentView(R.layout.settings_activity);
+ setActionBar(findViewById(R.id.action_bar));
if (savedInstanceState == null) {
- Bundle args = new Bundle();
- String prefKey = getIntent().getStringExtra(EXTRA_FRAGMENT_ARG_KEY);
+ Intent intent = getIntent();
+ Bundle args = intent.getBundleExtra(EXTRA_FRAGMENT_ARGS);
+ if (args == null) {
+ args = new Bundle();
+ }
+
+ String prefKey = intent.getStringExtra(EXTRA_FRAGMENT_ARG_KEY);
if (!TextUtils.isEmpty(prefKey)) {
args.putString(EXTRA_FRAGMENT_ARG_KEY, prefKey);
}
final FragmentManager fm = getSupportFragmentManager();
final Fragment f = fm.getFragmentFactory().instantiate(getClassLoader(),
- getString(R.string.settings_fragment_name));
+ getPreferenceFragment());
f.setArguments(args);
// Display the fragment as the main content.
- fm.beginTransaction().replace(android.R.id.content, f).commit();
+ fm.beginTransaction().replace(R.id.content_frame, f).commit();
}
Utilities.getPrefs(getApplicationContext()).registerOnSharedPreferenceChangeListener(this);
}
+ /**
+ * Obtains the preference fragment to instantiate in this activity.
+ *
+ * @return the preference fragment class
+ * @throws IllegalArgumentException if the fragment is unknown to this activity
+ */
+ private String getPreferenceFragment() {
+ String preferenceFragment = getIntent().getStringExtra(EXTRA_FRAGMENT);
+ String defaultFragment = getString(R.string.settings_fragment_name);
+
+ if (TextUtils.isEmpty(preferenceFragment)) {
+ return defaultFragment;
+ } else if (!preferenceFragment.equals(defaultFragment)
+ && !VALID_PREFERENCE_FRAGMENTS.contains(preferenceFragment)) {
+ throw new IllegalArgumentException(
+ "Invalid fragment for this activity: " + preferenceFragment);
+ } else {
+ return preferenceFragment;
+ }
+ }
+
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { }
- private boolean startFragment(String fragment, Bundle args, String key) {
+ private boolean startPreference(String fragment, Bundle args, String key) {
if (Utilities.ATLEAST_P && getSupportFragmentManager().isStateSaved()) {
// Sometimes onClick can come after onPause because of being posted on the handler.
- // Skip starting new fragments in that case.
+ // Skip starting new preferences in that case.
return false;
}
final FragmentManager fm = getSupportFragmentManager();
final Fragment f = fm.getFragmentFactory().instantiate(getClassLoader(), fragment);
- f.setArguments(args);
if (f instanceof DialogFragment) {
- ((DialogFragment) f).show(getSupportFragmentManager(), key);
+ f.setArguments(args);
+ ((DialogFragment) f).show(fm, key);
} else {
- fm.beginTransaction().replace(android.R.id.content, f).addToBackStack(key).commit();
+ startActivity(new Intent(this, SettingsActivity.class)
+ .putExtra(EXTRA_FRAGMENT, fragment)
+ .putExtra(EXTRA_FRAGMENT_ARGS, args));
}
return true;
}
@@ -107,14 +151,14 @@
@Override
public boolean onPreferenceStartFragment(
PreferenceFragmentCompat preferenceFragment, Preference pref) {
- return startFragment(pref.getFragment(), pref.getExtras(), pref.getKey());
+ return startPreference(pref.getFragment(), pref.getExtras(), pref.getKey());
}
@Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref) {
Bundle args = new Bundle();
args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, pref.getKey());
- return startFragment(getString(R.string.settings_fragment_name), args, pref.getKey());
+ return startPreference(getString(R.string.settings_fragment_name), args, pref.getKey());
}
/**
@@ -148,6 +192,10 @@
screen.removePreference(preference);
}
}
+
+ if (getActivity() != null && !TextUtils.isEmpty(getPreferenceScreen().getTitle())) {
+ getActivity().setTitle(getPreferenceScreen().getTitle());
+ }
}
@Override
diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java
index b5dcd3a..b53f96e 100644
--- a/src/com/android/launcher3/touch/ItemClickHandler.java
+++ b/src/com/android/launcher3/touch/ItemClickHandler.java
@@ -196,8 +196,10 @@
/**
* Handles clicking on a disabled shortcut
+ *
+ * @return true iff the disabled item click has been handled.
*/
- public static void handleDisabledItemClicked(WorkspaceItemInfo shortcut, Context context) {
+ public static boolean handleDisabledItemClicked(WorkspaceItemInfo shortcut, Context context) {
final int disabledFlags = shortcut.runtimeStatusFlags
& WorkspaceItemInfo.FLAG_DISABLED_MASK;
if ((disabledFlags
@@ -205,11 +207,12 @@
& ~FLAG_DISABLED_QUIET_USER) == 0) {
// If the app is only disabled because of the above flags, launch activity anyway.
// Framework will tell the user why the app is suspended.
+ return false;
} else {
if (!TextUtils.isEmpty(shortcut.disabledMessage)) {
// Use a message specific to this shortcut, if it has one.
Toast.makeText(context, shortcut.disabledMessage, Toast.LENGTH_SHORT).show();
- return;
+ return true;
}
// Otherwise just use a generic error message.
int error = R.string.activity_not_available;
@@ -220,6 +223,7 @@
error = R.string.shortcut_not_available;
}
Toast.makeText(context, error, Toast.LENGTH_SHORT).show();
+ return true;
}
}
@@ -229,8 +233,7 @@
* @param v The view that was clicked. Must be a tagged with a {@link WorkspaceItemInfo}.
*/
public static void onClickAppShortcut(View v, WorkspaceItemInfo shortcut, Launcher launcher) {
- if (shortcut.isDisabled()) {
- handleDisabledItemClicked(shortcut, launcher);
+ if (shortcut.isDisabled() && handleDisabledItemClicked(shortcut, launcher)) {
return;
}
diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
index 44e55e1..11c9649 100644
--- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
+++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
@@ -41,6 +41,7 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
+import com.android.launcher3.views.BaseDragLayer;
import java.util.Collections;
import java.util.List;
@@ -267,7 +268,7 @@
}
@Override
- public void setTaskMenuLayoutOrientation(DeviceProfile deviceProfile,
+ public void setTaskOptionsMenuLayoutOrientation(DeviceProfile deviceProfile,
LinearLayout taskMenuLayout) {
taskMenuLayout.setOrientation(LinearLayout.HORIZONTAL);
}
@@ -284,6 +285,17 @@
Utilities.setStartMarginForView(viewGroup.findViewById(R.id.icon), 0);
}
+ @Override
+ public void setTaskMenuAroundTaskView(LinearLayout taskView, float margin) {
+ BaseDragLayer.LayoutParams lp = (BaseDragLayer.LayoutParams) taskView.getLayoutParams();
+ lp.topMargin += margin;
+ }
+
+ @Override
+ public PointF getAdditionalInsetForTaskMenu(float margin) {
+ return new PointF(margin, 0);
+ }
+
/* ---------- The following are only used by TaskViewTouchHandler. ---------- */
@Override
diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java
index 6811438..e0b89c7 100644
--- a/src/com/android/launcher3/touch/PagedOrientationHandler.java
+++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java
@@ -109,16 +109,37 @@
float getSecondaryValue(float x, float y);
boolean isLayoutNaturalToLauncher();
+ FloatProperty getSplitSelectTaskOffset(FloatProperty primary, FloatProperty secondary,
+ DeviceProfile deviceProfile);
+ int getDistanceToBottomOfRect(DeviceProfile dp, Rect rect);
+ List<SplitPositionOption> getSplitPositionOptions(DeviceProfile dp);
+
+ // Overview TaskMenuView methods
float getTaskMenuX(float x, View thumbnailView, int overScroll);
float getTaskMenuY(float y, View thumbnailView, int overScroll);
int getTaskMenuWidth(View view);
- void setTaskMenuLayoutOrientation(DeviceProfile deviceProfile, LinearLayout taskMenuLayout);
+ /**
+ * Sets linear layout orientation for {@link com.android.launcher3.popup.SystemShortcut} items
+ * inside task menu view.
+ */
+ void setTaskOptionsMenuLayoutOrientation(DeviceProfile deviceProfile,
+ LinearLayout taskMenuLayout);
+ /**
+ * Sets layout param attributes for {@link com.android.launcher3.popup.SystemShortcut} child
+ * views inside task menu view.
+ */
void setLayoutParamsForTaskMenuOptionItem(LinearLayout.LayoutParams lp,
LinearLayout viewGroup, DeviceProfile deviceProfile);
- int getDistanceToBottomOfRect(DeviceProfile dp, Rect rect);
- List<SplitPositionOption> getSplitPositionOptions(DeviceProfile dp);
- FloatProperty getSplitSelectTaskOffset(FloatProperty primary, FloatProperty secondary,
- DeviceProfile deviceProfile);
+ /**
+ * Adjusts margins for the entire task menu view itself, which comprises of both app title and
+ * shortcut options.
+ */
+ void setTaskMenuAroundTaskView(LinearLayout taskView, float margin);
+ /**
+ * Since the task menu layout is manually positioned on top of recents view, this method returns
+ * additional adjustments to the positioning based on fake land/seascape
+ */
+ PointF getAdditionalInsetForTaskMenu(float margin);
// The following are only used by TaskViewTouchHandler.
/** @return Either VERTICAL or HORIZONTAL. */
diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
index d3d77fd..dcbb7ca 100644
--- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
+++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
@@ -39,6 +39,7 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
+import com.android.launcher3.views.BaseDragLayer;
import java.util.ArrayList;
import java.util.List;
@@ -272,7 +273,7 @@
}
@Override
- public void setTaskMenuLayoutOrientation(DeviceProfile deviceProfile,
+ public void setTaskOptionsMenuLayoutOrientation(DeviceProfile deviceProfile,
LinearLayout taskMenuLayout) {
if (deviceProfile.isLandscape && !deviceProfile.isTablet) {
// Phone landscape
@@ -302,6 +303,18 @@
lp.height = LinearLayout.LayoutParams.WRAP_CONTENT;
}
+ @Override
+ public void setTaskMenuAroundTaskView(LinearLayout taskView, float margin) {
+ BaseDragLayer.LayoutParams lp = (BaseDragLayer.LayoutParams) taskView.getLayoutParams();
+ lp.topMargin += margin;
+ lp.leftMargin += margin;
+ }
+
+ @Override
+ public PointF getAdditionalInsetForTaskMenu(float margin) {
+ return new PointF(0, 0);
+ }
+
/* ---------- The following are only used by TaskViewTouchHandler. ---------- */
@Override
diff --git a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java
index 893a274..91d44bd 100644
--- a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java
+++ b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java
@@ -26,11 +26,13 @@
import android.graphics.Rect;
import android.view.Surface;
import android.view.View;
+import android.widget.LinearLayout;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
+import com.android.launcher3.views.BaseDragLayer;
import java.util.Collections;
import java.util.List;
@@ -89,6 +91,17 @@
}
@Override
+ public void setTaskMenuAroundTaskView(LinearLayout taskView, float margin) {
+ BaseDragLayer.LayoutParams lp = (BaseDragLayer.LayoutParams) taskView.getLayoutParams();
+ lp.bottomMargin += margin;
+ }
+
+ @Override
+ public PointF getAdditionalInsetForTaskMenu(float margin) {
+ return new PointF(-margin, margin);
+ }
+
+ @Override
public int getDistanceToBottomOfRect(DeviceProfile dp, Rect rect) {
return dp.widthPx - rect.right;
}
diff --git a/src/com/android/launcher3/util/Executors.java b/src/com/android/launcher3/util/Executors.java
index a85ae45..6329540 100644
--- a/src/com/android/launcher3/util/Executors.java
+++ b/src/com/android/launcher3/util/Executors.java
@@ -30,18 +30,15 @@
*/
public class Executors {
- // These values are same as that in {@link AsyncTask}.
- private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
- private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
- private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
+ private static final int POOL_SIZE =
+ Math.max(Runtime.getRuntime().availableProcessors(), 2);
private static final int KEEP_ALIVE = 1;
/**
* An {@link ThreadPoolExecutor} to be used with async task with no limit on the queue size.
*/
public static final ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(
- CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
- TimeUnit.SECONDS, new LinkedBlockingQueue<>());
+ POOL_SIZE, POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
/**
* Returns the executor for running tasks on the main thread.
@@ -53,7 +50,8 @@
* A background executor for using time sensitive actions where user is waiting for response.
*/
public static final LooperExecutor UI_HELPER_EXECUTOR =
- new LooperExecutor(createAndStartNewForegroundLooper("UiThreadHelper"));
+ new LooperExecutor(
+ createAndStartNewLooper("UiThreadHelper", Process.THREAD_PRIORITY_FOREGROUND));
/**
* Utility method to get a started handler thread statically
@@ -72,15 +70,6 @@
}
/**
- * Similar to {@link #createAndStartNewLooper(String)}, but starts the thread with
- * foreground priority.
- * Think before using
- */
- public static Looper createAndStartNewForegroundLooper(String name) {
- return createAndStartNewLooper(name, Process.THREAD_PRIORITY_FOREGROUND);
- }
-
- /**
* Executor used for running Launcher model related tasks (eg loading icons or updated db)
*/
public static final LooperExecutor MODEL_EXECUTOR =
diff --git a/src/com/android/launcher3/views/ArrowTipView.java b/src/com/android/launcher3/views/ArrowTipView.java
index a6f2b42..07d3776 100644
--- a/src/com/android/launcher3/views/ArrowTipView.java
+++ b/src/com/android/launcher3/views/ArrowTipView.java
@@ -53,11 +53,19 @@
protected final BaseDraggingActivity mActivity;
private final Handler mHandler = new Handler();
+ private final boolean mIsPointingUp;
+ private final int mArrowWidth;
private Runnable mOnClosed;
public ArrowTipView(Context context) {
+ this(context, false);
+ }
+
+ public ArrowTipView(Context context, boolean isPointingUp) {
super(context, null, 0);
mActivity = BaseDraggingActivity.fromContext(context);
+ mIsPointingUp = isPointingUp;
+ mArrowWidth = context.getResources().getDimensionPixelSize(R.dimen.arrow_toast_arrow_width);
init(context);
}
@@ -97,21 +105,21 @@
private void init(Context context) {
inflate(context, R.layout.arrow_toast, this);
setOrientation(LinearLayout.VERTICAL);
- View dismissButton = findViewById(R.id.dismiss);
- dismissButton.setOnClickListener(view -> {
- handleClose(true);
- });
View arrowView = findViewById(R.id.arrow);
ViewGroup.LayoutParams arrowLp = arrowView.getLayoutParams();
ShapeDrawable arrowDrawable = new ShapeDrawable(TriangleShape.create(
- arrowLp.width, arrowLp.height, false));
+ arrowLp.width, arrowLp.height, mIsPointingUp));
Paint arrowPaint = arrowDrawable.getPaint();
- arrowPaint.setColor(ContextCompat.getColor(getContext(), R.color.arrow_tip_view_bg));
+ arrowPaint.setColor(ContextCompat.getColor(getContext(), R.color.arrow_tip_view_bg));
// The corner path effect won't be reflected in the shadow, but shouldn't be noticeable.
arrowPaint.setPathEffect(new CornerPathEffect(
context.getResources().getDimension(R.dimen.arrow_toast_corner_radius)));
arrowView.setBackground(arrowDrawable);
+ if (mIsPointingUp) {
+ removeView(arrowView);
+ addView(arrowView, 0);
+ }
mIsOpen = true;
@@ -128,10 +136,10 @@
/**
* Show the ArrowTipView (tooltip) center, start, or end aligned.
*
- * @param text The text to be shown in the tooltip.
- * @param gravity The gravity aligns the tooltip center, start, or end.
+ * @param text The text to be shown in the tooltip.
+ * @param gravity The gravity aligns the tooltip center, start, or end.
* @param arrowMarginStart The margin from start to place arrow (ignored if center)
- * @param top The Y coordinate of the bottom of tooltip.
+ * @param top The Y coordinate of the bottom of tooltip.
* @return The tooltip.
*/
public ArrowTipView show(String text, int gravity, int arrowMarginStart, int top) {
@@ -149,15 +157,15 @@
arrowMarginStart = parent.getMeasuredWidth() - arrowMarginStart;
}
if (gravity == Gravity.END) {
- lp.setMarginEnd(parent.getMeasuredWidth() - arrowMarginStart);
+ lp.setMarginEnd(parent.getMeasuredWidth() - arrowMarginStart - mArrowWidth);
} else if (gravity == Gravity.START) {
- lp.setMarginStart(arrowMarginStart);
+ lp.setMarginStart(arrowMarginStart - mArrowWidth / 2);
}
requestLayout();
params.leftMargin = mActivity.getDeviceProfile().workspacePadding.left;
params.rightMargin = mActivity.getDeviceProfile().workspacePadding.right;
- post(() -> setY(top - getHeight()));
+ post(() -> setY(top - (mIsPointingUp ? 0 : getHeight())));
setAlpha(0);
animate()
.alpha(1f)
@@ -172,31 +180,31 @@
/**
* Show the ArrowTipView (tooltip) custom aligned.
*
- * @param text The text to be shown in the tooltip.
+ * @param text The text to be shown in the tooltip.
* @param arrowXCoord The X coordinate for the arrow on the tip. The arrow is usually in the
* center of ArrowTipView unless the ArrowTipView goes beyond screen margin.
- * @param yCoord The Y coordinate of the bottom of the tooltip.
+ * @param yCoord The Y coordinate of the bottom of the tooltip.
* @return The tool tip view.
*/
- @Nullable public ArrowTipView showAtLocation(String text, int arrowXCoord, int yCoord) {
+ @Nullable
+ public ArrowTipView showAtLocation(String text, int arrowXCoord, int yCoord) {
ViewGroup parent = mActivity.getDragLayer();
@Px int parentViewWidth = parent.getWidth();
- @Px int textViewWidth = getContext().getResources()
- .getDimensionPixelSize(R.dimen.widget_picker_education_tip_width);
+ @Px int maxTextViewWidth = getContext().getResources()
+ .getDimensionPixelSize(R.dimen.widget_picker_education_tip_max_width);
@Px int minViewMargin = getContext().getResources()
.getDimensionPixelSize(R.dimen.widget_picker_education_tip_min_margin);
- if (parentViewWidth < textViewWidth + 2 * minViewMargin) {
+ if (parentViewWidth < maxTextViewWidth + 2 * minViewMargin) {
Log.w(TAG, "Cannot display tip on a small screen of size: " + parentViewWidth);
return null;
}
TextView textView = findViewById(R.id.text);
textView.setText(text);
- textView.setWidth(textViewWidth);
+ textView.setMaxWidth(maxTextViewWidth);
parent.addView(this);
requestLayout();
- post(() -> setY(yCoord - getHeight()));
post(() -> {
float halfWidth = getWidth() / 2f;
float xCoord;
@@ -208,7 +216,9 @@
xCoord = arrowXCoord - halfWidth;
}
setX(xCoord);
- findViewById(R.id.arrow).setX(arrowXCoord - xCoord);
+ setY(yCoord - getHeight());
+ View arrowView = findViewById(R.id.arrow);
+ arrowView.setX(arrowXCoord - xCoord - arrowView.getWidth() / 2f);
requestLayout();
});
diff --git a/src/com/android/launcher3/views/FloatingIconView.java b/src/com/android/launcher3/views/FloatingIconView.java
index f973c2b..25cce69 100644
--- a/src/com/android/launcher3/views/FloatingIconView.java
+++ b/src/com/android/launcher3/views/FloatingIconView.java
@@ -52,6 +52,7 @@
import com.android.launcher3.dragndrop.FolderAdaptiveIcon;
import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.graphics.PreloadIconDrawable;
+import com.android.launcher3.icons.FastBitmapDrawable;
import com.android.launcher3.icons.LauncherIcons;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.ItemInfoWithIcon;
@@ -250,27 +251,12 @@
@WorkerThread
@SuppressWarnings("WrongThread")
private static void getIconResult(Launcher l, View originalView, ItemInfo info, RectF pos,
- IconLoadResult iconLoadResult) {
+ Drawable btvIcon, IconLoadResult iconLoadResult) {
Drawable drawable;
- Drawable btvIcon;
- Drawable badge = null;
boolean supportsAdaptiveIcons = ADAPTIVE_ICON_WINDOW_ANIM.get()
&& !info.isDisabled(); // Use original icon for disabled icons.
- if (originalView instanceof BubbleTextView) {
- BubbleTextView btv = (BubbleTextView) originalView;
-
- if (info instanceof ItemInfoWithIcon
- && (((ItemInfoWithIcon) info).runtimeStatusFlags
- & ItemInfoWithIcon.FLAG_SHOW_DOWNLOAD_PROGRESS_MASK) != 0) {
- btvIcon = btv.makePreloadIcon();
- } else {
- btvIcon = btv.getIcon();
- }
- } else {
- btvIcon = null;
- }
-
+ Drawable badge = null;
if (info instanceof SystemShortcut) {
if (originalView instanceof ImageView) {
drawable = ((ImageView) originalView).getDrawable();
@@ -368,6 +354,13 @@
}
/**
+ * Returns true if the icon is different from main app icon
+ */
+ public boolean isDifferentFromAppIcon() {
+ return mIconLoadResult == null ? false : mIconLoadResult.isThemed;
+ }
+
+ /**
* Checks if the icon result is loaded. If true, we set the icon immediately. Else, we add a
* callback to set the icon once the icon result is loaded.
*/
@@ -505,12 +498,28 @@
*/
@UiThread
public static IconLoadResult fetchIcon(Launcher l, View v, ItemInfo info, boolean isOpening) {
- IconLoadResult result = new IconLoadResult(info);
- MODEL_EXECUTOR.getHandler().postAtFrontOfQueue(() -> {
- RectF position = new RectF();
- getLocationBoundsForView(l, v, isOpening, position);
- getIconResult(l, v, info, position, result);
- });
+ RectF position = new RectF();
+ getLocationBoundsForView(l, v, isOpening, position);
+
+ final FastBitmapDrawable btvIcon;
+ if (v instanceof BubbleTextView) {
+ BubbleTextView btv = (BubbleTextView) v;
+ if (info instanceof ItemInfoWithIcon
+ && (((ItemInfoWithIcon) info).runtimeStatusFlags
+ & ItemInfoWithIcon.FLAG_SHOW_DOWNLOAD_PROGRESS_MASK) != 0) {
+ btvIcon = btv.makePreloadIcon();
+ } else {
+ btvIcon = btv.getIcon();
+ }
+ } else {
+ btvIcon = null;
+ }
+
+ IconLoadResult result = new IconLoadResult(info,
+ btvIcon == null ? false : btvIcon.isThemed());
+
+ MODEL_EXECUTOR.getHandler().postAtFrontOfQueue(() ->
+ getIconResult(l, v, info, position, btvIcon, result));
sIconLoadResult = result;
return result;
@@ -626,6 +635,7 @@
private static class IconLoadResult {
final ItemInfo itemInfo;
+ final boolean isThemed;
Drawable btvDrawable;
Drawable drawable;
Drawable badge;
@@ -633,8 +643,9 @@
Runnable onIconLoaded;
boolean isIconLoaded;
- IconLoadResult(ItemInfo itemInfo) {
+ IconLoadResult(ItemInfo itemInfo, boolean isThemed) {
this.itemInfo = itemInfo;
+ this.isThemed = isThemed;
}
}
}
diff --git a/src/com/android/launcher3/views/ScrimView.java b/src/com/android/launcher3/views/ScrimView.java
index 0ba94ab..fb1485b 100644
--- a/src/com/android/launcher3/views/ScrimView.java
+++ b/src/com/android/launcher3/views/ScrimView.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
@@ -39,6 +40,8 @@
private SystemUiController mSystemUiController;
private ScrimDrawingController mDrawingController;
+ private int mBackgroundColor;
+ private boolean mIsVisible = true;
public ScrimView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -62,11 +65,22 @@
@Override
public void setBackgroundColor(int color) {
+ mBackgroundColor = color;
updateSysUiColors();
super.setBackgroundColor(color);
}
@Override
+ public void onVisibilityAggregated(boolean isVisible) {
+ super.onVisibilityAggregated(isVisible);
+ mIsVisible = isVisible;
+ }
+
+ public boolean isFullyOpaque() {
+ return mIsVisible && getAlpha() == 1 && Color.alpha(mBackgroundColor) == 255;
+ }
+
+ @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mDrawingController != null) {
diff --git a/src/com/android/launcher3/views/TopRoundedCornerView.java b/src/com/android/launcher3/views/TopRoundedCornerView.java
index 7888b08..5519df1 100644
--- a/src/com/android/launcher3/views/TopRoundedCornerView.java
+++ b/src/com/android/launcher3/views/TopRoundedCornerView.java
@@ -21,7 +21,6 @@
import android.graphics.Path;
import android.graphics.RectF;
import android.util.AttributeSet;
-import android.widget.FrameLayout;
import com.android.launcher3.R;
import com.android.launcher3.util.Themes;
@@ -41,7 +40,7 @@
public TopRoundedCornerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- int radius = getResources().getDimensionPixelSize(R.dimen.bg_round_rect_radius);
+ float radius = Themes.getDialogCornerRadius(context);
mRadii = new float[] {radius, radius, radius, radius, 0, 0, 0, 0};
mNavBarScrimPaint = new Paint();
diff --git a/src/com/android/launcher3/views/WidgetsEduView.java b/src/com/android/launcher3/views/WidgetsEduView.java
new file mode 100644
index 0000000..e69cb5b
--- /dev/null
+++ b/src/com/android/launcher3/views/WidgetsEduView.java
@@ -0,0 +1,118 @@
+/*
+ * 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.
+ */
+package com.android.launcher3.views;
+
+import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN;
+
+import android.animation.PropertyValuesHolder;
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import com.android.launcher3.Insettable;
+import com.android.launcher3.Launcher;
+import com.android.launcher3.R;
+
+/**
+ * Education view about widgets.
+ */
+public class WidgetsEduView extends AbstractSlideInView<Launcher> implements Insettable {
+
+ private static final int DEFAULT_CLOSE_DURATION = 200;
+
+ protected static final int FINAL_SCRIM_BG_COLOR = 0x88000000;
+
+ private Rect mInsets = new Rect();
+ private View mEduView;
+
+
+ public WidgetsEduView(Context context, AttributeSet attr) {
+ this(context, attr, 0);
+ }
+
+ public WidgetsEduView(Context context, AttributeSet attrs,
+ int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ mContent = this;
+ }
+
+ @Override
+ protected void handleClose(boolean animate) {
+ handleClose(true, DEFAULT_CLOSE_DURATION);
+ }
+
+ @Override
+ protected boolean isOfType(int type) {
+ return (type & TYPE_WIDGETS_EDUCATION_DIALOG) != 0;
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mEduView = findViewById(R.id.edu_view);
+ findViewById(R.id.edu_close_button)
+ .setOnClickListener(v -> close(/* animate= */ true));
+ }
+
+ @Override
+ public void setInsets(Rect insets) {
+ int leftInset = insets.left - mInsets.left;
+ int rightInset = insets.right - mInsets.right;
+ int bottomInset = insets.bottom - mInsets.bottom;
+ mInsets.set(insets);
+ setPadding(leftInset, getPaddingTop(), rightInset, 0);
+ mEduView.setPaddingRelative(mEduView.getPaddingStart(),
+ mEduView.getPaddingTop(), mEduView.getPaddingEnd(), bottomInset);
+ }
+
+ private void show() {
+ attachToContainer();
+ animateOpen();
+ }
+
+ @Override
+ protected int getScrimColor(Context context) {
+ return FINAL_SCRIM_BG_COLOR;
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed, l, t, r, b);
+ setTranslationShift(mTranslationShift);
+ }
+
+ private void animateOpen() {
+ if (mIsOpen || mOpenCloseAnimator.isRunning()) {
+ return;
+ }
+ mIsOpen = true;
+ mOpenCloseAnimator.setValues(
+ PropertyValuesHolder.ofFloat(TRANSLATION_SHIFT, TRANSLATION_SHIFT_OPENED));
+ mOpenCloseAnimator.setInterpolator(FAST_OUT_SLOW_IN);
+ mOpenCloseAnimator.start();
+ }
+
+ /** Shows widget education dialog. */
+ public static WidgetsEduView showEducationDialog(Launcher launcher) {
+ LayoutInflater layoutInflater = LayoutInflater.from(launcher);
+ WidgetsEduView v = (WidgetsEduView) layoutInflater.inflate(
+ R.layout.widgets_edu, launcher.getDragLayer(), false);
+ v.show();
+ return v;
+ }
+}
diff --git a/src/com/android/launcher3/widget/BaseWidgetSheet.java b/src/com/android/launcher3/widget/BaseWidgetSheet.java
index f7e295e..e6791c3 100644
--- a/src/com/android/launcher3/widget/BaseWidgetSheet.java
+++ b/src/com/android/launcher3/widget/BaseWidgetSheet.java
@@ -26,6 +26,9 @@
import android.view.View.OnLongClickListener;
import android.widget.Toast;
+import androidx.annotation.Nullable;
+import androidx.core.view.ViewCompat;
+
import com.android.launcher3.DragSource;
import com.android.launcher3.DropTarget.DragObject;
import com.android.launcher3.Launcher;
@@ -39,6 +42,7 @@
import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.util.Themes;
import com.android.launcher3.views.AbstractSlideInView;
+import com.android.launcher3.views.ArrowTipView;
/**
* Base class for various widgets popup
@@ -47,6 +51,9 @@
implements OnClickListener, OnLongClickListener, DragSource,
PopupDataProvider.PopupDataChangeListener {
+ protected static final String KEY_WIDGETS_EDUCATION_TIP_SEEN =
+ "launcher.widgets_education_tip_seen";
+
/* Touch handling related member variables. */
private Toast mWidgetInstructionToast;
@@ -196,4 +203,28 @@
toast.show();
return toast;
}
+
+ /** Shows education tip on top center of {@code view} if view is laid out. */
+ @Nullable
+ protected ArrowTipView showEducationTipOnViewIfPossible(@Nullable View view) {
+ if (view == null || !ViewCompat.isLaidOut(view)) {
+ return null;
+ }
+
+ mActivityContext.getSharedPrefs().edit()
+ .putBoolean(KEY_WIDGETS_EDUCATION_TIP_SEEN, true).apply();
+ int[] coords = new int[2];
+ view.getLocationOnScreen(coords);
+ ArrowTipView arrowTipView = new ArrowTipView(mActivityContext);
+ return arrowTipView.showAtLocation(
+ getContext().getString(R.string.long_press_widget_to_add),
+ /* arrowXCoord= */coords[0] + view.getWidth() / 2,
+ /* yCoord= */coords[1]);
+ }
+
+ /** Returns {@code true} if tip has previously been shown on any of {@link BaseWidgetSheet}. */
+ protected boolean hasSeenEducationTip() {
+ return mActivityContext.getSharedPrefs().getBoolean(KEY_WIDGETS_EDUCATION_TIP_SEEN, false)
+ || Utilities.IS_RUNNING_IN_TEST_HARNESS;
+ }
}
diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java
index 5deecd4..8685aae 100644
--- a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java
@@ -319,11 +319,15 @@
}
mIsScrollable = checkScrollableRecursively(this);
-
if (!mIsInDragMode && getTag() instanceof LauncherAppWidgetInfo) {
+ mCurrentWidgetSize.left = left;
+ mCurrentWidgetSize.right = right;
+ mCurrentWidgetSize.top = top;
+ mCurrentWidgetSize.bottom = bottom;
+
LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) getTag();
- getBoundsForViewInDragLayer(mLauncher.getDragLayer(), this, mCurrentWidgetSize, true,
- mTmpFloatArray, mTempRectF);
+ getBoundsForViewInDragLayer(mLauncher.getDragLayer(), (View) getParent(),
+ mCurrentWidgetSize, true, mTmpFloatArray, mTempRectF);
setRect(mTempRectF, mCurrentWidgetSize);
updateColorExtraction(mCurrentWidgetSize,
mWorkspace.getPageIndexForScreenId(info.screenId));
diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java b/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java
index 53b5fec..14108f6 100644
--- a/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java
+++ b/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java
@@ -67,61 +67,86 @@
}
public void initSpans(Context context, InvariantDeviceProfile idp) {
- // Always assume we're working with the smallest span to make sure we
- // reserve enough space in both orientations.
- float smallestCellWidth = Float.MAX_VALUE;
- float smallestCellHeight = Float.MAX_VALUE;
+ int minSpanX = 0;
+ int minSpanY = 0;
+ int maxSpanX = idp.numColumns;
+ int maxSpanY = idp.numRows;
+ int spanX = 0;
+ int spanY = 0;
+
+ Rect widgetPadding = new Rect();
+ Rect localPadding = new Rect();
+ AppWidgetHostView.getDefaultPaddingForWidget(context, provider, widgetPadding);
Point cellSize = new Point();
- boolean isWidgetPadded = false;
for (DeviceProfile dp : idp.supportedProfiles) {
dp.getCellSize(cellSize);
- smallestCellWidth = Math.min(smallestCellWidth, cellSize.x);
- smallestCellHeight = Math.min(smallestCellHeight, cellSize.y);
- isWidgetPadded = isWidgetPadded || !dp.shouldInsetWidgets();
+ // We want to account for the extra amount of padding that we are adding to the widget
+ // to ensure that it gets the full amount of space that it has requested.
+ // If grids supports insetting widgets, we do not account for widget padding.
+ if (dp.shouldInsetWidgets()) {
+ localPadding.setEmpty();
+ } else {
+ localPadding.set(widgetPadding);
+ }
+ minSpanX = Math.max(minSpanX,
+ getSpanX(localPadding, minResizeWidth, dp.cellLayoutBorderSpacingPx,
+ cellSize.x));
+ minSpanY = Math.max(minSpanY,
+ getSpanY(localPadding, minResizeHeight, dp.cellLayoutBorderSpacingPx,
+ cellSize.y));
+
+ if (ATLEAST_S) {
+ if (maxResizeWidth > 0) {
+ maxSpanX = Math.min(maxSpanX,
+ getSpanX(localPadding, maxResizeWidth, dp.cellLayoutBorderSpacingPx,
+ cellSize.x));
+ }
+ if (maxResizeHeight > 0) {
+ maxSpanY = Math.min(maxSpanY,
+ getSpanY(localPadding, maxResizeHeight, dp.cellLayoutBorderSpacingPx,
+ cellSize.y));
+ }
+ }
+
+ spanX = Math.max(spanX,
+ getSpanX(localPadding, minWidth, dp.cellLayoutBorderSpacingPx, cellSize.x));
+ spanY = Math.max(spanY,
+ getSpanY(localPadding, minHeight, dp.cellLayoutBorderSpacingPx, cellSize.y));
}
- // We want to account for the extra amount of padding that we are adding to the widget
- // to ensure that it gets the full amount of space that it has requested.
- // If grids supports insetting widgets, we do not account for widget padding.
- Rect widgetPadding = new Rect();
- if (isWidgetPadded) {
- AppWidgetHostView.getDefaultPaddingForWidget(context, provider, widgetPadding);
+ if (ATLEAST_S) {
+ // Ensures maxSpan >= minSpan
+ maxSpanX = Math.max(maxSpanX, minSpanX);
+ maxSpanY = Math.max(maxSpanY, minSpanY);
+
+ // Use targetCellWidth/Height if it is within the min/max ranges.
+ // Otherwise, use the span of minWidth/Height.
+ if (targetCellWidth >= minSpanX && targetCellWidth <= maxSpanX
+ && targetCellHeight >= minSpanY && targetCellHeight <= maxSpanY) {
+ spanX = targetCellWidth;
+ spanY = targetCellHeight;
+ }
}
- minSpanX = getSpanX(widgetPadding, minResizeWidth, smallestCellWidth);
- minSpanY = getSpanY(widgetPadding, minResizeHeight, smallestCellHeight);
-
- // Use maxResizeWidth/Height if they are defined and we're on S or above.
- maxSpanX =
- (ATLEAST_S && maxResizeWidth > 0)
- ? getSpanX(widgetPadding, maxResizeWidth, smallestCellWidth)
- : idp.numColumns;
- maxSpanY =
- (ATLEAST_S && maxResizeHeight > 0)
- ? getSpanY(widgetPadding, maxResizeHeight, smallestCellHeight)
- : idp.numRows;
-
- // Use targetCellWidth/Height if it is within the min/max ranges and we're on S or above.
- // Otherwise, fall back to minWidth/Height.
- if (ATLEAST_S && targetCellWidth >= minSpanX && targetCellWidth <= maxSpanX
- && targetCellHeight >= minSpanY && targetCellHeight <= maxSpanY) {
- spanX = targetCellWidth;
- spanY = targetCellHeight;
- } else {
- spanX = getSpanX(widgetPadding, minWidth, smallestCellWidth);
- spanY = getSpanY(widgetPadding, minHeight, smallestCellHeight);
- }
+ this.minSpanX = minSpanX;
+ this.minSpanY = minSpanY;
+ this.maxSpanX = maxSpanX;
+ this.maxSpanY = maxSpanY;
+ this.spanX = spanX;
+ this.spanY = spanY;
}
- private int getSpanX(Rect widgetPadding, int widgetWidth, float cellWidth) {
+ private int getSpanX(Rect widgetPadding, int widgetWidth, int cellSpacing, float cellWidth) {
return Math.max(1, (int) Math.ceil(
- (widgetWidth + widgetPadding.left + widgetPadding.right) / cellWidth));
+ (widgetWidth + widgetPadding.left + widgetPadding.right + cellSpacing) / (cellWidth
+ + cellSpacing)));
}
- private int getSpanY(Rect widgetPadding, int widgetHeight, float cellHeight) {
+ private int getSpanY(Rect widgetPadding, int widgetHeight, int cellSpacing, float cellHeight) {
return Math.max(1, (int) Math.ceil(
- (widgetHeight + widgetPadding.top + widgetPadding.bottom) / cellHeight));
+ (widgetHeight + widgetPadding.top + widgetPadding.bottom + cellSpacing) / (
+ cellHeight + cellSpacing)));
}
public String getLabel(PackageManager packageManager) {
diff --git a/src/com/android/launcher3/widget/LocalColorExtractor.java b/src/com/android/launcher3/widget/LocalColorExtractor.java
index e479b7d..8ae6b2e 100644
--- a/src/com/android/launcher3/widget/LocalColorExtractor.java
+++ b/src/com/android/launcher3/widget/LocalColorExtractor.java
@@ -28,7 +28,6 @@
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
-import com.android.launcher3.Utilities;
import com.android.launcher3.util.ResourceBasedOverride;
import java.util.List;
@@ -36,10 +35,6 @@
/** Extracts the colors we need from the wallpaper at given locations. */
public class LocalColorExtractor implements ResourceBasedOverride {
- // Index used to get background color when using local wallpaper color extraction,
- private static final int LIGHT_COLOR_EXTRACTION_INDEX = android.R.color.system_accent2_50;
- private static final int DARK_COLOR_EXTRACTION_INDEX = android.R.color.system_accent2_800;
-
/** Listener for color changes on a screen location. */
public interface Listener {
/**
@@ -108,19 +103,4 @@
RectF colorExtractionRectOut) {
// no-op
}
-
- /**
- * Returns an index used to query the color of interest from the list of extracted colors.
- */
- public static int getColorIndex(Context context) {
- return getColorIndex(Utilities.isDarkTheme(context));
- }
-
- /**
- * Returns an index used to query the color of interest from the list of extracted colors.
- * @param getDarkIndex True when dark index is wanted, False when light index is wanted.
- */
- public static int getColorIndex(boolean getDarkIndex) {
- return getDarkIndex ? DARK_COLOR_EXTRACTION_INDEX : LIGHT_COLOR_EXTRACTION_INDEX;
- }
}
diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java
index 3fcd3f7..7d04d7b 100644
--- a/src/com/android/launcher3/widget/WidgetCell.java
+++ b/src/com/android/launcher3/widget/WidgetCell.java
@@ -33,7 +33,6 @@
import android.view.ViewPropertyAnimator;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
-import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RemoteViews;
import android.widget.TextView;
@@ -45,7 +44,6 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.R;
import com.android.launcher3.WidgetPreviewLoader;
-import com.android.launcher3.icons.BaseIconFactory;
import com.android.launcher3.icons.FastBitmapDrawable;
import com.android.launcher3.icons.RoundDrawableWrapper;
import com.android.launcher3.model.WidgetItem;
@@ -80,7 +78,6 @@
private FrameLayout mWidgetImageContainer;
private WidgetImageView mWidgetImage;
- private ImageView mWidgetBadge;
private TextView mWidgetName;
private TextView mWidgetDims;
private TextView mWidgetDescription;
@@ -98,6 +95,7 @@
protected final BaseActivity mActivity;
private final CheckLongPressHelper mLongPressHelper;
private final float mEnforcedCornerRadius;
+ private final int mPreviewPadding;
private RemoteViews mRemoteViewsPreview;
private NavigableAppWidgetHostView mAppWidgetHostViewPreview;
@@ -122,6 +120,8 @@
setClipToPadding(false);
setAccessibilityDelegate(mActivity.getAccessibilityDelegate());
mEnforcedCornerRadius = RoundedCornerEnforcement.computeEnforcedRadius(context);
+ mPreviewPadding =
+ 2 * getResources().getDimensionPixelSize(R.dimen.widget_preview_shortcut_padding);
}
private void setContainerWidth() {
@@ -136,7 +136,6 @@
mWidgetImageContainer = findViewById(R.id.widget_preview_container);
mWidgetImage = findViewById(R.id.widget_preview);
- mWidgetBadge = findViewById(R.id.widget_badge);
mWidgetName = findViewById(R.id.widget_name);
mWidgetDims = findViewById(R.id.widget_dims);
mWidgetDescription = findViewById(R.id.widget_description);
@@ -161,7 +160,6 @@
mWidgetImage.animate().cancel();
mWidgetImage.setDrawable(null);
mWidgetImage.setVisibility(View.VISIBLE);
- mWidgetBadge.setImageDrawable(null);
mWidgetName.setText(null);
mWidgetDims.setText(null);
mWidgetDescription.setText(null);
@@ -286,7 +284,16 @@
return;
}
if (drawable != null) {
- setContainerSize(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
+ float scale = 1f;
+ if (getWidth() > 0 && getHeight() > 0) {
+ // Scale down the preview size if it's wider than the cell.
+ float maxWidth = getWidth() - mPreviewPadding;
+ float previewWidth = drawable.getIntrinsicWidth() * mPreviewScale;
+ scale = Math.min(maxWidth / previewWidth, 1);
+ }
+ setContainerSize(
+ Math.round(drawable.getIntrinsicWidth() * scale),
+ Math.round(drawable.getIntrinsicHeight() * scale));
mWidgetImage.setDrawable(drawable);
mWidgetImage.setVisibility(View.VISIBLE);
if (mAppWidgetHostViewPreview != null) {
@@ -294,15 +301,6 @@
mAppWidgetHostViewPreview = null;
}
}
- Drawable badge = mWidgetPreviewLoader.getBadgeForUser(mItem.user,
- BaseIconFactory.getBadgeSizeForIconSize(
- mActivity.getDeviceProfile().allAppsIconSizePx));
- if (badge == null) {
- mWidgetBadge.setVisibility(View.GONE);
- } else {
- mWidgetBadge.setVisibility(View.VISIBLE);
- mWidgetBadge.setImageDrawable(badge);
- }
if (mAnimatePreview) {
mWidgetImageContainer.setAlpha(0f);
ViewPropertyAnimator anim = mWidgetImageContainer.animate();
@@ -344,11 +342,9 @@
/** Sets the widget preview image size, in number of cells, and preview scale. */
public void setPreviewSize(int spanX, int spanY, float previewScale) {
- int padding = 2 * getResources()
- .getDimensionPixelSize(R.dimen.widget_preview_shortcut_padding);
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
- mPreviewWidth = deviceProfile.cellWidthPx * spanX + padding;
- mPreviewHeight = deviceProfile.cellHeightPx * spanY + padding;
+ mPreviewWidth = deviceProfile.cellWidthPx * spanX + mPreviewPadding;
+ mPreviewHeight = deviceProfile.cellHeightPx * spanY + mPreviewPadding;
mPreviewScale = previewScale;
}
diff --git a/src/com/android/launcher3/widget/WidgetsBottomSheet.java b/src/com/android/launcher3/widget/WidgetsBottomSheet.java
index 787a2d1..81df100 100644
--- a/src/com/android/launcher3/widget/WidgetsBottomSheet.java
+++ b/src/com/android/launcher3/widget/WidgetsBottomSheet.java
@@ -68,12 +68,43 @@
};
private static final int DEFAULT_CLOSE_DURATION = 200;
+ private static final long EDUCATION_TIP_DELAY_MS = 300;
+
private ItemInfo mOriginalItemInfo;
private Rect mInsets;
private final int mMaxTableHeight;
private int mMaxHorizontalSpan = 4;
private Configuration mCurrentConfiguration;
+ private final OnLayoutChangeListener mLayoutChangeListenerToShowTips =
+ new OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ if (hasSeenEducationTip()) {
+ removeOnLayoutChangeListener(this);
+ return;
+ }
+ // Widgets are loaded asynchronously, We are adding a delay because we only want
+ // to show the tip when the widget preview has finished loading and rendering in
+ // this view.
+ removeCallbacks(mShowEducationTipTask);
+ postDelayed(mShowEducationTipTask, EDUCATION_TIP_DELAY_MS);
+ }
+ };
+
+ private final Runnable mShowEducationTipTask = () -> {
+ if (hasSeenEducationTip()) {
+ removeOnLayoutChangeListener(mLayoutChangeListenerToShowTips);
+ return;
+ }
+ View viewForTip = ((ViewGroup) ((TableLayout) findViewById(R.id.widgets_table))
+ .getChildAt(0)).getChildAt(0);
+ if (showEducationTipOnViewIfPossible(viewForTip) != null) {
+ removeOnLayoutChangeListener(mLayoutChangeListenerToShowTips);
+ }
+ };
+
public WidgetsBottomSheet(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@@ -88,6 +119,9 @@
// take over the entire view vertically.
mMaxTableHeight = deviceProfile.inv.numRows * 2 / 3 * deviceProfile.cellHeightPx;
mCurrentConfiguration = new Configuration(getResources().getConfiguration());
+ if (!hasSeenEducationTip()) {
+ addOnLayoutChangeListener(mLayoutChangeListenerToShowTips);
+ }
}
@Override
diff --git a/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java b/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java
index 34346ab..6643779 100644
--- a/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java
+++ b/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java
@@ -15,11 +15,13 @@
*/
package com.android.launcher3.widget.picker;
+import android.animation.ValueAnimator;
import android.graphics.Point;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.RelativeLayout;
+import android.widget.TextView;
import androidx.annotation.Nullable;
@@ -32,14 +34,17 @@
* vertical displacement upon scrolling.
*/
final class SearchAndRecommendationsScrollController implements
- RecyclerViewFastScroller.OnFastScrollChangeListener {
+ RecyclerViewFastScroller.OnFastScrollChangeListener, ValueAnimator.AnimatorUpdateListener {
private final boolean mHasWorkProfile;
private final SearchAndRecommendationViewHolder mViewHolder;
private final View mSearchAndRecommendationViewParent;
private final WidgetsRecyclerView mPrimaryRecyclerView;
private final WidgetsRecyclerView mSearchRecyclerView;
+ private final TextView mNoWidgetsView;
private final int mTabsHeight;
+ private final ValueAnimator mAnimator = ValueAnimator.ofInt(0, 0);
private final Point mTempOffset = new Point();
+ private int mBottomInset;
// The following are only non null if mHasWorkProfile is true.
@Nullable private final WidgetsRecyclerView mWorkRecyclerView;
@@ -47,8 +52,9 @@
@Nullable private final PersonalWorkPagedView mPrimaryWorkViewPager;
private WidgetsRecyclerView mCurrentRecyclerView;
+ private int mCurrentRecyclerViewScrollY = 0;
- private OnContentChangeListener mOnContentChangeListener = () -> applyVerticalTransition();
+ private OnContentChangeListener mOnContentChangeListener = () -> onScrollChanged();
/**
* The vertical distance, in pixels, until the search is pinned at the top of the screen when
@@ -78,7 +84,8 @@
@Nullable WidgetsRecyclerView workRecyclerView,
WidgetsRecyclerView searchRecyclerView,
@Nullable View personalWorkTabsView,
- @Nullable PersonalWorkPagedView primaryWorkViewPager) {
+ @Nullable PersonalWorkPagedView primaryWorkViewPager,
+ TextView noWidgetsView) {
mHasWorkProfile = hasWorkProfile;
mViewHolder = viewHolder;
mViewHolder.mContainer.setSearchAndRecommendationScrollController(this);
@@ -89,23 +96,35 @@
mPrimaryWorkTabsView = personalWorkTabsView;
mPrimaryWorkViewPager = primaryWorkViewPager;
mTabsHeight = tabsHeight;
- setCurrentRecyclerView(mPrimaryRecyclerView);
+ mNoWidgetsView = noWidgetsView;
+ setCurrentRecyclerView(mPrimaryRecyclerView, /* animateReset= */ false);
+ }
+
+ public void setCurrentRecyclerView(WidgetsRecyclerView currentRecyclerView) {
+ setCurrentRecyclerView(currentRecyclerView, /* animateReset= */ true);
}
/** Sets the current active {@link WidgetsRecyclerView}. */
- public void setCurrentRecyclerView(WidgetsRecyclerView currentRecyclerView) {
+ private void setCurrentRecyclerView(WidgetsRecyclerView currentRecyclerView,
+ boolean animateReset) {
+ if (mCurrentRecyclerView == currentRecyclerView) {
+ return;
+ }
if (mCurrentRecyclerView != null) {
mCurrentRecyclerView.setOnContentChangeListener(null);
}
mCurrentRecyclerView = currentRecyclerView;
mCurrentRecyclerView.setOnContentChangeListener(mOnContentChangeListener);
- mViewHolder.mHeaderTitle.setTranslationY(0);
- mViewHolder.mRecommendedWidgetsTable.setTranslationY(0);
- mViewHolder.mSearchBarContainer.setTranslationY(0);
+ reset(animateReset);
+ }
- if (mHasWorkProfile) {
- mPrimaryWorkTabsView.setTranslationY(0);
- }
+ /**
+ * Updates padding of {@link WidgetsFullSheet} contents to include {@code bottomInset} wherever
+ * necessary.
+ */
+ public boolean updateBottomInset(int bottomInset) {
+ mBottomInset = bottomInset;
+ return updateMarginAndPadding();
}
/**
@@ -124,6 +143,8 @@
+ measureHeightWithVerticalMargins(mViewHolder.mRecommendedWidgetsTable);
int topContainerHeight = measureHeightWithVerticalMargins(mViewHolder.mContainer);
+ int noWidgetsViewHeight = topContainerHeight - mBottomInset;
+
if (mHasWorkProfile) {
mCollapsibleHeightForTabs = measureHeightWithVerticalMargins(mViewHolder.mHeaderTitle)
+ measureHeightWithVerticalMargins(mViewHolder.mRecommendedWidgetsTable);
@@ -175,6 +196,10 @@
int topOffsetAfterAllViewsCollapsed =
topContainerHeight + mTabsHeight - mCollapsibleHeightForTabs;
+ if (mPrimaryWorkTabsView.getVisibility() == View.VISIBLE) {
+ noWidgetsViewHeight += mTabsHeight;
+ }
+
RelativeLayout.LayoutParams viewPagerLayoutParams =
(RelativeLayout.LayoutParams) mPrimaryWorkViewPager.getLayoutParams();
if (viewPagerLayoutParams.topMargin != topOffsetAfterAllViewsCollapsed) {
@@ -217,11 +242,25 @@
mSearchRecyclerView.getPaddingBottom());
hasMarginOrPaddingUpdated = true;
}
+ if (mNoWidgetsView.getPaddingTop() != noWidgetsViewHeight) {
+ mNoWidgetsView.setPadding(
+ mNoWidgetsView.getPaddingLeft(),
+ noWidgetsViewHeight,
+ mNoWidgetsView.getPaddingRight(),
+ mNoWidgetsView.getPaddingBottom());
+ hasMarginOrPaddingUpdated = true;
+ }
return hasMarginOrPaddingUpdated;
}
@Override
public void onScrollChanged() {
+ int recyclerViewYOffset = mCurrentRecyclerView.getCurrentScrollY();
+ if (recyclerViewYOffset < 0) return;
+ mCurrentRecyclerViewScrollY = recyclerViewYOffset;
+ if (mAnimator.isStarted()) {
+ mAnimator.cancel();
+ }
applyVerticalTransition();
}
@@ -230,34 +269,43 @@
* views (e.g. recycler views, tabs) upon scrolling / content changes in the recycler view.
*/
private void applyVerticalTransition() {
- // Always use the recycler view offset because fast scroller offset has a different scale.
- int recyclerViewYOffset = mCurrentRecyclerView.getCurrentScrollY();
- if (recyclerViewYOffset < 0) return;
-
if (mCollapsibleHeightForRecommendation > 0) {
- int yDisplacement = Math.max(-recyclerViewYOffset,
+ int yDisplacement = Math.max(-mCurrentRecyclerViewScrollY,
-mCollapsibleHeightForRecommendation);
mViewHolder.mHeaderTitle.setTranslationY(yDisplacement);
mViewHolder.mRecommendedWidgetsTable.setTranslationY(yDisplacement);
}
if (mCollapsibleHeightForSearch > 0) {
- int searchYDisplacement = Math.max(-recyclerViewYOffset, -mCollapsibleHeightForSearch);
+ int searchYDisplacement = Math.max(-mCurrentRecyclerViewScrollY,
+ -mCollapsibleHeightForSearch);
mViewHolder.mSearchBarContainer.setTranslationY(searchYDisplacement);
}
if (mHasWorkProfile && mCollapsibleHeightForTabs > 0) {
- int yDisplacementForTabs = Math.max(-recyclerViewYOffset, -mCollapsibleHeightForTabs);
+ int yDisplacementForTabs = Math.max(-mCurrentRecyclerViewScrollY,
+ -mCollapsibleHeightForTabs);
mPrimaryWorkTabsView.setTranslationY(yDisplacementForTabs);
}
}
/** Resets any previous view translation. */
- public void reset() {
- mViewHolder.mHeaderTitle.setTranslationY(0);
- mViewHolder.mSearchBarContainer.setTranslationY(0);
- if (mHasWorkProfile) {
- mPrimaryWorkTabsView.setTranslationY(0);
+ public void reset(boolean animate) {
+ if (mCurrentRecyclerViewScrollY == 0) {
+ return;
+ }
+ if (mAnimator.isStarted()) {
+ mAnimator.cancel();
+ }
+
+ if (animate) {
+ mAnimator.setIntValues(mCurrentRecyclerViewScrollY, 0);
+ mAnimator.addUpdateListener(this);
+ mAnimator.setDuration(300);
+ mAnimator.start();
+ } else {
+ mCurrentRecyclerViewScrollY = 0;
+ applyVerticalTransition();
}
}
@@ -308,6 +356,12 @@
+ marginLayoutParams.topMargin;
}
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ mCurrentRecyclerViewScrollY = (Integer) animation.getAnimatedValue();
+ applyVerticalTransition();
+ }
+
/**
* A listener to be notified when there is a content change in the recycler view that may affect
* the relative position of the search and recommendation container.
diff --git a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
index e44acc3..92f84da 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
@@ -41,7 +41,7 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
-import androidx.core.view.ViewCompat;
+import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.RecyclerView;
import com.android.launcher3.DeviceProfile;
@@ -56,12 +56,12 @@
import com.android.launcher3.views.ArrowTipView;
import com.android.launcher3.views.RecyclerViewFastScroller;
import com.android.launcher3.views.TopRoundedCornerView;
+import com.android.launcher3.views.WidgetsEduView;
import com.android.launcher3.widget.BaseWidgetSheet;
import com.android.launcher3.widget.LauncherAppWidgetHost.ProviderChangedListener;
import com.android.launcher3.widget.model.WidgetsListBaseEntry;
import com.android.launcher3.widget.picker.search.SearchModeListener;
import com.android.launcher3.widget.picker.search.WidgetsSearchBar;
-import com.android.launcher3.widget.picker.search.WidgetsSearchBarUIHelper;
import com.android.launcher3.widget.util.WidgetsTableUtils;
import com.android.launcher3.workprofile.PersonalWorkPagedView;
import com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip.OnActivePageChangedListener;
@@ -76,28 +76,31 @@
*/
public class WidgetsFullSheet extends BaseWidgetSheet
implements Insettable, ProviderChangedListener, OnActivePageChangedListener,
- WidgetsRecyclerView.HeaderViewDimensionsProvider, SearchModeListener,
- WidgetsSearchBarUIHelper {
+ WidgetsRecyclerView.HeaderViewDimensionsProvider, SearchModeListener {
private static final String TAG = WidgetsFullSheet.class.getSimpleName();
private static final long DEFAULT_OPEN_DURATION = 267;
private static final long FADE_IN_DURATION = 150;
private static final long EDUCATION_TIP_DELAY_MS = 200;
+ private static final long EDUCATION_DIALOG_DELAY_MS = 500;
private static final float VERTICAL_START_POSITION = 0.3f;
// The widget recommendation table can easily take over the entire screen on devices with small
// resolution or landscape on phone. This ratio defines the max percentage of content area that
// the table can display.
private static final float RECOMMENDATION_TABLE_HEIGHT_RATIO = 0.75f;
- private static final String WIDGETS_EDUCATION_TIP_SEEN = "launcher.widgets_education_tip_seen";
+
+ private static final String KEY_WIDGETS_EDUCATION_DIALOG_SEEN =
+ "launcher.widgets_education_dialog_seen";
private final Rect mInsets = new Rect();
private final boolean mHasWorkProfile;
private final SparseArray<AdapterHolder> mAdapters = new SparseArray();
private final UserHandle mCurrentUser = Process.myUserHandle();
- private final Predicate<WidgetsListBaseEntry> mPrimaryWidgetsFilter = entry ->
- mCurrentUser.equals(entry.mPkgItem.user);
+ private final Predicate<WidgetsListBaseEntry> mPrimaryWidgetsFilter =
+ entry -> mCurrentUser.equals(entry.mPkgItem.user);
private final Predicate<WidgetsListBaseEntry> mWorkWidgetsFilter =
mPrimaryWidgetsFilter.negate();
+ @Nullable private ArrowTipView mLatestEducationalTip;
private final OnLayoutChangeListener mLayoutChangeListenerToShowTips =
new OnLayoutChangeListener() {
@Override
@@ -121,17 +124,21 @@
removeOnLayoutChangeListener(mLayoutChangeListenerToShowTips);
return;
}
- View viewForTip = getViewToShowEducationTip();
- if (viewForTip != null && ViewCompat.isLaidOut(viewForTip)) {
+ mLatestEducationalTip = showEducationTipOnViewIfPossible(getViewToShowEducationTip());
+ if (mLatestEducationalTip != null) {
removeOnLayoutChangeListener(mLayoutChangeListenerToShowTips);
- showEducationTipOnView(viewForTip);
}
};
+
private final int mTabsHeight;
+ private final int mViewPagerTopPadding;
+ private final int mSearchAndRecommendationContainerBottomMargin;
private final int mWidgetCellHorizontalPadding;
+ @Nullable private WidgetsRecyclerView mCurrentWidgetsRecyclerView;
@Nullable private PersonalWorkPagedView mViewPager;
private boolean mIsInSearchMode;
+ private boolean mIsNoWidgetsViewNeeded;
private int mMaxSpansPerRow = 4;
private View mTabsView;
private TextView mNoWidgetsView;
@@ -148,6 +155,14 @@
? getContext().getResources()
.getDimensionPixelSize(R.dimen.all_apps_header_pill_height)
: 0;
+ mViewPagerTopPadding = mHasWorkProfile
+ ? getContext().getResources()
+ .getDimensionPixelSize(R.dimen.widget_picker_view_pager_top_padding)
+ : 0;
+ mSearchAndRecommendationContainerBottomMargin = getContext().getResources()
+ .getDimensionPixelSize(mHasWorkProfile
+ ? R.dimen.search_and_recommended_widgets_container_small_bottom_margin
+ : R.dimen.search_and_recommended_widgets_container_bottom_margin);
mWidgetCellHorizontalPadding = 2 * getResources().getDimensionPixelOffset(
R.dimen.widget_cell_horizontal_padding);
}
@@ -188,8 +203,14 @@
layoutInflater.inflate(R.layout.widgets_full_sheet_search_and_recommendations, springLayout,
true);
+ mNoWidgetsView = findViewById(R.id.no_widgets_text);
mSearchAndRecommendationViewHolder = new SearchAndRecommendationViewHolder(
findViewById(R.id.search_and_recommendations_container));
+ TopRoundedCornerView.LayoutParams layoutParams =
+ (TopRoundedCornerView.LayoutParams)
+ mSearchAndRecommendationViewHolder.mContainer.getLayoutParams();
+ layoutParams.bottomMargin = mSearchAndRecommendationContainerBottomMargin;
+ mSearchAndRecommendationViewHolder.mContainer.setLayoutParams(layoutParams);
mSearchAndRecommendationsScrollController = new SearchAndRecommendationsScrollController(
mHasWorkProfile,
mTabsHeight,
@@ -198,10 +219,10 @@
mHasWorkProfile ? findViewById(R.id.work_widgets_list_view) : null,
findViewById(R.id.search_widgets_list_view),
mTabsView,
- mViewPager);
+ mViewPager,
+ mNoWidgetsView);
fastScroller.setOnFastScrollChangeListener(mSearchAndRecommendationsScrollController);
- mNoWidgetsView = findViewById(R.id.no_widgets_text);
onRecommendedWidgetsBound();
onWidgetsBound();
@@ -209,9 +230,7 @@
mSearchAndRecommendationViewHolder.mSearchBar.initialize(
mActivityContext.getPopupDataProvider(), /* searchModeListener= */ this);
- if (!hasSeenEducationTip()) {
- addOnLayoutChangeListener(mLayoutChangeListenerToShowTips);
- }
+ setUpEducationViewsIfNeeded();
}
@Override
@@ -222,13 +241,18 @@
updateRecyclerViewVisibility(currentAdapterHolder);
attachScrollbarToRecyclerView(currentRecyclerView);
- resetExpandedHeaders();
}
private void attachScrollbarToRecyclerView(WidgetsRecyclerView recyclerView) {
recyclerView.bindFastScrollbar();
- mSearchAndRecommendationsScrollController.setCurrentRecyclerView(recyclerView);
- reset();
+ if (mCurrentWidgetsRecyclerView != recyclerView) {
+ // Only reset the scroll position & expanded apps if the currently shown recycler view
+ // has been updated.
+ reset();
+ resetExpandedHeaders();
+ mCurrentWidgetsRecyclerView = recyclerView;
+ mSearchAndRecommendationsScrollController.setCurrentRecyclerView(recyclerView);
+ }
}
private void updateRecyclerViewVisibility(AdapterHolder adapterHolder) {
@@ -248,7 +272,7 @@
mAdapters.get(AdapterHolder.WORK).mWidgetsRecyclerView.scrollToTop();
}
mAdapters.get(AdapterHolder.SEARCH).mWidgetsRecyclerView.scrollToTop();
- mSearchAndRecommendationsScrollController.reset();
+ mSearchAndRecommendationsScrollController.reset(/* animate= */ true);
}
@VisibleForTesting
@@ -291,6 +315,7 @@
if (mHasWorkProfile) {
setBottomPadding(mAdapters.get(AdapterHolder.WORK).mWidgetsRecyclerView, insets.bottom);
}
+ mSearchAndRecommendationsScrollController.updateBottomInset(insets.bottom);
if (insets.bottom > 0) {
setupNavBarColor();
} else {
@@ -406,6 +431,16 @@
} else {
updateRecyclerViewVisibility(primaryUserAdapterHolder);
}
+ // Update recommended widgets section so that it occupies appropriate space on screen to
+ // leave enough space for presence/absence of mNoWidgetsView.
+ boolean isNoWidgetsViewNeeded =
+ mAdapters.get(AdapterHolder.PRIMARY).mWidgetsListAdapter.getItemCount() == 0
+ || (mHasWorkProfile && mAdapters.get(AdapterHolder.WORK)
+ .mWidgetsListAdapter.getItemCount() == 0);
+ if (mIsNoWidgetsViewNeeded != isNoWidgetsViewNeeded) {
+ mIsNoWidgetsViewNeeded = isNoWidgetsViewNeeded;
+ onRecommendedWidgetsBound();
+ }
}
@Override
@@ -413,7 +448,6 @@
if (mIsInSearchMode) return;
setViewVisibilityBasedOnSearch(/*isInSearchMode= */ true);
attachScrollbarToRecyclerView(mAdapters.get(AdapterHolder.SEARCH).mWidgetsRecyclerView);
- resetExpandedHeaders();
}
@Override
@@ -473,9 +507,19 @@
WidgetsRecommendationTableLayout table =
mSearchAndRecommendationViewHolder.mRecommendedWidgetsTable;
if (recommendedWidgets.size() > 0) {
- float maxTableHeight =
- (mActivityContext.getDeviceProfile().availableHeightPx - mTabsHeight
- - getHeaderViewHeight()) * RECOMMENDATION_TABLE_HEIGHT_RATIO;
+ float noWidgetsViewHeight = 0;
+ if (mIsNoWidgetsViewNeeded) {
+ // Make sure recommended section leaves enough space for noWidgetsView.
+ Rect noWidgetsViewTextBounds = new Rect();
+ mNoWidgetsView.getPaint()
+ .getTextBounds(mNoWidgetsView.getText().toString(), /* start= */ 0,
+ mNoWidgetsView.getText().length(), noWidgetsViewTextBounds);
+ noWidgetsViewHeight = noWidgetsViewTextBounds.height();
+ }
+ float maxTableHeight = (mActivityContext.getDeviceProfile().availableHeightPx
+ - mTabsHeight - mViewPagerTopPadding - getHeaderViewHeight()
+ - noWidgetsViewHeight) * RECOMMENDATION_TABLE_HEIGHT_RATIO;
+
List<ArrayList<WidgetItem>> recommendedWidgetsInTable =
WidgetsTableUtils.groupWidgetItemsIntoTable(recommendedWidgets,
mMaxSpansPerRow);
@@ -535,6 +579,12 @@
} else if (getPopupContainer().isEventOverView(mContent, ev)) {
mNoIntercept = !getRecyclerView().shouldContainerScroll(ev, getPopupContainer());
}
+
+ if (mSearchAndRecommendationViewHolder.mSearchBar.isSearchBarFocused()
+ && !getPopupContainer().isEventOverView(
+ mSearchAndRecommendationViewHolder.mSearchBarContainer, ev)) {
+ mSearchAndRecommendationViewHolder.mSearchBar.clearSearchBarFocus();
+ }
}
return super.onControllerInterceptTouchEvent(ev);
}
@@ -565,6 +615,10 @@
@Override
protected void onCloseComplete() {
super.onCloseComplete();
+ removeCallbacks(mShowEducationTipTask);
+ if (mLatestEducationalTip != null) {
+ mLatestEducationalTip.close(false);
+ }
AccessibilityManagerCompat.sendStateEventToTest(getContext(), NORMAL_STATE_ORDINAL);
}
@@ -573,7 +627,7 @@
return measureHeightWithVerticalMargins(mSearchAndRecommendationViewHolder.mCollapseHandle)
+ measureHeightWithVerticalMargins(mSearchAndRecommendationViewHolder.mHeaderTitle)
+ measureHeightWithVerticalMargins(
- (View) mSearchAndRecommendationViewHolder.mSearchBar);
+ (View) mSearchAndRecommendationViewHolder.mSearchBarContainer);
}
/** private the height, in pixel, + the vertical margins of a given view. */
@@ -609,23 +663,6 @@
getWindowInsetsController().hide(WindowInsets.Type.ime());
}
- @Override
- public void clearSearchBarFocus() {
- mSearchAndRecommendationViewHolder.mSearchBar.clearSearchBarFocus();
- }
-
- private void showEducationTipOnView(View view) {
- mActivityContext.getSharedPrefs().edit()
- .putBoolean(WIDGETS_EDUCATION_TIP_SEEN, true).apply();
- int[] coords = new int[2];
- view.getLocationOnScreen(coords);
- ArrowTipView arrowTipView = new ArrowTipView(mActivityContext);
- arrowTipView.showAtLocation(
- getContext().getString(R.string.long_press_widget_to_add),
- /* arrowXCoord= */coords[0] + view.getWidth() / 2,
- /* yCoord= */coords[1]);
- }
-
@Nullable private View getViewToShowEducationTip() {
if (mSearchAndRecommendationViewHolder.mRecommendedWidgetsTable.getVisibility() == VISIBLE
&& mSearchAndRecommendationViewHolder.mRecommendedWidgetsTable.getChildCount() > 0
@@ -654,11 +691,38 @@
return null;
}
- private boolean hasSeenEducationTip() {
- return mActivityContext.getSharedPrefs().getBoolean(WIDGETS_EDUCATION_TIP_SEEN, false)
+ /** Shows education dialog for widgets. */
+ private WidgetsEduView showEducationDialog() {
+ mActivityContext.getSharedPrefs().edit()
+ .putBoolean(KEY_WIDGETS_EDUCATION_DIALOG_SEEN, true).apply();
+ return WidgetsEduView.showEducationDialog(mActivityContext);
+ }
+
+ /** Returns {@code true} if education dialog has previously been shown. */
+ protected boolean hasSeenEducationDialog() {
+ return mActivityContext.getSharedPrefs()
+ .getBoolean(KEY_WIDGETS_EDUCATION_DIALOG_SEEN, false)
|| Utilities.IS_RUNNING_IN_TEST_HARNESS;
}
+ private void setUpEducationViewsIfNeeded() {
+ if (!hasSeenEducationDialog()) {
+ postDelayed(() -> {
+ WidgetsEduView eduDialog = showEducationDialog();
+ eduDialog.addOnCloseListener(() -> {
+ if (!hasSeenEducationTip()) {
+ addOnLayoutChangeListener(mLayoutChangeListenerToShowTips);
+ // Call #requestLayout() to trigger layout change listener in order to show
+ // arrow tip immediately if there is a widget to show it on.
+ requestLayout();
+ }
+ });
+ }, EDUCATION_DIALOG_DELAY_MS);
+ } else if (!hasSeenEducationTip()) {
+ addOnLayoutChangeListener(mLayoutChangeListenerToShowTips);
+ }
+ }
+
/** A holder class for holding adapters & their corresponding recycler view. */
private final class AdapterHolder {
static final int PRIMARY = 0;
@@ -667,6 +731,7 @@
private final int mAdapterType;
private final WidgetsListAdapter mWidgetsListAdapter;
+ private final DefaultItemAnimator mWidgetsListItemAnimator;
private WidgetsRecyclerView mWidgetsRecyclerView;
@@ -681,9 +746,7 @@
apps.getWidgetCache(),
apps.getIconCache(),
/* iconClickListener= */ WidgetsFullSheet.this,
- /* iconLongClickListener= */ WidgetsFullSheet.this,
- /* WidgetsSearchBarUIHelper= */
- mAdapterType == SEARCH ? WidgetsFullSheet.this : null);
+ /* iconLongClickListener= */ WidgetsFullSheet.this);
mWidgetsListAdapter.setHasStableIds(true);
switch (mAdapterType) {
case PRIMARY:
@@ -695,13 +758,16 @@
default:
break;
}
+ mWidgetsListItemAnimator = new DefaultItemAnimator();
+ // Disable change animations because it disrupts the item focus upon adapter item
+ // change.
+ mWidgetsListItemAnimator.setSupportsChangeAnimations(false);
}
void setup(WidgetsRecyclerView recyclerView) {
mWidgetsRecyclerView = recyclerView;
mWidgetsRecyclerView.setAdapter(mWidgetsListAdapter);
- // Disables animation because it disrupts the item focus upon adapter item change.
- mWidgetsRecyclerView.setItemAnimator(null);
+ mWidgetsRecyclerView.setItemAnimator(mWidgetsListItemAnimator);
mWidgetsRecyclerView.setHeaderViewDimensionsProvider(WidgetsFullSheet.this);
mWidgetsRecyclerView.setEdgeEffectFactory(
((TopRoundedCornerView) mContent).createEdgeEffectFactory());
diff --git a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
index 0504e74..7963431 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
@@ -33,6 +33,7 @@
import com.android.launcher3.R;
import com.android.launcher3.WidgetPreviewLoader;
import com.android.launcher3.icons.IconCache;
+import com.android.launcher3.model.data.PackageItemInfo;
import com.android.launcher3.recyclerview.ViewHolderBinder;
import com.android.launcher3.util.LabelComparator;
import com.android.launcher3.util.PackageUserKey;
@@ -41,12 +42,12 @@
import com.android.launcher3.widget.model.WidgetsListContentEntry;
import com.android.launcher3.widget.model.WidgetsListHeaderEntry;
import com.android.launcher3.widget.model.WidgetsListSearchHeaderEntry;
-import com.android.launcher3.widget.picker.search.WidgetsSearchBarUIHelper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
+import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -70,7 +71,6 @@
private static final int VIEW_TYPE_WIDGETS_HEADER = R.id.view_type_widgets_header;
private static final int VIEW_TYPE_WIDGETS_SEARCH_HEADER = R.id.view_type_widgets_search_header;
- @Nullable private final WidgetsSearchBarUIHelper mSearchBarUIHelper;
private final WidgetsDiffReporter mDiffReporter;
private final SparseArray<ViewHolderBinder> mViewHolderBinders = new SparseArray<>();
private final WidgetsListTableViewHolderBinder mWidgetsListTableViewHolderBinder;
@@ -90,9 +90,7 @@
public WidgetsListAdapter(Context context, LayoutInflater layoutInflater,
WidgetPreviewLoader widgetPreviewLoader, IconCache iconCache,
- OnClickListener iconClickListener, OnLongClickListener iconLongClickListener,
- @Nullable WidgetsSearchBarUIHelper searchBarUIHelper) {
- mSearchBarUIHelper = searchBarUIHelper;
+ OnClickListener iconClickListener, OnLongClickListener iconLongClickListener) {
mDiffReporter = new WidgetsDiffReporter(iconCache, this);
mWidgetsListTableViewHolderBinder = new WidgetsListTableViewHolderBinder(context,
layoutInflater, iconClickListener, iconLongClickListener,
@@ -153,6 +151,9 @@
public void setWidgets(List<WidgetsListBaseEntry> tempEntries) {
mAllEntries = tempEntries.stream().sorted(mRowComparator)
.collect(Collectors.toList());
+ if (shouldClearVisibleEntries()) {
+ mVisibleEntries.clear();
+ }
updateVisibleEntries();
}
@@ -243,9 +244,6 @@
@Override
public void onHeaderClicked(boolean showWidgets, PackageUserKey packageUserKey) {
- if (mSearchBarUIHelper != null) {
- mSearchBarUIHelper.clearSearchBarFocus();
- }
if (showWidgets) {
mWidgetsContentVisiblePackageUserKey = packageUserKey;
updateVisibleEntries();
@@ -272,6 +270,30 @@
mWidgetsListTableViewHolderBinder.setMaxSpansPerRow(maxHorizontalSpans);
}
+ /**
+ * Returns {@code true} if there is a change in {@link #mAllEntries} that results in an
+ * invalidation of {@link #mVisibleEntries}. e.g. there is change in the device language.
+ */
+ private boolean shouldClearVisibleEntries() {
+ Map<PackageUserKey, PackageItemInfo> packagesInfo =
+ mAllEntries.stream()
+ .filter(entry -> entry instanceof WidgetsListHeaderEntry)
+ .map(entry -> entry.mPkgItem)
+ .collect(Collectors.toMap(
+ entry -> new PackageUserKey(entry.packageName, entry.user),
+ entry -> entry));
+ for (WidgetsListBaseEntry visibleEntry: mVisibleEntries) {
+ PackageUserKey key = new PackageUserKey(visibleEntry.mPkgItem.packageName,
+ visibleEntry.mPkgItem.user);
+ PackageItemInfo packageItemInfo = packagesInfo.get(key);
+ if (packageItemInfo != null
+ && !visibleEntry.mPkgItem.title.equals(packageItemInfo.title)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/** Comparator for sorting WidgetListRowEntry based on package title. */
public static class WidgetListBaseRowEntryComparator implements
Comparator<WidgetsListBaseEntry> {
diff --git a/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java b/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java
index e981906..e30e245 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java
@@ -49,10 +49,10 @@
private final int mScrollbarTop;
private final Point mFastScrollerOffset = new Point();
- private final int mEstimatedWidgetListHeaderHeight;
private boolean mTouchDownOnScroller;
private HeaderViewDimensionsProvider mHeaderViewDimensionsProvider;
private int mLastVisibleWidgetContentTableHeight = 0;
+ private int mWidgetHeaderHeight = 0;
@Nullable private OnContentChangeListener mOnContentChangeListener;
public WidgetsRecyclerView(Context context) {
@@ -71,9 +71,6 @@
ActivityContext activity = ActivityContext.lookupContext(getContext());
DeviceProfile grid = activity.getDeviceProfile();
- mEstimatedWidgetListHeaderHeight = grid.iconSizePx
- + 2 * context.getResources().getDimensionPixelSize(
- R.dimen.widget_list_header_view_vertical_padding);
}
@Override
@@ -164,6 +161,14 @@
if (view instanceof TableLayout) {
// This assumes there is ever only one content shown in this recycler view.
mLastVisibleWidgetContentTableHeight = view.getMeasuredHeight();
+ } else if (view instanceof WidgetsListHeader
+ && mLastVisibleWidgetContentTableHeight == 0
+ && view.getMeasuredHeight() > 0) {
+ // This assumes all header views are of the same height.
+ RecyclerView.LayoutParams layoutParams =
+ (RecyclerView.LayoutParams) view.getLayoutParams();
+ mWidgetHeaderHeight = view.getMeasuredHeight() + layoutParams.topMargin
+ + layoutParams.bottomMargin;
}
}
@@ -262,7 +267,7 @@
WidgetsListBaseEntry entry = mAdapter.getItems().get(i);
if (entry instanceof WidgetsListHeaderEntry
|| entry instanceof WidgetsListSearchHeaderEntry) {
- totalItemsHeight += mEstimatedWidgetListHeaderHeight;
+ totalItemsHeight += mWidgetHeaderHeight;
} else if (entry instanceof WidgetsListContentEntry) {
totalItemsHeight += mLastVisibleWidgetContentTableHeight;
} else {
diff --git a/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java b/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java
index 42f1bb2..65937b6 100644
--- a/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java
+++ b/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java
@@ -76,6 +76,11 @@
}
@Override
+ public boolean isSearchBarFocused() {
+ return mEditText.isFocused();
+ }
+
+ @Override
public void clearSearchBarFocus() {
mController.clearFocus();
}
diff --git a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBar.java b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBar.java
index 0ac47ce..44a5e80 100644
--- a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBar.java
+++ b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBar.java
@@ -32,6 +32,9 @@
*/
void reset();
+ /** Returns {@code true} if the search bar is in focus. */
+ boolean isSearchBarFocused();
+
/**
* Clears focus from search bar.
*/
diff --git a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarController.java b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarController.java
index a8294c0..2751a52 100644
--- a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarController.java
+++ b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarController.java
@@ -101,10 +101,8 @@
@Override
public void clearSearchResult() {
- mSearchAlgorithm.cancel(/* interruptActiveRequests= */ true);
+ // Any existing search session will be cancelled by setting text to empty.
mInput.setText("");
- clearFocus();
- mSearchModeListener.exitSearchMode();
}
/**
diff --git a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarUIHelper.java b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarUIHelper.java
deleted file mode 100644
index edfdc65..0000000
--- a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarUIHelper.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.launcher3.widget.picker.search;
-
-/**
- * UI helper for {@link WidgetsSearchBar}.
- */
-public interface WidgetsSearchBarUIHelper {
- /**
- * Clears focus from the search bar.
- */
- void clearSearchBarFocus();
-}
diff --git a/src/com/android/launcher3/widget/util/WidgetsTableUtils.java b/src/com/android/launcher3/widget/util/WidgetsTableUtils.java
index e73d661..7294a3a 100644
--- a/src/com/android/launcher3/widget/util/WidgetsTableUtils.java
+++ b/src/com/android/launcher3/widget/util/WidgetsTableUtils.java
@@ -52,9 +52,10 @@
* <p>Grouping:
* 1. Widgets and shortcuts never group together in the same row.
* 2. The ordered widgets are grouped together in the same row until their total horizontal
- * spans exceed the {@code maxSpansPerRow}.
+ * spans exceed the {@code maxSpansPerRow} - 1.
* 3. The order shortcuts are grouped together in the same row until their total horizontal
- * spans exceed the {@code maxSpansPerRow}.
+ * spans exceed the {@code maxSpansPerRow} - 1.
+ * 4. If there is only one widget in a row, its width may exceed the {@code maxSpansPerRow}.
*/
public static List<ArrayList<WidgetItem>> groupWidgetItemsIntoTable(
List<WidgetItem> widgetItems, final int maxSpansPerRow) {
@@ -70,10 +71,15 @@
int numOfWidgetItems = widgetItemsAtRow.size();
int totalHorizontalSpan = widgetItemsAtRow.stream().map(item -> item.spanX)
.reduce(/* default= */ 0, Integer::sum);
+ int totalHorizontalSpanAfterAddingWidget = widgetItem.spanX + totalHorizontalSpan;
if (numOfWidgetItems == 0) {
widgetItemsAtRow.add(widgetItem);
- } else if (widgetItem.spanX + totalHorizontalSpan <= maxSpansPerRow
- && widgetItem.hasSameType(widgetItemsAtRow.get(numOfWidgetItems - 1))) {
+ } else if (
+ // The max spans per row is reduced by 1 to ensure we don't pack too many
+ // 1xn widgets on the same row, which may reduce the space for rendering a
+ // widget's description.
+ totalHorizontalSpanAfterAddingWidget <= maxSpansPerRow - 1
+ && widgetItem.hasSameType(widgetItemsAtRow.get(numOfWidgetItems - 1))) {
// Group items in the same row if
// 1. they are with the same type, i.e. a row can only have widgets or shortcuts but
// never a mix of both.
diff --git a/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java b/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
index 8039fd1..8f9cdc8 100644
--- a/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
+++ b/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
@@ -36,7 +36,7 @@
public class PersonalWorkSlidingTabStrip extends LinearLayout implements PageIndicator {
private final Paint mSelectedIndicatorPaint;
- private int mSelectedIndicatorHeight;
+ private int mTabVerticalPadding;
private final int mSelectedIndicatorRadius;
private int mIndicatorLeft = -1;
@@ -52,8 +52,8 @@
super(context, attrs);
setWillNotDraw(false);
- mSelectedIndicatorHeight =
- getResources().getDimensionPixelSize(R.dimen.all_apps_header_pill_height);
+ mTabVerticalPadding =
+ getResources().getDimensionPixelSize(R.dimen.all_apps_tabs_vertical_padding);
mSelectedIndicatorRadius = getResources().getDimensionPixelSize(
R.dimen.all_apps_header_pill_corner_radius);
@@ -112,9 +112,9 @@
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
- canvas.drawRoundRect(mIndicatorLeft, getHeight() - mSelectedIndicatorHeight,
- mIndicatorRight, getHeight(), mSelectedIndicatorRadius, mSelectedIndicatorRadius,
- mSelectedIndicatorPaint);
+ canvas.drawRoundRect(mIndicatorLeft, mTabVerticalPadding, mIndicatorRight,
+ getHeight() - mTabVerticalPadding, mSelectedIndicatorRadius,
+ mSelectedIndicatorRadius, mSelectedIndicatorPaint);
}
@Override
@@ -127,7 +127,6 @@
public void setActiveMarker(int activePage) {
updateTabTextColor(activePage);
if (mOnActivePageChangedListener != null && mLastActivePage != activePage) {
- updateIndicatorPosition(activePage);
mOnActivePageChangedListener.onActivePageChanged(activePage);
}
mLastActivePage = activePage;
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index 57f40db..c99a81f 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -105,7 +105,7 @@
static final Pattern EVENT_TOUCH_DOWN_TIS = getTouchEventPatternTIS("ACTION_DOWN");
static final Pattern EVENT_TOUCH_UP_TIS = getTouchEventPatternTIS("ACTION_UP");
private final String mLauncherPackage;
- private final boolean mIsLauncher3;
+ private Boolean mIsLauncher3;
private long mTestStartTime = -1;
// Types for launcher containers that the user is interacting with. "Background" is a
@@ -206,7 +206,6 @@
public LauncherInstrumentation(Instrumentation instrumentation) {
mInstrumentation = instrumentation;
mDevice = UiDevice.getInstance(instrumentation);
- mIsLauncher3 = "com.android.launcher3".equals(getLauncherPackageName());
// Launcher should run in test harness so that custom accessibility protocol between
// Launcher and TAPL is enabled. In-process tests enable this protocol with a direct call
@@ -496,13 +495,14 @@
private void fail(String message) {
checkForAnomaly();
Assert.fail(formatSystemHealthMessage(formatErrorWithEvents(
- "http://go/tapl test failure:\nOverview: " + getContextDescription()
+ "http://go/tapl test failure:\nSummary: " + getContextDescription()
+ " - visible state is " + getVisibleStateMessage()
+ ";\nDetails: " + message, true)));
}
private String getContextDescription() {
- return mDiagnosticContext.isEmpty() ? "" : String.join(", ", mDiagnosticContext);
+ return mDiagnosticContext.isEmpty()
+ ? "(no context)" : String.join(", ", mDiagnosticContext);
}
void assertTrue(String message, boolean condition) {
@@ -1421,6 +1421,9 @@
}
boolean isLauncher3() {
+ if (mIsLauncher3 == null) {
+ mIsLauncher3 = "com.android.launcher3".equals(getLauncherPackageName());
+ }
return mIsLauncher3;
}
diff --git a/tests/tapl/com/android/launcher3/tapl/SelectModeButtons.java b/tests/tapl/com/android/launcher3/tapl/SelectModeButtons.java
index 3507418..e1b73a4 100644
--- a/tests/tapl/com/android/launcher3/tapl/SelectModeButtons.java
+++ b/tests/tapl/com/android/launcher3/tapl/SelectModeButtons.java
@@ -48,21 +48,4 @@
}
}
}
-
- /**
- * Click feedback button.
- */
- @NonNull
- public Background clickFeedback() {
- try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck();
- LauncherInstrumentation.Closable c =
- mLauncher.addContextLayer("want to click feedback button")) {
- UiObject2 feedback = mLauncher.waitForObjectInContainer(mSelectModeButtons, "feedback");
- mLauncher.clickLauncherObject(feedback);
- try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer(
- "clicked feedback button")) {
- return new Background(mLauncher);
- }
- }
- }
}