diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2018-05-23 07:23:07 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-05-23 07:23:07 +0000 |
commit | 4ac63b28ced5d5b09eaae39adca68377a2a7ef5b (patch) | |
tree | 190b1a5377bf6dfc836e4be57767d0cd512c6bf2 | |
parent | 8102503413976f42f825aacda49af53a5483933b (diff) | |
parent | d00202ed3306950264be533cb2e8a171f58f7930 (diff) | |
download | android_packages_apps_Trebuchet-4ac63b28ced5d5b09eaae39adca68377a2a7ef5b.tar.gz android_packages_apps_Trebuchet-4ac63b28ced5d5b09eaae39adca68377a2a7ef5b.tar.bz2 android_packages_apps_Trebuchet-4ac63b28ced5d5b09eaae39adca68377a2a7ef5b.zip |
Snap for 4799153 from d00202ed3306950264be533cb2e8a171f58f7930 to pi-release
Change-Id: I72cfd121a4f78f4f1c44a5989a07bc9926593a2c
424 files changed, 14432 insertions, 3189 deletions
diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml index c24850d84..211e1ff37 100644 --- a/AndroidManifest-common.xml +++ b/AndroidManifest-common.xml @@ -20,7 +20,6 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.launcher3"> - <uses-sdk android:targetSdkVersion="23" android:minSdkVersion="21"/> <!-- The manifest defines the common entries that should be present in any derivative of Launcher3. @@ -82,7 +81,7 @@ </receiver> <service - android:name="com.android.launcher3.compat.WallpaperManagerCompatVL$ColorExtractionService" + android:name="com.android.launcher3.uioverrides.dynamicui.WallpaperManagerCompatVL$ColorExtractionService" android:exported="false" android:process=":wallpaper_chooser" android:permission="android.permission.BIND_JOB_SERVICE" /> diff --git a/AndroidManifest.xml b/AndroidManifest.xml index fde22ebc5..b7c579391 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -72,7 +72,7 @@ android:stateNotNeeded="true" android:windowSoftInputMode="adjustPan" android:screenOrientation="unspecified" - android:configChanges="keyboard|keyboardHidden|navigation" + android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize" android:resizeableActivity="true" android:resumeWhilePausing="true" android:taskAffinity="" diff --git a/build.gradle b/build.gradle index 0030b8bfc..4ae6600ee 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,16 @@ buildscript { repositories { mavenCentral() - jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0' + classpath 'com.android.tools.build:gradle:3.2.0-alpha12' + classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.3' } } +final String SUPPORT_LIBS_VERSION = '28.0.0-SNAPSHOT' + apply plugin: 'com.android.application' apply plugin: 'com.google.protobuf' @@ -23,6 +25,7 @@ android { versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + vectorDrawables.useSupportLibrary = true } buildTypes { debug { @@ -30,18 +33,28 @@ android { } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + flavorDimensions "default" + productFlavors { aosp { + dimension "default" applicationId 'com.android.launcher3' testApplicationId 'com.android.launcher3.tests' } l3go { + dimension "default" applicationId 'com.android.launcher3' testApplicationId 'com.android.launcher3.tests' } quickstep { + dimension "default" applicationId 'com.android.launcher3' testApplicationId 'com.android.launcher3.tests' } @@ -98,27 +111,28 @@ android { } repositories { + maven { url "../../../prebuilts/fullsdk-darwin/extras/android/m2repository" } + maven { url "../../../prebuilts/fullsdk-linux/extras/android/m2repository" } mavenCentral() - jcenter() + google() } -final String SUPPORT_LIBS_VERSION = '28.0.0-SNAPSHOT' dependencies { - compile "com.android.support:support-v4:${SUPPORT_LIBS_VERSION}" - compile "com.android.support:support-dynamic-animation:${SUPPORT_LIBS_VERSION}" - compile "com.android.support:recyclerview-v7:${SUPPORT_LIBS_VERSION}" - compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7' - - quickstepCompile fileTree(dir: "quickstep/libs", include: 'sysui_shared.jar') - - testCompile 'junit:junit:4.12' - androidTestCompile "org.mockito:mockito-core:1.9.5" - androidTestCompile 'com.google.dexmaker:dexmaker:1.2' - androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2' - androidTestCompile 'com.android.support.test:runner:1.0.0' - androidTestCompile 'com.android.support.test:rules:1.0.0' - androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' - androidTestCompile "com.android.support:support-annotations:${SUPPORT_LIBS_VERSION}" + implementation "com.android.support:support-v4:${SUPPORT_LIBS_VERSION}" + implementation "com.android.support:support-dynamic-animation:${SUPPORT_LIBS_VERSION}" + implementation "com.android.support:recyclerview-v7:${SUPPORT_LIBS_VERSION}" + implementation 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7' + + quickstepImplementation fileTree(dir: "quickstep/libs", include: 'sysui_shared.jar') + + testImplementation 'junit:junit:4.12' + androidTestImplementation "org.mockito:mockito-core:1.9.5" + androidTestImplementation 'com.google.dexmaker:dexmaker:1.2' + androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.2' + androidTestImplementation 'com.android.support.test:runner:1.0.0' + androidTestImplementation 'com.android.support.test:rules:1.0.0' + androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' + androidTestImplementation "com.android.support:support-annotations:${SUPPORT_LIBS_VERSION}" } protobuf { diff --git a/go/res/values-ar/strings.xml b/go/res/values-ar/strings.xml index 2b3b80746..9888d0f7c 100644 --- a/go/res/values-ar/strings.xml +++ b/go/res/values-ar/strings.xml @@ -20,7 +20,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="long_press_widget_to_add" msgid="4001616142797446267">"المس مع الاستمرار لاختيار اختصار."</string> - <string name="long_accessible_way_to_add" msgid="2725225828389948328">"يمكنك النقر نقرًا مزدوجًا مع الاستمرار لاختيار اختصار أو استخدام الإجراءات المخصصة."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"يمكنك النقر مرّتين مع الاستمرار لاختيار اختصار أو استخدام الإجراءات المخصصة."</string> <string name="widget_button_text" msgid="4221900832360456858">"الاختصارات"</string> <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"اختصارات <xliff:g id="NAME">%1$s</xliff:g>"</string> </resources> diff --git a/go/res/values-as/strings.xml b/go/res/values-as/strings.xml new file mode 100644 index 000000000..6b5807f97 --- /dev/null +++ b/go/res/values-as/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ স্পৰ্শ কৰি ৰাখক।"</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ দুবাৰ টিপি ৰাখক বা নিজৰ উপযোগিতা অনুসৰি বনোৱা কাৰ্যসমূহ ব্যৱহাৰ কৰক।"</string> + <string name="widget_button_text" msgid="4221900832360456858">"শ্বৰ্টকাটসমূহ"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> শ্বৰ্টকাটসমূহ"</string> +</resources> diff --git a/go/res/values-az-rAZ/strings.xml b/go/res/values-az-rAZ/strings.xml new file mode 100644 index 000000000..c4b8cb780 --- /dev/null +++ b/go/res/values-az-rAZ/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Qısayolu seçmək üçün toxunub saxlayın."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Qısayolu seçmək üçün iki dəfə basıb saxlayın və ya fərdi əməliyyatlardan istifadə edin."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Qısayollar"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> qısayolları"</string> +</resources> diff --git a/go/res/values-be-rBY/strings.xml b/go/res/values-be-rBY/strings.xml new file mode 100644 index 000000000..4189e35fa --- /dev/null +++ b/go/res/values-be-rBY/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Дакраніцеся і ўтрымлiвайце ярлык, каб дадаць яго."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Дакраніцеся двойчы і ўтрымлівайце, каб выбраць ярлык або выкарыстоўваць спецыяльныя дзеянні."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Ярлыкі"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"Ярлыкі <xliff:g id="NAME">%1$s</xliff:g>"</string> +</resources> diff --git a/go/res/values-bn-rBD/strings.xml b/go/res/values-bn-rBD/strings.xml new file mode 100644 index 000000000..c56c925a2 --- /dev/null +++ b/go/res/values-bn-rBD/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"কোনও শর্টকাট বেছে নিতে টাচ করে ধরে রাখুন।"</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"কোনও শর্টকাট বেছে নিতে ডাবল ট্যাপ করে ধরে রাখুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন।"</string> + <string name="widget_button_text" msgid="4221900832360456858">"শর্টকাট"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> এর শর্টকাট"</string> +</resources> diff --git a/go/res/values-bs-rBA/strings.xml b/go/res/values-bs-rBA/strings.xml new file mode 100644 index 000000000..3141b9d8f --- /dev/null +++ b/go/res/values-bs-rBA/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Dodirnite i držite da uzmete prečicu."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Dodirnite dvaput i držite da uzmete prečicu ili koristite prilagođene akcije."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Prečice"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"Prečice aplikacije <xliff:g id="NAME">%1$s</xliff:g>"</string> +</resources> diff --git a/go/res/values-bs/strings.xml b/go/res/values-bs/strings.xml index 7042468b4..3141b9d8f 100644 --- a/go/res/values-bs/strings.xml +++ b/go/res/values-bs/strings.xml @@ -20,7 +20,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="long_press_widget_to_add" msgid="4001616142797446267">"Dodirnite i držite da uzmete prečicu."</string> - <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Dvaput dodirnite i držite da uzmete prečicu ili koristite prilagođene akcije."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Dodirnite dvaput i držite da uzmete prečicu ili koristite prilagođene akcije."</string> <string name="widget_button_text" msgid="4221900832360456858">"Prečice"</string> <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"Prečice aplikacije <xliff:g id="NAME">%1$s</xliff:g>"</string> </resources> diff --git a/go/res/values-et-rEE/strings.xml b/go/res/values-et-rEE/strings.xml new file mode 100644 index 000000000..2513e65a3 --- /dev/null +++ b/go/res/values-et-rEE/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Otsetee valimiseks puudutage seda pikalt."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Topeltpuudutage ja hoidke otsetee valimiseks või kohandatud toimingute kasutamiseks."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Otseteed"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"Rakenduse <xliff:g id="NAME">%1$s</xliff:g> otseteed"</string> +</resources> diff --git a/go/res/values-eu-rES/strings.xml b/go/res/values-eu-rES/strings.xml new file mode 100644 index 000000000..9949ef091 --- /dev/null +++ b/go/res/values-eu-rES/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Eduki sakatuta lasterbide bat aukeratzeko."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Sakatu birritan eta eduki sakatuta lasterbide bat aukeratzeko edo ekintza pertsonalizatuak erabiltzeko."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Lasterbideak"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> aplikazioaren lasterbidea"</string> +</resources> diff --git a/go/res/values-gl-rES/strings.xml b/go/res/values-gl-rES/strings.xml new file mode 100644 index 000000000..31621d5c2 --- /dev/null +++ b/go/res/values-gl-rES/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Mantén premido un atallo para seleccionalo."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Toca dúas veces e mantén premido para seleccionar un atallo ou utiliza accións personalizadas."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Atallos"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"Atallos da aplicación <xliff:g id="NAME">%1$s</xliff:g>"</string> +</resources> diff --git a/go/res/values-gu-rIN/strings.xml b/go/res/values-gu-rIN/strings.xml new file mode 100644 index 000000000..bdb549ff7 --- /dev/null +++ b/go/res/values-gu-rIN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"એક શૉર્ટકટ ચૂંટવા ટૅપ કરી રાખો."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"એક શૉર્ટકટ ચૂંટવા અથવા કોઈ કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટૅપ કરી રાખો."</string> + <string name="widget_button_text" msgid="4221900832360456858">"શૉર્ટકટ"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> શૉર્ટકટ"</string> +</resources> diff --git a/go/res/values-hy-rAM/strings.xml b/go/res/values-hy-rAM/strings.xml new file mode 100644 index 000000000..4747f6df3 --- /dev/null +++ b/go/res/values-hy-rAM/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար։"</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար կամ օգտվեք հարմարեցրած գործողություններից:"</string> + <string name="widget_button_text" msgid="4221900832360456858">"Դյուրանցումներ"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> դյուրանցումներ"</string> +</resources> diff --git a/go/res/values-is-rIS/strings.xml b/go/res/values-is-rIS/strings.xml new file mode 100644 index 000000000..b8bb92374 --- /dev/null +++ b/go/res/values-is-rIS/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Haltu fingri á flýtileið til að grípa hana."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Ýttu tvisvar og haltu fingri á flýtileið til að grípa hana eða notaðu sérsniðnar aðgerðir."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Flýtileiðir"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> flýtileiðir"</string> +</resources> diff --git a/go/res/values-ka-rGE/strings.xml b/go/res/values-ka-rGE/strings.xml new file mode 100644 index 000000000..1b4653478 --- /dev/null +++ b/go/res/values-ka-rGE/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"შეეხეთ და დააყოვნეთ მალსახმობის ასარჩევად."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"ორმაგად შეეხეთ და გეჭიროთ მალსახმობის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად."</string> + <string name="widget_button_text" msgid="4221900832360456858">"მალსახმობები"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g>-ის მალსახმობები"</string> +</resources> diff --git a/go/res/values-kk-rKZ/strings.xml b/go/res/values-kk-rKZ/strings.xml new file mode 100644 index 000000000..e909818af --- /dev/null +++ b/go/res/values-kk-rKZ/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Таңбашаны таңдау үшін оны түртіп, ұстап тұрыңыз."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Таңбашаны таңдау немесе арнаулы әрекеттерді пайдалану үшін екі рет түртіп, ұстап тұрыңыз."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Таңбашалар"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> таңбаша"</string> +</resources> diff --git a/go/res/values-km-rKH/strings.xml b/go/res/values-km-rKH/strings.xml new file mode 100644 index 000000000..40082a4b9 --- /dev/null +++ b/go/res/values-km-rKH/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"ប៉ះ ហើយចុចឲ្យជាប់ដើម្បីរើសផ្លូវកាត់មួយ។"</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"ប៉ះពីរដង ហើយចុចឱ្យជាប់ដើម្បីរើសផ្លូវកាត់មួយ ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។"</string> + <string name="widget_button_text" msgid="4221900832360456858">"ផ្លូវកាត់"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"ផ្លូវកាត់សម្រាប់ <xliff:g id="NAME">%1$s</xliff:g>"</string> +</resources> diff --git a/go/res/values-kn-rIN/strings.xml b/go/res/values-kn-rIN/strings.xml new file mode 100644 index 000000000..9c121fd29 --- /dev/null +++ b/go/res/values-kn-rIN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಶಾರ್ಟ್ಕಟ್ ಆರಿಸಲು ಹೋಲ್ಡ್ ಮಾಡಿ."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಶಾರ್ಟ್ಕಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ."</string> + <string name="widget_button_text" msgid="4221900832360456858">"ಶಾರ್ಟ್ಕಟ್ಗಳು"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> ಶಾರ್ಟ್ಕಟ್ಗಳು"</string> +</resources> diff --git a/go/res/values-ky-rKG/strings.xml b/go/res/values-ky-rKG/strings.xml new file mode 100644 index 000000000..4c7e973ce --- /dev/null +++ b/go/res/values-ky-rKG/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Кыска жолду тандоо үчүн басып туруңуз."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Кыска жолду тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Кыска жолдор"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> кыска жол"</string> +</resources> diff --git a/go/res/values-lo-rLA/strings.xml b/go/res/values-lo-rLA/strings.xml new file mode 100644 index 000000000..7864884ac --- /dev/null +++ b/go/res/values-lo-rLA/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"ແຕະຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"ແຕະສອງເທື່ອຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ ຫຼື ໃຊ້ຄຳສັ່ງແບບກຳນົດເອງ."</string> + <string name="widget_button_text" msgid="4221900832360456858">"ປຸ່ມລັດ"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"ປຸ່ມລັດ <xliff:g id="NAME">%1$s</xliff:g>"</string> +</resources> diff --git a/go/res/values-mk-rMK/strings.xml b/go/res/values-mk-rMK/strings.xml new file mode 100644 index 000000000..52d66b5e2 --- /dev/null +++ b/go/res/values-mk-rMK/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Допрете двапати и задржете за да изберете кратенка."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Допрете двапати и задржете за да изберете кратенка или да користите приспособени дејства."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Кратенки"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"Кратенки за <xliff:g id="NAME">%1$s</xliff:g>"</string> +</resources> diff --git a/go/res/values-ml-rIN/strings.xml b/go/res/values-ml-rIN/strings.xml new file mode 100644 index 000000000..b3c12e16e --- /dev/null +++ b/go/res/values-ml-rIN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"ഒരു കുറുക്കുവഴി ചേർക്കുന്നതിന് അത് സ്പർശിച്ച് പിടിക്കുക."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"ഒരു കുറുക്കുവഴി തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക."</string> + <string name="widget_button_text" msgid="4221900832360456858">"കുറുക്കുവഴികൾ"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> കുറുക്കുവഴികൾ"</string> +</resources> diff --git a/go/res/values-mn-rMN/strings.xml b/go/res/values-mn-rMN/strings.xml new file mode 100644 index 000000000..c89dfd1bd --- /dev/null +++ b/go/res/values-mn-rMN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Товчлол авах бол удаан дарна уу."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Товчлол авах болон тохируулсан үйлдлийг ашиглахын тулд хоёр товшоод хүлээнэ үү."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Товчлол"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g>-н товчлол"</string> +</resources> diff --git a/go/res/values-mr-rIN/strings.xml b/go/res/values-mr-rIN/strings.xml new file mode 100644 index 000000000..2c767b4f1 --- /dev/null +++ b/go/res/values-mr-rIN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"शॉर्टकट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"शॉर्टकट निवडण्यासाठी किंवा कस्टम क्रिया वापरण्यासाठी दोनदा टॅप करा आणि धरून ठेवा."</string> + <string name="widget_button_text" msgid="4221900832360456858">"शॉर्टकट"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> शॉर्टकट"</string> +</resources> diff --git a/go/res/values-ms-rMY/strings.xml b/go/res/values-ms-rMY/strings.xml new file mode 100644 index 000000000..42add9a19 --- /dev/null +++ b/go/res/values-ms-rMY/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Sentuh & tahan untuk mengambil pintasan."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Ketik dua kali & tahan untuk mengambil pintasan atau menggunakan tindakan tersuai."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Pintasan"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"Pintasan <xliff:g id="NAME">%1$s</xliff:g>"</string> +</resources> diff --git a/go/res/values-my-rMM/strings.xml b/go/res/values-my-rMM/strings.xml new file mode 100644 index 000000000..5784df63b --- /dev/null +++ b/go/res/values-my-rMM/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"လက်ကွက်ဖြတ်လမ်းတစ်ခုကို ရွေးရန် ထိပြီး ဖိထားပါ"</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"လက်ကွက်ဖြတ်လမ်းကို ရွေးရန် (သို့) စိတ်ကြိုက်လုပ်ဆောင်ချက်များကို သုံးရန်နှစ်ချက်တို့ပြီး ဖိထားပါ။"</string> + <string name="widget_button_text" msgid="4221900832360456858">"ဖြတ်လမ်းလင့်ခ်များ"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> ဖြတ်လမ်းလင့်ခ်များ"</string> +</resources> diff --git a/go/res/values-ne-rNP/strings.xml b/go/res/values-ne-rNP/strings.xml new file mode 100644 index 000000000..0be0375f3 --- /dev/null +++ b/go/res/values-ne-rNP/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"कुनै सटकर्ट छनौट गर्न छोइराख्नुहोस्।"</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"कुनै सर्टकट छनौट गर्न दुईपटक ट्याप गरेर होल्ड गर्नुहोस् वा रोजेका कारबाहीहरू प्रयोग गर्नुहोस्।"</string> + <string name="widget_button_text" msgid="4221900832360456858">"सर्टकटहरू"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> सर्टकटहरू"</string> +</resources> diff --git a/go/res/values-or/strings.xml b/go/res/values-or/strings.xml new file mode 100644 index 000000000..3ec8a7203 --- /dev/null +++ b/go/res/values-or/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ଦାବି ଧରନ୍ତୁ।"</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"ଡବଲ୍-ଟାପ୍ କରନ୍ତୁ ଏବଂ ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ଧରି ରଖନ୍ତୁ କିମ୍ୱା କଷ୍ଟମ୍ ପ୍ରକ୍ରିୟା ବ୍ୟବହାର କରନ୍ତୁ।"</string> + <string name="widget_button_text" msgid="4221900832360456858">"ଶର୍ଟକଟ୍"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g>ର ଶର୍ଟକଟ୍"</string> +</resources> diff --git a/go/res/values-pa-rIN/strings.xml b/go/res/values-pa-rIN/strings.xml new file mode 100644 index 000000000..c7e4abf3a --- /dev/null +++ b/go/res/values-pa-rIN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਚੁਣਨ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।"</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਚੁਣਨ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ ਜਾਂ ਵਿਉਂਂਤੀ ਕਾਰਵਾਈਆਂ ਵਰਤੋ।"</string> + <string name="widget_button_text" msgid="4221900832360456858">"ਸ਼ਾਰਟਕੱਟ"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> ਸ਼ਾਰਟਕੱਟ"</string> +</resources> diff --git a/go/res/values-si-rLK/strings.xml b/go/res/values-si-rLK/strings.xml new file mode 100644 index 000000000..4b25c90b0 --- /dev/null +++ b/go/res/values-si-rLK/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"කෙටි මගක් තෝරා ගැනීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"විජට් එකක් තෝරා ගැනීමට හෝ අභිරුචි භාවිත කිරීමට දෙවරක් තට්ටු කර අල්ලා ගෙන සිටින්න."</string> + <string name="widget_button_text" msgid="4221900832360456858">"කෙටි මං"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"කෙටි මං <xliff:g id="NAME">%1$s</xliff:g>"</string> +</resources> diff --git a/go/res/values-sq-rAL/strings.xml b/go/res/values-sq-rAL/strings.xml new file mode 100644 index 000000000..bb74db6b5 --- /dev/null +++ b/go/res/values-sq-rAL/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Prek dhe mbaj prekur për të zgjedhur një shkurtore."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Prek dy herë dhe mbaj prekur për të zgjedhur një shkurtore ose për të përdorur veprimet e personalizuara."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Shkurtoret"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> shkurtore"</string> +</resources> diff --git a/go/res/values-ta-rIN/strings.xml b/go/res/values-ta-rIN/strings.xml new file mode 100644 index 000000000..50059b65f --- /dev/null +++ b/go/res/values-ta-rIN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"குறுக்குவழியைச் சேர்க்க, தொட்டு பிடித்திருக்கவும்."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"குறுக்குவழியை சேர்க்க, இருமுறை தட்டிப் பிடித்திருக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்."</string> + <string name="widget_button_text" msgid="4221900832360456858">"குறுக்குவழிகள்"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> குறுக்குவழிகள்"</string> +</resources> diff --git a/go/res/values-te-rIN/strings.xml b/go/res/values-te-rIN/strings.xml new file mode 100644 index 000000000..0bdf74334 --- /dev/null +++ b/go/res/values-te-rIN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"సత్వరమార్గాన్ని ఎంచుకోవడానికి తాకి & నొక్కి ఉంచండి."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"సత్వరమార్గాన్ని ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి &ఉంచండి."</string> + <string name="widget_button_text" msgid="4221900832360456858">"సత్వరమార్గాలు"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> సత్వరమార్గాలు"</string> +</resources> diff --git a/go/res/values-ur-rPK/strings.xml b/go/res/values-ur-rPK/strings.xml new file mode 100644 index 000000000..46bd823d8 --- /dev/null +++ b/go/res/values-ur-rPK/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"کوئی شارٹ کٹ منتخب کرنے کیلئے ٹچ کریں اور دبائے رکھیں۔"</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"کوئی شارٹ کٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور دبائے رکھیں۔"</string> + <string name="widget_button_text" msgid="4221900832360456858">"شارٹ کٹس"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> شارٹ کٹس"</string> +</resources> diff --git a/go/res/values-uz-rUZ/strings.xml b/go/res/values-uz-rUZ/strings.xml new file mode 100644 index 000000000..318bc1572 --- /dev/null +++ b/go/res/values-uz-rUZ/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="long_press_widget_to_add" msgid="4001616142797446267">"Yorliqni tanlab olish uchun bosib turing."</string> + <string name="long_accessible_way_to_add" msgid="2725225828389948328">"Ikki marta bosib va bosib turgan holatda yorliqni tanlang yoki maxsus amaldan foydalaning."</string> + <string name="widget_button_text" msgid="4221900832360456858">"Yorliqlar"</string> + <string name="widgets_bottom_sheet_title" msgid="3949835990909395998">"<xliff:g id="NAME">%1$s</xliff:g> ilovasi yorliqlari"</string> +</resources> diff --git a/protos/launcher_log.proto b/protos/launcher_log.proto index 4013429b1..cab20a3be 100644 --- a/protos/launcher_log.proto +++ b/protos/launcher_log.proto @@ -55,6 +55,7 @@ message Target { optional int32 span_y = 14 [default = 1];// Used for ItemType.WIDGET optional int32 predictedRank = 15; optional TargetExtension extension = 16; + optional TipType tip_type = 17; } // Used to define what type of item a Target would represent. @@ -88,6 +89,8 @@ enum ContainerType { NAVBAR = 11; TASKSWITCHER = 12; // Recents UI Container (QuickStep) APP = 13; // Foreground activity is another app (QuickStep) + TIP = 14; // Onboarding texts (QuickStep) + SIDELOADED_LAUNCHER = 15; } // Used to define what type of control a Target would represent. @@ -104,8 +107,17 @@ enum ControlType { VERTICAL_SCROLL = 9; HOME_INTENT = 10; // Deprecated, use enum Command instead BACK_BUTTON = 11; // Deprecated, use enum Command instead - // GO_TO_PLAYSTORE QUICK_SCRUB_BUTTON = 12; + CLEAR_ALL_BUTTON = 13; + CANCEL_TARGET = 14; +} + +enum TipType { + DEFAULT_NONE = 0; + BOUNCE = 1; + SWIPE_UP_TEXT = 2; + QUICK_SCRUB_TEXT = 3; + PREDICTION_TEXT = 4; } // Used to define the action component of the LauncherEvent. @@ -114,8 +126,10 @@ message Action { TOUCH = 0; AUTOMATED = 1; COMMAND = 2; + TIP = 3; // SOFT_KEYBOARD, HARD_KEYBOARD, ASSIST } + enum Touch { TAP = 0; LONGPRESS = 1; @@ -124,7 +138,8 @@ message Action { FLING = 4; PINCH = 5; } - enum Direction { + + enum Direction { NONE = 0; UP = 1; DOWN = 2; @@ -134,11 +149,13 @@ message Action { enum Command { HOME_INTENT = 0; BACK = 1; - ENTRY = 2; // Indicates entry to one of Launcher container type target - // not using the HOME_INTENT - CANCEL = 3; // Indicates that a confirmation screen was cancelled - CONFIRM = 4; // Indicates thata confirmation screen was accepted - STOP = 5; // Indicates onStop() was called (screen time out, power off) + ENTRY = 2; // Indicates entry to one of Launcher container type target + // not using the HOME_INTENT + CANCEL = 3; // Indicates that a confirmation screen was cancelled + CONFIRM = 4; // Indicates thata confirmation screen was accepted + STOP = 5; // Indicates onStop() was called (screen time out, power off) + RECENTS_BUTTON = 6; // Indicates that Recents button was pressed + RESUME = 7; // Indicates onResume() was called } optional Type type = 1; diff --git a/quickstep/AndroidManifest.xml b/quickstep/AndroidManifest.xml index f62d1d6ed..778866d5e 100644 --- a/quickstep/AndroidManifest.xml +++ b/quickstep/AndroidManifest.xml @@ -19,10 +19,10 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" package="com.android.launcher3" > - <uses-sdk android:targetSdkVersion="23" android:minSdkVersion="21"/> - + <uses-sdk android:targetSdkVersion="28" android:minSdkVersion="28"/> <uses-permission android:name="android.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS" /> <application android:backupAgent="com.android.launcher3.LauncherBackupAgent" @@ -54,7 +54,7 @@ android:stateNotNeeded="true" android:theme="@style/LauncherTheme" android:screenOrientation="unspecified" - android:configChanges="keyboard|keyboardHidden|navigation|orientation|screenSize|screenLayout|smallestScreenSize" + android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize" android:resizeableActivity="true" android:resumeWhilePausing="true" android:taskAffinity="" /> @@ -71,6 +71,12 @@ <action android:name="android.content.action.SEARCH_INDEXABLES_PROVIDER" /> </intent-filter> </provider> + + + <service + android:name="com.android.launcher3.uioverrides.dynamicui.WallpaperManagerCompatVL$ColorExtractionService" + tools:node="remove" /> + </application> </manifest> diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar Binary files differindex cebeea2b4..53a6ceb4d 100644 --- a/quickstep/libs/sysui_shared.jar +++ b/quickstep/libs/sysui_shared.jar diff --git a/quickstep/res/layout/fallback_recents_activity.xml b/quickstep/res/layout/fallback_recents_activity.xml index 22f8b55a2..7ecab3201 100644 --- a/quickstep/res/layout/fallback_recents_activity.xml +++ b/quickstep/res/layout/fallback_recents_activity.xml @@ -20,13 +20,23 @@ android:layout_height="match_parent" android:fitsSystemWindows="true"> - <com.android.quickstep.fallback.FallbackRecentsView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/overview_panel" + <com.android.quickstep.views.RecentsViewContainer + android:id="@+id/overview_panel_container" android:layout_width="match_parent" android:layout_height="match_parent" - android:clipChildren="false" - android:clipToPadding="false" - android:theme="@style/HomeScreenElementTheme" /> + > + <include layout="@layout/overview_clear_all_button"/> -</com.android.quickstep.fallback.RecentsRootView>
\ No newline at end of file + <com.android.quickstep.fallback.FallbackRecentsView + android:id="@id/overview_panel" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clipChildren="false" + android:clipToPadding="false" + android:focusableInTouchMode="true" + android:theme="@style/HomeScreenElementTheme" + > + + </com.android.quickstep.fallback.FallbackRecentsView> + </com.android.quickstep.views.RecentsViewContainer> +</com.android.quickstep.fallback.RecentsRootView> diff --git a/quickstep/res/layout/overview_clear_all_button.xml b/quickstep/res/layout/overview_clear_all_button.xml new file mode 100644 index 000000000..25615e0e2 --- /dev/null +++ b/quickstep/res/layout/overview_clear_all_button.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<com.android.quickstep.views.ClearAllButton + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/clear_all_button" + style="@android:style/Widget.DeviceDefault.Button.Borderless" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="start|top" + android:text="@string/recents_clear_all" + android:textColor="?attr/workspaceTextColor" + android:visibility="invisible" + android:textSize="14sp" + android:importantForAccessibility="no" +/>
\ No newline at end of file diff --git a/quickstep/res/layout/overview_panel.xml b/quickstep/res/layout/overview_panel.xml index 89e057148..919afdb37 100644 --- a/quickstep/res/layout/overview_panel.xml +++ b/quickstep/res/layout/overview_panel.xml @@ -14,14 +14,24 @@ See the License for the specific language governing permissions and limitations under the License. --> -<com.android.quickstep.views.LauncherRecentsView +<com.android.quickstep.views.RecentsViewContainer xmlns:android="http://schemas.android.com/apk/res/android" - android:theme="@style/HomeScreenElementTheme" android:layout_width="match_parent" android:layout_height="match_parent" - android:clipChildren="false" - android:clipToPadding="false" android:visibility="invisible" - android:focusableInTouchMode="true" > +> + <include layout="@layout/overview_clear_all_button"/> -</com.android.quickstep.views.LauncherRecentsView>
\ No newline at end of file + <com.android.quickstep.views.LauncherRecentsView + android:id="@id/overview_panel" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clipChildren="false" + android:clipToPadding="false" + android:focusableInTouchMode="true" + android:accessibilityPaneTitle="@string/accessibility_recent_apps" + android:theme="@style/HomeScreenElementTheme" + > + + </com.android.quickstep.views.LauncherRecentsView> +</com.android.quickstep.views.RecentsViewContainer>
\ No newline at end of file diff --git a/res/layout/drag_handle_indicator.xml b/quickstep/res/layout/scrim_view.xml index d5a7b8a03..2cc37f9cc 100644 --- a/res/layout/drag_handle_indicator.xml +++ b/quickstep/res/layout/scrim_view.xml @@ -13,11 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. --> -<com.android.launcher3.views.LauncherDragIndicator +<com.android.quickstep.views.ShelfScrimView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/drag_indicator" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:contentDescription="@string/all_apps_button_label" - android:scaleType="centerInside" - android:tint="?attr/workspaceTextColor" /> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:id="@+id/scrim_view" />
\ No newline at end of file diff --git a/quickstep/res/layout/task.xml b/quickstep/res/layout/task.xml index b8b360a48..429f3a28e 100644 --- a/quickstep/res/layout/task.xml +++ b/quickstep/res/layout/task.xml @@ -24,7 +24,7 @@ android:layout_height="match_parent" android:layout_marginTop="@dimen/task_thumbnail_top_margin" /> - <ImageView + <com.android.quickstep.views.IconView android:id="@+id/icon" android:layout_width="@dimen/task_thumbnail_icon_size" android:layout_height="@dimen/task_thumbnail_icon_size" diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index fa8f9dc58..b33456d31 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Verdeelde skerm"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Speld vas"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Swiep van onder af op om programme te wissel"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Oorsig"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Geen onlangse items nie"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Maak toe"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Vee alles uit"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml index d14e06c9e..2f303c078 100644 --- a/quickstep/res/values-am/strings.xml +++ b/quickstep/res/values-am/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"የተከፈለ ማያ ገጽ"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"ሰካ"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"መተግበሪያዎችን ለመቀያየር ከግርጌ ወደ ላይ በጣት ጠረግ ያድርጉ"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ማጠቃለያ"</string> <string name="recents_empty_message" msgid="7040467240571714191">"ምንም የቅርብ ጊዜ ንጥሎች የሉም"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"ዝጋ"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ሁሉንም አጽዳ"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index 8efffd26d..e22bef47e 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"تقسيم الشاشة"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"تثبيت"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"التمرير سريعًا لأعلى من أسفل للتبديل بين التطبيقات"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"نظرة عامة"</string> <string name="recents_empty_message" msgid="7040467240571714191">"ليست هناك عناصر تم استخدامها مؤخرًا"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"إغلاق"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"محو الكل"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml new file mode 100644 index 000000000..7294f142d --- /dev/null +++ b/quickstep/res/values-as/strings.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"বিভাজিত স্ক্ৰীণ"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"পিন"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"অৱলোকন"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"কোনো শেহতীয়া বস্তু নাই"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"বন্ধ কৰক"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"সকলো মচক"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> + <skip /> +</resources> diff --git a/quickstep/res/values-az-rAZ/strings.xml b/quickstep/res/values-az-rAZ/strings.xml new file mode 100644 index 000000000..0546f4650 --- /dev/null +++ b/quickstep/res/values-az-rAZ/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Bölünmüş ekran"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Sancın"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"İcmal"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Son elementlər yoxdur"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Bağlayın"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Hamısını silin"</string> +</resources> diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml index a832f9aa0..4c2f8ec71 100644 --- a/quickstep/res/values-az/strings.xml +++ b/quickstep/res/values-az/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Bölünmüş ekran"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Sancın"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Tətbiqləri dəyişmək üçün aşağıdan yuxarı doğru sürüşdürün"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"İcmal"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Son elementlər yoxdur"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Bağlayın"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Hamısını silin"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml index ba44830be..bf66aef80 100644 --- a/quickstep/res/values-b+sr+Latn/strings.xml +++ b/quickstep/res/values-b+sr+Latn/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Podeljeni ekran"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Zakači"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Prevucite nagore da biste prešli na drugu aplikaciju"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Pregled"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Nema nedavnih stavki"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Zatvori"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Obriši sve"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-be-rBY/strings.xml b/quickstep/res/values-be-rBY/strings.xml new file mode 100644 index 000000000..1e60dd36f --- /dev/null +++ b/quickstep/res/values-be-rBY/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Падзяліць экран"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Замацаваць"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Агляд"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Няма новых элементаў"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Закрыць"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Ачысціць усё"</string> +</resources> diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml index df55803af..48ed4c579 100644 --- a/quickstep/res/values-be/strings.xml +++ b/quickstep/res/values-be/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Падзяліць экран"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Замацаваць"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Для пераключэння праграм правядзіце па экране пальцам знізу ўверх"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Агляд"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Няма новых элементаў"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Закрыць"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Ачысціць усё"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml index c46245c83..30308ad0c 100644 --- a/quickstep/res/values-bg/strings.xml +++ b/quickstep/res/values-bg/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Разделен екран"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Фиксиране"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Прекарайте пръст нагоре от долната част, за да превключите между приложенията"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Общ преглед"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Няма скорошни елементи"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Затваряне"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Изчистване на всички"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-bn-rBD/strings.xml b/quickstep/res/values-bn-rBD/strings.xml new file mode 100644 index 000000000..a0605d831 --- /dev/null +++ b/quickstep/res/values-bn-rBD/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"স্ক্রিন স্প্লিট করুন"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"পিন করুন"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"এক নজরে"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"কোনো সাম্প্রতিক আইটেম নেই"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"বন্ধ করুন"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"সবকিছু খালি করুন"</string> +</resources> diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml index 908007231..80eb63905 100644 --- a/quickstep/res/values-bn/strings.xml +++ b/quickstep/res/values-bn/strings.xml @@ -21,11 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"স্ক্রিন স্প্লিট করুন"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"পিন করুন"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"অ্যাপগুলির মধ্যে সুইচ করতে উপর থেকে নিচের দিকে সোয়াইপ করুন"</string> - <!-- no translation found for accessibility_desc_recent_apps (1444379410873162882) --> - <skip /> - <!-- no translation found for recents_empty_message (7040467240571714191) --> - <skip /> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"এক নজরে"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"কোনো সাম্প্রতিক আইটেম নেই"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"বন্ধ করুন"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"সবকিছু খালি করুন"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-bs-rBA/strings.xml b/quickstep/res/values-bs-rBA/strings.xml new file mode 100644 index 000000000..9ffa84806 --- /dev/null +++ b/quickstep/res/values-bs-rBA/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Način rada podijeljenog ekrana"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Zakači"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Pregled"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Nema nedavnih stavki"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Zatvaranje"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Obriši sve"</string> +</resources> diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index 7e61277d5..201f46144 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Način rada podijeljenog ekrana"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Zakači"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Prevucite od dolje prema gore za promjenu aplikacije"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Pregled"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Nema nedavnih stavki"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Zatvaranje"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Obriši sve"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml index ac7799213..c6b93e371 100644 --- a/quickstep/res/values-ca/strings.xml +++ b/quickstep/res/values-ca/strings.xml @@ -21,11 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Divideix la pantalla"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fixa"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Llisca cap amunt des de la part inferior per canviar d\'aplicació"</string> - <!-- no translation found for accessibility_desc_recent_apps (1444379410873162882) --> - <skip /> - <!-- no translation found for recents_empty_message (7040467240571714191) --> - <skip /> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Aplicacions recents"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"No hi ha cap element recent"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Tanca"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Esborra-ho tot"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml index e8c0cb055..023244c55 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Rozdělená obrazovka"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"PIN"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Aplikace můžete přepínat přejetím zdola nahoru"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Přehled"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Žádné nedávné položky"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Zavřít"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Vymazat vše"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index 6ddb31b36..5d1e76373 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Delt skærm"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fastgør"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Stryg opad fra bunden for at skifte apps"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Oversigt"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Ingen nye elementer"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Luk"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Ryd alt"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index 01c785e60..cf2f1940a 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Bildschirm teilen"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fixieren"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Zum Wechseln zwischen Apps vom unteren Bildschirmrand nach oben wischen"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Übersicht"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Keine kürzlich verwendeten Elemente"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Schließen"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Alle Apps schließen"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index 6b2a25f90..9cf05763d 100644 --- a/quickstep/res/values-el/strings.xml +++ b/quickstep/res/values-el/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Διαχωρισμός οθόνης"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Καρφίτσωμα"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Σύρετε από κάτω προς τα επάνω για εναλλαγή εφαρμογών"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Επισκόπηση"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Δεν υπάρχουν πρόσφατα στοιχεία"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Κλείσιμο"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Διαγραφή όλων"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml index 402499e65..61d031b5d 100644 --- a/quickstep/res/values-en-rAU/strings.xml +++ b/quickstep/res/values-en-rAU/strings.xml @@ -21,9 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Split screen"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Pin"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Swipe up from the bottom to switch apps"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Overview"</string> <string name="recents_empty_message" msgid="7040467240571714191">"No recent items"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> - <skip /> + <string name="accessibility_close_task" msgid="5354563209433803643">"Close"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Clear all"</string> </resources> diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml index 402499e65..61d031b5d 100644 --- a/quickstep/res/values-en-rGB/strings.xml +++ b/quickstep/res/values-en-rGB/strings.xml @@ -21,9 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Split screen"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Pin"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Swipe up from the bottom to switch apps"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Overview"</string> <string name="recents_empty_message" msgid="7040467240571714191">"No recent items"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> - <skip /> + <string name="accessibility_close_task" msgid="5354563209433803643">"Close"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Clear all"</string> </resources> diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml index 402499e65..61d031b5d 100644 --- a/quickstep/res/values-en-rIN/strings.xml +++ b/quickstep/res/values-en-rIN/strings.xml @@ -21,9 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Split screen"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Pin"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Swipe up from the bottom to switch apps"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Overview"</string> <string name="recents_empty_message" msgid="7040467240571714191">"No recent items"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> - <skip /> + <string name="accessibility_close_task" msgid="5354563209433803643">"Close"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Clear all"</string> </resources> diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml index 1b9f926db..320892aba 100644 --- a/quickstep/res/values-es-rUS/strings.xml +++ b/quickstep/res/values-es-rUS/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Pantalla dividida"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fijar"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Desliza el dedo hacia arriba para cambiar de app"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Recientes"</string> <string name="recents_empty_message" msgid="7040467240571714191">"No hay elementos recientes"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Cerrar"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Borrar todo"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml index c63f1d3ea..abccec881 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Dividir pantalla"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fijar"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Desliza el dedo hacia arriba desde la parte inferior para cambiar de aplicación"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Aplicaciones recientes"</string> <string name="recents_empty_message" msgid="7040467240571714191">"No hay elementos recientes"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Cerrar"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Borrar todo"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-et-rEE/strings.xml b/quickstep/res/values-et-rEE/strings.xml new file mode 100644 index 000000000..efa68f9c4 --- /dev/null +++ b/quickstep/res/values-et-rEE/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Jagatud ekraan"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Kinnita"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Ülevaade"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Hiljutisi üksusi pole"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Sule"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Sule kõik"</string> +</resources> diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml index 30199b91c..5143406ce 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Jagatud ekraan"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Kinnita"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Rakenduste vahetamiseks pühkige alaosast üles"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Ülevaade"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Hiljutisi üksusi pole"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Sule"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Sule kõik"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-eu-rES/strings.xml b/quickstep/res/values-eu-rES/strings.xml new file mode 100644 index 000000000..d22242efa --- /dev/null +++ b/quickstep/res/values-eu-rES/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Zatitu pantaila"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Ainguratu"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Ikuspegi orokorra"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Ez dago azkenaldi honetako ezer"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Itxi"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Garbitu guztiak"</string> +</resources> diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index b6386cd48..879aa28ce 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Zatitu pantaila"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Ainguratu"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Aplikazioak aldatzeko, pasatu hatza pantailako behealdetik gora"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Ikuspegi orokorra"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Ez dago azkenaldi honetako ezer"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Itxi"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Garbitu guztiak"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml index 52beadd79..b76e9a565 100644 --- a/quickstep/res/values-fa/strings.xml +++ b/quickstep/res/values-fa/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"تقسیم صفحه"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"پین"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"برای تغییر برنامهها، از پایین تند به بالا بکشید"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"نمای کلی"</string> <string name="recents_empty_message" msgid="7040467240571714191">"بدون موارد اخیر"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"بستن"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"پاک کردن همه"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml index a27a9cb49..bbfaa11e1 100644 --- a/quickstep/res/values-fi/strings.xml +++ b/quickstep/res/values-fi/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Jaettu näyttö"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Kiinnitä"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Vaihda sovellusta pyyhkäisemällä alareunasta ylös."</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Viimeisimmät"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Ei viimeaikaisia kohteita"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Sulje"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Poista kaikki"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml index 8a603e98e..7cad9fca9 100644 --- a/quickstep/res/values-fr-rCA/strings.xml +++ b/quickstep/res/values-fr-rCA/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Écran divisé"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Épingler"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Balayez l\'écran du bas vers le haut pour changer d\'application"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Aperçu"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Aucun élément récent"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Fermer"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Tout effacer"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index 91922872c..078ab2b5c 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Écran partagé"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Épingler"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Balayer l\'écran de bas en haut pour changer d\'application"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Aperçu"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Aucun élément récent"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Fermer"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Tout effacer"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-gl-rES/strings.xml b/quickstep/res/values-gl-rES/strings.xml new file mode 100644 index 000000000..8efc773f4 --- /dev/null +++ b/quickstep/res/values-gl-rES/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Pantalla dividida"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Fixar"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Visión xeral"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Non hai elementos recentes"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Pecha a aplicación"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Borrar todo"</string> +</resources> diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index 25d3796b4..549d80477 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Pantalla dividida"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fixar"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Pasa o dedo cara arriba desde a parte inferior para cambiar de aplicacións"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Visión xeral"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Non hai elementos recentes"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Pecha a aplicación"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Borrar todo"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-gu-rIN/strings.xml b/quickstep/res/values-gu-rIN/strings.xml new file mode 100644 index 000000000..cdae86feb --- /dev/null +++ b/quickstep/res/values-gu-rIN/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"સ્ક્રીનને વિભાજિત કરો"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"પિન કરો"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ઝલક"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"તાજેતરની કોઈ આઇટમ નથી"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"બંધ કરો"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"બધું સાફ કરો"</string> +</resources> diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index f463e130c..27235f2bc 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -21,11 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"સ્ક્રીનને વિભાજિત કરો"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"પિન કરો"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"ઍપને સ્વિચ કરવા માટે નીચેથી ઉપર સ્વાઇપ કરો"</string> - <!-- no translation found for accessibility_desc_recent_apps (1444379410873162882) --> - <skip /> - <!-- no translation found for recents_empty_message (7040467240571714191) --> - <skip /> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ઝલક"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"તાજેતરની કોઈ આઇટમ નથી"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"બંધ કરો"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"બધું સાફ કરો"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml index ee933d1bd..46b404f52 100644 --- a/quickstep/res/values-hi/strings.xml +++ b/quickstep/res/values-hi/strings.xml @@ -21,11 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"स्क्रीन को दो हिस्सों में बाँटना (स्प्लिट स्क्रीन)"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"पिन करना"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"ऐप्लिकेशन स्विच करने के लिए सबसे नीचे से ऊपर की ओर स्वाइप करें"</string> - <!-- no translation found for accessibility_desc_recent_apps (1444379410873162882) --> - <skip /> - <!-- no translation found for recents_empty_message (7040467240571714191) --> - <skip /> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"खास जानकारी"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"हाल ही में इस्तेमाल किया गया कोई ऐप्लिकेशन नहीं है"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"बंद करें"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"सभी ऐप्लिकेशन बंद करें"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml index a0b734f5e..b8682608f 100644 --- a/quickstep/res/values-hr/strings.xml +++ b/quickstep/res/values-hr/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Podijeljeni zaslon"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Prikvači"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Prijeđite prstom od dna prema gore da biste promijenili aplikaciju"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Pregled"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Nema nedavnih stavki"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Zatvori"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Izbriši sve"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml index 8a465e2a3..60cd6a1dd 100644 --- a/quickstep/res/values-hu/strings.xml +++ b/quickstep/res/values-hu/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Osztott képernyő"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Rögzítés"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Ha váltani szeretne az alkalmazások között, csúsztassa gyorsan az ujját a képernyő aljától felfelé"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Áttekintés"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Nincsenek mostanában használt elemek"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Bezárás"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Összes törlése"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-hy-rAM/strings.xml b/quickstep/res/values-hy-rAM/strings.xml new file mode 100644 index 000000000..4afae7de7 --- /dev/null +++ b/quickstep/res/values-hy-rAM/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Տրոհել էկրանը"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Ամրացնել"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Ընդհանուր տեղեկություններ"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Վերջին տարրեր չկան"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Փակել"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Փակել բոլորը"</string> +</resources> diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml index fdfe81895..c908263b6 100644 --- a/quickstep/res/values-hy/strings.xml +++ b/quickstep/res/values-hy/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Տրոհել էկրանը"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Ամրացնել"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Սահեցրեք ներքևից վերև՝ մյուս հավելվածին անցնելու համար"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Ընդհանուր տեղեկություններ"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Վերջին տարրեր չկան"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Փակել"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Փակել բոլորը"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml index 786a10ccd..ff6267c9b 100644 --- a/quickstep/res/values-in/strings.xml +++ b/quickstep/res/values-in/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Layar terpisah"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Pasang pin"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Geser dari bawah ke atas untuk beralih aplikasi"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Ringkasan"</string> - <string name="recents_empty_message" msgid="7040467240571714191">"Tidak ada item baru-baru ini"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="recents_empty_message" msgid="7040467240571714191">"Tidak ada item yang baru dibuka"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Tutup"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Hapus semua"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-is-rIS/strings.xml b/quickstep/res/values-is-rIS/strings.xml new file mode 100644 index 000000000..88a92ed96 --- /dev/null +++ b/quickstep/res/values-is-rIS/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Skipta skjá"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Festa"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Yfirlit"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Engin nýleg atriði"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Loka"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Hreinsa allt"</string> +</resources> diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml index b01a74924..bbb460729 100644 --- a/quickstep/res/values-is/strings.xml +++ b/quickstep/res/values-is/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Skipta skjá"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Festa"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Strjúktu upp til að skipta um forrit"</string> - <!-- no translation found for accessibility_desc_recent_apps (1444379410873162882) --> - <skip /> - <!-- no translation found for recents_empty_message (7040467240571714191) --> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Yfirlit"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Engin nýleg atriði"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Loka"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Hreinsa allt"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml index 0da2251be..6175a4720 100644 --- a/quickstep/res/values-it/strings.xml +++ b/quickstep/res/values-it/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Schermo diviso"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Blocca"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Scorri verso l\'alto dalla parte inferiore per cambiare app"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Panoramica"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Nessun elemento recente"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Chiudi"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Cancella tutto"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index f7e833878..9afb842e3 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"מסך מפוצל"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"הצמדה"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"יש להחליק כלפי מעלה מהחלק התחתון כדי לעבור בין אפליקציות"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"מסכים אחרונים"</string> <string name="recents_empty_message" msgid="7040467240571714191">"אין פריטים אחרונים"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"סגירה"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ניקוי הכול"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml index 7e14d2c68..e478d4acc 100644 --- a/quickstep/res/values-ja/strings.xml +++ b/quickstep/res/values-ja/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"分割画面"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"固定"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"アプリを切り替えるには、下から上にスワイプします"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"概要"</string> <string name="recents_empty_message" msgid="7040467240571714191">"最近のアイテムはありません"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"閉じる"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"すべてクリア"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ka-rGE/strings.xml b/quickstep/res/values-ka-rGE/strings.xml new file mode 100644 index 000000000..6de8ed922 --- /dev/null +++ b/quickstep/res/values-ka-rGE/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"ეკრანის გაყოფა"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"ჩამაგრება"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"მიმოხილვა"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"ბოლოს გამოყენებული ერთეულები არ არის"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"დახურვა"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ყველას გასუფთავება"</string> +</resources> diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml index cf4c661d3..3d9726c79 100644 --- a/quickstep/res/values-ka/strings.xml +++ b/quickstep/res/values-ka/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"ეკრანის გაყოფა"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"ჩამაგრება"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"აპების გადასართავად გადაფურცლეთ ქვედა კიდედან ზემოთ"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"მიმოხილვა"</string> <string name="recents_empty_message" msgid="7040467240571714191">"ბოლოს გამოყენებული ერთეულები არ არის"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"დახურვა"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ყველას გასუფთავება"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-kk-rKZ/strings.xml b/quickstep/res/values-kk-rKZ/strings.xml new file mode 100644 index 000000000..ddd4a7719 --- /dev/null +++ b/quickstep/res/values-kk-rKZ/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Экранды бөлу"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Бекіту"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Шолу"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Соңғы элементтер жоқ"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Жабу"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Барлығын өшіру"</string> +</resources> diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml index f865a0405..80cab46bb 100644 --- a/quickstep/res/values-kk/strings.xml +++ b/quickstep/res/values-kk/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Экранды бөлу"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Бекіту"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Қолданбалар арасында ауысу үшін төменнен жоғары қарай саусақпен сырғытыңыз"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Шолу"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Соңғы элементтер жоқ"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Жабу"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Барлығын өшіру"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-km-rKH/strings.xml b/quickstep/res/values-km-rKH/strings.xml new file mode 100644 index 000000000..65c1dccee --- /dev/null +++ b/quickstep/res/values-km-rKH/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"មុខងារបំបែកអេក្រង់"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"ដៅ"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ទិដ្ឋភាពរួម"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"មិនមានធាតុថ្មីៗទេ"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"បិទ"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"សម្អាតទាំងអស់"</string> +</resources> diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml index a35ab26aa..36a9ad98d 100644 --- a/quickstep/res/values-km/strings.xml +++ b/quickstep/res/values-km/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"មុខងារបំបែកអេក្រង់"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"ដៅ"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"អូសពីក្រោមឡើងលើ ដើម្បីប្ដូរកម្មវិធី"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ទិដ្ឋភាពរួម"</string> <string name="recents_empty_message" msgid="7040467240571714191">"មិនមានធាតុថ្មីៗទេ"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"បិទ"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"សម្អាតទាំងអស់"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-kn-rIN/strings.xml b/quickstep/res/values-kn-rIN/strings.xml new file mode 100644 index 000000000..55ccbb026 --- /dev/null +++ b/quickstep/res/values-kn-rIN/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"ಪರದೆಯನ್ನು ಬೇರ್ಪಡಿಸಿ"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"ಪಿನ್ ಮಾಡಿ"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ಅವಲೋಕನ"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"ಮುಚ್ಚಿ"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string> +</resources> diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml index dc57df1d3..314638cab 100644 --- a/quickstep/res/values-kn/strings.xml +++ b/quickstep/res/values-kn/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"ಪರದೆಯನ್ನು ಬೇರ್ಪಡಿಸಿ"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"ಪಿನ್ ಮಾಡಿ"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬದಲಿಸಲು ಕೆಳಗಿನಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ಅವಲೋಕನ"</string> <string name="recents_empty_message" msgid="7040467240571714191">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"ಮುಚ್ಚಿ"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml index 36fd122d7..557ee4a01 100644 --- a/quickstep/res/values-ko/strings.xml +++ b/quickstep/res/values-ko/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"화면 분할"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"고정"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"아래에서 위로 스와이프하여 앱을 전환합니다."</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"최근 사용"</string> <string name="recents_empty_message" msgid="7040467240571714191">"최근 항목이 없습니다."</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"닫기"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"모두 삭제"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ky-rKG/strings.xml b/quickstep/res/values-ky-rKG/strings.xml new file mode 100644 index 000000000..b78869382 --- /dev/null +++ b/quickstep/res/values-ky-rKG/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Экранды бөлүү"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Кадап коюу"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Сереп салуу"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Акыркы колдонмолор жок"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Жабуу"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Баарын тазалоо"</string> +</resources> diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml index 060a8dd21..1575af650 100644 --- a/quickstep/res/values-ky/strings.xml +++ b/quickstep/res/values-ky/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Экранды бөлүү"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Кадап коюу"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Колдонмолорду которуштуруу үчүн экранды төмөндөн жогору карай сүрүңүз"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Сереп салуу"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Акыркы колдонмолор жок"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Жабуу"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Баарын тазалоо"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-lo-rLA/strings.xml b/quickstep/res/values-lo-rLA/strings.xml new file mode 100644 index 000000000..a83743a7e --- /dev/null +++ b/quickstep/res/values-lo-rLA/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"ແບ່ງໜ້າຈໍ"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"ປັກໝຸດ"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ພາບຮວມ"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"ບໍ່ມີລາຍການຫຼ້າສຸດ"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"ປິດ"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ລຶບລ້າງທັງໝົດ"</string> +</resources> diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml index 1abb856d9..3e332be0b 100644 --- a/quickstep/res/values-lo/strings.xml +++ b/quickstep/res/values-lo/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"ແບ່ງໜ້າຈໍ"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"ປັກໝຸດ"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"ປັດຂຶ້ນຈາກລຸ່ມສຸດເພື່ອສະຫຼັບແອັບ"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ພາບຮວມ"</string> <string name="recents_empty_message" msgid="7040467240571714191">"ບໍ່ມີລາຍການຫຼ້າສຸດ"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"ປິດ"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ລຶບລ້າງທັງໝົດ"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml index 0c09a9450..4dd268023 100644 --- a/quickstep/res/values-lt/strings.xml +++ b/quickstep/res/values-lt/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Skaidyti ekraną"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Prisegti"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Perbraukite aukštyn iš apačios, kad perjungtumėte programas"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Apžvalga"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Nėra jokių naujausių elementų"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Uždaryti"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Išvalyti viską"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml index 72d1cb575..7eb385fa8 100644 --- a/quickstep/res/values-lv/strings.xml +++ b/quickstep/res/values-lv/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Sadalīt ekrānu"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Piespraust"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Lai pārslēgtu lietotnes, velciet augšup no apakšdaļas."</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Pārskats"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Nav nesenu vienumu."</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Aizvērt"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Notīrīt visu"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-mk-rMK/strings.xml b/quickstep/res/values-mk-rMK/strings.xml new file mode 100644 index 000000000..e428b4e1f --- /dev/null +++ b/quickstep/res/values-mk-rMK/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Поделен екран"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Прикачување"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Преглед"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Нема неодамнешни ставки"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Затвори"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Исчисти ги сите"</string> +</resources> diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml index 06bf5d0c1..9e959d317 100644 --- a/quickstep/res/values-mk/strings.xml +++ b/quickstep/res/values-mk/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Поделен екран"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Прикачување"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Повлечете нагоре од дното за да ги смените апликациите"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Преглед"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Нема неодамнешни ставки"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Затвори"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Исчисти ги сите"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ml-rIN/strings.xml b/quickstep/res/values-ml-rIN/strings.xml new file mode 100644 index 000000000..4cca447e7 --- /dev/null +++ b/quickstep/res/values-ml-rIN/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"സ്ക്രീൻ വിഭജിക്കുക"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"പിൻ ചെയ്യുക"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"അവലോകനം"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"അവസാനിപ്പിക്കുക"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"എല്ലാം മായ്ക്കുക"</string> +</resources> diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml index b93690656..1d7b927a9 100644 --- a/quickstep/res/values-ml/strings.xml +++ b/quickstep/res/values-ml/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"സ്ക്രീൻ വിഭജിക്കുക"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"പിൻ ചെയ്യുക"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"ആപ്പുകൾ മാറാൻ താഴെ നിന്ന് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"അവലോകനം"</string> <string name="recents_empty_message" msgid="7040467240571714191">"സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"അവസാനിപ്പിക്കുക"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"എല്ലാം മായ്ക്കുക"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-mn-rMN/strings.xml b/quickstep/res/values-mn-rMN/strings.xml new file mode 100644 index 000000000..f40f69e31 --- /dev/null +++ b/quickstep/res/values-mn-rMN/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Дэлгэцийг хуваах"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Тогтоох"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Тойм"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Сүүлийн үеийн зүйл алга"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Хаах"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Бүгдийг устгах"</string> +</resources> diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml index 8b9221491..5031388f9 100644 --- a/quickstep/res/values-mn/strings.xml +++ b/quickstep/res/values-mn/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Дэлгэцийг хуваах"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Тогтоох"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Аппыг сэлгэхийн тулд доороос дээш шударна уу"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Тойм"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Сүүлийн үеийн зүйл алга"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Хаах"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Бүгдийг устгах"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-mr-rIN/strings.xml b/quickstep/res/values-mr-rIN/strings.xml new file mode 100644 index 000000000..938363db0 --- /dev/null +++ b/quickstep/res/values-mr-rIN/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"विभाजित स्क्रीन"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"पिन करा"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"अवलोकन"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"कोणतेही अलीकडील आयटम नाहीत"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"बंद"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"सर्व साफ करा"</string> +</resources> diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index 596792d10..939963e46 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"विभाजित स्क्रीन"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"पिन करा"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"अॅप्स स्विच करण्यासाठी तळापासून वर स्वाइप करा"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"अवलोकन"</string> <string name="recents_empty_message" msgid="7040467240571714191">"कोणतेही अलीकडील आयटम नाहीत"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"बंद"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"सर्व साफ करा"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ms-rMY/strings.xml b/quickstep/res/values-ms-rMY/strings.xml new file mode 100644 index 000000000..236fab25c --- /dev/null +++ b/quickstep/res/values-ms-rMY/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Skrin pisah"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Semat"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Ikhtisar"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Tiada item terbaharu"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Tutup"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Kosongkan semua"</string> +</resources> diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml index 336aaf659..0e93bf6c1 100644 --- a/quickstep/res/values-ms/strings.xml +++ b/quickstep/res/values-ms/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Skrin pisah"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Semat"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Leret ke atas dari bawah untuk menukar apl"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Ikhtisar"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Tiada item terbaharu"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Tutup"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Kosongkan semua"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-my-rMM/strings.xml b/quickstep/res/values-my-rMM/strings.xml new file mode 100644 index 000000000..e44b904be --- /dev/null +++ b/quickstep/res/values-my-rMM/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"မျက်နှာပြင် ခွဲ၍ပြသခြင်း"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"ပင်ထိုးခြင်း"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"အနှစ်ချုပ်"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"မကြာမီကဖွင့်ထားသည်များ မရှိပါ"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"ပိတ်ရန်"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"အားလုံးကို ရှင်းရန်"</string> +</resources> diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml index d71e5fc93..ebffc3c3b 100644 --- a/quickstep/res/values-my/strings.xml +++ b/quickstep/res/values-my/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"မျက်နှာပြင် ခွဲ၍ပြသခြင်း"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"ပင်ထိုးခြင်း"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"အက်ပ်များပြောင်းရန် အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"အနှစ်ချုပ်"</string> <string name="recents_empty_message" msgid="7040467240571714191">"မကြာမီကဖွင့်ထားသည်များ မရှိပါ"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"ပိတ်ရန်"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"အားလုံးကို ရှင်းရန်"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml index 504f43ae8..97870b15c 100644 --- a/quickstep/res/values-nb/strings.xml +++ b/quickstep/res/values-nb/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Delt skjerm"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fest"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Sveip opp fra bunnen for å bytte app"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Oversikt"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Ingen nylige elementer"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Lukk"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Fjern alt"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ne-rNP/strings.xml b/quickstep/res/values-ne-rNP/strings.xml new file mode 100644 index 000000000..bf52604fd --- /dev/null +++ b/quickstep/res/values-ne-rNP/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"स्क्रिन विभाजन गर्नुहोस्"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"पिन गर्नुहोस्"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"परिदृश्य"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"हालसालैको कुनै पनि वस्तु छैन"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"बन्द गर्नुहोस्"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"सबै खाली गर्नुहोस्"</string> +</resources> diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml index 750021389..c9a6c6b89 100644 --- a/quickstep/res/values-ne/strings.xml +++ b/quickstep/res/values-ne/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"स्क्रिन विभाजन गर्नुहोस्"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"पिन गर्नुहोस्"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"अनुप्रयोगहरू बदल्न तलबाट माथितिर स्वाइप गर्नुहोस्"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"परिदृश्य"</string> <string name="recents_empty_message" msgid="7040467240571714191">"हालसालैको कुनै पनि वस्तु छैन"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"बन्द गर्नुहोस्"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"सबै खाली गर्नुहोस्"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml index 2ba24a6e2..e3acf0dc3 100644 --- a/quickstep/res/values-nl/strings.xml +++ b/quickstep/res/values-nl/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Gesplitst scherm"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Vastzetten"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Veeg omhoog vanaf de onderkant om tussen apps te wisselen"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Overzicht"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Geen recente items"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Sluiten"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Alles wissen"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml new file mode 100644 index 000000000..5e5e420ff --- /dev/null +++ b/quickstep/res/values-or/strings.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"ସ୍କ୍ରୀନ୍କୁ ଭାଗ କରନ୍ତୁ"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"ପିନ୍"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ସଂକ୍ଷିପ୍ତ ବିବରଣ"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"କୌଣସି ସାମ୍ପ୍ରତିକ ଆଇଟମ୍ ନାହିଁ"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"ବନ୍ଦ କରନ୍ତୁ"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ସବୁ ଖାଲି କରନ୍ତୁ"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> + <skip /> +</resources> diff --git a/quickstep/res/values-pa-rIN/strings.xml b/quickstep/res/values-pa-rIN/strings.xml new file mode 100644 index 000000000..bc044c808 --- /dev/null +++ b/quickstep/res/values-pa-rIN/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"ਪਿੰਨ ਕਰੋ"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ਰੂਪ-ਰੇਖਾ"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"ਬੰਦ ਕਰੋ"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string> +</resources> diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml index fbcb60cd6..fec9f03fb 100644 --- a/quickstep/res/values-pa/strings.xml +++ b/quickstep/res/values-pa/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"ਪਿੰਨ ਕਰੋ"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"ਐਪਾਂ ਵਿੱਚ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ਰੂਪ-ਰੇਖਾ"</string> <string name="recents_empty_message" msgid="7040467240571714191">"ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"ਬੰਦ ਕਰੋ"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml index 1ad7070bd..54196e846 100644 --- a/quickstep/res/values-pl/strings.xml +++ b/quickstep/res/values-pl/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Podziel ekran"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Przypnij"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Przesuń palcem z dołu ekranu, by przełączać aplikacje"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Przegląd"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Brak ostatnich elementów"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Zamknij"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Wyczyść wszystko"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml index a63d32998..afc629537 100644 --- a/quickstep/res/values-pt-rPT/strings.xml +++ b/quickstep/res/values-pt-rPT/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Ecrã dividido"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fixar"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Deslize rapidamente para cima a partir da parte inferior para alternar entre aplicações."</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Vista geral"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Nenhum item recente"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Fechar"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Limpar tudo"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml index 05d20e08e..9e43cd7c0 100644 --- a/quickstep/res/values-pt/strings.xml +++ b/quickstep/res/values-pt/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Tela dividida"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fixar"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Deslize de baixo para cima para alternar entre apps"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Visão geral"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Nenhum item recente"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Fechar"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Limpar tudo"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml index 4264370f4..a8889d4b4 100644 --- a/quickstep/res/values-ro/strings.xml +++ b/quickstep/res/values-ro/strings.xml @@ -21,9 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Ecran divizat"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fixați"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Glisați de jos în sus pentru a schimba aplicațiile"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Recente"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Niciun element recent"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> - <skip /> + <string name="accessibility_close_task" msgid="5354563209433803643">"Închideți"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Ștergeți tot"</string> </resources> diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml index 47ddff53c..832aa0aa1 100644 --- a/quickstep/res/values-ru/strings.xml +++ b/quickstep/res/values-ru/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Разделить экран"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Блокировать"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Чтобы переключить приложение, проведите по экрану снизу вверх"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Обзор"</string> - <string name="recents_empty_message" msgid="7040467240571714191">"Недавних приложений нет."</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="recents_empty_message" msgid="7040467240571714191">"Здесь пока ничего нет."</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Закрыть"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Очистить все"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-si-rLK/strings.xml b/quickstep/res/values-si-rLK/strings.xml new file mode 100644 index 000000000..61bb8ba81 --- /dev/null +++ b/quickstep/res/values-si-rLK/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"බෙදුම් තිරය"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"අමුණන්න"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"දළ විශ්ලේෂණය"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"මෑත අයිතම නැත"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"වසන්න"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"සියල්ල හිස් කරන්න"</string> +</resources> diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml index a9b1493bb..61bb8ba81 100644 --- a/quickstep/res/values-si/strings.xml +++ b/quickstep/res/values-si/strings.xml @@ -21,9 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"බෙදුම් තිරය"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"අමුණන්න"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"යෙදුම් මාරු කිරීම සඳහා පහළ සිට ස්වයිප් කරන්න"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"දළ විශ්ලේෂණය"</string> <string name="recents_empty_message" msgid="7040467240571714191">"මෑත අයිතම නැත"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> - <skip /> + <string name="accessibility_close_task" msgid="5354563209433803643">"වසන්න"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"සියල්ල හිස් කරන්න"</string> </resources> diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index fe028554f..da4585bf1 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Rozdeliť obrazovku"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Pripnúť"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Aplikácie môžete prepínať potiahnutím prstom zdola nahor"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Prehľad"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Žiadne nedávne položky"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Zavrieť"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Vymazať všetko"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml index 72d52a51c..6a25e9d83 100644 --- a/quickstep/res/values-sl/strings.xml +++ b/quickstep/res/values-sl/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Razdeljen zaslon"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Pripni"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Če želite preklopiti med aplikacijami, z dna zaslona s prstom povlecite navzgor"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Pregled"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Ni nedavnih elementov"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Zapri"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Počisti vse"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-sq-rAL/strings.xml b/quickstep/res/values-sq-rAL/strings.xml new file mode 100644 index 000000000..a0c3d781d --- /dev/null +++ b/quickstep/res/values-sq-rAL/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Ekrani i ndarë"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Gozhdo"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Përmbledhja"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Nuk ka asnjë artikull të fundit"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Mbyll"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Pastroji të gjitha"</string> +</resources> diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml index 954342cd9..521b8c75c 100644 --- a/quickstep/res/values-sq/strings.xml +++ b/quickstep/res/values-sq/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Ekrani i ndarë"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Gozhdo"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Rrëshqit larg nga poshtë për të ndryshuar aplikacionet"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Përmbledhja"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Nuk ka asnjë artikull të fundit"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Mbyll"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Pastroji të gjitha"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml index 51a9586e6..054cda594 100644 --- a/quickstep/res/values-sr/strings.xml +++ b/quickstep/res/values-sr/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Подељени екран"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Закачи"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Превуците нагоре да бисте прешли на другу апликацију"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Преглед"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Нема недавних ставки"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Затвори"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Обриши све"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml index 266cf60ef..1a0ecc13e 100644 --- a/quickstep/res/values-sv/strings.xml +++ b/quickstep/res/values-sv/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Delad skärm"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fäst"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Växla mellan appar genom att svepa uppåt från nederkanten"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Översikt"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Listan med de senaste åtgärderna är tom"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Stäng"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Rensa alla"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml index e85fa45bb..be26e8bc6 100644 --- a/quickstep/res/values-sw/strings.xml +++ b/quickstep/res/values-sw/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Gawa skrini"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Bandika"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Telezesha kidole juu kuanzia chini ili ubadilishe programu"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Muhtasari"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Hakuna vipengee vya hivi karibuni"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Funga"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Ondoa zote"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ta-rIN/strings.xml b/quickstep/res/values-ta-rIN/strings.xml new file mode 100644 index 000000000..0c800ca72 --- /dev/null +++ b/quickstep/res/values-ta-rIN/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"திரைப் பிரிப்பு"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"பின் செய்தல்"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"மேலோட்டப் பார்வை"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"சமீபத்தியவை எதுவுமில்லை"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"மூடும்"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"எல்லாம் அழி"</string> +</resources> diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml index de03ae62e..886b017a8 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"திரைப் பிரிப்பு"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"பின் செய்தல்"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, கீழிருந்து மேல்நோக்கி ஸ்வைப் செய்க"</string> - <!-- no translation found for accessibility_desc_recent_apps (1444379410873162882) --> - <skip /> - <!-- no translation found for recents_empty_message (7040467240571714191) --> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"மேலோட்டப் பார்வை"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"சமீபத்தியவை எதுவுமில்லை"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"மூடும்"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"எல்லாம் அழி"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-te-rIN/strings.xml b/quickstep/res/values-te-rIN/strings.xml new file mode 100644 index 000000000..416fbb848 --- /dev/null +++ b/quickstep/res/values-te-rIN/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"స్క్రీన్ని విభజించు"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"పిన్ చేయి"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"అవలోకనం"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"ఇటీవలి అంశాలు ఏవీ లేవు"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"మూసివేయండి"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"అన్నీ తీసివేయండి"</string> +</resources> diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml index 108f35042..a0a818cf6 100644 --- a/quickstep/res/values-te/strings.xml +++ b/quickstep/res/values-te/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"స్క్రీన్ని విభజించు"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"పిన్ చేయి"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"యాప్లను మార్చడానికి దిగువ నుండి పైకి స్వైప్ చేయండి"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"అవలోకనం"</string> <string name="recents_empty_message" msgid="7040467240571714191">"ఇటీవలి అంశాలు ఏవీ లేవు"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"మూసివేయండి"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"అన్నీ తీసివేయండి"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml index 80f91b087..5a162b729 100644 --- a/quickstep/res/values-th/strings.xml +++ b/quickstep/res/values-th/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"แยกหน้าจอ"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"ตรึง"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"เลื่อนขึ้นจากด้านล่างเพื่อสลับแอป"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ภาพรวม"</string> <string name="recents_empty_message" msgid="7040467240571714191">"ไม่มีรายการล่าสุด"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"ปิด"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"ล้างทั้งหมด"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml index b28e04e72..af7ff97fa 100644 --- a/quickstep/res/values-tl/strings.xml +++ b/quickstep/res/values-tl/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Hatiin ang screen"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"I-pin"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Mag-swipe pataas mula sa ibaba para lumipat ng app"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Overview"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Walang kamakailang item"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Isara"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"I-clear lahat"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml index 139935356..760a61ffd 100644 --- a/quickstep/res/values-tr/strings.xml +++ b/quickstep/res/values-tr/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Bölünmüş ekran"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Sabitle"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Uygulamaları değiştirmek için alttan yukarı kaydırın"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Genel bakış"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Yeni öğe yok"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Kapat"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Tümünü temizle"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml index 929bbe795..41babaa87 100644 --- a/quickstep/res/values-uk/strings.xml +++ b/quickstep/res/values-uk/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Розділити екран"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Закріпити"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Щоб переходити між додатками, проводьте пальцем знизу вгору"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Огляд"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Немає нещодавніх додатків"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Закрити"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Очистити все"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-ur-rPK/strings.xml b/quickstep/res/values-ur-rPK/strings.xml new file mode 100644 index 000000000..0a546fd60 --- /dev/null +++ b/quickstep/res/values-ur-rPK/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"اسپلٹ اسکرین وضع"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"پن کریں"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"مجموعی جائزہ"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"کوئی حالیہ آئٹم نہیں"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"بند کریں"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"سبھی کو صاف کریں"</string> +</resources> diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml index 0271fe4d2..9dd7b8d33 100644 --- a/quickstep/res/values-ur/strings.xml +++ b/quickstep/res/values-ur/strings.xml @@ -21,11 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"اسپلٹ اسکرین وضع"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"پن کریں"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"ایپس کو سوئچ کرنے کیلئے نیچے سے اوپر سوائپ کریں"</string> - <!-- no translation found for accessibility_desc_recent_apps (1444379410873162882) --> - <skip /> - <!-- no translation found for recents_empty_message (7040467240571714191) --> - <skip /> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"مجموعی جائزہ"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"کوئی حالیہ آئٹم نہیں"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"بند کریں"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"سبھی کو صاف کریں"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-uz-rUZ/strings.xml b/quickstep/res/values-uz-rUZ/strings.xml new file mode 100644 index 000000000..efea34117 --- /dev/null +++ b/quickstep/res/values-uz-rUZ/strings.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2017 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Ekranni ikkiga ajratish"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"Mahkamlash"</string> + <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Nazar"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Yaqinda ishlatilgan ilovalar yo‘q"</string> + <string name="accessibility_close_task" msgid="5354563209433803643">"Yopish"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Hammasini tozalash"</string> +</resources> diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index 91e11d3dc..c78f000ca 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Ekranni ikkiga ajratish"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Mahkamlash"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Ilovalarni almashtirish uchun pastdan yuqoriga suring"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Nazar"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Yaqinda ishlatilgan ilovalar yo‘q"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Yopish"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Hammasini tozalash"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml index 809517a58..4b1d1c025 100644 --- a/quickstep/res/values-vi/strings.xml +++ b/quickstep/res/values-vi/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Chia đôi màn hình"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Ghim"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Vuốt từ dưới lên để chuyển đổi ứng dụng"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Tổng quan"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Không có mục gần đây nào"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Đóng"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Xóa tất cả"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml index a44dd2db0..17cf6c31a 100644 --- a/quickstep/res/values-zh-rCN/strings.xml +++ b/quickstep/res/values-zh-rCN/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"分屏"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"固定"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"从屏幕底部向上滑动即可切换应用"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"概览"</string> <string name="recents_empty_message" msgid="7040467240571714191">"近期没有任何内容"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"关闭"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"全部清除"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml index 3879bc568..1203cf01f 100644 --- a/quickstep/res/values-zh-rHK/strings.xml +++ b/quickstep/res/values-zh-rHK/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"分割畫面"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"固定"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"從螢幕底部向上快速滑動,即可切換應用程式"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"概覽"</string> <string name="recents_empty_message" msgid="7040467240571714191">"最近沒有任何項目"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"關閉"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"全部清除"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml index f275168f6..ed708b495 100644 --- a/quickstep/res/values-zh-rTW/strings.xml +++ b/quickstep/res/values-zh-rTW/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"分割畫面"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"固定"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"從畫面底部向上滑動以切換應用程式"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"總覽"</string> <string name="recents_empty_message" msgid="7040467240571714191">"最近沒有任何項目"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"關閉"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"全部清除"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml index 206718eff..1aa34b6b6 100644 --- a/quickstep/res/values-zu/strings.xml +++ b/quickstep/res/values-zu/strings.xml @@ -21,9 +21,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_split_screen" msgid="5353188922202653570">"Hlukanisa isikrini"</string> <string name="recent_task_option_pin" msgid="7929860679018978258">"Phina"</string> - <string name="recents_swipe_up_onboarding" msgid="1025535041275136564">"Swayiphela phezulu kusukela phansi ukuze ushintshe izinhlelo zokusebenza"</string> <string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Buka konke"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Azikho izinto zakamuva"</string> - <!-- no translation found for accessibility_close_task (5354563209433803643) --> + <string name="accessibility_close_task" msgid="5354563209433803643">"Vala"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Sula konke"</string> + <!-- no translation found for accessibility_recent_apps (4058661986695117371) --> <skip /> </resources> diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml index 94211c62f..7673f6994 100644 --- a/quickstep/res/values/config.xml +++ b/quickstep/res/values/config.xml @@ -16,4 +16,7 @@ <resources> <string name="task_overlay_factory_class" translatable="false"></string> + <string name="overview_callbacks_class" translatable="false"></string> + + <string name="user_event_dispatcher_class" translatable="false">com.google.quickstep.logging.UserEventDispatcherExtension</string> </resources> diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index c74191395..ad5f767be 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -30,8 +30,9 @@ <dimen name="quickstep_fling_min_velocity">250dp</dimen> <!-- Launcher app transition --> - <dimen name="content_trans_y">25dp</dimen> - <dimen name="workspace_trans_y">80dp</dimen> + <dimen name="content_trans_y">50dp</dimen> + <dimen name="workspace_trans_y">50dp</dimen> + <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> @@ -45,4 +46,9 @@ <!-- Copied from framework resource: docked_stack_divider_thickness - 2 * docked_stack_divider_insets --> <dimen name="multi_window_task_divider_size">10dp</dimen> + + <!-- Width of the space behind the last task in Overview. In the center of it, there is "Clear all" button. --> + <dimen name="clear_all_container_width">168dp</dimen> + + <dimen name="shelf_surface_radius">16dp</dimen> </resources> diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml index 7ba91b3db..a76899d3d 100644 --- a/quickstep/res/values/strings.xml +++ b/quickstep/res/values/strings.xml @@ -27,9 +27,6 @@ <!-- Title for an option to keep an app pinned to the screen until it is unpinned --> <string name="recent_task_option_pin">Pin</string> - <!-- Text that shows above the navigation bar after launching a few apps --> - <string name="recents_swipe_up_onboarding">Swipe up from the bottom to switch apps</string> - <!-- Content description for the recent apps panel (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_desc_recent_apps">Overview</string> @@ -38,4 +35,10 @@ <!-- Content description for the recent apps's accessibility option that closes it. [CHAR LIMIT=NONE] --> <string name="accessibility_close_task">Close</string> + + <!-- Recents: Title of a button that clears the task list, i.e. closes all tasks. [CHAR LIMIT=30] --> + <string name="recents_clear_all">Clear all</string> + + <!-- Accessibility title for the list of recent apps [CHAR_LIMIT=none] --> + <string name="accessibility_recent_apps">Recent apps</string> </resources>
\ No newline at end of file diff --git a/quickstep/res/xml/indexable_launcher_prefs.xml b/quickstep/res/xml/indexable_launcher_prefs.xml index 265540201..30f310021 100644 --- a/quickstep/res/xml/indexable_launcher_prefs.xml +++ b/quickstep/res/xml/indexable_launcher_prefs.xml @@ -20,8 +20,14 @@ android:key="pref_add_icon_to_home" android:title="@string/auto_add_shortcuts_label" android:summary="@string/auto_add_shortcuts_description" - android:defaultValue="true" - /> + android:defaultValue="true" /> + + <SwitchPreference + android:key="pref_allowRotation" + android:title="@string/allow_rotation_title" + android:summary="@string/allow_rotation_desc" + android:defaultValue="@bool/allow_rotation" + android:persistent="true" /> <ListPreference android:key="pref_override_icon_shape" diff --git a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java index f91933979..e34631042 100644 --- a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java +++ b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java @@ -15,8 +15,9 @@ */ package com.android.launcher3; -import static com.android.systemui.shared.recents.utilities.Utilities - .postAtFrontOfQueueAsynchronously; +import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; +import static com.android.launcher3.Utilities.postAsyncCallback; +import static com.android.systemui.shared.recents.utilities.Utilities.postAtFrontOfQueueAsynchronously; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -31,53 +32,49 @@ import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; @TargetApi(Build.VERSION_CODES.P) -public abstract class LauncherAnimationRunner extends AnimatorListenerAdapter - implements RemoteAnimationRunnerCompat { - - private static final int REFRESH_RATE_MS = 16; +public abstract class LauncherAnimationRunner implements RemoteAnimationRunnerCompat { private final Handler mHandler; + private final boolean mStartAtFrontOfQueue; + private AnimationResult mAnimationResult; - private Runnable mSysFinishRunnable; - - private AnimatorSet mAnimator; - - public LauncherAnimationRunner(Handler handler) { + /** + * @param startAtFrontOfQueue If true, the animation start will be posted at the front of the + * queue to minimize latency. + */ + public LauncherAnimationRunner(Handler handler, boolean startAtFrontOfQueue) { mHandler = handler; + mStartAtFrontOfQueue = startAtFrontOfQueue; } @BinderThread @Override public void onAnimationStart(RemoteAnimationTargetCompat[] targetCompats, Runnable runnable) { - postAtFrontOfQueueAsynchronously(mHandler, () -> { - // Finish any previous animation - finishSystemAnimation(); - - mSysFinishRunnable = runnable; - mAnimator = getAnimator(targetCompats); - if (mAnimator == null) { - finishSystemAnimation(); - return; - } - mAnimator.addListener(this); - mAnimator.start(); - // Because t=0 has the app icon in its original spot, we can skip the - // first frame and have the same movement one frame earlier. - mAnimator.setCurrentPlayTime(REFRESH_RATE_MS); - - }); + Runnable r = () -> { + finishExistingAnimation(); + mAnimationResult = new AnimationResult(runnable); + onCreateAnimation(targetCompats, mAnimationResult); + }; + if (mStartAtFrontOfQueue) { + postAtFrontOfQueueAsynchronously(mHandler, r); + } else { + postAsyncCallback(mHandler, r); + } } - + /** + * Called on the UI thread when the animation targets are received. The implementation must + * call {@link AnimationResult#setAnimation(AnimatorSet)} with the target animation to be run. + */ @UiThread - public abstract AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats); + public abstract void onCreateAnimation( + RemoteAnimationTargetCompat[] targetCompats, AnimationResult result); @UiThread - @Override - public void onAnimationEnd(Animator animation) { - if (animation == mAnimator) { - mAnimator = null; - finishSystemAnimation(); + private void finishExistingAnimation() { + if (mAnimationResult != null) { + mAnimationResult.finish(); + mAnimationResult = null; } } @@ -87,20 +84,56 @@ public abstract class LauncherAnimationRunner extends AnimatorListenerAdapter @BinderThread @Override public void onAnimationCancelled() { - postAtFrontOfQueueAsynchronously(mHandler, () -> { - if (mAnimator != null) { - mAnimator.removeListener(this); - mAnimator.end(); - mAnimator = null; - } - }); + postAsyncCallback(mHandler, this::finishExistingAnimation); } - @UiThread - private void finishSystemAnimation() { - if (mSysFinishRunnable != null) { - mSysFinishRunnable.run(); - mSysFinishRunnable = null; + public static final class AnimationResult { + + private final Runnable mFinishRunnable; + + private AnimatorSet mAnimator; + private boolean mFinished = false; + private boolean mInitialized = false; + + private AnimationResult(Runnable finishRunnable) { + mFinishRunnable = finishRunnable; + } + + @UiThread + private void finish() { + if (!mFinished) { + mFinishRunnable.run(); + mFinished = true; + } + } + + @UiThread + public void setAnimation(AnimatorSet animation) { + if (mInitialized) { + throw new IllegalStateException("Animation already initialized"); + } + mInitialized = true; + mAnimator = animation; + if (mAnimator == null) { + finish(); + } else if (mFinished) { + // Animation callback was already finished, skip the animation. + mAnimator.start(); + mAnimator.end(); + } else { + // Start the animation + mAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + finish(); + } + }); + mAnimator.start(); + + // Because t=0 has the app icon in its original spot, we can skip the + // first frame and have the same movement one frame earlier. + mAnimator.setCurrentPlayTime(SINGLE_FRAME_MS); + } } } }
\ No newline at end of file diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index ad0b7344b..2e31ef239 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -16,9 +16,21 @@ package com.android.launcher3; +import static com.android.launcher3.BaseActivity.INVISIBLE_ALL; +import static com.android.launcher3.BaseActivity.INVISIBLE_BY_APP_TRANSITIONS; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; +import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.LauncherState.OVERVIEW; +import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; +import static com.android.launcher3.anim.Interpolators.AGGRESSIVE_EASE; +import static com.android.launcher3.anim.Interpolators.DEACCEL_1_7; +import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.launcher3.dragndrop.DragLayer.ALPHA_INDEX_TRANSITIONS; +import static com.android.quickstep.TaskUtils.findTaskViewToLaunch; +import static com.android.quickstep.TaskUtils.getRecentsWindowAnimator; +import static com.android.quickstep.TaskUtils.taskIsATargetWithMode; import static com.android.systemui.shared.recents.utilities.Utilities.getNextFrameNumber; import static com.android.systemui.shared.recents.utilities.Utilities.getSurface; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; @@ -31,7 +43,6 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.app.ActivityOptions; -import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; @@ -42,10 +53,10 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.Log; +import android.util.Pair; import android.view.Surface; import android.view.View; import android.view.ViewGroup; -import android.view.animation.Interpolator; import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; import com.android.launcher3.InsettableFrameLayout.LayoutParams; @@ -55,12 +66,13 @@ import com.android.launcher3.anim.Interpolators; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.shortcuts.DeepShortcutView; -import com.android.quickstep.RecentsAnimationInterpolator; -import com.android.quickstep.RecentsAnimationInterpolator.TaskWindowBounds; +import com.android.launcher3.util.MultiValueAlpha; +import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; +import com.android.quickstep.util.ClipAnimationHelper; +import com.android.quickstep.util.MultiValueUpdateListener; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; -import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ActivityCompat; import com.android.systemui.shared.system.ActivityOptionsCompat; import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; @@ -79,54 +91,66 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag implements OnDeviceProfileChangeListener { private static final String TAG = "LauncherTransition"; - private static final int STATUS_BAR_TRANSITION_DURATION = 120; + public static final int STATUS_BAR_TRANSITION_DURATION = 120; private static final String CONTROL_REMOTE_APP_TRANSITION_PERMISSION = "android.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS"; private static final int APP_LAUNCH_DURATION = 500; // Use a shorter duration for x or y translation to create a curve effect - private static final int APP_LAUNCH_CURVED_DURATION = 233; - private static final int RECENTS_LAUNCH_DURATION = 336; + private static final int APP_LAUNCH_CURVED_DURATION = APP_LAUNCH_DURATION / 2; + // We scale the durations for the downward app launch animations (minus the scale animation). + private static final float APP_LAUNCH_DOWN_DUR_SCALE_FACTOR = 0.8f; + private static final int APP_LAUNCH_ALPHA_START_DELAY = 32; + private static final int APP_LAUNCH_ALPHA_DURATION = 50; + + public static final int RECENTS_LAUNCH_DURATION = 336; private static final int LAUNCHER_RESUME_START_DELAY = 100; - private static final int CLOSING_TRANSITION_DURATION_MS = 350; + private static final int CLOSING_TRANSITION_DURATION_MS = 250; // Progress = 0: All apps is fully pulled up, Progress = 1: All apps is fully pulled down. public static final float ALL_APPS_PROGRESS_OFF_SCREEN = 1.3059858f; - public static final float ALL_APPS_PROGRESS_OVERSHOOT = 0.99581414f; - private final DragLayer mDragLayer; private final Launcher mLauncher; + private final DragLayer mDragLayer; + private final AlphaProperty mDragLayerAlpha; private final Handler mHandler; private final boolean mIsRtl; private final float mContentTransY; private final float mWorkspaceTransY; + private final float mClosingWindowTransY; private DeviceProfile mDeviceProfile; private View mFloatingView; private RemoteAnimationProvider mRemoteAnimationProvider; - private final AnimatorListenerAdapter mReapplyStateListener = new AnimatorListenerAdapter() { + private final AnimatorListenerAdapter mForceInvisibleListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mLauncher.addForceInvisibleFlag(INVISIBLE_BY_APP_TRANSITIONS); + } + @Override public void onAnimationEnd(Animator animation) { - mLauncher.getStateManager().reapplyState(); + mLauncher.clearForceInvisibleFlag(INVISIBLE_BY_APP_TRANSITIONS); } }; public LauncherAppTransitionManagerImpl(Context context) { mLauncher = Launcher.getLauncher(context); 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); mWorkspaceTransY = res.getDimensionPixelSize(R.dimen.workspace_trans_y); + mClosingWindowTransY = res.getDimensionPixelSize(R.dimen.closing_window_trans_y); mLauncher.addOnDeviceProfileChangeListener(this); registerRemoteAnimations(); @@ -144,102 +168,56 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag @Override public ActivityOptions getActivityLaunchOptions(Launcher launcher, View v) { if (hasControlRemoteAppTransitionPermission()) { - try { - RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mHandler) { + RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mHandler, + true /* startAtFrontOfQueue */) { - @Override - public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { - AnimatorSet anim = new AnimatorSet(); + @Override + public void onCreateAnimation(RemoteAnimationTargetCompat[] targetCompats, + AnimationResult result) { + AnimatorSet anim = new AnimatorSet(); + boolean launcherClosing = + launcherIsATargetWithMode(targetCompats, MODE_CLOSING); - if (!composeRecentsLaunchAnimator(v, targetCompats, anim)) { - // Set the state animation first so that any state listeners are called - // before our internal listeners. - mLauncher.getStateManager().setCurrentAnimation(anim); + if (!composeRecentsLaunchAnimator(v, targetCompats, anim)) { + // Set the state animation first so that any state listeners are called + // before our internal listeners. + mLauncher.getStateManager().setCurrentAnimation(anim); - anim.play(getIconAnimator(v)); - if (launcherIsATargetWithMode(targetCompats, MODE_CLOSING)) { - anim.play(getLauncherContentAnimator(false /* show */)); - } - anim.play(getWindowAnimators(v, targetCompats)); + anim.play(getIconAnimator(v)); + if (launcherClosing) { + Pair<AnimatorSet, Runnable> launcherContentAnimator = + getLauncherContentAnimator(true /* isAppOpening */); + anim.play(launcherContentAnimator.first); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + launcherContentAnimator.second.run(); + } + }); } - return anim; + anim.play(getOpeningWindowAnimators(v, targetCompats)); } - }; - - int duration = findTaskViewToLaunch(launcher, v, null) != null - ? RECENTS_LAUNCH_DURATION : APP_LAUNCH_DURATION; - int statusBarTransitionDelay = duration - STATUS_BAR_TRANSITION_DURATION; - return ActivityOptionsCompat.makeRemoteAnimation(new RemoteAnimationAdapterCompat( - runner, duration, statusBarTransitionDelay)); - } catch (NoClassDefFoundError e) { - // Gracefully fall back to default launch options if the user's platform doesn't - // have the latest changes. - } - } - return getDefaultActivityLaunchOptions(launcher, v); - } - public void setRemoteAnimationProvider(RemoteAnimationProvider animationProvider) { - mRemoteAnimationProvider = animationProvider; - } - - /** - * Try to find a TaskView that corresponds with the component of the launched view. - * - * If this method returns a non-null TaskView, it will be used in composeRecentsLaunchAnimation. - * Otherwise, we will assume we are using a normal app transition, but it's possible that the - * opening remote target (which we don't get until onAnimationStart) will resolve to a TaskView. - */ - private TaskView findTaskViewToLaunch( - BaseDraggingActivity activity, View v, RemoteAnimationTargetCompat[] targets) { - if (v instanceof TaskView) { - return (TaskView) v; - } - RecentsView recentsView = activity.getOverviewPanel(); - - // It's possible that the launched view can still be resolved to a visible task view, check - // the task id of the opening task and see if we can find a match. - if (v.getTag() instanceof ItemInfo) { - ItemInfo itemInfo = (ItemInfo) v.getTag(); - ComponentName componentName = itemInfo.getTargetComponent(); - if (componentName != null) { - for (int i = 0; i < recentsView.getChildCount(); i++) { - TaskView taskView = (TaskView) recentsView.getPageAt(i); - if (recentsView.isTaskViewVisible(taskView)) { - Task task = taskView.getTask(); - if (componentName.equals(task.key.getComponent())) { - return taskView; - } + if (launcherClosing) { + anim.addListener(mForceInvisibleListener); } - } - } - } - if (targets == null) { - return null; - } - // Resolve the opening task id - int openingTaskId = -1; - for (RemoteAnimationTargetCompat target : targets) { - if (target.mode == MODE_OPENING) { - openingTaskId = target.taskId; - break; - } - } + result.setAnimation(anim); + } + }; - // If there is no opening task id, fall back to the normal app icon launch animation - if (openingTaskId == -1) { - return null; + int duration = findTaskViewToLaunch(launcher, v, null) != null + ? RECENTS_LAUNCH_DURATION : APP_LAUNCH_DURATION; + int statusBarTransitionDelay = duration - STATUS_BAR_TRANSITION_DURATION; + return ActivityOptionsCompat.makeRemoteAnimation(new RemoteAnimationAdapterCompat( + runner, duration, statusBarTransitionDelay)); } + return getDefaultActivityLaunchOptions(launcher, v); + } - // If the opening task id is not currently visible in overview, then fall back to normal app - // icon launch animation - TaskView taskView = recentsView.getTaskView(openingTaskId); - if (taskView == null || !recentsView.isTaskViewVisible(taskView)) { - return null; - } - return taskView; + public void setRemoteAnimationProvider(RemoteAnimationProvider animationProvider) { + mRemoteAnimationProvider = animationProvider; } /** @@ -261,21 +239,33 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag return false; } + ClipAnimationHelper helper = new ClipAnimationHelper(); + target.play(getRecentsWindowAnimator(taskView, skipLauncherChanges, targets, helper) + .setDuration(RECENTS_LAUNCH_DURATION)); + + Animator childStateAnimation = null; // Found a visible recents task that matches the opening app, lets launch the app from there Animator launcherAnim; final AnimatorListenerAdapter windowAnimEndListener; if (launcherClosing) { - launcherAnim = recentsView.createAdjacentPageAnimForTaskLaunch(taskView); + launcherAnim = recentsView.createAdjacentPageAnimForTaskLaunch(taskView, helper); launcherAnim.setInterpolator(Interpolators.TOUCH_RESPONSE_INTERPOLATOR); launcherAnim.setDuration(RECENTS_LAUNCH_DURATION); // Make sure recents gets fixed up by resetting task alphas and scales, etc. - windowAnimEndListener = mReapplyStateListener; + windowAnimEndListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mLauncher.getStateManager().moveToRestState(); + mLauncher.getStateManager().reapplyState(); + } + }; } else { AnimatorPlaybackController controller = mLauncher.getStateManager() .createAnimationToNewWorkspace(NORMAL, RECENTS_LAUNCH_DURATION); controller.dispatchOnStart(); + childStateAnimation = controller.getTarget(); launcherAnim = controller.getAnimationPlayer().setDuration(RECENTS_LAUNCH_DURATION); windowAnimEndListener = new AnimatorListenerAdapter() { @Override @@ -284,112 +274,34 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag } }; } - - target.play(getRecentsWindowAnimator(taskView, skipLauncherChanges, targets)); target.play(launcherAnim); // Set the current animation first, before adding windowAnimEndListener. Setting current // animation adds some listeners which need to be called before windowAnimEndListener // (the ordering of listeners matter in this case). - mLauncher.getStateManager().setCurrentAnimation(target); + mLauncher.getStateManager().setCurrentAnimation(target, childStateAnimation); target.addListener(windowAnimEndListener); return true; } /** - * @return Animator that controls the window of the opening targets for the recents launch - * animation. - */ - private ValueAnimator getRecentsWindowAnimator(TaskView v, boolean skipLauncherChanges, - RemoteAnimationTargetCompat[] targets) { - final RecentsAnimationInterpolator recentsInterpolator = v.getRecentsInterpolator(); - - Rect crop = new Rect(); - Matrix matrix = new Matrix(); - - ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); - appAnimator.setDuration(RECENTS_LAUNCH_DURATION); - appAnimator.setInterpolator(Interpolators.TOUCH_RESPONSE_INTERPOLATOR); - appAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - boolean isFirstFrame = true; - - @Override - public void onAnimationUpdate(ValueAnimator animation) { - final Surface surface = getSurface(v); - final long frameNumber = surface != null ? getNextFrameNumber(surface) : -1; - if (frameNumber == -1) { - // Booo, not cool! Our surface got destroyed, so no reason to animate anything. - Log.w(TAG, "Failed to animate, surface got destroyed."); - return; - } - final float percent = animation.getAnimatedFraction(); - TaskWindowBounds tw = recentsInterpolator.interpolate(percent); - - float alphaDuration = 75; - if (!skipLauncherChanges) { - v.setScaleX(tw.taskScale); - v.setScaleY(tw.taskScale); - v.setTranslationX(tw.taskX); - v.setTranslationY(tw.taskY); - // Defer fading out the view until after the app window gets faded in - v.setAlpha(getValue(1f, 0f, alphaDuration, alphaDuration, - appAnimator.getDuration() * percent, Interpolators.LINEAR)); - } - - matrix.setScale(tw.winScale, tw.winScale); - matrix.postTranslate(tw.winX, tw.winY); - crop.set(tw.winCrop); - - // Fade in the app window. - float alpha = getValue(0f, 1f, 0, alphaDuration, - appAnimator.getDuration() * percent, Interpolators.LINEAR); - - TransactionCompat t = new TransactionCompat(); - for (RemoteAnimationTargetCompat target : targets) { - if (target.mode == RemoteAnimationTargetCompat.MODE_OPENING) { - t.setAlpha(target.leash, alpha); - - // TODO: This isn't correct at the beginning of the animation, but better - // than nothing. - matrix.postTranslate(target.position.x, target.position.y); - t.setMatrix(target.leash, matrix); - t.setWindowCrop(target.leash, crop); - - if (!skipLauncherChanges) { - t.deferTransactionUntil(target.leash, surface, frameNumber); - } - } - if (isFirstFrame) { - t.show(target.leash); - } - } - t.setEarlyWakeup(); - t.apply(); - - matrix.reset(); - isFirstFrame = false; - } - }); - return appAnimator; - } - - /** * Content is everything on screen except the background and the floating view (if any). * - * @param show If true: Animate the content so that it moves upwards and fades in. - * Else: Animate the content so that it moves downwards and fades out. + * @param isAppOpening True when this is called when an app is opening. + * False when this is called when an app is closing. */ - private AnimatorSet getLauncherContentAnimator(boolean show) { + private Pair<AnimatorSet, Runnable> getLauncherContentAnimator(boolean isAppOpening) { AnimatorSet launcherAnimator = new AnimatorSet(); + Runnable endListener; - float[] alphas = show - ? new float[] {0, 1} - : new float[] {1, 0}; - float[] trans = show - ? new float[] {mContentTransY, 0,} - : new float[] {0, mContentTransY}; + float[] alphas = isAppOpening + ? new float[] {1, 0} + : new float[] {0, 1}; + float[] trans = isAppOpening + ? new float[] {0, mContentTransY} + : new float[] {-mContentTransY, 0}; - if (mLauncher.isInState(LauncherState.ALL_APPS) && !mDeviceProfile.isVerticalBarLayout()) { + 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(); @@ -399,44 +311,72 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag ObjectAnimator alpha = ObjectAnimator.ofFloat(appsView, View.ALPHA, alphas); alpha.setDuration(217); - alpha.setInterpolator(Interpolators.LINEAR); + alpha.setInterpolator(LINEAR); + appsView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + alpha.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + appsView.setLayerType(View.LAYER_TYPE_NONE, null); + } + }); ObjectAnimator transY = ObjectAnimator.ofFloat(appsView, View.TRANSLATION_Y, trans); - transY.setInterpolator(Interpolators.AGGRESSIVE_EASE); + transY.setInterpolator(AGGRESSIVE_EASE); transY.setDuration(350); launcherAnimator.play(alpha); launcherAnimator.play(transY); - launcherAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - appsView.setAlpha(startAlpha); - appsView.setTranslationY(startY); - } - }); + endListener = () -> { + appsView.setAlpha(startAlpha); + appsView.setTranslationY(startY); + appsView.setLayerType(View.LAYER_TYPE_NONE, null); + }; + } else if (mLauncher.isInState(OVERVIEW)) { + AllAppsTransitionController allAppsController = mLauncher.getAllAppsController(); + launcherAnimator.play(ObjectAnimator.ofFloat(allAppsController, ALL_APPS_PROGRESS, + allAppsController.getProgress(), ALL_APPS_PROGRESS_OFF_SCREEN)); + + View overview = mLauncher.getOverviewPanelContainer(); + ObjectAnimator alpha = ObjectAnimator.ofFloat(overview, View.ALPHA, alphas); + alpha.setDuration(217); + alpha.setInterpolator(LINEAR); + launcherAnimator.play(alpha); + + ObjectAnimator transY = ObjectAnimator.ofFloat(overview, View.TRANSLATION_Y, trans); + transY.setInterpolator(AGGRESSIVE_EASE); + transY.setDuration(350); + launcherAnimator.play(transY); + + overview.setLayerType(View.LAYER_TYPE_HARDWARE, null); + + endListener = () -> { + overview.setLayerType(View.LAYER_TYPE_NONE, null); + overview.setAlpha(1f); + overview.setTranslationY(0f); + mLauncher.getStateManager().reapplyState(); + }; } else { - mDragLayer.setAlpha(alphas[0]); + mDragLayerAlpha.setValue(alphas[0]); + ObjectAnimator alpha = + ObjectAnimator.ofFloat(mDragLayerAlpha, MultiValueAlpha.VALUE, alphas); + alpha.setDuration(217); + alpha.setInterpolator(LINEAR); + launcherAnimator.play(alpha); + mDragLayer.setTranslationY(trans[0]); + ObjectAnimator transY = ObjectAnimator.ofFloat(mDragLayer, View.TRANSLATION_Y, trans); + transY.setInterpolator(AGGRESSIVE_EASE); + transY.setDuration(350); + launcherAnimator.play(transY); - ObjectAnimator dragLayerAlpha = ObjectAnimator.ofFloat(mDragLayer, View.ALPHA, alphas); - dragLayerAlpha.setDuration(217); - dragLayerAlpha.setInterpolator(Interpolators.LINEAR); - ObjectAnimator dragLayerTransY = ObjectAnimator.ofFloat(mDragLayer, View.TRANSLATION_Y, - trans); - dragLayerTransY.setInterpolator(Interpolators.AGGRESSIVE_EASE); - dragLayerTransY.setDuration(350); - - launcherAnimator.play(dragLayerAlpha); - launcherAnimator.play(dragLayerTransY); - launcherAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mDragLayer.setAlpha(1); - mDragLayer.setTranslationY(0); - } - }); + mDragLayer.getScrim().hideSysUiScrim(true); + // Pause page indicator animations as they lead to layer trashing. + mLauncher.getWorkspace().getPageIndicator().pauseAnimations(); + mDragLayer.setLayerType(View.LAYER_TYPE_HARDWARE, null); + + endListener = this::resetContentView; } - return launcherAnimator; + return new Pair<>(launcherAnimator, endListener); } /** @@ -511,12 +451,19 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag ObjectAnimator x = ObjectAnimator.ofFloat(mFloatingView, View.TRANSLATION_X, 0f, dX); ObjectAnimator y = ObjectAnimator.ofFloat(mFloatingView, View.TRANSLATION_Y, 0f, dY); - // Adjust the duration to change the "curve" of the app icon to the center. - boolean isBelowCenterY = lp.topMargin < centerY; - x.setDuration(isBelowCenterY ? APP_LAUNCH_DURATION : APP_LAUNCH_CURVED_DURATION); - y.setDuration(isBelowCenterY ? APP_LAUNCH_CURVED_DURATION : APP_LAUNCH_DURATION); - x.setInterpolator(Interpolators.AGGRESSIVE_EASE); - y.setInterpolator(Interpolators.AGGRESSIVE_EASE); + // Use upward animation for apps that are either on the bottom half of the screen, or are + // relatively close to the center. + boolean useUpwardAnimation = lp.topMargin > centerY + || Math.abs(dY) < mLauncher.getDeviceProfile().cellHeightPx; + if (useUpwardAnimation) { + x.setDuration(APP_LAUNCH_CURVED_DURATION); + y.setDuration(APP_LAUNCH_DURATION); + } else { + x.setDuration((long) (APP_LAUNCH_DOWN_DUR_SCALE_FACTOR * APP_LAUNCH_DURATION)); + y.setDuration((long) (APP_LAUNCH_DOWN_DUR_SCALE_FACTOR * APP_LAUNCH_CURVED_DURATION)); + } + x.setInterpolator(AGGRESSIVE_EASE); + y.setInterpolator(AGGRESSIVE_EASE); appIconAnimatorSet.play(x); appIconAnimatorSet.play(y); @@ -527,14 +474,21 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag float scale = Math.max(maxScaleX, maxScaleY); ObjectAnimator scaleAnim = ObjectAnimator .ofFloat(mFloatingView, SCALE_PROPERTY, startScale, scale); - scaleAnim.setDuration(APP_LAUNCH_DURATION).setInterpolator(Interpolators.EXAGGERATED_EASE); + scaleAnim.setDuration(APP_LAUNCH_DURATION) + .setInterpolator(Interpolators.EXAGGERATED_EASE); appIconAnimatorSet.play(scaleAnim); // Fade out the app icon. ObjectAnimator alpha = ObjectAnimator.ofFloat(mFloatingView, View.ALPHA, 1f, 0f); - alpha.setStartDelay(32); - alpha.setDuration(50); - alpha.setInterpolator(Interpolators.LINEAR); + if (useUpwardAnimation) { + alpha.setStartDelay(APP_LAUNCH_ALPHA_START_DELAY); + alpha.setDuration(APP_LAUNCH_ALPHA_DURATION); + } else { + alpha.setStartDelay((long) (APP_LAUNCH_DOWN_DUR_SCALE_FACTOR + * APP_LAUNCH_ALPHA_START_DELAY)); + alpha.setDuration((long) (APP_LAUNCH_DOWN_DUR_SCALE_FACTOR * APP_LAUNCH_ALPHA_DURATION)); + } + alpha.setInterpolator(LINEAR); appIconAnimatorSet.play(alpha); appIconAnimatorSet.addListener(new AnimatorListenerAdapter() { @@ -551,7 +505,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag /** * @return Animator that controls the window of the opening targets. */ - private ValueAnimator getWindowAnimators(View v, RemoteAnimationTargetCompat[] targets) { + private ValueAnimator getOpeningWindowAnimators(View v, RemoteAnimationTargetCompat[] targets) { Rect bounds = new Rect(); if (v.getParent() instanceof DeepShortcutView) { // Deep shortcut views have their icon drawn in a separate view. @@ -569,11 +523,13 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); appAnimator.setDuration(APP_LAUNCH_DURATION); - appAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + appAnimator.addUpdateListener(new MultiValueUpdateListener() { + // Fade alpha for the app window. + FloatProp mAlpha = new FloatProp(0f, 1f, 0, 60, LINEAR); boolean isFirstFrame = true; @Override - public void onAnimationUpdate(ValueAnimator animation) { + public void onUpdate(float percent) { final Surface surface = getSurface(mFloatingView); final long frameNumber = surface != null ? getNextFrameNumber(surface) : -1; if (frameNumber == -1) { @@ -581,8 +537,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag Log.w(TAG, "Failed to animate, surface got destroyed."); return; } - final float percent = animation.getAnimatedFraction(); - final float easePercent = Interpolators.AGGRESSIVE_EASE.getInterpolation(percent); + final float easePercent = AGGRESSIVE_EASE.getInterpolation(percent); // Calculate app icon size. float iconWidth = bounds.width() * mFloatingView.getScaleX(); @@ -607,11 +562,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag float transY0 = floatingViewBounds[1] - offsetY; matrix.postTranslate(transX0, transY0); - // Fade in the app window. - float alphaDuration = 60; - float alpha = getValue(0f, 1f, 0, alphaDuration, - appAnimator.getDuration() * percent, Interpolators.LINEAR); - // Animate the window crop so that it starts off as a square, and then reveals // horizontally. float cropHeight = deviceHeight * easePercent + deviceWidth * (1 - easePercent); @@ -622,9 +572,13 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag crop.bottom = (int) (crop.top + cropHeight); TransactionCompat t = new TransactionCompat(); + if (isFirstFrame) { + RemoteAnimationProvider.prepareTargetsForFirstFrame(targets, t, MODE_OPENING); + isFirstFrame = false; + } for (RemoteAnimationTargetCompat target : targets) { if (target.mode == MODE_OPENING) { - t.setAlpha(target.leash, alpha); + t.setAlpha(target.leash, mAlpha.value); // TODO: This isn't correct at the beginning of the animation, but better // than nothing. @@ -633,15 +587,11 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag t.setWindowCrop(target.leash, crop); t.deferTransactionUntil(target.leash, surface, getNextFrameNumber(surface)); } - if (isFirstFrame) { - t.show(target.leash); - } } t.setEarlyWakeup(); t.apply(); matrix.reset(); - isFirstFrame = false; } }); return appAnimator; @@ -653,30 +603,19 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag private void registerRemoteAnimations() { // Unregister this if (hasControlRemoteAppTransitionPermission()) { - try { - RemoteAnimationDefinitionCompat definition = new RemoteAnimationDefinitionCompat(); - definition.addRemoteAnimation(WindowManagerWrapper.TRANSIT_WALLPAPER_OPEN, - WindowManagerWrapper.ACTIVITY_TYPE_STANDARD, - new RemoteAnimationAdapterCompat(getWallpaperOpenRunner(), - CLOSING_TRANSITION_DURATION_MS, 0 /* statusBarTransitionDelay */)); - -// TODO: App controlled transition for unlock to home TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER - - new ActivityCompat(mLauncher).registerRemoteAnimations(definition); - } catch (NoClassDefFoundError e) { - // Gracefully fall back if the user's platform doesn't have the latest changes - } + RemoteAnimationDefinitionCompat definition = new RemoteAnimationDefinitionCompat(); + definition.addRemoteAnimation(WindowManagerWrapper.TRANSIT_WALLPAPER_OPEN, + WindowManagerWrapper.ACTIVITY_TYPE_STANDARD, + new RemoteAnimationAdapterCompat(getWallpaperOpenRunner(), + CLOSING_TRANSITION_DURATION_MS, 0 /* statusBarTransitionDelay */)); + + // TODO: Transition for unlock to home TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER + new ActivityCompat(mLauncher).registerRemoteAnimations(definition); } } private boolean launcherIsATargetWithMode(RemoteAnimationTargetCompat[] targets, int mode) { - int launcherTaskId = mLauncher.getTaskId(); - for (RemoteAnimationTargetCompat target : targets) { - if (target.mode == mode && target.taskId == launcherTaskId) { - return true; - } - } - return false; + return taskIsATargetWithMode(targets, mLauncher.getTaskId(), mode); } /** @@ -684,9 +623,18 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag * ie. pressing home, swiping up from nav bar. */ private RemoteAnimationRunnerCompat getWallpaperOpenRunner() { - return new LauncherAnimationRunner(mHandler) { + return new LauncherAnimationRunner(mHandler, false /* startAtFrontOfQueue */) { @Override - public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { + public void onCreateAnimation(RemoteAnimationTargetCompat[] targetCompats, + AnimationResult result) { + if (!mLauncher.hasBeenResumed()) { + // If launcher is not resumed, wait until new async-frame after resume + mLauncher.setOnResumeCallback(() -> + postAsyncCallback(mHandler, () -> + onCreateAnimation(targetCompats, result))); + return; + } + AnimatorSet anim = null; RemoteAnimationProvider provider = mRemoteAnimationProvider; if (provider != null) { @@ -713,8 +661,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag } } - mLauncher.setForceInvisible(false); - return anim; + mLauncher.clearForceInvisibleFlag(INVISIBLE_ALL); + result.setAnimation(anim); } }; } @@ -724,54 +672,41 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag */ private Animator getClosingWindowAnimators(RemoteAnimationTargetCompat[] targets) { Matrix matrix = new Matrix(); - float height = mLauncher.getDeviceProfile().heightPx; - float width = mLauncher.getDeviceProfile().widthPx; - float endX = (mLauncher.<RecentsView>getOverviewPanel().isRtl() ? -width : width) * 1.16f; - ValueAnimator closingAnimator = ValueAnimator.ofFloat(0, 1); - closingAnimator.setDuration(CLOSING_TRANSITION_DURATION_MS); + int duration = CLOSING_TRANSITION_DURATION_MS; + closingAnimator.setDuration(duration); + closingAnimator.addUpdateListener(new MultiValueUpdateListener() { + FloatProp mDy = new FloatProp(0, mClosingWindowTransY, 0, duration, DEACCEL_1_7); + FloatProp mScale = new FloatProp(1f, 1f, 0, duration, DEACCEL_1_7); + FloatProp mAlpha = new FloatProp(1f, 0f, 25, 125, LINEAR); - closingAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { boolean isFirstFrame = true; @Override - public void onAnimationUpdate(ValueAnimator animation) { - final float percent = animation.getAnimatedFraction(); - float currentPlayTime = percent * closingAnimator.getDuration(); - - float scale = getValue(1f, 0.8f, 0, 267, currentPlayTime, - Interpolators.AGGRESSIVE_EASE); - - float dX = getValue(0, endX, 0, 350, currentPlayTime, - Interpolators.AGGRESSIVE_EASE_IN_OUT); - + public void onUpdate(float percent) { TransactionCompat t = new TransactionCompat(); + if (isFirstFrame) { + RemoteAnimationProvider.prepareTargetsForFirstFrame(targets, t, MODE_CLOSING); + isFirstFrame = false; + } for (RemoteAnimationTargetCompat app : targets) { if (app.mode == RemoteAnimationTargetCompat.MODE_CLOSING) { - t.setAlpha(app.leash, getValue(1f, 0f, 0, 350, currentPlayTime, - Interpolators.APP_CLOSE_ALPHA)); - matrix.setScale(scale, scale, + t.setAlpha(app.leash, mAlpha.value); + matrix.setScale(mScale.value, mScale.value, app.sourceContainerBounds.centerX(), app.sourceContainerBounds.centerY()); - matrix.postTranslate(dX, 0); + matrix.postTranslate(0, mDy.value); matrix.postTranslate(app.position.x, app.position.y); t.setMatrix(app.leash, matrix); } - if (isFirstFrame) { - int layer = app.mode == RemoteAnimationTargetCompat.MODE_CLOSING - ? Integer.MAX_VALUE - : app.prefixOrderIndex; - t.setLayer(app.leash, layer); - t.show(app.leash); - } } t.setEarlyWakeup(); t.apply(); matrix.reset(); - isFirstFrame = false; } }); + return closingAnimator; } @@ -779,69 +714,58 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag * Creates an animator that modifies Launcher as a result from {@link #getWallpaperOpenRunner}. */ private void createLauncherResumeAnimation(AnimatorSet anim) { - if (mLauncher.isInState(LauncherState.ALL_APPS) - || mLauncher.getDeviceProfile().isVerticalBarLayout()) { - AnimatorSet contentAnimator = getLauncherContentAnimator(true /* show */); - contentAnimator.setStartDelay(LAUNCHER_RESUME_START_DELAY); - anim.play(contentAnimator); + if (mLauncher.isInState(LauncherState.ALL_APPS)) { + Pair<AnimatorSet, Runnable> contentAnimator = + getLauncherContentAnimator(false /* isAppOpening */); + contentAnimator.first.setStartDelay(LAUNCHER_RESUME_START_DELAY); + anim.play(contentAnimator.first); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + contentAnimator.second.run(); + } + }); } else { AnimatorSet workspaceAnimator = new AnimatorSet(); - mLauncher.getWorkspace().setTranslationY(mWorkspaceTransY); - workspaceAnimator.play(ObjectAnimator.ofFloat(mLauncher.getWorkspace(), - View.TRANSLATION_Y, mWorkspaceTransY, 0)); + mDragLayer.setTranslationY(-mWorkspaceTransY);; + workspaceAnimator.play(ObjectAnimator.ofFloat(mDragLayer, View.TRANSLATION_Y, + -mWorkspaceTransY, 0)); - View currentPage = ((CellLayout) mLauncher.getWorkspace() - .getChildAt(mLauncher.getWorkspace().getCurrentPage())) - .getShortcutsAndWidgets(); - currentPage.setAlpha(0f); - workspaceAnimator.play(ObjectAnimator.ofFloat(currentPage, View.ALPHA, 0, 1f)); + mDragLayerAlpha.setValue(0); + workspaceAnimator.play(ObjectAnimator.ofFloat( + mDragLayerAlpha, MultiValueAlpha.VALUE, 0, 1f)); workspaceAnimator.setStartDelay(LAUNCHER_RESUME_START_DELAY); workspaceAnimator.setDuration(333); - workspaceAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); + workspaceAnimator.setInterpolator(Interpolators.DEACCEL_1_7); - // Animate the shelf in two parts: slide in, and overeshoot. - AllAppsTransitionController allAppsController = mLauncher.getAllAppsController(); - // The shelf will start offscreen - final float startY = ALL_APPS_PROGRESS_OFF_SCREEN; - // And will end slightly pulled up, so that there is something to overshoot back to 1f. - final float slideEnd = ALL_APPS_PROGRESS_OVERSHOOT; - - allAppsController.setProgress(startY); - - Animator allAppsSlideIn = - ObjectAnimator.ofFloat(allAppsController, ALL_APPS_PROGRESS, startY, slideEnd); - allAppsSlideIn.setStartDelay(LAUNCHER_RESUME_START_DELAY); - allAppsSlideIn.setDuration(317); - allAppsSlideIn.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); - - Animator allAppsOvershoot = - ObjectAnimator.ofFloat(allAppsController, ALL_APPS_PROGRESS, slideEnd, 1f); - allAppsOvershoot.setDuration(153); - allAppsOvershoot.setInterpolator(Interpolators.OVERSHOOT_0); + mDragLayer.getScrim().hideSysUiScrim(true); + // Pause page indicator animations as they lead to layer trashing. + mLauncher.getWorkspace().getPageIndicator().pauseAnimations(); + mDragLayer.setLayerType(View.LAYER_TYPE_HARDWARE, null); + workspaceAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + resetContentView(); + } + }); anim.play(workspaceAnimator); - anim.playSequentially(allAppsSlideIn, allAppsOvershoot); - anim.addListener(mReapplyStateListener); } } + private void resetContentView() { + mLauncher.getWorkspace().getPageIndicator().skipAnimationsToEnd(); + mDragLayerAlpha.setValue(1f); + mDragLayer.setLayerType(View.LAYER_TYPE_NONE, null); + mDragLayer.setTranslationY(0f); + mDragLayer.getScrim().hideSysUiScrim(false); + } + private boolean hasControlRemoteAppTransitionPermission() { return mLauncher.checkSelfPermission(CONTROL_REMOTE_APP_TRANSITION_PERMISSION) == PackageManager.PERMISSION_GRANTED; } - - /** - * Helper method that allows us to get interpolated values for embedded - * animations with a delay and/or different duration. - */ - private static float getValue(float start, float end, float delay, float duration, - float currentPlayTime, Interpolator i) { - float time = Math.max(0, currentPlayTime - delay); - float newPercent = Math.min(1f, time / duration); - newPercent = i.getInterpolation(newPercent); - return end * newPercent + start * (1 - newPercent); - } } diff --git a/quickstep/src/com/android/launcher3/LauncherInitListener.java b/quickstep/src/com/android/launcher3/LauncherInitListener.java index 27f169834..e5e377f83 100644 --- a/quickstep/src/com/android/launcher3/LauncherInitListener.java +++ b/quickstep/src/com/android/launcher3/LauncherInitListener.java @@ -24,6 +24,7 @@ import android.os.Handler; import com.android.launcher3.states.InternalStateHandler; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; +import com.android.quickstep.OverviewCallbacks; import com.android.quickstep.util.RemoteAnimationProvider; import java.util.function.BiPredicate; @@ -60,6 +61,7 @@ public class LauncherInitListener extends InternalStateHandler implements Activi return null; }); } + OverviewCallbacks.get(launcher).onInitOverviewTransition(); return mOnInitListener.test(launcher, alreadyOnHome); } diff --git a/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java b/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java index d2f54874f..d86ba6aa6 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java @@ -16,7 +16,6 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherAnimUtils.ALL_APPS_TRANSITION_MS; -import static com.android.launcher3.allapps.DiscoveryBounce.APPS_VIEW_SHOWN; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; import android.view.View; @@ -32,7 +31,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; */ public class AllAppsState extends LauncherState { - private static final int STATE_FLAGS = FLAG_DISABLE_ACCESSIBILITY | FLAG_ALL_APPS_SCRIM; + private static final int STATE_FLAGS = FLAG_DISABLE_ACCESSIBILITY; private static final PageAlphaProvider PAGE_ALPHA_PROVIDER = new PageAlphaProvider(DEACCEL_2) { @Override @@ -47,10 +46,6 @@ public class AllAppsState extends LauncherState { @Override public void onStateEnabled(Launcher launcher) { - if (!launcher.getSharedPrefs().getBoolean(APPS_VIEW_SHOWN, false)) { - launcher.getSharedPrefs().edit().putBoolean(APPS_VIEW_SHOWN, true).apply(); - } - AbstractFloatingView.closeAllOpenViews(launcher); dispatchWindowStateChanged(launcher); } @@ -73,8 +68,10 @@ public class AllAppsState extends LauncherState { @Override public float[] getWorkspaceScaleAndTranslation(Launcher launcher) { - // TODO: interpolate - return LauncherState.OVERVIEW.getWorkspaceScaleAndTranslation(launcher); + float[] scaleAndTranslation = LauncherState.OVERVIEW.getWorkspaceScaleAndTranslation( + launcher); + scaleAndTranslation[0] = 1; + return scaleAndTranslation; } @Override @@ -89,7 +86,7 @@ public class AllAppsState extends LauncherState { @Override public float[] getOverviewScaleAndTranslationYFactor(Launcher launcher) { - return new float[] {1f, -0.2f}; + return new float[] {0.9f, -0.2f}; } @Override diff --git a/quickstep/src/com/android/launcher3/uioverrides/DisplayRotationListener.java b/quickstep/src/com/android/launcher3/uioverrides/DisplayRotationListener.java new file mode 100644 index 000000000..2d9a16147 --- /dev/null +++ b/quickstep/src/com/android/launcher3/uioverrides/DisplayRotationListener.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2018 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.uioverrides; + +import android.content.Context; +import android.os.Handler; + +import com.android.systemui.shared.system.RotationWatcher; + +/** + * Utility class for listening for rotation changes + */ +public class DisplayRotationListener extends RotationWatcher { + + private final Runnable mCallback; + private Handler mHandler; + + public DisplayRotationListener(Context context, Runnable callback) { + super(context); + mCallback = callback; + } + + @Override + public void enable() { + if (mHandler == null) { + mHandler = new Handler(); + } + super.enable(); + } + + @Override + protected void onRotationChanged(int i) { + mHandler.post(mCallback); + } +} diff --git a/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java index f98f7a5ff..a11625a34 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java @@ -15,7 +15,6 @@ */ package com.android.launcher3.uioverrides; -import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.quickstep.QuickScrubController; import com.android.quickstep.views.RecentsView; @@ -25,11 +24,11 @@ import com.android.quickstep.views.RecentsView; */ public class FastOverviewState extends OverviewState { - private static final int STATE_FLAGS = FLAG_SHOW_SCRIM | FLAG_DISABLE_RESTORE - | FLAG_DISABLE_INTERACTION | FLAG_OVERVIEW_UI | FLAG_HIDE_BACK_BUTTON; + private static final int STATE_FLAGS = FLAG_DISABLE_RESTORE | FLAG_DISABLE_INTERACTION + | FLAG_OVERVIEW_UI | FLAG_HIDE_BACK_BUTTON | FLAG_DISABLE_ACCESSIBILITY; public FastOverviewState(int id) { - super(id, QuickScrubController.QUICK_SCRUB_START_DURATION, STATE_FLAGS); + super(id, QuickScrubController.QUICK_SCRUB_FROM_HOME_START_DURATION, STATE_FLAGS); } @Override @@ -39,11 +38,6 @@ public class FastOverviewState extends OverviewState { recentsView.getQuickScrubController().onFinishedTransitionToQuickScrub(); } - public void onStateEnabled(Launcher launcher) { - super.onStateEnabled(launcher); - AbstractFloatingView.closeAllOpenViews(launcher); - } - @Override public int getVisibleElements(Launcher launcher) { return NONE; diff --git a/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java b/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java index 3622fc425..68773b418 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java @@ -9,16 +9,20 @@ import android.view.MotionEvent; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; +import com.android.launcher3.LauncherStateManager.AnimationComponents; import com.android.launcher3.touch.AbstractStateChangeTouchController; import com.android.launcher3.touch.SwipeDetector; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; -import com.android.quickstep.util.SysuiEventLogger; +import com.android.quickstep.RecentsModel; /** * Touch controller for handling edge swipes in landscape/seascape UI */ public class LandscapeEdgeSwipeController extends AbstractStateChangeTouchController { + private static final String TAG = "LandscapeEdgeSwipeCtrl"; + public LandscapeEdgeSwipeController(Launcher l) { super(l, SwipeDetector.HORIZONTAL); } @@ -36,27 +40,27 @@ public class LandscapeEdgeSwipeController extends AbstractStateChangeTouchContro } @Override - protected int getSwipeDirection(MotionEvent ev) { - return SwipeDetector.DIRECTION_BOTH; - } - - @Override protected LauncherState getTargetState(LauncherState fromState, boolean isDragTowardPositive) { boolean draggingFromNav = mLauncher.getDeviceProfile().isSeascape() != isDragTowardPositive; return draggingFromNav ? OVERVIEW : NORMAL; } @Override + protected int getLogContainerTypeForNormalState() { + return LauncherLogProto.ContainerType.NAVBAR; + } + + @Override protected float getShiftRange() { return mLauncher.getDragLayer().getWidth(); } @Override - protected float initCurrentAnimation() { + protected float initCurrentAnimation(@AnimationComponents int animComponent) { float range = getShiftRange(); long maxAccuracy = (long) (2 * range); - mCurrentAnimation = mLauncher.getStateManager() - .createAnimationToNewWorkspace(mToState, maxAccuracy); + mCurrentAnimation = mLauncher.getStateManager().createAnimationToNewWorkspace(mToState, + maxAccuracy, animComponent); return (mLauncher.getDeviceProfile().isSeascape() ? 2 : -2) / range; } @@ -69,7 +73,7 @@ public class LandscapeEdgeSwipeController extends AbstractStateChangeTouchContro protected void onSwipeInteractionCompleted(LauncherState targetState, int logAction) { super.onSwipeInteractionCompleted(targetState, logAction); if (mFromState == NORMAL && targetState == OVERVIEW) { - SysuiEventLogger.writeDummyRecentsTransition(0); + RecentsModel.getInstance(mLauncher).onOverviewShown(true, TAG); } } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java index 9c7db3093..3a49294c5 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java @@ -21,9 +21,12 @@ import static com.android.launcher3.states.RotationHelper.REQUEST_ROTATE; import android.view.View; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; +import com.android.launcher3.Workspace; +import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.quickstep.views.RecentsView; @@ -32,8 +35,8 @@ import com.android.quickstep.views.RecentsView; */ public class OverviewState extends LauncherState { - private static final int STATE_FLAGS = FLAG_SHOW_SCRIM | FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED - | FLAG_DISABLE_RESTORE | FLAG_OVERVIEW_UI; + private static final int STATE_FLAGS = FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED + | FLAG_DISABLE_RESTORE | FLAG_OVERVIEW_UI | FLAG_DISABLE_ACCESSIBILITY; public OverviewState(int id) { this(id, OVERVIEW_TRANSITION_MS, STATE_FLAGS); @@ -45,8 +48,15 @@ public class OverviewState extends LauncherState { @Override public float[] getWorkspaceScaleAndTranslation(Launcher launcher) { - // TODO: provide a valid value - return new float[]{1, 0, -launcher.getDeviceProfile().hotseatBarSizePx / 2}; + RecentsView recentsView = launcher.getOverviewPanel(); + Workspace workspace = launcher.getWorkspace(); + View workspacePage = workspace.getPageAt(workspace.getCurrentPage()); + float workspacePageWidth = workspacePage != null && workspacePage.getWidth() != 0 + ? workspacePage.getWidth() : launcher.getDeviceProfile().availableWidthPx; + recentsView.getTaskSize(sTempRect); + float scale = (float) sTempRect.width() / workspacePageWidth; + float parallaxFactor = 0.5f; + return new float[]{scale, 0, -getDefaultSwipeHeight(launcher) * parallaxFactor}; } @Override @@ -58,6 +68,7 @@ public class OverviewState extends LauncherState { public void onStateEnabled(Launcher launcher) { RecentsView rv = launcher.getOverviewPanel(); rv.setOverviewStateEnabled(true); + AbstractFloatingView.closeAllOpenViews(launcher); } @Override @@ -69,6 +80,7 @@ public class OverviewState extends LauncherState { @Override public void onStateTransitionEnd(Launcher launcher) { launcher.getRotationHelper().setCurrentStateRequest(REQUEST_ROTATE); + DiscoveryBounce.showForOverviewIfNeeded(launcher); } @Override @@ -88,15 +100,20 @@ public class OverviewState extends LauncherState { @Override public int getVisibleElements(Launcher launcher) { if (launcher.getDeviceProfile().isVerticalBarLayout()) { - return DRAG_HANDLE_INDICATOR; + return 0; } else { - return HOTSEAT_SEARCH_BOX | DRAG_HANDLE_INDICATOR | + return HOTSEAT_SEARCH_BOX | (launcher.getAppsView().getFloatingHeaderView().hasVisibleContent() ? ALL_APPS_HEADER_EXTRA : HOTSEAT_ICONS); } } @Override + public float getWorkspaceScrimAlpha(Launcher launcher) { + return 0.5f; + } + + @Override public float getVerticalProgress(Launcher launcher) { if ((getVisibleElements(launcher) & ALL_APPS_HEADER_EXTRA) == 0) { // We have no all apps content, so we're still at the fully down progress. diff --git a/quickstep/src/com/android/launcher3/uioverrides/LandscapeStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewToAllAppsTouchController.java index 30ceb43f9..0f9b57f03 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/LandscapeStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewToAllAppsTouchController.java @@ -24,15 +24,18 @@ import android.view.MotionEvent; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.quickstep.TouchInteractionService; import com.android.quickstep.views.RecentsView; /** - * Touch controller from going from OVERVIEW to ALL_APPS + * Touch controller from going from OVERVIEW to ALL_APPS. + * + * This is used in landscape mode. It is also used in portrait mode for the fallback recents. */ -public class LandscapeStatesTouchController extends PortraitStatesTouchController { +public class OverviewToAllAppsTouchController extends PortraitStatesTouchController { - public LandscapeStatesTouchController(Launcher l) { + public OverviewToAllAppsTouchController(Launcher l) { super(l); } @@ -69,4 +72,9 @@ public class LandscapeStatesTouchController extends PortraitStatesTouchControlle } return fromState; } + + @Override + protected int getLogContainerTypeForNormalState() { + return LauncherLogProto.ContainerType.WORKSPACE; + } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java index 012b54521..987f952ba 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java @@ -18,20 +18,20 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; -import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_TRANSLATION; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_VERTICAL_PROGRESS; -import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.LINEAR; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.view.MotionEvent; import android.view.animation.Interpolator; +import android.view.animation.OvershootInterpolator; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; +import com.android.launcher3.LauncherStateManager.AnimationComponents; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.AnimatorSetBuilder; import com.android.launcher3.anim.Interpolators; @@ -39,8 +39,8 @@ import com.android.launcher3.touch.AbstractStateChangeTouchController; import com.android.launcher3.touch.SwipeDetector; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.quickstep.RecentsModel; import com.android.quickstep.TouchInteractionService; -import com.android.quickstep.util.SysuiEventLogger; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; @@ -49,43 +49,13 @@ import com.android.quickstep.views.TaskView; */ public class PortraitStatesTouchController extends AbstractStateChangeTouchController { - private static final float TOTAL_DISTANCE_MULTIPLIER = 3f; - private static final float LINEAR_SCALE_LIMIT = 1 / TOTAL_DISTANCE_MULTIPLIER; - - // Must be greater than LINEAR_SCALE_LIMIT; - private static final float MAXIMUM_DISTANCE_FACTOR = 0.9f; - - // Maximum amount to overshoot. - private static final float MAX_OVERSHOOT = 0.3f; - - private static final double PI_BY_2 = Math.PI / 2; + private static final String TAG = "PortraitStatesTouchCtrl"; private InterpolatorWrapper mAllAppsInterpolatorWrapper = new InterpolatorWrapper(); // If true, we will finish the current animation instantly on second touch. private boolean mFinishFastOnSecondTouch; - private final Interpolator mAllAppsDampedInterpolator = new Interpolator() { - - private final double mAngleMultiplier = Math.PI / - (2 * (MAXIMUM_DISTANCE_FACTOR - LINEAR_SCALE_LIMIT)); - - @Override - public float getInterpolation(float v) { - if (v <= LINEAR_SCALE_LIMIT) { - return v * TOTAL_DISTANCE_MULTIPLIER; - } - float overshoot = (v - LINEAR_SCALE_LIMIT); - return (float) (1 + MAX_OVERSHOOT * Math.sin(overshoot * mAngleMultiplier)); - } - }; - - private final Interpolator mOverviewBoundInterpolator = (v) -> { - if (v >= MAXIMUM_DISTANCE_FACTOR) { - return 1; - } - return FAST_OUT_SLOW_IN.getInterpolation(v / MAXIMUM_DISTANCE_FACTOR); - }; public PortraitStatesTouchController(Launcher l) { super(l, SwipeDetector.VERTICAL); @@ -122,24 +92,6 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr } @Override - protected int getSwipeDirection(MotionEvent ev) { - final int directionsToDetectScroll; - if (mLauncher.isInState(ALL_APPS)) { - directionsToDetectScroll = SwipeDetector.DIRECTION_NEGATIVE; - mStartContainerType = ContainerType.ALLAPPS; - } else if (mLauncher.isInState(NORMAL)) { - directionsToDetectScroll = SwipeDetector.DIRECTION_POSITIVE; - mStartContainerType = ContainerType.HOTSEAT; - } else if (mLauncher.isInState(OVERVIEW)) { - directionsToDetectScroll = SwipeDetector.DIRECTION_BOTH; - mStartContainerType = ContainerType.TASKSWITCHER; - } else { - return 0; - } - return directionsToDetectScroll; - } - - @Override protected LauncherState getTargetState(LauncherState fromState, boolean isDragTowardPositive) { if (fromState == ALL_APPS && !isDragTowardPositive) { // Should swipe down go to OVERVIEW instead? @@ -147,24 +99,28 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr mLauncher.getStateManager().getLastState() : NORMAL; } else if (fromState == OVERVIEW) { return isDragTowardPositive ? ALL_APPS : NORMAL; - } else if (isDragTowardPositive) { + } else if (fromState == NORMAL && isDragTowardPositive) { return TouchInteractionService.isConnected() ? OVERVIEW : ALL_APPS; } return fromState; } + @Override + protected int getLogContainerTypeForNormalState() { + return ContainerType.HOTSEAT; + } + private AnimatorSetBuilder getNormalToOverviewAnimation() { - mAllAppsInterpolatorWrapper.baseInterpolator = mAllAppsDampedInterpolator; + mAllAppsInterpolatorWrapper.baseInterpolator = LINEAR; AnimatorSetBuilder builder = new AnimatorSetBuilder(); builder.setInterpolator(ANIM_VERTICAL_PROGRESS, mAllAppsInterpolatorWrapper); - builder.setInterpolator(ANIM_OVERVIEW_TRANSLATION, mOverviewBoundInterpolator); return builder; } @Override - protected float initCurrentAnimation() { + protected float initCurrentAnimation(@AnimationComponents int animComponents) { float range = getShiftRange(); long maxAccuracy = (long) (2 * range); @@ -177,15 +133,11 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr if (mFromState == NORMAL && mToState == OVERVIEW && totalShift != 0) { builder = getNormalToOverviewAnimation(); - totalShift = totalShift * TOTAL_DISTANCE_MULTIPLIER; } else { builder = new AnimatorSetBuilder(); } - if (mPendingAnimation != null) { - mPendingAnimation.finish(false, Touch.SWIPE); - mPendingAnimation = null; - } + cancelPendingAnim(); RecentsView recentsView = mLauncher.getOverviewPanel(); TaskView taskView = (TaskView) recentsView.getChildAt(recentsView.getNextPage()); @@ -194,10 +146,17 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr mPendingAnimation = recentsView.createTaskLauncherAnimation(taskView, maxAccuracy); mPendingAnimation.anim.setInterpolator(Interpolators.ZOOM_IN); - mCurrentAnimation = AnimatorPlaybackController.wrap(mPendingAnimation.anim, maxAccuracy); + Runnable onCancelRunnable = () -> { + cancelPendingAnim(); + clearState(); + }; + mCurrentAnimation = AnimatorPlaybackController.wrap(mPendingAnimation.anim, maxAccuracy, + onCancelRunnable); + mLauncher.getStateManager().setCurrentUserControlledAnimation(mCurrentAnimation); } else { mCurrentAnimation = mLauncher.getStateManager() - .createAnimationToNewWorkspace(mToState, builder, maxAccuracy); + .createAnimationToNewWorkspace(mToState, builder, maxAccuracy, this::clearState, + animComponents); } if (totalShift == 0) { @@ -207,12 +166,19 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr return 1 / totalShift; } + private void cancelPendingAnim() { + if (mPendingAnimation != null) { + mPendingAnimation.finish(false, Touch.SWIPE); + mPendingAnimation = null; + } + } + @Override protected void updateSwipeCompleteAnimation(ValueAnimator animator, long expectedDuration, LauncherState targetState, float velocity, boolean isFling) { - handleFirstSwipeToOverview(animator, expectedDuration, targetState, velocity, isFling); super.updateSwipeCompleteAnimation(animator, expectedDuration, targetState, velocity, isFling); + handleFirstSwipeToOverview(animator, expectedDuration, targetState, velocity, isFling); } private void handleFirstSwipeToOverview(final ValueAnimator animator, @@ -220,69 +186,24 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr final boolean isFling) { if (mFromState == NORMAL && mToState == OVERVIEW && targetState == OVERVIEW) { mFinishFastOnSecondTouch = true; - - // Update all apps interpolator - float currentFraction = mCurrentAnimation.getProgressFraction(); - float absVelocity = Math.abs(velocity); - float currentValue = mAllAppsDampedInterpolator.getInterpolation(currentFraction); - - if (isFling && absVelocity > 1 && currentFraction < LINEAR_SCALE_LIMIT) { - - // TODO: Clean up these magic calculations - // Linearly interpolate the max value based on the velocity. - float maxValue = Math.max(absVelocity > 4 ? 1 + MAX_OVERSHOOT : - 1 + (absVelocity - 1) * MAX_OVERSHOOT / 3, - currentValue); - double angleToPeak = PI_BY_2 - Math.asin(currentValue / maxValue); - - if (expectedDuration != 0 && angleToPeak != 0) { - - float distanceLeft = 1 - currentFraction; - mAllAppsInterpolatorWrapper.baseInterpolator = (f) -> { - float scaledF = (f - currentFraction) / distanceLeft; - - if (scaledF < 0.5f) { - double angle = PI_BY_2 - angleToPeak + scaledF * angleToPeak / 0.5f; - return (float) (maxValue * Math.sin(angle)); - } - - scaledF = ((scaledF - .5f) / .5f); - double angle = PI_BY_2 + 3 * scaledF * PI_BY_2; - float amplitude = (1 - scaledF) * (1 - scaledF) * (maxValue - 1); - return 1 + (float) (amplitude * Math.sin(angle)); - }; - - animator.setDuration(expectedDuration).setInterpolator(LINEAR); - return; - } + if (isFling && expectedDuration != 0) { + // Update all apps interpolator to add a bit of overshoot starting from currFraction + final float currFraction = mCurrentAnimation.getProgressFraction(); + mAllAppsInterpolatorWrapper.baseInterpolator = Interpolators.clampToProgress( + new OvershootInterpolator(Math.min(Math.abs(velocity), 3f)), currFraction, 1); + animator.setDuration(Math.min(expectedDuration, ATOMIC_DURATION)) + .setInterpolator(LINEAR); } - - if (currentFraction < LINEAR_SCALE_LIMIT) { - mAllAppsInterpolatorWrapper.baseInterpolator = LINEAR; - return; - } - float extraValue = mAllAppsDampedInterpolator.getInterpolation(currentFraction) - 1; - float distanceLeft = 1 - currentFraction; - - animator.setFloatValues(currentFraction, 1); - mAllAppsInterpolatorWrapper.baseInterpolator = (f) -> { - float scaledF = (f - currentFraction) / distanceLeft; - - double angle = scaledF * 1.5 * Math.PI; - float amplitude = (1 - scaledF) * (1 - scaledF) * extraValue; - return 1 + (float) (amplitude * Math.sin(angle)); - }; - animator.setDuration(200).setInterpolator(LINEAR); - return; + } else { + mFinishFastOnSecondTouch = false; } - mFinishFastOnSecondTouch = false; } @Override protected void onSwipeInteractionCompleted(LauncherState targetState, int logAction) { super.onSwipeInteractionCompleted(targetState, logAction); if (mFromState == NORMAL && targetState == OVERVIEW) { - SysuiEventLogger.writeDummyRecentsTransition(0); + RecentsModel.getInstance(mLauncher).onOverviewShown(true, TAG); } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java index 124ec202d..e43b24a6a 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java @@ -15,39 +15,49 @@ */ package com.android.launcher3.uioverrides; -import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_TRANSLATION; +import static com.android.launcher3.LauncherState.FAST_OVERVIEW; +import static com.android.launcher3.LauncherState.OVERVIEW; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_FADE; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_SCALE; import static com.android.launcher3.anim.Interpolators.AGGRESSIVE_EASE_IN_OUT; import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_START_INTERPOLATOR; +import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_TRANSLATION_Y_FACTOR; import static com.android.quickstep.views.LauncherRecentsView.TRANSLATION_Y_FACTOR; import static com.android.quickstep.views.RecentsView.ADJACENT_SCALE; -import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA; +import static com.android.quickstep.views.RecentsViewContainer.CONTENT_ALPHA; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.os.Build; +import android.view.animation.Interpolator; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherStateManager.AnimationConfig; import com.android.launcher3.LauncherStateManager.StateHandler; import com.android.launcher3.anim.AnimatorSetBuilder; +import com.android.launcher3.anim.Interpolators; import com.android.launcher3.anim.PropertySetter; import com.android.quickstep.views.LauncherRecentsView; +import com.android.quickstep.views.RecentsViewContainer; @TargetApi(Build.VERSION_CODES.O) public class RecentsViewStateController implements StateHandler { private final Launcher mLauncher; private final LauncherRecentsView mRecentsView; + private final RecentsViewContainer mRecentsViewContainer; public RecentsViewStateController(Launcher launcher) { mLauncher = launcher; mRecentsView = launcher.getOverviewPanel(); + mRecentsViewContainer = launcher.getOverviewPanelContainer(); } @Override public void setState(LauncherState state) { - mRecentsView.setContentAlpha(state.overviewUi ? 1 : 0); + mRecentsViewContainer.setContentAlpha(state.overviewUi ? 1 : 0); float[] scaleTranslationYFactor = state.getOverviewScaleAndTranslationYFactor(mLauncher); mRecentsView.setAdjacentScale(scaleTranslationYFactor[0]); mRecentsView.setTranslationYFactor(scaleTranslationYFactor[1]); @@ -60,14 +70,23 @@ public class RecentsViewStateController implements StateHandler { @Override public void setStateWithAnimation(final LauncherState toState, AnimatorSetBuilder builder, AnimationConfig config) { - PropertySetter setter = config.getProperSetter(builder); + if (!config.playAtomicComponent()) { + // The entire recents animation is played atomically. + return; + } + PropertySetter setter = config.getPropertySetter(builder); float[] scaleTranslationYFactor = toState.getOverviewScaleAndTranslationYFactor(mLauncher); - setter.setFloat(mRecentsView, ADJACENT_SCALE, scaleTranslationYFactor[0], - builder.getInterpolator(ANIM_OVERVIEW_TRANSLATION, LINEAR)); + Interpolator scaleInterpolator = builder.getInterpolator(ANIM_OVERVIEW_SCALE, LINEAR); + setter.setFloat(mRecentsView, ADJACENT_SCALE, scaleTranslationYFactor[0], scaleInterpolator); + Interpolator transYInterpolator = scaleInterpolator; + if (mLauncher.getStateManager().getState() == OVERVIEW && toState == FAST_OVERVIEW) { + transYInterpolator = Interpolators.clampToProgress(QUICK_SCRUB_START_INTERPOLATOR, 0, + QUICK_SCRUB_TRANSLATION_Y_FACTOR); + } setter.setFloat(mRecentsView, TRANSLATION_Y_FACTOR, scaleTranslationYFactor[1], - builder.getInterpolator(ANIM_OVERVIEW_TRANSLATION, LINEAR)); - setter.setFloat(mRecentsView, CONTENT_ALPHA, toState.overviewUi ? 1 : 0, - AGGRESSIVE_EASE_IN_OUT); + transYInterpolator); + setter.setFloat(mRecentsViewContainer, CONTENT_ALPHA, toState.overviewUi ? 1 : 0, + builder.getInterpolator(ANIM_OVERVIEW_FADE, AGGRESSIVE_EASE_IN_OUT)); if (!toState.overviewUi) { builder.addOnFinishRunnable(mRecentsView::resetTaskVisuals); diff --git a/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java index 84a60bd9a..a40573500 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java @@ -15,25 +15,27 @@ */ package com.android.launcher3.uioverrides; +import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; -import android.util.Log; import android.view.MotionEvent; -import android.view.View; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; +import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.touch.SwipeDetector; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; +import com.android.launcher3.util.FlingBlockCheck; import com.android.launcher3.util.PendingAnimation; import com.android.launcher3.util.TouchController; import com.android.launcher3.views.BaseDragLayer; +import com.android.quickstep.OverviewInteractionState; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; @@ -45,9 +47,6 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> private static final String TAG = "OverviewSwipeController"; - private static final float ALLOWED_FLING_DIRECTION_CHANGE_PROGRESS = 0.1f; - private static final int SINGLE_FRAME_MS = 16; - // Progress after which the transition is assumed to be a success in case user does not fling private static final float SUCCESS_TRANSITION_PROGRESS = 0.5f; @@ -65,6 +64,7 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> private float mDisplacementShift; private float mProgressMultiplier; private float mEndDisplacement; + private FlingBlockCheck mFlingBlockCheck = new FlingBlockCheck(); private TaskView mTaskBeingDragged; @@ -87,12 +87,13 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> protected abstract boolean isRecentsInteractive(); + protected void onUserControlledAnimationCreated(AnimatorPlaybackController animController) { + } + @Override public void onAnimationCancel(Animator animation) { if (mCurrentAnimation != null && animation == mCurrentAnimation.getTarget()) { - Log.e(TAG, "Who dare cancel the animation when I am in control", new Exception()); - mDetector.finishedScrolling(); - mCurrentAnimation = null; + clearState(); } } @@ -106,7 +107,7 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> // Now figure out which direction scroll events the controller will start // calling the callbacks. - final int directionsToDetectScroll; + int directionsToDetectScroll = 0; boolean ignoreSlopWhenSettling = false; if (mCurrentAnimation != null) { directionsToDetectScroll = SwipeDetector.DIRECTION_BOTH; @@ -114,12 +115,26 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> } else { mTaskBeingDragged = null; - View view = mRecentsView.getChildAt(mRecentsView.getCurrentPage()); - if (view instanceof TaskView && mActivity.getDragLayer().isEventOverView(view, ev)) { - // The tile can be dragged down to open the task. - mTaskBeingDragged = (TaskView) view; - directionsToDetectScroll = SwipeDetector.DIRECTION_BOTH; - } else { + for (int i = 0; i < mRecentsView.getChildCount(); i++) { + TaskView view = mRecentsView.getPageAt(i); + if (mRecentsView.isTaskViewVisible(view) && mActivity.getDragLayer() + .isEventOverView(view, ev)) { + mTaskBeingDragged = view; + if (!OverviewInteractionState.getInstance(mActivity) + .isSwipeUpGestureEnabled()) { + // Don't allow swipe down to open if we don't support swipe up + // to enter overview. + directionsToDetectScroll = SwipeDetector.DIRECTION_POSITIVE; + } else { + // The task can be dragged up to dismiss it, + // and down to open if it's the current page. + directionsToDetectScroll = i == mRecentsView.getCurrentPage() + ? SwipeDetector.DIRECTION_BOTH : SwipeDetector.DIRECTION_POSITIVE; + } + break; + } + } + if (mTaskBeingDragged == null) { mNoIntercept = true; return false; } @@ -147,6 +162,12 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> // No need to init return; } + int scrollDirections = mDetector.getScrollDirections(); + if (goingUp && ((scrollDirections & SwipeDetector.DIRECTION_POSITIVE) == 0) + || !goingUp && ((scrollDirections & SwipeDetector.DIRECTION_NEGATIVE) == 0)) { + // Trying to re-init in an unsupported direction. + return; + } if (mCurrentAnimation != null) { mCurrentAnimation.setPlayFraction(0); } @@ -174,8 +195,12 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> mEndDisplacement = dl.getHeight() - mTempCords[1]; } + if (mCurrentAnimation != null) { + mCurrentAnimation.setOnCancelRunnable(null); + } mCurrentAnimation = AnimatorPlaybackController - .wrap(mPendingAnimation.anim, maxDuration); + .wrap(mPendingAnimation.anim, maxDuration, this::clearState); + onUserControlledAnimationCreated(mCurrentAnimation); mCurrentAnimation.getTarget().addListener(this); mCurrentAnimation.dispatchOnStart(); mProgressMultiplier = 1 / mEndDisplacement; @@ -190,6 +215,7 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> mDisplacementShift = mCurrentAnimation.getProgressFraction() / mProgressMultiplier; mCurrentAnimation.pause(); } + mFlingBlockCheck.unblockFling(); } @Override @@ -199,6 +225,9 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> totalDisplacement == 0 ? mCurrentAnimationIsGoingUp : totalDisplacement < 0; if (isGoingUp != mCurrentAnimationIsGoingUp) { reInitAnimationController(isGoingUp); + mFlingBlockCheck.blockFling(); + } else { + mFlingBlockCheck.onEvent(); } mCurrentAnimation.setPlayFraction(totalDisplacement * mProgressMultiplier); return true; @@ -208,23 +237,14 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> public void onDragEnd(float velocity, boolean fling) { final boolean goingToEnd; final int logAction; + boolean blockedFling = fling && mFlingBlockCheck.isBlocked(); + if (blockedFling) { + fling = false; + } if (fling) { logAction = Touch.FLING; boolean goingUp = velocity < 0; - if (goingUp != mCurrentAnimationIsGoingUp) { - // In case the fling is in opposite direction, make sure if is close enough - // from the start position - if (mCurrentAnimation.getProgressFraction() - >= ALLOWED_FLING_DIRECTION_CHANGE_PROGRESS) { - // Not allowed - goingToEnd = false; - } else { - reInitAnimationController(goingUp); - goingToEnd = true; - } - } else { - goingToEnd = true; - } + goingToEnd = goingUp == mCurrentAnimationIsGoingUp; } else { logAction = Touch.SWIPE; goingToEnd = mCurrentAnimation.getProgressFraction() > SUCCESS_TRANSITION_PROGRESS; @@ -233,6 +253,9 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> float progress = mCurrentAnimation.getProgressFraction(); long animationDuration = SwipeDetector.calculateDuration( velocity, goingToEnd ? (1 - progress) : progress); + if (blockedFling && !goingToEnd) { + animationDuration *= LauncherAnimUtils.blockedFlingDurationFactor(velocity); + } float nextFrameProgress = Utilities.boundToRange( progress + velocity * SINGLE_FRAME_MS / Math.abs(mEndDisplacement), 0f, 1f); @@ -251,8 +274,17 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity> mPendingAnimation.finish(wasSuccess, logAction); mPendingAnimation = null; } + clearState(); + } + + private void clearState() { mDetector.finishedScrolling(); + mDetector.setDetectableScrollConditions(0, false); mTaskBeingDragged = null; mCurrentAnimation = null; + if (mPendingAnimation != null) { + mPendingAnimation.finish(false, Touch.SWIPE); + mPendingAnimation = null; + } } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index c1590f63d..b371677f3 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -16,51 +16,67 @@ package com.android.launcher3.uioverrides; +import static android.view.View.VISIBLE; +import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; +import static com.android.launcher3.AbstractFloatingView.TYPE_HIDE_BACK_BUTTON; +import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; -import static com.android.launcher3.Utilities.getPrefs; -import static com.android.quickstep.OverviewInteractionState.KEY_SWIPE_UP_ENABLED; -import static com.android.launcher3.LauncherState.ALL_APPS; +import static com.android.launcher3.allapps.DiscoveryBounce.HOME_BOUNCE_SEEN; +import static com.android.launcher3.allapps.DiscoveryBounce.SHELF_BOUNCE_SEEN; +import android.app.Activity; import android.content.Context; -import android.content.SharedPreferences; +import android.util.Base64; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; +import com.android.launcher3.LauncherStateManager; import com.android.launcher3.LauncherStateManager.StateHandler; +import com.android.launcher3.Utilities; +import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.util.TouchController; import com.android.quickstep.OverviewInteractionState; import com.android.quickstep.RecentsModel; import com.android.quickstep.views.RecentsView; +import com.android.systemui.shared.system.ActivityCompat; import com.android.systemui.shared.system.WindowManagerWrapper; +import java.io.ByteArrayOutputStream; +import java.io.PrintWriter; +import java.util.zip.Deflater; + public class UiFactory { public static TouchController[] createTouchControllers(Launcher launcher) { - SharedPreferences prefs = getPrefs(launcher); - boolean swipeUpEnabled = prefs.getBoolean(KEY_SWIPE_UP_ENABLED, true); + boolean swipeUpEnabled = OverviewInteractionState.getInstance(launcher) + .isSwipeUpGestureEnabled(); if (!swipeUpEnabled) { return new TouchController[] { launcher.getDragController(), - new LandscapeStatesTouchController(launcher), - new LauncherTaskViewcontroller(launcher)}; + new OverviewToAllAppsTouchController(launcher), + new LauncherTaskViewController(launcher)}; } if (launcher.getDeviceProfile().isVerticalBarLayout()) { return new TouchController[] { launcher.getDragController(), - new LandscapeStatesTouchController(launcher), + new OverviewToAllAppsTouchController(launcher), new LandscapeEdgeSwipeController(launcher), - new LauncherTaskViewcontroller(launcher)}; + new LauncherTaskViewController(launcher)}; } else { return new TouchController[] { launcher.getDragController(), new PortraitStatesTouchController(launcher), - new LauncherTaskViewcontroller(launcher)}; + new LauncherTaskViewController(launcher)}; } } + public static void setOnTouchControllersChangedListener(Context context, Runnable listener) { + OverviewInteractionState.getInstance(context).setOnSwipeUpSettingChangedListener(listener); + } + public static StateHandler[] getStateHandler(Launcher launcher) { return new StateHandler[] { launcher.getAllAppsController(), launcher.getWorkspace(), @@ -73,10 +89,15 @@ public class UiFactory { && launcher.hasWindowFocus(); if (shouldBackButtonBeHidden) { // Show the back button if there is a floating view visible. - shouldBackButtonBeHidden = AbstractFloatingView.getTopOpenView(launcher) == null; + shouldBackButtonBeHidden = AbstractFloatingView.getTopOpenViewWithType(launcher, + TYPE_ALL & ~TYPE_HIDE_BACK_BUTTON) == null; } OverviewInteractionState.getInstance(launcher) - .setBackButtonVisible(!shouldBackButtonBeHidden); + .setBackButtonAlpha(shouldBackButtonBeHidden ? 0 : 1, true /* animate */); + } + + public static void setBackButtonAlpha(Launcher launcher, float alpha, boolean animate) { + OverviewInteractionState.getInstance(launcher).setBackButtonAlpha(alpha,animate); } public static void resetOverview(Launcher launcher) { @@ -84,6 +105,55 @@ public class UiFactory { recents.reset(); } + public static void onCreate(Launcher launcher) { + if (!launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false)) { + launcher.getStateManager().addStateListener(new LauncherStateManager.StateListener() { + @Override + public void onStateSetImmediately(LauncherState state) { + } + + @Override + public void onStateTransitionStart(LauncherState toState) { + } + + @Override + public void onStateTransitionComplete(LauncherState finalState) { + boolean swipeUpEnabled = OverviewInteractionState.getInstance(launcher) + .isSwipeUpGestureEnabled(); + LauncherState prevState = launcher.getStateManager().getLastState(); + + if (((swipeUpEnabled && finalState == OVERVIEW) || (!swipeUpEnabled + && finalState == ALL_APPS && prevState == NORMAL))) { + launcher.getSharedPrefs().edit().putBoolean(HOME_BOUNCE_SEEN, true).apply(); + launcher.getStateManager().removeStateListener(this); + } + } + }); + } + + if (!launcher.getSharedPrefs().getBoolean(SHELF_BOUNCE_SEEN, false)) { + launcher.getStateManager().addStateListener(new LauncherStateManager.StateListener() { + @Override + public void onStateSetImmediately(LauncherState state) { + } + + @Override + public void onStateTransitionStart(LauncherState toState) { + } + + @Override + public void onStateTransitionComplete(LauncherState finalState) { + LauncherState prevState = launcher.getStateManager().getLastState(); + + if (finalState == ALL_APPS && prevState == OVERVIEW) { + launcher.getSharedPrefs().edit().putBoolean(SHELF_BOUNCE_SEEN, true).apply(); + launcher.getStateManager().removeStateListener(this); + } + } + }); + } + } + public static void onStart(Context context) { RecentsModel model = RecentsModel.getInstance(context); if (model != null) { @@ -110,9 +180,42 @@ public class UiFactory { } } - private static class LauncherTaskViewcontroller extends TaskViewTouchController<Launcher> { + public static boolean dumpActivity(Activity activity, PrintWriter writer) { + if (!Utilities.IS_DEBUG_DEVICE) { + return false; + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + if (!(new ActivityCompat(activity).encodeViewHierarchy(out))) { + return false; + } + + Deflater deflater = new Deflater(); + deflater.setInput(out.toByteArray()); + deflater.finish(); + + out.reset(); + byte[] buffer = new byte[1024]; + while (!deflater.finished()) { + int count = deflater.deflate(buffer); // returns the generated code... index + out.write(buffer, 0, count); + } + + writer.println("--encoded-view-dump-v0--"); + writer.println(Base64.encodeToString( + out.toByteArray(), Base64.NO_WRAP | Base64.NO_PADDING)); + return true; + } + + public static void prepareToShowOverview(Launcher launcher) { + RecentsView overview = launcher.getOverviewPanel(); + if (overview.getVisibility() != VISIBLE || overview.getContentAlpha() == 0) { + overview.setAdjacentScale(1.33f); + } + } + + private static class LauncherTaskViewController extends TaskViewTouchController<Launcher> { - public LauncherTaskViewcontroller(Launcher activity) { + public LauncherTaskViewController(Launcher activity) { super(activity); } @@ -120,5 +223,10 @@ public class UiFactory { protected boolean isRecentsInteractive() { return mActivity.isInState(OVERVIEW); } + + @Override + protected void onUserControlledAnimationCreated(AnimatorPlaybackController animController) { + mActivity.getStateManager().setCurrentUserControlledAnimation(animController); + } } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/WallpaperColorInfo.java b/quickstep/src/com/android/launcher3/uioverrides/WallpaperColorInfo.java new file mode 100644 index 000000000..8218517dc --- /dev/null +++ b/quickstep/src/com/android/launcher3/uioverrides/WallpaperColorInfo.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2018 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.uioverrides; + +import static android.app.WallpaperManager.FLAG_SYSTEM; + +import android.annotation.TargetApi; +import android.app.WallpaperColors; +import android.app.WallpaperManager; +import android.app.WallpaperManager.OnColorsChangedListener; +import android.content.Context; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; + +import com.android.systemui.shared.system.TonalCompat; +import com.android.systemui.shared.system.TonalCompat.ExtractionInfo; + +import java.util.ArrayList; + +@TargetApi(Build.VERSION_CODES.P) +public class WallpaperColorInfo implements OnColorsChangedListener { + + private static final Object sInstanceLock = new Object(); + private static WallpaperColorInfo sInstance; + + public static WallpaperColorInfo getInstance(Context context) { + synchronized (sInstanceLock) { + if (sInstance == null) { + sInstance = new WallpaperColorInfo(context.getApplicationContext()); + } + return sInstance; + } + } + + private final ArrayList<OnChangeListener> mListeners = new ArrayList<>(); + private final WallpaperManager mWallpaperManager; + private final TonalCompat mTonalCompat; + + private ExtractionInfo mExtractionInfo; + + private OnChangeListener[] mTempListeners = new OnChangeListener[0]; + + private WallpaperColorInfo(Context context) { + mWallpaperManager = context.getSystemService(WallpaperManager.class); + mTonalCompat = new TonalCompat(context); + + mWallpaperManager.addOnColorsChangedListener(this, new Handler(Looper.getMainLooper())); + update(mWallpaperManager.getWallpaperColors(FLAG_SYSTEM)); + } + + public int getMainColor() { + return mExtractionInfo.mainColor; + } + + public int getSecondaryColor() { + return mExtractionInfo.secondaryColor; + } + + public boolean isDark() { + return mExtractionInfo.supportsDarkTheme; + } + + public boolean supportsDarkText() { + return mExtractionInfo.supportsDarkText; + } + + @Override + public void onColorsChanged(WallpaperColors colors, int which) { + if ((which & FLAG_SYSTEM) != 0) { + update(colors); + notifyChange(); + } + } + + private void update(WallpaperColors wallpaperColors) { + mExtractionInfo = mTonalCompat.extractDarkColors(wallpaperColors); + } + + public void addOnChangeListener(OnChangeListener listener) { + mListeners.add(listener); + } + + public void removeOnChangeListener(OnChangeListener listener) { + mListeners.remove(listener); + } + + private void notifyChange() { + // Create a new array to avoid concurrent modification when the activity destroys itself. + mTempListeners = mListeners.toArray(mTempListeners); + for (OnChangeListener listener : mTempListeners) { + if (listener != null) { + listener.onExtractedColorsChanged(this); + } + } + } + + public interface OnChangeListener { + void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo); + } +} diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 584128585..ae0affee0 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -15,16 +15,23 @@ */ package com.android.quickstep; +import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS; import static com.android.launcher3.LauncherState.FAST_OVERVIEW; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK; +import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_ROTATION; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.annotation.TargetApi; +import android.app.ActivityManager.RunningTaskInfo; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.Rect; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.support.annotation.Nullable; @@ -38,38 +45,41 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherInitListener; import com.android.launcher3.LauncherState; import com.android.launcher3.allapps.AllAppsTransitionController; +import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimatorPlaybackController; -import com.android.launcher3.util.ViewOnDrawExecutor; -import com.android.quickstep.fallback.FallbackRecentsView; +import com.android.launcher3.dragndrop.DragLayer; +import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; +import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.util.RemoteAnimationProvider; +import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.LauncherLayoutListener; import com.android.quickstep.views.LauncherRecentsView; import com.android.quickstep.views.RecentsView; -import com.android.quickstep.views.TaskView; -import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.AssistDataReceiver; -import com.android.systemui.shared.system.RecentsAnimationListener; +import com.android.quickstep.views.RecentsViewContainer; +import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import java.util.Objects; import java.util.function.BiPredicate; +import java.util.function.Consumer; /** * Utility class which abstracts out the logical differences between Launcher and RecentsActivity. */ +@TargetApi(Build.VERSION_CODES.P) public interface ActivityControlHelper<T extends BaseDraggingActivity> { LayoutListener createLayoutListener(T activity); - void onQuickstepGestureStarted(T activity, boolean activityVisible); - /** * Updates the UI to indicate quick interaction. - * @return true if there any any UI change as a result of this */ - boolean onQuickInteractionStart(T activity, boolean activityVisible); + void onQuickInteractionStart(T activity, @Nullable RunningTaskInfo taskInfo, + boolean activityVisible); - void executeOnWindowAvailable(T activity, Runnable action); + float getTranslationYForQuickScrub(T activity); - void executeOnNextDraw(T activity, TaskView targetView, Runnable action); + void executeOnWindowAvailable(T activity, Runnable action); void onTransitionCancelled(T activity, boolean activityVisible); @@ -77,17 +87,11 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { void onSwipeUpComplete(T activity); - void prepareRecentsUI(T activity, boolean activityVisible); - - AnimatorPlaybackController createControllerForVisibleActivity(T activity); - - AnimatorPlaybackController createControllerForHiddenActivity(T activity, int transitionLength); + AnimationFactory prepareRecentsUI(T activity, boolean activityVisible, + Consumer<AnimatorPlaybackController> callback); ActivityInitListener createActivityInitListener(BiPredicate<T, Boolean> onInitListener); - void startRecentsFromSwipe(Intent intent, AssistDataReceiver assistDataReceiver, - final RecentsAnimationListener remoteAnimationListener); - @Nullable T getCreatedActivity(); @@ -96,7 +100,31 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { RecentsView getVisibleRecentsView(); @UiThread - boolean switchToRecentsIfVisible(); + boolean switchToRecentsIfVisible(boolean fromRecentsButton); + + Rect getOverviewWindowBounds(Rect homeBounds, RemoteAnimationTargetCompat target); + + boolean shouldMinimizeSplitScreen(); + + /** + * @return {@code true} if recents activity should be started immediately on touchDown, + * {@code false} if it should deferred until some threshold is crossed. + */ + boolean deferStartingActivity(int downHitTarget); + + boolean supportsLongSwipe(T activity); + + AlphaProperty getAlphaProperty(T activity); + + /** + * Must return a non-null controller is supportsLongSwipe was true. + */ + LongSwipeHelper getLongSwipeController(T activity, RemoteAnimationTargetSet targetSet); + + /** + * Used for containerType in {@link com.android.launcher3.logging.UserEventDispatcher} + */ + int getContainerType(); class LauncherActivityControllerHelper implements ActivityControlHelper<Launcher> { @@ -106,42 +134,31 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { } @Override - public void onQuickstepGestureStarted(Launcher activity, boolean activityVisible) { - activity.onQuickstepGestureStarted(activityVisible); - } - - @Override - public boolean onQuickInteractionStart(Launcher activity, boolean activityVisible) { + public void onQuickInteractionStart(Launcher activity, RunningTaskInfo taskInfo, + boolean activityVisible) { LauncherState fromState = activity.getStateManager().getState(); activity.getStateManager().goToState(FAST_OVERVIEW, activityVisible); - return !fromState.overviewUi; + + QuickScrubController controller = activity.<RecentsView>getOverviewPanel() + .getQuickScrubController(); + controller.onQuickScrubStart(activityVisible && !fromState.overviewUi, this); } @Override - public void executeOnWindowAvailable(Launcher activity, Runnable action) { - if (activity.getWorkspace().runOnOverlayHidden(action)) { - // Notify the activity that qiuckscrub has started - onQuickstepGestureStarted(activity, true); - } + public float getTranslationYForQuickScrub(Launcher activity) { + LauncherRecentsView recentsView = activity.getOverviewPanel(); + float transYFactor = FAST_OVERVIEW.getOverviewScaleAndTranslationYFactor(activity)[1]; + return recentsView.computeTranslationYForFactor(transYFactor); } @Override - public void executeOnNextDraw(Launcher activity, TaskView targetView, Runnable action) { - ViewOnDrawExecutor executor = new ViewOnDrawExecutor() { - @Override - public void onViewDetachedFromWindow(View v) { - if (!isCompleted()) { - runAllTasks(); - } - } - }; - executor.attachTo(activity, targetView, false /* waitForLoadAnimation */); - executor.execute(action); + public void executeOnWindowAvailable(Launcher activity, Runnable action) { + activity.getWorkspace().runOnOverlayHidden(action); } @Override public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) { - LauncherRecentsView.getPageRect(dp, context, outRect); + LayoutUtils.calculateLauncherTaskSize(context, dp, outRect); if (dp.isVerticalBarLayout()) { Rect targetInsets = dp.getInsets(); int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right; @@ -161,15 +178,19 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { public void onSwipeUpComplete(Launcher activity) { // Re apply state in case we did something funky during the transition. activity.getStateManager().reapplyState(); + DiscoveryBounce.showForOverviewIfNeeded(activity); } @Override - public void prepareRecentsUI(Launcher activity, boolean activityVisible) { - LauncherState startState = activity.getStateManager().getState(); + public AnimationFactory prepareRecentsUI(Launcher activity, boolean activityVisible, + Consumer<AnimatorPlaybackController> callback) { + final LauncherState startState = activity.getStateManager().getState(); + + LauncherState resetState = startState; if (startState.disableRestore) { - startState = activity.getStateManager().getRestState(); + resetState = activity.getStateManager().getRestState(); } - activity.getStateManager().setRestState(startState); + activity.getStateManager().setRestState(resetState); if (!activityVisible) { // Since the launcher is not visible, we can safely reset the scroll position. @@ -180,38 +201,53 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { // Optimization, hide the all apps view to prevent layout while initializing activity.getAppsView().getContentView().setVisibility(View.GONE); } - } - @Override - public AnimatorPlaybackController createControllerForVisibleActivity(Launcher activity) { - DeviceProfile dp = activity.getDeviceProfile(); - long accuracy = 2 * Math.max(dp.widthPx, dp.heightPx); - return activity.getStateManager().createAnimationToNewWorkspace(OVERVIEW, accuracy); + return new AnimationFactory() { + @Override + public void createActivityController(long transitionLength) { + createActivityControllerInternal(activity, activityVisible, startState, + transitionLength, callback); + } + + @Override + public void onTransitionCancelled() { + activity.getStateManager().goToState(startState, false /* animate */); + } + }; } - @Override - public AnimatorPlaybackController createControllerForHiddenActivity( - Launcher activity, int transitionLength) { - AllAppsTransitionController controller = activity.getAllAppsController(); - AnimatorSet anim = new AnimatorSet(); + private void createActivityControllerInternal(Launcher activity, boolean wasVisible, + LauncherState startState, long transitionLength, + Consumer<AnimatorPlaybackController> callback) { + if (wasVisible) { + DeviceProfile dp = activity.getDeviceProfile(); + long accuracy = 2 * Math.max(dp.widthPx, dp.heightPx); + activity.getStateManager().goToState(startState, false); + callback.accept(activity.getStateManager() + .createAnimationToNewWorkspace(OVERVIEW, accuracy)); + return; + } + if (activity.getDeviceProfile().isVerticalBarLayout()) { - // TODO: - } else { - float scrollRange = Math.max(controller.getShiftRange(), 1); - float progressDelta = (transitionLength / scrollRange); - - float endProgress = OVERVIEW.getVerticalProgress(activity); - float startProgress = endProgress + progressDelta; - ObjectAnimator shiftAnim = ObjectAnimator.ofFloat( - controller, ALL_APPS_PROGRESS, startProgress, endProgress); - shiftAnim.setInterpolator(LINEAR); - anim.play(shiftAnim); + return; } - // TODO: Link this animation to state animation, so that it is cancelled - // automatically on state change + AllAppsTransitionController controller = activity.getAllAppsController(); + AnimatorSet anim = new AnimatorSet(); + + float scrollRange = Math.max(controller.getShiftRange(), 1); + float progressDelta = (transitionLength / scrollRange); + + float endProgress = OVERVIEW.getVerticalProgress(activity); + float startProgress = endProgress + progressDelta; + ObjectAnimator shiftAnim = ObjectAnimator.ofFloat( + controller, ALL_APPS_PROGRESS, startProgress, endProgress); + shiftAnim.setInterpolator(LINEAR); + anim.play(shiftAnim); + anim.setDuration(transitionLength * 2); - return AnimatorPlaybackController.wrap(anim, transitionLength * 2); + activity.getStateManager().setCurrentAnimation(anim); + callback.accept(AnimatorPlaybackController.wrap(anim, transitionLength * 2)); } @Override @@ -220,13 +256,6 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { return new LauncherInitListener(onInitListener); } - @Override - public void startRecentsFromSwipe(Intent intent, AssistDataReceiver assistDataReceiver, - final RecentsAnimationListener remoteAnimationListener) { - ActivityManagerWrapper.getInstance().startRecentsActivity( - intent, assistDataReceiver, remoteAnimationListener, null, null); - } - @Nullable @Override public Launcher getCreatedActivity() { @@ -249,44 +278,101 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { @Override public RecentsView getVisibleRecentsView() { Launcher launcher = getVisibleLaucher(); - return launcher != null && launcher.isInState(OVERVIEW) + return launcher != null && launcher.getStateManager().getState().overviewUi ? launcher.getOverviewPanel() : null; } @Override - public boolean switchToRecentsIfVisible() { + public boolean switchToRecentsIfVisible(boolean fromRecentsButton) { Launcher launcher = getVisibleLaucher(); if (launcher != null) { + if (fromRecentsButton) { + launcher.getUserEventDispatcher().logActionCommand( + LauncherLogProto.Action.Command.RECENTS_BUTTON, + getContainerType(), + LauncherLogProto.ContainerType.TASKSWITCHER); + } launcher.getStateManager().goToState(OVERVIEW); return true; } return false; } + + @Override + public boolean deferStartingActivity(int downHitTarget) { + return downHitTarget == HIT_TARGET_BACK || downHitTarget == HIT_TARGET_ROTATION; + } + + @Override + public Rect getOverviewWindowBounds(Rect homeBounds, RemoteAnimationTargetCompat target) { + return homeBounds; + } + + @Override + public boolean shouldMinimizeSplitScreen() { + return true; + } + + @Override + public boolean supportsLongSwipe(Launcher activity) { + return !activity.getDeviceProfile().isVerticalBarLayout(); + } + + @Override + public LongSwipeHelper getLongSwipeController(Launcher activity, + RemoteAnimationTargetSet targetSet) { + if (activity.getDeviceProfile().isVerticalBarLayout()) { + return null; + } + return new LongSwipeHelper(activity, targetSet); + } + + @Override + public AlphaProperty getAlphaProperty(Launcher activity) { + return activity.getDragLayer().getAlphaProperty(DragLayer.ALPHA_INDEX_SWIPE_UP); + } + + @Override + public int getContainerType() { + final Launcher launcher = getVisibleLaucher(); + return launcher != null ? launcher.getStateManager().getState().containerType + : LauncherLogProto.ContainerType.APP; + } } class FallbackActivityControllerHelper implements ActivityControlHelper<RecentsActivity> { - @Override - public void onQuickstepGestureStarted(RecentsActivity activity, boolean activityVisible) { - // TODO: + private final ComponentName mHomeComponent; + private final Handler mUiHandler = new Handler(Looper.getMainLooper()); + + public FallbackActivityControllerHelper(ComponentName homeComponent) { + mHomeComponent = homeComponent; } @Override - public boolean onQuickInteractionStart(RecentsActivity activity, boolean activityVisible) { - // Activity does not need any UI change for quickscrub. - return false; + public void onQuickInteractionStart(RecentsActivity activity, RunningTaskInfo taskInfo, + boolean activityVisible) { + QuickScrubController controller = activity.<RecentsView>getOverviewPanel() + .getQuickScrubController(); + + // TODO: match user is as well + boolean startingFromHome = !activityVisible && + (taskInfo == null || Objects.equals(taskInfo.topActivity, mHomeComponent)); + controller.onQuickScrubStart(startingFromHome, this); + if (activityVisible) { + mUiHandler.postDelayed(controller::onFinishedTransitionToQuickScrub, + OVERVIEW_TRANSITION_MS); + } } @Override - public void executeOnWindowAvailable(RecentsActivity activity, Runnable action) { - action.run(); + public float getTranslationYForQuickScrub(RecentsActivity activity) { + return 0; } @Override - public void executeOnNextDraw(RecentsActivity activity, TaskView targetView, - Runnable action) { - // TODO: - new Handler(Looper.getMainLooper()).post(action); + public void executeOnWindowAvailable(RecentsActivity activity, Runnable action) { + action.run(); } @Override @@ -296,7 +382,7 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { @Override public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) { - FallbackRecentsView.getPageRect(dp, context, outRect); + LayoutUtils.calculateFallbackTaskSize(context, dp, outRect); if (dp.isVerticalBarLayout()) { Rect targetInsets = dp.getInsets(); int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right; @@ -312,23 +398,43 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { } @Override - public void prepareRecentsUI(RecentsActivity activity, boolean activityVisible) { - // TODO: - } + public AnimationFactory prepareRecentsUI(RecentsActivity activity, boolean activityVisible, + Consumer<AnimatorPlaybackController> callback) { + if (activityVisible) { + return (transitionLength) -> { }; + } - @Override - public AnimatorPlaybackController createControllerForVisibleActivity( - RecentsActivity activity) { - DeviceProfile dp = activity.getDeviceProfile(); - return createControllerForHiddenActivity(activity, Math.max(dp.widthPx, dp.heightPx)); - } + RecentsViewContainer rv = activity.getOverviewPanelContainer(); + rv.setContentAlpha(0); - @Override - public AnimatorPlaybackController createControllerForHiddenActivity( - RecentsActivity activity, int transitionLength) { - // We do not animate anything. Create a empty controller - AnimatorSet anim = new AnimatorSet(); - return AnimatorPlaybackController.wrap(anim, transitionLength * 2); + return new AnimationFactory() { + + boolean isAnimatingHome = false; + + @Override + public void onRemoteAnimationReceived(RemoteAnimationTargetSet targets) { + isAnimatingHome = targets != null && targets.isAnimatingHome(); + if (!isAnimatingHome) { + rv.setContentAlpha(1); + } + createActivityController(getSwipeUpDestinationAndLength( + activity.getDeviceProfile(), activity, new Rect())); + } + + @Override + public void createActivityController(long transitionLength) { + if (!isAnimatingHome) { + return; + } + + ObjectAnimator anim = ObjectAnimator + .ofFloat(rv, RecentsViewContainer.CONTENT_ALPHA, 0, 1); + anim.setDuration(transitionLength).setInterpolator(LINEAR); + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.play(anim); + callback.accept(AnimatorPlaybackController.wrap(animatorSet, transitionLength)); + } + }; } @Override @@ -353,14 +459,6 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { return new RecentsActivityTracker(onInitListener); } - @Override - public void startRecentsFromSwipe(Intent intent, AssistDataReceiver assistDataReceiver, - final RecentsAnimationListener remoteAnimationListener) { - // We can use the normal recents animation for swipe up - ActivityManagerWrapper.getInstance().startRecentsActivity( - intent, assistDataReceiver, remoteAnimationListener, null, null); - } - @Nullable @Override public RecentsActivity getCreatedActivity() { @@ -378,9 +476,48 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { } @Override - public boolean switchToRecentsIfVisible() { + public boolean switchToRecentsIfVisible(boolean fromRecentsButton) { + return false; + } + + @Override + public boolean deferStartingActivity(int downHitTarget) { + // Always defer starting the activity when using fallback + return true; + } + + @Override + public Rect getOverviewWindowBounds(Rect homeBounds, RemoteAnimationTargetCompat target) { + // TODO: Remove this once b/77875376 is fixed + return target.sourceContainerBounds; + } + + @Override + public boolean shouldMinimizeSplitScreen() { + // TODO: Remove this once b/77875376 is fixed + return false; + } + + @Override + public boolean supportsLongSwipe(RecentsActivity activity) { return false; } + + @Override + public LongSwipeHelper getLongSwipeController(RecentsActivity activity, + RemoteAnimationTargetSet targetSet) { + return null; + } + + @Override + public AlphaProperty getAlphaProperty(RecentsActivity activity) { + return activity.getDragLayer().getAlphaProperty(0); + } + + @Override + public int getContainerType() { + return LauncherLogProto.ContainerType.SIDELOADED_LAUNCHER; + } } interface LayoutListener { @@ -401,4 +538,13 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { void registerAndStartActivity(Intent intent, RemoteAnimationProvider animProvider, Context context, Handler handler, long duration); } + + interface AnimationFactory { + + default void onRemoteAnimationReceived(RemoteAnimationTargetSet targets) { } + + void createActivityController(long transitionLength); + + default void onTransitionCancelled() { } + } } diff --git a/quickstep/src/com/android/quickstep/LongSwipeHelper.java b/quickstep/src/com/android/quickstep/LongSwipeHelper.java new file mode 100644 index 000000000..fbcde8bba --- /dev/null +++ b/quickstep/src/com/android/quickstep/LongSwipeHelper.java @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2018 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; + +import static com.android.launcher3.LauncherAnimUtils.MIN_PROGRESS_TO_ALL_APPS; +import static com.android.launcher3.LauncherState.ALL_APPS; +import static com.android.launcher3.LauncherState.OVERVIEW; +import static com.android.launcher3.anim.Interpolators.DEACCEL; +import static com.android.quickstep.WindowTransformSwipeHandler.MAX_SWIPE_DURATION; +import static com.android.systemui.shared.recents.utilities.Utilities.getNextFrameNumber; +import static com.android.systemui.shared.recents.utilities.Utilities.getSurface; + +import android.animation.ValueAnimator; +import android.view.Surface; + +import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherAnimUtils; +import com.android.launcher3.R; +import com.android.launcher3.allapps.AllAppsTransitionController; +import com.android.launcher3.allapps.DiscoveryBounce; +import com.android.launcher3.anim.AnimatorPlaybackController; +import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; +import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.launcher3.util.FlingBlockCheck; +import com.android.quickstep.util.RemoteAnimationTargetSet; +import com.android.quickstep.views.RecentsView; +import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import com.android.systemui.shared.system.TransactionCompat; + +/** + * Utility class to handle long swipe from an app. + * This assumes the presence of Launcher activity as long swipe is not supported on the + * fallback activity. + */ +public class LongSwipeHelper { + + private static final float SWIPE_DURATION_MULTIPLIER = + Math.min(1 / MIN_PROGRESS_TO_ALL_APPS, 1 / (1 - MIN_PROGRESS_TO_ALL_APPS)); + + private final Launcher mLauncher; + private final RemoteAnimationTargetSet mTargetSet; + + private float mMaxSwipeDistance = 1; + private AnimatorPlaybackController mAnimator; + private FlingBlockCheck mFlingBlockCheck = new FlingBlockCheck(); + + LongSwipeHelper(Launcher launcher, RemoteAnimationTargetSet targetSet) { + mLauncher = launcher; + mTargetSet = targetSet; + init(); + } + + private void init() { + setTargetAlpha(0, true); + mFlingBlockCheck.blockFling(); + + // Init animations + AllAppsTransitionController controller = mLauncher.getAllAppsController(); + // TODO: Scale it down so that we can reach all-apps in screen space + mMaxSwipeDistance = Math.max(1, controller.getProgress() * controller.getShiftRange()); + mAnimator = mLauncher.getStateManager() + .createAnimationToNewWorkspace(ALL_APPS, Math.round(2 * mMaxSwipeDistance)); + mAnimator.dispatchOnStart(); + } + + public void onMove(float displacement) { + mAnimator.setPlayFraction(displacement / mMaxSwipeDistance); + mFlingBlockCheck.onEvent(); + } + + public void destroy() { + // TODO: We can probably also hide the task view + setTargetAlpha(1, false); + + mLauncher.getStateManager().goToState(OVERVIEW, false); + } + + public void end(float velocity, boolean isFling, Runnable callback) { + long duration = MAX_SWIPE_DURATION; + + final float currentFraction = mAnimator.getProgressFraction(); + final boolean toAllApps; + float endProgress; + + boolean blockedFling = isFling && mFlingBlockCheck.isBlocked(); + if (blockedFling) { + isFling = false; + } + + if (!isFling) { + toAllApps = currentFraction > MIN_PROGRESS_TO_ALL_APPS; + endProgress = toAllApps ? 1 : 0; + + long expectedDuration = Math.abs(Math.round((endProgress - currentFraction) + * MAX_SWIPE_DURATION * SWIPE_DURATION_MULTIPLIER)); + duration = Math.min(MAX_SWIPE_DURATION, expectedDuration); + } else { + toAllApps = velocity < 0; + endProgress = toAllApps ? 1 : 0; + + float minFlingVelocity = mLauncher.getResources() + .getDimension(R.dimen.quickstep_fling_min_velocity); + if (Math.abs(velocity) > minFlingVelocity && mMaxSwipeDistance > 0) { + float distanceToTravel = (endProgress - currentFraction) * mMaxSwipeDistance; + + // we want the page's snap velocity to approximately match the velocity at + // which the user flings, so we scale the duration by a value near to the + // derivative of the scroll interpolator at zero, ie. 2. + long baseDuration = Math.round(1000 * Math.abs(distanceToTravel / velocity)); + duration = Math.min(MAX_SWIPE_DURATION, 2 * baseDuration); + } + } + + if (blockedFling && !toAllApps) { + duration *= LauncherAnimUtils.blockedFlingDurationFactor(0); + } + final boolean finalIsFling = isFling; + mAnimator.setEndAction(() -> onSwipeAnimationComplete(toAllApps, finalIsFling, callback)); + ValueAnimator animator = mAnimator.getAnimationPlayer(); + animator.setDuration(duration).setInterpolator(DEACCEL); + animator.setFloatValues(currentFraction, endProgress); + animator.start(); + } + + private void setTargetAlpha(float alpha, boolean defer) { + final Surface surface = getSurface(mLauncher.getDragLayer()); + final long frameNumber = defer && surface != null ? getNextFrameNumber(surface) : -1; + if (defer) { + if (frameNumber == -1) { + defer = false; + } else { + mLauncher.getDragLayer().invalidate(); + } + } + + TransactionCompat transaction = new TransactionCompat(); + for (RemoteAnimationTargetCompat app : mTargetSet.apps) { + if (!(app.isNotInRecents + || app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME)) { + transaction.setAlpha(app.leash, alpha); + if (defer) { + transaction.deferTransactionUntil(app.leash, surface, frameNumber); + } + } + } + transaction.setEarlyWakeup(); + transaction.apply(); + } + + private void onSwipeAnimationComplete(boolean toAllApps, boolean isFling, Runnable callback) { + mLauncher.getStateManager().goToState(toAllApps ? ALL_APPS : OVERVIEW, false); + if (!toAllApps) { + DiscoveryBounce.showForOverviewIfNeeded(mLauncher); + mLauncher.<RecentsView>getOverviewPanel().setSwipeDownShouldLaunchApp(true); + } + + mLauncher.getUserEventDispatcher().logStateChangeAction( + isFling ? Touch.FLING : Touch.SWIPE, Direction.UP, + ContainerType.NAVBAR, ContainerType.APP, + toAllApps ? ContainerType.ALLAPPS : ContainerType.TASKSWITCHER, + 0); + + callback.run(); + } +} diff --git a/quickstep/src/com/android/quickstep/MotionEventQueue.java b/quickstep/src/com/android/quickstep/MotionEventQueue.java index 538e23c3a..15f5aa524 100644 --- a/quickstep/src/com/android/quickstep/MotionEventQueue.java +++ b/quickstep/src/com/android/quickstep/MotionEventQueue.java @@ -163,7 +163,7 @@ public class MotionEventQueue { mConsumer.updateTouchTracking(INTERACTION_QUICK_SCRUB); break; case ACTION_QUICK_STEP: - mConsumer.onQuickStep(event.getX(), event.getY(), event.getEventTime()); + mConsumer.onQuickStep(event); break; default: Log.e(TAG, "Invalid virtual event: " + event.getAction()); diff --git a/quickstep/src/com/android/quickstep/MultiStateCallback.java b/quickstep/src/com/android/quickstep/MultiStateCallback.java index 7a741764f..bda3d06aa 100644 --- a/quickstep/src/com/android/quickstep/MultiStateCallback.java +++ b/quickstep/src/com/android/quickstep/MultiStateCallback.java @@ -59,4 +59,8 @@ public class MultiStateCallback { public int getState() { return mState; } + + public boolean hasStates(int stateMask) { + return (mState & stateMask) == stateMask; + } } diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index 4d695de90..23738fb25 100644 --- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java +++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java @@ -21,9 +21,10 @@ import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; import static android.view.MotionEvent.INVALID_POINTER_ID; -import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK; -import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_OVERVIEW; -import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_STEP_DRAG_SLOP_PX; + +import static com.android.systemui.shared.system.ActivityManagerWrapper + .CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; +import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; import android.annotation.TargetApi; import android.app.ActivityManager.RunningTaskInfo; @@ -46,16 +47,17 @@ import android.view.WindowManager; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.util.TraceHelper; +import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.AssistDataReceiver; import com.android.systemui.shared.system.BackgroundExecutor; +import com.android.systemui.shared.system.NavigationBarCompat; import com.android.systemui.shared.system.NavigationBarCompat.HitTarget; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; import com.android.systemui.shared.system.RecentsAnimationListener; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.WindowManagerWrapper; -import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -66,8 +68,6 @@ import java.util.concurrent.TimeUnit; public class OtherActivityTouchConsumer extends ContextWrapper implements TouchConsumer { private static final long LAUNCHER_DRAW_TIMEOUT_MS = 150; - private static final int[] DEFERRED_HIT_TARGETS = false - ? new int[] {HIT_TARGET_BACK, HIT_TARGET_OVERVIEW} : new int[] {HIT_TARGET_BACK}; private final RunningTaskInfo mRunningTask; private final RecentsModel mRecentsModel; @@ -75,12 +75,15 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC private final ActivityControlHelper mActivityControlHelper; private final MainThreadExecutor mMainThreadExecutor; private final Choreographer mBackgroundThreadChoreographer; + private final OverviewCallbacks mOverviewCallbacks; private final boolean mIsDeferredDownTarget; private final PointF mDownPos = new PointF(); private final PointF mLastPos = new PointF(); private int mActivePointerId = INVALID_POINTER_ID; private boolean mPassedInitialSlop; + // Used for non-deferred gestures to determine when to start dragging + private int mQuickStepDragSlop; private float mStartDisplacement; private WindowTransformSwipeHandler mInteractionHandler; private int mDisplayRotation; @@ -93,8 +96,10 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC public OtherActivityTouchConsumer(Context base, RunningTaskInfo runningTaskInfo, RecentsModel recentsModel, Intent homeIntent, ActivityControlHelper activityControl, MainThreadExecutor mainThreadExecutor, Choreographer backgroundThreadChoreographer, - @HitTarget int downHitTarget, VelocityTracker velocityTracker) { + @HitTarget int downHitTarget, OverviewCallbacks overviewCallbacks, + VelocityTracker velocityTracker) { super(base); + mRunningTask = runningTaskInfo; mRecentsModel = recentsModel; mHomeIntent = homeIntent; @@ -102,7 +107,8 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC mActivityControlHelper = activityControl; mMainThreadExecutor = mainThreadExecutor; mBackgroundThreadChoreographer = backgroundThreadChoreographer; - mIsDeferredDownTarget = Arrays.binarySearch(DEFERRED_HIT_TARGETS, downHitTarget) >= 0; + mIsDeferredDownTarget = activityControl.deferStartingActivity(downHitTarget); + mOverviewCallbacks = overviewCallbacks; } @Override @@ -122,6 +128,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC mDownPos.set(ev.getX(), ev.getY()); mLastPos.set(mDownPos); mPassedInitialSlop = false; + mQuickStepDragSlop = NavigationBarCompat.getQuickStepDragSlopPx(); // Start the window animation on down to give more time for launcher to draw if the // user didn't start the gesture over the back button @@ -154,14 +161,14 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC } mLastPos.set(ev.getX(pointerIndex), ev.getY(pointerIndex)); float displacement = getDisplacement(ev); - if (!mPassedInitialSlop && Math.abs(displacement) > QUICK_STEP_DRAG_SLOP_PX) { - mPassedInitialSlop = true; - mStartDisplacement = displacement; - - // If we deferred starting the window animation on touch down, then - // start tracking now - if (mIsDeferredDownTarget) { - startTouchTrackingForWindowAnimation(ev.getEventTime()); + if (!mPassedInitialSlop) { + if (!mIsDeferredDownTarget) { + // Normal gesture, ensure we pass the drag slop before we start tracking + // the gesture + if (Math.abs(displacement) > mQuickStepDragSlop) { + mPassedInitialSlop = true; + mStartDisplacement = displacement; + } } } @@ -186,6 +193,11 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC if (mInteractionHandler == null) { return; } + + mOverviewCallbacks.closeAllWindows(); + ActivityManagerWrapper.getInstance().closeSystemWindows( + CLOSE_SYSTEM_WINDOWS_REASON_RECENTS); + // Notify the handler that the gesture has actually started mInteractionHandler.onGestureStarted(); } @@ -218,7 +230,8 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC handler.initWhenReady(); TraceHelper.beginSection("RecentsController"); - Runnable startActivity = () -> mActivityControlHelper.startRecentsFromSwipe(mHomeIntent, + Runnable startActivity = () -> ActivityManagerWrapper.getInstance().startRecentsActivity( + mHomeIntent, new AssistDataReceiver() { @Override public void onHandleAssistData(Bundle bundle) { @@ -232,8 +245,9 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC Rect minimizedHomeBounds) { if (mInteractionHandler == handler) { TraceHelper.partitionSection("RecentsController", "Received"); - handler.onRecentsAnimationStart(controller, apps, homeContentInsets, - minimizedHomeBounds); + handler.onRecentsAnimationStart(controller, + new RemoteAnimationTargetSet(apps, MODE_CLOSING), + homeContentInsets, minimizedHomeBounds); } else { TraceHelper.endSection("RecentsController", "Finishing no handler"); controller.finish(false /* toHome */); @@ -247,7 +261,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC handler.onRecentsAnimationCanceled(); } } - }); + }, null, null); if (Looper.myLooper() != Looper.getMainLooper()) { startActivity.run(); @@ -305,6 +319,13 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC @Override public void updateTouchTracking(int interactionType) { + if (!mPassedInitialSlop && mIsDeferredDownTarget && mInteractionHandler == null) { + // If we deferred starting the window animation on touch down, then + // start tracking now + startTouchTrackingForWindowAnimation(SystemClock.uptimeMillis()); + mPassedInitialSlop = true; + } + notifyGestureStarted(); if (mInteractionHandler != null) { mInteractionHandler.updateInteractionType(interactionType); @@ -332,7 +353,14 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC } @Override - public void onQuickStep(float eventX, float eventY, long eventTime) { + public void onQuickStep(MotionEvent ev) { + if (mIsDeferredDownTarget) { + // Deferred gesture, start the animation and gesture tracking once we pass the actual + // touch slop + startTouchTrackingForWindowAnimation(ev.getEventTime()); + mPassedInitialSlop = true; + mStartDisplacement = getDisplacement(ev); + } notifyGestureStarted(); } diff --git a/quickstep/src/com/android/quickstep/OverviewCallbacks.java b/quickstep/src/com/android/quickstep/OverviewCallbacks.java new file mode 100644 index 000000000..ac4a40b98 --- /dev/null +++ b/quickstep/src/com/android/quickstep/OverviewCallbacks.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2018 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; + +import android.content.Context; + +import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.util.Preconditions; + +/** + * Callbacks related to overview/quicksteps. + */ +public class OverviewCallbacks { + + private static OverviewCallbacks sInstance; + + public static OverviewCallbacks get(Context context) { + Preconditions.assertUIThread(); + if (sInstance == null) { + sInstance = Utilities.getOverrideObject(OverviewCallbacks.class, + context.getApplicationContext(), R.string.overview_callbacks_class); + } + return sInstance; + } + + public void onInitOverviewTransition() { } + + public void onResetOverview() { } + + public void closeAllWindows() { } +} diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index d76c49a09..7b2932383 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -15,18 +15,32 @@ */ package com.android.quickstep; +import static android.content.Intent.ACTION_PACKAGE_ADDED; +import static android.content.Intent.ACTION_PACKAGE_CHANGED; +import static android.content.Intent.ACTION_PACKAGE_REMOVED; + import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; +import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR; +import static com.android.systemui.shared.system.ActivityManagerWrapper + .CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; +import static com.android.systemui.shared.system.PackageManagerWrapper + .ACTION_PREFERRED_ACTIVITY_CHANGED; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; +import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING; +import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.annotation.TargetApi; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ResolveInfo; import android.graphics.Rect; import android.os.Build; +import android.os.PatternMatcher; import android.os.SystemClock; import android.util.Log; import android.view.View; @@ -34,17 +48,26 @@ import android.view.ViewConfiguration; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; +import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.MainThreadExecutor; -import com.android.launcher3.anim.AnimatorPlaybackController; +import com.android.launcher3.anim.AnimationSuccessListener; +import com.android.launcher3.logging.UserEventDispatcher; +import com.android.launcher3.userevent.nano.LauncherLogProto.Action; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; +import com.android.quickstep.ActivityControlHelper.AnimationFactory; import com.android.quickstep.ActivityControlHelper.FallbackActivityControllerHelper; import com.android.quickstep.ActivityControlHelper.LauncherActivityControllerHelper; import com.android.quickstep.util.ClipAnimationHelper; -import com.android.quickstep.util.RemoteAnimationProvider; -import com.android.quickstep.util.SysuiEventLogger; +import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.LatencyTrackerCompat; +import com.android.systemui.shared.system.PackageManagerWrapper; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import com.android.systemui.shared.system.TransactionCompat; + +import java.util.ArrayList; /** * Helper class to handle various atomic commands for switching between Overview. @@ -52,18 +75,33 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat; @TargetApi(Build.VERSION_CODES.P) public class OverviewCommandHelper { - private static final long RECENTS_LAUNCH_DURATION = 200; + private static final long RECENTS_LAUNCH_DURATION = 250; private static final String TAG = "OverviewCommandHelper"; - private static final boolean DEBUG_START_FALLBACK_ACTIVITY = false; private final Context mContext; private final ActivityManagerWrapper mAM; private final RecentsModel mRecentsModel; private final MainThreadExecutor mMainThreadExecutor; + private final ComponentName mMyHomeComponent; + + private final BroadcastReceiver mUserPreferenceChangeReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + initOverviewTargets(); + } + }; + private final BroadcastReceiver mOtherHomeAppUpdateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + initOverviewTargets(); + } + }; + private String mUpdateRegisteredPackage; - public final Intent homeIntent; - public final ComponentName launcher; + public Intent overviewIntent; + public ComponentName overviewComponent; + private ActivityControlHelper mActivityControlHelper; private long mLastToggleTime; @@ -73,22 +111,72 @@ public class OverviewCommandHelper { mMainThreadExecutor = new MainThreadExecutor(); mRecentsModel = RecentsModel.getInstance(mContext); - homeIntent = new Intent(Intent.ACTION_MAIN) + Intent myHomeIntent = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME) - .setPackage(context.getPackageName()) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - ResolveInfo info = context.getPackageManager().resolveActivity(homeIntent, 0); + .setPackage(mContext.getPackageName()); + ResolveInfo info = context.getPackageManager().resolveActivity(myHomeIntent, 0); + mMyHomeComponent = new ComponentName(context.getPackageName(), info.activityInfo.name); + + mContext.registerReceiver(mUserPreferenceChangeReceiver, + new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED)); + initOverviewTargets(); + } - if (DEBUG_START_FALLBACK_ACTIVITY) { - launcher = new ComponentName(context, RecentsActivity.class); - homeIntent.addCategory(Intent.CATEGORY_DEFAULT) - .removeCategory(Intent.CATEGORY_HOME); + private void initOverviewTargets() { + ComponentName defaultHome = PackageManagerWrapper.getInstance() + .getHomeActivities(new ArrayList<>()); + + final String overviewIntentCategory; + if (defaultHome == null || mMyHomeComponent.equals(defaultHome)) { + // User default home is same as out home app. Use Overview integrated in Launcher. + overviewComponent = mMyHomeComponent; + mActivityControlHelper = new LauncherActivityControllerHelper(); + overviewIntentCategory = Intent.CATEGORY_HOME; + + if (mUpdateRegisteredPackage != null) { + // Remove any update listener as we don't care about other packages. + mContext.unregisterReceiver(mOtherHomeAppUpdateReceiver); + mUpdateRegisteredPackage = null; + } } else { - launcher = new ComponentName(context.getPackageName(), info.activityInfo.name); + // The default home app is a different launcher. Use the fallback Overview instead. + overviewComponent = new ComponentName(mContext, RecentsActivity.class); + mActivityControlHelper = new FallbackActivityControllerHelper(defaultHome); + overviewIntentCategory = Intent.CATEGORY_DEFAULT; + + // User's default home app can change as a result of package updates of this app (such + // as uninstalling the app or removing the "Launcher" feature in an update). + // Listen for package updates of this app (and remove any previously attached + // package listener). + if (!defaultHome.getPackageName().equals(mUpdateRegisteredPackage)) { + if (mUpdateRegisteredPackage != null) { + mContext.unregisterReceiver(mOtherHomeAppUpdateReceiver); + } + + mUpdateRegisteredPackage = defaultHome.getPackageName(); + IntentFilter updateReceiver = new IntentFilter(ACTION_PACKAGE_ADDED); + updateReceiver.addAction(ACTION_PACKAGE_CHANGED); + updateReceiver.addAction(ACTION_PACKAGE_REMOVED); + updateReceiver.addDataScheme("package"); + updateReceiver.addDataSchemeSpecificPart(mUpdateRegisteredPackage, + PatternMatcher.PATTERN_LITERAL); + mContext.registerReceiver(mOtherHomeAppUpdateReceiver, updateReceiver); + } } - // Clear the packageName as system can fail to dedupe it b/64108432 - homeIntent.setComponent(launcher).setPackage(null); + overviewIntent = new Intent(Intent.ACTION_MAIN) + .addCategory(overviewIntentCategory) + .setComponent(overviewComponent) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + } + + public void onDestroy() { + mContext.unregisterReceiver(mUserPreferenceChangeReceiver); + + if (mUpdateRegisteredPackage != null) { + mContext.unregisterReceiver(mOtherHomeAppUpdateReceiver); + mUpdateRegisteredPackage = null; + } } public void onOverviewToggle() { @@ -97,7 +185,7 @@ public class OverviewCommandHelper { return; } - mAM.closeSystemWindows("recentapps"); + mAM.closeSystemWindows(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS); mMainThreadExecutor.execute(new RecentsActivityCommand<>()); } @@ -105,25 +193,26 @@ public class OverviewCommandHelper { mMainThreadExecutor.execute(new ShowRecentsCommand()); } + public void onTip(int actionType, int viewType) { + mMainThreadExecutor.execute(new Runnable() { + @Override + public void run() { + UserEventDispatcher.newInstance(mContext, + new InvariantDeviceProfile(mContext).getDeviceProfile(mContext)) + .logActionTip(actionType, viewType); + } + }); + } + public ActivityControlHelper getActivityControlHelper() { - if (DEBUG_START_FALLBACK_ACTIVITY) { - return new FallbackActivityControllerHelper(); - } else { - return new LauncherActivityControllerHelper(); - } + return mActivityControlHelper; } private class ShowRecentsCommand extends RecentsActivityCommand { @Override protected boolean handleCommand(long elapsedTime) { - RecentsView recents = mHelper.getVisibleRecentsView(); - if (recents != null) { - recents.snapToTaskAfterNext(); - return true; - } else { - return false; - } + return mHelper.getVisibleRecentsView() != null; } } @@ -135,6 +224,9 @@ public class OverviewCommandHelper { private ActivityInitListener mListener; private T mActivity; + private RecentsView mRecentsView; + private final long mToggleClickedTime = SystemClock.uptimeMillis(); + private boolean mUserEventLogged; public RecentsActivityCommand() { mHelper = getActivityControlHelper(); @@ -152,12 +244,9 @@ public class OverviewCommandHelper { if (!handleCommand(elapsedTime)) { // Start overview - if (mHelper.switchToRecentsIfVisible()) { - SysuiEventLogger.writeDummyRecentsTransition(0); - // Do nothing - } else { + if (!mHelper.switchToRecentsIfVisible(true)) { mListener = mHelper.createActivityInitListener(this::onActivityReady); - mListener.registerAndStartActivity(homeIntent, this::createWindowAnimation, + mListener.registerAndStartActivity(overviewIntent, this::createWindowAnimation, mContext, mMainThreadExecutor.getHandler(), RECENTS_LAUNCH_DURATION); } } @@ -183,41 +272,60 @@ public class OverviewCommandHelper { private boolean onActivityReady(T activity, Boolean wasVisible) { activity.<RecentsView>getOverviewPanel().setCurrentTask(mRunningTaskId); AbstractFloatingView.closeAllOpenViews(activity, wasVisible); - mHelper.prepareRecentsUI(activity, wasVisible); + AnimationFactory factory = mHelper.prepareRecentsUI(activity, wasVisible, + (controller) -> { + controller.dispatchOnStart(); + ValueAnimator anim = controller.getAnimationPlayer() + .setDuration(RECENTS_LAUNCH_DURATION); + anim.setInterpolator(FAST_OUT_SLOW_IN); + anim.start(); + }); + factory.onRemoteAnimationReceived(null); if (wasVisible) { - AnimatorPlaybackController controller = - mHelper.createControllerForVisibleActivity(activity); - controller.dispatchOnStart(); - ValueAnimator anim = - controller.getAnimationPlayer().setDuration(RECENTS_LAUNCH_DURATION); - anim.setInterpolator(FAST_OUT_SLOW_IN); - anim.start(); + factory.createActivityController(RECENTS_LAUNCH_DURATION); } mActivity = activity; + mRecentsView = mActivity.getOverviewPanel(); + mRecentsView.setRunningTaskIconScaledDown(true /* isScaledDown */, false /* animate */); + if (!mUserEventLogged) { + activity.getUserEventDispatcher().logActionCommand(Action.Command.RECENTS_BUTTON, + mHelper.getContainerType(), ContainerType.TASKSWITCHER); + mUserEventLogged = true; + } return false; } private AnimatorSet createWindowAnimation(RemoteAnimationTargetCompat[] targetCompats) { + if (LatencyTrackerCompat.isEnabled(mContext)) { + LatencyTrackerCompat.logToggleRecents( + (int) (SystemClock.uptimeMillis() - mToggleClickedTime)); + } + if (mListener != null) { mListener.unregister(); } - RemoteAnimationProvider.showOpeningTarget(targetCompats); AnimatorSet anim = new AnimatorSet(); + anim.addListener(new AnimationSuccessListener() { + @Override + public void onAnimationSuccess(Animator animator) { + if (mRecentsView != null) { + mRecentsView.setRunningTaskIconScaledDown(false /* isScaledDown */, + true /* animate */); + } + } + }); if (mActivity == null) { Log.e(TAG, "Animation created, before activity"); anim.play(ValueAnimator.ofInt(0, 1).setDuration(100)); return anim; } - RemoteAnimationTargetCompat closingTarget = null; + RemoteAnimationTargetSet targetSet = + new RemoteAnimationTargetSet(targetCompats, MODE_CLOSING); + // Use the top closing app to determine the insets for the animation - for (RemoteAnimationTargetCompat target : targetCompats) { - if (target.mode == MODE_CLOSING) { - closingTarget = target; - break; - } - } - if (closingTarget == null) { + RemoteAnimationTargetCompat runningTaskTarget = targetSet.findTask(mRunningTaskId); + if (runningTaskTarget == null) { Log.e(TAG, "No closing app"); anim.play(ValueAnimator.ofInt(0, 1).setDuration(100)); return anim; @@ -232,19 +340,33 @@ public class OverviewCommandHelper { rootView.getLocationOnScreen(loc); Rect homeBounds = new Rect(loc[0], loc[1], loc[0] + rootView.getWidth(), loc[1] + rootView.getHeight()); - clipHelper.updateSource(homeBounds, closingTarget); + clipHelper.updateSource(homeBounds, runningTaskTarget); Rect targetRect = new Rect(); mHelper.getSwipeUpDestinationAndLength( mActivity.getDeviceProfile(), mActivity, targetRect); clipHelper.updateTargetRect(targetRect); - + clipHelper.prepareAnimation(false /* isOpening */); ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1); - valueAnimator.setDuration(RECENTS_LAUNCH_DURATION).setInterpolator(FAST_OUT_SLOW_IN); - valueAnimator.addUpdateListener((v) -> { - clipHelper.applyTransform(targetCompats, (float) v.getAnimatedValue()); - }); + valueAnimator.setDuration(RECENTS_LAUNCH_DURATION); + valueAnimator.setInterpolator(TOUCH_RESPONSE_INTERPOLATOR); + valueAnimator.addUpdateListener((v) -> + clipHelper.applyTransform(targetSet, (float) v.getAnimatedValue())); + + if (targetSet.isAnimatingHome()) { + // If we are animating home, fade in the opening targets + RemoteAnimationTargetSet openingSet = + new RemoteAnimationTargetSet(targetCompats, MODE_OPENING); + + TransactionCompat transaction = new TransactionCompat(); + valueAnimator.addUpdateListener((v) -> { + for (RemoteAnimationTargetCompat app : openingSet.apps) { + transaction.setAlpha(app.leash, (float) v.getAnimatedValue()); + } + transaction.apply(); + }); + } anim.play(valueAnimator); return anim; } diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index 22b175779..d60574676 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -15,23 +15,26 @@ */ package com.android.quickstep; -import static com.android.launcher3.Utilities.getPrefs; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_QUICK_SCRUB; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_SWIPE_UP; -import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_HIDE_BACK_BUTTON; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON; +import static com.android.systemui.shared.system.SettingsCompat.SWIPE_UP_SETTING_NAME; +import android.content.ContentResolver; import android.content.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.content.res.Resources; +import android.database.ContentObserver; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.RemoteException; +import android.provider.Settings; import android.support.annotation.WorkerThread; import android.util.Log; import com.android.launcher3.MainThreadExecutor; +import com.android.launcher3.Utilities; +import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.util.UiThreadHelper; import com.android.systemui.shared.recents.ISystemUiProxy; @@ -42,15 +45,20 @@ import java.util.concurrent.ExecutionException; * * - FLAG_DISABLE_QUICK_SCRUB * - FLAG_DISABLE_SWIPE_UP - * - FLAG_HIDE_BACK_BUTTON * - FLAG_SHOW_OVERVIEW_BUTTON * * @see com.android.systemui.shared.system.NavigationBarCompat.InteractionType and associated flags. */ -public class OverviewInteractionState implements OnSharedPreferenceChangeListener { +public class OverviewInteractionState { private static final String TAG = "OverviewFlags"; + private static final String HAS_ENABLED_QUICKSTEP_ONCE = "launcher.has_enabled_quickstep_once"; + private static final String SWIPE_UP_SETTING_AVAILABLE_RES_NAME = + "config_swipe_up_gesture_setting_available"; + private static final String SWIPE_UP_ENABLED_DEFAULT_RES_NAME = + "config_swipe_up_gesture_default"; + // We do not need any synchronization for this variable as its only written on UI thread. private static OverviewInteractionState INSTANCE; @@ -70,42 +78,48 @@ public class OverviewInteractionState implements OnSharedPreferenceChangeListene return INSTANCE; } - public static final String KEY_SWIPE_UP_ENABLED = "pref_enable_quickstep"; - private static final int MSG_SET_PROXY = 200; - private static final int MSG_SET_BACK_BUTTON_VISIBLE = 201; + private static final int MSG_SET_BACK_BUTTON_ALPHA = 201; private static final int MSG_SET_SWIPE_UP_ENABLED = 202; + private final SwipeUpGestureEnabledSettingObserver mSwipeUpSettingObserver; + + private final Context mContext; private final Handler mUiHandler; private final Handler mBgHandler; // These are updated on the background thread private ISystemUiProxy mISystemUiProxy; - private boolean mBackButtonVisible = true; private boolean mSwipeUpEnabled = true; + private Runnable mOnSwipeUpSettingChangedListener; + private OverviewInteractionState(Context context) { + mContext = context; + + // Data posted to the uihandler will be sent to the bghandler. Data is sent to uihandler + // because of its high send frequency and data may be very different than the previous value + // For example, send back alpha on uihandler to avoid flickering when setting its visibility mUiHandler = new Handler(this::handleUiMessage); mBgHandler = new Handler(UiThreadHelper.getBackgroundLooper(), this::handleBgMessage); - SharedPreferences prefs = getPrefs(context); - prefs.registerOnSharedPreferenceChangeListener(this); - onSharedPreferenceChanged(prefs, KEY_SWIPE_UP_ENABLED); + if (getSystemBooleanRes(SWIPE_UP_SETTING_AVAILABLE_RES_NAME)) { + mSwipeUpSettingObserver = new SwipeUpGestureEnabledSettingObserver(mUiHandler, + context.getContentResolver()); + mSwipeUpSettingObserver.register(); + } else { + mSwipeUpSettingObserver = null; + mSwipeUpEnabled = getSystemBooleanRes(SWIPE_UP_ENABLED_DEFAULT_RES_NAME); + } } - @Override - public void onSharedPreferenceChanged(SharedPreferences prefs, String s) { - if (KEY_SWIPE_UP_ENABLED.equals(s)) { - mUiHandler.removeMessages(MSG_SET_SWIPE_UP_ENABLED); - boolean swipeUpEnabled = prefs.getBoolean(s, true); - mUiHandler.obtainMessage(MSG_SET_SWIPE_UP_ENABLED, - swipeUpEnabled ? 1 : 0, 0).sendToTarget(); - } + public boolean isSwipeUpGestureEnabled() { + return mSwipeUpEnabled; } - public void setBackButtonVisible(boolean visible) { - mUiHandler.removeMessages(MSG_SET_BACK_BUTTON_VISIBLE); - mUiHandler.obtainMessage(MSG_SET_BACK_BUTTON_VISIBLE, visible ? 1 : 0, 0) + public void setBackButtonAlpha(float alpha, boolean animate) { + mUiHandler.removeMessages(MSG_SET_BACK_BUTTON_ALPHA); + mUiHandler.obtainMessage(MSG_SET_BACK_BUTTON_ALPHA, animate ? 1 : 0, 0, alpha) .sendToTarget(); } @@ -114,7 +128,7 @@ public class OverviewInteractionState implements OnSharedPreferenceChangeListene } private boolean handleUiMessage(Message msg) { - mBgHandler.obtainMessage(msg.what, msg.arg1, msg.arg2).sendToTarget(); + mBgHandler.obtainMessage(msg.what, msg.arg1, msg.arg2, msg.obj).sendToTarget(); return true; } @@ -123,27 +137,34 @@ public class OverviewInteractionState implements OnSharedPreferenceChangeListene case MSG_SET_PROXY: mISystemUiProxy = (ISystemUiProxy) msg.obj; break; - case MSG_SET_BACK_BUTTON_VISIBLE: - mBackButtonVisible = msg.arg1 != 0; - break; + case MSG_SET_BACK_BUTTON_ALPHA: + applyBackButtonAlpha((float) msg.obj, msg.arg1 == 1); + return true; case MSG_SET_SWIPE_UP_ENABLED: mSwipeUpEnabled = msg.arg1 != 0; + resetHomeBounceSeenOnQuickstepEnabledFirstTime(); + + if (mOnSwipeUpSettingChangedListener != null) { + mOnSwipeUpSettingChangedListener.run(); + } break; } applyFlags(); return true; } + public void setOnSwipeUpSettingChangedListener(Runnable listener) { + mOnSwipeUpSettingChangedListener = listener; + } + @WorkerThread private void applyFlags() { if (mISystemUiProxy == null) { return; } - int flags; - if (mSwipeUpEnabled) { - flags = mBackButtonVisible ? 0 : FLAG_HIDE_BACK_BUTTON; - } else { + int flags = 0; + if (!mSwipeUpEnabled) { flags = FLAG_DISABLE_SWIPE_UP | FLAG_DISABLE_QUICK_SCRUB | FLAG_SHOW_OVERVIEW_BUTTON; } try { @@ -152,4 +173,69 @@ public class OverviewInteractionState implements OnSharedPreferenceChangeListene Log.w(TAG, "Unable to update overview interaction flags", e); } } + + @WorkerThread + private void applyBackButtonAlpha(float alpha, boolean animate) { + if (mISystemUiProxy == null) { + return; + } + try { + mISystemUiProxy.setBackButtonAlpha(alpha, animate); + } catch (RemoteException e) { + Log.w(TAG, "Unable to update overview back button alpha", e); + } + } + + private class SwipeUpGestureEnabledSettingObserver extends ContentObserver { + private Handler mHandler; + private ContentResolver mResolver; + private final int defaultValue; + + SwipeUpGestureEnabledSettingObserver(Handler handler, ContentResolver resolver) { + super(handler); + mHandler = handler; + mResolver = resolver; + defaultValue = getSystemBooleanRes(SWIPE_UP_ENABLED_DEFAULT_RES_NAME) ? 1 : 0; + } + + public void register() { + mResolver.registerContentObserver(Settings.Secure.getUriFor(SWIPE_UP_SETTING_NAME), + false, this); + mSwipeUpEnabled = getValue(); + resetHomeBounceSeenOnQuickstepEnabledFirstTime(); + } + + @Override + public void onChange(boolean selfChange) { + super.onChange(selfChange); + mHandler.removeMessages(MSG_SET_SWIPE_UP_ENABLED); + mHandler.obtainMessage(MSG_SET_SWIPE_UP_ENABLED, getValue() ? 1 : 0, 0).sendToTarget(); + } + + private boolean getValue() { + return Settings.Secure.getInt(mResolver, SWIPE_UP_SETTING_NAME, defaultValue) == 1; + } + } + + private boolean getSystemBooleanRes(String resName) { + Resources res = Resources.getSystem(); + int resId = res.getIdentifier(resName, "bool", "android"); + + if (resId != 0) { + return res.getBoolean(resId); + } else { + Log.e(TAG, "Failed to get system resource ID. Incompatible framework version?"); + return false; + } + } + + private void resetHomeBounceSeenOnQuickstepEnabledFirstTime() { + if (mSwipeUpEnabled && !Utilities.getPrefs(mContext).getBoolean( + HAS_ENABLED_QUICKSTEP_ONCE, true)) { + Utilities.getPrefs(mContext).edit() + .putBoolean(HAS_ENABLED_QUICKSTEP_ONCE, true) + .putBoolean(DiscoveryBounce.HOME_BOUNCE_SEEN, false) + .apply(); + } + } } diff --git a/quickstep/src/com/android/quickstep/QuickScrubController.java b/quickstep/src/com/android/quickstep/QuickScrubController.java index fd089b592..abb479dea 100644 --- a/quickstep/src/com/android/quickstep/QuickScrubController.java +++ b/quickstep/src/com/android/quickstep/QuickScrubController.java @@ -16,15 +16,18 @@ package com.android.quickstep; +import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; + +import android.util.Log; import android.view.HapticFeedbackConstants; +import android.view.animation.Interpolator; import com.android.launcher3.Alarm; import com.android.launcher3.BaseActivity; import com.android.launcher3.OnAlarmListener; import com.android.launcher3.Utilities; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; -import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; -import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; @@ -36,15 +39,20 @@ import com.android.quickstep.views.TaskView; */ public class QuickScrubController implements OnAlarmListener { - public static final int QUICK_SCRUB_START_DURATION = 210; + public static final int QUICK_SCRUB_FROM_APP_START_DURATION = 240; + public static final int QUICK_SCRUB_FROM_HOME_START_DURATION = 150; + // We want the translation y to finish faster than the rest of the animation. + public static final float QUICK_SCRUB_TRANSLATION_Y_FACTOR = 5f / 6; + public static final Interpolator QUICK_SCRUB_START_INTERPOLATOR = FAST_OUT_SLOW_IN; /** * Snap to a new page when crossing these thresholds. The first and last auto-advance. */ private static final float[] QUICK_SCRUB_THRESHOLDS = new float[] { - 0.05f, 0.35f, 0.65f, 0.95f + 0.04f, 0.27f, 0.50f, 0.73f, 0.96f }; + private static final String TAG = "QuickScrubController"; private static final boolean ENABLE_AUTO_ADVANCE = true; private static final long AUTO_ADVANCE_DELAY = 500; private static final int QUICKSCRUB_SNAP_DURATION_PER_PAGE = 325; @@ -55,9 +63,12 @@ public class QuickScrubController implements OnAlarmListener { private final BaseActivity mActivity; private boolean mInQuickScrub; + private boolean mWaitingForTaskLaunch; private int mQuickScrubSection; private boolean mStartedFromHome; private boolean mFinishedTransitionToQuickScrub; + private Runnable mOnFinishedTransitionToQuickScrubRunnable; + private ActivityControlHelper mActivityControlHelper; public QuickScrubController(BaseActivity activity, RecentsView recentsView) { mActivity = activity; @@ -68,11 +79,13 @@ public class QuickScrubController implements OnAlarmListener { } } - public void onQuickScrubStart(boolean startingFromHome) { + public void onQuickScrubStart(boolean startingFromHome, ActivityControlHelper controlHelper) { + prepareQuickScrub(TAG); mInQuickScrub = true; mStartedFromHome = startingFromHome; mQuickScrubSection = 0; mFinishedTransitionToQuickScrub = false; + mActivityControlHelper = controlHelper; snapToNextTaskIfAvailable(); mActivity.getUserEventDispatcher().resetActionDurationMillis(); @@ -85,26 +98,61 @@ public class QuickScrubController implements OnAlarmListener { } int page = mRecentsView.getNextPage(); Runnable launchTaskRunnable = () -> { - TaskView taskView = ((TaskView) mRecentsView.getPageAt(page)); + TaskView taskView = mRecentsView.getPageAt(page); if (taskView != null) { - taskView.launchTask(true); + mWaitingForTaskLaunch = true; + taskView.launchTask(true, (result) -> { + if (!result) { + taskView.notifyTaskLaunchFailed(TAG); + breakOutOfQuickScrub(); + } else { + mActivity.getUserEventDispatcher().logTaskLaunchOrDismiss(Touch.DRAGDROP, + LauncherLogProto.Action.Direction.NONE, page, + TaskUtils.getComponentKeyForTask(taskView.getTask().key)); + } + mWaitingForTaskLaunch = false; + }, taskView.getHandler()); } else { - // Break out of quick scrub so user can interact with launcher. - mActivity.onBackPressed(); + breakOutOfQuickScrub(); } + mActivityControlHelper = null; }; int snapDuration = Math.abs(page - mRecentsView.getPageNearestToCenterOfScreen()) * QUICKSCRUB_END_SNAP_DURATION_PER_PAGE; - if (mRecentsView.snapToPage(page, snapDuration)) { + if (mRecentsView.getChildCount() > 0 && mRecentsView.snapToPage(page, snapDuration)) { // Settle on the page then launch it mRecentsView.setNextPageSwitchRunnable(launchTaskRunnable); } else { // No page move needed, just launch it - launchTaskRunnable.run(); + if (mFinishedTransitionToQuickScrub) { + launchTaskRunnable.run(); + } else { + mOnFinishedTransitionToQuickScrubRunnable = launchTaskRunnable; + } + } + } + + /** + * Initializes the UI for quick scrub, returns true if success. + */ + public boolean prepareQuickScrub(String tag) { + if (mWaitingForTaskLaunch || mInQuickScrub) { + Log.d(tag, "Waiting for last scrub to finish, will skip this interaction"); + return false; + } + mOnFinishedTransitionToQuickScrubRunnable = null; + mRecentsView.setNextPageSwitchRunnable(null); + return true; + } + + /** + * Attempts to go to normal overview or back to home, so UI doesn't prevent user interaction. + */ + private void breakOutOfQuickScrub() { + if (mRecentsView.getChildCount() == 0 || mActivityControlHelper == null + || !mActivityControlHelper.switchToRecentsIfVisible(false)) { + mActivity.onBackPressed(); } - mActivity.getUserEventDispatcher().logActionOnControl(Touch.DRAGDROP, - ControlType.QUICK_SCRUB_BUTTON, null, mStartedFromHome ? - ContainerType.WORKSPACE : ContainerType.APP); } public void onQuickScrubProgress(float progress) { @@ -135,20 +183,39 @@ public class QuickScrubController implements OnAlarmListener { public void onFinishedTransitionToQuickScrub() { mFinishedTransitionToQuickScrub = true; + Runnable action = mOnFinishedTransitionToQuickScrubRunnable; + // Clear the runnable before executing it, to prevent potential recursion. + mOnFinishedTransitionToQuickScrubRunnable = null; + if (action != null) { + action.run(); + } } public void snapToNextTaskIfAvailable() { - if (!mStartedFromHome && mInQuickScrub && mRecentsView.getChildCount() > 0) { - mRecentsView.snapToPage(mRecentsView.getNextPage() + 1, QUICK_SCRUB_START_DURATION); + if (mInQuickScrub && mRecentsView.getChildCount() > 0) { + int duration = mStartedFromHome ? QUICK_SCRUB_FROM_HOME_START_DURATION + : QUICK_SCRUB_FROM_APP_START_DURATION; + int pageToGoTo = mStartedFromHome ? 0 : mRecentsView.getNextPage() + 1; + goToPageWithHaptic(pageToGoTo, duration, true /* forceHaptic */, + QUICK_SCRUB_START_INTERPOLATOR); } } private void goToPageWithHaptic(int pageToGoTo) { + goToPageWithHaptic(pageToGoTo, -1 /* overrideDuration */, false /* forceHaptic */, null); + } + + private void goToPageWithHaptic(int pageToGoTo, int overrideDuration, boolean forceHaptic, + Interpolator interpolator) { pageToGoTo = Utilities.boundToRange(pageToGoTo, 0, mRecentsView.getPageCount() - 1); - if (pageToGoTo != mRecentsView.getNextPage()) { - int duration = Math.abs(pageToGoTo - mRecentsView.getNextPage()) + boolean snappingToPage = pageToGoTo != mRecentsView.getNextPage(); + if (snappingToPage) { + int duration = overrideDuration > -1 ? overrideDuration + : Math.abs(pageToGoTo - mRecentsView.getNextPage()) * QUICKSCRUB_SNAP_DURATION_PER_PAGE; - mRecentsView.snapToPage(pageToGoTo, duration); + mRecentsView.snapToPage(pageToGoTo, duration, interpolator); + } + if (snappingToPage || forceHaptic) { mRecentsView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); } @@ -157,6 +224,12 @@ public class QuickScrubController implements OnAlarmListener { @Override public void onAlarm(Alarm alarm) { int currPage = mRecentsView.getNextPage(); + boolean recentsVisible = mActivityControlHelper != null + && mActivityControlHelper.getVisibleRecentsView() != null; + if (!recentsVisible) { + Log.w(TAG, "Failed to auto advance; recents not visible"); + return; + } if (mQuickScrubSection == QUICK_SCRUB_THRESHOLDS.length && currPage < mRecentsView.getPageCount() - 1) { goToPageWithHaptic(currPage + 1); diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index cf60fdff6..b472d611a 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -15,15 +15,35 @@ */ package com.android.quickstep; +import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; +import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE; + +import static com.android.launcher3.LauncherAppTransitionManagerImpl.RECENTS_LAUNCH_DURATION; +import static com.android.launcher3.LauncherAppTransitionManagerImpl.STATUS_BAR_TRANSITION_DURATION; +import static com.android.quickstep.TaskUtils.getRecentsWindowAnimator; +import static com.android.quickstep.TaskUtils.taskIsATargetWithMode; +import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; import android.app.ActivityOptions; +import android.content.Intent; +import android.content.res.Configuration; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.view.View; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; +import com.android.launcher3.DeviceProfile; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherAnimationRunner; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; +import com.android.launcher3.anim.Interpolators; import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.uioverrides.UiFactory; import com.android.launcher3.util.SystemUiController; @@ -31,29 +51,40 @@ import com.android.launcher3.util.Themes; import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.fallback.FallbackRecentsView; import com.android.quickstep.fallback.RecentsRootView; +import com.android.quickstep.util.ClipAnimationHelper; +import com.android.quickstep.views.RecentsViewContainer; +import com.android.quickstep.views.TaskView; +import com.android.systemui.shared.system.ActivityOptionsCompat; +import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; +import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; +import com.android.systemui.shared.system.RemoteAnimationTargetCompat; + +import java.io.FileDescriptor; +import java.io.PrintWriter; /** * A simple activity to show the recently launched tasks */ public class RecentsActivity extends BaseDraggingActivity { + private Handler mUiHandler = new Handler(Looper.getMainLooper()); private RecentsRootView mRecentsRootView; private FallbackRecentsView mFallbackRecentsView; + private RecentsViewContainer mOverviewPanelContainer; + + private Configuration mOldConfig; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // In case we are reusing IDP, create a copy so that we dont conflict with Launcher - // activity. - LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); - setDeviceProfile(appState != null - ? appState.getInvariantDeviceProfile().getDeviceProfile(this).copy(this) - : new InvariantDeviceProfile(this).getDeviceProfile(this)); + mOldConfig = new Configuration(getResources().getConfiguration()); + initDeviceProfile(); setContentView(R.layout.fallback_recents_activity); mRecentsRootView = findViewById(R.id.drag_layer); mFallbackRecentsView = findViewById(R.id.overview_panel); + mOverviewPanelContainer = findViewById(R.id.overview_panel_container); mRecentsRootView.setup(); @@ -63,6 +94,64 @@ public class RecentsActivity extends BaseDraggingActivity { } @Override + public void onConfigurationChanged(Configuration newConfig) { + int diff = newConfig.diff(mOldConfig); + if ((diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0) { + onHandleConfigChanged(); + } + mOldConfig.setTo(newConfig); + super.onConfigurationChanged(newConfig); + } + + @Override + public void onMultiWindowModeChanged(boolean isInMultiWindowMode, Configuration newConfig) { + onHandleConfigChanged(); + super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig); + } + + public void onRootViewSizeChanged() { + if (isInMultiWindowModeCompat()) { + onHandleConfigChanged(); + } + } + + private void onHandleConfigChanged() { + mUserEventDispatcher = null; + initDeviceProfile(); + + AbstractFloatingView.closeOpenViews(this, true, + AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE); + dispatchDeviceProfileChanged(); + + mRecentsRootView.setup(); + reapplyUi(); + } + + @Override + protected void reapplyUi() { + mRecentsRootView.dispatchInsets(); + } + + private void initDeviceProfile() { + // In case we are reusing IDP, create a copy so that we dont conflict with Launcher + // activity. + LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); + if (isInMultiWindowModeCompat()) { + InvariantDeviceProfile idp = appState == null + ? new InvariantDeviceProfile(this) : appState.getInvariantDeviceProfile(); + DeviceProfile dp = idp.getDeviceProfile(this); + mDeviceProfile = mRecentsRootView == null ? dp.copy(this) + : dp.getMultiWindowProfile(this, mRecentsRootView.getLastKnownSize()); + } else { + // If we are reusing the Invariant device profile, make a copy. + mDeviceProfile = appState == null + ? new InvariantDeviceProfile(this).getDeviceProfile(this) + : appState.getInvariantDeviceProfile().getDeviceProfile(this).copy(this); + } + onDeviceProfileInitiated(); + } + + @Override public BaseDragLayer getDragLayer() { return mRecentsRootView; } @@ -77,14 +166,62 @@ public class RecentsActivity extends BaseDraggingActivity { return (T) mFallbackRecentsView; } + public RecentsViewContainer getOverviewPanelContainer() { + return mOverviewPanelContainer; + } + @Override public BadgeInfo getBadgeInfoForItem(ItemInfo info) { return null; } @Override - public ActivityOptions getActivityLaunchOptions(View v, boolean useDefaultLaunchOptions) { - return null; + public ActivityOptions getActivityLaunchOptions(final View v, boolean useDefaultLaunchOptions) { + if (useDefaultLaunchOptions || !(v instanceof TaskView)) { + return null; + } + + final TaskView taskView = (TaskView) v; + RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mUiHandler, + true /* startAtFrontOfQueue */) { + + @Override + public void onCreateAnimation(RemoteAnimationTargetCompat[] targetCompats, + AnimationResult result) { + result.setAnimation(composeRecentsLaunchAnimator(taskView, targetCompats)); + } + }; + return ActivityOptionsCompat.makeRemoteAnimation(new RemoteAnimationAdapterCompat( + runner, RECENTS_LAUNCH_DURATION, + RECENTS_LAUNCH_DURATION - STATUS_BAR_TRANSITION_DURATION)); + } + + /** + * Composes the animations for a launch from the recents list if possible. + */ + private AnimatorSet composeRecentsLaunchAnimator(TaskView taskView, + RemoteAnimationTargetCompat[] targets) { + AnimatorSet target = new AnimatorSet(); + boolean activityClosing = taskIsATargetWithMode(targets, getTaskId(), MODE_CLOSING); + ClipAnimationHelper helper = new ClipAnimationHelper(); + target.play(getRecentsWindowAnimator(taskView, !activityClosing, targets, helper) + .setDuration(RECENTS_LAUNCH_DURATION)); + + // Found a visible recents task that matches the opening app, lets launch the app from there + if (activityClosing) { + Animator adjacentAnimation = mFallbackRecentsView + .createAdjacentPageAnimForTaskLaunch(taskView, helper); + adjacentAnimation.setInterpolator(Interpolators.TOUCH_RESPONSE_INTERPOLATOR); + adjacentAnimation.setDuration(RECENTS_LAUNCH_DURATION); + adjacentAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mFallbackRecentsView.resetTaskVisuals(); + } + }); + target.play(adjacentAnimation); + } + return target; } @Override @@ -92,8 +229,20 @@ public class RecentsActivity extends BaseDraggingActivity { @Override protected void onStart() { + // Set the alpha to 1 before calling super, as it may get set back to 0 due to + // onActivityStart callback. + mFallbackRecentsView.setContentAlpha(1); super.onStart(); UiFactory.onStart(this); + mFallbackRecentsView.resetTaskVisuals(); + } + + @Override + protected void onStop() { + super.onStop(); + + // Workaround for b/78520668, explicitly trim memory once UI is hidden + onTrimMemory(TRIM_MEMORY_UI_HIDDEN); } @Override @@ -103,8 +252,33 @@ public class RecentsActivity extends BaseDraggingActivity { } @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + RecentsActivityTracker.onRecentsActivityNewIntent(this); + } + + @Override protected void onDestroy() { super.onDestroy(); RecentsActivityTracker.onRecentsActivityDestroy(this); } + + @Override + public void onBackPressed() { + // TODO: Launch the task we came from + startHome(); + } + + public void startHome() { + startActivity(new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_HOME) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + } + + @Override + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.println(prefix + "Misc:"); + dumpMisc(writer); + } } diff --git a/quickstep/src/com/android/quickstep/RecentsActivityTracker.java b/quickstep/src/com/android/quickstep/RecentsActivityTracker.java index 77f0e7a53..fb6090e2a 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivityTracker.java +++ b/quickstep/src/com/android/quickstep/RecentsActivityTracker.java @@ -22,6 +22,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; +import com.android.launcher3.MainThreadExecutor; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; import com.android.quickstep.util.RemoteAnimationProvider; @@ -34,9 +35,8 @@ import java.util.function.BiPredicate; @TargetApi(Build.VERSION_CODES.P) public class RecentsActivityTracker implements ActivityInitListener { - private static final Object LOCK = new Object(); - private static WeakReference<RecentsActivityTracker> sTracker = new WeakReference<>(null); private static WeakReference<RecentsActivity> sCurrentActivity = new WeakReference<>(null); + private static final Scheduler sScheduler = new Scheduler(); private final BiPredicate<RecentsActivity, Boolean> mOnInitListener; @@ -46,42 +46,20 @@ public class RecentsActivityTracker implements ActivityInitListener { @Override public void register() { - synchronized (LOCK) { - sTracker = new WeakReference<>(this); - } + sScheduler.schedule(this); } @Override public void unregister() { - synchronized (LOCK) { - if (sTracker.get() == this) { - sTracker.clear(); - } - } + sScheduler.clearReference(this); } - public static void onRecentsActivityCreate(RecentsActivity activity) { - synchronized (LOCK) { - RecentsActivityTracker tracker = sTracker.get(); - if (tracker != null && tracker.mOnInitListener.test(activity, false)) { - sTracker.clear(); - } - sCurrentActivity = new WeakReference<>(activity); - } - } - - public static void onRecentsActivityDestroy(RecentsActivity activity) { - synchronized (LOCK) { - if (sCurrentActivity.get() == activity) { - sCurrentActivity.clear(); - } - } + private boolean init(RecentsActivity activity, boolean visible) { + return mOnInitListener.test(activity, visible); } public static RecentsActivity getCurrentActivity() { - synchronized (LOCK) { - return sCurrentActivity.get(); - } + return sCurrentActivity.get(); } @Override @@ -92,4 +70,62 @@ public class RecentsActivityTracker implements ActivityInitListener { Bundle options = animProvider.toActivityOptions(handler, duration).toBundle(); context.startActivity(intent, options); } + + public static void onRecentsActivityCreate(RecentsActivity activity) { + sCurrentActivity = new WeakReference<>(activity); + sScheduler.initIfPending(activity, false); + } + + + public static void onRecentsActivityNewIntent(RecentsActivity activity) { + sScheduler.initIfPending(activity, activity.isStarted()); + } + + public static void onRecentsActivityDestroy(RecentsActivity activity) { + if (sCurrentActivity.get() == activity) { + sCurrentActivity.clear(); + } + } + + + private static class Scheduler implements Runnable { + + private WeakReference<RecentsActivityTracker> mPendingTracker = new WeakReference<>(null); + private MainThreadExecutor mMainThreadExecutor; + + public synchronized void schedule(RecentsActivityTracker tracker) { + mPendingTracker = new WeakReference<>(tracker); + if (mMainThreadExecutor == null) { + mMainThreadExecutor = new MainThreadExecutor(); + } + mMainThreadExecutor.execute(this); + } + + @Override + public void run() { + RecentsActivity activity = sCurrentActivity.get(); + if (activity != null) { + initIfPending(activity, activity.isStarted()); + } + } + + public synchronized boolean initIfPending(RecentsActivity activity, boolean alreadyOnHome) { + RecentsActivityTracker tracker = mPendingTracker.get(); + if (tracker != null) { + if (!tracker.init(activity, alreadyOnHome)) { + mPendingTracker.clear(); + } + return true; + } + return false; + } + + public synchronized boolean clearReference(RecentsActivityTracker tracker) { + if (mPendingTracker.get() == tracker) { + mPendingTracker.clear(); + return true; + } + return false; + } + } } diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationInterpolator.java b/quickstep/src/com/android/quickstep/RecentsAnimationInterpolator.java deleted file mode 100644 index fdeb0c170..000000000 --- a/quickstep/src/com/android/quickstep/RecentsAnimationInterpolator.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2018 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; - -import android.graphics.Rect; - -import com.android.launcher3.Utilities; - -/** - * Helper class to interpolate the animation between a task view representation and an actual - * window. - */ -public class RecentsAnimationInterpolator { - - public static class TaskWindowBounds { - public float taskScale = 1f; - public float taskX = 0f; - public float taskY = 0f; - - public float winScale = 1f; - public float winX = 0f; - public float winY = 0f; - public Rect winCrop = new Rect(); - - @Override - public String toString() { - return "taskScale=" + taskScale + " taskX=" + taskX + " taskY=" + taskY - + " winScale=" + winScale + " winX=" + winX + " winY=" + winY - + " winCrop=" + winCrop; - } - } - - private TaskWindowBounds mTmpTaskWindowBounds = new TaskWindowBounds(); - private Rect mTmpInsets = new Rect(); - - private Rect mWindow; - private Rect mInsetWindow; - private Rect mInsets; - private Rect mTask; - private Rect mTaskInsets; - private Rect mThumbnail; - - private float mInitialTaskScale; - private float mInitialTaskTranslationX; - private float mFinalTaskScale; - private Rect mScaledTask; - private Rect mTargetTask; - private Rect mSrcWindow; - - public RecentsAnimationInterpolator(Rect window, Rect insets, Rect task, Rect taskInsets, - float taskScale, float taskTranslationX) { - mWindow = window; - mInsets = insets; - mTask = task; - mTaskInsets = taskInsets; - mInsetWindow = new Rect(window); - Utilities.insetRect(mInsetWindow, insets); - - mThumbnail = new Rect(task); - Utilities.insetRect(mThumbnail, taskInsets); - mInitialTaskScale = taskScale; - mInitialTaskTranslationX = taskTranslationX; - mFinalTaskScale = (float) mInsetWindow.width() / mThumbnail.width(); - mScaledTask = new Rect(task); - Utilities.scaleRectAboutCenter(mScaledTask, mFinalTaskScale); - Rect finalScaledTaskInsets = new Rect(taskInsets); - Utilities.scaleRect(finalScaledTaskInsets, mFinalTaskScale); - mTargetTask = new Rect(mInsetWindow); - mTargetTask.offsetTo(window.left + insets.left - finalScaledTaskInsets.left, - window.top + insets.top - finalScaledTaskInsets.top); - - float initialWinScale = 1f / mFinalTaskScale; - Rect scaledWindow = new Rect(mInsetWindow); - Utilities.scaleRectAboutCenter(scaledWindow, initialWinScale); - Rect scaledInsets = new Rect(insets); - Utilities.scaleRect(scaledInsets, initialWinScale); - mSrcWindow = new Rect(scaledWindow); - mSrcWindow.offsetTo(mThumbnail.left - scaledInsets.left, - mThumbnail.top - scaledInsets.top); - } - - public TaskWindowBounds interpolate(float t) { - mTmpTaskWindowBounds.taskScale = Utilities.mapRange(t, - mInitialTaskScale, mFinalTaskScale); - mTmpTaskWindowBounds.taskX = Utilities.mapRange(t, - mInitialTaskTranslationX, mTargetTask.left - mScaledTask.left); - mTmpTaskWindowBounds.taskY = Utilities.mapRange(t, - 0, mTargetTask.top - mScaledTask.top); - - float taskScale = Utilities.mapRange(t, 1, mFinalTaskScale); - mTmpTaskWindowBounds.winScale = taskScale / mFinalTaskScale; - mTmpTaskWindowBounds.winX = Utilities.mapRange(t, - mSrcWindow.left, 0); - mTmpTaskWindowBounds.winY = Utilities.mapRange(t, - mSrcWindow.top, 0); - - mTmpInsets.set(mInsets); - Utilities.scaleRect(mTmpInsets, (1f - t)); - mTmpTaskWindowBounds.winCrop.set(mWindow); - Utilities.insetRect(mTmpTaskWindowBounds.winCrop, mTmpInsets); - - return mTmpTaskWindowBounds; - } -} diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java b/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java index 12f8d52b8..30b10b0ea 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java @@ -15,28 +15,33 @@ */ package com.android.quickstep; +import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.TraceHelper; -import com.android.systemui.shared.system.BackgroundExecutor; +import com.android.launcher3.util.UiThreadHelper; +import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; -import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import java.util.concurrent.ExecutorService; /** * Wrapper around RecentsAnimationController to help with some synchronization */ public class RecentsAnimationWrapper { - public RecentsAnimationControllerCompat controller; - public RemoteAnimationTargetCompat[] targets; + public RemoteAnimationTargetSet targetSet; + private RecentsAnimationControllerCompat mController; private boolean mInputConsumerEnabled = false; private boolean mBehindSystemBars = true; private boolean mSplitScreenMinimized = false; + private final ExecutorService mExecutorService = + new LooperExecutor(UiThreadHelper.getBackgroundLooper()); + public synchronized void setController( - RecentsAnimationControllerCompat controller, RemoteAnimationTargetCompat[] targets) { + RecentsAnimationControllerCompat controller, RemoteAnimationTargetSet targetSet) { TraceHelper.partitionSection("RecentsController", "Set controller " + controller); - this.controller = controller; - this.targets = targets; + this.mController = controller; + this.targetSet = targetSet; if (mInputConsumerEnabled) { enableInputConsumer(); @@ -48,16 +53,16 @@ public class RecentsAnimationWrapper { * on the background thread. */ public void finish(boolean toHome, Runnable onFinishComplete) { - BackgroundExecutor.get().submit(() -> { - synchronized (this) { - TraceHelper.endSection("RecentsController", - "Finish " + controller + ", toHome=" + toHome); - if (controller != null) { - controller.setInputConsumerEnabled(false); - controller.finish(toHome); - if (onFinishComplete != null) { - onFinishComplete.run(); - } + mExecutorService.submit(() -> { + RecentsAnimationControllerCompat controller = mController; + mController = null; + TraceHelper.endSection("RecentsController", + "Finish " + controller + ", toHome=" + toHome); + if (controller != null) { + controller.setInputConsumerEnabled(false); + controller.finish(toHome); + if (onFinishComplete != null) { + onFinishComplete.run(); } } }); @@ -66,13 +71,12 @@ public class RecentsAnimationWrapper { public void enableInputConsumer() { mInputConsumerEnabled = true; if (mInputConsumerEnabled) { - BackgroundExecutor.get().submit(() -> { - synchronized (this) { - TraceHelper.partitionSection("RecentsController", - "Enabling consumer on " + controller); - if (controller != null) { - controller.setInputConsumerEnabled(true); - } + mExecutorService.submit(() -> { + RecentsAnimationControllerCompat controller = mController; + TraceHelper.partitionSection("RecentsController", + "Enabling consumer on " + controller); + if (controller != null) { + controller.setInputConsumerEnabled(true); } }); } @@ -83,13 +87,12 @@ public class RecentsAnimationWrapper { return; } mBehindSystemBars = behindSystemBars; - BackgroundExecutor.get().submit(() -> { - synchronized (this) { - TraceHelper.partitionSection("RecentsController", - "Setting behind system bars on " + controller); - if (controller != null) { - controller.setAnimationTargetsBehindSystemBars(behindSystemBars); - } + mExecutorService.submit(() -> { + RecentsAnimationControllerCompat controller = mController; + TraceHelper.partitionSection("RecentsController", + "Setting behind system bars on " + controller); + if (controller != null) { + controller.setAnimationTargetsBehindSystemBars(behindSystemBars); } }); } @@ -105,14 +108,28 @@ public class RecentsAnimationWrapper { return; } mSplitScreenMinimized = minimized; - BackgroundExecutor.get().submit(() -> { - synchronized (this) { - TraceHelper.partitionSection("RecentsController", - "Setting minimize dock on " + controller); - if (controller != null) { - controller.setSplitScreenMinimized(minimized); - } + mExecutorService.submit(() -> { + RecentsAnimationControllerCompat controller = mController; + TraceHelper.partitionSection("RecentsController", + "Setting minimize dock on " + controller); + if (controller != null) { + controller.setSplitScreenMinimized(minimized); + } + }); + } + + public void hideCurrentInputMethod() { + mExecutorService.submit(() -> { + RecentsAnimationControllerCompat controller = mController; + TraceHelper.partitionSection("RecentsController", + "Hiding currentinput method on " + controller); + if (controller != null) { + controller.hideCurrentInputMethod(); } }); } + + public RecentsAnimationControllerCompat getController() { + return mController; + } } diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index 4652f2d65..9c2c8b313 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -15,6 +15,8 @@ */ package com.android.quickstep; +import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId; + import android.annotation.TargetApi; import android.app.ActivityManager; import android.content.ComponentCallbacks2; @@ -26,8 +28,10 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.os.Looper; +import android.os.RemoteException; import android.os.UserHandle; import android.support.annotation.WorkerThread; +import android.util.Log; import android.util.LruCache; import android.util.SparseArray; import android.view.accessibility.AccessibilityManager; @@ -85,7 +89,8 @@ public class RecentsModel extends TaskStackChangeListener { private int mTaskChangeId; private ISystemUiProxy mSystemUiProxy; private boolean mClearAssistCacheOnStackChange = true; - private final boolean mPreloadTasksInBackground; + private final boolean mIsLowRamDevice; + private boolean mPreloadTasksInBackground; private final AccessibilityManager mAccessibilityManager; private RecentsModel(Context context) { @@ -93,7 +98,7 @@ public class RecentsModel extends TaskStackChangeListener { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - mPreloadTasksInBackground = !activityManager.isLowRamDevice(); + mIsLowRamDevice = activityManager.isLowRamDevice(); mMainThreadExecutor = new MainThreadExecutor(); Resources res = context.getResources(); @@ -158,6 +163,10 @@ public class RecentsModel extends TaskStackChangeListener { return requestId; } + public void setPreloadTasksInBackground(boolean preloadTasksInBackground) { + mPreloadTasksInBackground = preloadTasksInBackground && !mIsLowRamDevice; + } + @Override public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { mTaskChangeId++; @@ -183,7 +192,7 @@ public class RecentsModel extends TaskStackChangeListener { @Override public void onTaskStackChangedBackground() { int userId = UserHandle.myUserId(); - if (!mPreloadTasksInBackground || !checkCurrentUserId(userId, false /* debug */)) { + if (!mPreloadTasksInBackground || !checkCurrentOrManagedUserId(userId, mContext)) { // TODO: Only register this for the current user return; } @@ -234,6 +243,19 @@ public class RecentsModel extends TaskStackChangeListener { mRecentsTaskLoader.onTrimMemory(level); } + public void onOverviewShown(boolean fromHome, String tag) { + if (mSystemUiProxy == null) { + return; + } + try { + mSystemUiProxy.onOverviewShown(fromHome); + } catch (RemoteException e) { + Log.w(tag, + "Failed to notify SysUI of overview shown from " + (fromHome ? "home" : "app") + + ": ", e); + } + } + @WorkerThread public void preloadAssistData(int taskId, Bundle data) { mMainThreadExecutor.execute(() -> { diff --git a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java index 2ebf2525f..228af8e90 100644 --- a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java +++ b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java @@ -27,7 +27,6 @@ import android.os.RemoteException; import android.os.UserHandle; import android.util.Log; import android.view.View; -import android.view.ViewTreeObserver.OnPreDrawListener; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; @@ -101,13 +100,9 @@ public class TaskSystemShortcut<T extends SystemShortcut> extends SystemShortcut } } - public static class SplitScreen extends TaskSystemShortcut implements OnPreDrawListener, - DeviceProfile.OnDeviceProfileChangeListener, View.OnLayoutChangeListener { + public static class SplitScreen extends TaskSystemShortcut { private Handler mHandler; - private RecentsView mRecentsView; - private TaskView mTaskView; - private BaseDraggingActivity mActivity; public SplitScreen() { super(R.drawable.ic_split_screen, R.string.recent_task_option_split_screen); @@ -125,16 +120,45 @@ public class TaskSystemShortcut<T extends SystemShortcut> extends SystemShortcut if (!task.isDockable) { return null; } - mActivity = activity; - mRecentsView = activity.getOverviewPanel(); - mTaskView = taskView; + final RecentsView recentsView = activity.getOverviewPanel(); + final TaskThumbnailView thumbnailView = taskView.getThumbnail(); return (v -> { + final View.OnLayoutChangeListener onLayoutChangeListener = + new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int l, int t, int r, int b, + int oldL, int oldT, int oldR, int oldB) { + taskView.getRootView().removeOnLayoutChangeListener(this); + recentsView.removeIgnoreResetTask(taskView); + + // Start animating in the side pages once launcher has been resized + recentsView.dismissTask(taskView, false, false); + } + }; + + final DeviceProfile.OnDeviceProfileChangeListener onDeviceProfileChangeListener = + new DeviceProfile.OnDeviceProfileChangeListener() { + @Override + public void onDeviceProfileChanged(DeviceProfile dp) { + activity.removeOnDeviceProfileChangeListener(this); + if (dp.isMultiWindowMode) { + taskView.getRootView().addOnLayoutChangeListener( + onLayoutChangeListener); + } + } + }; + AbstractFloatingView.closeOpenViews(activity, true, AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE); + final int navBarPosition = WindowManagerWrapper.getInstance().getNavBarPosition(); + if (navBarPosition == WindowManagerWrapper.NAV_BAR_POS_INVALID) { + return; + } + boolean dockTopOrLeft = navBarPosition != WindowManagerWrapper.NAV_BAR_POS_LEFT; if (ActivityManagerWrapper.getInstance().startActivityFromRecents(taskId, - ActivityOptionsCompat.makeSplitScreenOptions(true))) { + ActivityOptionsCompat.makeSplitScreenOptions(dockTopOrLeft))) { ISystemUiProxy sysUiProxy = RecentsModel.getInstance(activity).getSystemUiProxy(); try { sysUiProxy.onSplitScreenInvoked(); @@ -145,15 +169,14 @@ public class TaskSystemShortcut<T extends SystemShortcut> extends SystemShortcut // Add a device profile change listener to kick off animating the side tasks // once we enter multiwindow mode and relayout - activity.addOnDeviceProfileChangeListener(this); + activity.addOnDeviceProfileChangeListener(onDeviceProfileChangeListener); final Runnable animStartedListener = () -> { // Hide the task view and wait for the window to be resized // TODO: Consider animating in launcher and do an in-place start activity // afterwards - mRecentsView.addIgnoreResetTask(mTaskView); - mTaskView.setAlpha(0f); - mTaskView.getViewTreeObserver().addOnPreDrawListener(SplitScreen.this); + recentsView.addIgnoreResetTask(taskView); + taskView.setAlpha(0f); }; final int[] position = new int[2]; @@ -179,35 +202,12 @@ public class TaskSystemShortcut<T extends SystemShortcut> extends SystemShortcut } }); } - - @Override - public boolean onPreDraw() { - mTaskView.getViewTreeObserver().removeOnPreDrawListener(this); - WindowManagerWrapper.getInstance().endProlongedAnimations(); - return true; - } - - @Override - public void onDeviceProfileChanged(DeviceProfile dp) { - mActivity.removeOnDeviceProfileChangeListener(this); - if (dp.isMultiWindowMode) { - mTaskView.getRootView().addOnLayoutChangeListener(this); - } - } - - @Override - public void onLayoutChange(View v, int l, int t, int r, int b, - int oldL, int oldT, int oldR, int oldB) { - mTaskView.getRootView().removeOnLayoutChangeListener(this); - mRecentsView.removeIgnoreResetTask(mTaskView); - - // Start animating in the side pages once launcher has been resized - mRecentsView.dismissTask(mTaskView, false, false); - } } public static class Pin extends TaskSystemShortcut { + private static final String TAG = Pin.class.getSimpleName(); + private Handler mHandler; public Pin() { @@ -237,6 +237,8 @@ public class TaskSystemShortcut<T extends SystemShortcut> extends SystemShortcut } catch (RemoteException e) { Log.w(TAG, "Failed to start screen pinning: ", e); } + } else { + taskView.notifyTaskLaunchFailed(TAG); } }; taskView.launchTask(true, resultCallback, mHandler); diff --git a/quickstep/src/com/android/quickstep/TaskUtils.java b/quickstep/src/com/android/quickstep/TaskUtils.java index 5bf1d07db..2b0c98f93 100644 --- a/quickstep/src/com/android/quickstep/TaskUtils.java +++ b/quickstep/src/com/android/quickstep/TaskUtils.java @@ -16,25 +16,49 @@ package com.android.quickstep; +import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR; +import static com.android.systemui.shared.recents.utilities.Utilities.getNextFrameNumber; +import static com.android.systemui.shared.recents.utilities.Utilities.getSurface; +import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING; + +import android.animation.ValueAnimator; +import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.graphics.RectF; import android.os.UserHandle; import android.util.Log; +import android.view.Surface; +import android.view.View; +import com.android.launcher3.BaseDraggingActivity; +import com.android.launcher3.ItemInfo; +import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.util.ComponentKey; +import com.android.quickstep.util.ClipAnimationHelper; +import com.android.quickstep.util.MultiValueUpdateListener; +import com.android.quickstep.util.RemoteAnimationTargetSet; +import com.android.quickstep.views.RecentsView; +import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.system.RemoteAnimationTargetCompat; + +import java.util.List; /** * Contains helpful methods for retrieving data from {@link Task}s. - * TODO: remove this once we switch to getting the icon and label from IconCache. */ public class TaskUtils { private static final String TAG = "TaskUtils"; + /** + * TODO: remove this once we switch to getting the icon and label from IconCache. + */ public static CharSequence getTitle(Context context, Task task) { LauncherAppsCompat launcherAppsCompat = LauncherAppsCompat.getInstance(context); UserManagerCompat userManagerCompat = UserManagerCompat.getInstance(context); @@ -53,4 +77,150 @@ public class TaskUtils { public static ComponentKey getComponentKeyForTask(Task.TaskKey taskKey) { return new ComponentKey(taskKey.getComponent(), UserHandle.of(taskKey.userId)); } + + + /** + * Try to find a TaskView that corresponds with the component of the launched view. + * + * If this method returns a non-null TaskView, it will be used in composeRecentsLaunchAnimation. + * Otherwise, we will assume we are using a normal app transition, but it's possible that the + * opening remote target (which we don't get until onAnimationStart) will resolve to a TaskView. + */ + public static TaskView findTaskViewToLaunch( + BaseDraggingActivity activity, View v, RemoteAnimationTargetCompat[] targets) { + if (v instanceof TaskView) { + return (TaskView) v; + } + RecentsView recentsView = activity.getOverviewPanel(); + + // It's possible that the launched view can still be resolved to a visible task view, check + // the task id of the opening task and see if we can find a match. + if (v.getTag() instanceof ItemInfo) { + ItemInfo itemInfo = (ItemInfo) v.getTag(); + ComponentName componentName = itemInfo.getTargetComponent(); + int userId = itemInfo.user.getIdentifier(); + if (componentName != null) { + for (int i = 0; i < recentsView.getChildCount(); i++) { + TaskView taskView = recentsView.getPageAt(i); + if (recentsView.isTaskViewVisible(taskView)) { + Task.TaskKey key = taskView.getTask().key; + if (componentName.equals(key.getComponent()) && userId == key.userId) { + return taskView; + } + } + } + } + } + + if (targets == null) { + return null; + } + // Resolve the opening task id + int openingTaskId = -1; + for (RemoteAnimationTargetCompat target : targets) { + if (target.mode == MODE_OPENING) { + openingTaskId = target.taskId; + break; + } + } + + // If there is no opening task id, fall back to the normal app icon launch animation + if (openingTaskId == -1) { + return null; + } + + // If the opening task id is not currently visible in overview, then fall back to normal app + // icon launch animation + TaskView taskView = recentsView.getTaskView(openingTaskId); + if (taskView == null || !recentsView.isTaskViewVisible(taskView)) { + return null; + } + return taskView; + } + + /** + * @return Animator that controls the window of the opening targets for the recents launch + * animation. + */ + public static ValueAnimator getRecentsWindowAnimator(TaskView v, boolean skipViewChanges, + RemoteAnimationTargetCompat[] targets, final ClipAnimationHelper inOutHelper) { + final ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); + appAnimator.setInterpolator(TOUCH_RESPONSE_INTERPOLATOR); + appAnimator.addUpdateListener(new MultiValueUpdateListener() { + + // Defer fading out the view until after the app window gets faded in + final FloatProp mViewAlpha = new FloatProp(1f, 0f, 75, 75, LINEAR); + final FloatProp mTaskAlpha = new FloatProp(0f, 1f, 0, 75, LINEAR); + + final RemoteAnimationTargetSet mTargetSet; + + final RectF mThumbnailRect; + private Surface mSurface; + private long mFrameNumber; + + { + mTargetSet = new RemoteAnimationTargetSet(targets, MODE_OPENING); + inOutHelper.setTaskTransformCallback((t, app) -> { + t.setAlpha(app.leash, mTaskAlpha.value); + + if (!skipViewChanges) { + t.deferTransactionUntil(app.leash, mSurface, mFrameNumber); + } + }); + + inOutHelper.prepareAnimation(true /* isOpening */); + inOutHelper.fromTaskThumbnailView(v.getThumbnail(), (RecentsView) v.getParent(), + mTargetSet.apps.length == 0 ? null : mTargetSet.apps[0]); + + mThumbnailRect = new RectF(inOutHelper.getTargetRect()); + mThumbnailRect.offset(-v.getTranslationX(), -v.getTranslationY()); + Utilities.scaleRectFAboutCenter(mThumbnailRect, 1 / v.getScaleX()); + } + + @Override + public void onUpdate(float percent) { + mSurface = getSurface(v); + mFrameNumber = mSurface != null ? getNextFrameNumber(mSurface) : -1; + if (mFrameNumber == -1) { + // Booo, not cool! Our surface got destroyed, so no reason to animate anything. + Log.w(TAG, "Failed to animate, surface got destroyed."); + return; + } + + RectF taskBounds = inOutHelper.applyTransform(mTargetSet, 1 - percent); + if (!skipViewChanges) { + float scale = taskBounds.width() / mThumbnailRect.width(); + v.setScaleX(scale); + v.setScaleY(scale); + v.setTranslationX(taskBounds.centerX() - mThumbnailRect.centerX()); + v.setTranslationY(taskBounds.centerY() - mThumbnailRect.centerY()); + v.setAlpha(mViewAlpha.value); + } + } + }); + return appAnimator; + } + + public static boolean taskIsATargetWithMode(RemoteAnimationTargetCompat[] targets, + int taskId, int mode) { + for (RemoteAnimationTargetCompat target : targets) { + if (target.mode == mode && target.taskId == taskId) { + return true; + } + } + return false; + } + + public static boolean checkCurrentOrManagedUserId(int currentUserId, Context context) { + if (currentUserId == UserHandle.myUserId()) { + return true; + } + List<UserHandle> allUsers = UserManagerCompat.getInstance(context).getUserProfiles(); + for (int i = allUsers.size() - 1; i >= 0; i--) { + if (currentUserId == allUsers.get(i).getIdentifier()) { + return true; + } + } + return false; + } } diff --git a/quickstep/src/com/android/quickstep/TouchConsumer.java b/quickstep/src/com/android/quickstep/TouchConsumer.java index 1290ec337..aa844d80d 100644 --- a/quickstep/src/com/android/quickstep/TouchConsumer.java +++ b/quickstep/src/com/android/quickstep/TouchConsumer.java @@ -46,7 +46,7 @@ public interface TouchConsumer extends Consumer<MotionEvent> { default void onQuickScrubProgress(float progress) { } - default void onQuickStep(float eventX, float eventY, long eventTime) { } + default void onQuickStep(MotionEvent ev) { } /** * Called on the binder thread to allow the consumer to process the motion event before it is diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 84d8983e0..aecb66c77 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -21,7 +21,7 @@ import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_POINTER_DOWN; import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; - +import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_NONE; import android.annotation.TargetApi; @@ -39,13 +39,12 @@ import android.util.SparseArray; import android.view.Choreographer; import android.view.MotionEvent; import android.view.VelocityTracker; -import android.view.View; import android.view.ViewConfiguration; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.MainThreadExecutor; -import com.android.launcher3.R; import com.android.launcher3.util.TraceHelper; +import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.ISystemUiProxy; @@ -99,8 +98,6 @@ public class TouchInteractionService extends Service { public void onBind(ISystemUiProxy iSystemUiProxy) { mISystemUiProxy = iSystemUiProxy; mRecentsModel.setSystemUiProxy(mISystemUiProxy); - RemoteRunnable.executeSafely(() -> mISystemUiProxy.setRecentsOnboardingText( - getResources().getString(R.string.recents_swipe_up_onboarding))); mOverviewInteractionState.setSystemUiProxy(mISystemUiProxy); } @@ -150,6 +147,11 @@ public class TouchInteractionService extends Service { TraceHelper.endSection("SysUiBinder", "onQuickStep"); } + + @Override + public void onTip(int actionType, int viewType) { + mOverviewCommandHelper.onTip(actionType, viewType); + } }; private final TouchConsumer mNoOpTouchConsumer = (ev) -> {}; @@ -167,6 +169,7 @@ public class TouchInteractionService extends Service { private ISystemUiProxy mISystemUiProxy; private OverviewCommandHelper mOverviewCommandHelper; private OverviewInteractionState mOverviewInteractionState; + private OverviewCallbacks mOverviewCallbacks; private Choreographer mMainThreadChoreographer; private Choreographer mBackgroundThreadChoreographer; @@ -176,11 +179,13 @@ public class TouchInteractionService extends Service { super.onCreate(); mAM = ActivityManagerWrapper.getInstance(); mRecentsModel = RecentsModel.getInstance(this); + mRecentsModel.setPreloadTasksInBackground(true); mMainThreadExecutor = new MainThreadExecutor(); mOverviewCommandHelper = new OverviewCommandHelper(this); mMainThreadChoreographer = Choreographer.getInstance(); mEventQueue = new MotionEventQueue(mMainThreadChoreographer, mNoOpTouchConsumer); mOverviewInteractionState = OverviewInteractionState.getInstance(this); + mOverviewCallbacks = OverviewCallbacks.get(this); sConnected = true; @@ -191,6 +196,7 @@ public class TouchInteractionService extends Service { @Override public void onDestroy() { + mOverviewCommandHelper.onDestroy(); sConnected = false; super.onDestroy(); } @@ -222,16 +228,17 @@ public class TouchInteractionService extends Service { if (runningTaskInfo == null && !forceToLauncher) { return mNoOpTouchConsumer; } else if (forceToLauncher || - runningTaskInfo.topActivity.equals(mOverviewCommandHelper.launcher)) { + runningTaskInfo.topActivity.equals(mOverviewCommandHelper.overviewComponent)) { return getOverviewConsumer(); } else { if (tracker == null) { tracker = VelocityTracker.obtain(); } return new OtherActivityTouchConsumer(this, runningTaskInfo, mRecentsModel, - mOverviewCommandHelper.homeIntent, + mOverviewCommandHelper.overviewIntent, mOverviewCommandHelper.getActivityControlHelper(), mMainThreadExecutor, - mBackgroundThreadChoreographer, downHitTarget, tracker); + mBackgroundThreadChoreographer, downHitTarget, mOverviewCallbacks, + tracker); } } @@ -249,7 +256,7 @@ public class TouchInteractionService extends Service { private final ActivityControlHelper<T> mActivityHelper; private final T mActivity; - private final View mTarget; + private final BaseDragLayer mTarget; private final int[] mLocationOnScreen = new int[2]; private final PointF mDownPos = new PointF(); private final int mTouchSlop; @@ -257,7 +264,6 @@ public class TouchInteractionService extends Service { private boolean mTrackingStarted = false; private boolean mInvalidated = false; - private boolean mHadWindowFocusOnDown; private float mLastProgress = 0; private boolean mStartPending = false; @@ -282,8 +288,7 @@ public class TouchInteractionService extends Service { if (action == ACTION_DOWN) { mTrackingStarted = false; mDownPos.set(ev.getX(), ev.getY()); - mHadWindowFocusOnDown = mTarget.hasWindowFocus(); - } else if (!mTrackingStarted && mHadWindowFocusOnDown) { + } else if (!mTrackingStarted) { switch (action) { case ACTION_POINTER_UP: case ACTION_POINTER_DOWN: @@ -294,7 +299,6 @@ public class TouchInteractionService extends Service { case ACTION_MOVE: { float displacement = ev.getY() - mDownPos.y; if (Math.abs(displacement) >= mTouchSlop) { - mTrackingStarted = true; mTarget.getLocationOnScreen(mLocationOnScreen); // Send a down event only when mTouchSlop is crossed. @@ -302,6 +306,7 @@ public class TouchInteractionService extends Service { down.setAction(ACTION_DOWN); sendEvent(down); down.recycle(); + mTrackingStarted = true; } } } @@ -320,22 +325,45 @@ public class TouchInteractionService extends Service { int flags = ev.getEdgeFlags(); ev.setEdgeFlags(flags | EDGE_NAV_BAR); ev.offsetLocation(-mLocationOnScreen[0], -mLocationOnScreen[1]); - mTarget.dispatchTouchEvent(ev); + if (!mTrackingStarted) { + mTarget.onInterceptTouchEvent(ev); + } + mTarget.onTouchEvent(ev); ev.offsetLocation(mLocationOnScreen[0], mLocationOnScreen[1]); ev.setEdgeFlags(flags); } @Override + public void onQuickStep(MotionEvent ev) { + if (mInvalidated) { + return; + } + OverviewCallbacks.get(mActivity).closeAllWindows(); + ActivityManagerWrapper.getInstance() + .closeSystemWindows(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS); + } + + @Override public void updateTouchTracking(int interactionType) { if (mInvalidated) { return; } if (interactionType == INTERACTION_QUICK_SCRUB) { - mStartPending = true; + if (!mQuickScrubController.prepareQuickScrub(TAG)) { + mInvalidated = true; + return; + } + OverviewCallbacks.get(mActivity).closeAllWindows(); + ActivityManagerWrapper.getInstance() + .closeSystemWindows(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS); + mStartPending = true; Runnable action = () -> { - mQuickScrubController.onQuickScrubStart( - mActivityHelper.onQuickInteractionStart(mActivity, true)); + if (!mQuickScrubController.prepareQuickScrub(TAG)) { + mInvalidated = true; + return; + } + mActivityHelper.onQuickInteractionStart(mActivity, null, true); mQuickScrubController.onQuickScrubProgress(mLastProgress); mStartPending = false; @@ -343,7 +371,6 @@ public class TouchInteractionService extends Service { mQuickScrubController.onQuickScrubEnd(); mEndPending = false; } - }; mActivityHelper.executeOnWindowAvailable(mActivity, action); @@ -365,7 +392,7 @@ public class TouchInteractionService extends Service { @Override public void onQuickScrubProgress(float progress) { mLastProgress = progress; - if (mInvalidated || mEndPending) { + if (mInvalidated || mStartPending) { return; } mQuickScrubController.onQuickScrubProgress(progress); diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index d4c35e0b1..84b217648 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -15,54 +15,57 @@ */ package com.android.quickstep; -import static com.android.launcher3.anim.Interpolators.ACCEL_2; +import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER; +import static com.android.launcher3.Utilities.postAsyncCallback; +import static com.android.launcher3.anim.Interpolators.DEACCEL; import static com.android.launcher3.anim.Interpolators.LINEAR; -import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_START_DURATION; +import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_FROM_APP_START_DURATION; import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL; import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB; -import static com.android.systemui.shared.recents.utilities.Utilities - .postAtFrontOfQueueAsynchronously; -import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; -import android.content.res.Resources; +import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.SystemClock; +import android.support.annotation.AnyThread; import android.support.annotation.UiThread; import android.support.annotation.WorkerThread; import android.util.Log; import android.view.View; import android.view.ViewTreeObserver.OnDrawListener; +import android.view.WindowManager; import android.view.animation.Interpolator; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.DeviceProfile; +import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; -import com.android.launcher3.MainThreadExecutor; 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.anim.Interpolators; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.launcher3.util.MultiValueAlpha; +import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; import com.android.launcher3.util.TraceHelper; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; +import com.android.quickstep.ActivityControlHelper.AnimationFactory; import com.android.quickstep.ActivityControlHelper.LayoutListener; import com.android.quickstep.TouchConsumer.InteractionType; import com.android.quickstep.util.ClipAnimationHelper; -import com.android.quickstep.util.SysuiEventLogger; +import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.ThumbnailData; @@ -70,7 +73,7 @@ import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.LatencyTrackerCompat; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; -import com.android.systemui.shared.system.TransactionCompat; +import com.android.systemui.shared.system.WindowCallbacksCompat; import com.android.systemui.shared.system.WindowManagerWrapper; import java.util.StringJoiner; @@ -96,16 +99,30 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { private static final int STATE_HANDLER_INVALIDATED = 1 << 7; private static final int STATE_GESTURE_STARTED = 1 << 8; private static final int STATE_GESTURE_CANCELLED = 1 << 9; + private static final int STATE_GESTURE_COMPLETED = 1 << 10; // States for quick switch/scrub - private static final int STATE_SWITCH_TO_SCREENSHOT_COMPLETE = 1 << 10; - private static final int STATE_QUICK_SCRUB_START = 1 << 11; - private static final int STATE_QUICK_SCRUB_END = 1 << 12; + private static final int STATE_CURRENT_TASK_FINISHED = 1 << 11; + private static final int STATE_QUICK_SCRUB_START = 1 << 12; + private static final int STATE_QUICK_SCRUB_END = 1 << 13; + + private static final int STATE_CAPTURE_SCREENSHOT = 1 << 14; + private static final int STATE_SCREENSHOT_CAPTURED = 1 << 15; + + private static final int STATE_RESUME_LAST_TASK = 1 << 16; private static final int LAUNCHER_UI_STATES = STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_LAUNCHER_STARTED; + private static final int LONG_SWIPE_ENTER_STATE = + STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_LAUNCHER_STARTED + | STATE_APP_CONTROLLER_RECEIVED; + + private static final int LONG_SWIPE_START_STATE = + STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_LAUNCHER_STARTED + | STATE_APP_CONTROLLER_RECEIVED | STATE_SCREENSHOT_CAPTURED; + // For debugging, keep in sync with above states private static final String[] STATES = new String[] { "STATE_LAUNCHER_PRESENT", @@ -118,16 +135,21 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { "STATE_HANDLER_INVALIDATED", "STATE_GESTURE_STARTED", "STATE_GESTURE_CANCELLED", - "STATE_SWITCH_TO_SCREENSHOT_COMPLETE", - "STATE_QUICK_SWITCH", + "STATE_GESTURE_COMPLETED", + "STATE_CURRENT_TASK_FINISHED", "STATE_QUICK_SCRUB_START", - "STATE_QUICK_SCRUB_END" + "STATE_QUICK_SCRUB_END", + "STATE_CAPTURE_SCREENSHOT", + "STATE_SCREENSHOT_CAPTURED", + "STATE_RESUME_LAST_TASK", }; - private static final long MAX_SWIPE_DURATION = 200; - private static final long MIN_SWIPE_DURATION = 80; + public static final long MAX_SWIPE_DURATION = 350; + public static final long MIN_SWIPE_DURATION = 80; private static final float MIN_PROGRESS_FOR_OVERVIEW = 0.5f; + private static final float SWIPE_DURATION_MULTIPLIER = + Math.min(1 / MIN_PROGRESS_FOR_OVERVIEW, 1 / (1 - MIN_PROGRESS_FOR_OVERVIEW)); private final ClipAnimationHelper mClipAnimationHelper = new ClipAnimationHelper(); @@ -142,13 +164,16 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { // visible. private final AnimatedFloat mCurrentShift = new AnimatedFloat(this::updateFinalShift); - private final MainThreadExecutor mMainExecutor = new MainThreadExecutor(); + private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper()); private final Context mContext; - private final int mRunningTaskId; private final ActivityControlHelper<T> mActivityControlHelper; private final ActivityInitListener mActivityInitListener; + private final int mRunningTaskId; + private final RunningTaskInfo mRunningTaskInfo; + private ThumbnailData mTaskSnapshot; + private MultiStateCallback mStateCallback; private AnimatorPlaybackController mLauncherTransitionController; @@ -156,14 +181,16 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { private LayoutListener mLayoutListener; private RecentsView mRecentsView; private QuickScrubController mQuickScrubController; + private AnimationFactory mAnimationFactory = (t) -> { }; private Runnable mLauncherDrawnCallback; private boolean mWasLauncherAlreadyVisible; - private float mCurrentDisplacement; private boolean mGestureStarted; private int mLogAction = Touch.SWIPE; + private float mCurrentQuickScrubProgress; + private boolean mQuickScrubBlocked; private @InteractionType int mInteractionType = INTERACTION_NORMAL; @@ -174,19 +201,25 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { private final long mTouchTimeMs; private long mLauncherFrameDrawnTime; + private boolean mBgLongSwipeMode = false; + private boolean mUiLongSwipeMode = false; + private float mLongSwipeDisplacement = 0; + private LongSwipeHelper mLongSwipeController; + WindowTransformSwipeHandler(RunningTaskInfo runningTaskInfo, Context context, long touchTimeMs, ActivityControlHelper<T> controller) { mContext = context; + mRunningTaskInfo = runningTaskInfo; mRunningTaskId = runningTaskInfo.id; mTouchTimeMs = touchTimeMs; mActivityControlHelper = controller; mActivityInitListener = mActivityControlHelper .createActivityInitListener(this::onActivityInit); + initStateCallbacks(); // Register the input consumer on the UI thread, to ensure that it runs after any pending // unregister calls - mMainExecutor.execute(mInputConsumer::registerInputConsumer); - initStateCallbacks(); + executeOnUiThread(mInputConsumer::registerInputConsumer); } private void initStateCallbacks() { @@ -203,45 +236,66 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN, this::launcherFrameDrawn); mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_GESTURE_STARTED, - this::notifyGestureStarted); + this::notifyGestureStartedAsync); mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_STARTED | STATE_GESTURE_CANCELLED, this::resetStateForAnimationCancel); - mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_APP_CONTROLLER_RECEIVED - | STATE_SCALED_CONTROLLER_APP, + mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_APP_CONTROLLER_RECEIVED, + this::sendRemoteAnimationsToAnimationFactory); + + mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_SCALED_CONTROLLER_APP, + this::resumeLastTaskForQuickstep); + mStateCallback.addCallback(STATE_RESUME_LAST_TASK | STATE_APP_CONTROLLER_RECEIVED, this::resumeLastTask); + mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_APP_CONTROLLER_RECEIVED | STATE_ACTIVITY_MULTIPLIER_COMPLETE - | STATE_SCALED_CONTROLLER_RECENTS, + | STATE_CAPTURE_SCREENSHOT, this::switchToScreenshot); + + mStateCallback.addCallback(STATE_SCREENSHOT_CAPTURED | STATE_GESTURE_COMPLETED + | STATE_SCALED_CONTROLLER_RECENTS, + this::finishCurrentTransitionToHome); + mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_APP_CONTROLLER_RECEIVED | STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_SCALED_CONTROLLER_RECENTS - | STATE_SWITCH_TO_SCREENSHOT_COMPLETE, + | STATE_CURRENT_TASK_FINISHED + | STATE_GESTURE_COMPLETED, this::setupLauncherUiAfterSwipeUpAnimation); - mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_SCALED_CONTROLLER_APP, - this::reset); - mStateCallback.addCallback(STATE_HANDLER_INVALIDATED, this::invalidateHandler); mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_HANDLER_INVALIDATED, this::invalidateHandlerWithLauncher); + mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_HANDLER_INVALIDATED + | STATE_SCALED_CONTROLLER_APP, + this::notifyTransitionCancelled); - mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_QUICK_SCRUB_START, + mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_QUICK_SCRUB_START, this::onQuickScrubStart); - mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_QUICK_SCRUB_START + mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_QUICK_SCRUB_START | STATE_SCALED_CONTROLLER_RECENTS, this::onFinishedTransitionToQuickScrub); - mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_SWITCH_TO_SCREENSHOT_COMPLETE + mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_CURRENT_TASK_FINISHED | STATE_QUICK_SCRUB_END, this::switchToFinalAppAfterQuickScrub); + + mStateCallback.addCallback(LONG_SWIPE_ENTER_STATE, this::checkLongSwipeCanEnter); + mStateCallback.addCallback(LONG_SWIPE_START_STATE, this::checkLongSwipeCanStart); + } + + private void executeOnUiThread(Runnable action) { + if (Looper.myLooper() == mMainThreadHandler.getLooper()) { + action.run(); + } else { + postAsyncCallback(mMainThreadHandler, action); + } } private void setStateOnUiThread(int stateFlag) { - Handler handler = mMainExecutor.getHandler(); - if (Looper.myLooper() == handler.getLooper()) { + if (Looper.myLooper() == mMainThreadHandler.getLooper()) { mStateCallback.setState(stateFlag); } else { - postAtFrontOfQueueAsynchronously(handler, () -> mStateCallback.setState(stateFlag)); + postAsyncCallback(mMainThreadHandler, () -> mStateCallback.setState(stateFlag)); } } @@ -285,7 +339,11 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { mActivity = activity; // Override the visibility of the activity until the gesture actually starts and we swipe // up, or until we transition home and the home animation is composed - mActivity.setForceInvisible(true); + if (alreadyOnHome) { + mActivity.clearForceInvisibleFlag(INVISIBLE_BY_STATE_HANDLER); + } else { + mActivity.addForceInvisibleFlag(INVISIBLE_BY_STATE_HANDLER); + } mRecentsView = activity.getOverviewPanel(); mQuickScrubController = mRecentsView.getQuickScrubController(); @@ -304,33 +362,27 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { if (mActivity != activity) { return; } - if ((mStateCallback.getState() & STATE_HANDLER_INVALIDATED) != 0) { + if (mStateCallback.hasStates(STATE_HANDLER_INVALIDATED)) { return; } - mStateCallback.setState(STATE_LAUNCHER_STARTED); - mActivityControlHelper.prepareRecentsUI(mActivity, mWasLauncherAlreadyVisible); + mAnimationFactory = mActivityControlHelper.prepareRecentsUI(mActivity, + mWasLauncherAlreadyVisible, this::onAnimatorPlaybackControllerCreated); AbstractFloatingView.closeAllOpenViews(activity, mWasLauncherAlreadyVisible); if (mWasLauncherAlreadyVisible) { - mLauncherTransitionController = mActivityControlHelper - .createControllerForVisibleActivity(activity); - mLauncherTransitionController.dispatchOnStart(); - mLauncherTransitionController.setPlayFraction(mCurrentShift.value); - mStateCallback.setState(STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_LAUNCHER_DRAWN); } else { TraceHelper.beginSection("WTS-init"); - // TODO: Implement a better animation for fading in - View rootView = activity.getRootView(); - rootView.setAlpha(0); - rootView.getViewTreeObserver().addOnDrawListener(new OnDrawListener() { + View dragLayer = activity.getDragLayer(); + mActivityControlHelper.getAlphaProperty(activity).setValue(0); + dragLayer.getViewTreeObserver().addOnDrawListener(new OnDrawListener() { @Override public void onDraw() { TraceHelper.endSection("WTS-init", "Launcher frame is drawn"); - rootView.post(() -> - rootView.getViewTreeObserver().removeOnDrawListener(this)); + dragLayer.post(() -> + dragLayer.getViewTreeObserver().removeOnDrawListener(this)); if (activity != mActivity) { return; } @@ -341,8 +393,10 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { } mRecentsView.showTask(mRunningTaskId); - mRecentsView.setFirstTaskIconScaledDown(true /* isScaledDown */, false /* animate */); + mRecentsView.setRunningTaskHidden(true); + mRecentsView.setRunningTaskIconScaledDown(true /* isScaledDown */, false /* animate */); mLayoutListener.open(); + mStateCallback.setState(STATE_LAUNCHER_STARTED); } public void setLauncherOnDrawCallback(Runnable callback) { @@ -350,15 +404,22 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { } private void launcherFrameDrawn() { - View rootView = mActivity.getRootView(); - if (rootView.getAlpha() < 1) { + AlphaProperty property = mActivityControlHelper.getAlphaProperty(mActivity); + if (property.getValue() < 1) { if (mGestureStarted) { final MultiStateCallback callback = mStateCallback; - rootView.animate().alpha(1) - .setDuration(getFadeInDuration()) - .withEndAction(() -> callback.setState(STATE_ACTIVITY_MULTIPLIER_COMPLETE)); + ObjectAnimator animator = ObjectAnimator.ofFloat( + property, MultiValueAlpha.VALUE, 1); + animator.setDuration(getFadeInDuration()).addListener( + new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + callback.setState(STATE_ACTIVITY_MULTIPLIER_COMPLETE); + } + }); + animator.start(); } else { - rootView.setAlpha(1); + property.setValue(1); mStateCallback.setState(STATE_ACTIVITY_MULTIPLIER_COMPLETE); } } @@ -368,15 +429,16 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { mLauncherFrameDrawnTime = SystemClock.uptimeMillis(); } + private void sendRemoteAnimationsToAnimationFactory() { + mAnimationFactory.onRemoteAnimationReceived(mRecentsAnimationWrapper.targetSet); + } + private void initializeLauncherAnimationController() { mLayoutListener.setHandler(this); - onLauncherLayoutChanged(); - - final long transitionDelay = mLauncherFrameDrawnTime - mTouchTimeMs; - SysuiEventLogger.writeDummyRecentsTransition(transitionDelay); + buildAnimationController(); if (LatencyTrackerCompat.isEnabled(mContext)) { - LatencyTrackerCompat.logToggleRecents((int) transitionDelay); + LatencyTrackerCompat.logToggleRecents((int) (mLauncherFrameDrawnTime - mTouchTimeMs)); } } @@ -391,110 +453,108 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { } mInteractionType = interactionType; - setStateOnUiThread(STATE_QUICK_SCRUB_START); + setStateOnUiThread(STATE_QUICK_SCRUB_START | STATE_GESTURE_COMPLETED); // Start the window animation without waiting for launcher. - animateToProgress(1f, QUICK_SCRUB_START_DURATION); + animateToProgress(1f, QUICK_SCRUB_FROM_APP_START_DURATION, LINEAR); } @WorkerThread public void updateDisplacement(float displacement) { - mCurrentDisplacement = displacement; - - float translation = Utilities.boundToRange(-mCurrentDisplacement, 0, mTransitionDragLength); - float shift = mTransitionDragLength == 0 ? 0 : translation / mTransitionDragLength; - mCurrentShift.updateValue(shift); + // We are moving in the negative x/y direction + displacement = -displacement; + if (displacement > mTransitionDragLength) { + mCurrentShift.updateValue(1); + + if (!mBgLongSwipeMode) { + mBgLongSwipeMode = true; + executeOnUiThread(this::onLongSwipeEnabledUi); + } + mLongSwipeDisplacement = displacement - mTransitionDragLength; + executeOnUiThread(this::onLongSwipeDisplacementUpdated); + } else { + if (mBgLongSwipeMode) { + mBgLongSwipeMode = false; + executeOnUiThread(this::onLongSwipeDisabledUi); + } + float translation = Math.max(displacement, 0); + float shift = mTransitionDragLength == 0 ? 0 : translation / mTransitionDragLength; + mCurrentShift.updateValue(shift); + } } /** * Called by {@link #mLayoutListener} when launcher layout changes */ - public void onLauncherLayoutChanged() { + public void buildAnimationController() { initTransitionEndpoints(mActivity.getDeviceProfile()); + mAnimationFactory.createActivityController(mTransitionDragLength); + } - if (!mWasLauncherAlreadyVisible) { - mLauncherTransitionController = mActivityControlHelper - .createControllerForHiddenActivity(mActivity, mTransitionDragLength); - mLauncherTransitionController.setPlayFraction(mCurrentShift.value); - } + private void onAnimatorPlaybackControllerCreated(AnimatorPlaybackController anim) { + mLauncherTransitionController = anim; + mLauncherTransitionController.dispatchOnStart(); + mLauncherTransitionController.setPlayFraction(mCurrentShift.value); } @WorkerThread private void updateFinalShift() { float shift = mCurrentShift.value; - synchronized (mRecentsAnimationWrapper) { - if (mRecentsAnimationWrapper.controller != null) { - Interpolator interpolator = mInteractionType == INTERACTION_QUICK_SCRUB - ? ACCEL_2 : LINEAR; - float interpolated = interpolator.getInterpolation(shift); - mClipAnimationHelper.applyTransform(mRecentsAnimationWrapper.targets, interpolated); + RecentsAnimationControllerCompat controller = mRecentsAnimationWrapper.getController(); + if (controller != null) { + mClipAnimationHelper.applyTransform(mRecentsAnimationWrapper.targetSet, shift); + + // TODO: This logic is spartanic! + boolean passedThreshold = shift > 0.12f; + mRecentsAnimationWrapper.setAnimationTargetsBehindSystemBars(!passedThreshold); + if (mActivityControlHelper.shouldMinimizeSplitScreen()) { + mRecentsAnimationWrapper.setSplitScreenMinimizedForTransaction(passedThreshold); } } - if (mLauncherTransitionController != null) { - Runnable runOnUi = () -> { - if (mLauncherTransitionController == null) { - return; - } - mLauncherTransitionController.setPlayFraction(shift); - - // Make sure the window follows the first task if it moves, e.g. during quick scrub. - View firstTask = mRecentsView.getPageAt(0); - // The first task may be null if we are swiping up from a task that does not - // appear in the list (ie. the assistant) - if (firstTask != null) { - int scrollForFirstTask = mRecentsView.getScrollForPage(0); - int offsetFromFirstTask = (scrollForFirstTask - mRecentsView.getScrollX()); - mClipAnimationHelper.offsetTarget(firstTask.getScaleX(), - offsetFromFirstTask + firstTask.getTranslationX(), - mRecentsView.getTranslationY()); - } - if (mRecentsAnimationWrapper.controller != null) { - // TODO: This logic is spartanic! - boolean passedThreshold = shift > 0.12f; - mRecentsAnimationWrapper.setAnimationTargetsBehindSystemBars(!passedThreshold); - mRecentsAnimationWrapper.setSplitScreenMinimizedForTransaction(passedThreshold); - } - }; - if (Looper.getMainLooper() == Looper.myLooper()) { - runOnUi.run(); - } else { - // The fling operation completed even before the launcher was drawn - mMainExecutor.execute(runOnUi); - } + executeOnUiThread(this::updateFinalShiftUi); + } + + private void updateFinalShiftUi() { + if (mLauncherTransitionController == null) { + return; } + mLauncherTransitionController.setPlayFraction(mCurrentShift.value); } public void onRecentsAnimationStart(RecentsAnimationControllerCompat controller, - RemoteAnimationTargetCompat[] apps, Rect homeContentInsets, Rect minimizedHomeBounds) { - if (apps != null) { - // Use the top closing app to determine the insets for the animation - for (RemoteAnimationTargetCompat target : apps) { - if (target.mode == MODE_CLOSING) { - DeviceProfile dp = LauncherAppState.getIDP(mContext).getDeviceProfile(mContext); - final Rect homeStackBounds; - - if (minimizedHomeBounds != null) { - homeStackBounds = minimizedHomeBounds; - dp = dp.getMultiWindowProfile(mContext, - new Point(minimizedHomeBounds.width(), minimizedHomeBounds.height())); - dp.updateInsets(homeContentInsets); - } else { - homeStackBounds = new Rect(0, 0, dp.widthPx, dp.heightPx); - // TODO: Workaround for an existing issue where the home content insets are - // not valid immediately after rotation, just use the stable insets for now - Rect insets = new Rect(); - WindowManagerWrapper.getInstance().getStableInsets(insets); - dp.updateInsets(insets); - } + RemoteAnimationTargetSet targets, Rect homeContentInsets, Rect minimizedHomeBounds) { + LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); + InvariantDeviceProfile idp = appState == null ? + new InvariantDeviceProfile(mContext) : appState.getInvariantDeviceProfile(); + DeviceProfile dp = idp.getDeviceProfile(mContext); + final Rect overviewStackBounds; + RemoteAnimationTargetCompat runningTaskTarget = targets.findTask(mRunningTaskId); + + if (minimizedHomeBounds != null && runningTaskTarget != null) { + overviewStackBounds = mActivityControlHelper + .getOverviewWindowBounds(minimizedHomeBounds, runningTaskTarget); + dp = dp.getMultiWindowProfile(mContext, + new Point(minimizedHomeBounds.width(), minimizedHomeBounds.height())); + dp.updateInsets(homeContentInsets); + } else { + overviewStackBounds = new Rect(0, 0, dp.widthPx, dp.heightPx); + // If we are not in multi-window mode, home insets should be same as system insets. + Rect insets = new Rect(); + WindowManagerWrapper.getInstance().getStableInsets(insets); + dp = dp.copy(mContext); + dp.updateInsets(insets); + } + dp.updateIsSeascape(mContext.getSystemService(WindowManager.class)); - mClipAnimationHelper.updateSource(homeStackBounds, target); - initTransitionEndpoints(dp); - } - } + if (runningTaskTarget != null) { + mClipAnimationHelper.updateSource(overviewStackBounds, runningTaskTarget); } - mRecentsAnimationWrapper.setController(controller, apps); + mClipAnimationHelper.prepareAnimation(false /* isOpening */); + initTransitionEndpoints(dp); + + mRecentsAnimationWrapper.setController(controller, targets); setStateOnUiThread(STATE_APP_CONTROLLER_RECEIVED); } @@ -505,9 +565,10 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { } public void onGestureStarted() { - notifyGestureStarted(); + notifyGestureStartedAsync(); setStateOnUiThread(STATE_GESTURE_STARTED); mGestureStarted = true; + mRecentsAnimationWrapper.hideCurrentInputMethod(); mRecentsAnimationWrapper.enableInputConsumer(); } @@ -515,43 +576,56 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { * Notifies the launcher that the swipe gesture has started. This can be called multiple times * on both background and UI threads */ - private void notifyGestureStarted() { + @AnyThread + private void notifyGestureStartedAsync() { final T curActivity = mActivity; if (curActivity != null) { // Once the gesture starts, we can no longer transition home through the button, so // reset the force override of the activity visibility - mActivity.setForceInvisible(false); - mActivityControlHelper.onQuickstepGestureStarted( - curActivity, mWasLauncherAlreadyVisible); + mActivity.clearForceInvisibleFlag(INVISIBLE_BY_STATE_HANDLER); } } @WorkerThread public void onGestureEnded(float endVelocity) { - Resources res = mContext.getResources(); - float flingThreshold = res.getDimension(R.dimen.quickstep_fling_threshold_velocity); - boolean isFling = Math.abs(endVelocity) > flingThreshold; + float flingThreshold = mContext.getResources() + .getDimension(R.dimen.quickstep_fling_threshold_velocity); + boolean isFling = mGestureStarted && Math.abs(endVelocity) > flingThreshold; + setStateOnUiThread(STATE_GESTURE_COMPLETED); + + mLogAction = isFling ? Touch.FLING : Touch.SWIPE; + + if (mBgLongSwipeMode) { + executeOnUiThread(() -> onLongSwipeGestureFinishUi(endVelocity, isFling)); + } else { + handleNormalGestureEnd(endVelocity, isFling); + } + } + private void handleNormalGestureEnd(float endVelocity, boolean isFling) { long duration = MAX_SWIPE_DURATION; final float endShift; if (!isFling) { - endShift = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW ? 1 : 0; - mLogAction = Touch.SWIPE; + endShift = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW && mGestureStarted ? 1 : 0; + long expectedDuration = Math.abs(Math.round((endShift - mCurrentShift.value) + * MAX_SWIPE_DURATION * SWIPE_DURATION_MULTIPLIER)); + duration = Math.min(MAX_SWIPE_DURATION, expectedDuration); } else { endShift = endVelocity < 0 ? 1 : 0; - float minFlingVelocity = res.getDimension(R.dimen.quickstep_fling_min_velocity); + float minFlingVelocity = mContext.getResources() + .getDimension(R.dimen.quickstep_fling_min_velocity); if (Math.abs(endVelocity) > minFlingVelocity && mTransitionDragLength > 0) { float distanceToTravel = (endShift - mCurrentShift.value) * mTransitionDragLength; // we want the page's snap velocity to approximately match the velocity at // which the user flings, so we scale the duration by a value near to the - // derivative of the scroll interpolator at zero, ie. 5. - duration = 5 * Math.round(1000 * Math.abs(distanceToTravel / endVelocity)); + // derivative of the scroll interpolator at zero, ie. 2. + long baseDuration = Math.round(1000 * Math.abs(distanceToTravel / endVelocity)); + duration = Math.min(MAX_SWIPE_DURATION, 2 * baseDuration); } - mLogAction = Touch.FLING; } - animateToProgress(endShift, duration); + animateToProgress(endShift, duration, DEACCEL); } private void doLogGesture(boolean toLauncher) { @@ -571,24 +645,31 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { } /** Animates to the given progress, where 0 is the current app and 1 is overview. */ - private void animateToProgress(float progress, long duration) { + private void animateToProgress(float progress, long duration, Interpolator interpolator) { mIsGoingToHome = Float.compare(progress, 1) == 0; ObjectAnimator anim = mCurrentShift.animateToValue(progress).setDuration(duration); - anim.setInterpolator(Interpolators.SCROLL); + anim.setInterpolator(interpolator); anim.addListener(new AnimationSuccessListener() { @Override public void onAnimationSuccess(Animator animator) { - setStateOnUiThread(mIsGoingToHome ? - STATE_SCALED_CONTROLLER_RECENTS : STATE_SCALED_CONTROLLER_APP); + setStateOnUiThread(mIsGoingToHome + ? (STATE_SCALED_CONTROLLER_RECENTS | STATE_CAPTURE_SCREENSHOT) + : STATE_SCALED_CONTROLLER_APP); } }); anim.start(); } @UiThread + private void resumeLastTaskForQuickstep() { + setStateOnUiThread(STATE_RESUME_LAST_TASK); + doLogGesture(false /* toLauncher */); + reset(); + } + + @UiThread private void resumeLastTask() { mRecentsAnimationWrapper.finish(false /* toHome */, null); - doLogGesture(false /* toLauncher */); } public void reset() { @@ -608,13 +689,20 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { mActivityInitListener.unregister(); mInputConsumer.unregisterInputConsumer(); + mTaskSnapshot = null; } private void invalidateHandlerWithLauncher() { mLauncherTransitionController = null; mLayoutListener.finish(); + mActivityControlHelper.getAlphaProperty(mActivity).setValue(1); + + mRecentsView.setRunningTaskHidden(false); + mRecentsView.setRunningTaskIconScaledDown(false /* isScaledDown */, false /* animate */); + } - mRecentsView.setFirstTaskIconScaledDown(false /* isScaledDown */, false /* animate */); + private void notifyTransitionCancelled() { + mAnimationFactory.onTransitionCancelled(); } private void resetStateForAnimationCancel() { @@ -630,40 +718,38 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { private void switchToScreenshot() { boolean finishTransitionPosted = false; - final Runnable finishTransitionRunnable = () -> { - synchronized (mRecentsAnimationWrapper) { - mRecentsAnimationWrapper.finish(true /* toHome */, - () -> setStateOnUiThread(STATE_SWITCH_TO_SCREENSHOT_COMPLETE)); + RecentsAnimationControllerCompat controller = mRecentsAnimationWrapper.getController(); + if (controller != null) { + // Update the screenshot of the task + if (mTaskSnapshot == null) { + mTaskSnapshot = controller.screenshotTask(mRunningTaskId); } - }; - - synchronized (mRecentsAnimationWrapper) { - if (mRecentsAnimationWrapper.controller != null) { - TransactionCompat transaction = new TransactionCompat(); - for (RemoteAnimationTargetCompat app : mRecentsAnimationWrapper.targets) { - if (app.mode == MODE_CLOSING) { - // Update the screenshot of the task - ThumbnailData thumbnail = - mRecentsAnimationWrapper.controller.screenshotTask(app.taskId); - TaskView taskView = mRecentsView.updateThumbnail(app.taskId, thumbnail); - if (taskView != null) { - taskView.setAlpha(1); - // Defer finishing the animation until the next launcher frame with the - // new thumbnail - mActivityControlHelper.executeOnNextDraw(mActivity, taskView, - finishTransitionRunnable); - finishTransitionPosted = true; - } + TaskView taskView = mRecentsView.updateThumbnail(mRunningTaskId, mTaskSnapshot); + mRecentsView.setRunningTaskHidden(false); + if (taskView != null) { + // Defer finishing the animation until the next launcher frame with the + // new thumbnail + finishTransitionPosted = new WindowCallbacksCompat(taskView) { + + @Override + public void onPostDraw(Canvas canvas) { + setStateOnUiThread(STATE_SCREENSHOT_CAPTURED); + detach(); } - } - transaction.apply(); + }.attach(); } } if (!finishTransitionPosted) { - // If we haven't posted the transition end runnable, run it now - finishTransitionRunnable.run(); + // If we haven't posted a draw callback, set the state immediately. + setStateOnUiThread(STATE_SCREENSHOT_CAPTURED); + } + } + + private void finishCurrentTransitionToHome() { + synchronized (mRecentsAnimationWrapper) { + mRecentsAnimationWrapper.finish(true /* toHome */, + () -> setStateOnUiThread(STATE_CURRENT_TASK_FINISHED)); } - doLogGesture(true /* toLauncher */); } private void setupLauncherUiAfterSwipeUpAnimation() { @@ -674,27 +760,64 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { mActivityControlHelper.onSwipeUpComplete(mActivity); // Animate the first icon. - mRecentsView.setFirstTaskIconScaledDown(false /* isScaledDown */, true /* animate */); - + mRecentsView.setRunningTaskIconScaledDown(false /* isScaledDown */, true /* animate */); mRecentsView.setSwipeDownShouldLaunchApp(true); + RecentsModel.getInstance(mContext).onOverviewShown(false, TAG); + + doLogGesture(true /* toLauncher */); reset(); } private void onQuickScrubStart() { - mActivityControlHelper.onQuickInteractionStart(mActivity, mWasLauncherAlreadyVisible); - mQuickScrubController.onQuickScrubStart(false); + if (!mQuickScrubController.prepareQuickScrub(TAG)) { + mQuickScrubBlocked = true; + setStateOnUiThread(STATE_RESUME_LAST_TASK | STATE_HANDLER_INVALIDATED); + return; + } + if (mLauncherTransitionController != null) { + mLauncherTransitionController.getAnimationPlayer().end(); + mLauncherTransitionController = null; + } + + mActivityControlHelper.onQuickInteractionStart(mActivity, mRunningTaskInfo, false); + + // Inform the last progress in case we skipped before. + mQuickScrubController.onQuickScrubProgress(mCurrentQuickScrubProgress); + + // Make sure the window follows the first task if it moves, e.g. during quick scrub. + TaskView firstTask = mRecentsView.getPageAt(0); + // The first task may be null if we are swiping up from a task that does not + // appear in the list (i.e. the assistant) + if (firstTask != null) { + int scrollForFirstTask = mRecentsView.getScrollForPage(0); + int scrollForSecondTask = mRecentsView.getChildCount() > 1 + ? mRecentsView.getScrollForPage(1) : scrollForFirstTask; + int offsetFromFirstTask = scrollForFirstTask - scrollForSecondTask; + final float interpolation; + if (mRecentsView.getWidth() == 0) { + interpolation = scrollForSecondTask == scrollForFirstTask ? 0 : 1; + } else { + interpolation = (float) offsetFromFirstTask / (mRecentsView.getWidth() / 2); + } + mClipAnimationHelper.offsetTarget( + firstTask.getCurveScaleForInterpolation(interpolation), offsetFromFirstTask, + mActivityControlHelper.getTranslationYForQuickScrub(mActivity), + QuickScrubController.QUICK_SCRUB_START_INTERPOLATOR); + } } private void onFinishedTransitionToQuickScrub() { + if (mQuickScrubBlocked) { + return; + } mQuickScrubController.onFinishedTransitionToQuickScrub(); } public void onQuickScrubProgress(float progress) { - if (Looper.myLooper() != Looper.getMainLooper() || mQuickScrubController == null) { - // TODO: We can still get progress events while launcher is not ready on the worker - // thread. Keep track of last received progress and apply that progress when launcher - // is ready + mCurrentQuickScrubProgress = progress; + if (Looper.myLooper() != Looper.getMainLooper() || mQuickScrubController == null + || mQuickScrubBlocked) { return; } mQuickScrubController.onQuickScrubProgress(progress); @@ -705,6 +828,9 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { } private void switchToFinalAppAfterQuickScrub() { + if (mQuickScrubBlocked) { + return; + } mQuickScrubController.onQuickScrubEnd(); // Normally this is handled in reset(), but since we are still scrubbing after the @@ -736,4 +862,72 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { public void setGestureEndCallback(Runnable gestureEndCallback) { mGestureEndCallback = gestureEndCallback; } + + // Handling long swipe + private void onLongSwipeEnabledUi() { + mUiLongSwipeMode = true; + checkLongSwipeCanEnter(); + checkLongSwipeCanStart(); + } + + private void onLongSwipeDisabledUi() { + mUiLongSwipeMode = false; + + if (mLongSwipeController != null) { + mLongSwipeController.destroy(); + + // Rebuild animations + buildAnimationController(); + } + } + + private void onLongSwipeDisplacementUpdated() { + if (!mUiLongSwipeMode || mLongSwipeController == null) { + return; + } + + mLongSwipeController.onMove(mLongSwipeDisplacement); + } + + private void checkLongSwipeCanEnter() { + if (!mUiLongSwipeMode || !mStateCallback.hasStates(LONG_SWIPE_ENTER_STATE) + || !mActivityControlHelper.supportsLongSwipe(mActivity)) { + return; + } + + // We are entering long swipe mode, make sure the screen shot is captured. + mStateCallback.setState(STATE_CAPTURE_SCREENSHOT); + + } + + private void checkLongSwipeCanStart() { + if (!mUiLongSwipeMode || !mStateCallback.hasStates(LONG_SWIPE_START_STATE) + || !mActivityControlHelper.supportsLongSwipe(mActivity)) { + return; + } + + RemoteAnimationTargetSet targetSet = mRecentsAnimationWrapper.targetSet; + if (targetSet == null) { + // This can happen when cancelAnimation comes on the background thread, while we are + // processing the long swipe on the UI thread. + return; + } + + mLongSwipeController = mActivityControlHelper.getLongSwipeController( + mActivity, mRecentsAnimationWrapper.targetSet); + onLongSwipeDisplacementUpdated(); + } + + private void onLongSwipeGestureFinishUi(float velocity, boolean isFling) { + if (!mUiLongSwipeMode || mLongSwipeController == null) { + mUiLongSwipeMode = false; + handleNormalGestureEnd(velocity, isFling); + return; + } + mUiLongSwipeMode = false; + finishCurrentTransitionToHome(); + mLongSwipeController.end(velocity, isFling, + () -> setStateOnUiThread(STATE_HANDLER_INVALIDATED)); + + } } diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 4ed165699..9e2de3395 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -18,7 +18,6 @@ package com.android.quickstep.fallback; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; -import android.support.annotation.AnyThread; import android.util.AttributeSet; import android.view.View; @@ -36,12 +35,12 @@ public class FallbackRecentsView extends RecentsView<RecentsActivity> { public FallbackRecentsView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setOverviewStateEnabled(true); - updateEmptyMessage(); + getQuickScrubController().onFinishedTransitionToQuickScrub(); } @Override protected void onAllTasksRemoved() { - mActivity.finish(); + mActivity.startHome(); } @Override @@ -64,11 +63,12 @@ public class FallbackRecentsView extends RecentsView<RecentsActivity> { @Override protected void getTaskSize(DeviceProfile dp, Rect outRect) { - LayoutUtils.calculateTaskSize(getContext(), dp, 0, outRect); + LayoutUtils.calculateFallbackTaskSize(getContext(), dp, outRect); } - @AnyThread - public static void getPageRect(DeviceProfile grid, Context context, Rect outRect) { - LayoutUtils.calculateTaskSize(context, grid, 0, outRect); + @Override + public boolean shouldUseMultiWindowTaskSizeStrategy() { + // Just use the activity task size for multi-window as well. + return false; } } diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java b/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java index 7aaa88c38..ca8c2520c 100644 --- a/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java +++ b/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java @@ -17,6 +17,7 @@ package com.android.quickstep.fallback; import android.annotation.TargetApi; import android.content.Context; +import android.graphics.Point; import android.graphics.Rect; import android.util.AttributeSet; @@ -31,18 +32,37 @@ public class RecentsRootView extends BaseDragLayer<RecentsActivity> { private final RecentsActivity mActivity; + private final Point mLastKnownSize = new Point(10, 10); + public RecentsRootView(Context context, AttributeSet attrs) { - super(context, attrs); + super(context, attrs, 1 /* alphaChannelCount */); mActivity = (RecentsActivity) BaseActivity.fromContext(context); setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | SYSTEM_UI_FLAG_LAYOUT_STABLE); } + public Point getLastKnownSize() { + return mLastKnownSize; + } + public void setup() { mControllers = new TouchController[] { new RecentsTaskController(mActivity) }; } + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // Check size changes before the actual measure, to avoid multiple measure calls. + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (mLastKnownSize.x != width || mLastKnownSize.y != height) { + mLastKnownSize.set(width, height); + mActivity.onRootViewSizeChanged(); + } + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + @TargetApi(23) @Override protected boolean fitSystemWindows(Rect insets) { @@ -62,4 +82,9 @@ public class RecentsRootView extends BaseDragLayer<RecentsActivity> { setBackground(insets.top == 0 ? null : Themes.getAttrDrawable(getContext(), R.attr.workspaceStatusBarScrim)); } + + public void dispatchInsets() { + mActivity.getDeviceProfile().updateInsets(mInsets); + super.setInsets(mInsets); + } }
\ No newline at end of file diff --git a/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java b/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java new file mode 100644 index 000000000..04153cc99 --- /dev/null +++ b/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2018 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.logging; + +import android.util.Log; + +import static com.android.launcher3.logging.LoggerUtils.newAction; +import static com.android.launcher3.logging.LoggerUtils.newContainerTarget; +import static com.android.launcher3.logging.LoggerUtils.newLauncherEvent; +import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType.CANCEL_TARGET; +import static com.android.systemui.shared.system.LauncherEventUtil.VISIBLE; +import static com.android.systemui.shared.system.LauncherEventUtil.DISMISS; +import static com.android.systemui.shared.system.LauncherEventUtil.RECENTS_QUICK_SCRUB_ONBOARDING_TIP; +import static com.android.systemui.shared.system.LauncherEventUtil.RECENTS_SWIPE_UP_ONBOARDING_TIP; + +import com.android.launcher3.logging.UserEventDispatcher; +import com.android.launcher3.model.nano.LauncherDumpProto; +import com.android.launcher3.userevent.nano.LauncherLogExtensions; +import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.systemui.shared.system.LauncherEventUtil; +import com.android.systemui.shared.system.MetricsLoggerCompat; + +/** + * This class handles AOSP MetricsLogger function calls and logging around + * quickstep interactions. + */ +public class UserEventDispatcherExtension extends UserEventDispatcher { + + private static final String TAG = "UserEventDispatcher"; + + public void logStateChangeAction(int action, int dir, int srcChildTargetType, + int srcParentContainerType, int dstContainerType, + int pageIndex) { + new MetricsLoggerCompat().visibility(MetricsLoggerCompat.OVERVIEW_ACTIVITY, + dstContainerType == LauncherLogProto.ContainerType.TASKSWITCHER); + super.logStateChangeAction(action, dir, srcChildTargetType, srcParentContainerType, + dstContainerType, pageIndex); + } + + public void logActionTip(int actionType, int viewType) { + LauncherLogProto.Action action = new LauncherLogProto.Action(); + LauncherLogProto.Target target = new LauncherLogProto.Target(); + switch(actionType) { + case VISIBLE: + action.type = LauncherLogProto.Action.Type.TIP; + target.type = LauncherLogProto.Target.Type.CONTAINER; + target.containerType = LauncherLogProto.ContainerType.TIP; + break; + case DISMISS: + action.type = LauncherLogProto.Action.Type.TOUCH; + action.touch = LauncherLogProto.Action.Touch.TAP; + target.type = LauncherLogProto.Target.Type.CONTROL; + target.controlType = CANCEL_TARGET; + break; + default: + Log.e(TAG, "Unexpected action type = " + actionType); + } + + switch(viewType) { + case RECENTS_QUICK_SCRUB_ONBOARDING_TIP: + target.tipType = LauncherLogProto.TipType.QUICK_SCRUB_TEXT; + break; + case RECENTS_SWIPE_UP_ONBOARDING_TIP: + target.tipType = LauncherLogProto.TipType.SWIPE_UP_TEXT; + break; + default: + Log.e(TAG, "Unexpected viewType = " + viewType); + } + LauncherLogProto.LauncherEvent event = newLauncherEvent(action, target); + dispatchUserEvent(event, null); + } +} diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index 493e9e238..8c7f104a6 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -15,21 +15,44 @@ */ package com.android.quickstep.util; +import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_TRANSLATION_Y_FACTOR; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; +import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING; +import android.annotation.TargetApi; +import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Matrix.ScaleToFit; +import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; +import android.os.Build; +import android.os.RemoteException; +import android.support.annotation.Nullable; +import android.view.animation.Interpolator; +import com.android.launcher3.BaseDraggingActivity; +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.anim.Interpolators; +import com.android.launcher3.views.BaseDragLayer; +import com.android.quickstep.RecentsModel; +import com.android.quickstep.views.RecentsView; +import com.android.quickstep.views.TaskThumbnailView; +import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.recents.utilities.RectFEvaluator; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.TransactionCompat; +import com.android.systemui.shared.system.WindowManagerWrapper; + +import java.util.function.BiConsumer; /** * Utility class to handle window clip animation */ +@TargetApi(Build.VERSION_CODES.P) public class ClipAnimationHelper { // The bounds of the source app in device coordinates @@ -40,8 +63,8 @@ public class ClipAnimationHelper { private final RectF mSourceRect = new RectF(); // The bounds of the task view in launcher window coordinates private final RectF mTargetRect = new RectF(); - // Doesn't change after initialized, used as an anchor when changing mTargetRect - private final RectF mInitialTargetRect = new RectF(); + // Set when the final window destination is changed, such as offsetting for quick scrub + private final PointF mTargetOffset = new PointF(); // The insets to be used for clipping the app window, which can be larger than mSourceInsets // if the aspect ratio of the target is smaller than the aspect ratio of the source rect. In // app window coordinates. @@ -54,15 +77,33 @@ public class ClipAnimationHelper { private final Rect mClipRect = new Rect(); private final RectFEvaluator mRectFEvaluator = new RectFEvaluator(); private final Matrix mTmpMatrix = new Matrix(); + private final RectF mTmpRectF = new RectF(); + private float mTargetScale = 1f; + private Interpolator mInterpolator = LINEAR; + // We translate y slightly faster than the rest of the animation for quick scrub. + private Interpolator mOffsetYInterpolator = LINEAR; - public void updateSource(Rect homeStackBounds, RemoteAnimationTargetCompat target) { - mHomeStackBounds.set(homeStackBounds); - mSourceInsets.set(target.getContentInsets()); + // Whether to boost the opening animation target layers, or the closing + private int mBoostModeTargetLayers = -1; + // Wether or not applyTransform has been called yet since prepareAnimation() + private boolean mIsFirstFrame = true; + + private BiConsumer<TransactionCompat, RemoteAnimationTargetCompat> mTaskTransformCallback = + (t, a) -> { }; + + private void updateSourceStack(RemoteAnimationTargetCompat target) { + mSourceInsets.set(target.contentInsets); mSourceStackBounds.set(target.sourceContainerBounds); // TODO: Should sourceContainerBounds already have this offset? mSourceStackBounds.offsetTo(target.position.x, target.position.y); + + } + + public void updateSource(Rect homeStackBounds, RemoteAnimationTargetCompat target) { + mHomeStackBounds.set(homeStackBounds); + updateSourceStack(target); } public void updateTargetRect(Rect targetRect) { @@ -73,8 +114,6 @@ public class ClipAnimationHelper { mTargetRect.offset(mHomeStackBounds.left - mSourceStackBounds.left, mHomeStackBounds.top - mSourceStackBounds.top); - mInitialTargetRect.set(mTargetRect); - // Calculate the clip based on the target rect (since the content insets and the // launcher insets may differ, so the aspect ratio of the target rect can differ // from the source rect. The difference between the target rect (scaled to the @@ -91,12 +130,22 @@ public class ClipAnimationHelper { mSourceRect.set(scaledTargetRect); } - public void applyTransform(RemoteAnimationTargetCompat[] targets, float progress) { + public void prepareAnimation(boolean isOpening) { + mIsFirstFrame = true; + mBoostModeTargetLayers = isOpening ? MODE_OPENING : MODE_CLOSING; + } + + public RectF applyTransform(RemoteAnimationTargetSet targetSet, float progress) { RectF currentRect; - synchronized (mTargetRect) { - currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTargetRect); + mTmpRectF.set(mTargetRect); + Utilities.scaleRectFAboutCenter(mTmpRectF, mTargetScale); + float offsetYProgress = mOffsetYInterpolator.getInterpolation(progress); + progress = mInterpolator.getInterpolation(progress); + currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTmpRectF); + + synchronized (mTargetOffset) { // Stay lined up with the center of the target, since it moves for quick scrub. - currentRect.offset(mTargetRect.centerX() - currentRect.centerX(), 0); + currentRect.offset(mTargetOffset.x * progress, mTargetOffset.y * offsetYProgress); } mClipRect.left = (int) (mSourceWindowClipInsets.left * progress); @@ -106,30 +155,140 @@ public class ClipAnimationHelper { mClipRect.bottom = (int) (mSourceStackBounds.height() - (mSourceWindowClipInsets.bottom * progress)); - mTmpMatrix.setRectToRect(mSourceRect, currentRect, ScaleToFit.FILL); - TransactionCompat transaction = new TransactionCompat(); - for (RemoteAnimationTargetCompat app : targets) { - if (app.mode == MODE_CLOSING) { + if (mIsFirstFrame) { + RemoteAnimationProvider.prepareTargetsForFirstFrame(targetSet.unfilteredApps, + transaction, mBoostModeTargetLayers); + mIsFirstFrame = false; + } + for (RemoteAnimationTargetCompat app : targetSet.apps) { + if (app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { + mTmpMatrix.setRectToRect(mSourceRect, currentRect, ScaleToFit.FILL); mTmpMatrix.postTranslate(app.position.x, app.position.y); transaction.setMatrix(app.leash, mTmpMatrix) .setWindowCrop(app.leash, mClipRect); - if (app.isNotInRecents) { - transaction.setAlpha(app.leash, 1 - progress); - } + } - transaction.show(app.leash); + if (app.isNotInRecents + || app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { + transaction.setAlpha(app.leash, 1 - progress); } + + mTaskTransformCallback.accept(transaction, app); } transaction.setEarlyWakeup(); transaction.apply(); + return currentRect; } - public void offsetTarget(float scale, float offsetX, float offsetY) { - synchronized (mTargetRect) { - mTargetRect.set(mInitialTargetRect); - Utilities.scaleRectFAboutCenter(mTargetRect, scale); - mTargetRect.offset(offsetX, offsetY); + public void setTaskTransformCallback + (BiConsumer<TransactionCompat, RemoteAnimationTargetCompat> callback) { + mTaskTransformCallback = callback; + } + + public void offsetTarget(float scale, float offsetX, float offsetY, Interpolator interpolator) { + synchronized (mTargetOffset) { + mTargetOffset.set(offsetX, offsetY); } + mTargetScale = scale; + mInterpolator = interpolator; + mOffsetYInterpolator = Interpolators.clampToProgress(mInterpolator, 0, + QUICK_SCRUB_TRANSLATION_Y_FACTOR); + } + + public void fromTaskThumbnailView(TaskThumbnailView ttv, RecentsView rv) { + fromTaskThumbnailView(ttv, rv, null); + } + + public void fromTaskThumbnailView(TaskThumbnailView ttv, RecentsView rv, + @Nullable RemoteAnimationTargetCompat target) { + BaseDraggingActivity activity = BaseDraggingActivity.fromContext(ttv.getContext()); + BaseDragLayer dl = activity.getDragLayer(); + + int[] pos = new int[2]; + dl.getLocationOnScreen(pos); + mHomeStackBounds.set(0, 0, dl.getWidth(), dl.getHeight()); + mHomeStackBounds.offset(pos[0], pos[1]); + + if (target != null) { + updateSourceStack(target); + } else if (rv.shouldUseMultiWindowTaskSizeStrategy()) { + updateStackBoundsToMultiWindowTaskSize(activity); + } else { + mSourceStackBounds.set(mHomeStackBounds); + mSourceInsets.set(activity.getDeviceProfile().getInsets()); + } + + Rect targetRect = new Rect(); + dl.getDescendantRectRelativeToSelf(ttv, targetRect); + updateTargetRect(targetRect); + + // Transform the clip relative to the target rect. + float scale = mTargetRect.width() / mSourceRect.width(); + mSourceWindowClipInsets.left = mSourceWindowClipInsets.left * scale; + mSourceWindowClipInsets.top = mSourceWindowClipInsets.top * scale; + mSourceWindowClipInsets.right = mSourceWindowClipInsets.right * scale; + mSourceWindowClipInsets.bottom = mSourceWindowClipInsets.bottom * scale; + } + + private void updateStackBoundsToMultiWindowTaskSize(BaseDraggingActivity activity) { + ISystemUiProxy sysUiProxy = RecentsModel.getInstance(activity).getSystemUiProxy(); + if (sysUiProxy != null) { + try { + mSourceStackBounds.set(sysUiProxy.getNonMinimizedSplitScreenSecondaryBounds()); + return; + } catch (RemoteException e) { + // Use half screen size + } + } + + // Assume that the task size is half screen size (minus the insets and the divider size) + DeviceProfile fullDp = activity.getDeviceProfile().getFullScreenProfile(); + // Use availableWidthPx and availableHeightPx instead of widthPx and heightPx to + // account for system insets + int taskWidth = fullDp.availableWidthPx; + int taskHeight = fullDp.availableHeightPx; + int halfDividerSize = activity.getResources() + .getDimensionPixelSize(R.dimen.multi_window_task_divider_size) / 2; + + Rect insets = new Rect(); + WindowManagerWrapper.getInstance().getStableInsets(insets); + if (fullDp.isLandscape) { + taskWidth = taskWidth / 2 - halfDividerSize; + } else { + taskHeight = taskHeight / 2 - halfDividerSize; + } + + // Align the task to bottom left/right edge (closer to nav bar). + int left = activity.getDeviceProfile().isSeascape() ? insets.left + : (insets.left + fullDp.availableWidthPx - taskWidth); + mSourceStackBounds.set(0, 0, taskWidth, taskHeight); + mSourceStackBounds.offset(left, insets.top + fullDp.availableHeightPx - taskHeight); + } + + public void drawForProgress(TaskThumbnailView ttv, Canvas canvas, float progress) { + RectF currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTargetRect); + canvas.translate(mSourceStackBounds.left - mHomeStackBounds.left, + mSourceStackBounds.top - mHomeStackBounds.top); + mTmpMatrix.setRectToRect(mTargetRect, currentRect, ScaleToFit.FILL); + + canvas.concat(mTmpMatrix); + canvas.translate(mTargetRect.left, mTargetRect.top); + + float insetProgress = (1 - progress); + ttv.drawOnCanvas(canvas, + -mSourceWindowClipInsets.left * insetProgress, + -mSourceWindowClipInsets.top * insetProgress, + ttv.getMeasuredWidth() + mSourceWindowClipInsets.right * insetProgress, + ttv.getMeasuredHeight() + mSourceWindowClipInsets.bottom * insetProgress, + ttv.getCornerRadius() * progress); + } + + public RectF getTargetRect() { + return mTargetRect; + } + + public RectF getSourceRect() { + return mSourceRect; } } diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java index f29f9e4e9..ec9c7eaed 100644 --- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java +++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java @@ -15,39 +15,68 @@ */ package com.android.quickstep.util; +import static java.lang.annotation.RetentionPolicy.SOURCE; + import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; -import android.graphics.RectF; +import android.support.annotation.AnyThread; +import android.support.annotation.IntDef; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; +import java.lang.annotation.Retention; + public class LayoutUtils { + private static final int MULTI_WINDOW_STRATEGY_HALF_SCREEN = 1; + private static final int MULTI_WINDOW_STRATEGY_DEVICE_PROFILE = 2; + + @Retention(SOURCE) + @IntDef({MULTI_WINDOW_STRATEGY_HALF_SCREEN, MULTI_WINDOW_STRATEGY_DEVICE_PROFILE}) + private @interface MultiWindowStrategy {} + public static void calculateLauncherTaskSize(Context context, DeviceProfile dp, Rect outRect) { - float extraSpace = dp.isVerticalBarLayout() ? 0 : dp.hotseatBarSizePx; - calculateTaskSize(context, dp, extraSpace, outRect); + float extraSpace; + if (dp.isVerticalBarLayout()) { + extraSpace = 0; + } else { + extraSpace = dp.hotseatBarSizePx + dp.verticalDragHandleSizePx; + } + calculateTaskSize(context, dp, extraSpace, MULTI_WINDOW_STRATEGY_HALF_SCREEN, outRect); + } + + public static void calculateFallbackTaskSize(Context context, DeviceProfile dp, Rect outRect) { + calculateTaskSize(context, dp, 0, MULTI_WINDOW_STRATEGY_DEVICE_PROFILE, outRect); } + @AnyThread public static void calculateTaskSize(Context context, DeviceProfile dp, - float extraVerticalSpace, Rect outRect) { + float extraVerticalSpace, @MultiWindowStrategy int multiWindowStrategy, Rect outRect) { float taskWidth, taskHeight, paddingHorz; Resources res = context.getResources(); Rect insets = dp.getInsets(); if (dp.isMultiWindowMode) { - DeviceProfile fullDp = dp.getFullScreenProfile(); - // Use availableWidthPx and availableHeightPx instead of widthPx and heightPx to - // account for system insets - taskWidth = fullDp.availableWidthPx; - taskHeight = fullDp.availableHeightPx; - float halfDividerSize = res.getDimension(R.dimen.multi_window_task_divider_size) / 2; - - if (fullDp.isLandscape) { - taskWidth = taskWidth / 2 - halfDividerSize; + if (multiWindowStrategy == MULTI_WINDOW_STRATEGY_HALF_SCREEN) { + DeviceProfile fullDp = dp.getFullScreenProfile(); + // Use availableWidthPx and availableHeightPx instead of widthPx and heightPx to + // account for system insets + taskWidth = fullDp.availableWidthPx; + taskHeight = fullDp.availableHeightPx; + float halfDividerSize = res.getDimension(R.dimen.multi_window_task_divider_size) + / 2; + + if (fullDp.isLandscape) { + taskWidth = taskWidth / 2 - halfDividerSize; + } else { + taskHeight = taskHeight / 2 - halfDividerSize; + } } else { - taskHeight = taskHeight / 2 - halfDividerSize; + // multiWindowStrategy == MULTI_WINDOW_STRATEGY_DEVICE_PROFILE + taskWidth = dp.widthPx; + taskHeight = dp.heightPx; } paddingHorz = res.getDimension(R.dimen.multi_window_task_card_horz_space); } else { @@ -75,7 +104,7 @@ public class LayoutUtils { float outHeight = scale * taskHeight; // Center in the visible space - float x = insets.left + (taskWidth - outWidth) / 2; + float x = insets.left + (launcherVisibleWidth - outWidth) / 2; float y = insets.top + Math.max(topIconMargin, (launcherVisibleHeight - extraVerticalSpace - outHeight) / 2); outRect.set(Math.round(x), Math.round(y), diff --git a/quickstep/src/com/android/quickstep/util/MultiValueUpdateListener.java b/quickstep/src/com/android/quickstep/util/MultiValueUpdateListener.java new file mode 100644 index 000000000..e798d5cbc --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/MultiValueUpdateListener.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2018 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.util; + +import android.animation.ValueAnimator; +import android.view.animation.Interpolator; + +import java.util.ArrayList; + +/** + * Utility class to update multiple values with different interpolators and durations during + * the same animation. + */ +public abstract class MultiValueUpdateListener implements ValueAnimator.AnimatorUpdateListener { + + private final ArrayList<FloatProp> mAllProperties = new ArrayList<>(); + + @Override + public final void onAnimationUpdate(ValueAnimator animator) { + final float percent = animator.getAnimatedFraction(); + final float currentPlayTime = percent * animator.getDuration(); + + for (int i = mAllProperties.size() - 1; i >= 0; i--) { + FloatProp prop = mAllProperties.get(i); + float time = Math.max(0, currentPlayTime - prop.mDelay); + float newPercent = Math.min(1f, time / prop.mDuration); + newPercent = prop.mInterpolator.getInterpolation(newPercent); + prop.value = prop.mEnd * newPercent + prop.mStart * (1 - newPercent); + } + onUpdate(percent); + } + + public abstract void onUpdate(float percent); + + public final class FloatProp { + + public float value; + + private final float mStart; + private final float mEnd; + private final float mDelay; + private final float mDuration; + private final Interpolator mInterpolator; + + public FloatProp(float start, float end, float delay, float duration, Interpolator i) { + value = mStart = start; + mEnd = end; + mDelay = delay; + mDuration = duration; + mInterpolator = i; + + mAllProperties.add(this); + } + } +} diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java index 2ffcae38e..bbf223d1e 100644 --- a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java +++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java @@ -31,25 +31,34 @@ public interface RemoteAnimationProvider { AnimatorSet createWindowAnimation(RemoteAnimationTargetCompat[] targets); default ActivityOptions toActivityOptions(Handler handler, long duration) { - LauncherAnimationRunner runner = new LauncherAnimationRunner(handler) { + LauncherAnimationRunner runner = new LauncherAnimationRunner(handler, + false /* startAtFrontOfQueue */) { + @Override - public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { - return createWindowAnimation(targetCompats); + public void onCreateAnimation(RemoteAnimationTargetCompat[] targetCompats, + AnimationResult result) { + result.setAnimation(createWindowAnimation(targetCompats)); } }; return ActivityOptionsCompat.makeRemoteAnimation( new RemoteAnimationAdapterCompat(runner, duration, 0)); } - static void showOpeningTarget(RemoteAnimationTargetCompat[] targetCompats) { - TransactionCompat t = new TransactionCompat(); - for (RemoteAnimationTargetCompat target : targetCompats) { - int layer = target.mode == RemoteAnimationTargetCompat.MODE_CLOSING + /** + * Prepares the given {@param targets} for a remote animation, and should be called with the + * transaction from the first frame of animation. + * + * @param boostModeTargets The mode indicating which targets to boost in z-order above other + * targets. + */ + static void prepareTargetsForFirstFrame(RemoteAnimationTargetCompat[] targets, + TransactionCompat t, int boostModeTargets) { + for (RemoteAnimationTargetCompat target : targets) { + int layer = target.mode == boostModeTargets ? Integer.MAX_VALUE : target.prefixOrderIndex; t.setLayer(target.leash, layer); t.show(target.leash); } - t.apply(); } } diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java new file mode 100644 index 000000000..04b8be58b --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2018 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.util; + +import com.android.systemui.shared.system.RemoteAnimationTargetCompat; + +import java.util.ArrayList; + +/** + * Holds a collection of RemoteAnimationTargets, filtered by different properties. + */ +public class RemoteAnimationTargetSet { + + public final RemoteAnimationTargetCompat[] unfilteredApps; + public final RemoteAnimationTargetCompat[] apps; + + public RemoteAnimationTargetSet(RemoteAnimationTargetCompat[] apps, int targetMode) { + ArrayList<RemoteAnimationTargetCompat> filteredApps = new ArrayList<>(); + if (apps != null) { + for (RemoteAnimationTargetCompat target : apps) { + if (target.mode == targetMode) { + filteredApps.add(target); + } + } + } + + this.unfilteredApps = apps; + this.apps = filteredApps.toArray(new RemoteAnimationTargetCompat[filteredApps.size()]); + } + + public RemoteAnimationTargetCompat findTask(int taskId) { + for (RemoteAnimationTargetCompat target : apps) { + if (target.taskId == taskId) { + return target; + } + } + return null; + } + + public boolean isAnimatingHome() { + for (RemoteAnimationTargetCompat target : apps) { + if (target.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { + return true; + } + } + return false; + } +} diff --git a/quickstep/src/com/android/quickstep/util/SysuiEventLogger.java b/quickstep/src/com/android/quickstep/util/SysuiEventLogger.java deleted file mode 100644 index d474ded90..000000000 --- a/quickstep/src/com/android/quickstep/util/SysuiEventLogger.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2018 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.util; - -import android.metrics.LogMaker; -import android.util.EventLog; - -/** - * Utility class for writing logs on behalf of systemUI - */ -public class SysuiEventLogger { - - /** 524292 sysui_multi_action (content|4) */ - public static final int SYSUI_MULTI_ACTION = 524292; - - private static void write(LogMaker content) { - if (content.getType() == 0/*MetricsEvent.TYPE_UNKNOWN*/) { - content.setType(4/*MetricsEvent.TYPE_ACTION*/); - } - EventLog.writeEvent(SYSUI_MULTI_ACTION, content.serialize()); - } - - public static void writeDummyRecentsTransition(long transitionDelay) { - // Mimic ActivityMetricsLogger.logAppTransitionMultiEvents() logging for - // "Recents" activity for app transition tests for the app-to-recents case. - final LogMaker builder = new LogMaker(761/*APP_TRANSITION*/); - builder.setPackageName("com.android.systemui"); - builder.addTaggedData(871/*FIELD_CLASS_NAME*/, - "com.android.systemui.recents.RecentsActivity"); - builder.addTaggedData(319/*APP_TRANSITION_DELAY_MS*/, - transitionDelay); - write(builder); - } -} diff --git a/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java b/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java new file mode 100644 index 000000000..48b07a714 --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2018 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.util; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; +import android.util.FloatProperty; +import android.view.View; + +import com.android.launcher3.Utilities; +import com.android.quickstep.views.RecentsView; +import com.android.quickstep.views.TaskThumbnailView; +import com.android.quickstep.views.TaskView; + +public class TaskViewDrawable extends Drawable { + + public static final FloatProperty<TaskViewDrawable> PROGRESS = + new FloatProperty<TaskViewDrawable>("progress") { + @Override + public void setValue(TaskViewDrawable taskViewDrawable, float v) { + taskViewDrawable.setProgress(v); + } + + @Override + public Float get(TaskViewDrawable taskViewDrawable) { + return taskViewDrawable.mProgress; + } + }; + + /** + * The progress at which we play the atomic icon scale animation. + */ + private static final float ICON_SCALE_THRESHOLD = 0.95f; + + private final RecentsView mParent; + private final View mIconView; + private final int[] mIconPos; + + private final TaskThumbnailView mThumbnailView; + + private final ClipAnimationHelper mClipAnimationHelper; + + private float mProgress = 1; + private boolean mPassedIconScaleThreshold; + private ValueAnimator mIconScaleAnimator; + private float mIconScale; + + public TaskViewDrawable(TaskView tv, RecentsView parent) { + mParent = parent; + mIconView = tv.getIconView(); + mIconPos = new int[2]; + mIconScale = mIconView.getScaleX(); + Utilities.getDescendantCoordRelativeToAncestor(mIconView, parent, mIconPos, true); + + mThumbnailView = tv.getThumbnail(); + mClipAnimationHelper = new ClipAnimationHelper(); + mClipAnimationHelper.fromTaskThumbnailView(mThumbnailView, parent); + } + + public void setProgress(float progress) { + mProgress = progress; + mParent.invalidate(); + boolean passedIconScaleThreshold = progress <= ICON_SCALE_THRESHOLD; + if (mPassedIconScaleThreshold != passedIconScaleThreshold) { + mPassedIconScaleThreshold = passedIconScaleThreshold; + animateIconScale(mPassedIconScaleThreshold ? 0 : 1); + } + } + + private void animateIconScale(float toScale) { + if (mIconScaleAnimator != null) { + mIconScaleAnimator.cancel(); + } + mIconScaleAnimator = ValueAnimator.ofFloat(mIconScale, toScale); + mIconScaleAnimator.addUpdateListener(valueAnimator -> { + mIconScale = (float) valueAnimator.getAnimatedValue(); + if (mProgress > ICON_SCALE_THRESHOLD) { + // Speed up the icon scale to ensure it is 1 when progress is 1. + float iconProgress = (mProgress - ICON_SCALE_THRESHOLD) / (1 - ICON_SCALE_THRESHOLD); + if (iconProgress > mIconScale) { + mIconScale = iconProgress; + } + } + invalidateSelf(); + }); + mIconScaleAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mIconScaleAnimator = null; + } + }); + mIconScaleAnimator.setDuration(TaskView.SCALE_ICON_DURATION); + mIconScaleAnimator.start(); + } + + @Override + public void draw(Canvas canvas) { + canvas.save(); + canvas.translate(mParent.getScrollX(), mParent.getScrollY()); + mClipAnimationHelper.drawForProgress(mThumbnailView, canvas, mProgress); + canvas.restore(); + + canvas.save(); + canvas.translate(mIconPos[0], mIconPos[1]); + canvas.scale(mIconScale, mIconScale, mIconView.getWidth() / 2, mIconView.getHeight() / 2); + mIconView.draw(canvas); + canvas.restore(); + } + + public ClipAnimationHelper getClipAnimationHelper() { + return mClipAnimationHelper; + } + + @Override + public void setAlpha(int i) { } + + @Override + public void setColorFilter(ColorFilter colorFilter) { } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } +} diff --git a/quickstep/src/com/android/quickstep/views/ClearAllButton.java b/quickstep/src/com/android/quickstep/views/ClearAllButton.java new file mode 100644 index 000000000..d5c43a0f5 --- /dev/null +++ b/quickstep/src/com/android/quickstep/views/ClearAllButton.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2018 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.views; + +import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.widget.Button; + +public class ClearAllButton extends Button { + RecentsView mRecentsView; + + public ClearAllButton(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public void setRecentsView(RecentsView recentsView) { + mRecentsView = recentsView; + } + + @Override + public boolean performAccessibilityAction(int action, Bundle arguments) { + final boolean res = super.performAccessibilityAction(action, arguments); + if (action == ACTION_ACCESSIBILITY_FOCUS) { + mRecentsView.revealClearAllButton(); + } + return res; + } +} diff --git a/quickstep/src/com/android/quickstep/views/IconView.java b/quickstep/src/com/android/quickstep/views/IconView.java new file mode 100644 index 000000000..c359966df --- /dev/null +++ b/quickstep/src/com/android/quickstep/views/IconView.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2018 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.views; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; + +/** + * A view which draws a drawable stretched to fit its size. Unlike ImageView, it avoids relayout + * when the drawable changes. + */ +public class IconView extends View { + + private Drawable mDrawable; + + public IconView(Context context) { + super(context); + } + + public IconView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public IconView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public void setDrawable(Drawable d) { + if (mDrawable != null) { + mDrawable.setCallback(null); + } + mDrawable = d; + if (mDrawable != null) { + mDrawable.setCallback(this); + mDrawable.setBounds(0, 0, getWidth(), getHeight()); + } + invalidate(); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + if (mDrawable != null) { + mDrawable.setBounds(0, 0, w, h); + } + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return super.verifyDrawable(who) || who == mDrawable; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + + final Drawable drawable = mDrawable; + if (drawable != null && drawable.isStateful() + && drawable.setState(getDrawableState())) { + invalidateDrawable(drawable); + } + } + + @Override + protected void onDraw(Canvas canvas) { + if (mDrawable != null) { + mDrawable.draw(canvas); + } + } + + @Override + public boolean hasOverlappingRendering() { + return false; + } +} diff --git a/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java b/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java index ac34d90b1..c149de54f 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java +++ b/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java @@ -54,7 +54,7 @@ public class LauncherLayoutListener extends AbstractFloatingView @Override public void setInsets(Rect insets) { if (mHandler != null) { - mHandler.onLauncherLayoutChanged(); + mHandler.buildAnimationController(); } } diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 4b4af3fa7..950f7fb99 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -27,7 +27,6 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; import android.os.Build; -import android.support.annotation.AnyThread; import android.util.AttributeSet; import android.util.FloatProperty; import android.view.View; @@ -36,6 +35,8 @@ import android.view.ViewDebug; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; +import com.android.quickstep.OverviewInteractionState; +import com.android.quickstep.util.ClipAnimationHelper; import com.android.quickstep.util.LayoutUtils; /** @@ -87,7 +88,11 @@ public class LauncherRecentsView extends RecentsView<Launcher> { public void setTranslationYFactor(float translationFactor) { mTranslationYFactor = translationFactor; - setTranslationY(mTranslationYFactor * (getPaddingBottom() - getPaddingTop())); + setTranslationY(computeTranslationYForFactor(mTranslationYFactor)); + } + + public float computeTranslationYForFactor(float translationYFactor) { + return translationYFactor * (getPaddingBottom() - getPaddingTop()); } @Override @@ -112,8 +117,15 @@ public class LauncherRecentsView extends RecentsView<Launcher> { * Animates adjacent tasks and translate hotseat off screen as well. */ @Override - public AnimatorSet createAdjacentPageAnimForTaskLaunch(TaskView tv) { - AnimatorSet anim = super.createAdjacentPageAnimForTaskLaunch(tv); + public AnimatorSet createAdjacentPageAnimForTaskLaunch(TaskView tv, + ClipAnimationHelper helper) { + AnimatorSet anim = super.createAdjacentPageAnimForTaskLaunch(tv, helper); + + if (!OverviewInteractionState.getInstance(mActivity).isSwipeUpGestureEnabled()) { + // Hotseat doesn't move when opening recents with the button, + // so don't animate it here either. + return anim; + } float allAppsProgressOffscreen = ALL_APPS_PROGRESS_OFF_SCREEN; LauncherState state = mActivity.getStateManager().getState(); @@ -132,8 +144,19 @@ public class LauncherRecentsView extends RecentsView<Launcher> { LayoutUtils.calculateLauncherTaskSize(getContext(), dp, outRect); } - @AnyThread - public static void getPageRect(DeviceProfile grid, Context context, Rect outRect) { - LayoutUtils.calculateLauncherTaskSize(context, grid, outRect); + @Override + protected void onTaskLaunched(boolean success) { + if (success) { + mActivity.getStateManager().goToState(NORMAL, false /* animate */); + } else { + LauncherState state = mActivity.getStateManager().getState(); + mActivity.getAllAppsController().setProgress(state.getVerticalProgress(mActivity)); + } + super.onTaskLaunched(success); + } + + @Override + public boolean shouldUseMultiWindowTaskSizeStrategy() { + return mActivity.isInMultiWindowModeCompat(); } } diff --git a/quickstep/src/com/android/quickstep/views/QuickstepDragIndicator.java b/quickstep/src/com/android/quickstep/views/QuickstepDragIndicator.java deleted file mode 100644 index 5e9cd6e4f..000000000 --- a/quickstep/src/com/android/quickstep/views/QuickstepDragIndicator.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2018 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.views; - -import static com.android.launcher3.LauncherState.ALL_APPS; -import static com.android.launcher3.LauncherState.OVERVIEW; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.view.accessibility.AccessibilityNodeInfo; - -import com.android.launcher3.R; -import com.android.launcher3.userevent.nano.LauncherLogProto.Action; -import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; -import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; -import com.android.launcher3.views.LauncherDragIndicator; - -public class QuickstepDragIndicator extends LauncherDragIndicator { - - public QuickstepDragIndicator(Context context) { - super(context); - } - - public QuickstepDragIndicator(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public QuickstepDragIndicator(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - private boolean isInOverview() { - return mLauncher.isInState(OVERVIEW); - } - - @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - info.setContentDescription(getContext().getString(R.string.all_apps_button_label)); - } - - @Override - protected void initCustomActions(AccessibilityNodeInfo info) { - if (!isInOverview()) { - super.initCustomActions(info); - } - } - - @Override - public void onClick(View view) { - mLauncher.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP, - ControlType.ALL_APPS_BUTTON, - isInOverview() ? ContainerType.TASKSWITCHER : ContainerType.WORKSPACE); - mLauncher.getStateManager().goToState(ALL_APPS); - } -} diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 7e81ba902..a6da89f20 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -16,11 +16,15 @@ package com.android.quickstep.views; +import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER; import static com.android.launcher3.anim.Interpolators.ACCEL; import static com.android.launcher3.anim.Interpolators.ACCEL_2; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.launcher3.util.SystemUiController.UI_STATE_OVERVIEW; +import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId; +import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; @@ -30,13 +34,13 @@ import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; +import android.os.Handler; +import android.os.UserHandle; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -49,7 +53,6 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; -import android.view.accessibility.AccessibilityEvent; import com.android.launcher3.BaseActivity; import com.android.launcher3.DeviceProfile; @@ -64,42 +67,34 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.util.PendingAnimation; import com.android.launcher3.util.Themes; +import com.android.quickstep.OverviewCallbacks; import com.android.quickstep.QuickScrubController; -import com.android.quickstep.RecentsAnimationInterpolator; -import com.android.quickstep.RecentsAnimationInterpolator.TaskWindowBounds; import com.android.quickstep.RecentsModel; import com.android.quickstep.TaskUtils; +import com.android.quickstep.util.ClipAnimationHelper; +import com.android.quickstep.util.TaskViewDrawable; import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan; import com.android.systemui.shared.recents.model.RecentsTaskLoader; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.TaskStack; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.BackgroundExecutor; +import com.android.systemui.shared.system.PackageManagerWrapper; import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; +import java.util.function.Consumer; /** * A list of recent tasks. */ @TargetApi(Build.VERSION_CODES.P) -public abstract class RecentsView<T extends BaseActivity> - extends PagedView implements OnSharedPreferenceChangeListener, Insettable { +public abstract class RecentsView<T extends BaseActivity> extends PagedView implements Insettable { - private final Rect mTempRect = new Rect(); - - public static final FloatProperty<RecentsView> CONTENT_ALPHA = - new FloatProperty<RecentsView>("contentAlpha") { - @Override - public void setValue(RecentsView recentsView, float v) { - recentsView.setContentAlpha(v); - } + private static final String TAG = RecentsView.class.getSimpleName(); - @Override - public Float get(RecentsView recentsView) { - return recentsView.mContentAlpha; - } - }; + private final Rect mTempRect = new Rect(); public static final FloatProperty<RecentsView> ADJACENT_SCALE = new FloatProperty<RecentsView>("adjacentScale") { @@ -113,8 +108,12 @@ public abstract class RecentsView<T extends BaseActivity> return recentsView.mAdjacentScale; } }; - private static final String PREF_FLIP_RECENTS = "pref_flip_recents"; + public static final boolean FLIP_RECENTS = true; private static final int DISMISS_TASK_DURATION = 300; + // The threshold at which we update the SystemUI flags when animating from the task into the app + private static final float UPDATE_SYSUI_FLAGS_THRESHOLD = 0.6f; + + private static final float[] sTempFloatArray = new float[3]; protected final T mActivity; private final QuickScrubController mQuickScrubController; @@ -125,19 +124,27 @@ public abstract class RecentsView<T extends BaseActivity> // Keeps track of the previously known visible tasks for purposes of loading/unloading task data private final SparseBooleanArray mHasVisibleTaskData = new SparseBooleanArray(); + private boolean mIsClearAllButtonFullyRevealed; + /** * TODO: Call reloadIdNeeded in onTaskStackChanged. */ private final TaskStackChangeListener mTaskStackListener = new TaskStackChangeListener() { @Override public void onTaskSnapshotChanged(int taskId, ThumbnailData snapshot) { + if (!mHandleTaskStackChanges) { + return; + } updateThumbnail(taskId, snapshot); } @Override public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { + if (!mHandleTaskStackChanges) { + return; + } // Check this is for the right user - if (!checkCurrentUserId(userId, false /* debug */)) { + if (!checkCurrentOrManagedUserId(userId, getContext())) { return; } @@ -150,21 +157,71 @@ public abstract class RecentsView<T extends BaseActivity> @Override public void onActivityUnpinned() { + if (!mHandleTaskStackChanges) { + return; + } // TODO: Re-enable layout transitions for addition of the unpinned task reloadIfNeeded(); } + + @Override + public void onTaskRemoved(int taskId) { + if (!mHandleTaskStackChanges) { + return; + } + BackgroundExecutor.get().submit(() -> { + TaskView taskView = getTaskView(taskId); + if (taskView == null) { + return; + } + Handler handler = taskView.getHandler(); + if (handler == null) { + return; + } + + // TODO: Add callbacks from AM reflecting adding/removing from the recents list, and + // remove all these checks + Task.TaskKey taskKey = taskView.getTask().key; + if (PackageManagerWrapper.getInstance().getActivityInfo(taskKey.getComponent(), + taskKey.userId) == null) { + // The package was uninstalled + handler.post(() -> + dismissTask(taskView, true /* animate */, false /* removeTask */)); + } else { + RecentsTaskLoadPlan loadPlan = new RecentsTaskLoadPlan(getContext()); + RecentsTaskLoadPlan.PreloadOptions opts = + new RecentsTaskLoadPlan.PreloadOptions(); + opts.loadTitles = false; + loadPlan.preloadPlan(opts, mModel.getRecentsTaskLoader(), -1, + UserHandle.myUserId()); + if (loadPlan.getTaskStack().findTaskWithId(taskId) == null) { + // The task was removed from the recents list + handler.post(() -> + dismissTask(taskView, true /* animate */, false /* removeTask */)); + } + } + }); + } + + @Override + public void onPinnedStackAnimationStarted() { + // Needed for activities that auto-enter PiP, which will not trigger a remote + // animation to be created + mActivity.clearForceInvisibleFlag(INVISIBLE_BY_STATE_HANDLER); + } }; private int mLoadPlanId = -1; // Only valid until the launcher state changes to NORMAL private int mRunningTaskId = -1; + private boolean mRunningTaskTileHidden; private Task mTmpRunningTask; - private boolean mFirstTaskIconScaledDown = false; + private boolean mRunningTaskIconScaledDown = false; private boolean mOverviewStateEnabled; - private boolean mTaskStackListenerRegistered; + private boolean mHandleTaskStackChanges; private Runnable mNextPageSwitchRunnable; private boolean mSwipeDownShouldLaunchApp; @@ -178,6 +235,8 @@ public abstract class RecentsView<T extends BaseActivity> // Keeps track of task views whose visual state should not be reset private ArraySet<TaskView> mIgnoreResetTaskViews = new ArraySet<>(); + private View mClearAllButton; + // Variables for empty state private final Drawable mEmptyIcon; private final CharSequence mEmptyMessage; @@ -187,6 +246,14 @@ public abstract class RecentsView<T extends BaseActivity> private boolean mShowEmptyMessage; private Layout mEmptyTextLayout; + private BaseActivity.MultiWindowModeChangedListener mMultiWindowModeChangedListener = + (inMultiWindowMode) -> { + if (!inMultiWindowMode && mOverviewStateEnabled) { + // TODO: Re-enable layout transitions for addition of the unpinned task + reloadIfNeeded(); + } + }; + public RecentsView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setPageSpacing(getResources().getDimensionPixelSize(R.dimen.recents_page_spacing)); @@ -199,7 +266,11 @@ public abstract class RecentsView<T extends BaseActivity> mQuickScrubController = new QuickScrubController(mActivity, this); mModel = RecentsModel.getInstance(context); - onSharedPreferenceChanged(Utilities.getPrefs(context), PREF_FLIP_RECENTS); + mIsRtl = Utilities.isRtl(getResources()); + if (FLIP_RECENTS) { + mIsRtl = !mIsRtl; + } + setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR); mEmptyIcon = context.getDrawable(R.drawable.ic_empty_recents); mEmptyIcon.setCallback(this); @@ -211,17 +282,7 @@ public abstract class RecentsView<T extends BaseActivity> mEmptyMessagePadding = getResources() .getDimensionPixelSize(R.dimen.recents_empty_message_text_padding); setWillNotDraw(false); - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { - if (s.equals(PREF_FLIP_RECENTS)) { - mIsRtl = Utilities.isRtl(getResources()); - if (sharedPreferences.getBoolean(PREF_FLIP_RECENTS, false)) { - mIsRtl = !mIsRtl; - } - setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR); - } + updateEmptyMessage(); } public boolean isRtl() { @@ -229,14 +290,11 @@ public abstract class RecentsView<T extends BaseActivity> } public TaskView updateThumbnail(int taskId, ThumbnailData thumbnailData) { - for (int i = 0; i < getChildCount(); i++) { - final TaskView taskView = (TaskView) getChildAt(i); - if (taskView.getTask().key.id == taskId) { - taskView.onTaskDataLoaded(taskView.getTask(), thumbnailData); - return taskView; - } + TaskView taskView = getTaskView(taskId); + if (taskView != null) { + taskView.onTaskDataLoaded(taskView.getTask(), thumbnailData); } - return null; + return taskView; } @Override @@ -249,14 +307,16 @@ public abstract class RecentsView<T extends BaseActivity> protected void onAttachedToWindow() { super.onAttachedToWindow(); updateTaskStackListenerState(); - Utilities.getPrefs(getContext()).registerOnSharedPreferenceChangeListener(this); + mActivity.addMultiWindowModeChangedListener(mMultiWindowModeChangedListener); + ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); updateTaskStackListenerState(); - Utilities.getPrefs(getContext()).unregisterOnSharedPreferenceChangeListener(this); + mActivity.removeMultiWindowModeChangedListener(mMultiWindowModeChangedListener); + ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mTaskStackListener); } @Override @@ -271,6 +331,7 @@ public abstract class RecentsView<T extends BaseActivity> loader.unloadTaskData(task); loader.getHighResThumbnailLoader().onTaskInvisible(task); } + onChildViewsChanged(); } public boolean isTaskViewVisible(TaskView tv) { @@ -309,11 +370,69 @@ public abstract class RecentsView<T extends BaseActivity> } } + private int getScrollEnd() { + return mIsRtl ? 0 : mMaxScrollX; + } + + private float calculateClearAllButtonAlpha() { + final int childCount = getChildCount(); + if (mShowEmptyMessage || childCount == 0 || mPageScrolls == null + || childCount != mPageScrolls.length) { + return 0; + } + + final int scrollEnd = getScrollEnd(); + final int oldestChildScroll = getScrollForPage(childCount - 1); + + final int clearAllButtonMotionRange = scrollEnd - oldestChildScroll; + if (clearAllButtonMotionRange == 0) return 0; + + final float alphaUnbound = ((float) (getScrollX() - oldestChildScroll)) / + clearAllButtonMotionRange; + if (alphaUnbound > 1) return 0; + + return Math.max(alphaUnbound, 0); + } + + private void updateClearAllButtonAlpha() { + if (mClearAllButton != null) { + final float alpha = calculateClearAllButtonAlpha(); + mIsClearAllButtonFullyRevealed = alpha == 1; + mClearAllButton.setAlpha(alpha * mContentAlpha); + } + } + + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); + updateClearAllButtonAlpha(); + } + + @Override + protected void restoreScrollOnLayout() { + if (mIsClearAllButtonFullyRevealed) { + scrollAndForceFinish(getScrollEnd()); + } else { + super.restoreScrollOnLayout(); + } + } + @Override public boolean onTouchEvent(MotionEvent ev) { - super.onTouchEvent(ev); - // Do not let touch escape to siblings below this view. - return true; + if (ev.getAction() == MotionEvent.ACTION_DOWN && mTouchState == TOUCH_STATE_REST + && mScroller.isFinished() && mIsClearAllButtonFullyRevealed) { + mClearAllButton.getHitRect(mTempRect); + mTempRect.offset(-getLeft(), -getTop()); + if (mTempRect.contains((int) ev.getX(), (int) ev.getY())) { + // If nothing is in motion, let the Clear All button process the event. + return false; + } + } + + if (ev.getAction() == MotionEvent.ACTION_UP && mShowEmptyMessage) { + onAllTasksRemoved(); + } + return super.onTouchEvent(ev); } private void applyLoadPlan(RecentsTaskLoadPlan loadPlan) { @@ -356,7 +475,6 @@ public abstract class RecentsView<T extends BaseActivity> taskView.bind(task); } resetTaskVisuals(); - applyIconScale(false /* animate */); if (oldChildCount != getChildCount()) { mQuickScrubController.snapToNextTaskIfAvailable(); @@ -373,6 +491,10 @@ public abstract class RecentsView<T extends BaseActivity> taskView.resetVisualProperties(); } } + if (mRunningTaskTileHidden) { + setRunningTaskHidden(mRunningTaskTileHidden); + } + applyIconScale(false /* animate */); updateCurveProperties(); // Update the set of visible task's data @@ -380,18 +502,13 @@ public abstract class RecentsView<T extends BaseActivity> } private void updateTaskStackListenerState() { - boolean registerStackListener = mOverviewStateEnabled && isAttachedToWindow() + boolean handleTaskStackChanges = mOverviewStateEnabled && isAttachedToWindow() && getWindowVisibility() == VISIBLE; - if (registerStackListener != mTaskStackListenerRegistered) { - if (registerStackListener) { - ActivityManagerWrapper.getInstance() - .registerTaskStackListener(mTaskStackListener); + if (handleTaskStackChanges != mHandleTaskStackChanges) { + mHandleTaskStackChanges = handleTaskStackChanges; + if (handleTaskStackChanges) { reloadIfNeeded(); - } else { - ActivityManagerWrapper.getInstance() - .unregisterTaskStackListener(mTaskStackListener); } - mTaskStackListenerRegistered = registerStackListener; } } @@ -400,15 +517,20 @@ public abstract class RecentsView<T extends BaseActivity> mInsets.set(insets); DeviceProfile dp = mActivity.getDeviceProfile(); getTaskSize(dp, mTempRect); + mTempRect.top -= getResources() .getDimensionPixelSize(R.dimen.task_thumbnail_top_margin); setPadding(mTempRect.left - mInsets.left, mTempRect.top - mInsets.top, - dp.widthPx - mTempRect.right - mInsets.right, - dp.heightPx - mTempRect.bottom - mInsets.bottom); + dp.availableWidthPx + mInsets.left - mTempRect.right, + dp.availableHeightPx + mInsets.top - mTempRect.bottom); } protected abstract void getTaskSize(DeviceProfile dp, Rect outRect); + public void getTaskSize(Rect outRect) { + getTaskSize(mActivity.getDeviceProfile(), outRect); + } + @Override protected boolean computeScrollHelper() { boolean scrolling = super.computeScrollHelper(); @@ -506,13 +628,16 @@ public abstract class RecentsView<T extends BaseActivity> mHasVisibleTaskData.clear(); } - protected abstract void onAllTasksRemoved(); public void reset() { - unloadVisibleTaskData(); mRunningTaskId = -1; + mRunningTaskTileHidden = false; + + unloadVisibleTaskData(); setCurrentPage(0); + + OverviewCallbacks.get(getContext()).onResetOverview(); } /** @@ -546,12 +671,17 @@ public abstract class RecentsView<T extends BaseActivity> new ActivityManager.TaskDescription(), 0, new ComponentName("", ""), false); taskView.bind(mTmpRunningTask); } - setCurrentTask(mRunningTaskId); + setCurrentTask(runningTaskId); + } - // Hide the task that we are animating into, ignore if there is no associated task (ie. the - // assistant) - if (getPageAt(mCurrentPage) != null) { - getPageAt(mCurrentPage).setAlpha(0); + /** + * Hides the tile associated with {@link #mRunningTaskId} + */ + public void setRunningTaskHidden(boolean isHidden) { + mRunningTaskTileHidden = isHidden; + TaskView runningTask = getTaskView(mRunningTaskId); + if (runningTask != null) { + runningTask.setAlpha(isHidden ? 0 : mContentAlpha); } } @@ -559,7 +689,15 @@ public abstract class RecentsView<T extends BaseActivity> * Similar to {@link #showTask(int)} but does not put any restrictions on the first tile. */ public void setCurrentTask(int runningTaskId) { + boolean runningTaskTileHidden = mRunningTaskTileHidden; + boolean runningTaskIconScaledDown = mRunningTaskIconScaledDown; + + setRunningTaskIconScaledDown(false, false); + setRunningTaskHidden(false); mRunningTaskId = runningTaskId; + setRunningTaskIconScaledDown(runningTaskIconScaledDown, false); + setRunningTaskHidden(runningTaskTileHidden); + setCurrentPage(0); // Load the tasks (if the loading is already @@ -587,22 +725,22 @@ public abstract class RecentsView<T extends BaseActivity> return mQuickScrubController; } - public void setFirstTaskIconScaledDown(boolean isScaledDown, boolean animate) { - if (mFirstTaskIconScaledDown == isScaledDown) { + public void setRunningTaskIconScaledDown(boolean isScaledDown, boolean animate) { + if (mRunningTaskIconScaledDown == isScaledDown) { return; } - mFirstTaskIconScaledDown = isScaledDown; + mRunningTaskIconScaledDown = isScaledDown; applyIconScale(animate); } private void applyIconScale(boolean animate) { - float scale = mFirstTaskIconScaledDown ? 0 : 1; - TaskView firstTask = (TaskView) getChildAt(0); + float scale = mRunningTaskIconScaledDown ? 0 : 1; + TaskView firstTask = getTaskView(mRunningTaskId); if (firstTask != null) { if (animate) { - firstTask.animateIconToScale(scale); + firstTask.animateIconToScaleAndDim(scale); } else { - firstTask.setIconScale(scale); + firstTask.setIconScaleAndDim(scale); } } } @@ -640,8 +778,26 @@ public abstract class RecentsView<T extends BaseActivity> mIgnoreResetTaskViews.remove(taskView); } + private void addDismissedTaskAnimations(View taskView, AnimatorSet anim, long duration) { + addAnim(ObjectAnimator.ofFloat(taskView, ALPHA, 0), duration, ACCEL_2, anim); + addAnim(ObjectAnimator.ofFloat(taskView, TRANSLATION_Y, -taskView.getHeight()), + duration, LINEAR, anim); + } + + private void removeTask(Task task, int index, PendingAnimation.OnEndListener onEndListener, + boolean shouldLog) { + if (task != null) { + ActivityManagerWrapper.getInstance().removeTask(task.key.id); + if (shouldLog) { + mActivity.getUserEventDispatcher().logTaskLaunchOrDismiss( + onEndListener.logAction, Direction.UP, index, + TaskUtils.getComponentKeyForTask(task.key)); + } + } + } + public PendingAnimation createTaskDismissAnimation(TaskView taskView, boolean animateTaskView, - boolean removeTask, long duration) { + boolean shouldRemoveTask, long duration) { if (FeatureFlags.IS_DOGFOOD_BUILD && mPendingAnimation != null) { throw new IllegalStateException("Another pending animation is still running"); } @@ -659,26 +815,43 @@ public abstract class RecentsView<T extends BaseActivity> int[] newScroll = new int[count]; getPageScrolls(newScroll, false, (v) -> v.getVisibility() != GONE && v != taskView); - int maxScrollDiff = 0; - int lastPage = mIsRtl ? 0 : count - 1; - if (getChildAt(lastPage) == taskView) { - if (count > 1) { - int secondLastPage = mIsRtl ? 1 : count - 2; - maxScrollDiff = oldScroll[lastPage] - newScroll[secondLastPage]; - } + int scrollDiffPerPage = 0; + int leftmostPage = mIsRtl ? count -1 : 0; + int rightmostPage = mIsRtl ? 0 : count - 1; + if (count > 1) { + int secondRightmostPage = mIsRtl ? 1 : count - 2; + scrollDiffPerPage = oldScroll[rightmostPage] - oldScroll[secondRightmostPage]; } + int draggedIndex = indexOfChild(taskView); boolean needsCurveUpdates = false; for (int i = 0; i < count; i++) { View child = getChildAt(i); if (child == taskView) { if (animateTaskView) { - addAnim(ObjectAnimator.ofFloat(taskView, ALPHA, 0), duration, ACCEL_2, anim); - addAnim(ObjectAnimator.ofFloat(taskView, TRANSLATION_Y, -taskView.getHeight()), - duration, LINEAR, anim); + addDismissedTaskAnimations(taskView, anim, duration); } } else { - int scrollDiff = newScroll[i] - oldScroll[i] + maxScrollDiff; + // If we just take newScroll - oldScroll, everything to the right of dragged task + // translates to the left. We need to offset this in some cases: + // - In RTL, add page offset to all pages, since we want pages to move to the right + // Additionally, add a page offset if: + // - Current page is rightmost page (leftmost for RTL) + // - Dragging an adjacent page on the left side (right side for RTL) + int offset = mIsRtl ? scrollDiffPerPage : 0; + if (mCurrentPage == draggedIndex) { + int lastPage = mIsRtl ? leftmostPage : rightmostPage; + if (mCurrentPage == lastPage) { + offset += mIsRtl ? -scrollDiffPerPage : scrollDiffPerPage; + } + } else { + // Dragging an adjacent page. + int negativeAdjacent = mCurrentPage - 1; // (Right in RTL, left in LTR) + if (draggedIndex == negativeAdjacent) { + offset += mIsRtl ? -scrollDiffPerPage : scrollDiffPerPage; + } + } + int scrollDiff = newScroll[i] - oldScroll[i] + offset; if (scrollDiff != 0) { addAnim(ObjectAnimator.ofFloat(child, TRANSLATION_X, scrollDiff), duration, ACCEL, anim); @@ -701,18 +874,18 @@ public abstract class RecentsView<T extends BaseActivity> mPendingAnimation = pendingAnimation; mPendingAnimation.addEndListener((onEndListener) -> { if (onEndListener.isSuccess) { - if (removeTask) { - Task task = taskView.getTask(); - if (task != null) { - ActivityManagerWrapper.getInstance().removeTask(task.key.id); - mActivity.getUserEventDispatcher().logTaskLaunchOrDismiss( - onEndListener.logAction, Direction.UP, - TaskUtils.getComponentKeyForTask(task.key)); - } + if (shouldRemoveTask) { + removeTask(taskView.getTask(), draggedIndex, onEndListener, true); + } + int pageToSnapTo = mCurrentPage; + if (draggedIndex < pageToSnapTo) { + pageToSnapTo -= 1; } removeView(taskView); if (getChildCount() == 0) { onAllTasksRemoved(); + } else if (!mIsClearAllButtonFullyRevealed) { + snapToPageImmediately(pageToSnapTo); } } resetTaskVisuals(); @@ -721,6 +894,33 @@ public abstract class RecentsView<T extends BaseActivity> return pendingAnimation; } + public PendingAnimation createAllTasksDismissAnimation(long duration) { + if (FeatureFlags.IS_DOGFOOD_BUILD && mPendingAnimation != null) { + throw new IllegalStateException("Another pending animation is still running"); + } + AnimatorSet anim = new AnimatorSet(); + PendingAnimation pendingAnimation = new PendingAnimation(anim); + + int count = getChildCount(); + for (int i = 0; i < count; i++) { + addDismissedTaskAnimations(getChildAt(i), anim, duration); + } + + mPendingAnimation = pendingAnimation; + mPendingAnimation.addEndListener((onEndListener) -> { + if (onEndListener.isSuccess) { + while (getChildCount() != 0) { + TaskView taskView = getPageAt(getChildCount() - 1); + removeTask(taskView.getTask(), -1, onEndListener, false); + removeView(taskView); + } + onAllTasksRemoved(); + } + mPendingAnimation = null; + }); + return pendingAnimation; + } + private static void addAnim(ObjectAnimator anim, long duration, TimeInterpolator interpolator, AnimatorSet set) { anim.setDuration(duration).setInterpolator(interpolator); @@ -744,9 +944,7 @@ public abstract class RecentsView<T extends BaseActivity> } } - public void dismissTask(TaskView taskView, boolean animateTaskView, boolean removeTask) { - PendingAnimation pendingAnim = createTaskDismissAnimation(taskView, animateTaskView, - removeTask, DISMISS_TASK_DURATION); + private void runDismissAnimation(PendingAnimation pendingAnim) { AnimatorPlaybackController controller = AnimatorPlaybackController.wrap( pendingAnim.anim, DISMISS_TASK_DURATION); controller.dispatchOnStart(); @@ -755,6 +953,15 @@ public abstract class RecentsView<T extends BaseActivity> controller.start(); } + public void dismissTask(TaskView taskView, boolean animateTaskView, boolean removeTask) { + runDismissAnimation(createTaskDismissAnimation(taskView, animateTaskView, removeTask, + DISMISS_TASK_DURATION)); + } + + public void dismissAllTasks() { + runDismissAnimation(createAllTasksDismissAnimation(DISMISS_TASK_DURATION)); + } + @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { @@ -789,21 +996,24 @@ public abstract class RecentsView<T extends BaseActivity> snapToPageRelative(1); } - public void setContentAlpha(float alpha) { - if (mContentAlpha == alpha) { - return; - } + public float getContentAlpha() { + return mContentAlpha; + } + public void setContentAlpha(float alpha) { + alpha = Utilities.boundToRange(alpha, 0, 1); mContentAlpha = alpha; for (int i = getChildCount() - 1; i >= 0; i--) { - getChildAt(i).setAlpha(alpha); + TaskView child = getPageAt(i); + if (!mRunningTaskTileHidden || child.getTask().key.id != mRunningTaskId) { + getChildAt(i).setAlpha(alpha); + } } int alphaInt = Math.round(alpha * 255); mEmptyMessagePaint.setAlpha(alphaInt); mEmptyIcon.setAlpha(alphaInt); - - setVisibility(alpha > 0 ? VISIBLE : GONE); + updateClearAllButtonAlpha(); } public void setAdjacentScale(float adjacentScale) { @@ -815,15 +1025,13 @@ public abstract class RecentsView<T extends BaseActivity> if (currTask == null) { return; } - currTask.setScaleX(mAdjacentScale); - currTask.setScaleY(mAdjacentScale); + currTask.setZoomScale(mAdjacentScale); if (mCurrentPage - 1 >= 0) { TaskView adjacentTask = getPageAt(mCurrentPage - 1); float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, mAdjacentScale, 0); - adjacentTask.setScaleX(scaleAndTranslation[0]); - adjacentTask.setScaleY(scaleAndTranslation[0]); + adjacentTask.setZoomScale(scaleAndTranslation[0]); adjacentTask.setTranslationX(-scaleAndTranslation[1]); adjacentTask.setTranslationY(scaleAndTranslation[2]); } @@ -831,8 +1039,7 @@ public abstract class RecentsView<T extends BaseActivity> TaskView adjacentTask = getPageAt(mCurrentPage + 1); float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, mAdjacentScale, 0); - adjacentTask.setScaleX(scaleAndTranslation[0]); - adjacentTask.setScaleY(scaleAndTranslation[0]); + adjacentTask.setZoomScale(scaleAndTranslation[0]); adjacentTask.setTranslationX(scaleAndTranslation[1]); adjacentTask.setTranslationY(scaleAndTranslation[2]); } @@ -841,11 +1048,10 @@ public abstract class RecentsView<T extends BaseActivity> private float[] getAdjacentScaleAndTranslation(TaskView currTask, TaskView adjacentTask, float currTaskToScale, float currTaskToTranslationY) { float displacement = currTask.getWidth() * (currTaskToScale - currTask.getCurveScale()); - return new float[] { - currTaskToScale * adjacentTask.getCurveScale(), - mIsRtl ? -displacement : displacement, - currTaskToTranslationY - }; + sTempFloatArray[0] = currTaskToScale; + sTempFloatArray[1] = mIsRtl ? -displacement : displacement; + sTempFloatArray[2] = currTaskToTranslationY; + return sTempFloatArray; } @Override @@ -853,6 +1059,7 @@ public abstract class RecentsView<T extends BaseActivity> super.onViewAdded(child); child.setAlpha(mContentAlpha); setAdjacentScale(mAdjacentScale); + onChildViewsChanged(); } @Override @@ -883,10 +1090,11 @@ public abstract class RecentsView<T extends BaseActivity> boolean hasValidSize = getWidth() > 0 && getHeight() > 0; if (sizeChanged && hasValidSize) { mEmptyTextLayout = null; + mLastMeasureSize.set(getWidth(), getHeight()); } + updateClearAllButtonAlpha(); if (mShowEmptyMessage && hasValidSize && mEmptyTextLayout == null) { - mLastMeasureSize.set(getWidth(), getHeight()); int availableWidth = mLastMeasureSize.x - mEmptyMessagePadding - mEmptyMessagePadding; mEmptyTextLayout = StaticLayout.Builder.obtain(mEmptyMessage, 0, mEmptyMessage.length(), mEmptyMessagePaint, availableWidth) @@ -909,8 +1117,13 @@ public abstract class RecentsView<T extends BaseActivity> protected void maybeDrawEmptyMessage(Canvas canvas) { if (mShowEmptyMessage && mEmptyTextLayout != null) { - mEmptyIcon.draw(canvas); + // Offset to center in the visible (non-padded) part of RecentsView + mTempRect.set(mInsets.left + getPaddingLeft(), mInsets.top + getPaddingTop(), + mInsets.right + getPaddingRight(), mInsets.bottom + getPaddingBottom()); canvas.save(); + canvas.translate(getScrollX() + (mTempRect.left - mTempRect.right) / 2, + (mTempRect.top - mTempRect.bottom) / 2); + mEmptyIcon.draw(canvas); canvas.translate(mEmptyMessagePadding, mEmptyIcon.getBounds().bottom + mEmptyMessagePadding); mEmptyTextLayout.draw(canvas); @@ -924,17 +1137,18 @@ public abstract class RecentsView<T extends BaseActivity> * If launching one of the adjacent tasks, parallax the center task and other adjacent task * to the right. */ - public AnimatorSet createAdjacentPageAnimForTaskLaunch(TaskView tv) { + public AnimatorSet createAdjacentPageAnimForTaskLaunch( + TaskView tv, ClipAnimationHelper clipAnimationHelper) { AnimatorSet anim = new AnimatorSet(); int taskIndex = indexOfChild(tv); int centerTaskIndex = getCurrentPage(); boolean launchingCenterTask = taskIndex == centerTaskIndex; - TaskWindowBounds endInterpolation = tv.getRecentsInterpolator().interpolate(1); - float toScale = endInterpolation.taskScale; - float toTranslationY = endInterpolation.taskY; - + float toScale = clipAnimationHelper.getSourceRect().width() + / clipAnimationHelper.getTargetRect().width(); + float toTranslationY = clipAnimationHelper.getSourceRect().centerY() + - clipAnimationHelper.getTargetRect().centerY(); if (launchingCenterTask) { TaskView centerTask = getPageAt(centerTaskIndex); if (taskIndex - 1 >= 0) { @@ -968,68 +1182,143 @@ public abstract class RecentsView<T extends BaseActivity> return anim; } - private ObjectAnimator createAnimForChild(View child, float[] toScaleAndTranslation) { - return ObjectAnimator.ofPropertyValuesHolder(child, + private Animator createAnimForChild(TaskView child, float[] toScaleAndTranslation) { + AnimatorSet anim = new AnimatorSet(); + anim.play(ObjectAnimator.ofFloat(child, TaskView.ZOOM_SCALE, toScaleAndTranslation[0])); + anim.play(ObjectAnimator.ofPropertyValuesHolder(child, new PropertyListBuilder() - .scale(child.getScaleX() * toScaleAndTranslation[0]) .translationX(toScaleAndTranslation[1]) .translationY(toScaleAndTranslation[2]) - .build()); + .build())); + return anim; } public PendingAnimation createTaskLauncherAnimation(TaskView tv, long duration) { if (FeatureFlags.IS_DOGFOOD_BUILD && mPendingAnimation != null) { throw new IllegalStateException("Another pending animation is still running"); } - AnimatorSet anim = createAdjacentPageAnimForTaskLaunch(tv); int count = getChildCount(); if (count == 0) { - return new PendingAnimation(anim); - } - - final RecentsAnimationInterpolator recentsInterpolator = tv.getRecentsInterpolator(); - ValueAnimator targetViewAnim = ValueAnimator.ofFloat(0, 1); - targetViewAnim.addUpdateListener((animation) -> { - float percent = animation.getAnimatedFraction(); - TaskWindowBounds tw = recentsInterpolator.interpolate(percent); - tv.setScaleX(tw.taskScale); - tv.setScaleY(tw.taskScale); - tv.setTranslationX(tw.taskX); - tv.setTranslationY(tw.taskY); + return new PendingAnimation(new AnimatorSet()); + } + + tv.setVisibility(INVISIBLE); + int targetSysUiFlags = tv.getThumbnail().getSysUiStatusNavFlags(); + TaskViewDrawable drawable = new TaskViewDrawable(tv, this); + getOverlay().add(drawable); + + ObjectAnimator drawableAnim = + ObjectAnimator.ofFloat(drawable, TaskViewDrawable.PROGRESS, 1, 0); + drawableAnim.setInterpolator(LINEAR); + drawableAnim.addUpdateListener((animator) -> { + // Once we pass a certain threshold, update the sysui flags to match the target tasks' + // flags + mActivity.getSystemUiController().updateUiState(UI_STATE_OVERVIEW, + animator.getAnimatedFraction() > UPDATE_SYSUI_FLAGS_THRESHOLD + ? targetSysUiFlags + : 0); }); - anim.play(targetViewAnim); + + AnimatorSet anim = createAdjacentPageAnimForTaskLaunch(tv, + drawable.getClipAnimationHelper()); + anim.play(drawableAnim); anim.setDuration(duration); + Consumer<Boolean> onTaskLaunchFinish = (result) -> { + onTaskLaunched(result); + tv.setVisibility(VISIBLE); + getOverlay().remove(drawable); + }; + mPendingAnimation = new PendingAnimation(anim); mPendingAnimation.addEndListener((onEndListener) -> { if (onEndListener.isSuccess) { - tv.launchTask(false); + Consumer<Boolean> onLaunchResult = (result) -> { + onTaskLaunchFinish.accept(result); + if (!result) { + tv.notifyTaskLaunchFailed(TAG); + } + }; + tv.launchTask(false, onLaunchResult, getHandler()); Task task = tv.getTask(); if (task != null) { mActivity.getUserEventDispatcher().logTaskLaunchOrDismiss( - onEndListener.logAction, Direction.DOWN, + onEndListener.logAction, Direction.DOWN, indexOfChild(tv), TaskUtils.getComponentKeyForTask(task.key)); } } else { - resetTaskVisuals(); + onTaskLaunchFinish.accept(false); } mPendingAnimation = null; }); return mPendingAnimation; } + public abstract boolean shouldUseMultiWindowTaskSizeStrategy(); + + protected void onTaskLaunched(boolean success) { + resetTaskVisuals(); + } + @Override protected void notifyPageSwitchListener(int prevPage) { super.notifyPageSwitchListener(prevPage); - View currChild = getChildAt(mCurrentPage); - if (currChild != null) { - currChild.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); - } + loadVisibleTaskData(); } @Override protected String getCurrentPageDescription() { return ""; } + + private int additionalScrollForClearAllButton() { + return (int) getResources().getDimension( + R.dimen.clear_all_container_width) - getPaddingEnd(); + } + + @Override + protected int computeMaxScrollX() { + if (getChildCount() == 0) { + return super.computeMaxScrollX(); + } + + // Allow a clear_all_container_width-sized gap after the last task. + return super.computeMaxScrollX() + (mIsRtl ? 0 : additionalScrollForClearAllButton()); + } + + @Override + protected int offsetForPageScrolls() { + return mIsRtl ? additionalScrollForClearAllButton() : 0; + } + + public void setClearAllButton(View clearAllButton) { + mClearAllButton = clearAllButton; + updateClearAllButtonAlpha(); + } + + private void onChildViewsChanged() { + final int childCount = getChildCount(); + mClearAllButton.setVisibility(childCount == 0 ? INVISIBLE : VISIBLE); + } + + public void revealClearAllButton() { + scrollTo(mIsRtl ? 0 : computeMaxScrollX(), 0); + } + + @Override + public void addChildrenForAccessibility(ArrayList<View> outChildren) { + if (FLIP_RECENTS) { + for (int i = getChildCount() - 1; i >= 0; --i) { + outChildren.add(getChildAt(i)); + } + } else { + super.addChildrenForAccessibility(outChildren); + } + } + + @Override + protected boolean isPageOrderFlipped() { + return FLIP_RECENTS; + } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java new file mode 100644 index 000000000..429432b2f --- /dev/null +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2018 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.views; + +import static com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch.TAP; +import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType.CLEAR_ALL_BUTTON; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.util.FloatProperty; +import android.view.Gravity; +import android.view.MotionEvent; + +import com.android.launcher3.InsettableFrameLayout; +import com.android.launcher3.R; + +public class RecentsViewContainer extends InsettableFrameLayout { + public static final FloatProperty<RecentsViewContainer> CONTENT_ALPHA = + new FloatProperty<RecentsViewContainer>("contentAlpha") { + @Override + public void setValue(RecentsViewContainer view, float v) { + view.setContentAlpha(v); + } + + @Override + public Float get(RecentsViewContainer view) { + return view.mRecentsView.getContentAlpha(); + } + }; + + private final Rect mTempRect = new Rect(); + + private RecentsView mRecentsView; + private ClearAllButton mClearAllButton; + + public RecentsViewContainer(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + mClearAllButton = findViewById(R.id.clear_all_button); + mClearAllButton.setOnClickListener((v) -> { + mRecentsView.mActivity.getUserEventDispatcher() + .logActionOnControl(TAP, CLEAR_ALL_BUTTON); + mRecentsView.dismissAllTasks(); + }); + + mRecentsView = findViewById(R.id.overview_panel); + final InsettableFrameLayout.LayoutParams params = + (InsettableFrameLayout.LayoutParams) mClearAllButton.getLayoutParams(); + params.gravity = Gravity.TOP | (RecentsView.FLIP_RECENTS ? Gravity.START : Gravity.END); + mClearAllButton.setLayoutParams(params); + mClearAllButton.forceHasOverlappingRendering(false); + + mRecentsView.setClearAllButton(mClearAllButton); + mClearAllButton.setRecentsView(mRecentsView); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + mRecentsView.getTaskSize(mTempRect); + + mClearAllButton.setTranslationX( + (mRecentsView.isRtl() ? 1 : -1) * + (getResources().getDimension(R.dimen.clear_all_container_width) + - mClearAllButton.getMeasuredWidth()) / 2); + mClearAllButton.setTranslationY( + mTempRect.top + (mTempRect.height() - mClearAllButton.getMeasuredHeight()) / 2 + - mClearAllButton.getTop()); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + super.onTouchEvent(ev); + // Do not let touch escape to siblings below this view. This prevents scrolling of the + // workspace while in Recents. + return true; + } + + public void setContentAlpha(float alpha) { + if (alpha == mRecentsView.getContentAlpha()) { + return; + } + mRecentsView.setContentAlpha(alpha); + setVisibility(alpha > 0 ? VISIBLE : GONE); + } +}
\ No newline at end of file diff --git a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java new file mode 100644 index 000000000..24afd4868 --- /dev/null +++ b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java @@ -0,0 +1,259 @@ +/* + * Copyright (C) 2018 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.views; + +import static android.support.v4.graphics.ColorUtils.compositeColors; +import static android.support.v4.graphics.ColorUtils.setAlphaComponent; + +import static com.android.launcher3.LauncherState.OVERVIEW; +import static com.android.launcher3.anim.Interpolators.ACCEL_2; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Path.Direction; +import android.graphics.Path.Op; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; +import android.util.AttributeSet; + +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.R; +import com.android.launcher3.uioverrides.OverviewState; +import com.android.launcher3.util.Themes; +import com.android.launcher3.views.ScrimView; + +/** + * Scrim used for all-apps and shelf in Overview + * In transposed layout, it behaves as a simple color scrim. + * In portrait layout, it draws a rounded rect such that + * From normal state to overview state, the shelf just fades in and does not move + * From overview state to all-apps state the shelf moves up and fades in to cover the screen + */ +public class ShelfScrimView extends ScrimView { + + private static final int THRESHOLD_ALPHA_DARK = 102; + private static final int THRESHOLD_ALPHA_LIGHT = 46; + private static final int THRESHOLD_ALPHA_SUPER_LIGHT = 128; + private static final int CLEAR_ALL_TASKS = R.string.recents_clear_all; + + // In transposed layout, we simply draw a flat color. + private boolean mDrawingFlatColor; + + // For shelf mode + private final int mEndAlpha; + private final int mThresholdAlpha; + private final float mRadius; + private final float mMaxScrimAlpha; + private final Paint mPaint; + + // Max vertical progress after which the scrim stops moving. + private float mMoveThreshold; + // Minimum visible size of the scrim. + private int mMinSize; + + private float mScrimMoveFactor = 0; + private int mShelfColor; + private int mRemainingScreenColor; + + private final Path mTempPath = new Path(); + private final Path mRemainingScreenPath = new Path(); + private boolean mRemainingScreenPathValid = false; + + public ShelfScrimView(Context context, AttributeSet attrs) { + super(context, attrs); + mMaxScrimAlpha = OVERVIEW.getWorkspaceScrimAlpha(mLauncher); + + mEndAlpha = Color.alpha(mEndScrim); + if (Themes.getAttrBoolean(mLauncher, R.attr.isMainColorDark)) { + mThresholdAlpha = THRESHOLD_ALPHA_DARK; + } else if (Themes.getAttrBoolean(mLauncher, R.attr.isWorkspaceDarkText)) { + mThresholdAlpha = THRESHOLD_ALPHA_SUPER_LIGHT; + } else { + mThresholdAlpha = THRESHOLD_ALPHA_LIGHT; + } + mRadius = mLauncher.getResources().getDimension(R.dimen.shelf_surface_radius); + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + + // Just assume the easiest UI for now, until we have the proper layout information. + mDrawingFlatColor = true; + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mRemainingScreenPathValid = false; + } + + @Override + public void reInitUi() { + DeviceProfile dp = mLauncher.getDeviceProfile(); + mDrawingFlatColor = dp.isVerticalBarLayout(); + + if (!mDrawingFlatColor) { + float swipeLength = OverviewState.getDefaultSwipeHeight(mLauncher); + mMoveThreshold = 1 - swipeLength / mLauncher.getAllAppsController().getShiftRange(); + mMinSize = dp.hotseatBarSizePx + dp.getInsets().bottom; + mRemainingScreenPathValid = false; + updateColors(); + } + updateDragHandleAlpha(); + invalidate(); + } + + @Override + public void updateColors() { + super.updateColors(); + if (mDrawingFlatColor) { + return; + } + + if (mProgress >= mMoveThreshold) { + mScrimMoveFactor = 1; + + if (mProgress >= 1) { + mShelfColor = 0; + } else { + int alpha = Math.round(mThresholdAlpha * ACCEL_2.getInterpolation( + (1 - mProgress) / (1 - mMoveThreshold))); + mShelfColor = setAlphaComponent(mEndScrim, alpha); + } + + mRemainingScreenColor = 0; + } else if (mProgress <= 0) { + mScrimMoveFactor = 0; + mShelfColor = mCurrentFlatColor; + mRemainingScreenColor = 0; + + } else { + mScrimMoveFactor = mProgress / mMoveThreshold; + mRemainingScreenColor = setAlphaComponent(mScrimColor, + Math.round((1 - mScrimMoveFactor) * mMaxScrimAlpha * 255)); + + // Merge the remainingScreenColor and shelfColor in one to avoid overdraw. + int alpha = mEndAlpha - Math.round((mEndAlpha - mThresholdAlpha) * mScrimMoveFactor); + mShelfColor = compositeColors(setAlphaComponent(mEndScrim, alpha), + mRemainingScreenColor); + } + } + + @Override + protected void updateDragHandleAlpha() { + if (mDrawingFlatColor) { + super.updateDragHandleAlpha(); + } else if (mDragHandle != null) { + mDragHandle.setAlpha(255); + } + } + + @Override + protected void onDraw(Canvas canvas) { + float translate = drawBackground(canvas); + + if (mDragHandle != null) { + canvas.translate(0, -translate); + mDragHandle.draw(canvas); + canvas.translate(0, translate); + } + } + + private float drawBackground(Canvas canvas) { + if (mDrawingFlatColor) { + if (mCurrentFlatColor != 0) { + canvas.drawColor(mCurrentFlatColor); + } + return 0; + } + + if (mShelfColor == 0) { + return 0; + } else if (mScrimMoveFactor <= 0) { + canvas.drawColor(mShelfColor); + return getHeight(); + } + + float minTop = getHeight() - mMinSize; + float top = minTop * mScrimMoveFactor - mDragHandleSize; + + // Draw the scrim over the remaining screen if needed. + if (mRemainingScreenColor != 0) { + if (!mRemainingScreenPathValid) { + mTempPath.reset(); + // Using a arbitrary '+10' in the bottom to avoid any left-overs at the + // corners due to rounding issues. + mTempPath.addRoundRect(0, minTop, getWidth(), getHeight() + mRadius + 10, + mRadius, mRadius, Direction.CW); + + mRemainingScreenPath.reset(); + mRemainingScreenPath.addRect(0, 0, getWidth(), getHeight(), Direction.CW); + mRemainingScreenPath.op(mTempPath, Op.DIFFERENCE); + } + + float offset = minTop - top; + canvas.translate(0, -offset); + mPaint.setColor(mRemainingScreenColor); + canvas.drawPath(mRemainingScreenPath, mPaint); + canvas.translate(0, offset); + } + + mPaint.setColor(mShelfColor); + canvas.drawRoundRect(0, top, getWidth(), getHeight() + mRadius, + mRadius, mRadius, mPaint); + return minTop - mDragHandleSize - top; + } + + @NonNull + @Override + protected AccessibilityHelper createAccessibilityHelper() { + return new ShelfScrimAccessibilityHelper(); + } + + protected class ShelfScrimAccessibilityHelper extends AccessibilityHelper { + @Override + protected void onPopulateNodeForVirtualView(int virtualViewId, + AccessibilityNodeInfoCompat node) { + super.onPopulateNodeForVirtualView(virtualViewId, node); + + if (mLauncher.isInState(OVERVIEW)) { + final RecentsView overviewPanel = mLauncher.getOverviewPanel(); + if (overviewPanel.getChildCount() != 0) { + node.addAction( + new AccessibilityNodeInfoCompat.AccessibilityActionCompat( + CLEAR_ALL_TASKS, + getContext().getText(CLEAR_ALL_TASKS))); + } + } + } + + @Override + protected boolean onPerformActionForVirtualView( + int virtualViewId, int action, Bundle arguments) { + if (super.onPerformActionForVirtualView(virtualViewId, action, arguments)) return true; + + if (action == CLEAR_ALL_TASKS) { + if (mLauncher.isInState(OVERVIEW)) { + mLauncher.<RecentsView>getOverviewPanel().dismissAllTasks(); + } + return true; + } + + return false; + } + } +} diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index 58b7db7b2..128a19e06 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -16,6 +16,8 @@ package com.android.quickstep.views; +import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_FULLSCREEN; + import android.content.Context; import android.content.res.Configuration; import android.graphics.Bitmap; @@ -28,12 +30,15 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Shader; import android.util.AttributeSet; +import android.util.FloatProperty; +import android.util.Property; import android.view.View; import com.android.launcher3.BaseActivity; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.util.SystemUiController; import com.android.quickstep.TaskOverlayFactory; import com.android.quickstep.TaskOverlayFactory.TaskOverlay; import com.android.systemui.shared.recents.model.Task; @@ -46,6 +51,19 @@ public class TaskThumbnailView extends View { private static final LightingColorFilter[] sDimFilterCache = new LightingColorFilter[256]; + public static final Property<TaskThumbnailView, Float> DIM_ALPHA_MULTIPLIER = + new FloatProperty<TaskThumbnailView>("dimAlphaMultiplier") { + @Override + public void setValue(TaskThumbnailView thumbnail, float dimAlphaMultiplier) { + thumbnail.setDimAlphaMultipler(dimAlphaMultiplier); + } + + @Override + public Float get(TaskThumbnailView thumbnailView) { + return thumbnailView.mDimAlphaMultiplier; + } + }; + private final float mCornerRadius; private final BaseActivity mActivity; @@ -62,6 +80,7 @@ public class TaskThumbnailView extends View { protected BitmapShader mBitmapShader; private float mDimAlpha = 1f; + private float mDimAlphaMultiplier = 1f; public TaskThumbnailView(Context context) { this(context, null); @@ -109,8 +128,15 @@ public class TaskThumbnailView extends View { updateThumbnailPaintFilter(); } + public void setDimAlphaMultipler(float dimAlphaMultipler) { + mDimAlphaMultiplier = dimAlphaMultipler; + setDimAlpha(mDimAlpha); + } + /** * Sets the alpha of the dim layer on top of this view. + * + * If dimAlpha is 0, no dimming is applied; if dimAlpha is 1, the thumbnail will be black. */ public void setDimAlpha(float dimAlpha) { mDimAlpha = dimAlpha; @@ -124,32 +150,53 @@ public class TaskThumbnailView extends View { return new Rect(); } + public int getSysUiStatusNavFlags() { + if (mThumbnailData != null) { + int flags = 0; + flags |= (mThumbnailData.systemUiVisibility & SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0 + ? SystemUiController.FLAG_LIGHT_STATUS + : SystemUiController.FLAG_DARK_STATUS; + flags |= (mThumbnailData.systemUiVisibility & SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) != 0 + ? SystemUiController.FLAG_LIGHT_NAV + : SystemUiController.FLAG_DARK_NAV; + return flags; + } + return 0; + } + @Override protected void onDraw(Canvas canvas) { - if (mTask == null) { - return; + drawOnCanvas(canvas, 0, 0, getMeasuredWidth(), getMeasuredHeight(), mCornerRadius); + } + + public float getCornerRadius() { + return mCornerRadius; + } + + public void drawOnCanvas(Canvas canvas, float x, float y, float width, float height, + float cornerRadius) { + // Draw the background in all cases, except when the thumbnail data is opaque + final boolean drawBackgroundOnly = mTask == null || mTask.isLocked || mBitmapShader == null + || mThumbnailData == null; + if (drawBackgroundOnly || mClipBottom > 0 || mThumbnailData.isTranslucent) { + canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mBackgroundPaint); + if (drawBackgroundOnly) { + return; + } } - int width = getMeasuredWidth(); - int height = getMeasuredHeight(); - if (mClipBottom > 0 && !mTask.isLocked) { - canvas.save(); - canvas.clipRect(0, 0, width, mClipBottom); - canvas.drawRoundRect(0, 0, width, height, mCornerRadius, mCornerRadius, mPaint); - canvas.restore(); + if (mClipBottom > 0) { canvas.save(); - canvas.clipRect(0, mClipBottom, width, height); - canvas.drawRoundRect(0, 0, width, height, mCornerRadius, mCornerRadius, - mBackgroundPaint); + canvas.clipRect(x, y, width, mClipBottom); + canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mPaint); canvas.restore(); } else { - canvas.drawRoundRect(0, 0, width, height, mCornerRadius, - mCornerRadius, mTask.isLocked ? mBackgroundPaint : mPaint); + canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mPaint); } } private void updateThumbnailPaintFilter() { - int mul = (int) (mDimAlpha * 255); + int mul = (int) ((1 - mDimAlpha * mDimAlphaMultiplier) * 255); if (mBitmapShader != null) { LightingColorFilter filter = getLightingColorFilter(mul); mPaint.setColorFilter(filter); @@ -167,9 +214,9 @@ public class TaskThumbnailView extends View { if (mBitmapShader != null && mThumbnailData != null) { float scale = mThumbnailData.scale; Rect thumbnailInsets = mThumbnailData.insets; - float thumbnailWidth = mThumbnailData.thumbnail.getWidth() - + final float thumbnailWidth = mThumbnailData.thumbnail.getWidth() - (thumbnailInsets.left + thumbnailInsets.right) * scale; - float thumbnailHeight = mThumbnailData.thumbnail.getHeight() - + final float thumbnailHeight = mThumbnailData.thumbnail.getHeight() - (thumbnailInsets.top + thumbnailInsets.bottom) * scale; final float thumbnailScale; @@ -185,7 +232,8 @@ public class TaskThumbnailView extends View { // Rotate the screenshot if not in multi-window mode rotate = FeatureFlags.OVERVIEW_USE_SCREENSHOT_ORIENTATION && configuration.orientation != mThumbnailData.orientation && - !mActivity.isInMultiWindowModeCompat(); + !mActivity.isInMultiWindowModeCompat() && + mThumbnailData.windowingMode == WINDOWING_MODE_FULLSCREEN; // Scale the screenshot to always fit the width of the card. thumbnailScale = rotate ? getMeasuredWidth() / thumbnailHeight @@ -216,7 +264,8 @@ public class TaskThumbnailView extends View { mMatrix.postScale(thumbnailScale, thumbnailScale); mBitmapShader.setLocalMatrix(mMatrix); - float bitmapHeight = Math.max(thumbnailHeight * thumbnailScale, 0); + float bitmapHeight = Math.max((rotate ? thumbnailWidth : thumbnailHeight) + * thumbnailScale, 0); if (Math.round(bitmapHeight) < getMeasuredHeight()) { mClipBottom = bitmapHeight; } diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index f04acaf12..82aa45a18 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -16,28 +16,34 @@ package com.android.quickstep.views; +import static android.widget.Toast.LENGTH_SHORT; +import static com.android.quickstep.views.TaskThumbnailView.DIM_ALPHA_MULTIPLIER; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.app.ActivityOptions; import android.content.Context; import android.content.res.Resources; import android.graphics.Outline; -import android.graphics.Rect; import android.os.Bundle; import android.os.Handler; import android.util.AttributeSet; +import android.util.FloatProperty; +import android.util.Log; +import android.util.Property; import android.view.View; import android.view.ViewOutlineProvider; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; -import android.widget.ImageView; +import android.widget.Toast; import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseDraggingActivity; -import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; -import com.android.quickstep.RecentsAnimationInterpolator; import com.android.quickstep.TaskSystemShortcut; import com.android.quickstep.TaskUtils; import com.android.quickstep.views.RecentsView.PageCallbacks; @@ -54,6 +60,8 @@ import java.util.function.Consumer; */ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallbacks { + private static final String TAG = TaskView.class.getSimpleName(); + /** A curve of x from 0 to 1, where 0 is the center of the screen and 1 is the edge. */ private static final TimeInterpolator CURVE_INTERPOLATOR = x -> (float) -Math.cos(x * Math.PI) / 2f + .5f; @@ -69,12 +77,28 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback */ private static final float EDGE_SCALE_DOWN_FACTOR = 0.03f; - private static final long SCALE_ICON_DURATION = 120; + public static final long SCALE_ICON_DURATION = 120; + private static final long DIM_ANIM_DURATION = 700; + + public static final Property<TaskView, Float> ZOOM_SCALE = + new FloatProperty<TaskView>("zoomScale") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setZoomScale(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mZoomScale; + } + }; private Task mTask; private TaskThumbnailView mSnapshotView; - private ImageView mIconView; + private IconView mIconView; private float mCurveScale; + private float mZoomScale; + private Animator mDimAlphaAnim; public TaskView(Context context) { this(context, null); @@ -87,11 +111,13 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback public TaskView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setOnClickListener((view) -> { - if (mTask != null) { - launchTask(true /* animate */); - BaseActivity.fromContext(context).getUserEventDispatcher().logTaskLaunchOrDismiss( - Touch.TAP, Direction.NONE, TaskUtils.getComponentKeyForTask(mTask.key)); + if (getTask() == null) { + return; } + launchTask(true /* animate */); + BaseActivity.fromContext(context).getUserEventDispatcher().logTaskLaunchOrDismiss( + Touch.TAP, Direction.NONE, ((RecentsView) getParent()).indexOfChild(this), + TaskUtils.getComponentKeyForTask(getTask().key)); }); setOutlineProvider(new TaskOutlineProvider(getResources())); } @@ -124,8 +150,16 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback return mSnapshotView; } + public IconView getIconView() { + return mIconView; + } + public void launchTask(boolean animate) { - launchTask(animate, null, null); + launchTask(animate, (result) -> { + if (!result) { + notifyTaskLaunchFailed(TAG); + } + }, getHandler()); } public void launchTask(boolean animate, Consumer<Boolean> resultCallback, @@ -146,7 +180,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback @Override public void onTaskDataLoaded(Task task, ThumbnailData thumbnailData) { mSnapshotView.setThumbnail(task, thumbnailData); - mIconView.setImageDrawable(task.icon); + mIconView.setDrawable(task.icon); mIconView.setOnClickListener(icon -> TaskMenuView.showForTask(this)); mIconView.setOnLongClickListener(icon -> { requestDisallowInterceptTouchEvent(true); @@ -157,7 +191,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback @Override public void onTaskDataUnloaded() { mSnapshotView.setThumbnail(null, null); - mIconView.setImageDrawable(null); + mIconView.setDrawable(null); mIconView.setOnLongClickListener(null); } @@ -166,23 +200,37 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback // Do nothing } - public void animateIconToScale(float scale) { + public void animateIconToScaleAndDim(float scale) { mIconView.animate().scaleX(scale).scaleY(scale).setDuration(SCALE_ICON_DURATION).start(); + mDimAlphaAnim = ObjectAnimator.ofFloat(mSnapshotView, DIM_ALPHA_MULTIPLIER, 1 - scale, + scale); + mDimAlphaAnim.setDuration(DIM_ANIM_DURATION); + mDimAlphaAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mDimAlphaAnim = null; + } + }); + mDimAlphaAnim.start(); } - protected void setIconScale(float iconScale) { + protected void setIconScaleAndDim(float iconScale) { mIconView.animate().cancel(); mIconView.setScaleX(iconScale); mIconView.setScaleY(iconScale); + if (mDimAlphaAnim != null) { + mDimAlphaAnim.cancel(); + } + mSnapshotView.setDimAlphaMultipler(iconScale); } public void resetVisualProperties() { - setScaleX(1f); - setScaleY(1f); + setZoomScale(1); setTranslationX(0f); setTranslationY(0f); setTranslationZ(0); setAlpha(1f); + setIconScaleAndDim(1); } @Override @@ -190,40 +238,52 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback float curveInterpolation = CURVE_INTERPOLATOR.getInterpolation(scrollState.linearInterpolation); - mSnapshotView.setDimAlpha(1 - curveInterpolation * MAX_PAGE_SCRIM_ALPHA); + mSnapshotView.setDimAlpha(curveInterpolation * MAX_PAGE_SCRIM_ALPHA); + setCurveScale(getCurveScaleForCurveInterpolation(curveInterpolation)); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + setPivotX((right - left) * 0.5f); + setPivotY(mSnapshotView.getTop() + mSnapshotView.getHeight() * 0.5f); + } + + public float getCurveScaleForInterpolation(float linearInterpolation) { + float curveInterpolation = CURVE_INTERPOLATOR.getInterpolation(linearInterpolation); + return getCurveScaleForCurveInterpolation(curveInterpolation); + } + + private float getCurveScaleForCurveInterpolation(float curveInterpolation) { + return 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR; + } - mCurveScale = 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR; - setScaleX(mCurveScale); - setScaleY(mCurveScale); + private void setCurveScale(float curveScale) { + mCurveScale = curveScale; + onScaleChanged(); } public float getCurveScale() { return mCurveScale; } + public void setZoomScale(float adjacentScale) { + mZoomScale = adjacentScale; + onScaleChanged(); + } + + private void onScaleChanged() { + float scale = mCurveScale * mZoomScale; + setScaleX(scale); + setScaleY(scale); + } + @Override public boolean hasOverlappingRendering() { // TODO: Clip-out the icon region from the thumbnail, since they are overlapping. return false; } - public RecentsAnimationInterpolator getRecentsInterpolator() { - Rect taskViewBounds = new Rect(); - BaseDraggingActivity activity = BaseDraggingActivity.fromContext(getContext()); - DeviceProfile dp = activity.getDeviceProfile(); - activity.getDragLayer().getDescendantRectRelativeToSelf(this, taskViewBounds); - - // TODO: Use the actual target insets instead of the current thumbnail insets in case the - // device state has changed - return new RecentsAnimationInterpolator( - new Rect(0, 0, dp.widthPx, dp.heightPx), - getThumbnail().getInsets(), - taskViewBounds, - new Rect(0, getThumbnail().getTop(), 0, 0), - getScaleX(), - getTranslationX()); - } - private static final class TaskOutlineProvider extends ViewOutlineProvider { private final int mMarginTop; @@ -281,4 +341,13 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback return super.performAccessibilityAction(action, arguments); } + + public void notifyTaskLaunchFailed(String tag) { + String msg = "Failed to launch task"; + if (mTask != null) { + msg += " (task=" + mTask.key.baseIntent + " userId=" + mTask.key.userId + ")"; + } + Log.w(tag, msg); + Toast.makeText(getContext(), R.string.activity_not_available, LENGTH_SHORT).show(); + } } diff --git a/res/animator-v23/discovery_bounce.xml b/res/animator-v23/discovery_bounce.xml index 8d0e8fdfb..f5548537b 100644 --- a/res/animator-v23/discovery_bounce.xml +++ b/res/animator-v23/discovery_bounce.xml @@ -26,14 +26,14 @@ android:fraction="0" android:value="1f" /> <keyframe - android:fraction="0.346" + android:fraction="0.246" android:value="1f" /> <keyframe android:fraction=".423" android:interpolator="@interpolator/disco_bounce" - android:value="0.9438f" /> + android:value="0.9738f" /> <keyframe - android:fraction="0.654" + android:fraction="0.754" android:interpolator="@interpolator/disco_bounce" android:value="1f" /> <keyframe diff --git a/res/drawable/all_apps_handle_landscape.xml b/res/drawable/drag_handle_indicator.xml index 15518ffaa..b01b84ab8 100644 --- a/res/drawable/all_apps_handle_landscape.xml +++ b/res/drawable/drag_handle_indicator.xml @@ -15,25 +15,25 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="@dimen/dynamic_grid_min_page_indicator_size" - android:height="@dimen/dynamic_grid_min_page_indicator_size" - android:viewportWidth="48.0" - android:viewportHeight="48.0" > + android:width="@dimen/vertical_drag_handle_size" + android:height="@dimen/vertical_drag_handle_size" + android:viewportWidth="36.0" + android:viewportHeight="36.0" > <group - android:translateX="17.5" - android:translateY="17.5"> + android:translateX="11.5" + android:translateY="11.5"> <path android:pathData="M2 8.5L6.5 4L11 8.5" android:strokeColor="?attr/workspaceAmbientShadowColor" - android:strokeWidth="4" + android:strokeWidth="3.6" android:strokeLineCap="round" android:strokeLineJoin="round" /> <path android:pathData="M2 8.5L6.5 4L11 8.5" android:strokeColor="?attr/workspaceTextColor" - android:strokeWidth="2" + android:strokeWidth="1.8" android:strokeLineCap="round" android:strokeLineJoin="round" /> </group> diff --git a/res/drawable/ic_drag_indicator.xml b/res/drawable/ic_drag_indicator.xml deleted file mode 100644 index d50bdd3fd..000000000 --- a/res/drawable/ic_drag_indicator.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2018 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="2dp" - android:width="16dp" - android:viewportHeight="2.0" - android:viewportWidth="16.0"> - <path - android:fillColor="@android:color/white" - android:pathData="M1,0h14c0.55,0,1,0.45,1,1s-0.45,1-1,1H1C0.45,2,0,1.55,0,1S0.45,0,1,0z"/> -</vector>
\ No newline at end of file diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index 450d1074c..5e7b117c4 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -31,8 +31,6 @@ <include layout="@layout/all_apps_floating_header" /> - <!-- Note: we are reusing/repurposing a system attribute for search layout, because of a - platform bug, which prevents using custom attributes in <include> tag --> <include android:id="@id/search_container_all_apps" layout="@layout/search_container_all_apps"/> diff --git a/res/layout/launcher.xml b/res/layout/launcher.xml index a4acf06be..da17b2b31 100644 --- a/res/layout/launcher.xml +++ b/res/layout/launcher.xml @@ -18,7 +18,6 @@ android:id="@+id/launcher" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?attr/workspaceStatusBarScrim" android:fitsSystemWindows="true"> <com.android.launcher3.dragndrop.DragLayer @@ -40,7 +39,7 @@ launcher:pageIndicator="@+id/page_indicator" /> <include - android:id="@+id/overview_panel" + android:id="@+id/overview_panel_container" layout="@layout/overview_panel" android:visibility="gone" /> @@ -57,6 +56,9 @@ android:id="@+id/drop_target_bar" layout="@layout/drop_target_bar" /> + <include android:id="@+id/scrim_view" + layout="@layout/scrim_view" /> + <include android:id="@+id/apps_view" layout="@layout/all_apps" @@ -64,9 +66,6 @@ android:layout_height="match_parent" android:visibility="invisible" /> - <include android:id="@+id/drag_indicator" - layout="@layout/drag_handle_indicator" /> - <!-- DO NOT CHANGE THE ID --> <include android:id="@+id/hotseat" diff --git a/quickstep/res/layout/drag_handle_indicator.xml b/res/layout/scrim_view.xml index 9ee05d5ad..a604d569d 100644 --- a/quickstep/res/layout/drag_handle_indicator.xml +++ b/res/layout/scrim_view.xml @@ -13,11 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. --> -<com.android.quickstep.views.QuickstepDragIndicator +<com.android.launcher3.views.ScrimView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/drag_indicator" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:contentDescription="@string/accessibility_desc_recent_apps" - android:scaleType="centerInside" - android:tint="?attr/workspaceTextColor" /> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:id="@+id/scrim_view" />
\ No newline at end of file diff --git a/res/layout/search_container_all_apps.xml b/res/layout/search_container_all_apps.xml index 14d7b53b6..fd9cb60fc 100644 --- a/res/layout/search_container_all_apps.xml +++ b/res/layout/search_container_all_apps.xml @@ -20,7 +20,6 @@ android:layout_height="@dimen/all_apps_search_bar_field_height" android:layout_centerHorizontal="true" android:layout_gravity="top|center_horizontal" - android:layout_marginTop="8dp" android:background="@drawable/bg_all_apps_searchbox" android:elevation="1dp" android:focusableInTouchMode="true" diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 02dd1c98a..87924e79b 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Vouer: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Legstukke"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Muurpapiere"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Home-instellings"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Tuis-instellings"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Gedeaktiveer deur jou administrateur"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Laat toe dat tuisskerm gedraai word"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Wanneer foon gedraai word"</string> <string name="icon_badging_title" msgid="874121399231955394">"Kennisgewingkolle"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Aan"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Af"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Verminder hoogte"</string> <string name="widget_resized" msgid="9130327887929620">"Legstukgrootte is verander na breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Kortpaaie"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> kortpaaie vir <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> kortpaaie en <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> kennisgewings vir <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Maak toe"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Kennisgewing is toegemaak"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoonlik"</string> diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 21b01ddb0..46647c62d 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"የግድግዳ ወረቀቶች"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ስልኩ ሲዞር"</string> <string name="icon_badging_title" msgid="874121399231955394">"የማሳወቂያ ነጥቦች"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"በርቷል"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"ጠፍቷል"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"ቁመት ይቀንሱ"</string> <string name="widget_resized" msgid="9130327887929620">"የመግብር መጠን ወደ ስፋት <xliff:g id="NUMBER_0">%1$s</xliff:g> ቁመት <xliff:g id="NUMBER_1">%2$s</xliff:g> ተለውጧል"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"አቋራጮች"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> የ<xliff:g id="APP_NAME">%2$s</xliff:g> አቋራጮች"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> አቋራጮች እና <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ማሳወቂያዎች ለ<xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"አሰናብት"</string> <string name="notification_dismissed" msgid="6002233469409822874">"ማሳወቂያ ተሰናብቷል"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"የግል"</string> diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 8598a8bb8..c094c3ad8 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -24,13 +24,13 @@ <string name="work_folder_name" msgid="3753320833950115786">"العمل"</string> <string name="activity_not_found" msgid="8071924732094499514">"لم يتم تثبيت التطبيق."</string> <string name="activity_not_available" msgid="7456344436509528827">"التطبيق ليس متاحًا"</string> - <string name="safemode_shortcut_error" msgid="9160126848219158407">"تم تعطيل التطبيق الذي تم تنزيله في الوضع الآمن"</string> - <string name="safemode_widget_error" msgid="4863470563535682004">"الأدوات معطلة في الوضع الآمن"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"تم إيقاف التطبيق الذي تم تنزيله في الوضع الآمن"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"الأدوات غير مفعّلة في الوضع الآمن"</string> <string name="shortcut_not_available" msgid="2536503539825726397">"الاختصار غير متاح"</string> <string name="home_screen" msgid="806512411299847073">"الشاشة الرئيسية"</string> <string name="custom_actions" msgid="3747508247759093328">"الإجراءات المخصّصة"</string> <string name="long_press_widget_to_add" msgid="7699152356777458215">"المس مع الاستمرار لاختيار إحدى الأدوات."</string> - <string name="long_accessible_way_to_add" msgid="4289502106628154155">"انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"انقر مرّتين مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة."</string> <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> <string name="widget_accessible_dims_format" msgid="3640149169885301790">"العرض %1$d الطول %2$d"</string> <string name="add_item_request_drag_hint" msgid="5899764264480397019">"انقر مع الاستمرار لإضافة العنصر يدويًا"</string> @@ -41,7 +41,7 @@ <string name="all_apps_search_market_message" msgid="1366263386197059176">"البحث عن مزيد من التطبيقات"</string> <string name="notifications_header" msgid="1404149926117359025">"الإشعارات"</string> <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"انقر مع الاستمرار لاختيار اختصار."</string> - <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"يمكنك النقر نقرًا مزدوجًا مع الاستمرار لاختيار اختصار أو استخدام الإجراءات المخصصة."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"يمكنك النقر مرّتين مع الاستمرار لاختيار اختصار أو استخدام الإجراءات المخصصة."</string> <string name="out_of_space" msgid="4691004494942118364">"ليس هناك مساحة أخرى في هذه الشاشة الرئيسية."</string> <string name="hotseat_out_of_space" msgid="7448809638125333693">"لا يوجد المزيد من الحقول في علبة المفضلة"</string> <string name="all_apps_button_label" msgid="8130441508702294465">"قائمة التطبيقات"</string> @@ -63,7 +63,7 @@ <string name="gadget_setup_text" msgid="8274003207686040488">"الإعداد"</string> <string name="uninstall_system_app_text" msgid="4172046090762920660">"هذا تطبيق نظام وتتعذر إزالته."</string> <string name="folder_hint_text" msgid="6617836969016293992">"مجلد بدون اسم"</string> - <string name="disabled_app_label" msgid="6673129024321402780">"تم تعطيل <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"تم إيقاف <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> <item quantity="zero"><xliff:g id="APP_NAME_2">%1$s</xliff:g>، به <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> إشعار</item> <item quantity="two"><xliff:g id="APP_NAME_2">%1$s</xliff:g>، به إشعاران (<xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g>)</item> @@ -84,11 +84,13 @@ <string name="widget_button_text" msgid="2880537293434387943">"الأدوات"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"الخلفيات"</string> <string name="settings_button_text" msgid="8873672322605444408">"إعدادات الصفحة الرئيسية"</string> - <string name="msg_disabled_by_admin" msgid="6898038085516271325">"عطَّل المشرف هذه الميزة"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"أوقف المشرف هذه الميزة"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"السماح بتدوير الشاشة الرئيسية"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"عند تدوير الهاتف"</string> <string name="icon_badging_title" msgid="874121399231955394">"نقاط الإشعارات"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"قيد التشغيل"</string> - <string name="icon_badging_desc_off" msgid="5503319969924580241">"قيد الإيقاف"</string> - <string name="title_missing_notification_access" msgid="7503287056163941064">"يلزم تمكين الوصول إلى الإشعارات"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"غير مفعّل"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"يلزم تفعيل الوصول إلى الإشعارات"</string> <string name="msg_missing_notification_access" msgid="281113995110910548">"لعرض نقاط الإشعارات، يجب تشغيل إشعارات التطبيق في <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="title_change_settings" msgid="1376365968844349552">"تغيير الإعدادات"</string> <string name="icon_badging_service_title" msgid="2309733118428242174">"عرض نقاط الإشعارات"</string> @@ -96,7 +98,7 @@ <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"للتطبيقات الجديدة"</string> <string name="icon_shape_override_label" msgid="2977264953998281004">"تغيير شكل الرمز"</string> <string name="icon_shape_override_label_location" msgid="3841607380657692863">"على الشاشة الرئيسية"</string> - <string name="icon_shape_system_default" msgid="1709762974822753030">"استخدام الإعداد الافتراضي للنظام"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"استخدام الإعداد التلقائي للنظام"</string> <string name="icon_shape_square" msgid="633575066111622774">"مربّع"</string> <string name="icon_shape_squircle" msgid="5658049910802669495">"رمز دائري مربّع"</string> <string name="icon_shape_circle" msgid="6550072265930144217">"دائرة"</string> @@ -132,8 +134,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"تقليل الارتفاع"</string> <string name="widget_resized" msgid="9130327887929620">"تم تغيير حجم الأداة إلى العرض <xliff:g id="NUMBER_0">%1$s</xliff:g> والارتفاع <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"الاختصارات"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> اختصار لتطبيق <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"هناك <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> اختصار و<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> إشعار عن <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"تجاهل"</string> <string name="notification_dismissed" msgid="6002233469409822874">"تم تجاهل الإشعار"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"شخصية"</string> diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml new file mode 100644 index 000000000..41deec31e --- /dev/null +++ b/res/values-as/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"কৰ্মস্থান"</string> + <string name="activity_not_found" msgid="8071924732094499514">"এপটো ইনষ্টল কৰা নহ\'ল।"</string> + <string name="activity_not_available" msgid="7456344436509528827">"এপটো নাই"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"ডাউনল\'ড কৰা এপটোক সুৰক্ষিত ম\'ডত অক্ষম কৰা হ\'ল"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"ৱিজেটবোৰক সুৰক্ষিত ম\'ডত অক্ষম কৰা হ\'ল"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"শ্বৰ্টকাট নাই"</string> + <string name="home_screen" msgid="806512411299847073">"গৃহ স্ক্ৰীণ"</string> + <string name="custom_actions" msgid="3747508247759093328">"উপযোগিতা অনুসৰি কৰা কাৰ্যবিলাক"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"কোনো ৱিজেট বাছনি কৰিবলৈ স্পৰ্শ কৰি থাকক।"</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"কোনো ৱিজেট বাছনি কৰিবলৈ অথবা উপযোগিতা অনুসৰি কাৰ্যবিলাক ব্য়ৱহাৰ কৰিবলৈ দুবাৰ টিপি থাকক।"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d বহল x %2$d ওখ"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"মেনুৱেলভাৱে ৰাখিবলৈ স্পৰ্শ কৰি থাকক"</string> + <string name="place_automatically" msgid="8064208734425456485">"স্বয়ংক্ৰিয়ভাবে যোগ কৰক"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"এপসমূহ সন্ধান কৰক"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"এপসমূহ ল’ড কৰি থকা হৈছে…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"ৰ সৈতে মিলা কোনো এপ্ বিচাৰি পোৱা নগ\'ল"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"আৰু অধিক এপবোৰ সন্ধান কৰক"</string> + <string name="notifications_header" msgid="1404149926117359025">"জাননীসমূহ"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ স্পৰ্শ কৰি হেঁচি ধৰক।"</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ দুবাৰ টিপি হেঁচি ধৰক, বা নিজৰ উপযোগিতা অনুসৰি সৃষ্টি কৰা কাৰ্যসমূহ ব্যৱহাৰ কৰক।"</string> + <string name="out_of_space" msgid="4691004494942118364">"এই গৃহ স্ক্ৰীণত আৰু বেছি ঠাই নাই।"</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"পছন্দৰ ট্ৰে\'ত আৰু বেছি ঠাই নাই"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"এপৰ সূচী"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"ব্যক্তিগত এপৰ তালিকা"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"কৰ্মস্থানৰ এপৰ তালিকা"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"গৃহপৃষ্ঠা"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"আঁতৰাওক"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"আনইনষ্টল কৰক"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"এপ সম্পৰ্কীয় তথ্য"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ইনষ্টল কৰক"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"শ্বৰ্টকাট ইনষ্টল কৰিব পাৰে"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"ব্য়ৱহাৰকাৰীৰ হস্তক্ষেপ অবিহনেই কোনো এপক শ্বৰ্টকাটবোৰ যোগ কৰাৰ অনুমতি দিয়ে।"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"গৃহ ছেটিং আৰু শ্বৰ্টকাটবোৰ পঢ়িব পাৰে"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"এপটোক গৃহ পৃষ্ঠাত ছেটিং আৰু শ্বৰ্টকাটসমূহ পঢ়াৰ অনুমতি দিয়ে।"</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"গৃহ ছেটিং আৰু শ্বৰ্টকাটবোৰ লিখিব পাৰে"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"এপটোক গৃহ পৃষ্ঠাত ছেটিং আৰু শ্বৰ্টকাটসমূহ সলনি কৰাৰ অনুমতি দিয়ে।"</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক ফ\'ন কলবোৰ কৰাৰ অনুমতি দিয়া হোৱা নাই"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"ৱিজেট ল\'ড কৰাত সমস্য়া"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"ছেটআপ কৰক"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"এইটো এটা ছিষ্টেম এপ আৰু ইয়াক আনইনষ্টল কৰিব নোৱৰি"</string> + <string name="folder_hint_text" msgid="6617836969016293992">"নামবিহীন ফ\'ল্ডাৰ"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> অক্ষম কৰা হ\'ল"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g>ৰ <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g>টা জাননী আছে</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>ৰ <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g>টা জাননী আছে</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%2$dৰ %1$d পৃষ্ঠা"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"গৃহ স্ক্ৰীণ %2$dৰ %1$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"গৃহ স্ক্ৰীণৰ নতুন পৃষ্ঠা"</string> + <string name="folder_opened" msgid="94695026776264709">"ফ’ল্ডাৰ খোলা হ\'ল, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ফ\'ল্ডাৰ বন্ধ কৰিবলৈ টিপক"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"সলনি কৰা নাম ছেভ কৰিবলৈ টিপক"</string> + <string name="folder_closed" msgid="4100806530910930934">"ফ\'ল্ডাৰ বন্ধ কৰা হ\'ল"</string> + <string name="folder_renamed" msgid="1794088362165669656">"ফ\'ল্ডাৰৰ নাম সলনি কৰি <xliff:g id="NAME">%1$s</xliff:g> কৰা হৈছে"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ফ’ল্ডাৰ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"ৱিজেটসমূহ"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"ৱালপেপাৰসমূহ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ফ\'নটো যেতিয়া ঘূৰোৱা হয়"</string> + <string name="icon_badging_title" msgid="874121399231955394">"জাননী সম্পৰ্কীয় বিন্দুবোৰ"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"অন অৱস্থাত আছে"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"অফ অৱস্থাত আছে"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"জাননী চাবলৈ অনুমতিৰ প্ৰয়োজন"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"জাননী সম্পৰ্কীয় বিন্দুবোৰ দেখুৱাবলৈ <xliff:g id="NAME">%1$s</xliff:g>ৰ বাবে এপৰ জাননীসমূহ অন কৰক"</string> + <string name="title_change_settings" msgid="1376365968844349552">"ছেটিংসমূহ সলনি কৰক"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"জাননী বিন্দুসমূহ দেখুৱাওক"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"গৃহ স্ক্ৰীণত আইকনটো যোগ কৰক"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"নতুন এপসমূহৰ বাবে"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"আইকনৰ আকৃতি সলনি কৰক"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"গৃহ স্ক্ৰীণত"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"ছিষ্টেম ডিফ\'ল্ট ব্য়ৱহাৰ কৰক"</string> + <string name="icon_shape_square" msgid="633575066111622774">"বৰ্গাকাৰ"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"বৰ্গবৃত্তাকাৰ"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"পৰিচিত মানুহৰ গোট"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"চকুপানীৰ টোপাল"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"আইকনৰ আকৃতিত কৰা পৰিবৰ্তনবোৰ প্ৰয়োগ কৰি থকা হৈছে"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"অজ্ঞাত"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"আঁতৰাওক"</string> + <string name="abandoned_search" msgid="891119232568284442">"সন্ধান কৰক"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"এই এপটো ইনষ্টল কৰা হোৱা নাই"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"এই আইকনৰ এপটো ইনষ্টল কৰা হোৱা নাই। আপুনি এইটো আঁতৰাব পাৰে অথবা এপটো বিচাৰি মেনুৱেলভাৱে ইনষ্টল কৰিব পাৰে।"</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ডাউনল\'ড কৰি থকা হৈছে, <xliff:g id="PROGRESS">%2$s</xliff:g> সম্পূৰ্ণ হ\'ল"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ইনষ্টল হোৱালৈ অপেক্ষা কৰি থকা হৈছে"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> ৱিজেট"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"গৃহ স্ক্ৰীণত যোগ কৰক"</string> + <string name="action_move_here" msgid="2170188780612570250">"বস্তুটো ইয়ালৈ স্থানান্তৰ কৰক"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"বস্তুটো গৃহ স্ক্ৰীণত যোগ কৰা হ\'ল"</string> + <string name="item_removed" msgid="851119963877842327">"বস্তুটো আঁতৰোৱা হ\'ল"</string> + <string name="action_move" msgid="4339390619886385032">"বস্তু স্থানান্তৰ কৰক"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"শাৰী <xliff:g id="NUMBER_0">%1$s</xliff:g> স্তম্ভ <xliff:g id="NUMBER_1">%2$s</xliff:g>লৈ স্থানান্তৰিত কৰক"</string> + <string name="move_to_position" msgid="6750008980455459790">"পছন্দৰ অৱস্থান <xliff:g id="NUMBER">%1$s</xliff:g>লৈ স্থানান্তৰিত কৰক"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"পছন্দৰ অৱস্থান <xliff:g id="NUMBER">%1$s</xliff:g>লৈ স্থানান্তৰিত কৰক"</string> + <string name="item_moved" msgid="4606538322571412879">"বস্তুটো স্থানান্তৰ কৰা হ\'ল"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ফ\'ল্ডাৰত যোগ কৰক: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g>সহ ফ\'ল্ডাৰত যোগ কৰক"</string> + <string name="added_to_folder" msgid="4793259502305558003">"বস্তুটো ফ\'ল্ডাৰত যোগ কৰা হ\'ল"</string> + <string name="create_folder_with" msgid="4050141361160214248">"<xliff:g id="NAME">%1$s</xliff:g>: ৰ জৰিয়তে ফ\'ল্ডাৰ সৃষ্টি কৰক"</string> + <string name="folder_created" msgid="6409794597405184510">"ফ\'ল্ডাৰ সৃষ্টি কৰা হ\'ল"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"হ\'ম স্ক্ৰীণলৈ স্থানান্তৰ কৰক"</string> + <string name="action_resize" msgid="1802976324781771067">"আকাৰ সলনি কৰক"</string> + <string name="action_increase_width" msgid="8773715375078513326">"প্ৰস্থ বৃদ্ধি কৰক"</string> + <string name="action_increase_height" msgid="459390020612501122">"উচ্চতা বৃদ্ধি কৰক"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"প্ৰস্থ হ্ৰাস কৰক"</string> + <string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা হ্ৰাস কৰক"</string> + <string name="widget_resized" msgid="9130327887929620">"ৱিজেটৰ আকাৰ সলনি কৰি প্ৰস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> আৰু উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> কৰা হ\'ল"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"শ্বৰ্টকাটসমূহ"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> + <string name="action_dismiss_notification" msgid="5909461085055959187">"অগ্ৰাহ্য কৰক"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"জাননী অগ্ৰাহ্য কৰা হৈছে"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"ব্যক্তিগত"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"কৰ্মস্থান"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"ইয়াত কৰ্মস্থানৰ এপ্ বিচাৰি পাওক"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"কৰ্মস্থানৰ প্ৰতিটো এপৰে একোটা প্ৰতীক আছে আৰু তাক আপোনাৰ প্ৰতিষ্ঠানে সুৰক্ষিত কৰি ৰাখে। ব্যৱহাৰ কৰাত সুবিধা হ\'বলৈ এপসমূহ আপোনাৰ গৃহ স্ক্ৰীণলৈ স্থানান্তৰ কৰক।"</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"আপোনাৰ প্ৰতিষ্ঠানৰ দ্বাৰা পৰিচালিত"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"জাননী আৰু এপসমূহ অফ হৈ আছে"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"বন্ধ কৰক"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"বন্ধ"</string> +</resources> diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml new file mode 100644 index 000000000..ed86f9155 --- /dev/null +++ b/res/values-az-rAZ/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"İş"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Tətbiq quraşdırılmayıb."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Tətbiq əlçatmazdır"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Güvənli rejimdə icazə verilməyən tətbiq endirildi"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Vidcetlər Güvənli rejimdə deaktiv edilib"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Qısayol əlçatan deyil"</string> + <string name="home_screen" msgid="806512411299847073">"Əsas ekran"</string> + <string name="custom_actions" msgid="3747508247759093328">"Fərdi əməliyyatlar"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Vidceti götürmək üçün toxunub saxlayın."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%2$d hündürlük %1$d enində"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Manual olaraq yerləşdirmək üçün toxunaraq basıb saxlayın"</string> + <string name="place_automatically" msgid="8064208734425456485">"Avtomatik əlavə edin"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Tətbiqləri axtarın"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Tətbiqlər yüklənir…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"<xliff:g id="QUERY">%1$s</xliff:g> sorğusuna uyğun tətbiq tapılmadı"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Daha çox tətbiq üçün axtarış edin"</string> + <string name="notifications_header" msgid="1404149926117359025">"Bildirişlər"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Qısayolu seçmək üçün basıb saxlayın."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Qısayolu seçmək üçün iki dəfə basıb saxlayın və ya fərdi əməliyyatlardan istifadə edin."</string> + <string name="out_of_space" msgid="4691004494942118364">"Bu Əsas ekranda boş yer yoxdur."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Favoritlər-də yer yoxdur"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Tətbiq siyahısı"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Şəxsi tətbiqlərin siyahısı"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"İş tətbiqlərinin siyahısı"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Əsas səhifə"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Silin"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Sistemdən sil"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Tətbiq məlumatı"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Quraşdırın"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"qısayolları quraşdır"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Tətbiqə istifadəçi müdaxiləsi olmadan qısayolları əlavə etməyə icazə verir."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"Əsas Səhifə ayarlarını və qısayolları oxuyun"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Tətbiqə Əsas Səhifədə parametrləri və qısayolları oxumağa icazə verir."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"Əsas Səhifə ayarlarını və qısayolları yazın"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Tətbiqə Əsas Səhifədə ayarları və qısayolları dəyişməyə icazə verir."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə telefon zəngləri etmək üçün icazə verilmir"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Vidcet yükləmə problemi"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Quraşdırma"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Bu sistem tətbiqi olduğu üçün sistemdən silinə bilməz."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Adsız Qovluq"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> deaktiv edildi"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> tətbiqində <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> bildiriş var</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g> tətbiqində <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> bildiriş var</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"Səhifə %1$d of %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Əsas Səhifə ekranı %1$d of %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Yeni əsas ekran səhifəsi"</string> + <string name="folder_opened" msgid="94695026776264709">"Qovluq açıldı, <xliff:g id="HEIGHT">%2$d</xliff:g> hündürlük ilə <xliff:g id="WIDTH">%1$d</xliff:g> enində"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Qovluq bağlamaq üçün toxunun"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Ad dəyişikliyini yadda saxlamaq üçün toxunun"</string> + <string name="folder_closed" msgid="4100806530910930934">"Qovluq bağlıdır"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Qovluq adı <xliff:g id="NAME">%1$s</xliff:g> ilə dəyişdirildi"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Qovluq: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Vidcet"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Divar kağızları"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Home ayarları"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Admininiz tərəfindən deaktiv edilib"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Əsas ekranın firlanmağına icazə verin"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon çevrilən zaman"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Bildiriş nişanı"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Aktiv"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Deaktiv"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Bildiriş girişi tələb edilir"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Bildiriş Nöqtələrini göstərmək üçün <xliff:g id="NAME">%1$s</xliff:g> bildirişlərini aktiv edin"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Ayarları dəyişin"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Bildiriş nöqtələrini göstərin"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Əsas ekrana ikona əlavə edin"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Yeni tətbiqlər üçün"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"İkona formasını dəyişin"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"Əsas səhifə ekranında"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Sistem defoltu istifadə edin"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Kvadrat"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Kənarları dairəvi kvadrat"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Çevrə"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Gözyaşı damlası"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"İkona formasına etdiyiniz dəyişikliklər tətbiq edilir"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Naməlum"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Yığışdır"</string> + <string name="abandoned_search" msgid="891119232568284442">"Axtarış"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Bu tətbiq quraşdırılmayıb"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Bu ikona üçün tətbiq quraşdırılmayıb. Onu silə bilərsiniz, və ya tətbiqi taparaq manual yol ilə quraşdıra bilərsiniz."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> endirilir, <xliff:g id="PROGRESS">%2$s</xliff:g> tamamlandı"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> yüklənmək üçün gözləyir"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> vidcetləri"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Əsas ekrana əlavə edin"</string> + <string name="action_move_here" msgid="2170188780612570250">"Elementi bura köçürün"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Element əsas ekrana əlavə edildi"</string> + <string name="item_removed" msgid="851119963877842327">"Element silindi"</string> + <string name="action_move" msgid="4339390619886385032">"Elementi köçürün"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Sıra <xliff:g id="NUMBER_0">%1$s</xliff:g> sütun <xliff:g id="NUMBER_1">%2$s</xliff:g> köçürün"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g> mövqeyinə köçürün"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"<xliff:g id="NUMBER">%1$s</xliff:g> sevimlilər mövqeyinə köçürün"</string> + <string name="item_moved" msgid="4606538322571412879">"Elementin yeri dəyişildi"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Qovluğa əlavə edin: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> adlı qovluğa əlavə edin"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Element qovluğa əlavə edildi"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Qovluq yaradın: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Qovluq yaradıldı"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Əsas ekrana köçürün"</string> + <string name="action_resize" msgid="1802976324781771067">"Ölçüsünü dəyişin"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Eni artırın"</string> + <string name="action_increase_height" msgid="459390020612501122">"Hündürlüyü artırın"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Eni azaldın"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Hündürlüyü azaldın"</string> + <string name="widget_resized" msgid="9130327887929620">"Vidcetin eni <xliff:g id="NUMBER_0">%1$s</xliff:g> hündürlüyü <xliff:g id="NUMBER_1">%2$s</xliff:g> kimi ölçüləndirildi"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Qısa yollar"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> üçün <xliff:g id="APP_NAME">%2$s</xliff:g> qısa yolu"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> üçün <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> qısayol və <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> bildiriş"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Rədd edin"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Bildiriş rədd edildi"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Şəxsi"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"İş"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"İş profili"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Burada iş tətbiqləri axtarın"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Hər bir iş tətbiqində təşkilat tərəfindən qorunduğunu göstərən narıncı nişan var. Tətbiqləri daha asan giriş üçün Əsas Səhifə Ekranına köçürün."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Təşkilatınız tərəfindən idarə olunur"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Bildiriş və tətbiqlər deaktivdir"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Bağlayın"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Bağlıdır"</string> +</resources> diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index a0a1f5773..dd0f022a1 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Divar kağızları"</string> <string name="settings_button_text" msgid="8873672322605444408">"Home ayarları"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Admininiz tərəfindən deaktiv edilib"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Əsas ekranın firlanmağına icazə verin"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon çevrilən zaman"</string> <string name="icon_badging_title" msgid="874121399231955394">"Bildiriş nişanı"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Aktiv"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Deaktiv"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Hündürlüyü azaldın"</string> <string name="widget_resized" msgid="9130327887929620">"Vidcetin eni <xliff:g id="NUMBER_0">%1$s</xliff:g> hündürlüyü <xliff:g id="NUMBER_1">%2$s</xliff:g> kimi ölçüləndirildi"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Qısa yollar"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> üçün <xliff:g id="APP_NAME">%2$s</xliff:g> qısa yolu"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> üçün <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> qısayol və <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> bildiriş"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Rədd edin"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Bildiriş rədd edildi"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Şəxsi"</string> diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 275cf0f25..9a2062f84 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -82,6 +82,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Pozadine"</string> <string name="settings_button_text" msgid="8873672322605444408">"Podešavanja početnog ekrana"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administrator je onemogućio"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Dozvoli rotaciju početnog ekrana"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon rotira"</string> <string name="icon_badging_title" msgid="874121399231955394">"Tačke za obaveštenja"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Uključeno"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Isključeno"</string> @@ -129,8 +131,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string> <string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> i visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Prečice"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> prečice(a) za <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Prečice (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) i obaveštenja (<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>) za <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Obaveštenje je odbačeno"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Lične"</string> diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml new file mode 100644 index 000000000..399ae763e --- /dev/null +++ b/res/values-be-rBY/strings.xml @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Працоўная"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Праграма не ўсталявана."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Праграма недаступная"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Спампаваная праграма адключана ў Бяспечным рэжыме"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Віджэты адключаны ў Бяспечным рэжыме"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Ярлык недаступны"</string> + <string name="home_screen" msgid="806512411299847073">"Галоўны экран"</string> + <string name="custom_actions" msgid="3747508247759093328">"Спецыяльныя дзеянні"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Дакраніцеся і ўтрымлiвайце віджэт, каб выбр. яго."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Дакраніцеся двойчы і ўтрымлівайце, каб выбраць віджэт або выкарыстоўваць карыстальніцкія дзеянні."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"Шырына: %1$d, вышыня: %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Каб размясціць уручную, дакраніцеся і ўтрымлівайце"</string> + <string name="place_automatically" msgid="8064208734425456485">"Дадаць аўтаматычна"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Пошук праграм"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Праграмы загружаюцца…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"Праграм, якія адпавядаюць запыту \"<xliff:g id="QUERY">%1$s</xliff:g>\", не знойдзена"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Шукаць іншыя праграмы"</string> + <string name="notifications_header" msgid="1404149926117359025">"Апавяшчэнні"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Дакраніцеся і ўтрымлiвайце ярлык, каб дадаць яго."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Дакраніцеся двойчы і ўтрымлівайце, каб выбраць ярлык або выкарыстоўваць спецыяльныя дзеянні."</string> + <string name="out_of_space" msgid="4691004494942118364">"На гэтым Галоўным экране больш няма месца."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"У латку \"Абранае\" больш няма месца"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Спіс праграм"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Спіс персанальных праграм"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Спіс працоўных праграм"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Галоўная"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Выдаліць"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Выдаліць"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Звесткі пра праграмы"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Усталяваць"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"усталёўваць ярлыкі"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Дазваляе праграмам дадаваць ярлыкі без умяшання карыстальніка."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"счытваць налады і ярлыкі на Галоўнай старонцы"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Дазваляе праграме счытваць налады і ярлыкі на Галоўнай старонцы."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"запісваць налады і ярлыкі на галоўнай старонцы"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Дазваляе праграме змяняць налады і ярлыкі на Галоўнай старонцы."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> не мае дазволу на здзяйсненне тэлефонных званкоў"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Праблема загрузкі віджэта"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Наладжванне"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Гэта сістэмная праграма, яе нельга выдаліць."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Папка без назвы"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> адключана"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g>: ёсць <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> апавяшчэнне</item> + <item quantity="few"><xliff:g id="APP_NAME_2">%1$s</xliff:g>: ёсць <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> апавяшчэнні</item> + <item quantity="many"><xliff:g id="APP_NAME_2">%1$s</xliff:g>: ёсць <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> апавяшчэнняў</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>: ёсць <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> апавяшчэння</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"Старонка %1$d з %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Галоўны экран %1$d з %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Новая старонка галоўнага экрана"</string> + <string name="folder_opened" msgid="94695026776264709">"Папка адкрыта, <xliff:g id="WIDTH">%1$d</xliff:g> на <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Краніце, каб закрыць папку"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Краніце, каб захаваць новую назву"</string> + <string name="folder_closed" msgid="4100806530910930934">"Папка закрыта"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Папка перайменавана ў <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Папка: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Віджэты"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Шпалеры"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Пры павароце тэлефона"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Значкі апавяшчэнняў"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Уключана"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Выключана"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Патрабуецца доступ да апавяшчэнняў"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Каб паказваліся значкі апавяшчэнняў, уключыце апавяшчэнні праграм для <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Змяніць налады"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Паказаць значкі апавяшчэнняў"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Дадаць значок на Галоўны экран"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Для новых праграм"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Змяніць форму значка"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"на галоўным экране"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Выкарыстоўваць стандартныя формы"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Квадрат"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Прамавугольнік са скругленымі вугламі"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Круг"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Сляза"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Змены формы значка прымяняюцца"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Невядома"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Выдаліць"</string> + <string name="abandoned_search" msgid="891119232568284442">"Шукаць"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Гэта праграма не ўсталявана"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Праграма для гэтага значка не ўсталявана. Вы можаце выдаліць яе або выканаць пошук і ўсталяваць яе ўручную."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"Ідзе спампоўка <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="PROGRESS">%2$s</xliff:g> завершана"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> чакае ўсталёўкі"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Віджэты <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Дадаць на Галоўны экран"</string> + <string name="action_move_here" msgid="2170188780612570250">"Перамясціць элемент сюды"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Элемент дададзены на галоўны экран"</string> + <string name="item_removed" msgid="851119963877842327">"Элемент выдалены"</string> + <string name="action_move" msgid="4339390619886385032">"Перамясціць элемент"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Перамясціць у радок <xliff:g id="NUMBER_0">%1$s</xliff:g> слупок <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"Перамясціць у пазіцыю <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Перамясціць у абранае, у пазіцыю <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="item_moved" msgid="4606538322571412879">"Элемент перамешчаны"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Дадаць у папку: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"Дадаць у папку з <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Элемент дададзены ў папку"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Стварыць папку з: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Папка створана"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Перамясціць на Галоўны экран"</string> + <string name="action_resize" msgid="1802976324781771067">"Змяніць памер"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Павялічыць шырыню"</string> + <string name="action_increase_height" msgid="459390020612501122">"Павялічыць вышыню"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Паменшыць шырыню"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Паменшыць вышыню"</string> + <string name="widget_resized" msgid="9130327887929620">"Памеры віджэта зменены на: шырыня <xliff:g id="NUMBER_0">%1$s</xliff:g>, вышыня <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Ярлыкі"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"Ярлыкі (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) для <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Ярлыкі (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) і апавяшчэнні (<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>) для <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Адхіліць"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Апавяшчэнне адхілена"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Асабістыя"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Праца"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Працоўны профіль"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Знайдзіце працоўныя праграмы тут"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Кожная працоўная праграма мае значок і знаходзіцца пад аховай вашай арганізацыі. Для больш простага доступу перамясціце праграмы на Галоўны экран."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Пад кіраваннем вашай арганізацыі"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Апавяшчэнні і праграмы выключаны"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Закрыць"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Закрытыя"</string> +</resources> diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index a1f1d8912..ea312e7b1 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -83,6 +83,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Шпалеры"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Пры павароце тэлефона"</string> <string name="icon_badging_title" msgid="874121399231955394">"Значкі апавяшчэнняў"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Уключана"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Выключана"</string> @@ -130,8 +132,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Паменшыць вышыню"</string> <string name="widget_resized" msgid="9130327887929620">"Памеры віджэта зменены на: шырыня <xliff:g id="NUMBER_0">%1$s</xliff:g>, вышыня <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Ярлыкі"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Ярлыкі (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) для <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Ярлыкі (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) і апавяшчэнні (<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>) для <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Адхіліць"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Апавяшчэнне адхілена"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Асабістыя"</string> diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 3c0490577..92000496d 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Папка: „<xliff:g id="NAME">%1$s</xliff:g>“"</string> <string name="widget_button_text" msgid="2880537293434387943">"Приспособления"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Тапети"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Настройки за Google Home"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"При завъртане на телефона"</string> <string name="icon_badging_title" msgid="874121399231955394">"Точки за известия"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Включено"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Изключено"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Намаляване на височината"</string> <string name="widget_resized" msgid="9130327887929620">"Приспособлението е преоразмерено към ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> и височина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Преки пътища"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> преки пътища за <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> преки пътища и <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> известия за <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Отхвърляне"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Известието е отхвърлено"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Лични"</string> diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml new file mode 100644 index 000000000..ffeeed76a --- /dev/null +++ b/res/values-bn-rBD/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"কাজ"</string> + <string name="activity_not_found" msgid="8071924732094499514">"অ্যাপ্লিকেশান ইনস্টল করা নেই৷"</string> + <string name="activity_not_available" msgid="7456344436509528827">"অ্যাপ্লিকেশান অনুপলব্ধ"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"ডাউনলোড করা অ্যাপ্লিকেশান নিরাপদ মোডে অক্ষম রয়েছে"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"সুরক্ষিত মোডে উইজেট নিষ্ক্রিয় থাকে"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"শর্টকাটগুলি অনুপলব্ধ"</string> + <string name="home_screen" msgid="806512411299847073">"হোম স্ক্রিন"</string> + <string name="custom_actions" msgid="3747508247759093328">"কাস্টম অ্যাকশন"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷"</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%2$d উচ্চতা অনুযায়ী %1$d প্রস্থ"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"নিজে যোগ করতে টাচ করে ধরে রাখুন"</string> + <string name="place_automatically" msgid="8064208734425456485">"স্বয়ংক্রিয়ভাবে যোগ করুন"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"অ্যাপ খুঁজুন"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"অ্যাপ লোড হচ্ছে…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" এর সাথে মেলে এমন কোনো অ্যাপ পাওয়া যায়নি"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"আরও অ্যাপ্লিকেশানের জন্য খুঁজুন"</string> + <string name="notifications_header" msgid="1404149926117359025">"বিজ্ঞপ্তি"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"কোনও শর্টকাট বেছে নিতে টাচ করে ধরে থাকুন।"</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"কোনও শর্টকাট বেছে নিতে ডবল ট্যাপ করে ধরে থাকুন অথবা কাস্টম অ্যাকশন ব্যবহার করুন।"</string> + <string name="out_of_space" msgid="4691004494942118364">"এই হোম স্ক্রীনে আর কোনো জায়গা নেই৷"</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"পছন্দসই ট্রে-তে আর কোনো জায়গা নেই"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"অ্যাপ্লিকেশানগুলির তালিকা"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"ব্যক্তিগত অ্যাপের তালিকা"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"কাজের অ্যাপের তালিকা"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"হোম"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"সরান"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"আনইনস্টল করুন"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"অ্যাপের তথ্য"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ইনস্টল করুন"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"শর্টকাটগুলি ইনস্টল করে"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"একটি অ্যাপ্লিকেশানকে ব্যবহারকারীর হস্তক্ষেপ ছাড়াই শর্টকাটগুলি যোগ করার অনুমতি দেয়৷"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"হোম সেটিংস এবং শর্টকাটগুলি পড়ে"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"হোমে অ্যাপ্লিকেশানটিকে সেটিংস এবং শর্টকাটগুলি পড়তে দেয়৷"</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"হোম সেটিংস এবং শর্টকাটগুলি লেখে"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"হোমে অ্যাপ্লিকেশানটিকে সেটিংস এবং শর্টকাটগুলি পরিবর্তন করতে দেয়৷"</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"ফোন কলগুলি করার জন্য <xliff:g id="APP_NAME">%1$s</xliff:g> এর অনুমতি নেই"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"উইজেট লোড হতে সমস্যা হয়েছে"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"সেটআপ"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"এটি একটি সিস্টেম অ্যাপ্লিকেশান এবং আনইনস্টল করা যাবে না৷"</string> + <string name="folder_hint_text" msgid="6617836969016293992">"নামবিহীন ফোল্ডার"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> অক্ষম করা হয়েছে"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g> এ <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g>টি বিজ্ঞপ্তি আছে</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> এ <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g>টি বিজ্ঞপ্তি আছে</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%2$dটির মধ্যে %1$dটি পৃষ্ঠা"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$dটির %1$d নম্বর হোম স্ক্রিন"</string> + <string name="workspace_new_page" msgid="257366611030256142">"নতুন হোম স্ক্রীনের পৃষ্ঠা"</string> + <string name="folder_opened" msgid="94695026776264709">"ফোল্ডার খোলা হয়েছে, <xliff:g id="WIDTH">%1$d</xliff:g> বাই <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ফোল্ডার বন্ধ করতে আলতো চাপ দিন"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"পুনঃনামকরণ সংরক্ষণ করতে আলতো চাপ দিন"</string> + <string name="folder_closed" msgid="4100806530910930934">"ফোল্ডার বন্ধ করা হয়েছে"</string> + <string name="folder_renamed" msgid="1794088362165669656">"ফোল্ডারের নাম পাল্টে <xliff:g id="NAME">%1$s</xliff:g> করা হয়েছে"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ফোল্ডার: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"উইজেট"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"ওয়ালপেপারগুলি"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"যখন ফোনটি ঘোরানো হয়"</string> + <string name="icon_badging_title" msgid="874121399231955394">"বিজ্ঞপ্তি ডট"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"চালু হয়েছে"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"বন্ধ আছে"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"বিজ্ঞপ্তিতে অ্যাক্সেস প্রয়োজন"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"বিজ্ঞপ্তির ডটগুলি দেখানোর জন্য, <xliff:g id="NAME">%1$s</xliff:g> এর অ্যাপ বিজ্ঞপ্তি চালু করুন"</string> + <string name="title_change_settings" msgid="1376365968844349552">"সেটিংস পরিবর্তন করুন"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"বিজ্ঞপ্তির ডট দেখুন"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"হোম স্ক্রিনে আইকন যোগ করুন"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"নতুন অ্যাপ্লিকেশানগুলির জন্যে"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"আইকনের আকৃতি পরিবর্তন করুন"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"হোম স্ক্রিনে"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"সিস্টেমের ডিফল্ট মান ব্যবহার করুন"</string> + <string name="icon_shape_square" msgid="633575066111622774">"চৌকো"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"চৌকো-গোলাকার"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"গোলাকার"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"চোখের জল"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"আইকনের আকৃতি পরিবর্তন করা হচ্ছে"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"অজানা"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"সরান"</string> + <string name="abandoned_search" msgid="891119232568284442">"অনুসন্ধান"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"এই অ্যাপ্লিকেশানটি ইন্সটল করা নাই"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"এই আইকনের অ্যাপ্লিকেশানটি ইন্সটল করা নাই। আপনি এটি সরাতে পারেন বা অ্যাপ্লিকেশানটি অনুসন্ধান করে এটি নিজে ইন্সটল করতে পারেন।"</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ডাউনলোড হচ্ছে <xliff:g id="PROGRESS">%2$s</xliff:g> সম্পন্ন হয়েছে"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ইনস্টলের অপেক্ষায় রয়েছে"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> উইজেট"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"হোম স্ক্রীনে যোগ করুন"</string> + <string name="action_move_here" msgid="2170188780612570250">"এখানে আইটেম সরান"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"হোম স্ক্রীনে আইটেম যোগ করা হয়েছে"</string> + <string name="item_removed" msgid="851119963877842327">"আইটেম সরানো হয়েছে"</string> + <string name="action_move" msgid="4339390619886385032">"আইটেম সরান"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"সারি <xliff:g id="NUMBER_0">%1$s</xliff:g> কলাম <xliff:g id="NUMBER_1">%2$s</xliff:g> এ সরান"</string> + <string name="move_to_position" msgid="6750008980455459790">"অবস্থানে সরান <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"পছন্দসই অবস্থানে সরান <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="item_moved" msgid="4606538322571412879">"আইটেম সরানো হয়েছে"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ফোল্ডারে যোগ করুন: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> সহ ফোল্ডারে যোগ করা হয়েছে"</string> + <string name="added_to_folder" msgid="4793259502305558003">"আইটেম ফোল্ডারে যোগ করা হয়েছে"</string> + <string name="create_folder_with" msgid="4050141361160214248">"এর সাথে ফোল্ডার তৈরি করুন: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"ফোল্ডার তৈরি করা হয়েছে"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"হোম স্ক্রীনে সরান"</string> + <string name="action_resize" msgid="1802976324781771067">"আবার আকার দিন"</string> + <string name="action_increase_width" msgid="8773715375078513326">"প্রস্থ বাড়ান"</string> + <string name="action_increase_height" msgid="459390020612501122">"উচ্চতা বাড়ান"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"প্রস্থ কমান"</string> + <string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা কমান"</string> + <string name="widget_resized" msgid="9130327887929620">"উইজেটের আকার প্রস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> তে পরিবর্তন করা হয়েছে"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"শর্টকাট"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> এর <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>টি শর্টকার্ট"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> এর জন্য <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>টি শর্টকাট এবং <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>টি বিজ্ঞপ্তি"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"খারিজ করুন"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"বিজ্ঞপ্তি খারিজ করা হয়েছে"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"ব্যক্তিগত"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"অফিস"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"অফিসের প্রোফাইল"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"এখানে কাজের অ্যাপ্সগুলি খুঁজুন"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"প্রতিটি কাজের অ্যাপে একটি করে ব্যাজ রয়েছে এবং অ্যাপগুলি আপনার প্রতিষ্ঠানের দ্বারা সুরক্ষিত। সহজে অ্যাক্সেস করার জন্য অ্যাপগুলি হোম স্ক্রিনে রাখুন।"</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"আপনার প্রতিষ্ঠানের দ্বারা পরিচালিত"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"বিজ্ঞপ্তি এবং অ্যাপ বন্ধ আছে"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"বন্ধ করুন"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"বন্ধ"</string> +</resources> diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index a0e4812cc..b11fae9ad 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -77,10 +77,12 @@ <string name="folder_closed" msgid="4100806530910930934">"ফোল্ডার বন্ধ করা হয়েছে"</string> <string name="folder_renamed" msgid="1794088362165669656">"ফোল্ডারের নাম পাল্টে <xliff:g id="NAME">%1$s</xliff:g> করা হয়েছে"</string> <string name="folder_name_format" msgid="6629239338071103179">"ফোল্ডার: <xliff:g id="NAME">%1$s</xliff:g>"</string> - <string name="widget_button_text" msgid="2880537293434387943">"উইজেটগুলি"</string> + <string name="widget_button_text" msgid="2880537293434387943">"উইজেট"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"ওয়ালপেপারগুলি"</string> - <string name="settings_button_text" msgid="8873672322605444408">"হোম এর সেটিংস"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"যখন ফোনটি ঘোরানো হয়"</string> <string name="icon_badging_title" msgid="874121399231955394">"বিজ্ঞপ্তি ডট"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"চালু হয়েছে"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"বন্ধ আছে"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা কমান"</string> <string name="widget_resized" msgid="9130327887929620">"উইজেটের আকার প্রস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> তে পরিবর্তন করা হয়েছে"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"শর্টকাট"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> এর <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>টি শর্টকার্ট"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> এর জন্য <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>টি শর্টকাট এবং <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>টি বিজ্ঞপ্তি"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"খারিজ করুন"</string> <string name="notification_dismissed" msgid="6002233469409822874">"বিজ্ঞপ্তি খারিজ করা হয়েছে"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"ব্যক্তিগত"</string> diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml new file mode 100644 index 000000000..40c886603 --- /dev/null +++ b/res/values-bs-rBA/strings.xml @@ -0,0 +1,147 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Posao"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Aplikacija nije instalirana."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Aplikacija nije dostupna"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Preuzeta aplikacija je onemogućena u sigurnom načinu rada"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Vidžeti su onemogućeni u sigurnom načinu rada."</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Prečica nije dostupna"</string> + <string name="home_screen" msgid="806512411299847073">"Početni ekran"</string> + <string name="custom_actions" msgid="3747508247759093328">"Prilagođene akcije"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Dodirnite & i držite da biste uzeli dodatak."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Dodirnite dvaput & i držite da biste uzeli vidžet ili koristite prilagođene radnje."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"Širina %1$d, visina %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Dodirnite i držite da postavite ručno"</string> + <string name="place_automatically" msgid="8064208734425456485">"Dodaj automatski"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pretražite aplikacije"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Aplikacije se učitavaju…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nije pronađena nijedna aplikacija za upit \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Pretraži više aplikacija"</string> + <string name="notifications_header" msgid="1404149926117359025">"Obavještenja"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Dodirnite i držite da uzmete prečicu."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Dodirnite dvaput i držite da uzmete prečicu ili koristite prilagođene akcije."</string> + <string name="out_of_space" msgid="4691004494942118364">"Na ovom početnom ekranu nema više prostora."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Nema više prostora u ladici Omiljeno"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Spisak aplikacija"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Lista ličnih aplikacija"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Lista poslovnih aplikacija"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Početna"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Ukloni"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Deinstaliraj"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Informacije o aplikaciji"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Instaliraj"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"instaliraj prečice"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Dopušta aplikaciji dodavanje prečica bez posredovanja korisnika."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"čitaj postavke na početnom ekranu i prečice"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Dopušta aplikaciji čitanje postavki i prečica na početnom ekranu."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"zapisuj postavke na početnom ekranu i prečice"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Dopušta aplikaciji promjenu postavki i prečica na početnom ekranu."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> nema odobrenje da uspostavlja telefonske pozive"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Problem pri učitavanju dodatka"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Postavljanje"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Ovo je sistemska aplikacija i ne može se deinstalirati."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Neimenovani folder"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je onemogućena"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g> ima <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> obavještenje</item> + <item quantity="few"><xliff:g id="APP_NAME_2">%1$s</xliff:g> ima <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> obavještenja</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> ima <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> obavještenja</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"Strana %1$d od %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Početni ekran %1$d od %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Nova stranica početnog ekrana"</string> + <string name="folder_opened" msgid="94695026776264709">"Folder je otvoren, (š) <xliff:g id="WIDTH">%1$d</xliff:g> (v) <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Dodirnite da zatvorite folder"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Dodirnite da sačuvate promjenu naziva"</string> + <string name="folder_closed" msgid="4100806530910930934">"Folder je zatvoren"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Ime foldera je promijenjeno u <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Dodaci"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Pozadinske slike"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Postavke početnog ekrana"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogućio vaš administrator"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Dozvoli rotiranje početnog ekrana"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon zarotira"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Tačke za obavještenja"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Uključeno"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Isključeno"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Potreban je pristup obavještenjima"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Za prikaz tačaka obavještenja, uključite obavještenja za aplikacije za aplikaciju <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Promijeni postavke"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Prikaži tačke za obavještenja"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Dodaj ikonu na početni ekran"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Za nove aplikacije"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Promjena oblika ikona"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"na Početnom ekranu"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Koristite sistemski zadano"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Kvadrat"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Zaobljeni kvadrat"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Krug"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Suza"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Primjenjivanje promjena oblika ikona"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Nepoznato"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Ukloni"</string> + <string name="abandoned_search" msgid="891119232568284442">"Pretraži"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Ova aplikacija nije instalirana"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Aplikacija za ovu ikonu nije instalirana. Možete je ukloniti ili potražiti aplikaciju i ručno je instalirati."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> se preuzima, završeno <xliff:g id="PROGRESS">%2$s</xliff:g>"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> čeka da se instalira"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Vidžeti za aplikaciju <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Dodaj na početni ekran"</string> + <string name="action_move_here" msgid="2170188780612570250">"Premjesti stavku ovdje"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Stavka je dodana na Početni ekran."</string> + <string name="item_removed" msgid="851119963877842327">"Stavka je uklonjena"</string> + <string name="action_move" msgid="4339390619886385032">"Premjesti stavku"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Pomjeri stavku u red <xliff:g id="NUMBER_0">%1$s</xliff:g> kolonu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"Pomjeri stavku na poziciju <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Pomjeri stavku na poziciju <xliff:g id="NUMBER">%1$s</xliff:g> među omiljenim"</string> + <string name="item_moved" msgid="4606538322571412879">"Stavka je premještena"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Dodaj u folder: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"Dodaj u folder sa aplikacijom <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Stavka je dodana u folder"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Kreirajte folder sa stavkom: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Folder je kreiran"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Pomjeri na početni ekran"</string> + <string name="action_resize" msgid="1802976324781771067">"Promijeni veličinu"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Povećaj širinu"</string> + <string name="action_increase_height" msgid="459390020612501122">"Povećaj visinu"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Smanji širinu"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string> + <string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promijenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Prečice"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> prečica za aplikaciju <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Za aplikaciju <xliff:g id="APP_NAME">%3$s</xliff:g> broj prečica je <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>, a broj obavještenja je <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Obavještenje je odbačeno"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Lične"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Poslovne"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Radni profil"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Pronađite poslovne aplikacije ovdje"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Svaka poslovna aplikacija ima značku i osigurava je vaša organizacija. Premjestite aplikacije na Početni ekran, radi lakšeg pristupa."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Upravlja vaša organizacija"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Notifikacije i aplikacije su isključene"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Zatvori"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Zatvoreno"</string> +</resources> diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 08a453360..94d3ca067 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -30,7 +30,7 @@ <string name="home_screen" msgid="806512411299847073">"Početni ekran"</string> <string name="custom_actions" msgid="3747508247759093328">"Prilagođene akcije"</string> <string name="long_press_widget_to_add" msgid="7699152356777458215">"Dodirnite & i držite da biste uzeli dodatak."</string> - <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Dvaput dodirnite & i držite da biste uzeli vidžet ili koristite prilagođene radnje."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Dodirnite dvaput & i držite da biste uzeli vidžet ili koristite prilagođene radnje."</string> <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> <string name="widget_accessible_dims_format" msgid="3640149169885301790">"Širina %1$d, visina %2$d"</string> <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Dodirnite i držite da postavite ručno"</string> @@ -41,7 +41,7 @@ <string name="all_apps_search_market_message" msgid="1366263386197059176">"Pretraži više aplikacija"</string> <string name="notifications_header" msgid="1404149926117359025">"Obavještenja"</string> <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Dodirnite i držite da uzmete prečicu."</string> - <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Dvaput dodirnite i držite da uzmete prečicu ili koristite prilagođene akcije."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Dodirnite dvaput i držite da uzmete prečicu ili koristite prilagođene akcije."</string> <string name="out_of_space" msgid="4691004494942118364">"Na ovom početnom ekranu nema više prostora."</string> <string name="hotseat_out_of_space" msgid="7448809638125333693">"Nema više prostora u ladici Omiljeno"</string> <string name="all_apps_button_label" msgid="8130441508702294465">"Spisak aplikacija"</string> @@ -80,8 +80,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Dodaci"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Pozadinske slike"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Postavke za Home"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Postavke početnog ekrana"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogućio vaš administrator"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Dozvoli rotiranje početnog ekrana"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon zarotira"</string> <string name="icon_badging_title" msgid="874121399231955394">"Tačke za obavještenja"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Uključeno"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Isključeno"</string> @@ -101,7 +103,7 @@ <string name="icon_shape_override_progress" msgid="3461735694970239908">"Primjenjivanje promjena oblika ikona"</string> <string name="package_state_unknown" msgid="7592128424511031410">"Nepoznato"</string> <string name="abandoned_clean_this" msgid="7610119707847920412">"Ukloni"</string> - <string name="abandoned_search" msgid="891119232568284442">"Traži"</string> + <string name="abandoned_search" msgid="891119232568284442">"Pretraži"</string> <string name="abandoned_promises_title" msgid="7096178467971716750">"Ova aplikacija nije instalirana"</string> <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Aplikacija za ovu ikonu nije instalirana. Možete je ukloniti ili potražiti aplikaciju i ručno je instalirati."</string> <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> se preuzima, završeno <xliff:g id="PROGRESS">%2$s</xliff:g>"</string> @@ -129,8 +131,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string> <string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promijenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Prečice"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> prečica za aplikaciju <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Za aplikaciju <xliff:g id="APP_NAME">%3$s</xliff:g> broj prečica je <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>, a broj obavještenja je <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Obavještenje je odbačeno"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Lične"</string> diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 27b2979e1..2364e722e 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -50,7 +50,7 @@ <string name="all_apps_home_button_label" msgid="252062713717058851">"Inici"</string> <string name="remove_drop_target_label" msgid="7812859488053230776">"Suprimeix"</string> <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Desinstal·la"</string> - <string name="app_info_drop_target_label" msgid="692894985365717661">"Dades de l\'aplicació"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Informació de l\'aplicació"</string> <string name="install_drop_target_label" msgid="2539096853673231757">"Instal·la"</string> <string name="permlab_install_shortcut" msgid="5632423390354674437">"instal·la dreceres"</string> <string name="permdesc_install_shortcut" msgid="923466509822011139">"Permet que una aplicació afegeixi dreceres sense la intervenció de l\'usuari."</string> @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Fons de pantalla"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Configuració de la pantalla d\'inici"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Configuració de pantalla d\'inici"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desactivada per l\'administrador"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Permet la rotació de la pantalla d\'inici"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"En girar el telèfon"</string> <string name="icon_badging_title" msgid="874121399231955394">"Punts de notificació"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Activat"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Desactivat"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Redueix l\'alçada"</string> <string name="widget_resized" msgid="9130327887929620">"S\'ha canviat la mida del widget a l\'amplada <xliff:g id="NUMBER_0">%1$s</xliff:g> i l\'alçada <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Dreceres"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> dreceres per a l\'aplicació <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> dreceres i <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notificacions per a <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Ignora"</string> <string name="notification_dismissed" msgid="6002233469409822874">"S\'ha ignorat la notificació"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string> diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index eee945c20..f84e437c1 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -83,6 +83,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Tapety"</string> <string name="settings_button_text" msgid="8873672322605444408">"Nastavení plochy"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Zakázáno administrátorem"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Povolit otáčení plochy"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Při otočení telefonu"</string> <string name="icon_badging_title" msgid="874121399231955394">"Puntíky s oznámením"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Zapnuto"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Vypnuto"</string> @@ -130,8 +132,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Snížit výšku"</string> <string name="widget_resized" msgid="9130327887929620">"Velikost widgetu upravena: šířka <xliff:g id="NUMBER_0">%1$s</xliff:g>, výška <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Zkratky"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Počet zkratek pro aplikaci <xliff:g id="APP_NAME">%2$s</xliff:g>: <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Zkratky (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) a oznámení (<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>) aplikace <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Zavřít"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Oznámení bylo zavřeno"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobní"</string> diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 203a9da7d..1d6984c75 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Baggrunde"</string> <string name="settings_button_text" msgid="8873672322605444408">"Indstillinger for startskærmen"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Deaktiveret af din administrator"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Tillad rotation af startskærmen"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Når telefonen roteres"</string> <string name="icon_badging_title" msgid="874121399231955394">"Underretningscirkler"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Til"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Fra"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Reducer højden"</string> <string name="widget_resized" msgid="9130327887929620">"Størrelsen for widgetten er ændret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og højde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Genveje"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> genveje til <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> genveje og <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> underretninger for <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Afvis"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Underretningen blev afvist"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personlige"</string> diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index f012a9ee6..af07f1c8f 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Hintergründe"</string> <string name="settings_button_text" msgid="8873672322605444408">"Einstellungen für den Startbildschirm"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Von deinem Administrator deaktiviert"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Drehung des Startbildschirms zulassen"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Bei Drehung des Smartphones"</string> <string name="icon_badging_title" msgid="874121399231955394">"App-Benachrichtigungspunkte"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Aktiviert"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Deaktiviert"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Höhe verringern"</string> <string name="widget_resized" msgid="9130327887929620">"Größe des Widgets zu Breite <xliff:g id="NUMBER_0">%1$s</xliff:g> und Höhe <xliff:g id="NUMBER_1">%2$s</xliff:g> geändert"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Verknüpfungen"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> Verknüpfungen für <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> Verknüpfungen und <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> Benachrichtigungen für <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Schließen"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Benachrichtigung geschlossen"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string> diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 18eec841f..3de0aaf5a 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Φάκελος: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Γραφικά στοιχεία"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Ταπετσαρίες"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Ρυθμίσεις Αρχικής σελίδας"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Όταν το τηλέφωνο περιστρέφεται"</string> <string name="icon_badging_title" msgid="874121399231955394">"Κουκκίδες ειδοποίησης"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Ενεργή"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Ανενεργή"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Μείωση του ύψους"</string> <string name="widget_resized" msgid="9130327887929620">"Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε <xliff:g id="NUMBER_0">%1$s</xliff:g> πλάτος και <xliff:g id="NUMBER_1">%2$s</xliff:g> ύψος"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Συντομεύσεις"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> συντομεύσεις για <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> συντομεύσεις και <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ειδοποιήσεις για την εφαρμογή <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Παράβλεψη"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Η ειδοποίηση παραβλέφθηκε"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Προσωπικές"</string> diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index c2e37b8e5..cca8e859d 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Wallpapers"</string> <string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Allow Homescreen rotation"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string> <string name="icon_badging_title" msgid="874121399231955394">"Notification dots"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"On"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Off"</string> diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index c2e37b8e5..cca8e859d 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Wallpapers"</string> <string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Allow Homescreen rotation"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string> <string name="icon_badging_title" msgid="874121399231955394">"Notification dots"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"On"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Off"</string> diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index c2e37b8e5..cca8e859d 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Wallpapers"</string> <string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Allow Homescreen rotation"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string> <string name="icon_badging_title" msgid="874121399231955394">"Notification dots"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"On"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Off"</string> diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 989cd619e..f991da7f8 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Fondos de pantalla"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Configuración de Home"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Configuración de página principal"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"El administrador inhabilitó esta función"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Permitir la rotación de la pantalla principal"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Al girar el teléfono"</string> <string name="icon_badging_title" msgid="874121399231955394">"Puntos de notificación"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Activada"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Desactivada"</string> @@ -92,7 +94,7 @@ <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Para nuevas apps"</string> <string name="icon_shape_override_label" msgid="2977264953998281004">"Cambiar forma de los íconos"</string> <string name="icon_shape_override_label_location" msgid="3841607380657692863">"en la pantalla principal"</string> - <string name="icon_shape_system_default" msgid="1709762974822753030">"Usar el sistema predeterminado"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Usar valores predeterminados del sistema"</string> <string name="icon_shape_square" msgid="633575066111622774">"Cuadrado"</string> <string name="icon_shape_squircle" msgid="5658049910802669495">"Cuadrado con esquinas redondeadas"</string> <string name="icon_shape_circle" msgid="6550072265930144217">"Círculo"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Reducir la altura"</string> <string name="widget_resized" msgid="9130327887929620">"Se cambió la dimensión del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto."</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Accesos directos"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> accesos directos para <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> accesos directos y <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notificaciones de <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Descartar"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Se descartó la notificación"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personales"</string> diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 5b948da35..1dbe8e904 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -79,11 +79,13 @@ <string name="folder_name_format" msgid="6629239338071103179">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Fondos de pantalla"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Ajustes de Home"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Ajustes de la pantalla de inicio"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Inhabilitada por el administrador"</string> - <string name="icon_badging_title" msgid="874121399231955394">"Puntos de notificación"</string> - <string name="icon_badging_desc_on" msgid="2627952638544674079">"Activada"</string> - <string name="icon_badging_desc_off" msgid="5503319969924580241">"Desactivada"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Permitir rotación de la pantalla de inicio"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Al girar el teléfono"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Burbujas de notificación"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Activado"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Desactivado"</string> <string name="title_missing_notification_access" msgid="7503287056163941064">"Se necesita acceso a las notificaciones"</string> <string name="msg_missing_notification_access" msgid="281113995110910548">"Para mostrar burbujas de notificación, activa las notificaciones de <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="title_change_settings" msgid="1376365968844349552">"Cambiar ajustes"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string> <string name="widget_resized" msgid="9130327887929620">"Se ha modificado el tamaño del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Accesos directos"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> accesos directos de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> accesos directos y <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notificaciones de <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorar"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Notificación ignorada"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string> diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml new file mode 100644 index 000000000..1bde8aac1 --- /dev/null +++ b/res/values-et-rEE/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Töö"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Rakendus pole installitud."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Rakendus ei ole saadaval"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Allalaetud rakendus on turvarežiimis keelatud"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Turvarežiimis on vidinad keelatud"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Otsetee pole saadaval"</string> + <string name="home_screen" msgid="806512411299847073">"Avaekraan"</string> + <string name="custom_actions" msgid="3747508247759093328">"Kohandatud toimingud"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Vidina valimiseks vajutage ja hoidke seda all."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d lai ja %2$d kõrge"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Puudutage pikalt, et käsitsi asetada"</string> + <string name="place_automatically" msgid="8064208734425456485">"Lisa automaatselt"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Otsige rakendusi"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Rakenduste laadimine …"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"Päringule „<xliff:g id="QUERY">%1$s</xliff:g>” ei vastanud ükski rakendus"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Otsi rohkem rakendusi"</string> + <string name="notifications_header" msgid="1404149926117359025">"Märguanded"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Otsetee valimiseks puudutage seda pikalt."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Topeltpuudutage ja hoidke otsetee valimiseks või kohandatud toimingute kasutamiseks."</string> + <string name="out_of_space" msgid="4691004494942118364">"Sellel avaekraanil pole enam ruumi."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Salves Lemmikud pole rohkem ruumi"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Rakenduste loend"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Isiklike rakenduste loend"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Töörakenduste loend"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Avaekraan"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Eemalda"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Desinstalli"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Rakenduse teave"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Installimine"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"installi otseteed"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Võimaldab rakendusel lisada otseteid kasutaja sekkumiseta."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"loe avaekraani seadeid ja otseteid"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Võimaldab rakendusel lugeda avaekraanil seadeid ja otseteid."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"kirjuta avaekraani seaded ja otseteed"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Võimaldab rakendusel muuta avaekraanil seadeid ja otseteid."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"Rakendusel <xliff:g id="APP_NAME">%1$s</xliff:g> pole lubatud helistada"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Probleem vidina laadimisel"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Seadistamine"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"See on süsteemirakendus ja seda ei saa desinstallida."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Nimetu kaust"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"Rakendus <xliff:g id="APP_NAME">%1$s</xliff:g> on keelatud"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> märguannet</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g> – <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> märguanne</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"Leht %1$d/%2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Avaekraan %1$d/%2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Uus avaekraan"</string> + <string name="folder_opened" msgid="94695026776264709">"Kaust on avatud, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Puudutage kausta sulgemiseks"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Puudutage ümbernimetamise salvestamiseks"</string> + <string name="folder_closed" msgid="4100806530910930934">"Kaust on suletud"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Kausta uus nimi: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Kaust: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Vidinad"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Taustapildid"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Avaekraani seaded"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Keelas administraator"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Luba avaekraani pööramine"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kui telefoni pööratakse"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Märguandetäpid"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Sees"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Väljas"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Vaja on juurdepääsu märguannetele"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Märguandetäppide kuvamiseks lülitage sisse rakenduse <xliff:g id="NAME">%1$s</xliff:g> märguanded"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Seadete muutmine"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Kuva märguandetäpid"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Lisa ikoon avaekraanile"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Uute rakenduste puhul"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Ikooni kuju muutmine"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"avaekraanil"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Kasuta süsteemi vaikeseadet"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Ruut"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Ümarate nurkadega ruut"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Ring"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Tilk"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Ikooni kuju muudatuste rakendamine"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Teadmata"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Eemalda"</string> + <string name="abandoned_search" msgid="891119232568284442">"Otsing"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"See rakendus ei ole installitud"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Selle ikooni rakendust pole installitud. Saate selle eemaldada või rakendust otsida ja käsitsi installida."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"Rakenduse <xliff:g id="NAME">%1$s</xliff:g> allalaadimine, <xliff:g id="PROGRESS">%2$s</xliff:g> on valmis"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> on installimise ootel"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Teenuse <xliff:g id="NAME">%1$s</xliff:g> vidinad"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Lisa avaekraanile"</string> + <string name="action_move_here" msgid="2170188780612570250">"Teisalda üksus siia"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Üksus lisati avaekraanile"</string> + <string name="item_removed" msgid="851119963877842327">"Üksus eemaldati"</string> + <string name="action_move" msgid="4339390619886385032">"Teisalda üksus"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Teisaldamine <xliff:g id="NUMBER_0">%1$s</xliff:g>. rea <xliff:g id="NUMBER_1">%2$s</xliff:g>. veergu"</string> + <string name="move_to_position" msgid="6750008980455459790">"Teisaldamine <xliff:g id="NUMBER">%1$s</xliff:g>. positsioonile"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Teisaldamine lemmikute <xliff:g id="NUMBER">%1$s</xliff:g>. positsioonile"</string> + <string name="item_moved" msgid="4606538322571412879">"Üksus teisaldati"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Lisamine kausta: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"Lisamine kausta nimega <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Üksus lisati kausta"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Kausta loomine nimega <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Kaust on loodud"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Teisalda avaekraanile"</string> + <string name="action_resize" msgid="1802976324781771067">"Muuda suurust"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Suurenda laiust"</string> + <string name="action_increase_height" msgid="459390020612501122">"Suurenda kõrgust"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Vähenda laiust"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Vähenda kõrgust"</string> + <string name="widget_resized" msgid="9130327887929620">"Vidina suurust muudeti. Laius: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Kõrgus: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Otseteed"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> otseteed rakenduse <xliff:g id="APP_NAME">%2$s</xliff:g> jaoks"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> otseteed ja <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> märguannet rakendusele <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Loobu"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Märguandest loobuti"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Isiklik"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Töö"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Tööprofiil"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Töörakendused leiate siit"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Igal töörakendusel on märk ja teie organisatsioon tagab selle turvalisuse. Teisaldage rakendused avaekraanile, et neile oleks lihtsam juurde pääseda."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Haldab teie organisatsioon"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Märguanded ja rakendused on välja lülitatud"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Sule"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Suletud"</string> +</resources> diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 2946076f5..94b0103e6 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Kaust: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Vidinad"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Taustapildid"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Avalehe seaded"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Avaekraani seaded"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Keelas administraator"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Luba avaekraani pööramine"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kui telefoni pööratakse"</string> <string name="icon_badging_title" msgid="874121399231955394">"Märguandetäpid"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Sees"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Väljas"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Vähenda kõrgust"</string> <string name="widget_resized" msgid="9130327887929620">"Vidina suurust muudeti. Laius: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Kõrgus: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Otseteed"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> otseteed rakenduse <xliff:g id="APP_NAME">%2$s</xliff:g> jaoks"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> otseteed ja <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> märguannet rakendusele <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Loobu"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Märguandest loobuti"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Isiklik"</string> diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml new file mode 100644 index 000000000..128c6f42a --- /dev/null +++ b/res/values-eu-rES/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Lana"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Aplikazioa instalatu gabe dago."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Ez dago erabilgarri aplikazioa"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Deskargatutako aplikazioa modu seguruan desgaitu da"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Widgetak desgaitu egin dira modu seguruan"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Lasterbideak ez daude erabilgarri"</string> + <string name="home_screen" msgid="806512411299847073">"Hasierako pantaila"</string> + <string name="custom_actions" msgid="3747508247759093328">"Ekintza pertsonalizatuak"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Eduki sakatuta widgeta aukeratzeko."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d zabal eta %2$d luze"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Eduki sakatuta eskuz gehitzeko"</string> + <string name="place_automatically" msgid="8064208734425456485">"Gehitu automatikoki"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Bilatu aplikazioetan"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Aplikazioak kargatzen…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"Ez da aurkitu \"<xliff:g id="QUERY">%1$s</xliff:g>\" bilaketaren emaitzarik"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Bilatu aplikazio gehiago"</string> + <string name="notifications_header" msgid="1404149926117359025">"Jakinarazpenak"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Eduki sakatuta lasterbide bat aukeratzeko."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Sakatu birritan eta eduki sakatuta lasterbide bat aukeratzeko edo ekintza pertsonalizatuak erabiltzeko."</string> + <string name="out_of_space" msgid="4691004494942118364">"Hasierako pantaila honetan ez dago toki gehiago."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Ez dago toki gehiago Gogokoak erretiluan"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Aplikazioen zerrenda"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Aplikazio pertsonalen zerrenda"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Laneko aplikazioen zerrenda"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Hasiera"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Kendu"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Desinstalatu"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Aplikazioaren datuak"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Instalatu"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"Instalatu lasterbideak"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Erabiltzaileak ezer egin gabe lasterbideak gehitzea baimentzen die aplikazioei."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"Irakurri hasierako ezarpenak eta lasterbideak"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Hasierako pantailako ezarpenak eta lasterbideak irakurtzea baimentzen die aplikazioei."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"Idatzi hasierako ezarpenak eta lasterbideak"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Hasierako pantailako ezarpenak eta lasterbideak aldatzea baimentzen die aplikazioei."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ez du telefono-deiak egiteko baimenik"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Arazo bat izan da widgeta kargatzean"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Konfigurazioa"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Sistema-aplikazioa da hau eta ezin da desinstalatu."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Izenik gabeko karpeta"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> desgaituta dago"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> jakinarazpen dauzka <xliff:g id="APP_NAME_2">%1$s</xliff:g> aplikazioak</item> + <item quantity="one"><xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> jakinarazpen dauka <xliff:g id="APP_NAME_0">%1$s</xliff:g> aplikazioak</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%1$d/%2$d orria"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"%1$d/%2$d hasierako pantaila"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Hasierako pantailaren orri berria"</string> + <string name="folder_opened" msgid="94695026776264709">"Karpeta ireki da: <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Karpeta ixteko, sakatu hau"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Izen berria gordetzeko, sakatu hau"</string> + <string name="folder_closed" msgid="4100806530910930934">"Karpeta itxi da"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Karpetari <xliff:g id="NAME">%1$s</xliff:g> izena eman zaio"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Karpeta: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Widgetak"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Horma-paperak"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Hasierako pantailaren ezarpenak"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratzaileak desgaitu du"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Baimendu hasierako pantaila biratzea"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Telefonoa biratzen denean"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Jakinarazpen-biribiltxoak"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Aktibatuta"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Desaktibatuta"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Jakinarazpenetarako sarbidea behar da"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Jakinarazpen-biribiltxoak ikusteko, aktibatu <xliff:g id="NAME">%1$s</xliff:g> aplikazioaren jakinarazpenak"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Aldatu ezarpenak"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Erakutsi jakinarazpen-biribiltxoak"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Gehitu ikonoa hasierako pantailan"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Aplikazio berrietan"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Aldatu ikonoaren forma"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"Hasierako pantailan"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Erabili sistemaren balio lehenetsiak"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Karratua"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Ertz biribilduko karratua"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Zirkulua"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Malkoa"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Ikonoaren forman egindako aldaketak aplikatzen"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Ezezaguna"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Kendu"</string> + <string name="abandoned_search" msgid="891119232568284442">"Bilatu"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Aplikazio hau ez dago instalatuta"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Ikono honen aplikazioa ez dago instalatuta. Ikonoa ken dezakezu, edo aplikazioa bilatu eta eskuz instalatu."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> deskargatzen, <xliff:g id="PROGRESS">%2$s</xliff:g> osatuta"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> instalatzeko zain"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> widgetak"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Gehitu hasierako pantailan"</string> + <string name="action_move_here" msgid="2170188780612570250">"Ekarri elementua hona"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Gehitu da elementua hasierako pantailan"</string> + <string name="item_removed" msgid="851119963877842327">"Kendu da elementua"</string> + <string name="action_move" msgid="4339390619886385032">"Mugitu elementua"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Eraman <xliff:g id="NUMBER_0">%1$s</xliff:g>. errenkadara, <xliff:g id="NUMBER_1">%2$s</xliff:g>. zutabera"</string> + <string name="move_to_position" msgid="6750008980455459790">"Eraman <xliff:g id="NUMBER">%1$s</xliff:g>. postura"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Eraman gogokoen <xliff:g id="NUMBER">%1$s</xliff:g>. postura"</string> + <string name="item_moved" msgid="4606538322571412879">"Elementua mugitu da"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Gehitu <xliff:g id="NAME">%1$s</xliff:g> karpetan"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"Gehitu <xliff:g id="NAME">%1$s</xliff:g> duen karpetan"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Elementua karpetan gehitu da"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Sortu karpeta <xliff:g id="NAME">%1$s</xliff:g> elementuarekin"</string> + <string name="folder_created" msgid="6409794597405184510">"Karpeta sortu da"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Eraman hasierako pantailara"</string> + <string name="action_resize" msgid="1802976324781771067">"Aldatu tamaina"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Handitu zabalera"</string> + <string name="action_increase_height" msgid="459390020612501122">"Handitu altuera"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Txikitu zabalera"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Txikitu altuera"</string> + <string name="widget_resized" msgid="9130327887929620">"Aldatu da widgetaren tamaina. Zabalera: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Altuera: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Lasterbideak"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> aplikazioaren <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> lasterbide"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> aplikazioaren <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> lasterbide eta <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> jakinarazpen"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Baztertu"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Baztertu egin da jakinarazpena"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Pertsonalak"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Lanekoak"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Laneko profila"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Hemen dituzu laneko aplikazioak"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Laneko aplikazio bakoitzak bereizgarri bat dauka eta erakundeak babesten du. Aplikazioak errazago atzitzeko, eraman itzazu hasierako pantailara."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Erakundeak kudeatzen du"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Jakinarazpenak eta aplikazioak desaktibatuta daude"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Itxi"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Itxita"</string> +</resources> diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index c3099bd98..a13c49325 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -81,13 +81,15 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Horma-paperak"</string> <string name="settings_button_text" msgid="8873672322605444408">"Hasierako pantailaren ezarpenak"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratzaileak desgaitu du"</string> - <string name="icon_badging_title" msgid="874121399231955394">"Jakinarazteko biribiltxoak"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Baimendu hasierako pantaila biratzea"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Telefonoa biratzen denean"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Jakinarazpen-biribiltxoak"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Aktibatuta"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Desaktibatuta"</string> <string name="title_missing_notification_access" msgid="7503287056163941064">"Jakinarazpenetarako sarbidea behar da"</string> - <string name="msg_missing_notification_access" msgid="281113995110910548">"Jakinarazteko biribiltxoak ikusteko, aktibatu <xliff:g id="NAME">%1$s</xliff:g> aplikazioaren jakinarazpenak"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Jakinarazpen-biribiltxoak ikusteko, aktibatu <xliff:g id="NAME">%1$s</xliff:g> aplikazioaren jakinarazpenak"</string> <string name="title_change_settings" msgid="1376365968844349552">"Aldatu ezarpenak"</string> - <string name="icon_badging_service_title" msgid="2309733118428242174">"Erakutsi jakinarazteko biribiltxoak"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Erakutsi jakinarazpen-biribiltxoak"</string> <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Gehitu ikonoa hasierako pantailan"</string> <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Aplikazio berrietan"</string> <string name="icon_shape_override_label" msgid="2977264953998281004">"Aldatu ikonoaren forma"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Txikitu altuera"</string> <string name="widget_resized" msgid="9130327887929620">"Aldatu da widgetaren tamaina. Zabalera: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Altuera: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Lasterbideak"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> aplikazioaren <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> lasterbide"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> aplikazioaren <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> lasterbide eta <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> jakinarazpen"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Baztertu"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Baztertu egin da jakinarazpena"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Pertsonalak"</string> diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 4843d6d9e..da12ebe7b 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"کاغذدیواریها"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"وقتی تلفن چرخانده میشود"</string> <string name="icon_badging_title" msgid="874121399231955394">"نقطههای اعلان"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"روشن"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"خاموش"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"کاهش ارتفاع"</string> <string name="widget_resized" msgid="9130327887929620">"اندازه ابزارک به عرض <xliff:g id="NUMBER_0">%1$s</xliff:g> ارتفاع <xliff:g id="NUMBER_1">%2$s</xliff:g> تغییر کرد"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"میانبرها"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> میانبر برای <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> میانبر و <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> اعلان برای <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"رد کردن"</string> <string name="notification_dismissed" msgid="6002233469409822874">"اعلان رد شد"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"شخصی"</string> diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 5ffc41455..96214d30a 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Taustakuvat"</string> <string name="settings_button_text" msgid="8873672322605444408">"Kotiasetukset"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Järjestelmänvalvoja on poistanut toiminnon käytöstä."</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Salli aloitusnäytön kiertäminen"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kun puhelinta kierretään"</string> <string name="icon_badging_title" msgid="874121399231955394">"Pistemerkit"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Käytössä"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Pois käytöstä"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Vähennä korkeutta"</string> <string name="widget_resized" msgid="9130327887929620">"Widgetin kokoa muutettiin. Sen leveys on nyt <xliff:g id="NUMBER_0">%1$s</xliff:g> ja korkeus <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Pikakuvakkeet"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Sovelluksella <xliff:g id="APP_NAME">%2$s</xliff:g> on <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> pikakuvaketta."</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g>: <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> pikakuvaketta ja <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ilmoitusta"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Hylkää"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Ilmoitus hylätty"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Henkilökohtaiset"</string> diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index d6903efb1..aebb42df2 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Fonds d\'écran"</string> <string name="settings_button_text" msgid="8873672322605444408">"Paramètres d\'accueil"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Cette fonction est désactivée par votre administrateur"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Autoriser la rotation de l\'écran d\'accueil"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Lorsque vous faites pivoter le téléphone"</string> <string name="icon_badging_title" msgid="874121399231955394">"Points de notification"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Activé"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Désactivé"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string> <string name="widget_resized" msgid="9130327887929620">"Le widget a été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Raccourcis"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> raccourcis pour <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> raccourcis et <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notifications pour <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorer"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Notification ignorée"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personnel"</string> diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index e1b758124..6c5c12069 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Dossier \"<xliff:g id="NAME">%1$s</xliff:g>\""</string> <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Fonds d\'écran"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Paramètres de l\'écran d\'accueil"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Paramètres accueil"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Désactivé par votre administrateur"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Autoriser la rotation de l\'écran d\'accueil"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Lorsque vous faites pivoter le téléphone"</string> <string name="icon_badging_title" msgid="874121399231955394">"Pastilles de notification"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Activé"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Désactivé"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string> <string name="widget_resized" msgid="9130327887929620">"Le widget a bien été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)."</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Raccourcis"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> raccourcis pour <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> raccourcis et <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notifications pour <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorer"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Notification ignorée"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personnelles"</string> diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml new file mode 100644 index 000000000..1efa5cead --- /dev/null +++ b/res/values-gl-rES/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Traballo"</string> + <string name="activity_not_found" msgid="8071924732094499514">"A aplicación non está instalada"</string> + <string name="activity_not_available" msgid="7456344436509528827">"A aplicación non está dispoñible"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"A aplicación que descargaches está desactivada no modo seguro"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Os widgets están desactivados no modo seguro"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"O atallo non está dispoñible"</string> + <string name="home_screen" msgid="806512411299847073">"Pantalla de inicio"</string> + <string name="custom_actions" msgid="3747508247759093328">"Accións personalizadas"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Mantén premido un widget para seleccionalo."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d de largo por %2$d de alto"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Mantén premido o elemento para colocalo manualmente"</string> + <string name="place_automatically" msgid="8064208734425456485">"Engadir automaticamente"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Buscar aplicacións"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Cargando aplicacións…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"Non se atoparon aplicacións que coincidan con \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Buscar máis aplicacións"</string> + <string name="notifications_header" msgid="1404149926117359025">"Notificacións"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Mantén premido un atallo para seleccionalo."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Toca dúas veces e mantén premido para seleccionar un atallo ou utiliza accións personalizadas."</string> + <string name="out_of_space" msgid="4691004494942118364">"Non hai máis espazo nesta pantalla de inicio."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Non hai máis espazo na bandexa de favoritos"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Lista de aplicacións"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Lista de aplicacións persoais"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Lista de aplicacións de traballo"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Inicio"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Eliminar"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Desinstalar"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Info. da aplicación"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Instalar"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"instalar atallos"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite a unha aplicación engadir atallos sen intervención do usuario."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"ler a configuración e os atallos da pantalla de inicio"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Permite a unha aplicación ler a configuración e os atallos da páxina de inicio."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"modificar a configuración e os atallos da pantalla de inicio"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Permite a unha aplicación cambiar a configuración e os atallos da pantalla de inicio."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> non ten permiso para facer chamadas telefónicas"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Produciuse un problema ao cargar o widget"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Configuración"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Esta aplicación é do sistema e non se pode desinstalar."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Cartafol sen nome"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"Desactivouse <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, ten <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> notificacións</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>, ten <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> notificación</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"Páxina %1$d de %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Pantalla de inicio %1$d de %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Nova páxina da pantalla de inicio"</string> + <string name="folder_opened" msgid="94695026776264709">"Abriuse o cartafol, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Toca fóra para pechar o cartafol"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Toca fóra para cambiar o nome do cartafol"</string> + <string name="folder_closed" msgid="4100806530910930934">"Pechouse o cartafol"</string> + <string name="folder_renamed" msgid="1794088362165669656">"O cartafol cambiou o nome a <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Cartafol: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Fondos de pantalla"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Configuración da pantalla de Inicio"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Función desactivada polo administrador"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Permitir xirar a pantalla de inicio"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Ao xirar o teléfono"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Puntos de notificacións"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Activado"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Desactivado"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Necesítase acceso ás notificacións"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Para que se mostren os puntos de notificacións, activa as notificacións da aplicación <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Cambiar configuración"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Mostrar puntos de notificación"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Engadir icona á pantalla de inicio"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Para novas aplicacións"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Cambiar forma das iconas"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"na pantalla de inicio"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Usar valores predeterminados do sistema"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Cadrado"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Cadrado de bordos redondeados"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Círculo"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Bágoa"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Aplicando cambios na forma das iconas"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Descoñecido"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Eliminar"</string> + <string name="abandoned_search" msgid="891119232568284442">"Buscar"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Esta aplicación non está instalada"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"A aplicación para esta icona non está instalada. Podes eliminala ou buscar a aplicación e instalala manualmente."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"Descargando <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="PROGRESS">%2$s</xliff:g> completado)"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"Esperando para instalar <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Widgets de: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Engadir á pantalla de inicio"</string> + <string name="action_move_here" msgid="2170188780612570250">"Mover elemento aquí"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Engadiuse o elemento á pantalla de inicio"</string> + <string name="item_removed" msgid="851119963877842327">"Eliminouse o elemento"</string> + <string name="action_move" msgid="4339390619886385032">"Mover elemento"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Mover á fila <xliff:g id="NUMBER_0">%1$s</xliff:g> columna <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"Mover á posición <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Mover á posición dos favoritos <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="item_moved" msgid="4606538322571412879">"Moveuse o elemento"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Engadir ao cartafol: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"Engadir ao cartafol con <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Engadiuse o elemento ao cartafol"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Crear cartafol con: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Creouse o cartafol"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Mover á pantalla de inicio"</string> + <string name="action_resize" msgid="1802976324781771067">"Cambiar tamaño"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Aumentar ancho"</string> + <string name="action_increase_height" msgid="459390020612501122">"Aumentar altura"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Reducir ancho"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string> + <string name="widget_resized" msgid="9130327887929620">"Cambiouse o tamaño do widget polo ancho <xliff:g id="NUMBER_0">%1$s</xliff:g> e a altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Atallos"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> atallos para <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> atallos e <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notificacións para a aplicación <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorar"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Ignorouse a notificación"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoal"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Traballo"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de traballo"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Buscar aplicacións do traballo aquí"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"As aplicacións do traballo teñen unha insignia e están protexidas pola túa organización. Traslada as aplicacións á pantalla de inicio para acceder a elas de forma máis fácil."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Perfil xestionado pola túa organización"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"As notificacións e as aplicacións están desactivadas"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Pechar"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Pechada"</string> +</resources> diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 0cfdfa899..4dd7ae71b 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Cartafol: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Fondos de pantalla"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Configuración de inicio"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Configuración da pantalla de Inicio"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Función desactivada polo administrador"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Permitir xirar a pantalla de inicio"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Ao xirar o teléfono"</string> <string name="icon_badging_title" msgid="874121399231955394">"Puntos de notificacións"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Activado"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Desactivado"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string> <string name="widget_resized" msgid="9130327887929620">"Cambiouse o tamaño do widget polo ancho <xliff:g id="NUMBER_0">%1$s</xliff:g> e a altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Atallos"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> atallos para <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> atallos e <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notificacións para a aplicación <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorar"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Ignorouse a notificación"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoal"</string> diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml new file mode 100644 index 000000000..234fadafc --- /dev/null +++ b/res/values-gu-rIN/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"કાર્યાલય"</string> + <string name="activity_not_found" msgid="8071924732094499514">"ઍપ્લિકેશન ઇન્સ્ટોલ થઈ નથી."</string> + <string name="activity_not_available" msgid="7456344436509528827">"ઍપ્લિકેશન ઉપલબ્ધ નથી"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"સુરક્ષિત મોડમાં ડાઉનલોડ કરેલ ઍપ્લિકેશન અક્ષમ કરી"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"સુરક્ષિત મોડમાં વિજેટ્સ અક્ષમ કર્યા"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"શૉર્ટકટ ઉપલબ્ધ નથી"</string> + <string name="home_screen" msgid="806512411299847073">"હોમ સ્ક્રીન"</string> + <string name="custom_actions" msgid="3747508247759093328">"કસ્ટમ ક્રિયાઓ"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"વિજેટ ચૂંટવા માટે સ્પર્શ કરો અને પકડી રાખો."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d પહોળાઈ X %2$d ઊંચાઈ"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"મેન્યુઅલી મૂકવા માટે ટચ કરી દબાવી રાખો"</string> + <string name="place_automatically" msgid="8064208734425456485">"આપમેળે ઉમેરો"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"શોધ ઍપ્લિકેશનો"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"ઍપ્લિકેશનો લોડ કરી રહ્યું છે…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"વધુ ઍપ્લિકેશનો શોધો"</string> + <string name="notifications_header" msgid="1404149926117359025">"નોટિફિકેશનો"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"એક શૉર્ટકટ ચૂંટવા માટે સ્પર્શ કરી રાખો."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"એક શૉર્ટકટ ચૂંટવા અથવા કોઈ કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટૅપ કરીને દબાવી રાખો."</string> + <string name="out_of_space" msgid="4691004494942118364">"આ હોમ સ્ક્રીન પર વધુ જગ્યા નથી."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"મનપસંદ ટ્રે પર વધુ જગ્યા નથી"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"ઍપ્લિકેશનોની સૂચિ"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"વ્યક્તિગત ઍપની સૂચિ"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"કાર્યસ્થળની ઍપની સૂચિ"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"હોમ"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"દૂર કરો"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"અનઇન્સ્ટોલ કરો"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"ઍપ્લિકેશન માહિતી"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ઇન્સ્ટૉલ કરો"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"શોર્ટકટ્સ ઇન્સ્ટોલ કરો"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"એપ્લિકેશનને વપરાશકર્તા હસ્તક્ષેપ વગર શોર્ટકટ્સ ઉમેરવાની મંજૂરી આપે છે."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"હોમ સેટિંગ્સ અને શોર્ટકટ્સ વાંચો"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"એપ્લિકેશનને હોમમાં સેટિંગ્સ અને શોર્ટકટ્સ વાંચવાની મંજૂરી આપે છે."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"હોમ સેટિંગ્સ અને શોર્ટકટ્સ લખો"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"એપ્લિકેશનને હોમમાં સેટિંગ્સ અને શોર્ટકટ્સ બદલવાની મંજૂરી આપે છે."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> ને ફોન કૉલ્સ કરવાની મંજૂરી નથી"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"વિજેટ લોડ કરવામાં સમસ્યા"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"સેટઅપ"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"આ એક સિસ્ટમ ઍપ્લિકેશન છે અને અનઇન્સ્ટોલ કરી શકાતી નથી."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"અનામી ફોલ્ડર"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> અક્ષમ કરી"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g>ના <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> નોટિફિકેશન છે</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>ના <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> નોટિફિકેશન છે</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%2$d માંથી %1$d પૃષ્ઠ"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d માંથી %1$d હોમ સ્ક્રીન"</string> + <string name="workspace_new_page" msgid="257366611030256142">"નવું હોમ સ્ક્રીન પૃષ્ઠ"</string> + <string name="folder_opened" msgid="94695026776264709">"<xliff:g id="WIDTH">%1$d</xliff:g> બાય <xliff:g id="HEIGHT">%2$d</xliff:g> નું ફોલ્ડર ખોલ્યું"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ફોલ્ડર બંધ કરવા માટે ટૅપ કરો"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"નામ બદલવાનું સાચવવા માટે ટૅપ કરો"</string> + <string name="folder_closed" msgid="4100806530910930934">"ફોલ્ડર બંધ કર્યું"</string> + <string name="folder_renamed" msgid="1794088362165669656">"ફોલ્ડરનું નામ બદલીને <xliff:g id="NAME">%1$s</xliff:g> કર્યું"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ફોલ્ડર: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"વિજેટ્સ"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"વૉલપેપર્સ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"જ્યારે ફોન ફેરવવામાં આવે ત્યારે"</string> + <string name="icon_badging_title" msgid="874121399231955394">"સૂચના બિંદુઓ"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ચાલુ"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"બંધ"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"નોટિફિકેશનનો ઍક્સેસની જરૂરી છે"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"નોટિફિકેશન માટેનું ચિહ્ન બતાવવા હેતુ, <xliff:g id="NAME">%1$s</xliff:g> માટેની ઍપ્લિકેશન નોટિફિકેશન ચાલુ કરો"</string> + <string name="title_change_settings" msgid="1376365968844349552">"સેટિંગ્સ બદલો"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"નોટિફિકેશન માટેનું ચિહ્ન બતાવો"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"હોમ સ્ક્રીન પર આઇકન ઉમેરો"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"નવી ઍપ્લિકેશનો માટે"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"આઇકનનો આકાર બદલો"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"હોમ સ્ક્રીન પર"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"સિસ્ટમ ડિફૉલ્ટનો ઉપયોગ કરો"</string> + <string name="icon_shape_square" msgid="633575066111622774">"ચોરસ"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"ચોરસ જેવું ગોળ"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"વર્તુળ"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"ટિઅરડ્રોપ"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"આઇકનના આકારમાં કરેલ ફેરફારો લાગુ કરી રહ્યા છીએ"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"અજાણ્યો"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"દૂર કરો"</string> + <string name="abandoned_search" msgid="891119232568284442">"શોધો"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"આ ઍપ્લિકેશન ઇન્સ્ટોલ થયેલ નથી"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"આ આયકન માટેની ઍપ્લિકેશન ઇન્સ્ટોલ થયેલ નથી. તમે તેને દૂર કરી શકો છો અથવા ઍપ્લિકેશન માટે શોધ કરી અને તેને મેન્યુઅલી ઇન્સ્ટોલ કરી શકો છો."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ડાઉનલોડ કરી રહ્યાં છે, <xliff:g id="PROGRESS">%2$s</xliff:g> પૂર્ણ"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g>, ઇન્સ્ટૉલ થવાની રાહ જોઈ રહ્યું છે"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> વિજેટ"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"હોમ સ્ક્રીન પર ઉમેરો"</string> + <string name="action_move_here" msgid="2170188780612570250">"આઇટમ અહીં ખસેડો"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"હોમ સ્ક્રીનમાં આઇટમ ઉમેરી"</string> + <string name="item_removed" msgid="851119963877842327">"આઇટમ દૂર કરી"</string> + <string name="action_move" msgid="4339390619886385032">"આઇટમ ખસેડો"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"<xliff:g id="NUMBER_0">%1$s</xliff:g> પંક્તિ <xliff:g id="NUMBER_1">%2$s</xliff:g> કૉલમ પર ખસેડો"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g> સ્થિતિ પર ખસેડો"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"મનપસંદ સ્થિતિ <xliff:g id="NUMBER">%1$s</xliff:g> પર ખસેડો"</string> + <string name="item_moved" msgid="4606538322571412879">"આઇટમ ખસેડી"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ફોલ્ડરમાં ઉમેરો: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> સાથે ફોલ્ડરમાં ઉમેરો"</string> + <string name="added_to_folder" msgid="4793259502305558003">"ફોલ્ડરમાં આઇટમ ઉમેરી"</string> + <string name="create_folder_with" msgid="4050141361160214248">"આની સાથે ફોલ્ડર બનાવો: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"ફોલ્ડર બનાવ્યું"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"હોમ સ્ક્રીન પર ખસેડો"</string> + <string name="action_resize" msgid="1802976324781771067">"આકાર બદલો"</string> + <string name="action_increase_width" msgid="8773715375078513326">"પહોળાઈ વધારો"</string> + <string name="action_increase_height" msgid="459390020612501122">"ઊંચાઈ વધારો"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"પહોળાઈ ઘટાડો"</string> + <string name="action_decrease_height" msgid="282377193880900022">"ઊંચાઈ ઘટાડો"</string> + <string name="widget_resized" msgid="9130327887929620">"વિજેટનો આકાર બદલીને <xliff:g id="NUMBER_0">%1$s</xliff:g> પહોળાઈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ઊંચાઈ કર્યો"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"શૉર્ટકટ્સ"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> માટે <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> શૉર્ટકટ"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> માટે <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> શૉર્ટકટ અને <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> સૂચનાઓ"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"છોડી દો"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"સૂચના છોડી દીધી"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"મનગમતી ઍપ"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"કાર્યાલયની ઍપ"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"કાર્યાલયની પ્રોફાઇલ"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"કાર્ય ઍપને અહીંથી મેળવો"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"દરેક કાર્ય ઍપ પાસે એક બૅજ હોય છે અને તમારી સંસ્થા દ્વારા તેને સુરક્ષિત રાખવામાં આવે છે. વધુ સરળ ઍક્સેસ માટે ઍપને તમારી હોમ સ્ક્રીન પર ખસેડો."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"તમારી સંસ્થા દ્વારા મેનેજ કરેલ"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"નોટિફિકેશન અને ઍપ બંધ છે"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"બંધ કરો"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"બંધ"</string> +</resources> diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index efc953c80..aa0b3af1f 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"વૉલપેપર્સ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"જ્યારે ફોન ફેરવવામાં આવે ત્યારે"</string> <string name="icon_badging_title" msgid="874121399231955394">"સૂચના બિંદુઓ"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ચાલુ"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"બંધ"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"ઊંચાઈ ઘટાડો"</string> <string name="widget_resized" msgid="9130327887929620">"વિજેટનો આકાર બદલીને <xliff:g id="NUMBER_0">%1$s</xliff:g> પહોળાઈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ઊંચાઈ કર્યો"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"શૉર્ટકટ્સ"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> માટે <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> શૉર્ટકટ"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> માટે <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> શૉર્ટકટ અને <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> સૂચનાઓ"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"છોડી દો"</string> <string name="notification_dismissed" msgid="6002233469409822874">"સૂચના છોડી દીધી"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"મનગમતી ઍપ"</string> diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index f98859df8..1b47fcbbe 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"वॉलपेपर"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"फ़ोन घुुमाए जाने पर"</string> <string name="icon_badging_title" msgid="874121399231955394">"सूचना बिंदु"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"चालू"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"बंद"</string> @@ -89,7 +91,7 @@ <string name="title_change_settings" msgid="1376365968844349552">"सेटिंग बदलें"</string> <string name="icon_badging_service_title" msgid="2309733118428242174">"नए नोटिफ़िकेशन बताने वाला गोल निशान दिखाएं"</string> <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"होम स्क्रीन में आइकॉन जोड़ें"</string> - <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"नए ऐप के लिए"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"नए ऐप्लिकेशन के लिए"</string> <string name="icon_shape_override_label" msgid="2977264953998281004">"आइकॉन का आकार बदलें"</string> <string name="icon_shape_override_label_location" msgid="3841607380657692863">"होम स्क्रीन पर"</string> <string name="icon_shape_system_default" msgid="1709762974822753030">"सिस्टम डिफ़ॉल्ट का उपयोग करें"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"ऊंचाई घटाएं"</string> <string name="widget_resized" msgid="9130327887929620">"विजेट का आकार बदलकर उसकी चौड़ाई <xliff:g id="NUMBER_0">%1$s</xliff:g> और ऊंचाई <xliff:g id="NUMBER_1">%2$s</xliff:g> कर दी गई"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"शॉर्टकट"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> के लिए <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> शॉर्टकट"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> के लिए <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> शॉर्टकट और <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> सूचनाएं हैं"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"खारिज करें"</string> <string name="notification_dismissed" msgid="6002233469409822874">"सूचना को खारिज किया गया"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"निजी ऐप"</string> diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 35a796393..077da67e2 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -80,8 +80,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Mapa: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Widgeti"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Pozadine"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Postavke Homea"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Postavke početnog zaslona"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogućio administrator"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Dopusti zakretanje početnog zaslona"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon zakrene"</string> <string name="icon_badging_title" msgid="874121399231955394">"Točke obavijesti"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Uključeno"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Isključeno"</string> @@ -129,8 +131,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Smanjenje visine"</string> <string name="widget_resized" msgid="9130327887929620">"Širina widgeta promijenjena je na <xliff:g id="NUMBER_0">%1$s</xliff:g>, a visina na <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Prečaci"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Prečaca za aplikaciju <xliff:g id="APP_NAME">%2$s</xliff:g>: <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Za aplikaciju <xliff:g id="APP_NAME">%3$s</xliff:g> ima prečaca (ukupno <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) i obavijesti (ukupno <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>)"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Obavijest je odbačena"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobno"</string> diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 4972e8192..797bde44a 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Mappa: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Modulok"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Háttérképek"</string> - <string name="settings_button_text" msgid="8873672322605444408">"A Home beállításai"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Kezdőoldal beállításai"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"A rendszergazda letiltotta"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"A kezdőképernyő elforgatásának engedélyezése"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"A telefon elforgatásakor"</string> <string name="icon_badging_title" msgid="874121399231955394">"Értesítési pöttyök"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Bekapcsolva"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Kikapcsolva"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Magasság csökkentése"</string> <string name="widget_resized" msgid="9130327887929620">"Modul átméretezve <xliff:g id="NUMBER_0">%1$s</xliff:g> szélességre és <xliff:g id="NUMBER_1">%2$s</xliff:g> magasságra"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Gyorsparancsok"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> gyorsparancs a(z) <xliff:g id="APP_NAME">%2$s</xliff:g> számára"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> parancsikon és <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> értesítés a következő alkalmazásnál: <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Elvetés"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Értesítés elvetve"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Személyes"</string> diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml new file mode 100644 index 000000000..6844a2757 --- /dev/null +++ b/res/values-hy-rAM/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Աշխատանքային"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Ծրագիրը տեղադրված չէ:"</string> + <string name="activity_not_available" msgid="7456344436509528827">"Հավելվածը հասանելի չէ"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Ներբեռնված ծրագիրն անջատված է Անվտանգ ռեժիմում"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Վիջեթներն անջատված են անվտանգ ռեժիմում"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Դյուրանցումն անհասանելի է"</string> + <string name="home_screen" msgid="806512411299847073">"Հիմնական էկրան"</string> + <string name="custom_actions" msgid="3747508247759093328">"Հատուկ գործողություններ"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Հպեք և պահեք՝ վիջեթն ընտրելու համար:"</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"Լայնությունը՝ %1$d, բարձրությունը՝ %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Հպեք և պահեք՝ ձեռքով տեղադրելու համար"</string> + <string name="place_automatically" msgid="8064208734425456485">"Ավելացնել ավտոմատ կերպով"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Որոնել հավելվածներ"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Հավելվածների բեռնում…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"«<xliff:g id="QUERY">%1$s</xliff:g>» հարցմանը համապատասխանող հավելվածներ չեն գտնվել"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Որոնել այլ հավելվածներ"</string> + <string name="notifications_header" msgid="1404149926117359025">"Ծանուցումներ"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար։"</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար կամ օգտվեք հարմարեցրած գործողություններից:"</string> + <string name="out_of_space" msgid="4691004494942118364">"Այլևս տեղ չկա այս հիմնական էկրանին:"</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Ընտրյալների ցուցակում այլևս ազատ տեղ չկա"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Հավելվածների ցանկ"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Անձնական հավելվածների ցանկ"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Աշխատանքային հավելվածների ցանկ"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Հիմնական"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Հեռացնել"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Հեռացնել"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Հավելվածի տվյալներ"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Տեղադրել"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"տեղադրել դյուրանցումներ"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Ծրագրին թույլ է տալիս ավելացնել դյուրանցումներ՝ առանց օգտագործողի միջամտության:"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"կարդալ հիմնաէջի կարգավորումներն ու դյուրանցումները"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Ծրագրին թույլ է տալիս կարդալ հիմնաէջի կարգավորումներն ու դյուրանցումները:"</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"ստեղծել հիմնաէջի կարգավորումներ ու դյուրանցումներ"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Ծրագրին թույլ է տալիս փոփոխել հիմնաէջի կարգավորումներն ու դյուրանցումները:"</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածին չի թույլատրվում հեռախոսազանգեր կատարել"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Վիջեթի բեռնման խնդիր կա"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Կարգավորում"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Սա համակարգային ծրագիր է և չի կարող ապատեղադրվել:"</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Անանուն պանակ"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն անջատված է"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, ունի <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> ծանուցում</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, ունի <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> ծանուցում</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"Էջ %1$d՝ %2$d-ից"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Հիմնական էկրան %1$d` %2$d-ից"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Հիմնական էկրանի նոր էջ"</string> + <string name="folder_opened" msgid="94695026776264709">"Պանակը բաց է, <xliff:g id="WIDTH">%1$d</xliff:g>-ից <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Հպեք՝ պանակը փակելու համար"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Հպեք՝ նոր անվանումը պահելու համար"</string> + <string name="folder_closed" msgid="4100806530910930934">"Պանակը փակ է"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Պանակը վերանվանվեց <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Պանակ՝ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Վիջեթներ"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Պաստառներ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Հեռախոսը պտտելու դեպքում"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Ծանուցումների կետիկներ"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Միացված է"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Անջատված է"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Անհրաժեշտ է ծանուցման թույլտվություն"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Ծանուցումների կետիկները ցուցադրելու համար միացրեք ծանուցումները <xliff:g id="NAME">%1$s</xliff:g>-ի համար"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Փոխել կարգավորումները"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Ցուցադրել ծանուցումների կետիկները"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Ավելացնել պատկերակը Հիմնական էկրանին"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Նոր հավելվածների համար"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Փոխել պատկերակների տեսքը"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"հիմնական էկրանին"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Օգտագործել համակարգի կանխադրված կարգավորումը"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Քառակուսի"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Քառանկյուն"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Օղակ"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Արցունքաձև"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Պատկերակների տեսքի փոփոխությունները կիրառվում են"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Անհայտ է"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Հեռացնել"</string> + <string name="abandoned_search" msgid="891119232568284442">"Գտնել"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Այս ծրագիրը տեղադրված չէ:"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Այս պատկերակի ծրագիրը տեղադրված չէ: Դուք կարող եք հեռացնել այն կամ գտնել ծրագիրը և տեղադրել այն ձեռքով:"</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g>–ի ներբեռնում (<xliff:g id="PROGRESS">%2$s</xliff:g>)"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g>-ի տեղադրման սպասում"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> վիջեթներ"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Ավելացնել Հիմնական էկրանին"</string> + <string name="action_move_here" msgid="2170188780612570250">"Տեղափոխել տարրն այստեղ"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Տարրն ավելացվեց հիմնական էկրանին"</string> + <string name="item_removed" msgid="851119963877842327">"Տարրը հեռացվեց"</string> + <string name="action_move" msgid="4339390619886385032">"Տեղափոխել տարրը"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Տեղափոխել տող <xliff:g id="NUMBER_0">%1$s</xliff:g> սյունակ <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"Տեղափոխել դիրք <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Տեղափոխել նախընտրած դիրք՝ <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="item_moved" msgid="4606538322571412879">"Տարրը տեղափոխվեց"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Ավելացնել թղթապանակում՝ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"Ավելացնել «<xliff:g id="NAME">%1$s</xliff:g>» պանակին"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Տարրն ավելացվեց թղթապանակում"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Ստեղծել թղթապանակ, օգտագործելով՝ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Պանակը ստեղծվեց"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Տեղափոխել Հիմնական էկրան"</string> + <string name="action_resize" msgid="1802976324781771067">"Չափափոխել"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Ավելացնել լայնությունը"</string> + <string name="action_increase_height" msgid="459390020612501122">"Ավելացնել բարձրությունը"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Նվազեցնել լայնությունը"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Նվազեցնել բարձրությունը"</string> + <string name="widget_resized" msgid="9130327887929620">"Վիջեթի լայնությունը փոխվել է <xliff:g id="NUMBER_0">%1$s</xliff:g>-ի, իսկ բարձրությունը՝ <xliff:g id="NUMBER_1">%2$s</xliff:g>-ի"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Դյուրանցումներ"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> դյուրանցումներ <xliff:g id="APP_NAME">%2$s</xliff:g> հավելվածի համար"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> դյուրացում և <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ծանուցում <xliff:g id="APP_NAME">%3$s</xliff:g>-ի համար"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Անտեսել"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Ծանուցումը մերժված է"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Անձնական"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Աշխատանքային"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Աշխատանքային պրոֆիլ"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Գտեք աշխատանքային հավելվածներ այստեղ"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Աշխատանքային հավելվածները նշված են հատուկ նշանով: Նման հավելվածների անվտանգությունը ապահովում է ձեր կազմակերպությունը։ Հարմարության համար աշխատանքային հավելվածները կարող եք տեղափոխել հիմնական էկրան։"</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Կառավարվում է ձեր կազմակերպության կողմից"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Ծանուցումներն ու հավելվածներն անջատված են"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Փակել"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Փակվեց"</string> +</resources> diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 8c3ae2591..79210f3a7 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Պաստառներ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Հեռախոսը պտտելու դեպքում"</string> <string name="icon_badging_title" msgid="874121399231955394">"Ծանուցումների կետիկներ"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Միացված է"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Անջատված է"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Նվազեցնել բարձրությունը"</string> <string name="widget_resized" msgid="9130327887929620">"Վիջեթի լայնությունը փոխվել է <xliff:g id="NUMBER_0">%1$s</xliff:g>-ի, իսկ բարձրությունը՝ <xliff:g id="NUMBER_1">%2$s</xliff:g>-ի"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Դյուրանցումներ"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> դյուրանցումներ <xliff:g id="APP_NAME">%2$s</xliff:g> հավելվածի համար"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> դյուրացում և <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ծանուցում <xliff:g id="APP_NAME">%3$s</xliff:g>-ի համար"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Անտեսել"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Ծանուցումը մերժված է"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Անձնական"</string> diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index ea0ea4af1..6e8f46a2c 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -30,7 +30,7 @@ <string name="home_screen" msgid="806512411299847073">"Layar utama"</string> <string name="custom_actions" msgid="3747508247759093328">"Tindakan khusus"</string> <string name="long_press_widget_to_add" msgid="7699152356777458215">"Sentuh lama untuk memilih widget."</string> - <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Tap dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus."</string> <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> <string name="widget_accessible_dims_format" msgid="3640149169885301790">"lebar %1$d x tinggi %2$d"</string> <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Sentuh & tahan untuk menempatkan secara manual"</string> @@ -72,8 +72,8 @@ <string name="workspace_scroll_format" msgid="8458889198184077399">"Layar utama %1$d dari %2$d"</string> <string name="workspace_new_page" msgid="257366611030256142">"Halaman layar utama baru"</string> <string name="folder_opened" msgid="94695026776264709">"Folder dibuka, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> - <string name="folder_tap_to_close" msgid="4625795376335528256">"Ketuk untuk menutup folder"</string> - <string name="folder_tap_to_rename" msgid="4017685068016979677">"Ketuk untuk menyimpan ganti nama"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Tap untuk menutup folder"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Tap untuk menyimpan ganti nama"</string> <string name="folder_closed" msgid="4100806530910930934">"Folder ditutup"</string> <string name="folder_renamed" msgid="1794088362165669656">"Folder diganti namanya menjadi <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="folder_name_format" msgid="6629239338071103179">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string> @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Wallpaper"</string> <string name="settings_button_text" msgid="8873672322605444408">"Setelan layar Utama"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dinonaktifkan oleh admin"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Izinkan layar Utama diputar"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Saat ponsel diputar"</string> <string name="icon_badging_title" msgid="874121399231955394">"Titik notifikasi"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Aktif"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Nonaktif"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Kurangi tinggi"</string> <string name="widget_resized" msgid="9130327887929620">"Widget diubah ukurannya menjadi lebar <xliff:g id="NUMBER_0">%1$s</xliff:g> tinggi <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Pintasan"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> pintasan untuk <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> pintasan dan <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notifikasi untuk <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Tutup"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Notifikasi ditutup"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Pribadi"</string> diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml new file mode 100644 index 000000000..3b5dabacc --- /dev/null +++ b/res/values-is-rIS/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Vinna"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Forritið er ekki uppsett."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Forritið er ekki í boði"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Sótt forrit er óvirkt í öryggisstillingu"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Græjur eru óvirkar í öruggri stillingu"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Flýtileið er ekki tiltæk"</string> + <string name="home_screen" msgid="806512411299847073">"Heimaskjár"</string> + <string name="custom_actions" msgid="3747508247759093328">"Sérsniðnar aðgerðir"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Haltu fingri á græju til að grípa hana."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d á breidd og %2$d á hæð"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Haltu inni til að staðsetja handvirkt"</string> + <string name="place_automatically" msgid="8064208734425456485">"Bæta sjálfkrafa við"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Leita í forritum"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Hleður forrit…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"Ekki fundust forrit sem samsvara „<xliff:g id="QUERY">%1$s</xliff:g>“"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Leita að fleiri forritum"</string> + <string name="notifications_header" msgid="1404149926117359025">"Tilkynningar"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Haltu fingri á flýtileið til að grípa hana."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Ýttu tvisvar og haltu fingri á flýtileið til að grípa hana eða notaðu sérsniðnar aðgerðir."</string> + <string name="out_of_space" msgid="4691004494942118364">"Ekki meira pláss á þessum heimaskjá."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Ekki meira pláss í bakka fyrir uppáhald"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Forritalisti"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Listi yfir eigin forrit"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Listi yfir vinnuforrit"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Heim"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Fjarlægja"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Fjarlægja"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Forritsupplýsingar"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Setja upp"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"setja upp flýtileiðir"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Leyfir forriti að bæta við flýtileiðum án íhlutunar notanda."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"lesa stillingar og flýtileiðir heimaskjás"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Leyfir forriti að lesa stillingar og flýtileiðir heimaskjás."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"skrifa stillingar og flýtileiðir heimaskjás"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Leyfir forriti að breyta stillingum og flýtileiðum heimaskjás."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> hefur ekki leyfi til að hringja símtöl"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Vandamál við að hlaða græju"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Uppsetning"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Þetta er kerfisforrit sem ekki er hægt að fjarlægja."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Ónefnd mappa"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"Óvirkt <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, er með <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> tilkynningu</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, er með <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> tilkynningar</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"Síða %1$d af %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Heimaskjár %1$d af %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Ný síða á heimaskjá"</string> + <string name="folder_opened" msgid="94695026776264709">"Mappa opnuð, <xliff:g id="WIDTH">%1$d</xliff:g> sinnum <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Ýttu til að loka möppunni"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Ýttu til að vista breytt heiti"</string> + <string name="folder_closed" msgid="4100806530910930934">"Möppu lokað"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Heiti möppu breytt í <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Mappa: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Græjur"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Veggfóður"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Heimastillingar"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Gert óvirkt af kerfisstjóra"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Leyfa snúning fyrir heimaskjá"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Þegar símanum er snúið"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Tilkynningapunktar"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Kveikt"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Slökkt"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Aðgangs að tilkynningum er krafist"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Til að sýna tilkynningarpunkta skaltu kveikja á forritstilkynningum fyrir <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Breyta stillingum"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Sýna tilkynningapunkta"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Bæta tákni á heimaskjáinn"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Fyrir ný forrit"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Breyta formi tákns"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"á heimaskjá"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Nota sjálfgildi kerfis"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Ferningur"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Ferhringur"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Hringur"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Dropi"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Breytir formi tákns"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Óþekkt"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Fjarlægja"</string> + <string name="abandoned_search" msgid="891119232568284442">"Leita"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Þetta forrit er ekki uppsett"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Forritið fyrir þetta tákn er ekki uppsett. Þú getur fjarlægt það eða leitað að forritinu og sett það upp handvirkt."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> í niðurhali, <xliff:g id="PROGRESS">%2$s</xliff:g> lokið"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> bíður uppsetningar"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g>-græjur"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Bæta á heimaskjá"</string> + <string name="action_move_here" msgid="2170188780612570250">"Færa atriði hingað"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Atriði bætt á heimaskjáinn"</string> + <string name="item_removed" msgid="851119963877842327">"Atriði fjarlægt"</string> + <string name="action_move" msgid="4339390619886385032">"Færa atriði"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Færa í línu <xliff:g id="NUMBER_0">%1$s</xliff:g>, dálk <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"Færa í stöðu <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Færa í stöðu <xliff:g id="NUMBER">%1$s</xliff:g> á festisvæði"</string> + <string name="item_moved" msgid="4606538322571412879">"Atriði fært"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Setja í möppu: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"Setja í möppu með <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Atriði sett í möppu"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Búa til möppu með: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Mappa búin til"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Færa á heimaskjá"</string> + <string name="action_resize" msgid="1802976324781771067">"Breyta stærð"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Auka breidd"</string> + <string name="action_increase_height" msgid="459390020612501122">"Auka hæð"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Minnka breidd"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Minnka hæð"</string> + <string name="widget_resized" msgid="9130327887929620">"Stærð græju breytt í <xliff:g id="NUMBER_0">%1$s</xliff:g> á breidd og <xliff:g id="NUMBER_1">%2$s</xliff:g> á hæð"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Flýtileiðir"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> flýtileiðir fyrir <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> flýtileiðir og <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> tilkynningar fyrir <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Hunsa"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Tilkynningu lokað"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Persónulegt"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Vinna"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Vinnusnið"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Hér finnurðu vinnuforrit"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Öll vinnuforrit eru með merki og fyrirtækið þitt tryggir öryggi þeirra. Færðu forrit yfir á heimaskjáinn til að fá auðveldari aðgang að þeim."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Stjórnað af fyrirtækinu þínu"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Slökkt er á tilkynningum og forritum"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Loka"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Lokað"</string> +</resources> diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 3dc2d2211..49843b668 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Veggfóður"</string> <string name="settings_button_text" msgid="8873672322605444408">"Heimastillingar"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Gert óvirkt af kerfisstjóra"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Leyfa snúning fyrir heimaskjá"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Þegar símanum er snúið"</string> <string name="icon_badging_title" msgid="874121399231955394">"Tilkynningapunktar"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Kveikt"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Slökkt"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Minnka hæð"</string> <string name="widget_resized" msgid="9130327887929620">"Stærð græju breytt í <xliff:g id="NUMBER_0">%1$s</xliff:g> á breidd og <xliff:g id="NUMBER_1">%2$s</xliff:g> á hæð"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Flýtileiðir"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> flýtileiðir fyrir <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> flýtileiðir og <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> tilkynningar fyrir <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Hunsa"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Tilkynningu lokað"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Persónulegt"</string> diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 44e12c0e4..5fc68a51b 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Sfondi"</string> <string name="settings_button_text" msgid="8873672322605444408">"Impostazioni Home"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disattivata dall\'amministratore"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Consenti rotazione della schermata Home"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Con il telefono ruotato"</string> <string name="icon_badging_title" msgid="874121399231955394">"Indicatori notifica"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Attiva"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Non attiva"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Riduci altezza"</string> <string name="widget_resized" msgid="9130327887929620">"Widget ridimensionato a larghezza <xliff:g id="NUMBER_0">%1$s</xliff:g>, altezza <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Scorciatoie"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> scorciatoie per <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> scorciatoie e <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notifiche relative a <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Ignora"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Notifica ignorata"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personali"</string> diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index bc2061ba2..806aeefb5 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -83,6 +83,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"טפטים"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"כאשר הטלפון מסובב"</string> <string name="icon_badging_title" msgid="874121399231955394">"סימני הודעות"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"מופעלת"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"כבויה"</string> @@ -130,8 +132,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"הקטן גובה"</string> <string name="widget_resized" msgid="9130327887929620">"גודל הווידג\'ט שונה - רוחב <xliff:g id="NUMBER_0">%1$s</xliff:g> גובה <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"קיצורי דרך"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> קיצורי דרך עבור <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> קיצורי דרך ו-<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> הודעות של <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"סגור"</string> <string name="notification_dismissed" msgid="6002233469409822874">"ההודעה נסגרה"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"אישיות"</string> diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index c5ab31039..baa59ab94 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"壁紙"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"スマートフォンが回転したとき"</string> <string name="icon_badging_title" msgid="874121399231955394">"通知ドット"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ON"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"OFF"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"高さを低くする"</string> <string name="widget_resized" msgid="9130327887929620">"ウィジェットのサイズを幅<xliff:g id="NUMBER_0">%1$s</xliff:g>、高さ<xliff:g id="NUMBER_1">%2$s</xliff:g>に変更しました"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"ショートカット"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g>用の <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> 件のショートカット"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g>: <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> 個のショートカットと <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> 件の通知"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"表示しない"</string> <string name="notification_dismissed" msgid="6002233469409822874">"通知を非表示にしました"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"個人用"</string> diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml new file mode 100644 index 000000000..521ec80f8 --- /dev/null +++ b/res/values-ka-rGE/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"სამუშაო"</string> + <string name="activity_not_found" msgid="8071924732094499514">"აპი არ არის დაყენებული."</string> + <string name="activity_not_available" msgid="7456344436509528827">"აპი მიუწვდომელია"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"უსაფრთხო რეჟიმში ჩამოტვირთული აპი გაუქმებულია"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"უსაფრთხო რეჟიმში ვიჯეტი გამორთულია"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"მალსახმობი მიუწვდომელია"</string> + <string name="home_screen" msgid="806512411299847073">"მთავარი ეკრანი"</string> + <string name="custom_actions" msgid="3747508247759093328">"მორგებული ქმედებები"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"სიგრძე: %1$d, სიგანე: %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"ხანგრძლივად შეეხეთ ხელით განსათავსებლად"</string> + <string name="place_automatically" msgid="8064208734425456485">"ავტომატურად დამატება"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"აპების ძიება"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"აპები იტვირთება…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"„<xliff:g id="QUERY">%1$s</xliff:g>“-ის თანხვედრი აპები არ მოიძებნა"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"მეტი აპის პოვნა"</string> + <string name="notifications_header" msgid="1404149926117359025">"შეტყობინებები"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"შეეხეთ და დააყოვნეთ მალსახმობის ასარჩევად."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"ორმაგად შეეხეთ და გეჭიროთ მალსახმობის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად."</string> + <string name="out_of_space" msgid="4691004494942118364">"ამ მთავარ ეკრანზე ადგილი აღარ არის."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"რჩეულების თაროზე ადგილი არ არის"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"აპების სია"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"პერსონალური აპების სია"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"სამსახურის აპების სია"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"მთავარი"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"ამოშლა"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"დეინსტალაცია"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"აპის შესახებ"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ინსტალაცია"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"მალსახმობების დაყენება"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"აპისთვის მალსახმობების დამოუკიდებლად დამატების უფლების მიცემა."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"მთავარი ეკრანის პარამეტრებისა და მალსახმობების წაკითხვა"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"აპისთვის მთავარი ეკრანის პარამეტრებისა და მალსახმობების წაკითხვის უფლების მიცემა."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"მთავარი ეკრანის პარამეტრებისა და მალსახმობების ჩაწერა"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"აპისთვის მთავარი ეკრანის პარამეტრებისა და მალსახმობების შეცვლის უფლების მიცემა."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს არ აქვს სატელეფონო ზარების განხორციელების უფლება"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"პრობლემა ვიჯეტის ჩატვირთვისას"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"დაყენება"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"ეს სისტემური აპია და მისი წაშლა შეუძლებელია."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"უსახელო საქაღალდე"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> გაითიშა"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>-ში <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> შეტყობინებაა</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>-ში <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> შეტყობინებაა</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"გვერდი %1$d %2$d-დან"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"მთავარი ეკრანი %1$d, %2$d-დან"</string> + <string name="workspace_new_page" msgid="257366611030256142">"მთავარი ეკრანის ახალი გვერდი"</string> + <string name="folder_opened" msgid="94695026776264709">"საქაღალდე გახსნილია, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"შეეხეთ საქაღალდის დასახურად"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"შეეხეთ გადარქმეული სახელის შესანახად"</string> + <string name="folder_closed" msgid="4100806530910930934">"საქაღალდე დაიხურა"</string> + <string name="folder_renamed" msgid="1794088362165669656">"საქაღალდეს შეეცვალა სახელი „<xliff:g id="NAME">%1$s</xliff:g>“-ად"</string> + <string name="folder_name_format" msgid="6629239338071103179">"საქაღალდე: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"ვიჯეტები"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"ფონები"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ტელეფონის შეტრიალებისას"</string> + <string name="icon_badging_title" msgid="874121399231955394">"შეტყობინების ნიშნულები"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ჩართული"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"გამორთული"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"საჭიროა შეტყობინებებზე წვდომა"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"შეტყობინებათა ნიშნულების საჩვენებლად, ჩართეთ აპის შეტყობინებები <xliff:g id="NAME">%1$s</xliff:g>-ისთვის"</string> + <string name="title_change_settings" msgid="1376365968844349552">"პარამეტრების შეცვლა"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"შეტყობინების ნიშნულების ჩვენება"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"ხატულას მთავარ ეკრანზე დამატება"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"ახალი აპებისთვის"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"ხატულას ფორმის შეცვლა"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"მთავარ ეკრანზე"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"ნაგულისხმევი სისტემური პარამეტრების გამოყენება"</string> + <string name="icon_shape_square" msgid="633575066111622774">"კვადრატი"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"წრეკუთხედი"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"წრე"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"წვეთი"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"მიმდინარეობს ხატულას ფორმის ცვლილებების მიყენება"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"უცნობი"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"ამოშლა"</string> + <string name="abandoned_search" msgid="891119232568284442">"ძიება"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"ეს აპი დაყენებული არ არის"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ამ ხატულის აპი დაყენებული არ არის. შეგიძლიათ ამოშალოთ, ან მოიძიოთ აპი და ხელით მოახდინოთ მისი ინსტალაცია."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"მიმდინარეობს <xliff:g id="NAME">%1$s</xliff:g>-ის ჩამოტვირთვა, <xliff:g id="PROGRESS">%2$s</xliff:g> დასრულდა"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ელოდება ინსტალაციას"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g>-ის ვიჯეტები"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"მთავარ ეკრანზე დამატება"</string> + <string name="action_move_here" msgid="2170188780612570250">"ერთეულის გადაადგილება აქ"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"ერთეული დაემატა მთავარ ეკრანს"</string> + <string name="item_removed" msgid="851119963877842327">"ერთეული წაიშალა"</string> + <string name="action_move" msgid="4339390619886385032">"ერთეულის გადაადგილება"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"გადატანა რიგში <xliff:g id="NUMBER_0">%1$s</xliff:g> სვეტში <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"გადატანა <xliff:g id="NUMBER">%1$s</xliff:g> პოზიციაზე"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"გადატანა რჩეულთა პოზიციაზე <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="item_moved" msgid="4606538322571412879">"ერთეული გადაადგილდა"</string> + <string name="add_to_folder" msgid="9040534766770853243">"საქაღალდეში დამატება: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"საქაღალდეში დამატება <xliff:g id="NAME">%1$s</xliff:g>-ით"</string> + <string name="added_to_folder" msgid="4793259502305558003">"ერთეული დაემატა საქაღალდეს"</string> + <string name="create_folder_with" msgid="4050141361160214248">"საქაღალდის შექმნა ერთეულით: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"საქაღალდე შექმნილია"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"მთავარ ეკრანზე გადატანა"</string> + <string name="action_resize" msgid="1802976324781771067">"ზომის შეცვლა"</string> + <string name="action_increase_width" msgid="8773715375078513326">"სიგანის გაზრდა"</string> + <string name="action_increase_height" msgid="459390020612501122">"სიმაღლის გაზრდა"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"სიგანის შემცირება"</string> + <string name="action_decrease_height" msgid="282377193880900022">"სიმაღლის შემცირება"</string> + <string name="widget_resized" msgid="9130327887929620">"ვიჯეტის ზომები შეიცვალა: სიგანე <xliff:g id="NUMBER_0">%1$s</xliff:g> სიმაღლე <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"მალსახმობები"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g>-ს აქვს <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> მალსახმობი"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g>-ის <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> მალსახმობი და <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> შეტყობინება"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"დახურვა"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"შეტყობინება დაიხურა"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"პირადი"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"სამსახური"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"სამსახურის პროფილი"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"აქ თავმოყრილია სამსახურის აპები"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"სამსახურის თითოეულ აპს აქვს ბეჯი, რაც ნიშნავს, რომ მათ უსაფრთხოებას თქვენი ორგანიზაცია უზრუნველყოფს. მარტივი წვდომისთვის, შეგიძლიათ სამსახურის აპები მთავარი ეკრანზე გადაიტანოთ."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"იმართება თქვენი ორგანიზაციის მიერ"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"შეტყობინებები და აპები გამორთულია"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"დახურვა"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"დახურული"</string> +</resources> diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 02ca8628e..64c8573e1 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"ფონები"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ტელეფონის შეტრიალებისას"</string> <string name="icon_badging_title" msgid="874121399231955394">"შეტყობინების ნიშნულები"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ჩართული"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"გამორთული"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"სიმაღლის შემცირება"</string> <string name="widget_resized" msgid="9130327887929620">"ვიჯეტის ზომები შეიცვალა: სიგანე <xliff:g id="NUMBER_0">%1$s</xliff:g> სიმაღლე <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"მალსახმობები"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g>-ს აქვს <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> მალსახმობი"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g>-ის <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> მალსახმობი და <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> შეტყობინება"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"დახურვა"</string> <string name="notification_dismissed" msgid="6002233469409822874">"შეტყობინება დაიხურა"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"პირადი"</string> diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml new file mode 100644 index 000000000..7ab73d95d --- /dev/null +++ b/res/values-kk-rKZ/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Жұмыс"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Қолданба орнатылмаған."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Қолданба қол жетімді емес"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Жүктелген қолданба қауіпсіз режимде өшірілген"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Қауіпсіз режимде виджеттер өшіріледі"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Таңбаша қолжетімді емес"</string> + <string name="home_screen" msgid="806512411299847073">"Негізгі экран"</string> + <string name="custom_actions" msgid="3747508247759093328">"Арнаулы әрекеттер"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Виджетті таңдау үшін түртіп, мықтап ұстаңыз."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"Ені: %1$d, биіктігі: %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Қолмен қою үшін басып тұрыңыз"</string> + <string name="place_automatically" msgid="8064208734425456485">"Автоматты енгізу"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Қолданбаларды іздеу"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Қолданбалар жүктелуде…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" сұрауына сәйкес келетін қолданбалар жоқ"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Қосымша қолданбалар іздеу"</string> + <string name="notifications_header" msgid="1404149926117359025">"Хабарландырулар"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Таңбашаны таңдау үшін оны басып, ұстап тұрыңыз."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Екі рет басып, ұстап тұрып, таңбашаны таңдаңыз немесе арнаулы әрекеттерді пайдаланыңыз."</string> + <string name="out_of_space" msgid="4691004494942118364">"Бұл Негізгі экранда орын қалмады."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Қалаулылар науасында орын қалмады"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Қолданбалар тізімі"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Жеке қолданбалар тізімі"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Жұмыс қолданбаларының тізімі"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Негізгі"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Жою"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Жою"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Қолданба ақпараты"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Орнату"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"төте пернелерді орнату"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Қолданбаға пайдаланушының қатысуынсыз төте пернелерді қосу мүмкіндігін береді."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"Негізгі экрандағы параметрлер мен төте пернелерді оқу"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Қолданбаға Негізгі экрандағы параметрлер мен төте пернелерді оқу мүмкіндігін береді."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"Негізгі экран параметрлері мен төте пернелерін жазу"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Қолданбаға Негізгі экрандағы параметрлер мен төте пернелерді өзгерту мүмкіндігін береді."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> арқылы телефон қоңырауларын соғуға рұқсат етілмеген"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Виджетті жүктеу барысында мәселе орын алды"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Орнату"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Бұл жүйе қолданбасы, сондықтан оны алу мүмкін емес."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Атауы жоқ қалта"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> өшірілді"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> қолданбасында <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> хабарландыру бар</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g> қолданбасында <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> хабарландыру бар</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%1$d бет, барлығы %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"%1$d негізгі экран, барлығы %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Жаңа негізгі экран беті"</string> + <string name="folder_opened" msgid="94695026776264709">"Қалта ашылды, <xliff:g id="WIDTH">%1$d</xliff:g> және <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Қалтаны жабу үшін түртіңіз"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Қайта атауды сақтау үшін түртіңіз"</string> + <string name="folder_closed" msgid="4100806530910930934">"Қалта жабылды"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Қалта атауы <xliff:g id="NAME">%1$s</xliff:g> болып өзгертілді"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Қалта: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Виджеттер"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Тұсқағаздар"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон бұрылғанда"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Хабарландыру белгілері"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Қосулы"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Өшірулі"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Хабарландыруға кіру рұқсаты қажет"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Хабарландыру белгілерін көрсету үшін <xliff:g id="NAME">%1$s</xliff:g> қолданбасының қолданба хабарландыруларын қосыңыз"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Параметрлерді өзгерту"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Хабарландыру белгілерін көрсету"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Негізгі экранға белгіше енгізу"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Жаңа қолданбаларға арналған"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Белгіше пішінін өзгерту"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"Негізгі экранда"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Жүйенің әдепкі параметрін пайдалану"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Шаршы"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Жұмыр төртбұрыш"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Шеңбер"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Тамшы"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Белгіше пішіні өзгерістері күшіне енуде"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Белгісіз"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Алып тастау"</string> + <string name="abandoned_search" msgid="891119232568284442">"Іздеу"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Бұл қолданба орнатылмаған"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Осы белгіше үшін қолданба орнатылмаған. Оны жоюға болады немесе қолданбаны іздеп, қолмен орнатуға болады."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> жүктелуде, <xliff:g id="PROGRESS">%2$s</xliff:g> аяқталды"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> орнату күтілуде"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> виджеті"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Негізгі экранға қосу"</string> + <string name="action_move_here" msgid="2170188780612570250">"Элементті мұнда жылжыту"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Элемент негізгі экранға қосылды"</string> + <string name="item_removed" msgid="851119963877842327">"Элемент жойылды"</string> + <string name="action_move" msgid="4339390619886385032">"Элементті жылжыту"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"<xliff:g id="NUMBER_0">%1$s</xliff:g>-жол, <xliff:g id="NUMBER_1">%2$s</xliff:g>-бағанға жылжыту"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g>-орынға жылжыту"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"<xliff:g id="NUMBER">%1$s</xliff:g> нөмірлі таңдаулы орынға жылжыту"</string> + <string name="item_moved" msgid="4606538322571412879">"Элемент жылжытылды"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Қалтаға қосу: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> бар қалтаға қосу"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Элемент қалтаға қосылды"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Мына бар қалтаны жасау: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Қалта жасалды"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Негізгі экранға жылжыту"</string> + <string name="action_resize" msgid="1802976324781771067">"Өлшемін өзгерту"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Енін арттыру"</string> + <string name="action_increase_height" msgid="459390020612501122">"Биіктігін арттыру"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Енін азайту"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Биіктігін азайту"</string> + <string name="widget_resized" msgid="9130327887929620">"Виджет өлшемінің ені <xliff:g id="NUMBER_0">%1$s</xliff:g>, биіктігі <xliff:g id="NUMBER_1">%2$s</xliff:g> болып өзгертілді"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Таңбашалар"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> қолданбасына арналған <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> таңбаша"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> қолданбасының <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> таңбашасы мен <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> хабарландыруы"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Бас тарту"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Хабарландырудан бас тартылды"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Жеке"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Жұмыс"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Жұмыс профилі"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Жұмыс қолданбалары осы жерде берілген"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Әрбір жұмыс қолданбасында танымбелгі бар. Ол оның қауіпсіздігі ұйым арқылы қамтамасыз етілетінін білдіреді. Жұмыс қолданбаларына оңай кіру үшін, оларды Негізгі экранға жылжытуға болады."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Ұйым арқылы басқарылады"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Хабарландырулар мен қолданбалар өшірулі"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Жабу"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Жабық"</string> +</resources> diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index b66fe69a3..2ad595458 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Тұсқағаздар"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон бұрылғанда"</string> <string name="icon_badging_title" msgid="874121399231955394">"Хабарландыру белгілері"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Қосулы"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Өшірулі"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Биіктігін азайту"</string> <string name="widget_resized" msgid="9130327887929620">"Виджет өлшемінің ені <xliff:g id="NUMBER_0">%1$s</xliff:g>, биіктігі <xliff:g id="NUMBER_1">%2$s</xliff:g> болып өзгертілді"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Таңбашалар"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> қолданбасына арналған <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> таңбаша"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> қолданбасының <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> таңбашасы мен <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> хабарландыруы"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Бас тарту"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Хабарландырудан бас тартылды"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Жеке"</string> diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml new file mode 100644 index 000000000..582bb33dd --- /dev/null +++ b/res/values-km-rKH/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"ការងារ"</string> + <string name="activity_not_found" msgid="8071924732094499514">"មិនបានដំឡើងកម្មវិធី។"</string> + <string name="activity_not_available" msgid="7456344436509528827">"មិនមានកម្មវិធី"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"បានបិទកម្មវិធីដែលបានទាញយកក្នុងរបៀបសុវត្ថិភាព"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"បានបិទធាតុក្រាហ្វិកក្នុងរបៀបសុវត្ថិភាព"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"ផ្លូវកាត់មិនអាចប្រើបានទេ"</string> + <string name="home_screen" msgid="806512411299847073">"អេក្រង់ដើម"</string> + <string name="custom_actions" msgid="3747508247759093328">"សកម្មភាពផ្ទាល់ខ្លួន"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"ប៉ះ & សង្កត់ ដើម្បីជ្រើសធាតុក្រាហ្វិក។"</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"ទទឺង %1$d គុណនឹងកម្ពស់ %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"ចុចឲ្យជាប់ដើម្បីបញ្ចូលវាដោយផ្ទាល់"</string> + <string name="place_automatically" msgid="8064208734425456485">"បញ្ចូលដោយស្វ័យប្រវត្តិ"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ស្វែងរកកម្មវិធី"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"កំពុងផ្ទុកកម្មវិធី…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"រកមិនឃើញកម្មវិធីដែលត្រូវគ្នាជាមួយ \"<xliff:g id="QUERY">%1$s</xliff:g>\" ទេ"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"ស្វែងរកកម្មវិធីច្រើនទៀត"</string> + <string name="notifications_header" msgid="1404149926117359025">"ការជូនដំណឹង"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"ចុចឱ្យជាប់ដើម្បីជ្រើសរើសផ្លូវកាត់មួយ។"</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"ចុចពីរដង ហើយចុចឱ្យជាប់ដើម្បីជ្រើសរើសផ្លូវកាត់មួយ ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។"</string> + <string name="out_of_space" msgid="4691004494942118364">"គ្មានបន្ទប់នៅលើអេក្រង់ដើមនេះទៀតទេ។"</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"គ្មានបន្ទប់ក្នុងថាសនិយមប្រើ"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"បញ្ជីកម្មវិធី"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"បញ្ជីកម្មវិធីផ្ទាល់ខ្លួន"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"បញ្ជីកម្មវិធីការងារ"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"ដើម"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"យកចេញ"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"លុបការដំឡើង"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"ព័ត៌មានកម្មវិធី"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ដំឡើង"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"ដំឡើងផ្លូវកាត់"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"អនុញ្ញាតឲ្យកម្មវិធីបន្ថែមផ្លូវកាត់ ដោយមិនចាំបាច់អំពើពីអ្នកប្រើ។"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"អានការកំណត់ និងផ្លូវកាត់អេក្រង់ដើម"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"អនុញ្ញាតឲ្យកម្មវិធីអានការកំណត់ និងផ្លូវកាត់ក្នុងអេក្រង់ដើម។"</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"សរសេរការកំណត់ និងផ្លូវកាត់លើអេក្រង់ដើម"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"អនុញ្ញាតឲ្យកម្មវិធីប្ដូរការកំណត់ និងផ្លូវកាត់ក្នុងអេក្រង់ដើម។"</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> មិនត្រូវបានអនុញ្ញាតឲ្យធ្វើការហៅទូរស័ព្ទទេ"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"បញ្ហាក្នុងការផ្ទុកធាតុក្រាហ្វិក"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"រៀបចំ"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"នេះជាកម្មវិធីប្រព័ន្ធ មិនអាចលុបបានទេ។"</string> + <string name="folder_hint_text" msgid="6617836969016293992">"ថតគ្មានឈ្មោះ"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"បានបិទដំណើរការ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> មានការជូនដំណឹង <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g></item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g> មានការជូនដំណឹង <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g></item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"ទំព័រ %1$d នៃ %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"អេក្រង់ដើម %1$d នៃ %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"ទំព័រអេក្រង់ដើមថ្មី"</string> + <string name="folder_opened" msgid="94695026776264709">"បានបើកថត <xliff:g id="WIDTH">%1$d</xliff:g> ដោយ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ប៉ះ ដើម្បីបិទថត"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"ប៉ះដើម្បីរក្សាទុកឈ្មោះដែលបានប្តូរ"</string> + <string name="folder_closed" msgid="4100806530910930934">"បានបិទថត"</string> + <string name="folder_renamed" msgid="1794088362165669656">"បានប្ដូរឈ្មោះថតជា <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ថត៖ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"ធាតុក្រាហ្វិក"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"ផ្ទាំងរូបភាព"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក"</string> + <string name="icon_badging_title" msgid="874121399231955394">"ស្លាកជូនដំណឹង"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"បើក"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"បិទ"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"តម្រូវឲ្យមានសិទ្ធិចូលប្រើប្រាស់ការជូនដំណឹង"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"ដើម្បីបង្ហាញស្លាកជូនដំណឹង សូមបើកការជូនដំណឹងកម្មវិធីសម្រាប់ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="title_change_settings" msgid="1376365968844349552">"ប្ដូរការកំណត់"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"បង្ហាញស្លាកជូនដំណឹង"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"បញ្ចូលរូបតំណាងទៅអេក្រង់ដើម"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"សម្រាប់កម្មវិធីថ្មី"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"ប្តូររូបរាងរូបតំណាង"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"នៅលើអេក្រង់ដើម"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"ប្រើលំនាំដើមរបស់ប្រព័ន្ធ"</string> + <string name="icon_shape_square" msgid="633575066111622774">"ការ៉េ"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"ការ៉េជ្រុងកោង"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"រង្វង់"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"តំណក់ទឹកភ្នែក"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"កំពុងអនុវត្តការប្តូររូបរាងរូបតំណាង"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"មិនស្គាល់"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"លុបចេញ"</string> + <string name="abandoned_search" msgid="891119232568284442">"ស្វែងរក"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"មិនបានដំឡើងកម្មវិធីនេះ"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"មិនបានដំឡើងកម្មវិធីសម្រាប់រូបតំណាងនេះ។ អ្នកអាចលុបវា ឬស្វែងរកកម្មវិធី និងដំឡើងវាដោយដៃ។"</string> + <string name="app_downloading_title" msgid="8336702962104482644">"កំពុងដោនឡូត <xliff:g id="NAME">%1$s</xliff:g> បានបញ្ចប់ <xliff:g id="PROGRESS">%2$s</xliff:g>"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> កំពុងរង់ចាំការដំឡើង"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"ធាតុក្រាហ្វិក <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"បន្ថែមទៅអេក្រង់ដើម"</string> + <string name="action_move_here" msgid="2170188780612570250">"ផ្លាស់ធាតុមកទីនេះ"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"ធាតុដែលត្រូវបានបន្ថែមទៅអេក្រង់ដើម"</string> + <string name="item_removed" msgid="851119963877842327">"ធាតុដែលបានដកចេញ"</string> + <string name="action_move" msgid="4339390619886385032">"ផ្លាស់ទីធាតុ"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"ផ្លាស់ទីទៅជួរដេកទី <xliff:g id="NUMBER_0">%1$s</xliff:g> ជួរឈរទី <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"ផ្លាស់ទីទៅទីតាំង <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"ផ្លាស់ទីទៅការចូលចិត្តទីតាំងទី <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="item_moved" msgid="4606538322571412879">"បានផ្លាស់ទីធាតុ"</string> + <string name="add_to_folder" msgid="9040534766770853243">"បន្ថែមទៅថតឯកសារ៖ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"បន្ថែមទៅថតឯកសារដែលមានឈ្មោះ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="added_to_folder" msgid="4793259502305558003">"បានបន្ថែមធាតុទៅថតឯកសារ"</string> + <string name="create_folder_with" msgid="4050141361160214248">"បង្កើតថតឯកសារជាមួយ៖ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"បានបង្កើតថតឯកសារ"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"ផ្លាស់ទៅអេក្រង់ដើម"</string> + <string name="action_resize" msgid="1802976324781771067">"ប្ដូរទំហំ"</string> + <string name="action_increase_width" msgid="8773715375078513326">"បង្កើនទទឹង"</string> + <string name="action_increase_height" msgid="459390020612501122">"បង្កើនកម្ពស់"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"បន្ថយទទឹង"</string> + <string name="action_decrease_height" msgid="282377193880900022">"បន្ថយកម្ពស់"</string> + <string name="widget_resized" msgid="9130327887929620">"ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង <xliff:g id="NUMBER_0">%1$s</xliff:g> កម្ពស់ប្រវែង <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"ផ្លូវកាត់"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ផ្លូវកាត់សម្រាប់ <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"ផ្លូវកាត់ចំនួន <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> និងការជូនដំណឹងចំនួន <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> សម្រាប់ <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"បដិសេធ"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"បានបដិសេធការជូនដំណឹង"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"ផ្ទាល់ខ្លួន"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"ការងារ"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"កម្រងព័ត៌មានការងារ"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"ស្វែងរកកម្មវិធីការងារនៅទីនេះ"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"កម្មវិធីការងារនីមួយៗមានស្លាកមួយ និងត្រូវបានរក្សាទុកយ៉ាងមានសុវត្ថិភាពដោយស្ថាប័នរបស់អ្នក។ សូមផ្លាស់ទីកម្មវិធីទៅកាន់អេក្រង់ដើមរបស់អ្នក ដើម្បីងាយស្រួលចូលប្រើជាងមុន។"</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"គ្រប់គ្រងដោយស្ថាប័នរបស់អ្នក"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"ការជូនដំណឹង និងកម្មវិធីត្រូវបានបិទ"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"បិទ"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"បានបិទ"</string> +</resources> diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 6b5637216..e3659c99f 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"ផ្ទាំងរូបភាព"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក"</string> <string name="icon_badging_title" msgid="874121399231955394">"ស្លាកជូនដំណឹង"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"បើក"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"បិទ"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"បន្ថយកម្ពស់"</string> <string name="widget_resized" msgid="9130327887929620">"ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង <xliff:g id="NUMBER_0">%1$s</xliff:g> កម្ពស់ប្រវែង <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"ផ្លូវកាត់"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ផ្លូវកាត់សម្រាប់ <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"ផ្លូវកាត់ចំនួន <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> និងការជូនដំណឹងចំនួន <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> សម្រាប់ <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"បដិសេធ"</string> <string name="notification_dismissed" msgid="6002233469409822874">"បានបដិសេធការជូនដំណឹង"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"ផ្ទាល់ខ្លួន"</string> diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml new file mode 100644 index 000000000..56ebe0a9b --- /dev/null +++ b/res/values-kn-rIN/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"ಕೆಲಸ"</string> + <string name="activity_not_found" msgid="8071924732094499514">"ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ"</string> + <string name="activity_not_available" msgid="7456344436509528827">"ಅಪ್ಲಿಕೇಶನ್ ಲಭ್ಯವಿಲ್ಲ"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"ಡೌನ್ಲೋಡ್ ಮಾಡಲಾದ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"ಸುರಕ್ಷಿತ ಮೋಡ್ನಲ್ಲಿ ವಿಜೆಟ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"ಶಾರ್ಟ್ಕಟ್ ಲಭ್ಯವಿಲ್ಲ"</string> + <string name="home_screen" msgid="806512411299847073">"ಮುಖಪುಟದ ಪರದೆ"</string> + <string name="custom_actions" msgid="3747508247759093328">"ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳು"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d ಅಗಲ ಮತ್ತು %2$d ಎತ್ತರ"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"ಹಸ್ತಚಾಲಿತವಾಗಿ ಸೇರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ"</string> + <string name="place_automatically" msgid="8064208734425456485">"ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೇರಿಸಿ"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಹುಡುಕಿ"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಕಂಡುಬಂದಿಲ್ಲ"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"ಮತ್ತಷ್ಟು ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಹುಡುಕಿ"</string> + <string name="notifications_header" msgid="1404149926117359025">"ಅಧಿಸೂಚನೆಗಳು"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಶಾರ್ಟ್ಕಟ್ ಆರಿಸಲು ಹೋಲ್ಡ್ ಮಾಡಿ."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಶಾರ್ಟ್ಕಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ."</string> + <string name="out_of_space" msgid="4691004494942118364">"ಈ ಮುಖಪುಟದ ಪರದೆಯಲ್ಲಿ ಹೆಚ್ಚು ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"ಮೆಚ್ಚಿನವುಗಳ ಟ್ರೇನಲ್ಲಿ ಹೆಚ್ಚಿನ ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"ಅಪ್ಲಿಕೇಶನ್ಗಳ ಪಟ್ಟಿ"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"ವೈಯಕ್ತಿಕ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಪಟ್ಟಿ"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"ಕೆಲಸದ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಪಟ್ಟಿ"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"ಮುಖಪುಟ"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"ತೆಗೆದುಹಾಕಿ"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"ಅನ್ಇನ್ಸ್ಟಾಲ್"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ಸ್ಥಾಪಿಸಿ"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಸ್ಥಾಪಿಸಿ"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"ಬಳಕೆದಾರರ ಹಸ್ತಕ್ಷೇಪವಿಲ್ಲದೆ ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಸೇರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"ಮುಖಪುಟದ ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಓದಿ"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"ಮುಖಪುಟದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"ಮುಖಪುಟದ ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಬರೆಯಿರಿ"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"ಮುಖಪುಟದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"ವಿಜೆಟ್ ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ಸಮಸ್ಯೆ"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"ಸೆಟಪ್"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"ಇದೊಂದು ಅಪ್ಲಿಕೇಶನ್ ಆಗಿದೆ ಮತ್ತು ಅಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"ಹೆಸರಿಲ್ಲದ ಫೋಲ್ಡರ್"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> ಅಧಿಸೂಚನೆಗಳನ್ನು ಹೊಂದಿದೆ</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> ಅಧಿಸೂಚನೆಗಳನ್ನು ಹೊಂದಿದೆ</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%2$d ರಲ್ಲಿ %1$d ಪುಟ"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d ರಲ್ಲಿ %1$d ಮುಖಪುಟದ ಪರದೆ"</string> + <string name="workspace_new_page" msgid="257366611030256142">"ಹೊಸ ಮುಖಪುಟ ಪರದೆ"</string> + <string name="folder_opened" msgid="94695026776264709">"ಫೋಲ್ಡರ್ ತೆರೆಯಲಾಗಿದೆ, <xliff:g id="WIDTH">%1$d</xliff:g> ಬೈ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ಫೋಲ್ಡರ್ ಮುಚ್ಚಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"ಮರುಹೆಸರನ್ನು ಉಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="folder_closed" msgid="4100806530910930934">"ಫೋಲ್ಡರ್ ಮುಚ್ಚಿದೆ"</string> + <string name="folder_renamed" msgid="1794088362165669656">"ಫೋಲ್ಡರ್ ಅನ್ನು <xliff:g id="NAME">%1$s</xliff:g> ಗೆ ಮರುಹೆಸರಿಸಲಾಗಿದೆ"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ಫೋಲ್ಡರ್: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"ವಿಜೆಟ್ಗಳು"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"ವಾಲ್ಪೇಪರ್ಗಳು"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ಫೋನ್ ತಿರುಗಿಸಿದಾಗ"</string> + <string name="icon_badging_title" msgid="874121399231955394">"ಅಧಿಸೂಚನೆ ಡಾಟ್ಗಳು"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ಆನ್"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"ಆಫ್"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"ಅಧಿಸೂಚನೆ ಪ್ರವೇಶ ಅಗತ್ಯವಿದೆ"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"ಅಧಿಸೂಚನೆ ಚುಕ್ಕೆಗಳನ್ನು ತೋರಿಸಲು, <xliff:g id="NAME">%1$s</xliff:g> ಗೆ ಅಪ್ಲಿಕೇಶನ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆನ್ ಮಾಡಿ"</string> + <string name="title_change_settings" msgid="1376365968844349552">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"ಅಧಿಸೂಚನೆ ಡಾಟ್ಗಳನ್ನು ತೋರಿಸಿ"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"ಮುಖಪುಟದ ಪರದೆಗೆ ಐಕಾನ್ ಸೇರಿಸಿ"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"ಹೊಸ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"ಮುಖಪುಟ ಪರದೆಯಲ್ಲಿ"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"ಸಿಸ್ಟಂ ಡಿಫಾಲ್ಟ್ ಬಳಸಿ"</string> + <string name="icon_shape_square" msgid="633575066111622774">"ಚೌಕ"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"ಚೌಕವೃತ್ತ"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"ವೃತ್ತ"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"ಕಂಬನಿ"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"ಐಕಾನ್ ಆಕಾರ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತಿದೆ"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"ಅಪರಿಚಿತ"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"ತೆಗೆದುಹಾಕಿ"</string> + <string name="abandoned_search" msgid="891119232568284442">"ಹುಡುಕಿ"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪನೆಗೊಂಡಿಲ್ಲ"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ಈ ಐಕಾನ್ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪನೆಗೊಂಡಿಲ್ಲ. ನೀವು ಅದನ್ನು ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್ ಹುಡುಕಬಹುದು ಮತ್ತು ಹಸ್ತಚಾಲಿತವಾಗಿ ಅದನ್ನು ಸ್ಥಾಪಿಸಬಹುದು."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ, <xliff:g id="PROGRESS">%2$s</xliff:g> ಪೂರ್ಣಗೊಂಡಿದೆ"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ಸ್ಥಾಪಿಸಲು ಕಾಯಲಾಗುತ್ತಿದೆ"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> ವಿಜೆಟ್ಗಳು"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"ಮುಖಪುಟಕ್ಕೆ ಸೇರಿಸು"</string> + <string name="action_move_here" msgid="2170188780612570250">"ಐಟಂ ಇಲ್ಲಿಗೆ ಸರಿಸಿ"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"ಮುಖಪುಟ ಪರದೆಗೆ ಐಟಂ ಸೇರಿಸಲಾಗಿದೆ"</string> + <string name="item_removed" msgid="851119963877842327">"ಐಟಂ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string> + <string name="action_move" msgid="4339390619886385032">"ಐಟಂ ಸರಿಸಿ"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ಸಾಲು <xliff:g id="NUMBER_1">%2$s</xliff:g> ಕಾಲಮ್ಗೆ ಸರಿಸಿ"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g> ಸ್ಥಾನಕ್ಕೆ ಸರಿಸಿ"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"ಮೆಚ್ಚಿನ <xliff:g id="NUMBER">%1$s</xliff:g> ಸ್ಥಾನಕ್ಕೆ ಸರಿಸಿ"</string> + <string name="item_moved" msgid="4606538322571412879">"ಐಟಂ ಸರಿಸಲಾಗಿದೆ"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ಫೋಲ್ಡರ್ಗೆ ಸೇರಿಸಿ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> ಮೂಲಕ ಫೋಲ್ಡರ್ಗೆ ಸೇರಿಸಿ"</string> + <string name="added_to_folder" msgid="4793259502305558003">"ಐಟಂ ಅನ್ನು ಫೋಲ್ಡರ್ಗೆ ಸೇರಿಸಲಾಗಿದೆ"</string> + <string name="create_folder_with" msgid="4050141361160214248">"ಇದನ್ನು ಬಳಸಿಕೊಂಡು ಫೋಲ್ಡರ್ ರಚಿಸಿ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"ಫೋಲ್ಡರ್ ರಚಿಸಲಾಗಿದೆ"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"ಮುಖಪುಟಕ್ಕೆ ಸರಿಸಿ"</string> + <string name="action_resize" msgid="1802976324781771067">"ಮರುಗಾತ್ರ"</string> + <string name="action_increase_width" msgid="8773715375078513326">"ಅಗಲವನ್ನು ಹೆಚ್ಚು ಮಾಡಿ"</string> + <string name="action_increase_height" msgid="459390020612501122">"ಎತ್ತರವನ್ನು ಹೆಚ್ಚು ಮಾಡಿ"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"ಅಗಲವನ್ನು ಕಡಿಮೆ ಮಾಡಿ"</string> + <string name="action_decrease_height" msgid="282377193880900022">"ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ"</string> + <string name="widget_resized" msgid="9130327887929620">"ವಿಜೆಟ್ ಅನ್ನು <xliff:g id="NUMBER_0">%1$s</xliff:g> ಅಗಲ <xliff:g id="NUMBER_1">%2$s</xliff:g> ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"ಶಾರ್ಟ್ಕಟ್ಗಳು"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ಶಾರ್ಟ್ಕಟ್ಗಳು"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> ಗಾಗಿ <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ಶಾರ್ಟ್ಕಟ್ಗಳು ಮತ್ತು <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ಅಧಿಸೂಚನೆಗಳು"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"ವಜಾಗೊಳಿಸಿ"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"ಅಧಿಸೂಚನೆಯನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"ವೈಯಕ್ತಿಕ"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"ಕೆಲಸ"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"ಕೆಲಸದ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಇಲ್ಲಿ ಹುಡುಕಿ"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"ಕೆಲಸದ ಪ್ರತಿ ಅಪ್ಲಿಕೇಶನ್ ಬ್ಯಾಡ್ಜ್ ಹೊಂದಿದೆ ಮತ್ತು ನಿಮ್ಮ ಸಂಸ್ಥೆಯಿಂದ ಸುರಕ್ಷಿತವಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ಸುಲಭ ಪ್ರವೇಶಕ್ಕಾಗಿ ನಿಮ್ಮ ಹೋಮ್ ಸ್ಕ್ರೀನ್ಗೆ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಸರಿಸಿ."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗಿದೆ"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"ಅಧಿಸೂಚನೆಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ಗಳು ಆಫ್ ಆಗಿವೆ"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"ಮುಚ್ಚಿ"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"ಮುಚ್ಚಲಾಗಿದೆ"</string> +</resources> diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index d4813b576..7a68378d2 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"ವಾಲ್ಪೇಪರ್ಗಳು"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ಫೋನ್ ತಿರುಗಿಸಿದಾಗ"</string> <string name="icon_badging_title" msgid="874121399231955394">"ಅಧಿಸೂಚನೆ ಡಾಟ್ಗಳು"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ಆನ್"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"ಆಫ್"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ"</string> <string name="widget_resized" msgid="9130327887929620">"ವಿಜೆಟ್ ಅನ್ನು <xliff:g id="NUMBER_0">%1$s</xliff:g> ಅಗಲ <xliff:g id="NUMBER_1">%2$s</xliff:g> ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"ಶಾರ್ಟ್ಕಟ್ಗಳು"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> ಗೆ <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ಶಾರ್ಟ್ಕಟ್ಗಳು"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> ಗಾಗಿ <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ಶಾರ್ಟ್ಕಟ್ಗಳು ಮತ್ತು <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ಅಧಿಸೂಚನೆಗಳು"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"ವಜಾಗೊಳಿಸಿ"</string> <string name="notification_dismissed" msgid="6002233469409822874">"ಅಧಿಸೂಚನೆಯನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"ವೈಯಕ್ತಿಕ"</string> diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 9275abfe1..4a6f3faa1 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"배경화면"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"휴대전화 회전 시"</string> <string name="icon_badging_title" msgid="874121399231955394">"알림 표시 점"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"사용"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"사용 안함"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"높이 줄이기"</string> <string name="widget_resized" msgid="9130327887929620">"폭 <xliff:g id="NUMBER_0">%1$s</xliff:g>, 높이 <xliff:g id="NUMBER_1">%2$s</xliff:g>로 위젯 크기 조정됨"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"바로가기"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g>에 사용 가능한 단축키 <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>개"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"바로가기 <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>개 및 <xliff:g id="APP_NAME">%3$s</xliff:g> 알림 <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>개"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"닫기"</string> <string name="notification_dismissed" msgid="6002233469409822874">"알림이 해제되었습니다."</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"개인"</string> diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml new file mode 100644 index 000000000..502a08a3e --- /dev/null +++ b/res/values-ky-rKG/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Жумуш"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Колдонмо орнотулган эмес."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Колдонмо жеткиликтүү эмес"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Жүктөп алынган колдонмо Коопсуз режиминде иштен чыгарылды"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Виджеттер Коопсуз режимде өчүрүлгөн"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Кыска жол жок"</string> + <string name="home_screen" msgid="806512411299847073">"Башкы экран"</string> + <string name="custom_actions" msgid="3747508247759093328">"Ыңгайлаштырылган аракеттер"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Виджетти тандаш үчүн, басып туруңуз"</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"Туурасы: %1$d, бийиктиги: %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Кол менен жайгаштыруу үчүн басып туруп, таштаңыз"</string> + <string name="place_automatically" msgid="8064208734425456485">"Автоматтык түрдө кошуу"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Колдонмолорду издөө"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Колдонмолор жүктөлүүдө…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" сурамына дал келген колдонмолор табылган жок"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Көбүрөөк колдонмолорду издөө"</string> + <string name="notifications_header" msgid="1404149926117359025">"Билдирмелер"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Кыска жолду тандоо үчүн басып туруңуз."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Кыска жолду тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз."</string> + <string name="out_of_space" msgid="4691004494942118364">"Бул Үй экранында бош орун жок."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Тандамалдар тайпасында орун калган жок"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Колдонмолор тизмеси"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Жеке колдономолордун тизмеси"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Жумуш колдонмолорунун тизмеси"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Үйгө"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Алып салуу"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Чыгарып салуу"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Колдонмо тууралуу"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Орнотуу"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"тез чакырмаларды орнотуу"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Колдонмого колдонуучуга кайрылбастан тез чакырма кошууга уруксат берет."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"Үйдүн тууралоолорун жана тез чакырмаларын окуу"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Колдонмого Үйдүн тууралоолорун жана тез чакырмаларын окууга уруксат берет."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"Үйдүн тууралоолорун жана тез чакырмаларын жазуу"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Колдонмого Үйдүн тууралоолорун жана тез чакырмаларын өзгөртүүгө уруксат берет."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> телефон чалууларды аткарууга уруксаты жок"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Виджетти жүктөөдө маселе бар"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Орнотуу"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Бул системдик колдонмо жана аны чечкенге болбойт."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Аты жок фолдер"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> өчүрүлгөн"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> эскертме бар</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>, <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> эскертме бар</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%2$d ичинен %1$d барак"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Үй экраны %2$d ичинен %1$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Жаңы башкы экран барагы"</string> + <string name="folder_opened" msgid="94695026776264709">"Фолдер ачылды, туурасы <xliff:g id="WIDTH">%1$d</xliff:g>, бийиктиги <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Куржунду жабуу үчүн таптаңыз"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Өзгөртүлгөн аталышын сактоо үчүн таптаңыз"</string> + <string name="folder_closed" msgid="4100806530910930934">"Фолдер жабык"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Фолдердин аты <xliff:g id="NAME">%1$s</xliff:g> деп өзгөртүлдү"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Фолдер: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Виджеттер"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Тушкагаздар"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон айланганда"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Билдирмелер белгилери"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Күйүк"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Өчүк"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Эскертмелерге уруксат берилиши керек"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Эскертме белгилерин көрсөтүү максатында, <xliff:g id="NAME">%1$s</xliff:g> үчүн колдонмонун эскертмелерин күйгүзүү керек"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Жөндөөлөрдү өзгөртүү"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Эскертме белгилерин көрсөтүү"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Башкы экранга сүрөтчө кошуу"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Жаңы колдонмолор үчүн"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Сүрөтчөнүн формасын өзгөртүү"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"Башкы экранда"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Демейки тутум жөндөөлөрү колдонулат"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Чарчы"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Бурчтары жумуру төрт бурчтук"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Тегерек"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Тамчы"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Өзгөртүлгөн сүрөтчөнүн формасы колдонулууда"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Белгисиз"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Алып салуу"</string> + <string name="abandoned_search" msgid="891119232568284442">"Издөө"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Бул колдонмо орнотулган эмес"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Бул сүрөтчөнүн колдонмосу орнотулган эмес. Аны алып салсаңыз же колдонмону издеп, кол менен орнотсоңуз болот."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> жүктөлүп алынууда, <xliff:g id="PROGRESS">%2$s</xliff:g> аяктады"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> орнотулушу күтүлүүдө"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> виджеттери"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Башкы экранга кошуу"</string> + <string name="action_move_here" msgid="2170188780612570250">"Бул нерсени бул жерге жылдыруу"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Башкы экранга кошулду"</string> + <string name="item_removed" msgid="851119963877842327">"Жоюлду"</string> + <string name="action_move" msgid="4339390619886385032">"Муну жылдыруу"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"<xliff:g id="NUMBER_0">%1$s</xliff:g> катарга <xliff:g id="NUMBER_1">%2$s</xliff:g> тилкеге жылдыруу"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g> орунга жылдыруу"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Сүйүктүүлөргө <xliff:g id="NUMBER">%1$s</xliff:g> жылдыруу"</string> + <string name="item_moved" msgid="4606538322571412879">"Нерсе жылдырылды"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Куржунга кошуу: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> куржунуна кошуу"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Нерсе куржунга кошулду"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Төмөнкү менен куржун түзүү: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Куржун түзүлдү"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Башкы экранга жылдыруу"</string> + <string name="action_resize" msgid="1802976324781771067">"Өлчөмүн өзгөртүү"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Кеңейтүү"</string> + <string name="action_increase_height" msgid="459390020612501122">"Бийиктетүү"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Ичкертүү"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Жапыздатуу"</string> + <string name="widget_resized" msgid="9130327887929620">"Виджеттин кеңдиги <xliff:g id="NUMBER_0">%1$s</xliff:g> бийиктиги <xliff:g id="NUMBER_1">%2$s</xliff:g> болду"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Кыска жолдор"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> колдонмосуна <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> кыска жол бар"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> колдонмосу үчүн <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> кыска жол жана <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> эскертме бар"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Этибарга албоо"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Эскертме көз жаздымда калтырылды"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Жеке колдонмолор"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Жумуш колдонмолору"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Жумуш профили"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Жумуш колдонмолорун бул жерден таап алыңыз"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Ар бир жумуш колдонмосунун бейджиги бар жана ал уюмуңуз тарабынан коопсуз сакталат. Колдонмолорго тез өтүү үчүн аларды Башкы экранга кошуп алыңыз."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Уюмуңуз тарабынан башкарылат"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Билдирүүлөр жана колдонмолор өчүрүлгөн"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Жабуу"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Жабык"</string> +</resources> diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index e0e740346..ce0dc3f86 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -39,7 +39,7 @@ <string name="all_apps_loading_message" msgid="5813968043155271636">"Колдонмолор жүктөлүүдө…"</string> <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" сурамына дал келген колдонмолор табылган жок"</string> <string name="all_apps_search_market_message" msgid="1366263386197059176">"Көбүрөөк колдонмолорду издөө"</string> - <string name="notifications_header" msgid="1404149926117359025">"Эскертмелер"</string> + <string name="notifications_header" msgid="1404149926117359025">"Билдирмелер"</string> <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Кыска жолду тандоо үчүн басып туруңуз."</string> <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Кыска жолду тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз."</string> <string name="out_of_space" msgid="4691004494942118364">"Бул Үй экранында бош орун жок."</string> @@ -81,7 +81,9 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Тушкагаздар"</string> <string name="settings_button_text" msgid="8873672322605444408">"Башкы беттин жөндөөлөрү"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Администраторуңуз өчүрүп койгон"</string> - <string name="icon_badging_title" msgid="874121399231955394">"Эскертме белгилери"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Башкы экранды айлантууга уруксат берүү"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон айланганда"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Билдирмелер белгилери"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Күйүк"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Өчүк"</string> <string name="title_missing_notification_access" msgid="7503287056163941064">"Эскертмелерге уруксат берилиши керек"</string> @@ -92,7 +94,7 @@ <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Жаңы колдонмолор үчүн"</string> <string name="icon_shape_override_label" msgid="2977264953998281004">"Сүрөтчөнүн формасын өзгөртүү"</string> <string name="icon_shape_override_label_location" msgid="3841607380657692863">"Башкы экранда"</string> - <string name="icon_shape_system_default" msgid="1709762974822753030">"Тутум сушунтаган демейкисин колдонуу"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Демейки тутум жөндөөлөрү колдонулат"</string> <string name="icon_shape_square" msgid="633575066111622774">"Чарчы"</string> <string name="icon_shape_squircle" msgid="5658049910802669495">"Бурчтары жумуру төрт бурчтук"</string> <string name="icon_shape_circle" msgid="6550072265930144217">"Тегерек"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Жапыздатуу"</string> <string name="widget_resized" msgid="9130327887929620">"Виджеттин кеңдиги <xliff:g id="NUMBER_0">%1$s</xliff:g> бийиктиги <xliff:g id="NUMBER_1">%2$s</xliff:g> болду"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Кыска жолдор"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> колдонмосуна <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> кыска жол бар"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> колдонмосу үчүн <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> кыска жол жана <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> эскертме бар"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Этибарга албоо"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Эскертме көз жаздымда калтырылды"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Жеке колдонмолор"</string> diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml index 7b5252949..f0021956a 100644 --- a/res/values-land/dimens.xml +++ b/res/values-land/dimens.xml @@ -25,7 +25,6 @@ <dimen name="fastscroll_popup_text_size">24dp</dimen> <!-- Dynamic grid --> - <dimen name="dynamic_grid_min_page_indicator_size">48dp</dimen> <dimen name="dynamic_grid_icon_drawable_padding">4dp</dimen> <dimen name="dynamic_grid_cell_layout_padding">0dp</dimen> diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml new file mode 100644 index 000000000..cd2c933c1 --- /dev/null +++ b/res/values-lo-rLA/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"ວຽກ"</string> + <string name="activity_not_found" msgid="8071924732094499514">"ແອັບຯບໍ່ໄດ້ຖືກຕິດຕັ້ງ."</string> + <string name="activity_not_available" msgid="7456344436509528827">"ແອັບຯໃຊ້ບໍ່ໄດ້"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"ແອັບຯທີ່ດາວໂຫລດແລ້ວຖືກປິດການນຳໃຊ້ໃນ Safe mode"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"ວິດເຈັດຖືກປິດໃນ Safe mode"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"ບໍ່ສາມາດໃຊ້ທາງລັດໄດ້"</string> + <string name="home_screen" msgid="806512411299847073">"ໜ້າຈໍຫຼັກ"</string> + <string name="custom_actions" msgid="3747508247759093328">"ຄຳສັ່ງແບບກຳນົດເອງ"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"ແຕະຄ້າງໄວ້ ເພື່ອເລືອກວິດເຈັດ ຫຼື ໃຊ້ການດຳເນີນການກຳນົດເອງ."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"ກວ້າງ %1$d ຄູນສູງ %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"ແຕະຄ້າງໄວ້ເພື່ອວາງດ້ວຍຕົນເອງ"</string> + <string name="place_automatically" msgid="8064208734425456485">"ເພີ່ມໂດຍອັດຕະໂນມັດ"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ຊອກຫາແອັບ"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"ກໍາລັງໂຫຼດແອັບ…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"ບໍ່ພົບແອັບທີ່ກົງກັບ \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"ຊອກຫາແອັບເພີ່ມເຕີມ"</string> + <string name="notifications_header" msgid="1404149926117359025">"ການແຈ້ງເຕືອນ"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"ແຕະຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"ແຕະສອງເທື່ອຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ ຫຼື ໃຊ້ຄຳສັ່ງແບບກຳນົດເອງ."</string> + <string name="out_of_space" msgid="4691004494942118364">"ບໍ່ມີຫ້ອງເຫຼືອໃນໜ້າຈໍຫຼັກນີ້."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"ບໍ່ມີບ່ອນຫວ່າງໃນຖາດສຳລັບເກັບສິ່ງທີ່ໃຊ້ເປັນປະຈຳ"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"ລາຍຊື່ແອັບ"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"ລາຍຊື່ແອັບສ່ວນຕົວ"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"ລາຍຊື່ແອັບເຮັດວຽກ"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"ໜ້າຫຼັກ"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"ເອົາອອກ"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"ຖອນການຕິດຕັ້ງ"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"ຂໍ້ມູນແອັບ"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ຕິດຕັ້ງ"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"ຕິດຕັ້ງທາງລັດ"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"ອະນຸຍາດໃຫ້ແອັບຯ ເພີ່ມທາງລັດໂດຍບໍ່ຕ້ອງຮັບການຢືນຢັນຈາກຜູ່ໃຊ້."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"ອ່ານການຕັ້ງຄ່າໜ້າຫຼັກ ແລະທາງລັດ"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"ອະນຸຍາດໃຫ້ແອັບຯດັ່ງກ່າວອ່ານການຕັ້ງຄ່າ ແລະທາງລັດໃນໜ້າຫຼັກ."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"ຂຽນການຕັ້ງຄ່າໜ້າຫຼັກ ແລະທາງລັດ"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"ອະນຸຍາດໃຫ້ແອັບຯດັ່ງກ່າວ ປ່ຽນການຕັ້ງຄ່າ ແລະທາງລັດໃນໜ້າຫຼັກ."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ໂທ"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"ມີບັນຫາໃນການໂຫລດວິດເຈັດ"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"ຕິດຕັ້ງ"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"ນີ້ແມ່ນແອັບຯຂອງລະບົບ ແລະບໍ່ສາມາດຖອນການຕິດຕັ້ງອອກໄດ້."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"ໂຟນເດີຍັງບໍ່ຖືກຕັ້ງຊື່"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"ປິດການນຳໃຊ້ <xliff:g id="APP_NAME">%1$s</xliff:g> ແລ້ວ"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, ມີ <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> ການແຈ້ງເຕືອນ</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>, ມີ <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> ການແຈ້ງເຕືອນ</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"ໜ້າ %1$d ຈາກ %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"ໜ້າຈໍຫຼັກ %1$d ໃນ %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"ໜ້າຂອງໜ້າຈໍຫຼັກໃໝ່"</string> + <string name="folder_opened" msgid="94695026776264709">"ເປີດໂຟນເດີແລ້ວ, <xliff:g id="WIDTH">%1$d</xliff:g> ຄູນ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ແຕະເພື່ອປິດໂຟນເດີ"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"ແຕະເພື່ອບັນທຶກການປ່ຽນຊື່"</string> + <string name="folder_closed" msgid="4100806530910930934">"ປິດໂຟນເດີແລ້ວ"</string> + <string name="folder_renamed" msgid="1794088362165669656">"ປ່ຽນຊື່ໂຟນເດີເປັນ <xliff:g id="NAME">%1$s</xliff:g> ແລ້ວ"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ໂຟນເດີ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"ວິດເຈັດ"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"ພາບພື້ນຫຼັງ"</string> + <string name="settings_button_text" msgid="8873672322605444408">"ການຕັ້ງຄ່າ Home"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ເມື່ອໝຸນໂທລະສັບ"</string> + <string name="icon_badging_title" msgid="874121399231955394">"ຈຸດການແຈ້ງເຕືອນ"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ເປີດ"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"ປິດ"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"ຕ້ອງໃຊ້ການເຂົ້າເຖິງການແຈ້ງເຕືອນ"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"ເພື່ອສະແດງຈຸດການແຈ້ງເຕືອນ, ໃຫ້ເປີດການແຈ້ງເຕືອນສຳລັບ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="title_change_settings" msgid="1376365968844349552">"ບັນທຶກການຕັ້ງຄ່າ"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"ສະແດງຈຸດການແຈ້ງເຕືອນ"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"ສຳລັບແອັບໃໝ່"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"ປ່ຽນຮູບຮ່າງໄອຄອນ"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"ຢູ່ໜ້າຈໍຫຼັກ"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"ໃຊ້ຄ່າເລີ່ມຕົ້ນລະບົບ"</string> + <string name="icon_shape_square" msgid="633575066111622774">"ສີ່ຫຼ່ຽມຈັດຕຸລັດ"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"ສີ່ຫຼ່ຽມຂອບມົນ"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"ວົງມົນ"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"ນ້ຳຢອດ"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"ນຳໃຊ້ການປ່ຽນແປງຮູບຮ່າງໄອຄອນ"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"ບໍ່ຮູ້ຈັກ"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"ລຶບ"</string> + <string name="abandoned_search" msgid="891119232568284442">"ຊອກຫາ"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"ແອັບຯນີ້ຍັງບໍ່ໄດ້ຕິດຕັ້ງເທື່ອ"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ແອັບຯສຳລັບໄອຄອນນີ້ຍັງບໍ່ໄດ້ຕິດຕັ້ງເທື່ອ. ທ່ານສາມາດລຶບມັນອອກ ຫຼືຊອກຫາແອັບຯ ແລ້ວຕິດຕັ້ງມັນໄດ້ດ້ວຍຕົນເອງ."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ກຳລັງດາວໂຫຼດ, <xliff:g id="PROGRESS">%2$s</xliff:g> ສຳເລັດ"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ກຳລັງລໍຖ້າຕິດຕັ້ງ"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"ວິດເຈັດ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"ເພີ່ມໃສ່ໜ້າຈໍຫຼັກ"</string> + <string name="action_move_here" msgid="2170188780612570250">"Move item here"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"ເພີ່ມລາຍການໃສ່ໜ້າຈໍຫຼັກແລ້ວ"</string> + <string name="item_removed" msgid="851119963877842327">"ເອົາລາຍການອອກໄປແລ້ວ"</string> + <string name="action_move" msgid="4339390619886385032">"ຍ້າຍລາຍການ"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"ຍ້າຍໄປໃສ່ແຖວ <xliff:g id="NUMBER_0">%1$s</xliff:g> ຖັນ <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"ຍ້າຍໄປໃສ່ຕຳແໜ່ງ <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"ຍ້າຍໄປໃສ່ຕຳແໜ່ງທີ່ມັກ <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="item_moved" msgid="4606538322571412879">"ຍ້າຍລາຍການແລ້ວ"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ເພີ່ມໃສ່ໂຟລເດີ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"ເພີ່ມໃສ່ໂຟລເດີດ້ວຍ <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="added_to_folder" msgid="4793259502305558003">"ເພີ່ມລາຍການໃສ່ໂຟລເດີແລ້ວ"</string> + <string name="create_folder_with" msgid="4050141361160214248">"ສ້າງໂຟລເດີກັບ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"ສ້າງໂຟລເດີແລ້ວ"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"ຍ້າຍໄປໃສ່ໜ້າຈໍຫຼັກ"</string> + <string name="action_resize" msgid="1802976324781771067">"ປັບຂະໜາດ"</string> + <string name="action_increase_width" msgid="8773715375078513326">"ເພີ່ມລວງກ້ວາງຂຶ້ນ"</string> + <string name="action_increase_height" msgid="459390020612501122">"ເພີ່ມລວງສູງຂຶ້ນ"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"ຫຼຸດລວງກ້ວາງລົງ"</string> + <string name="action_decrease_height" msgid="282377193880900022">"ຫຼຸດລວງສູງລົງ"</string> + <string name="widget_resized" msgid="9130327887929620">"ປ່ຽນຂະໜາດວິດເຈັດເປັນລວງກ້ວາງ <xliff:g id="NUMBER_0">%1$s</xliff:g> ລວງສູງ <xliff:g id="NUMBER_1">%2$s</xliff:g> ແລ້ວ"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"ທາງລັດ"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ທາງລັດສຳລັບ <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ທາງລັດ ແລະ <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ການແຈ້ງເຕືອນສຳລັບ <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"ປິດໄວ້"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"ປິດການແຈ້ງເຕືອນແລ້ວ"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"ສ່ວນຕົວ"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"ວຽກ"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"ຊອກຫາແອັບວຽກຢູ່ບ່ອນນີ້"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"ແຕ່ລະແອັບວຽກຈະມີປ້າຍ ແລະ ຖືກຈັດເກັບໄວ້ຢ່າງປອດໄພໂດຍອົງກອນຂອງທ່ານ. ທ່ານສາມາດຍ້າຍແອັບໄປໃສ່ໜ້າຈໍຫຼັກເພື່ອໃຫ້ເຂົ້າໃຊ້ງ່າຍຂຶ້ນໄດ້."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"ຈັດການໂດຍອົງກອນຂອງທ່ານ"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"ການແຈ້ງເຕືອນ ແລະ ແອັບຖືກປິດໄວ້"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"ປິດ"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"ປິດແລ້ວ"</string> +</resources> diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 2b7362897..a195eaf97 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"ພາບພື້ນຫຼັງ"</string> <string name="settings_button_text" msgid="8873672322605444408">"ການຕັ້ງຄ່າ Home"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ເມື່ອໝຸນໂທລະສັບ"</string> <string name="icon_badging_title" msgid="874121399231955394">"ຈຸດການແຈ້ງເຕືອນ"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ເປີດ"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"ປິດ"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"ຫຼຸດລວງສູງລົງ"</string> <string name="widget_resized" msgid="9130327887929620">"ປ່ຽນຂະໜາດວິດເຈັດເປັນລວງກ້ວາງ <xliff:g id="NUMBER_0">%1$s</xliff:g> ລວງສູງ <xliff:g id="NUMBER_1">%2$s</xliff:g> ແລ້ວ"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"ທາງລັດ"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ທາງລັດສຳລັບ <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ທາງລັດ ແລະ <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ການແຈ້ງເຕືອນສຳລັບ <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"ປິດໄວ້"</string> <string name="notification_dismissed" msgid="6002233469409822874">"ປິດການແຈ້ງເຕືອນແລ້ວ"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"ສ່ວນຕົວ"</string> diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index db751dae6..ac8684c01 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -83,6 +83,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Ekrano fonai"</string> <string name="settings_button_text" msgid="8873672322605444408">"„Home“ nustatymai"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Išjungė administratorius"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Leisti pasukti pagrindinį ekraną"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kai telefonas pasukamas"</string> <string name="icon_badging_title" msgid="874121399231955394">"Pranešimų taškai"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Įjungta"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Išjungta"</string> @@ -130,8 +132,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Sumažinti aukštį"</string> <string name="widget_resized" msgid="9130327887929620">"Valdiklio dydis pakeistas: plotis – <xliff:g id="NUMBER_0">%1$s</xliff:g>, aukštis – <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Spartieji klavišai"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Programos „<xliff:g id="APP_NAME">%2$s</xliff:g>“ spartieji klavišai (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>)"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"„<xliff:g id="APP_NAME">%3$s</xliff:g>“ spartieji klavišai (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) ir pranešimai (<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>)"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Atsisakyti"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Pranešimo atsisakyta"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Asmeninės"</string> diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index a6e16deee..0ed409318 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -82,6 +82,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Fona tapetes"</string> <string name="settings_button_text" msgid="8873672322605444408">"Sākumlapas iestatījumi"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Atspējojis administrators"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Atļaut sākuma ekrāna pagriešanu"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Pagriežot tālruni"</string> <string name="icon_badging_title" msgid="874121399231955394">"Paziņojumu punkti"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Ieslēgts"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Izslēgts"</string> @@ -129,8 +131,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Samazināt augstumu"</string> <string name="widget_resized" msgid="9130327887929620">"Logrīka lielums mainīts — platums: <xliff:g id="NUMBER_0">%1$s</xliff:g>, augstums: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Saīsnes"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> saīsnes lietotnei <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> saīsnes un <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> paziņojumi lietotnei <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Nerādīt"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Paziņojums netiek rādīts"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personīgās lietotnes"</string> diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml new file mode 100644 index 000000000..54d9c8054 --- /dev/null +++ b/res/values-mk-rMK/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Стартер3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Работа"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Апликацијата не е инсталирана."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Апликацијата не е достапна"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Преземената апликација е оневозможена во безбеден режим"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Додатоците се оневозможени во безбеден режим"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Кратенката не е достапна"</string> + <string name="home_screen" msgid="806512411299847073">"Почетен екран"</string> + <string name="custom_actions" msgid="3747508247759093328">"Приспособени дејства"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Допри и задржи за да се избере виџетот."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d широк на %2$d висок"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Допрете и задржете за рачно поставување"</string> + <string name="place_automatically" msgid="8064208734425456485">"Додај автоматски"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Пребарувајте апликации"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Се вчитуваат апликации…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"Не се најдени апликации што одговараат на „<xliff:g id="QUERY">%1$s</xliff:g>“"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Пребарај други апликации"</string> + <string name="notifications_header" msgid="1404149926117359025">"Известувања"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Допрете двапати и задржете за избор на кратенка."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Допрете двапати и задржете за избор на кратенка или користете приспособени дејства."</string> + <string name="out_of_space" msgid="4691004494942118364">"Нема повеќе простор на овој екран на почетната страница."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Нема повеќе простор на лентата „Омилени“"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Список со апликации"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Список со лични апликации"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Список со апликации за работа"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Почетна страница"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Отстрани"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Деинсталирај"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Инф. за апликација"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Инсталирај"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"инсталирај кратенки"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Овозможува апликацијата да додава кратенки без интервенција на корисникот."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"чита поставки и кратенки на почетна страница"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Овозможува апликацијата да ги менува подесувањата и кратенките на почетната страница."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"пишува поставки и кратенки на почетна страница"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Овозможува апликацијата да ги менува подесувањата и кратенките на почетната страница."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> нема дозвола за телефонски повици"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Проблем при вчитувањето на виџетот"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Поставување"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Ова е системска апликација и не може да се деинсталира."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Неименувана папка"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> е оневозможена"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g> има <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> известување</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> има <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> известувања</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"Страница %1$d од %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Екран на почетна страница %1$d од %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Нова страница на почетен екран"</string> + <string name="folder_opened" msgid="94695026776264709">"Отворена е папка, <xliff:g id="WIDTH">%1$d</xliff:g> на <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Допрете за да ја затворите папката"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Допрете за да го зачувате преименувањето"</string> + <string name="folder_closed" msgid="4100806530910930934">"Папката е затворена"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Папката е преименувана во <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Папка: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Виџети"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Тапети"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Поставки за Home"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Оневозможено од администраторот"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Дозволете ротација на Почетниот екран"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Кога телефонот се ротира"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Точки за известување"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Вклучено"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Исклучено"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Потребен е пристап до известувањата"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"За да се прикажуваат „Точки за известување“, вклучете ги известувањата за апликацијата <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Промени ги поставките"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Прикажи точки за известување"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Додај икона на почетниот екран"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"За нови апликации"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Променете ја формата на иконата"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"на „Почетен екран“"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Користи ја стандардната поставка на системот"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Квадрат"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Заоблен квадрат"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Круг"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Солза"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Се применуваат промените на формата на иконата"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Непознато"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Отстрани"</string> + <string name="abandoned_search" msgid="891119232568284442">"Барај"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Апликацијата не е инсталирана"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Апликацијата за оваа икона не е инсталирана. Може да ја отстраните или да се обидете да ја најдете апликацијата и да ја инсталирате рачно."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"Се презема <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="PROGRESS">%2$s</xliff:g> завршено"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> чека да се инсталира"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Виџети за <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Додај на Почетен екран"</string> + <string name="action_move_here" msgid="2170188780612570250">"Премести ја ставката овде"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Ставката е додадена на почетниот екран"</string> + <string name="item_removed" msgid="851119963877842327">"Ставката е отстранета"</string> + <string name="action_move" msgid="4339390619886385032">"Премести ја ставката"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Премести во ред <xliff:g id="NUMBER_0">%1$s</xliff:g> колона <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"Премести на место <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Премести на место <xliff:g id="NUMBER">%1$s</xliff:g> во омилени"</string> + <string name="item_moved" msgid="4606538322571412879">"Ставката е преместена"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Додај во папката: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"Додај во папка со <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Ставката е додадена во папката"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Создај папка со: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Папката е создадена"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Премести на Почетен екран"</string> + <string name="action_resize" msgid="1802976324781771067">"Промени големина"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Зголеми ширина"</string> + <string name="action_increase_height" msgid="459390020612501122">"Зголеми висина"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Намали ширина"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Намали висина"</string> + <string name="widget_resized" msgid="9130327887929620">"Големината на виџетот е променета на ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> висина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Кратенки"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> кратенки за <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> кратенки и <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> известувања за <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Отфрли"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Известувањето е отфрлено"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Лично"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"За работа"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Работен профил"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Најдете апликации за работа тука"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Секоја апликација за работа има значка, а организацијата се грижи за нејзината безбедност. За полесен пристап, преместете ги апликациите на почетниот екран."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Управувано од вашата организација"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Известувањата и апликациите се исклучени"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Затвори"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Затворено"</string> +</resources> diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 29e837b27..3a033153e 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Тапети"</string> <string name="settings_button_text" msgid="8873672322605444408">"Поставки за Home"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Оневозможено од администраторот"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Дозволете ротација на Почетниот екран"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Кога телефонот се ротира"</string> <string name="icon_badging_title" msgid="874121399231955394">"Точки за известување"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Вклучено"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Исклучено"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Намали висина"</string> <string name="widget_resized" msgid="9130327887929620">"Големината на виџетот е променета на ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> висина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Кратенки"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> кратенки за <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> кратенки и <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> известувања за <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Отфрли"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Известувањето е отфрлено"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Лично"</string> diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml new file mode 100644 index 000000000..a0609333c --- /dev/null +++ b/res/values-ml-rIN/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"ലോഞ്ചർ3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"ഔദ്യോഗികം"</string> + <string name="activity_not_found" msgid="8071924732094499514">"അപ്ലിക്കേഷൻ ഇൻസ്റ്റാളുചെയ്തിട്ടില്ല."</string> + <string name="activity_not_available" msgid="7456344436509528827">"അപ്ലിക്കേഷൻ ലഭ്യമല്ല"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"ഡൗൺലോഡുചെയ്ത അപ്ലിക്കേഷൻ സുരക്ഷാ മോഡിൽ പ്രവർത്തനരഹിതമാക്കി"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"സുരക്ഷിത മോഡിൽ വിജറ്റുകൾ പ്രവർത്തനരഹിതമാക്കി"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"കുറുക്കുവഴി ലഭ്യമല്ല"</string> + <string name="home_screen" msgid="806512411299847073">"ഹോം സ്ക്രീൻ"</string> + <string name="custom_actions" msgid="3747508247759093328">"ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്പർശിച്ച് പിടിക്കുക."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d വീതിയും %2$d ഉയരവും"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"സ്വമേധയാ സ്ഥാപിക്കുന്നതിന് സ്പർശിച്ചുപിടിക്കുക"</string> + <string name="place_automatically" msgid="8064208734425456485">"സ്വയമേവ ചേർക്കുക"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ആപ്പുകൾ തിരയുക"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"ആപ്പുകൾ ലോഡുചെയ്യുന്നു..."</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പുകളൊന്നും കണ്ടെത്തിയില്ല"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"കൂടുതൽ ആപ്പുകൾക്ക് തിരയുക"</string> + <string name="notifications_header" msgid="1404149926117359025">"അറിയിപ്പുകൾ"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"തിരഞ്ഞെടുക്കുന്നതിന് കുറുക്കുവഴി സ്പർശിച്ച് പിടിക്കുക."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"കുറുക്കുവഴി തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ 2 തവണ ടാപ്പ് ചെയ്ത് പിടിക്കുക."</string> + <string name="out_of_space" msgid="4691004494942118364">"ഈ ഹോം സ്ക്രീനിൽ ഒഴിവൊന്നുമില്ല."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"പ്രിയപ്പെട്ടവയുടെ ട്രേയിൽ ഒഴിവൊന്നുമില്ല"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"അപ്ലിക്കേഷനുകളുടെ ലിസ്റ്റ്"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"വ്യക്തിഗത ആപ്പുകളുടെ ലിസ്റ്റ്"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"ഔദ്യോഗിക ആപ്പുകളുടെ ലിസ്റ്റ്"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"ഹോം"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"നീക്കംചെയ്യുക"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"അൺഇൻസ്റ്റാളുചെയ്യുക"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"ആപ്പ് വിവരം"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ഇൻസ്റ്റാൾ ചെയ്യുക"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"കുറുക്കുവഴികൾ ഇൻസ്റ്റാളുചെയ്യുക"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"ഉപയോക്തൃ ഇടപെടൽ ഇല്ലാതെ കുറുക്കുവഴികൾ ചേർക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"ഹോം ക്രമീകരണങ്ങളും കുറുക്കുവഴികളും റീഡുചെയ്യുക"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"ഹോമിലെ ക്രമീകരണങ്ങളും കുറുക്കുവഴികളും റീഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"ഹോം ക്രമീകരണങ്ങളും കുറുക്കുവഴികളും റൈറ്റുചെയ്യുക"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"ഹോമിലെ ക്രമീകരണങ്ങളും കുറുക്കുവഴികളും മാറ്റാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"ഫോൺ കോൾ ചെയ്യാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനെ അനുവദിച്ചിട്ടില്ല"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"വിജറ്റ് ലോഡുചെയ്യുന്നതിൽ പ്രശ്നമുണ്ട്"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"സജ്ജീകരിക്കുക"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"ഇതൊരു സിസ്റ്റം അപ്ലിക്കേഷനായതിനാൽ അൺഇൻസ്റ്റാളുചെയ്യാനാവില്ല."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"പേരുനൽകാത്ത ഫോൾഡർ"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> പ്രവർത്തനരഹിതമാക്കി"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>-ന്, <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> അറിയിപ്പുകൾ ഉണ്ട്</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>-ന്, <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> അറിയിപ്പ് ഉണ്ട്</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"പേജ് %1$d / %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"ഹോം സ്ക്രീൻ %1$d / %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"പുതിയ ഹോം സ്ക്രീൻ പേജ്"</string> + <string name="folder_opened" msgid="94695026776264709">"ഫോൾഡർ തുറന്നു, <xliff:g id="WIDTH">%1$d</xliff:g> / <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ഫോൾഡർ അടയ്ക്കുന്നതിന് ടാപ്പുചെയ്യുക"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"പേരുമാറ്റം സംരക്ഷിക്കുന്നതിന് ടാപ്പുചെയ്യുക"</string> + <string name="folder_closed" msgid="4100806530910930934">"ഫോൾഡർ അടച്ചു"</string> + <string name="folder_renamed" msgid="1794088362165669656">"ഫോൾഡറിന്റെ പേര് <xliff:g id="NAME">%1$s</xliff:g> എന്നായി മാറ്റി"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ഫോൾഡർ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"വിജറ്റുകൾ"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"വാൾപേപ്പർ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ"</string> + <string name="icon_badging_title" msgid="874121399231955394">"അറിയിപ്പ് ഡോട്ടുകൾ"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ഓൺ"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"ഓഫ്"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"അറിയിപ്പിനായുള്ള ആക്സസ് ആവശ്യമാണ്"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"അറിയിപ്പ് ഡോട്ടുകൾ കാണിക്കുന്നതിന്, <xliff:g id="NAME">%1$s</xliff:g> എന്നയാളിനായുള്ള ആപ്പ് അറിയിപ്പുകൾ ഓണാക്കുക"</string> + <string name="title_change_settings" msgid="1376365968844349552">"ക്രമീകരണം മാറ്റുക"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"അറിയിപ്പ് ഡോട്ടുകൾ കാണിക്കുക"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"ഹോം സ്ക്രീനിലേക്ക് ഐക്കൺ ചേർക്കുക"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"പുതിയ ആപ്പുകൾക്ക്"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"ഐക്കണിന്റെ ആകാരം മാറ്റുക"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"ഹോം സ്ക്രീനിൽ"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"സിസ്റ്റം ഡിഫോൾട്ട് ഉപയോഗിക്കുക"</string> + <string name="icon_shape_square" msgid="633575066111622774">"ചതുരം"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"ചതുരവൃത്തം"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"വൃത്തം"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"കണ്ണുനീര് തുള്ളി"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"ഐക്കൺ ആകാര മാറ്റങ്ങൾ പ്രയോഗിക്കുന്നു"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"അജ്ഞാതം"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"നീക്കംചെയ്യുക"</string> + <string name="abandoned_search" msgid="891119232568284442">"തിരയുക"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"ഈ അപ്ലിക്കേഷൻ ഇൻസ്റ്റാളുചെയ്തിട്ടില്ല"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ഈ ഐക്കണുവേണ്ടി അപ്ലിക്കേഷൻ ഇൻസ്റ്റാളുചെയ്തിട്ടില്ല. നിങ്ങൾക്കത് നീക്കംചെയ്യാനാകും അല്ലെങ്കിൽ അപ്ലിക്കേഷനുവേണ്ടി തിരഞ്ഞുകൊണ്ട് അത് സ്വമേധയാ ഇൻസ്റ്റാളുചെയ്യുക."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ഡൗൺലോഡ് ചെയ്യുന്നു, <xliff:g id="PROGRESS">%2$s</xliff:g> പൂർത്തിയായി"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"ഇൻസ്റ്റാൾ ചെയ്യാൻ <xliff:g id="NAME">%1$s</xliff:g> കാക്കുന്നു"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> വിജറ്റുകൾ"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"ഹോം സ്ക്രീനിൽ ചേർക്കുക"</string> + <string name="action_move_here" msgid="2170188780612570250">"ഇനം ഇവിടേക്ക് നീക്കുക"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"ഹോം സ്ക്രീനിൽ ഇനം ചേർത്തു"</string> + <string name="item_removed" msgid="851119963877842327">"ഇനം നീക്കംചെയ്തു"</string> + <string name="action_move" msgid="4339390619886385032">"ഇനം നീക്കുക"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"വരി <xliff:g id="NUMBER_0">%1$s</xliff:g> നിര <xliff:g id="NUMBER_1">%2$s</xliff:g>-ലേക്ക് നീക്കുക"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g>-ലേക്ക് നീക്കുക"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"ഇഷ്ടമുള്ള <xliff:g id="NUMBER">%1$s</xliff:g> സ്ഥാനത്തേക്ക് നീക്കുക"</string> + <string name="item_moved" msgid="4606538322571412879">"ഇനം നീക്കി"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ഫോൾഡറിൽ ചേർക്കുക: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> ഉള്ള ഫോൾഡറിൽ ചേർക്കുക"</string> + <string name="added_to_folder" msgid="4793259502305558003">"ഫോൾഡറിൽ ഇനം ചേർത്തു"</string> + <string name="create_folder_with" msgid="4050141361160214248">"ഇതുപയോഗിച്ച് ഫോൾഡർ സൃഷ്ടിക്കുക: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"ഫോൾഡർ സൃഷ്ടിച്ചു"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"ഹോം സ്ക്രീനിലേക്ക് നീക്കുക"</string> + <string name="action_resize" msgid="1802976324781771067">"വലുപ്പംമാറ്റുക"</string> + <string name="action_increase_width" msgid="8773715375078513326">"വീതി കൂട്ടുക"</string> + <string name="action_increase_height" msgid="459390020612501122">"ഉയരം കൂട്ടുക"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"വീതി കുറയ്ക്കുക"</string> + <string name="action_decrease_height" msgid="282377193880900022">"ഉയരം കുറയ്ക്കുക"</string> + <string name="widget_resized" msgid="9130327887929620">"വീതി <xliff:g id="NUMBER_0">%1$s</xliff:g> ഉയരം <xliff:g id="NUMBER_1">%2$s</xliff:g>-ലേക്ക് വിഡ്ജെറ്റിന്റെ വലുപ്പം മാറ്റി"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"കുറുക്കുവഴികൾ"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> ആപ്പിനുള്ള <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> കുറുക്കുവഴികൾ"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> ആപ്പിനായുള്ള <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> കുറുക്കുവഴികളും <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> അറിയിപ്പുകളും"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"നിരസിക്കുക"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"അറിയിപ്പ് നിരസിച്ചു"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"വ്യക്തിപരം"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"ജോലി"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"ഔദ്യോഗിക ആപ്പുകൾ ഇവിടെ കണ്ടെത്തുക"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"എല്ലാ ഔദ്യോഗിക ആപ്പിനും ഒരു ബാഡ്ജ് ഉണ്ട്, നിങ്ങളുടെ സ്ഥാപനം അത് സുരക്ഷിതമായി സൂക്ഷിക്കുന്നു. എളുപ്പത്തിൽ ആക്സസ് ചെയ്യാൻ ആപ്പുകളെ ഹോം സ്ക്രീനിലേക്ക് നീക്കുക."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"നിങ്ങളുടെ സ്ഥാപനം നിയന്ത്രിക്കുന്നത്"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"അറിയിപ്പുകളും ആപ്പുകളും ഓഫാണ്"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"അടയ്ക്കുക"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"അടച്ചു"</string> +</resources> diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index 5ccac13e4..7ad2803df 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"വാൾപേപ്പർ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ"</string> <string name="icon_badging_title" msgid="874121399231955394">"അറിയിപ്പ് ഡോട്ടുകൾ"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ഓൺ"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"ഓഫ്"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"ഉയരം കുറയ്ക്കുക"</string> <string name="widget_resized" msgid="9130327887929620">"വീതി <xliff:g id="NUMBER_0">%1$s</xliff:g> ഉയരം <xliff:g id="NUMBER_1">%2$s</xliff:g>-ലേക്ക് വിഡ്ജെറ്റിന്റെ വലുപ്പം മാറ്റി"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"കുറുക്കുവഴികൾ"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> ആപ്പിനുള്ള <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> കുറുക്കുവഴികൾ"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> ആപ്പിനായുള്ള <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> കുറുക്കുവഴികളും <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> അറിയിപ്പുകളും"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"നിരസിക്കുക"</string> <string name="notification_dismissed" msgid="6002233469409822874">"അറിയിപ്പ് നിരസിച്ചു"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"വ്യക്തിപരം"</string> diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml new file mode 100644 index 000000000..a3507c5bb --- /dev/null +++ b/res/values-mn-rMN/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Ажил"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Апп суугаагүй байна."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Апп-г ашиглах боломжгүй"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Татаж авсан апп-г Аюулгүй горим дотроос идэвхгүйжүүлсэн"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Safe горимд виджетүүдийг идэвхгүйжүүлсэн"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Товчлол алга"</string> + <string name="home_screen" msgid="806512411299847073">"Үндсэн нүүр"</string> + <string name="custom_actions" msgid="3747508247759093328">"Захиалгат үйлдэл"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Виджетийг авах бол хүрээд барина уу."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d өргөн %2$d өндөр"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Гараар байршуулахын тулд дараад хүлээнэ үү"</string> + <string name="place_automatically" msgid="8064208734425456485">"Автоматаар нэмэх"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Апп хайх"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Аппыг ачааллаж байна..."</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"-д тохирох апп олдсонгүй"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Бусад апп-г хайх"</string> + <string name="notifications_header" msgid="1404149926117359025">"Мэдэгдэл"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Товчлол авах бол удаан дарна уу."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Товчлол авах эсвэл тохируулсан үйлдлийг ашиглахын тулд давхар товшоод хүлээнэ үү."</string> + <string name="out_of_space" msgid="4691004494942118364">"Энэ Нүүр дэлгэц зайгүй."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"\"Дуртай\" трей дээр өөр зай байхгүй байна"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Апп-н жагсаалт"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Хувийн аппын жагсаалт"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Ажлын аппын жагсаалт"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Нүүр"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Арилгах"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Устгах"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Апп-н мэдээлэл"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Суулгах"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"товчлол суулгах"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Апп нь хэрэглэгчийн оролцоогүйгээр товчлолыг нэмэж чадна"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"Нүүрний тохиргоо болон товчлолыг унших"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Апп нь Нүүрэндэх товчлол болон тохиргоог уншиж чадна."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"Нүүрний тохиргоо болон товчлолыг бичих"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Апп нь Нүүрэндэх товчлол болон тохиргоог өөрчилж чадна."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> утасны дуудлага хийх боломжгүй"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Виджет ачаалахад асуудал гарав"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Тохируулга"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Энэ апп нь системийн апп ба устгах боломжгүй."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Нэргүй фолдер"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г идэвхгүй болгосон"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> мэдэгдэл байна</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>, <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> мэдэгдэл байна</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%2$d-н %1$d хуудас"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d-н Нүүр дэлгэц %1$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Шинэ үндсэн нүүр хуудас"</string> + <string name="folder_opened" msgid="94695026776264709">"<xliff:g id="WIDTH">%1$d</xliff:g> <xliff:g id="HEIGHT">%2$d</xliff:g> фолдер нээгдэв"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Фолдерийг хаахын тулд дарна уу"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Шинэ нэрийг хадгалахын тулд дарна уу."</string> + <string name="folder_closed" msgid="4100806530910930934">"Фолдер хаагдав"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Фолдерын нэр <xliff:g id="NAME">%1$s</xliff:g> болов"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Фолдер: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Виджет"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Ханын зураг"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Утсыг эргүүлсэн үед"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Мэдэгдлийн цэг"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Асаалттай"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Унтраалттай"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Мэдэгдлийн хандалт шаардлагатай"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Мэдэгдлийн цэгийг харуулахын тулд <xliff:g id="NAME">%1$s</xliff:g>-д аппын мэдэгдлийг асаана уу"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Тохиргоог өөрчлөх"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Мэдэгдлийн цэгийг харуулах"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Нүүр хуудаст дүрс тэмдэг нэмэх"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Шинэ аппад зориулсан"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Дүрс тэмдгийн хэлбэрийг өөрчлөх"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"Үндсэн нүүр хэсэгт"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Системийн өгөгдмөл тохиргоог ашиглах"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Дөрвөлжин"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Мохоо өнцөгтэй дөрвөлжин"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Дугуй"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Дусал"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Дүрс тэмдгийн хэлбэрийг өөрчилж байна"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Тодорхойгүй"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Устгах"</string> + <string name="abandoned_search" msgid="891119232568284442">"Хайх"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Энэ апп-г суулгаагүй байна"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Энэ дүрсний апп-г суулгаагүй байна. Та үүнийг устгах буюу апп-г хайж суулгах боломжтой."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g>-г татаж байна, <xliff:g id="PROGRESS">%2$s</xliff:g> татсан"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> нь суулгахыг хүлээж байна"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> жижиг хэрэгсэл"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Нүүр дэлгэц нэмэх"</string> + <string name="action_move_here" msgid="2170188780612570250">"Энд байршуулах"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Нүүр дэлгэцэнд нэмсэн зүйл"</string> + <string name="item_removed" msgid="851119963877842327">"Арилгасан зүйл"</string> + <string name="action_move" msgid="4339390619886385032">"Зөөх"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"<xliff:g id="NUMBER_0">%1$s</xliff:g> мөр <xliff:g id="NUMBER_1">%2$s</xliff:g> баганад зөөх"</string> + <string name="move_to_position" msgid="6750008980455459790">"Байршил <xliff:g id="NUMBER">%1$s</xliff:g>-д зөөх"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Дуртай байршил болох <xliff:g id="NUMBER">%1$s</xliff:g>-д зөөх"</string> + <string name="item_moved" msgid="4606538322571412879">"Зөөвөрлөсөн зүйл"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Хавтас: <xliff:g id="NAME">%1$s</xliff:g> руу нэм"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g>-тай хавтас нэмэх"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Хавтсанд нэмэгдсэн зүйл"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Хавтсыг: <xliff:g id="NAME">%1$s</xliff:g> нэрээр үүсгэ"</string> + <string name="folder_created" msgid="6409794597405184510">"Үүсгэсэн хавтас"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Нүүр дэлгэц рүү зөөх"</string> + <string name="action_resize" msgid="1802976324781771067">"Хэмжээг өөрчлөх"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Өргөсгөх"</string> + <string name="action_increase_height" msgid="459390020612501122">"Өндөрсгөх"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Нарийсгах"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Намсгах"</string> + <string name="widget_resized" msgid="9130327887929620">"Виджэтийн өргөн <xliff:g id="NUMBER_0">%1$s</xliff:g>, өндөр <xliff:g id="NUMBER_1">%2$s</xliff:g> болсон"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Товчлол"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> товчлол"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> товчлол болон <xliff:g id="APP_NAME">%3$s</xliff:g>-н <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> мэдэгдэл"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Хаах"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Мэдэгдлийг хаасан"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Хувийн"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Ажил"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Ажлын профайл"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Ажлын аппыг эндээс олно уу"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Ажлын апп тус бүр тэмдэгтэй ба эдгээрийг танай байгууллагаас аюулгүй байлгадаг. Аппуудад хялбар хандахын тулд тэдгээрийг Үндсэн нүүр хэсэгт зөөнө үү."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Танай байгууллагаас удирддаг"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Мэдэгдэл, апп унтраалттай байна"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Хаах"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Хаасан"</string> +</resources> diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 7c0b00ec7..3dcc49542 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Ханын зураг"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Утсыг эргүүлсэн үед"</string> <string name="icon_badging_title" msgid="874121399231955394">"Мэдэгдлийн цэг"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Асаалттай"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Унтраалттай"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Намсгах"</string> <string name="widget_resized" msgid="9130327887929620">"Виджэтийн өргөн <xliff:g id="NUMBER_0">%1$s</xliff:g>, өндөр <xliff:g id="NUMBER_1">%2$s</xliff:g> болсон"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Товчлол"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> товчлол"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> товчлол болон <xliff:g id="APP_NAME">%3$s</xliff:g>-н <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> мэдэгдэл"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Хаах"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Мэдэгдлийг хаасан"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Хувийн"</string> diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml new file mode 100644 index 000000000..bf1e18805 --- /dev/null +++ b/res/values-mr-rIN/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"कार्य"</string> + <string name="activity_not_found" msgid="8071924732094499514">"अॅप इंस्टॉल केलेला नाही."</string> + <string name="activity_not_available" msgid="7456344436509528827">"अॅप उपलब्ध नाही"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"डाउनलोड केलेला अॅप सुरक्षित मोड मध्ये अक्षम केला"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"विजेट सुरक्षित मोडमध्ये अक्षम झाले"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"शॉर्टकट उपलब्ध नाही"</string> + <string name="home_screen" msgid="806512411299847073">"होम स्क्रीन"</string> + <string name="custom_actions" msgid="3747508247759093328">"कस्टम क्रिया"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा कस्टम क्रिया वापरा."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d रूंद बाय %2$d उंच"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"स्वतः ठेवण्यासाठी स्पर्श करा आणि धरून ठेवा"</string> + <string name="place_automatically" msgid="8064208734425456485">"अापोआप जोडा"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"अॅप्स शोधा"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"अॅप्स लोड करत आहे…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"अधिक अॅप्स शोधा"</string> + <string name="notifications_header" msgid="1404149926117359025">"सूचना"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"शॉर्टकट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"शॉर्टकट निवडण्यासाठी किंवा कस्टम क्रिया वापरण्यासाठी दोनदा टॅप करा आणि धरून ठेवा."</string> + <string name="out_of_space" msgid="4691004494942118364">"या मुख्य स्क्रीनवर आणखी जागा नाही."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"आवडीच्या ट्रे मध्ये आणखी जागा नाही"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"अॅप्स सूची"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"वैयक्तिक अॅप्स सूची"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"कामाच्या ठिकाणी वापरली जाणाऱ्या अॅप्सची सूची"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"होम"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"काढा"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"अनइंस्टॉल करा"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"अॅप माहिती"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"इंस्टॉल करा"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"शॉर्टकट स्थापित करा"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"वापरकर्ता हस्तक्षेपाशिवाय शॉर्टकट जोडण्यास अॅप ला अनुमती देते."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"होम सेटिंग्ज आणि शॉर्टकट वाचा"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"मुख्यपृष्ठातील सेटिंग्ज आणि शॉर्टकट वाचण्यास अॅप ला अनुमती देते."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"होम सेटिंग्ज आणि शॉर्टकट लिहा"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"मुख्यपृष्ठातील सेटिंग्ज आणि शॉर्टकट बदलण्यास अॅप ला अनुमती देते."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> ला फोन कॉल करण्याची अनुमती नाही"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"विजेट लोड करण्यात समस्या"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"सेटअप"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"हा सिस्टम अॅप आहे आणि अनइंस्टॉल केला जाऊ शकत नाही."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"अनामित फोल्डर"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> अक्षम केला आहे"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, कडे <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> सूचना आहे</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, कडे <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> सूचना आहेत</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%2$d पैकी %1$d पृष्ठ"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d पैकी %1$d मुख्य स्क्रीन"</string> + <string name="workspace_new_page" msgid="257366611030256142">"नवीन मुख्य स्क्रीन पृष्ठ"</string> + <string name="folder_opened" msgid="94695026776264709">"फोल्डर उघडले, <xliff:g id="WIDTH">%1$d</xliff:g> बाय <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"फोल्डर बंद करण्यासाठी टॅप करा"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"पुनर्नामित करणे सेव्ह करण्यासाठी टॅप करा"</string> + <string name="folder_closed" msgid="4100806530910930934">"फोल्डर बंद"</string> + <string name="folder_renamed" msgid="1794088362165669656">"फोल्डरचे नाव बदलून <xliff:g id="NAME">%1$s</xliff:g> असे ठेवले"</string> + <string name="folder_name_format" msgid="6629239338071103179">"फोल्डर: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"विजेट"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"वॉलपेपर"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"फोन फिरविला जातो तेव्हा"</string> + <string name="icon_badging_title" msgid="874121399231955394">"सूचना बिंदू"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"चालू"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"बंद"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"सूचनांच्या अॅक्सेसची आवश्यकता आहे"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"सूचना बिंदू दाखवण्यासाठी, <xliff:g id="NAME">%1$s</xliff:g> साठी अॅप सूचना चालू करा"</string> + <string name="title_change_settings" msgid="1376365968844349552">"सेटिंग्ज बदला"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"सूचना बिंदू दाखवा"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"होम स्क्रीनवर आयकन जोडा"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"नवीन अॅप्ससाठी"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"चिन्हाचा आकार बदला"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"होम स्क्रीनवर"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"सिस्टमचे डीफॉल्ट वापरा"</string> + <string name="icon_shape_square" msgid="633575066111622774">"चौरस"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"गोलाकार चौरस"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"वर्तुळ"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"अश्रू"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"चिन्हाचा आकार बदल लागू करत आहे"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"अज्ञात"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"काढा"</string> + <string name="abandoned_search" msgid="891119232568284442">"शोधा"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"हा अॅप इंस्टॉल केलेला नाही"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"या चिन्हासाठी अॅप इंस्टॉल केलेला नाही. तुम्ही ते काढू शकता किंवा अॅपचा शोध घेऊ शकता आणि त्यास व्यक्तिचलितपणे इंस्टॉल करू शकता."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> डाउनलोड होत आहे , <xliff:g id="PROGRESS">%2$s</xliff:g> पूर्ण झाले"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> इंस्टॉल करण्याची प्रतिक्षा करत आहे"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> विजेट"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"होम स्क्रीनवर जोडा"</string> + <string name="action_move_here" msgid="2170188780612570250">"आयटम येथे हलवा"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"आयटम मुख्य स्क्रीनवर जोडला"</string> + <string name="item_removed" msgid="851119963877842327">"आयटम काढला"</string> + <string name="action_move" msgid="4339390619886385032">"आयटम हलवा"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"पंक्ति <xliff:g id="NUMBER_0">%1$s</xliff:g> स्तंभ <xliff:g id="NUMBER_1">%2$s</xliff:g> मध्ये हलवा"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g> स्थानावर हलवा"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"आवडत्या <xliff:g id="NUMBER">%1$s</xliff:g> स्थानावर हलवा"</string> + <string name="item_moved" msgid="4606538322571412879">"आयटम हलविला"</string> + <string name="add_to_folder" msgid="9040534766770853243">"फोल्डरवर जोडा: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> सह फोल्डरमध्ये जोडा"</string> + <string name="added_to_folder" msgid="4793259502305558003">"फोल्डरमध्ये आयटम जोडले"</string> + <string name="create_folder_with" msgid="4050141361160214248">"यासह फोल्डर तयार करा: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"फोल्डर तयार केले"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"मुख्य स्क्रीनवर हलवा"</string> + <string name="action_resize" msgid="1802976324781771067">"आकार बदला"</string> + <string name="action_increase_width" msgid="8773715375078513326">"रूंदी वाढवा"</string> + <string name="action_increase_height" msgid="459390020612501122">"उंची वाढवा"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"रुंदी कमी करा"</string> + <string name="action_decrease_height" msgid="282377193880900022">"उंची कमी करा"</string> + <string name="widget_resized" msgid="9130327887929620">"विजेटचा आकार रुंदी <xliff:g id="NUMBER_0">%1$s</xliff:g> उंची <xliff:g id="NUMBER_1">%2$s</xliff:g> मध्ये बदलला"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"शॉर्टकट"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> साठी <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> शॉर्टकट"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g>साठी <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> शॉर्टकट आणि <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> सूचना"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"डिसमिस करा"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"सूचना डिसमिस केली"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"वैयक्तिक"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"कार्यालय"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"कार्य प्रोफाइल"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"कामाची अॅप्स येथे मिळवा"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"प्रत्येक कार्य अॅपला एक बॅज असतो आणि तो तुमच्या संस्थेकडून सुरक्षित ठेवला जातो. अधिक सहज अॅक्सेससाठी अॅप्स तुमच्या होम स्क्रीनवर हलवा."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"तुमच्या संस्थेकडून व्यवस्थापित"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"सूचना आणि अॅप्स बंद आहेत"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"बंद करा"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"बंद केले"</string> +</resources> diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 0e2f9c808..7b9aebd8a 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -28,9 +28,9 @@ <string name="safemode_widget_error" msgid="4863470563535682004">"विजेट सुरक्षित मोडमध्ये अक्षम झाले"</string> <string name="shortcut_not_available" msgid="2536503539825726397">"शॉर्टकट उपलब्ध नाही"</string> <string name="home_screen" msgid="806512411299847073">"होम स्क्रीन"</string> - <string name="custom_actions" msgid="3747508247759093328">"सानुकूल क्रिया"</string> + <string name="custom_actions" msgid="3747508247759093328">"कस्टम क्रिया"</string> <string name="long_press_widget_to_add" msgid="7699152356777458215">"विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा."</string> - <string name="long_accessible_way_to_add" msgid="4289502106628154155">"एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा कस्टम क्रिया वापरा."</string> <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d रूंद बाय %2$d उंच"</string> <string name="add_item_request_drag_hint" msgid="5899764264480397019">"स्वतः ठेवण्यासाठी स्पर्श करा आणि धरून ठेवा"</string> @@ -73,7 +73,7 @@ <string name="workspace_new_page" msgid="257366611030256142">"नवीन मुख्य स्क्रीन पृष्ठ"</string> <string name="folder_opened" msgid="94695026776264709">"फोल्डर उघडले, <xliff:g id="WIDTH">%1$d</xliff:g> बाय <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> <string name="folder_tap_to_close" msgid="4625795376335528256">"फोल्डर बंद करण्यासाठी टॅप करा"</string> - <string name="folder_tap_to_rename" msgid="4017685068016979677">"पुनर्नामित करणे जतन करण्यासाठी टॅप करा"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"पुनर्नामित करणे सेव्ह करण्यासाठी टॅप करा"</string> <string name="folder_closed" msgid="4100806530910930934">"फोल्डर बंद"</string> <string name="folder_renamed" msgid="1794088362165669656">"फोल्डरचे नाव बदलून <xliff:g id="NAME">%1$s</xliff:g> असे ठेवले"</string> <string name="folder_name_format" msgid="6629239338071103179">"फोल्डर: <xliff:g id="NAME">%1$s</xliff:g>"</string> @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"वॉलपेपर"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"फोन फिरविला जातो तेव्हा"</string> <string name="icon_badging_title" msgid="874121399231955394">"सूचना बिंदू"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"चालू"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"बंद"</string> @@ -102,7 +104,7 @@ <string name="abandoned_clean_this" msgid="7610119707847920412">"काढा"</string> <string name="abandoned_search" msgid="891119232568284442">"शोधा"</string> <string name="abandoned_promises_title" msgid="7096178467971716750">"हा अॅप इंस्टॉल केलेला नाही"</string> - <string name="abandoned_promise_explanation" msgid="3990027586878167529">"या चिन्हासाठी अॅप इंस्टॉल केलेला नाही. आपण ते काढू शकता किंवा अॅपचा शोध घेऊ शकता आणि त्यास व्यक्तिचलितपणे इंस्टॉल करू शकता."</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"या चिन्हासाठी अॅप इंस्टॉल केलेला नाही. तुम्ही ते काढू शकता किंवा अॅपचा शोध घेऊ शकता आणि त्यास व्यक्तिचलितपणे इंस्टॉल करू शकता."</string> <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> डाउनलोड होत आहे , <xliff:g id="PROGRESS">%2$s</xliff:g> पूर्ण झाले"</string> <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> इंस्टॉल करण्याची प्रतिक्षा करत आहे"</string> <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> विजेट"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"उंची कमी करा"</string> <string name="widget_resized" msgid="9130327887929620">"विजेटचा आकार रुंदी <xliff:g id="NUMBER_0">%1$s</xliff:g> उंची <xliff:g id="NUMBER_1">%2$s</xliff:g> मध्ये बदलला"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"शॉर्टकट"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> साठी <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> शॉर्टकट"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g>साठी <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> शॉर्टकट आणि <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> सूचना"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"डिसमिस करा"</string> <string name="notification_dismissed" msgid="6002233469409822874">"सूचना डिसमिस केली"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"वैयक्तिक"</string> diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml new file mode 100644 index 000000000..3c223b633 --- /dev/null +++ b/res/values-ms-rMY/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Kerja"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Apl tidak dipasang."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Apl tidak tersedia"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Apl yang dimuat turun dilumpuhkan dalam mod Selamat"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Widget dilumpuhkan dalam mod Selamat"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Pintasan tidak tersedia"</string> + <string name="home_screen" msgid="806512411299847073">"Skrin utama"</string> + <string name="custom_actions" msgid="3747508247759093328">"Tindakan tersuai"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Sentuh & tahan untuk mengambil widget."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"Lebar %1$d kali tinggi %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Sentuh & tahan untuk meletakkan widget/ikon secara manual"</string> + <string name="place_automatically" msgid="8064208734425456485">"Tambahkan secara automatik"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Cari apl"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Memuatkan apl…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"Tiada apl yang ditemui sepadan dengan \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Cari lagi apl"</string> + <string name="notifications_header" msgid="1404149926117359025">"Pemberitahuan"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Sentuh & tahan untuk mengambil pintasan."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Ketik dua kali & tahan untuk mengambil pintasan atau menggunakan tindakan tersuai."</string> + <string name="out_of_space" msgid="4691004494942118364">"Tiada lagi ruang pada skrin Laman Utama ini."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Tiada ruang dalam dulang Kegemaran lagi"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Senarai apl"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Senarai apl peribadi"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Senarai apl kerja"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Laman Utama"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Alih keluar"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Nyahpasang"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Maklumat apl"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Pasang"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"pasang pintasan"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Membenarkan apl menambah pintasan tanpa campur tangan pengguna."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"baca tetapan dan pintasan Laman Utama"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Membenarkan apl membaca tetapan dan pintasan di Laman Utama."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"tulis tetapan dan pintasan Laman Utama"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Membenarkan apl menukar tetapan dan pintasan di Laman Utama."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak dibenarkan membuat panggilan telefon"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Masalah memuatkan widget"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Persediaan"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Ini ialah apl sistem dan tidak boleh dinyahpasang."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Folder Tanpa Nama"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> dilumpuhkan"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, mempunyai <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> pemberitahuan</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>, mempunyai <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> pemberitahuan</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"Halaman %1$d daripada %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Skrin Laman Utama %1$d daripada %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Halaman skrin utama baharu"</string> + <string name="folder_opened" msgid="94695026776264709">"Folder dibuka, <xliff:g id="WIDTH">%1$d</xliff:g> kali <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Ketik untuk menutup folder"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Ketik untuk menyimpan penamaan semula"</string> + <string name="folder_closed" msgid="4100806530910930934">"Folder ditutup"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Folder dinamakan semula kepada <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Widget"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Kertas dinding"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Tetapan laman utama"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dilumpuhkan oleh pentadbir anda"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Benarkan putaran Skrin Utama"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Apabila telefon diputar"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Titik pemberitahuan"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Hidup"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Mati"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Akses pemberitahuan diperlukan"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Untuk menunjukkan Titik Pemberitahuan, hidupkan pemberitahuan apl untuk <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Tukar tetapan"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Tunjukkan titik pemberitahuan"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Tambahkan ikon pada Skrin Utama"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Untuk apl baharu"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Tukar bentuk ikon"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"pada Skrin Utama"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Gunakan lalai sistem"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Segi empat sama"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Segi empat berbucu bulat"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Bulatan"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Titisan air mata"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Menggunakan perubahan bentuk ikon"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Tidak diketahui"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Alih keluar"</string> + <string name="abandoned_search" msgid="891119232568284442">"Carian"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Apl ini tidak dipasang"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Apl untuk ikon ini tidak dipasang. Anda boleh mengalih keluar atau mencari dan memasang apl itu secara manual."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> memuat turun, <xliff:g id="PROGRESS">%2$s</xliff:g> selesai"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> menunggu untuk dipasang"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Widget <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Tambahkan pada Skrin Utama"</string> + <string name="action_move_here" msgid="2170188780612570250">"Alihkan item ke sini"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Item ditambahkan pada skrin utama"</string> + <string name="item_removed" msgid="851119963877842327">"Item dialih keluar"</string> + <string name="action_move" msgid="4339390619886385032">"Alihkan Item"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Alihkan ke baris <xliff:g id="NUMBER_0">%1$s</xliff:g> lajur <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"Alihkan ke kedudukan <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Alihkan ke kedudukan kegemaran <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="item_moved" msgid="4606538322571412879">"Item dialihkan"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Tambahkan pada folder: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"Tambahkan pada folder dengan <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Item ditambahkan pada folder"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Buat folder dengan: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Folder dibuat"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Alihkan ke Skrin Utama"</string> + <string name="action_resize" msgid="1802976324781771067">"Ubah saiz"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Tambahkan kelebaran"</string> + <string name="action_increase_height" msgid="459390020612501122">"Tambahkan ketinggian"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Kurangkan kelebaran"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Kurangkan ketinggian"</string> + <string name="widget_resized" msgid="9130327887929620">"Saiz widget diubah menjadi <xliff:g id="NUMBER_0">%1$s</xliff:g> lebar <xliff:g id="NUMBER_1">%2$s</xliff:g> tinggi"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Pintasan"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> pintasan untuk <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> pintasan dan <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> pemberitahuan untuk <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Ketepikan"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Pemberitahuan diketepikan"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Peribadi"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Kerja"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Profil kerja"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Temui apl kerja di sini"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Setiap apl kerja terdapat lencana dan dilindungi oleh organisasi anda. Alihkan apl ke Skrin Utama untuk akses yang lebih mudah."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Diurus oleh organisasi anda"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Pemberitahuan dan apl dimatikan"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Tutup"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Ditutup"</string> +</resources> diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index 130e00838..ea178b89d 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Kertas dinding"</string> <string name="settings_button_text" msgid="8873672322605444408">"Tetapan laman utama"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dilumpuhkan oleh pentadbir anda"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Benarkan putaran Skrin Utama"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Apabila telefon diputar"</string> <string name="icon_badging_title" msgid="874121399231955394">"Titik pemberitahuan"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Hidup"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Mati"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Kurangkan ketinggian"</string> <string name="widget_resized" msgid="9130327887929620">"Saiz widget diubah menjadi <xliff:g id="NUMBER_0">%1$s</xliff:g> lebar <xliff:g id="NUMBER_1">%2$s</xliff:g> tinggi"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Pintasan"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> pintasan untuk <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> pintasan dan <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> pemberitahuan untuk <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Ketepikan"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Pemberitahuan diketepikan"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Peribadi"</string> diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml new file mode 100644 index 000000000..59ac4cad3 --- /dev/null +++ b/res/values-my-rMM/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"ဖွင့်တင်စက်၃"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"အလုပ်"</string> + <string name="activity_not_found" msgid="8071924732094499514">"အက်ပ်မထည့်သွင်းထားပါ"</string> + <string name="activity_not_available" msgid="7456344436509528827">"အက်ပ်လက်လှမ်း မမှီပါ"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"ဒေါင်းလုဒ် အက်ပ်ကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"ဖြတ်လမ်း မရနိုင်ပါ"</string> + <string name="home_screen" msgid="806512411299847073">"ပင်မစာမျက်နှာ"</string> + <string name="custom_actions" msgid="3747508247759093328">"စိတ်ကြိုက် လုပ်ဆောင်ချက်များ"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ"</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"အလျား %1$d နှင့် အမြင့် %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"ကိုယ်တိုင်ထည့်ရန် ထိထားပါ"</string> + <string name="place_automatically" msgid="8064208734425456485">"အလိုအလျောက် ထည့်ရန်"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ရှာဖွေမှု အက်ပ်များ"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"အက်ပ်များကို ဖွင့်နေသည်…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" နှင့်ကိုက်ညီသည့် အပ်ပ်များကို မတွေ့ပါ"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"နောက်ထပ် အက်ပ်များကို ရှာပါ"</string> + <string name="notifications_header" msgid="1404149926117359025">"အကြောင်းကြားချက်များ"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"ဖြတ်လမ်းလင့်ခ်တစ်ခုကို ရွေးရန် ထိပြီး ဖိထားပါ။"</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"ဖြတ်လမ်းလင့်ခ်ကို ရွေးရန် (သို့) စိတ်ကြိုက်လုပ်ဆောင်ချက်များကို သုံးရန် နှစ်ချက်တို့ပြီး ဖိထားပါ။"</string> + <string name="out_of_space" msgid="4691004494942118364">"ဤပင်မမျက်နှာစာတွင် နေရာလွတ် မကျန်တော့ပါ"</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"အနှစ်သက်ဆုံးများ ထားရာတွင် နေရာလွတ် မကျန်တော့ပါ"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"အက်ပ်စာရင်း"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"တစ်ကိုယ်ရေသုံး အက်ပ်စာရင်း"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"အလုပ်သုံး အက်ပ်စာရင်း"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"ပင်မစာမျက်နှာ"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"ဖယ်ရှားမည်"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"ဖယ်ထုတ်မည်"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"အက်ပ်အချက်အလက်များ"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ထည့်သွင်းရန်"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"အတိုကောက်မှတ်သားမှုများအား ထည့်သွင်းခြင်း"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"အသုံးပြုသူ လုပ်ဆောင်မှုမရှိပဲ အပ်ပလီကေးရှင်းကို အတိုကောက်မှတ်သားမှုများ ပြုလုပ်ခွင့် ပေးခြင်း"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"ပင်မမျက်နှာစာ အပြင်အဆင် နှင့် အတိုကောက်မှတ်သားမှုများအား ဖတ်ခြင်း"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"ပင်မမျက်နှာစာတွင်ရှိသော အပြင်အဆင်နှင့် အတိုကောက်မှတ်သားမှုများကို အပ်ပလီကေးရှင်းအား ဖတ်ခွင့်ပြုခြင်း"</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"ပင်မမျက်နှာစာ အပြင်အဆင် နှင့် အတိုကောက်မှတ်သားမှုများအား ရေးသားခြင်း"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"ပင်မမျက်နှာစာတွင် ရှိသော အပြင်အဆင် နှင့် အတိုကောက်မှတ်သားမှုများ ကို အပ်ပလီကေးရှင်းအား ပြောင်းခွင့်ပြုခြင်း"</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g>သည် ဖုန်းခေါ်ဆိုခွင့် မရှိပါ"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"ဝဒ်ဂျက် တင်ရာတွင် ပြသနာ ရှိပါသည်"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"စဖွင့်သတ်မှတ်ရန်"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"ဤအပ်ပလီကေးရှင်းမှာ စစ်စတန်ပိုင်းဆိုင်ရာ အပ်ပလီကေးရှင်းဖြစ်ပါသည်။ ထုတ်ပစ်၍ မရပါ"</string> + <string name="folder_hint_text" msgid="6617836969016293992">"အမည်မရှိအကန့်"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> ကို ပိတ်ထားသည်"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> တွင် အကြောင်းကြားချက် <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> ခု ရှိသည်</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g> တွင် အကြောင်းကြားချက် <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> ခု ရှိသည်</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"စာမျက်နှာ %1$d မှ %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"ပင်မစာမျက်နှာ %1$d မှ %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"ပင်မမျက်နှာပြင် စာမျက်နှာသစ်"</string> + <string name="folder_opened" msgid="94695026776264709">"ဖွင့်ထားသောအကန့်, <xliff:g id="WIDTH">%1$d</xliff:g> နှင့် <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ဖိုင်တွဲကို ပိတ်ရန် တို့ပါ"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"အမည်ပြောင်းခြင်းကို သိမ်းဆည်းရန် တို့ပါ"</string> + <string name="folder_closed" msgid="4100806530910930934">"ပိတ်ထားသောအကန့်"</string> + <string name="folder_renamed" msgid="1794088362165669656">"ပြောင်းလဲလိုက်သော အကန့်အမည် <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"အကန့်အမည်: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"ဝိဂျက်များ"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"နောက်ခံများ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ဖုန်းကိုလှည့်ထားစဉ်"</string> + <string name="icon_badging_title" msgid="874121399231955394">"အကြောင်းကြားချက်အမှတ်အသားများ"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ဖွင့်ထားသည်"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"ပိတ်ထားသည်"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"အကြောင်းကြားချက် အသုံးပြုခွင့် လိုအပ်သည်"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"အကြောင်းကြားချက် အစက်များကို ပြသရန် <xliff:g id="NAME">%1$s</xliff:g> အတွက် အက်ပ်အကြောင်းကြားချက်များကို ဖွင့်ပါ"</string> + <string name="title_change_settings" msgid="1376365968844349552">"ဆက်တင်များ ပြောင်းရန်"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"အကြောင်းကြားချက် အမှတ်အသားများကို ပြရန်"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"အက်ပ်အသစ်များအတွက်"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"သင်္ကေတပုံစံကို ပြောင်းရန်"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"\'ပင်မမျက်နှာပြင်\' ပေါ်တွင်"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"စနစ်၏ မူရင်းပုံကို အသုံးပြုရန်"</string> + <string name="icon_shape_square" msgid="633575066111622774">"လေးထောင့်"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"စတုရန်းမကျ စက်ဝိုင်းမကျပုံ"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"စက်ဝိုင်း"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"မျက်ရည်စက်ပုံ"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"သင်္ကေတပုံစံကို ပြောင်းလဲနေသည်"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"မသိရ"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"ဖယ်ရှားရန်"</string> + <string name="abandoned_search" msgid="891119232568284442">"ရှာဖွေရန်"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"အက်ပ်မတပ်ဆင်ရသေးပါ"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ဤအိုင်ကွန်အတွက် အက်ပ်အားမထည့်သွင်းထားပါ။ You can remove it, or search for the အက်ပ်and install it manually."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ဒေါင်းလုဒ်လုပ်နေသည်၊ <xliff:g id="PROGRESS">%2$s</xliff:g> ပြီးပါပြီ"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ကိုထည့်သွင်းရန်စောင့်နေသည်"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> ဝိဂျက်များ"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"ပင်မမျက်နှာစာသို့ ထည့်ပါ"</string> + <string name="action_move_here" msgid="2170188780612570250">"၎င်းအား ဤသို့ ရွှေ့ပါ"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"ပင်မ ဖန်မျက်နှာပြင်သို့ ထည့်ပြီး၏"</string> + <string name="item_removed" msgid="851119963877842327">"၎င်းအား ဖယ်ရှားပြီး၏"</string> + <string name="action_move" msgid="4339390619886385032">"၎င်းအား ရွှေ့ပါ"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"အတန်း <xliff:g id="NUMBER_0">%1$s</xliff:g> အတိုင် <xliff:g id="NUMBER_1">%2$s</xliff:g> သို့ ရွှေ့ပါ"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g> သို့ နေရာရွှေ့ပါ"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"စိတ်ကြိုက်နေရာ <xliff:g id="NUMBER">%1$s</xliff:g> သို့ ရွှေ့ပါ"</string> + <string name="item_moved" msgid="4606538322571412879">"၎င်းအားရွှေ့ပြီး"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ဖိုလ်ဒါသို့ ထည့်ရန်- <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> အမည်ရှိ ဖိုလ်ဒါသို့ ထည့်ပြီး၏"</string> + <string name="added_to_folder" msgid="4793259502305558003">"ဖိုလ်ဒါသို့ ထည့်ပြီး"</string> + <string name="create_folder_with" msgid="4050141361160214248">"ဖိုလ်ဒါ ပြုလုပ်ရန်- <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"ဖိုလ်ဒါ ပြုလုပ်ပြီး"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"ပင်မမျက်နှာပြင်သို့ ရွှေ့ပါ"</string> + <string name="action_resize" msgid="1802976324781771067">"အရွယ်အစားပြောင်းပါ"</string> + <string name="action_increase_width" msgid="8773715375078513326">"အကျယ်အား တိုးပါ"</string> + <string name="action_increase_height" msgid="459390020612501122">"အမြင့်အား တိုးပါ"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"အကျယ်အား လျှော့ပါ"</string> + <string name="action_decrease_height" msgid="282377193880900022">"အမြင့်အား လျှော့ပါ"</string> + <string name="widget_resized" msgid="9130327887929620">"Widget အား အကျယ် <xliff:g id="NUMBER_0">%1$s</xliff:g> အမြင့် <xliff:g id="NUMBER_1">%2$s</xliff:g> အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"ဖြတ်လမ်းများ"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> အတွက် အမြန်နည်း <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ခု"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> အတွက် ဖြတ်လမ်းလင့်ခ် <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> နှင့် အကြောင်းကြားချက် <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ခု"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"ပယ်ရန်"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"အသိပေးချက်ကို ဖယ်ထုတ်ပြီးပါပြီ"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"ကိုယ်ပိုင်"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"အလုပ်"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"အလုပ်ပရိုဖိုင်"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"အလုပ်အက်ပ်များကို ဤနေရာတွင်ရှာဖွေပါ"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"အလုပ်အက်ပ်တိုင်းတွင် တံဆိပ် တစ်ခုစီရှိပြီး သင်၏ အဖွဲ့အစည်းက လုံခြုံအောင် ထားရှိပါသည်။ အသုံးပြုရ ပိုမိုလွယ်ကူစေရန် အက်ပ်များကို သင်၏ ပင်မမျက်နှာပြင်သို့ ရွှေ့ပါ။"</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"သင်၏ အဖွဲ့အစည်းက စီမံခန့်ခွဲထားပါသည်"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"အကြောင်းကြားချက်များနှင့် အက်ပ်များကို ပိတ်ထားသည်"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"ပိတ်ရန်"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"ပိတ်ထားသည်"</string> +</resources> diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 778402ac2..315ebf570 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"နောက်ခံများ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ဖုန်းကိုလှည့်ထားစဉ်"</string> <string name="icon_badging_title" msgid="874121399231955394">"အကြောင်းကြားချက်အမှတ်အသားများ"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ဖွင့်ထားသည်"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"ပိတ်ထားသည်"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"အမြင့်အား လျှော့ပါ"</string> <string name="widget_resized" msgid="9130327887929620">"Widget အား အကျယ် <xliff:g id="NUMBER_0">%1$s</xliff:g> အမြင့် <xliff:g id="NUMBER_1">%2$s</xliff:g> အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"ဖြတ်လမ်းများ"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> အတွက် အမြန်နည်း <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ခု"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> အတွက် ဖြတ်လမ်းလင့်ခ် <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> နှင့် အကြောင်းကြားချက် <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ခု"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"ပယ်ရန်"</string> <string name="notification_dismissed" msgid="6002233469409822874">"အသိပေးချက်ကို ဖယ်ထုတ်ပြီးပါပြီ"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"ကိုယ်ပိုင်"</string> diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 554207964..d5beead86 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Bakgrunner"</string> <string name="settings_button_text" msgid="8873672322605444408">"Startsideinnstillinger"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratoren har slått av funksjonen"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Tillat rotasjon av startskjermen"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Når telefonen roteres"</string> <string name="icon_badging_title" msgid="874121399231955394">"Varselsprikker"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"På"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Av"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Reduser høyden"</string> <string name="widget_resized" msgid="9130327887929620">"Størrelsen på modulen er endret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og høyde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Snarveier"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> snarveier for <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> snarveier og <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> varsler for <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Avvis"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Varselet ble avvist"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personlig"</string> diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml new file mode 100644 index 000000000..a8a64f1bb --- /dev/null +++ b/res/values-ne-rNP/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"कार्य"</string> + <string name="activity_not_found" msgid="8071924732094499514">"अनुप्रयोग स्थापित छैन।"</string> + <string name="activity_not_available" msgid="7456344436509528827">"अनुप्रयोग उपलब्ध छैन"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"सुरक्षित मोडमा डाउनलोड गरेको अनुप्रयोग अक्षम गरिएको छ"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"सुरक्षित मोडमा विगेटहरू अक्षम गरियो"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"सर्टकट उपलब्ध छैन"</string> + <string name="home_screen" msgid="806512411299847073">"गृह स्क्रिन"</string> + <string name="custom_actions" msgid="3747508247759093328">"आफू अनुकूलका कारबाहीहरू"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।"</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"विजेटलाई छान्न वा आफू अनुकूल कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d चौडाइ गुणा %2$d उचाइ"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"म्यानुअल तरिकाले थप्न छुनुहोस् र थिची राख्नुहोस्"</string> + <string name="place_automatically" msgid="8064208734425456485">"स्वतः थप्नुहोस्"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"खोजसम्बन्धी अनुप्रयोगहरू"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"अनुप्रयोगहरू लोड गर्दै…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" सँग मिल्दो कुनै अनुप्रयोग भेटिएन"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"थप अनुप्रयोगहरू खोज्नुहोस्"</string> + <string name="notifications_header" msgid="1404149926117359025">"सूचनाहरू"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"कुनै सर्टकट छनौट गर्न छोइराख्नुहोस्।"</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"कुनै सर्टकट छनौट गर्न वा रोजेका कारबाहीहरू प्रयोग गर्न डबल ट्याप गरेर छोइराख्नुहोस्।"</string> + <string name="out_of_space" msgid="4691004494942118364">"यो गृह स्क्रिनमा कुनै थप ठाउँ छैन।"</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"मनपर्ने ट्रे अब कुनै ठाँउ छैन"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"अनुप्रयोगको सूची"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"व्यक्तिगत अनुप्रयोगहरूको सूची"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"कार्यसम्बन्धी अनुप्रयोगहरूको सूची"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"गृह"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"हटाउनुहोस्"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"विस्थापित गर्नुहोस्"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"अनुप्रयोग जानकारी"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"स्थापना गर्नुहोस्"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"सर्टकट स्थापना गर्नेहोस्"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"प्रयोगकर्ताको हस्तक्षेप बिना एउटा अनुप्रयोगलाई सर्टकटमा थप्नको लागि अनुमति दिनुहोस्।"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"गृह सेटिङहरू र सर्टकटहरू पढ्नुहोस्"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"गृहमा एउटा अनुप्रयोगलाई सेटिङहरू र सर्टकटहरू पढ्न अनुमति दिनुहोस्।"</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"गृह सेटिङहरू र सर्टकटहरू लेख्नुहोस्"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"गृहमा एउटा अनुप्रयोगलाई सेटिङ र सर्टकट बदल्न अनुमति दिनुहोस्।"</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले फोन कलहरू गर्न अनुमति छैन"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"समस्या लोडिङ गर्ने विजेट"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"सेटअप"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"यो प्रणाली अनुप्रयोग हो र यसलाई स्थापना रद्द गर्न सकिँदैन।"</string> + <string name="folder_hint_text" msgid="6617836969016293992">"बेनाम फोल्डर"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"असक्षम पारिएको <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, यसमा <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> सूचनाहरू छन्</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>, यसमा <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> सूचना छ</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"पृष्ठ %2$d को %1$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"गृह स्क्रिन %1$d को %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"नयाँ गृह स्क्रिन पृष्ठ"</string> + <string name="folder_opened" msgid="94695026776264709">"फोल्डर खुल्यो <xliff:g id="WIDTH">%1$d</xliff:g> बाट <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"फोल्डरलाई बन्द गर्न ट्याप गर्नुहोस्"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"पुनःनामाकरणलाई सुरक्षित गर्न ट्याप गर्नुहोस्"</string> + <string name="folder_closed" msgid="4100806530910930934">"फोल्डर बन्द भयो"</string> + <string name="folder_renamed" msgid="1794088362165669656">"फोल्डर <xliff:g id="NAME">%1$s</xliff:g> मा पुनःनामाकरण गरियो।"</string> + <string name="folder_name_format" msgid="6629239338071103179">"फोल्डर: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"विजेटहरू"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"वालपेपरहरु"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"फोनलाई घुमाइँदा"</string> + <string name="icon_badging_title" msgid="874121399231955394">"सूचनाको प्रतीक जनाउने थोप्लोहरू"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"सक्रिय छ"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"निष्क्रिय छ"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"सूचनासम्बन्धी पहुँच आवश्यक हुन्छ"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"सूचनाको प्रतीक जनाउने थोप्लाहरू देखाउन <xliff:g id="NAME">%1$s</xliff:g> को अनुप्रयोगसम्बन्धी सूचनाहरूलाई सक्रिय गर्नुहोस्"</string> + <string name="title_change_settings" msgid="1376365968844349552">"सेटिङहरू बदल्नुहोस्"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"सूचनाको प्रतीक जनाउने थोप्लाहरू देखाउनुहोस्"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"गृह स्क्रिनमा आइकन थप्नुहोस्"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"नयाँ अनुप्रयोगका लागि"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"आइकनको आकार परिवर्तन गर्नुहोस्"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"गृह स्क्रिनमा"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"प्रणालीको पूर्वनिर्धारित सेटिङ प्रयोग गर्नुहोस्"</string> + <string name="icon_shape_square" msgid="633575066111622774">"वर्ग"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"वर्गाकार वृत्त"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"वृत्त"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"आँसुको थोपा"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"आइकनको आकारमा गरिएका परिवर्तनहरू लागू गरिँदैछन्"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"अज्ञात"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"हटाउनुहोस्"</string> + <string name="abandoned_search" msgid="891119232568284442">"खोजी गर्नुहोस्"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"यो अनुप्रयोग स्थापित छैन"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"यो प्रतिमाका लागि अनुप्रयोगलाई स्थापना गरिएको छैन। तपाईं यसलाई हटाउन, वा अनुप्रयोग खोजी र स्वयं यो स्थापित गर्न सक्नुहुन्छ।"</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> डाउनलोड गर्दै, <xliff:g id="PROGRESS">%2$s</xliff:g> सम्पन्न"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> स्थापना गर्न प्रतीक्षा गर्दै"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> विजेटहरू"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"गृह स्क्रिनमा थप्नुहोस्"</string> + <string name="action_move_here" msgid="2170188780612570250">"वस्तु यहाँ सार्नुहोस्"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"वस्तु गृह स्क्रिनमा थपियो"</string> + <string name="item_removed" msgid="851119963877842327">"वस्तु हटाइयो"</string> + <string name="action_move" msgid="4339390619886385032">"वस्तु सार्नुहोस्"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"पङ्क्ति <xliff:g id="NUMBER_0">%1$s</xliff:g> स्तम्भ <xliff:g id="NUMBER_1">%2$s</xliff:g> मा सार्नुहोस्"</string> + <string name="move_to_position" msgid="6750008980455459790">"स्थिति <xliff:g id="NUMBER">%1$s</xliff:g> मा सार्नुहोस्"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"मनपर्ने स्थिति <xliff:g id="NUMBER">%1$s</xliff:g> मा सार्नुहोस्"</string> + <string name="item_moved" msgid="4606538322571412879">"वस्तु सारियो"</string> + <string name="add_to_folder" msgid="9040534766770853243">"फोल्डर: <xliff:g id="NAME">%1$s</xliff:g> मा थप्नुहोस्"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"फोल्डरमा <xliff:g id="NAME">%1$s</xliff:g> सँग थप्नुहोस्"</string> + <string name="added_to_folder" msgid="4793259502305558003">"वस्तु फोल्डरमा थपियो"</string> + <string name="create_folder_with" msgid="4050141361160214248">"<xliff:g id="NAME">%1$s</xliff:g>: मार्फत फोल्डर सिर्जना गर्नुहोस्"</string> + <string name="folder_created" msgid="6409794597405184510">"फोल्डर सिर्जना गरियो"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"गृह स्क्रिनमा सार्नुहोस्"</string> + <string name="action_resize" msgid="1802976324781771067">"पुनःआकार मिलाउनुहोस्"</string> + <string name="action_increase_width" msgid="8773715375078513326">"चौडाइ बढाउनुहोस्"</string> + <string name="action_increase_height" msgid="459390020612501122">"उँचाइ बढाउनुहोस्"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"चौडाइ घटाउनुहोस्"</string> + <string name="action_decrease_height" msgid="282377193880900022">"उँचाइ घटाउनुहोस्"</string> + <string name="widget_resized" msgid="9130327887929620">"विजेट चौडाइ <xliff:g id="NUMBER_0">%1$s</xliff:g> उचाइ <xliff:g id="NUMBER_1">%2$s</xliff:g> मा पुनः आकार मिलाइयो"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"सर्टकटहरू"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> का <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> सर्टकटहरू"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> का <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> सर्टकट र <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> सूचनाहरू"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"खारेज गर्नुहोस्"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"सूचना खारेज गरियो"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"व्यक्तिगत"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"कार्यसम्बन्धी"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"कार्य प्रोफाइल"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"कार्यसम्बन्धी अनुप्रयोगहरू यहाँ प्राप्त गर्नुहोस्"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"कार्यसम्बन्धी प्रत्येक अनुप्रयोगमा एउटा ब्याज छ र तपाईंको संगठनले यसलाई सुरक्षित राखेको छ । अझ सजिलो गरी पहुँच राख्नका लागि अनुप्रयोगहरूलाई आफ्नो गृहस्क्रिनमा सार्नुहोस्।"</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"तपाईंको सङ्गठनले व्यवस्थापन गरेको"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"सूचना र अनुप्रयोगहरू निष्क्रिय छन्"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"बन्द गर्नुहोस्"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"बन्द गरियो"</string> +</resources> diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index fa2f9cf0b..f44c47bd9 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"वालपेपरहरु"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"फोनलाई घुमाइँदा"</string> <string name="icon_badging_title" msgid="874121399231955394">"सूचनाको प्रतीक जनाउने थोप्लोहरू"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"सक्रिय छ"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"निष्क्रिय छ"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"उँचाइ घटाउनुहोस्"</string> <string name="widget_resized" msgid="9130327887929620">"विजेट चौडाइ <xliff:g id="NUMBER_0">%1$s</xliff:g> उचाइ <xliff:g id="NUMBER_1">%2$s</xliff:g> मा पुनः आकार मिलाइयो"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"सर्टकटहरू"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> का <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> सर्टकटहरू"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> का <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> सर्टकट र <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> सूचनाहरू"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"खारेज गर्नुहोस्"</string> <string name="notification_dismissed" msgid="6002233469409822874">"सूचना खारेज गरियो"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"व्यक्तिगत"</string> diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 458b6dd99..e1c059ad4 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -54,9 +54,9 @@ <string name="install_drop_target_label" msgid="2539096853673231757">"Installeren"</string> <string name="permlab_install_shortcut" msgid="5632423390354674437">"Snelle links instellen"</string> <string name="permdesc_install_shortcut" msgid="923466509822011139">"Een app toestaan snelkoppelingen toe te voegen zonder tussenkomst van de gebruiker."</string> - <string name="permlab_read_settings" msgid="1941457408239617576">"instellingen en snelkoppelingen op de homepage lezen"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"instellingen en snelkoppelingen op startscherm lezen"</string> <string name="permdesc_read_settings" msgid="5833423719057558387">"De app toestaan de instellingen en snelkoppelingen op de homepage te lezen."</string> - <string name="permlab_write_settings" msgid="3574213698004620587">"instellingen en snelkoppelingen op de homepage schrijven"</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"instellingen en snelkoppelingen op startscherm zetten"</string> <string name="permdesc_write_settings" msgid="5440712911516509985">"De app toestaan de instellingen en snelkoppelingen op de homepage te wijzigen."</string> <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> mag niet bellen"</string> <string name="gadget_error_text" msgid="6081085226050792095">"Probleem bij het laden van widget"</string> @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Map: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Achtergrond"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Instellingen voor homepage"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Instellingen startscherm"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Uitgeschakeld door je beheerder"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Draaien van startscherm toestaan"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Wanneer de telefoon gedraaid is"</string> <string name="icon_badging_title" msgid="874121399231955394">"Meldingsstipjes"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Aan"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Uit"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Hoogte verkleinen"</string> <string name="widget_resized" msgid="9130327887929620">"Formaat van widget gewijzigd in breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> en hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Snelkoppelingen"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> snelkoppelingen voor <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> snelkoppelingen en <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> meldingen voor <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Sluiten"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Melding gesloten"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Privé"</string> diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml new file mode 100644 index 000000000..9152b43c4 --- /dev/null +++ b/res/values-or/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"ଲଞ୍ଚର୍3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"କାମ"</string> + <string name="activity_not_found" msgid="8071924732094499514">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇନାହିଁ"</string> + <string name="activity_not_available" msgid="7456344436509528827">"ଆପ୍ ଉପଲବ୍ଧ ନାହିଁ"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"ନିରାପଦ ମୋଡରେ ଡାଉନଲୋଡ୍ ହେଇଥିବା ଆପ୍ ଅକ୍ଷମ କରାଗଲା"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"ନିରାପଦ ମୋଡରେ ୱିଜେଟ୍ ଅକ୍ଷମ କରାଗଲା"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"ଶର୍ଟକଟ୍ ଉପଲବ୍ଧ ନାହିଁ"</string> + <string name="home_screen" msgid="806512411299847073">"ହୋମ୍ ସ୍କ୍ରୀନ୍"</string> + <string name="custom_actions" msgid="3747508247759093328">"କାର୍ଯ୍ୟ କଷ୍ଟମ୍ କରନ୍ତୁ"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"ୱିଜେଟ୍ ନେବାକୁ ସ୍ପର୍ଶ କରନ୍ତୁ ଏବଂ ଧରି ରଖନ୍ତୁ।"</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"ଡବଲ୍-ଟାପ୍ କରନ୍ତୁ ଏବଂ ଏକ ୱିଜେଟ୍ ନେବାକୁ ଧରି ରଖନ୍ତୁ କିମ୍ୱା କଷ୍ଟମ୍ କାର୍ଯ୍ୟପ୍ରକ୍ରିୟା ବ୍ୟବହାର କରନ୍ତୁ।"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d ଓସାର ଓ %2$d ଉଚ୍ଚ"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"ମାନୁଆଲ୍ ଭାବରେ ରଖିବାକୁ ସ୍ପର୍ଶ କରନ୍ତୁ ଏବଂ ଧରି ରଖନ୍ତୁ"</string> + <string name="place_automatically" msgid="8064208734425456485">"ସ୍ୱଚାଳିତ ଭାବେ ଯୋଡ଼ନ୍ତୁ"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ଆପ୍ ଖୋଜନ୍ତୁ"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"ଆପ୍ ଲୋଡ୍ ହେଉଛି..."</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ସହିତ ମେଳ ହେଉଥିବା କୌଣସି ଆପ୍ ମିଳିଲା ନାହିଁ"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"ଅଧିକ ଆପ୍ ଖୋଜନ୍ତୁ"</string> + <string name="notifications_header" msgid="1404149926117359025">"ବିଜ୍ଞପ୍ତି"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ।"</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"ଡବଲ୍-ଟାପ୍ କରନ୍ତୁ ଏବଂ ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ଧରି ରଖନ୍ତୁ କିମ୍ୱା କଷ୍ଟମ୍ ପ୍ରକ୍ରିୟା ବ୍ୟବହାର କରନ୍ତୁ।"</string> + <string name="out_of_space" msgid="4691004494942118364">"ହୋମ୍ ସ୍କ୍ରୀନ ପାଇଁ ଆଉ କୋଠରୀ ନାହିଁ"</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"ମନପସନ୍ଦ ଟ୍ରେରେ ଆଉ କୋଠରୀ ନାହିଁ"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"ଆପ୍ ତାଲିକା"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"ବ୍ୟକ୍ତିଗତ ଆପ୍ ତାଲିକା"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"କାର୍ଯ୍ୟକାରୀ ଆପ୍ ତାଲିକା"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"ହୋମ୍"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"ବାହାର କରନ୍ତୁ"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"ଅନଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"ଆପ୍ ସୂଚନା"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"ଶର୍ଟକଟ୍ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"ୟୁଜରଙ୍କ ବିନା ହସ୍ତକ୍ଷେପରେ ଶର୍ଟକଟ୍ ଯୋଡ଼ିବାକୁ ଆପକୁ ଅନୁମତି ଦିଏ।"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"ହୋମ୍ ସେଟିଙ୍ଗ ଏବଂ ଶର୍ଟକଟ୍ ପଢ଼ନ୍ତୁ"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"ହୋମରେ ସେଟିଙ୍ଗ ପଢ଼ିବାକୁ ଆପ ଏବଂ ଶର୍ଟକଟକୁ ଅନୁମତି ଦିଏ।"</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"ହୋମ୍ ସେଟିଙ୍ଗ ଏବଂ ଶର୍ଟକଟ୍ ଲେଖନ୍ତୁ"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"ହୋମରେ ସେଟିଙ୍ଗ ଏବଂ ଶର୍ଟକଟ୍ ପରିବର୍ତ୍ତନ କରିବାକୁ ଆପକୁ ଅନୁମତି ଦିଏ।"</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"ଫୋନ୍ କଲ୍ କରିବାକୁ <xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"ୱିଜେଟ୍ ଲୋଡ୍ ହେବାରେ ସମସ୍ୟା ଅଛି"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"ଏହା ଏକ ସିଷ୍ଟମ୍ ଆପ୍ ଅଟେ ଏବଂ ଏହା ଅନଇନଷ୍ଟଲ୍ କରାଯାଇ ପାରିବ ନାହିଁ।"</string> + <string name="folder_hint_text" msgid="6617836969016293992">"ବେନାମୀ ଫୋଲ୍ଡର୍"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଅକ୍ଷମ କରାଗଲା"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, ରେ <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଅଛି</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>, ରେ <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> ବିଜ୍ଞପ୍ତି ଅଛି</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"ମୋଟ %2$dରୁ %1$d ନମ୍ବର ପୃଷ୍ଠା"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$dରୁ %1$d ହୋମ୍ ସ୍କ୍ରୀନ୍"</string> + <string name="workspace_new_page" msgid="257366611030256142">"ନୂଆ ହୋମ୍ ସ୍କ୍ରୀନ୍ ପୃଷ୍ଠା"</string> + <string name="folder_opened" msgid="94695026776264709">"<xliff:g id="HEIGHT">%2$d</xliff:g> / <xliff:g id="WIDTH">%1$d</xliff:g>ର ଫୋଲ୍ଡର ଖୋଲାଗଲା"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ଫୋଲ୍ଡର୍ ବନ୍ଦ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"ନାମ ବଦଳାଇବା ସେଭ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string> + <string name="folder_closed" msgid="4100806530910930934">"ଫୋଲ୍ଡର ବନ୍ଦ କରାଗଲା"</string> + <string name="folder_renamed" msgid="1794088362165669656">"ଫୋଲ୍ଡରର ନାମ <xliff:g id="NAME">%1$s</xliff:g>କୁ ବଦଳାଗଲା"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ଫୋଲ୍ଡର: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"ୱିଜେଟ୍"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"ୱାଲପେପର୍"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ଯେତେବେଳେ ଫୋନକୁ ବୁଲାଯାଇଥାଏ"</string> + <string name="icon_badging_title" msgid="874121399231955394">"ବିଜ୍ଞପ୍ତି ବିନ୍ଦୁଗୁଡ଼ିକ"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ଅନ୍"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"ଅଫ୍"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"ବିଜ୍ଞପ୍ତି ଆକ୍ସେସ୍ ଆବଶ୍ୟକ ଅଟେ"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"ବିଜ୍ଞପ୍ତି ବିନ୍ଦୁ ଦେଖାଇବାକୁ, <xliff:g id="NAME">%1$s</xliff:g> ପାଇଁ ଆପ୍ ବିଜ୍ଞପ୍ତି ଅନ୍ କରନ୍ତୁ"</string> + <string name="title_change_settings" msgid="1376365968844349552">"ସେଟିଙ୍ଗ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"ବିଜ୍ଞପ୍ତି ଡଟ୍ଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"ହୋମ୍ ସ୍କ୍ରୀନରେ ଆଇକନ୍କୁ ଯୋଡ଼ନ୍ତୁ"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"ନୂଆ ଆପ୍ ପାଇଁ"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"ଆଇକନ୍ର ଆକାର ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"ହୋମ୍ ସ୍କ୍ରୀନ୍ ଉପରେ"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"ସିଷ୍ଟମ ଡିଫଲ୍ଟ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="icon_shape_square" msgid="633575066111622774">"ବର୍ଗାକାର"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"ବର୍ଗାକାରର ବୃତ୍ତ"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"ବୃତ୍ତ"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"ଟିଅରଡ୍ରପ୍"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"ଆଇକନ୍ ଆକାର ପରିବର୍ତ୍ତନ ଲାଗୁ କରୁଛି"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"ଅଜଣା"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"ବାହାର କରନ୍ତୁ"</string> + <string name="abandoned_search" msgid="891119232568284442">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"ଏହି ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇନାହିଁ"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ଏହି ଆଇକନ୍ ପାଇଁ ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇନାହିଁ। ଏହାକୁ ଆପଣ ଆପ୍ ପାଇଁ ବାହାର କରିପାରିବେ କିମ୍ୱା ସର୍ଚ୍ଚ କରି ପାରିବେ ଏବଂ ଏହାକୁ ମାନୁଆଲ୍ ଭାବରେ ଇନଷ୍ଟଲ୍ କରିପାରିବେ।"</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ଡାଉନଲୋଡ୍ ହେଉଛି, <xliff:g id="PROGRESS">%2$s</xliff:g> ସମ୍ପୂର୍ଣ୍ଣ"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ଇନଷ୍ଟଲ୍ ହେବାକୁ ଅପେକ୍ଷା କରିଛି"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> ୱିଜେଟ୍"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"ହୋମ୍ ସ୍କ୍ରୀନରେ ଯୋଡ଼ନ୍ତୁ"</string> + <string name="action_move_here" msgid="2170188780612570250">"ଆଇଟମ୍କୁ ଏଠାକୁ ଘୁଞ୍ଚାନ୍ତୁ"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"ହୋମ୍ ସ୍କ୍ରୀନରେ ଆଇଟମ୍ ଯୋଡ଼ାଗଲା"</string> + <string name="item_removed" msgid="851119963877842327">"ଆଇଟମ୍ ବାହାର କରାଗଲା"</string> + <string name="action_move" msgid="4339390619886385032">"ଆଇଟମ୍ ଘୁଞ୍ଚାନ୍ତୁ"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"ଧାଡ଼ି <xliff:g id="NUMBER_0">%1$s</xliff:g> ସ୍ତମ୍ଭ <xliff:g id="NUMBER_1">%2$s</xliff:g>କୁ ନିଅନ୍ତୁ"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g> ସ୍ଥିତିକୁ ନିଅନ୍ତୁ"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"ପସନ୍ଦର ସ୍ଥିତି <xliff:g id="NUMBER">%1$s</xliff:g>କୁ ନିଅନ୍ତୁ"</string> + <string name="item_moved" msgid="4606538322571412879">"ଆଇଟମ୍ ଘୁଞ୍ଚେଇ ଦିଆଗଲା"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ଏହି ଫୋଲ୍ଡରରେ ଯୋଡ଼ନ୍ତୁ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> ସହିତ ଫୋଲ୍ଡରରେ ଯୋଡ଼ନ୍ତୁ"</string> + <string name="added_to_folder" msgid="4793259502305558003">"ଫୋଲ୍ଡରରେ ଆଇଟମ୍ ଯୋଡ଼ାଗଲା"</string> + <string name="create_folder_with" msgid="4050141361160214248">"ଏହି ନାମରେ ଫୋଲ୍ଡର ତିଆରି କରନ୍ତୁ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"ଫୋଲ୍ଡର ତିଆରି କରାଗଲା"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"ହାମ୍ ସ୍କ୍ରୀନକୁ ଘୁଞ୍ଚାନ୍ତୁ"</string> + <string name="action_resize" msgid="1802976324781771067">"ଆକାର ବଦଳାନ୍ତୁ"</string> + <string name="action_increase_width" msgid="8773715375078513326">"ଚଉଡ଼ା ବଢ଼ାନ୍ତୁ"</string> + <string name="action_increase_height" msgid="459390020612501122">"ଉଚ୍ଚତା ବଢ଼ାନ୍ତୁ"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"ଚଉଡ଼ା କମ୍ କରନ୍ତୁ"</string> + <string name="action_decrease_height" msgid="282377193880900022">"ଉଚ୍ଚତା କମ୍ କରନ୍ତୁ"</string> + <string name="widget_resized" msgid="9130327887929620">"ୱିଜେଟକୁ <xliff:g id="NUMBER_0">%1$s</xliff:g> ଓସାର ଓ <xliff:g id="NUMBER_1">%2$s</xliff:g> ଉଚ୍ଚରେ ପୁନଃଆକାର ଦିଆଗଲା"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"ଶର୍ଟକଟ୍"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> + <string name="action_dismiss_notification" msgid="5909461085055959187">"ଖାରଜ କରନ୍ତୁ"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"ବ୍ୟକ୍ତିଗତ"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"କାମ"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"ଏଠାରେ କାମ ଆପ୍ ଖୋଜନ୍ତୁ"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"ପ୍ରତ୍ୟେକ କାଯ୍ୟକାରୀ ଆପ୍ର ଗୋଟିଏ ବ୍ୟାଜ୍ (ଚିହ୍ନ) ଅଛି, ଯାହାକୁ ଆପଣଙ୍କ ସଂସ୍ଥା ସୁରକ୍ଷିତ ରଖିଥାଏ। ସହଜରେ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପ୍କୁ ହୋମ୍ ସ୍କ୍ରୀନ୍ ଉପରକୁ ଆଣନ୍ତୁ।"</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"ବିଜ୍ଞପ୍ତି ଓ ଆପ୍ଗୁଡ଼ିକ ବନ୍ଦ ଅଛି"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"ବନ୍ଦ କରନ୍ତୁ"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"ବନ୍ଦ ହୋଇଯାଇଛି"</string> +</resources> diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml new file mode 100644 index 000000000..c0778690a --- /dev/null +++ b/res/values-pa-rIN/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"ਦਫ਼ਤਰ"</string> + <string name="activity_not_found" msgid="8071924732094499514">"ਐਪ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ ਹੈ।"</string> + <string name="activity_not_available" msgid="7456344436509528827">"ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"ਡਾਊਨਲੋਡ ਕੀਤਾ ਐਪ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"ਵਿਜੇਟ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"ਸ਼ਾਰਟਕੱਟ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string> + <string name="home_screen" msgid="806512411299847073">"ਹੋਮ ਸਕ੍ਰੀਨ"</string> + <string name="custom_actions" msgid="3747508247759093328">"ਵਿਉਂਂਤੀ ਕਾਰਵਾਈਆਂ"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।"</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਜਾਂ ਵਿਉਂਂਤੀ ਕਾਰਵਾਈਆਂ ਵਰਤਣ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d ਚੌੜਾਈ ਅਤੇ %2$d ਲੰਬਾਈ"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"ਹੱਥੀਂ ਰੱਖਣ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ"</string> + <string name="place_automatically" msgid="8064208734425456485">"ਸਵੈਚਲਿਤ ਤਰੀਕੇ ਨਾਲ ਸ਼ਾਮਲ ਕਰੋ"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ਐਪਾਂ ਖੋਜੋ"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ਨਾਲ ਮੇਲ ਖਾਂਦੀਆਂ ਕੋਈ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"ਹੋਰ ਐਪਾਂ ਖੋਜੋ"</string> + <string name="notifications_header" msgid="1404149926117359025">"ਸੂਚਨਾਵਾਂ"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਚੁਣਨ ਲਈ ਸਪੱਰਸ਼ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਚੁਣਨ ਲਈ ਡਬਲ ਟੈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ ਜਾਂ ਵਿਉਂਤੀਆਂ ਕਾਰਵਾਈਆਂ ਵਰਤੋ।"</string> + <string name="out_of_space" msgid="4691004494942118364">"ਇਸ ਹੋਮ ਸਕ੍ਰੀਨ ਲਈ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ ਹੈ।"</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"ਮਨਪਸੰਦ ਟ੍ਰੇ ਵਿੱਚ ਹੋਰ ਖਾਲੀ ਸਥਾਨ ਨਹੀਂ।"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"ਐਪ ਸੂਚੀ"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"ਨਿੱਜੀ ਐਪਾਂ ਦੀ ਸੂਚੀ"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"ਕਾਰਜ-ਸਥਾਨ ਸੰਬੰਧੀ ਐਪਾਂ ਦੀ ਸੂਚੀ"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"ਹੋਮ"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"ਹਟਾਓ"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"ਅਣਸਥਾਪਤ ਕਰੋ"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"ਐਪ ਜਾਣਕਾਰੀ"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ਸਥਾਪਤ ਕਰੋ"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"ਸ਼ਾਰਟਕੱਟ ਸਥਾਪਤ ਕਰੋ"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"ਇੱਕ ਐਪ ਨੂੰ ਵਰਤੋਂਕਾਰ ਦੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਸ਼ਾਰਟਕੱਟ ਸ਼ਾਮਲ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"ਹੋਮ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ਾਰਟਕੱਟ ਪੜ੍ਹੋ"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"ਐਪ ਨੂੰ ਹੋਮ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ਾਰਟਕੱਟ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"ਹੋਮ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ਾਰਟਕੱਟ ਲਿਖੋ"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"ਐਪ ਨੂੰ ਹੋਮ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ਾਰਟਕੱਟ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"ਵਿਜੇਟ ਲੋਡ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"ਸਥਾਪਤ ਕਰੋ"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"ਇਹ ਇੱਕ ਸਿਸਟਮ ਐਪ ਹੈ ਅਤੇ ਇਸਨੂੰ ਅਣਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string> + <string name="folder_hint_text" msgid="6617836969016293992">"ਬਿਨਾਂ ਨਾਮ ਦਿੱਤਾ ਫੋਲਡਰ"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, ਦੀ <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> ਸੂਚਨਾ</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, ਦੀਆਂ <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> ਸੂਚਨਾਵਾਂ</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"ਸਫ਼ਾ %2$d ਦਾ %1$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"ਹੋਮ ਸਕ੍ਰੀਨ %2$d ਦੀ %1$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"ਨਵਾਂ ਹੋਮ ਸਕ੍ਰੀਨ ਸਫ਼ਾ"</string> + <string name="folder_opened" msgid="94695026776264709">"ਫੋਲਡਰ ਖੋਲ੍ਹਿਆ, <xliff:g id="WIDTH">%1$d</xliff:g> ਬਾਇ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ਫੋਲਡਰ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"ਬਦਲੇ ਗਏ ਨਾਮ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="folder_closed" msgid="4100806530910930934">"ਫੋਲਡਰ ਬੰਦ ਕੀਤਾ"</string> + <string name="folder_renamed" msgid="1794088362165669656">"ਫੋਲਡਰ ਨੂੰ <xliff:g id="NAME">%1$s</xliff:g> ਮੁੜ ਨਾਮ ਦਿੱਤਾ ਗਿਆ"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ਫੋਲਡਰ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"ਵਿਜੇਟ"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"ਵਾਲਪੇਪਰ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ"</string> + <string name="icon_badging_title" msgid="874121399231955394">"ਸੂਚਨਾ ਬਿੰਦੂ"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ਚਾਲੂ"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"ਬੰਦ"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"ਸੂਚਨਾ ਪਹੁੰਚ ਲੋੜੀਂਦੀ ਹੈ"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"ਸੂਚਨਾ ਬਿੰਦੂਆਂ ਦਿਖਾਉਣ ਲਈ, <xliff:g id="NAME">%1$s</xliff:g> ਲਈ ਐਪ ਸੂਚਨਾਵਾਂ ਚਾਲੂ ਕਰੋ"</string> + <string name="title_change_settings" msgid="1376365968844349552">"ਸੈਟਿੰਗਾਂ ਬਦਲੋ"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"ਸੂਚਨਾ ਬਿੰਦੂ ਦਿਖਾਓ"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"ਨਵੀਆਂ ਐਪਾਂ ਲਈ"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"ਪ੍ਰਤੀਕ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"ਸਿਸਟਮ ਦੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ"</string> + <string name="icon_shape_square" msgid="633575066111622774">"ਵਰਗ"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"ਵਰਗਾਕਾਰ-ਚੱਕਰ"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"ਚੱਕਰ"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"ਹੰਝੂ ਦੀ ਬੂੰਦ"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"ਪ੍ਰਤੀਕ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"ਅਗਿਆਤ"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"ਹਟਾਓ"</string> + <string name="abandoned_search" msgid="891119232568284442">"ਖੋਜੋ"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"ਇਹ ਐਪ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ ਹੈ।"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ਇਸ ਪ੍ਰਤੀਕ ਲਈ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ ਹੈ। ਤੁਸੀਂ ਇਸਨੂੰ ਹਟਾ ਸਕਦੇ ਹੋ ਜਾਂ ਐਪ ਖੋਜ ਸਕਦੇ ਹੋ ਅਤੇ ਇਸਨੂੰ ਮੈਨੂਅਲੀ ਸਥਾਪਤ ਕਰ ਸਕਦੇ ਹੋ।"</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ਡਾਉਨਲੋਡ ਹੋਰ ਰਿਹਾ ਹੈ, <xliff:g id="PROGRESS">%2$s</xliff:g> ਸੰਪੂਰਣ"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ਸਥਾਪਤ ਕਰਨ ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> ਵਿਜੇਟ"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string> + <string name="action_move_here" msgid="2170188780612570250">"ਆਈਟਮ ਨੂੰ ਇੱਥੇ ਮੂਵ ਕਰੋ"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"ਆਈਟਮ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਜੋੜਿਆ ਗਿਆ"</string> + <string name="item_removed" msgid="851119963877842327">"ਅਈਟਮ ਹਟਾਈ ਗਈ"</string> + <string name="action_move" msgid="4339390619886385032">"ਆਈਟਮ ਨੂੰ ਮੂਵ ਕਰੋ"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"ਕਤਾਰ <xliff:g id="NUMBER_0">%1$s</xliff:g> ਕਾਲਮ <xliff:g id="NUMBER_1">%2$s</xliff:g> ਵਿੱਚ ਮੂਵ ਕਰੋ"</string> + <string name="move_to_position" msgid="6750008980455459790">"ਸਥਿਤੀ <xliff:g id="NUMBER">%1$s</xliff:g> ਵਿੱਚ ਮੂਵ ਕਰੋ"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"ਮਨਪਸੰਦ ਸਥਿਤੀ <xliff:g id="NUMBER">%1$s</xliff:g> ਵਿੱਚ ਮੂਵ ਕਰੋ"</string> + <string name="item_moved" msgid="4606538322571412879">"ਆਈਟਮ ਮੂਵ ਕੀਤੀ ਗਈ"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ਇਸ ਫੋਲਡਰ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> ਦੇ ਨਾਲ ਫੋਲਡਰ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string> + <string name="added_to_folder" msgid="4793259502305558003">"ਆਈਟਮ ਨੂੰ ਫੋਲਡਰ ਵਿੱਚ ਜੋੜਿਆ ਗਿਆ"</string> + <string name="create_folder_with" msgid="4050141361160214248">"ਇਸਦੇ ਨਾਲ ਫੋਲਡਰ ਬਣਾਓ: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"ਫੋਲਡਰ ਬਣਾਇਆ ਗਿਆ"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਮੂਵ ਕਰੋ"</string> + <string name="action_resize" msgid="1802976324781771067">"ਮੁੜ ਆਕਾਰ ਦਿਓ"</string> + <string name="action_increase_width" msgid="8773715375078513326">"ਚੌੜਾਈ ਵਧਾਓ"</string> + <string name="action_increase_height" msgid="459390020612501122">"ਉਂਚਾਈ ਵਧਾਓ"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"ਚੌੜਾਈ ਘਟਾਓ"</string> + <string name="action_decrease_height" msgid="282377193880900022">"ਉਂਚਾਈ ਘਟਾਓ"</string> + <string name="widget_resized" msgid="9130327887929620">"ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ <xliff:g id="NUMBER_0">%1$s</xliff:g> ਉਂਚਾਈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"ਸ਼ਾਰਟਕੱਟ"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> ਲਈ <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ਸ਼ਾਰਟਕੱਟ"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> ਲਈ <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ਸ਼ਾਰਟਕੱਟ ਅਤੇ <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ਸੂਚਨਾਵਾਂ"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"ਖਾਰਜ ਕਰੋ"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"ਸੂਚਨਾ ਖਾਰਜ ਕੀਤੀ ਗਈ"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"ਨਿੱਜੀ"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"ਕਾਰਜ-ਸਥਾਨ"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"ਕਾਰਜ-ਸਥਾਨ ਐਪਾਂ ਇੱਥੇ ਲੱਭੋ"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"ਹਰੇਕ ਕਾਰਜ-ਸਥਾਨ ਐਪ ਦਾ ਇੱਕ ਬੈਜ ਹੁੰਦਾ ਹੈ ਅਤੇ ਉਸਨੂੰ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਸੁਰੱਖਿਅਤ ਰੱਖਿਆ ਜਾਂਦਾ ਹੈ। ਵਧੇਰੇ ਆਸਾਨ ਪਹੁੰਚ ਲਈ ਐਪਾਂ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਲਿਜਾਓ।"</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"ਸੂਚਨਾਵਾਂ ਅਤੇ ਐਪਾਂ ਬੰਦ ਹਨ"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"ਬੰਦ ਕਰੋ"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"ਬੰਦ ਕੀਤਾ ਗਿਆ"</string> +</resources> diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 02424031b..237e5190a 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"ਵਾਲਪੇਪਰ"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ"</string> <string name="icon_badging_title" msgid="874121399231955394">"ਸੂਚਨਾ ਬਿੰਦੂ"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ਚਾਲੂ"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"ਬੰਦ"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"ਉਂਚਾਈ ਘਟਾਓ"</string> <string name="widget_resized" msgid="9130327887929620">"ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ <xliff:g id="NUMBER_0">%1$s</xliff:g> ਉਂਚਾਈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"ਸ਼ਾਰਟਕੱਟ"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> ਲਈ <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ਸ਼ਾਰਟਕੱਟ"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> ਲਈ <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ਸ਼ਾਰਟਕੱਟ ਅਤੇ <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ਸੂਚਨਾਵਾਂ"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"ਖਾਰਜ ਕਰੋ"</string> <string name="notification_dismissed" msgid="6002233469409822874">"ਸੂਚਨਾ ਖਾਰਜ ਕੀਤੀ ਗਈ"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"ਨਿੱਜੀ"</string> diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 558fab259..65de77703 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -83,6 +83,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Tapety"</string> <string name="settings_button_text" msgid="8873672322605444408">"Ustawienia strony głównej"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Funkcja wyłączona przez administratora"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Zezwalaj na obrót ekranu głównego"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Po obróceniu telefonu"</string> <string name="icon_badging_title" msgid="874121399231955394">"Plakietki z powiadomieniami"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Włączono"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Wyłączono"</string> @@ -130,8 +132,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Zmniejsz wysokość"</string> <string name="widget_resized" msgid="9130327887929620">"Szerokość i wysokość widżetu zmieniła się na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Skróty"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Skróty aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g>: <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Skróty (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) i powiadomienia (<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>) aplikacji <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Odrzuć"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Powiadomienie odrzucone"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobiste"</string> diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 0d3224d39..48dcebb42 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -50,7 +50,7 @@ <string name="all_apps_home_button_label" msgid="252062713717058851">"Ecrã principal"</string> <string name="remove_drop_target_label" msgid="7812859488053230776">"Remover"</string> <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Desinstalar"</string> - <string name="app_info_drop_target_label" msgid="692894985365717661">"Inf. da aplicação"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Info. da aplicação"</string> <string name="install_drop_target_label" msgid="2539096853673231757">"Instalar"</string> <string name="permlab_install_shortcut" msgid="5632423390354674437">"instalar atalhos"</string> <string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite a uma aplicação adicionar atalhos sem a intervenção do utilizador."</string> @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Imagens de fundo"</string> <string name="settings_button_text" msgid="8873672322605444408">"Definições da página inicial"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desativada pelo gestor"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Permitir rotação do ecrã principal"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Quando o telemóvel é rodado"</string> <string name="icon_badging_title" msgid="874121399231955394">"Pontos de notificação"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Ativada"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Desativada"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Diminuir altura"</string> <string name="widget_resized" msgid="9130327887929620">"Widget redimensionado para a largura <xliff:g id="NUMBER_0">%1$s</xliff:g>, altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Atalhos"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> atalhos para a aplicação <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> atalhos e <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notificações para a aplicação <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorar"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Notificação ignorada"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Pessoal"</string> diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 73dad35bb..25bde0add 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Pasta: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Planos de fundo"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Configurações da página inicial"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Configurações da tela inicial"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desativado pelo administrador"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Permitir rotação da tela inicial"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Quando o smartphone for girado"</string> <string name="icon_badging_title" msgid="874121399231955394">"Pontos de notificação"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Ativado"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Desativado"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Diminuir altura"</string> <string name="widget_resized" msgid="9130327887929620">"Widget redimensionado para a largura <xliff:g id="NUMBER_0">%1$s</xliff:g>, altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Atalhos"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> atalhos para <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> atalhos e <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> notificações para o app <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Dispensar"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Notificação dispensada"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Pessoais"</string> diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 500512ac3..1af37eb70 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -82,6 +82,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Imagini de fundal"</string> <string name="settings_button_text" msgid="8873672322605444408">"Setări pentru ecranul de pornire"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dezactivată de administrator"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Permiteți rotirea ecranului de pornire"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Când telefonul este rotit"</string> <string name="icon_badging_title" msgid="874121399231955394">"Puncte de notificare"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Activat"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Dezactivat"</string> diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index d04ca5c04..74809dde4 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -83,15 +83,17 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Обои"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Когда телефон повернут"</string> <string name="icon_badging_title" msgid="874121399231955394">"Значки уведомлений"</string> - <string name="icon_badging_desc_on" msgid="2627952638544674079">"ВКЛ"</string> - <string name="icon_badging_desc_off" msgid="5503319969924580241">"ВЫКЛ"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Вкл."</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Выкл."</string> <string name="title_missing_notification_access" msgid="7503287056163941064">"Нет доступа к уведомлениям"</string> <string name="msg_missing_notification_access" msgid="281113995110910548">"Чтобы показывать значки уведомлений, включите уведомления в приложении \"<xliff:g id="NAME">%1$s</xliff:g>\""</string> <string name="title_change_settings" msgid="1376365968844349552">"Изменить настройки"</string> <string name="icon_badging_service_title" msgid="2309733118428242174">"Показывать значки уведомлений"</string> <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Добавлять значки"</string> - <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Добавлять значки установленных приложений на главный экран."</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Добавлять значки установленных приложений на главный экран"</string> <string name="icon_shape_override_label" msgid="2977264953998281004">"Изменить форму значков"</string> <string name="icon_shape_override_label_location" msgid="3841607380657692863">"на главном экране"</string> <string name="icon_shape_system_default" msgid="1709762974822753030">"Использовать системные настройки по умолчанию"</string> @@ -130,8 +132,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Уменьшить высоту"</string> <string name="widget_resized" msgid="9130327887929620">"Изменен размер виджета: до <xliff:g id="NUMBER_0">%1$s</xliff:g> в ширину и <xliff:g id="NUMBER_1">%2$s</xliff:g> в высоту"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Ярлыки"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Количество ярлыков для приложения \"<xliff:g id="APP_NAME">%2$s</xliff:g>\": <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Количество ярлыков для приложения \"<xliff:g id="APP_NAME">%3$s</xliff:g>\": <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>. Количество уведомлений: <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>."</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Закрыть"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Уведомление закрыто"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Личные"</string> diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml new file mode 100644 index 000000000..10835dc5c --- /dev/null +++ b/res/values-si-rLK/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"කාර්යාලය"</string> + <string name="activity_not_found" msgid="8071924732094499514">"යෙදුම ස්ථාපනය කර නැත."</string> + <string name="activity_not_available" msgid="7456344436509528827">"යෙදුම නොතිබේ"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"ආරක්ෂිත ආකාරය තුළ බාගන්න ලද යෙදුම් අබල කරන්න"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"සුරක්ෂිත ආකාරය තුළ විජටය අබල කරන ලදි"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"කෙටි මග ලබා ගත නොහැකිය"</string> + <string name="home_screen" msgid="806512411299847073">"මුල් පිටු තිරය"</string> + <string name="custom_actions" msgid="3747508247759093328">"අභිරුචි ක්රියා"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"පළල %1$d උස %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"අතින් ස්ථානගත කිරීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න"</string> + <string name="place_automatically" msgid="8064208734425456485">"ස්වයංක්රියව එක් කරන්න"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"යෙදුම් සොයන්න"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"යෙදුම් පූරණය වෙමින්…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" සමග ගැළපෙන යෙදුම් හමු නොවිණි"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"තව යෙදුම් සඳහා සොයන්න"</string> + <string name="notifications_header" msgid="1404149926117359025">"දැනුම්දීම්"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"කෙටි මගක් තෝරා ගැනීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"විජට් එකක් තෝරා ගැනීමට හෝ අභිරුචි භාවිත කිරීමට දෙවරක් තට්ටු කර අල්ලා ගෙන සිටින්න."</string> + <string name="out_of_space" msgid="4691004494942118364">"මෙම මුල් පිටු තිරය මත තවත් අවසර නැත."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"ප්රියතම දෑ ඇති තැටියේ තවත් ඉඩ නොමැත"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"යෙදුම් ලැයිස්තුව"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"පෞද්ගලික යෙදුම් ලැයිස්තුව"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"වැඩ යෙදුම් ලැයිස්තුව"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"මුල් පිටුව"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"ඉවත් කරන්න"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"අස්ථාපනය කරන්න"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"යෙදුම් තොරතුරු"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ස්ථාපනය කරන්න"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"කෙටිමං ස්ථාපනය කරන්න"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"පරිශීලක මැදිහත්වීමෙන් තොරව කෙටිමං එක් කිරීමට යෙදුමකට අවසර දෙයි."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"මුල් පිටු සැකසීම් සහ කෙටිමං කියවන්න"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"මුල් පිටුවේ ඇති සැකසීම් සහ කෙටිමං කියවීමට යෙදුමකට අවසර දෙයි."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"මුල් පිටු සැකසීම් සහ කෙටිමං ලියන්න"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"මුල් පිටුවේ සැකසීම් සහ කෙටිමං ඉවත් කිරීමට යෙදුමට අවසර දෙයි."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> හට දුරකථන ඇමතුම් සිදු කිරීමට ඉඩ නොදේ"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"ගැටලු පූරණ විජට් එක"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"ස්ථාපනය කරන්න"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"මෙය පද්ධති යෙදුමක් වන අතර අස්ථාපනය කළ නොහැක."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"නම් නොකළ ෆෝල්ඩරය"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> අබල කෙරිණි"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, දැනුම්දීම් <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g>ක් ඇත</item> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, දැනුම්දීම් <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g>ක් ඇත</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%2$d හි %1$d පිටුව"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"මුල් පිටු තිරය %2$d හි %1$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"නව මුල් පිටුව"</string> + <string name="folder_opened" msgid="94695026776264709">"ෆෝල්ඩරය විවෘත විය, <xliff:g id="WIDTH">%1$d</xliff:g> හි <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ෆෝල්ඩරය වැසීමට තට්ටු කරන්න"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"යළි නම් කිරීම සුරැකීමට තට්ටු කරන්න"</string> + <string name="folder_closed" msgid="4100806530910930934">"ෆෝල්ඩරය වසා ඇත"</string> + <string name="folder_renamed" msgid="1794088362165669656">"<xliff:g id="NAME">%1$s</xliff:g> වෙත ෆෝල්ඩරය නැවත නම් කෙරිණි"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ෆෝල්ඩරය: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"විජට්"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"වෝල්පේපර"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Home සැකසීම්"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"ඔබගේ පරිපාලක විසින් අබල කරන ලදී"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"දුරකථනය කරකවන විට"</string> + <string name="icon_badging_title" msgid="874121399231955394">"දැනුම්දීම් තිත්"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ක්රියාත්මකයි"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"ක්රියාවිරහිතයි"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"දැනුම්දීම් ප්රවේශය අවශ්යයි"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"දැනුම්දීම් තිත් පෙන්වීමට, <xliff:g id="NAME">%1$s</xliff:g> සඳහා යෙදුම් දැනුම්දීම් සබල කරන්න"</string> + <string name="title_change_settings" msgid="1376365968844349552">"සැකසීම් වෙනස් කරන්න"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"දැනුම් දීමේ තිත් පෙන්වන්න"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"මුල් පිටු තිරය වෙත අයිකනය එක් කරන්න"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"නව යෙදුම් සඳහා"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"නිරූපක හැඩය වෙනස් කරන්න"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"මුල් පිටු තිරය මත"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"පද්ධති පෙරනිමි භාවිත කරන්න"</string> + <string name="icon_shape_square" msgid="633575066111622774">"සමචතුරස්රය"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"හතරැස් කවය"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"කවය"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"කඳුළු බිංදුව"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"නිරූපක හැඩය වෙනස් කිරීම් යොදමින්"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"නොදනී"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"ඉවත් කරන්න"</string> + <string name="abandoned_search" msgid="891119232568284442">"සොයන්න"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"මෙම යෙදුම ස්ථාපනය කර නොමැත"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"මෙම නිරුපකයට යෙදුම ස්ථාපනය කර නොමැත. ඔබට එය ඉවත් කළ හැක, හෝ යෙදුම් සඳහා සොයන්න සහ අතින් ස්ථාපනය කරන්න."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> බාගත කරමින්, <xliff:g id="PROGRESS">%2$s</xliff:g> සම්පූර්ණයි"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ස්ථාපනය කිරීමට බලා සිටිමින්"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> විජට්"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"මුල් තිරය වෙත එක් කරන්න"</string> + <string name="action_move_here" msgid="2170188780612570250">"මෙතනට අයිතමය ගෙන එන්න"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"අයිතමය මුල් තිරය වෙත එකතු කරන ලදි"</string> + <string name="item_removed" msgid="851119963877842327">"අයිතමය ඉවත් කරන ලදි"</string> + <string name="action_move" msgid="4339390619886385032">"අයිතමය ගෙනයන්න"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"පේළිය <xliff:g id="NUMBER_0">%1$s</xliff:g> තීරුව <xliff:g id="NUMBER_1">%2$s</xliff:g> වෙත ගෙන යන්න"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g> ස්ථානය වෙත ගෙන යන්න"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"ප්රියතම ස්ථානය <xliff:g id="NUMBER">%1$s</xliff:g> වෙත ගෙන යන්න"</string> + <string name="item_moved" msgid="4606538322571412879">"අයිතමය ගෙන යන ලදි"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ෆෝල්ඩරය එක් කරන්න: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> සමඟ ෆෝල්ඩරය වෙත එක් කරන්න"</string> + <string name="added_to_folder" msgid="4793259502305558003">"අයිතමය ෆෝඩරය වෙතට එක් කරන ලදි"</string> + <string name="create_folder_with" msgid="4050141361160214248">"මේ සමග ෆෝල්ඩරය සාදන්න: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"ෆෝල්ඩරය සාදන ලදි"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"මුල් තිරය වෙත ගෙන යන්න"</string> + <string name="action_resize" msgid="1802976324781771067">"නැවත ප්රමාණගත කිරීම"</string> + <string name="action_increase_width" msgid="8773715375078513326">"පළල වැඩි කරන්න"</string> + <string name="action_increase_height" msgid="459390020612501122">"උස වැඩි කරන්න"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"පළල අඩු කරන්න"</string> + <string name="action_decrease_height" msgid="282377193880900022">"උස අඩු කරන්න"</string> + <string name="widget_resized" msgid="9130327887929620">"විජට් පළල <xliff:g id="NUMBER_0">%1$s</xliff:g> උස <xliff:g id="NUMBER_1">%2$s</xliff:g> වෙත ප්රමාණකරණය කරන ලදි"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"කෙටිමං"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> සඳහා කෙටි මං <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> සඳහා කෙටි මං <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>ක් සහ දැනුම්දීම් <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>ක්"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"ඉවතලන්න"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"දැනුම්දීම ඉවතලන ලදී"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"පුද්ගලික"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"කාර්යාලය"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"කාර්යාල පැතිකඩ"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"මෙහි කාර්යාල යෙදුම් සොයා ගන්න"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"සෑම කාර්යාල යෙදුමකම ලාංඡනයක් ඇත ඇති අතර එය ඔබේ සංවිධානය මගින් සුරක්ෂිතව තබා ගනී. වඩාත් පහසු ප්රවේශයකට යෙදුම් ඔබේ මුල් පිටු තිරය වෙත ගෙන යන්න."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"ඔබේ සංවිධානය විසින් කළමනාකරණය කරනු ලැබේ"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"දැනුම්දීම් සහ යෙදුම් ක්රියාවිරහිතයි"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"වසන්න"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"වසා ඇත"</string> +</resources> diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 7a4771e61..10835dc5c 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"වෝල්පේපර"</string> <string name="settings_button_text" msgid="8873672322605444408">"Home සැකසීම්"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"ඔබගේ පරිපාලක විසින් අබල කරන ලදී"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"දුරකථනය කරකවන විට"</string> <string name="icon_badging_title" msgid="874121399231955394">"දැනුම්දීම් තිත්"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ක්රියාත්මකයි"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"ක්රියාවිරහිතයි"</string> diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 4d90dee09..cbffd1b25 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -81,8 +81,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Priečinok: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Miniaplikácie"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Tapety"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Nastavenia služby Home"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Nastavenia Home"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Zakázané vaším správcom"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Povoliť otáčanie plochy"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Pri otočení telefónu"</string> <string name="icon_badging_title" msgid="874121399231955394">"Bodky upozornení"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Zapnuté"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Vypnuté"</string> @@ -130,8 +132,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Znížiť výšku"</string> <string name="widget_resized" msgid="9130327887929620">"Veľkosť miniaplikácie bola zmenená na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g> (šírka x výška)"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Skratky"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Počet skratiek aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g>: <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Odkazy (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) a upozornenia (<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>) pre aplikáciu <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Zavrieť"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Upozornenie bolo zavreté"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobné"</string> diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 82b79125b..df934cd2f 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -83,6 +83,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Ozadja"</string> <string name="settings_button_text" msgid="8873672322605444408">"Nastavitve začetnega zaslona"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogočil skrbnik."</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Omogočanje sukanja začetnega zaslona"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Ko se telefon zasuka"</string> <string name="icon_badging_title" msgid="874121399231955394">"Obvestilne pike"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Vklopljeno"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Izklopljeno"</string> @@ -130,8 +132,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Zmanjšanje višine"</string> <string name="widget_resized" msgid="9130327887929620">"Velikost pripomočka je bila spremenjena na <xliff:g id="NUMBER_0">%1$s</xliff:g> širine in <xliff:g id="NUMBER_1">%2$s</xliff:g> višine"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Bližnjice"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Št. bližnjic za aplikacijo <xliff:g id="APP_NAME">%2$s</xliff:g>: <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Bližnjice (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) in obvestila (<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>) aplikacije <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Opusti"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Obvestilo je bilo opuščeno"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Osebno"</string> diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml new file mode 100644 index 000000000..82cc42a16 --- /dev/null +++ b/res/values-sq-rAL/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Nisësi3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Puna"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Aplikacioni nuk është i instaluar."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Aplikacioni nuk mundësohet"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Aplikacioni i shkarkuar është i çaktivizuar në modalitetin e sigurt"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Miniaplikacionet janë të çaktivizuara në modalitetin e sigurt"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Shkurtorja nuk është e disponueshme"</string> + <string name="home_screen" msgid="806512411299847073">"Ekrani bazë"</string> + <string name="custom_actions" msgid="3747508247759093328">"Veprimet e personalizuara"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d i gjerë me %2$d i lartë"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Prek dhe mbaj të shtypur për të vendosur në mënyrë manuale"</string> + <string name="place_automatically" msgid="8064208734425456485">"Shto automatikisht"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Kërko për aplikacione"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Po ngarkon aplikacionet..."</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nuk u gjet asnjë aplikacion që përputhet me \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Kërko për më shumë aplikacione"</string> + <string name="notifications_header" msgid="1404149926117359025">"Njoftimet"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Prek dhe mbaj prekur për të zgjedhur një shkurtore."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Prek dy herë dhe mbaj prekur për të zgjedhur një shkurtore ose për të përdorur veprimet e personalizuara."</string> + <string name="out_of_space" msgid="4691004494942118364">"Nuk ka më hapësirë në këtë ekran bazë."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Nuk ka më hapësirë në tabakanë \"Të preferuarat\""</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Lista e aplikacioneve"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Lista e aplikacioneve personale"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Lista e aplikacioneve të punës"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Faqja kryesore"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Hiqe"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Çinstalo"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Informacion mbi aplikacionin"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"Instalo"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"instalo shkurtore"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Lejon një aplikacion të shtojë shkurtore pa ndërhyrjen e përdoruesit."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"lexo cilësimet dhe shkurtoret e ekranit bazë"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Lejon aplikacionin të lexojë cilësimet dhe shkurtoret në ekranin bazë."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"shkruaj cilësimet dhe shkurtoret e ekranit bazë"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Lejon aplikacionin të ndryshojë cilësimet dhe shkurtoret në ekranin bazë."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk lejohet të kryejë telefonata"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Problem në ngarkimin e miniaplikacionit"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Konfiguro"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Ky është aplikacion sistemi dhe nuk mund të çinstalohet."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Dosje e paemërtuar"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> u çaktivizua"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, ka <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> njoftime</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>, ka <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> njoftime</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"Faqja: %1$d nga gjithsej %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Ekrani bazë: %1$d nga gjithsej %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Faqja e ekranit të ri kryesor"</string> + <string name="folder_opened" msgid="94695026776264709">"Dosja u hap, <xliff:g id="WIDTH">%1$d</xliff:g> me <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Trokit për të mbyllur dosjen"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"Trokit për të ruajtur riemërtimin"</string> + <string name="folder_closed" msgid="4100806530910930934">"Dosja u mbyll"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Dosja u riemërtua në <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Dosja: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Miniaplikacionet"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Imazhet e sfondit"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Cilësimet e Home"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Çaktivizuar nga administratori"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Lejo rrotullimin e ekranit kryesor"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kur telefoni rrotullohet"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Pikat e njoftimeve"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Aktiv"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"Joaktiv"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Nevojitet qasja në njoftime"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Për të shfaqur \"Pikat e njoftimeve\", aktivizo njoftimet e aplikacionit për <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Ndrysho cilësimet"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Shfaq pikat e njoftimeve"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Shto ikonë në ekranin bazë"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Për aplikacionet e reja"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Ndrysho formën e ikonës"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"në ekranin bazë"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Përdor parazgjedhjen e sistemit"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Katror"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Katror me kënde të rrumbullakëta"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Rreth"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Pikë loti"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Po zbatohen ndryshimet e formës së ikonës"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"I panjohur"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"Hiq"</string> + <string name="abandoned_search" msgid="891119232568284442">"Kërko"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Aplikacioni nuk është i instaluar"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Aplikacioni për këtë ikonë nuk është i instaluar. Mund ta heqësh ose të kërkosh aplikacionin dhe ta instalosh atë në mënyrë manuale."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> po shkarkohet, <xliff:g id="PROGRESS">%2$s</xliff:g> të përfunduara"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> po pret të instalohet"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Miniaplikacionet e <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Shto në Ekranin bazë"</string> + <string name="action_move_here" msgid="2170188780612570250">"Zhvendose artikullin këtu"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Artikulli u shtua tek ekrani bazë"</string> + <string name="item_removed" msgid="851119963877842327">"Artikulli u hoq"</string> + <string name="action_move" msgid="4339390619886385032">"Zhvendose artikullin"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"Zhvendos te rreshti <xliff:g id="NUMBER_0">%1$s</xliff:g>, kolona <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="move_to_position" msgid="6750008980455459790">"Zhvendos te pozicioni <xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Zhvendos te pozicioni <xliff:g id="NUMBER">%1$s</xliff:g> i preferencave"</string> + <string name="item_moved" msgid="4606538322571412879">"Artikulli u zhvendos"</string> + <string name="add_to_folder" msgid="9040534766770853243">"Shto te dosja: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"Shto te dosja me <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Artikulli u shtua te dosja"</string> + <string name="create_folder_with" msgid="4050141361160214248">"Krijo një dosje me: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"Dosja u krijua"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Zhvendose në Ekranin bazë"</string> + <string name="action_resize" msgid="1802976324781771067">"Ndrysho madhësinë"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Rrit gjerësinë"</string> + <string name="action_increase_height" msgid="459390020612501122">"Rrit lartësinë"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Zvogëlo gjerësinë"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Zvogëlo lartësinë"</string> + <string name="widget_resized" msgid="9130327887929620">"Madhësia e miniaplikacionit u ndryshua me gjerësinë <xliff:g id="NUMBER_0">%1$s</xliff:g> dhe lartësinë <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Shkurtoret"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> shkurtesa për <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> shkurtore dhe <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> njoftime për <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Hiqe"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Njoftimi u hoq"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personale"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Punë"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Profili i punës"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Gjej këtu aplikacionet e punës"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Secili aplikacion pune ka një distinktiv dhe mbahet i sigurt nga organizata jote. Zhvendosi aplikacionet e punës në ekranin tënd kryesor për qasje më të lehtë."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Menaxhohet nga organizata jote"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Njoftimet dhe aplikacionet janë joaktive"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Mbyll"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Mbyllur"</string> +</resources> diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index a4ad7a054..ef7cde70e 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Imazhet e sfondit"</string> <string name="settings_button_text" msgid="8873672322605444408">"Cilësimet e Home"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Çaktivizuar nga administratori"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Lejo rrotullimin e ekranit kryesor"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kur telefoni rrotullohet"</string> <string name="icon_badging_title" msgid="874121399231955394">"Pikat e njoftimeve"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Aktiv"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Joaktiv"</string> @@ -92,7 +94,7 @@ <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Për aplikacionet e reja"</string> <string name="icon_shape_override_label" msgid="2977264953998281004">"Ndrysho formën e ikonës"</string> <string name="icon_shape_override_label_location" msgid="3841607380657692863">"në ekranin bazë"</string> - <string name="icon_shape_system_default" msgid="1709762974822753030">"Përdor parazgjedhjen e sisteit"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Përdor parazgjedhjen e sistemit"</string> <string name="icon_shape_square" msgid="633575066111622774">"Katror"</string> <string name="icon_shape_squircle" msgid="5658049910802669495">"Katror me kënde të rrumbullakëta"</string> <string name="icon_shape_circle" msgid="6550072265930144217">"Rreth"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Zvogëlo lartësinë"</string> <string name="widget_resized" msgid="9130327887929620">"Madhësia e miniaplikacionit u ndryshua me gjerësinë <xliff:g id="NUMBER_0">%1$s</xliff:g> dhe lartësinë <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Shkurtoret"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> shkurtesa për <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> shkurtore dhe <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> njoftime për <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Hiqe"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Njoftimi u hoq"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personale"</string> diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 3ae87f9e5..d4223a8a1 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -82,6 +82,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Позадине"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Када се телефон ротира"</string> <string name="icon_badging_title" msgid="874121399231955394">"Тачке за обавештења"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Укључено"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Искључено"</string> @@ -129,8 +131,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Смањи висину"</string> <string name="widget_resized" msgid="9130327887929620">"Величина виџета је промењена на ширину <xliff:g id="NUMBER_0">%1$s</xliff:g> и висину <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Пречице"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> пречице(а) за <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Пречице (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) и обавештења (<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>) за <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Одбаци"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Обавештење је одбачено"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Личне"</string> diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 3c91c30b6..2fda5e24a 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Mapp: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Widgetar"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Bakgrunder"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Inställningar för startsidan"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Startinställningar"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Inaktiverat av administratören"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Tillåt rotering av startskärmen"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"När mobilen vrids"</string> <string name="icon_badging_title" msgid="874121399231955394">"Aviseringsprickar"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"På"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Av"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Minska höjden"</string> <string name="widget_resized" msgid="9130327887929620">"Widgetens storlek har ändrats till: bredd <xliff:g id="NUMBER_0">%1$s</xliff:g>, höjd <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Genvägar"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> genvägar för <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> har <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> genvägar och <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> aviseringar"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorera"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Aviseringen togs bort"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string> diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 61d7f8bed..5981b8684 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -81,8 +81,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Folda: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Wijeti"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Mandhari"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Mipangilio ya ukurasa wa mwanzo"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Mipangilio ya mwanzo"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Imezimwa na msimamizi wako"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Ruhusu kuzungusha skrini ya Kwanza"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Simu inapozungushwa"</string> <string name="icon_badging_title" msgid="874121399231955394">"Vitone vya arifa"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Imewashwa"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Imezimwa"</string> @@ -94,7 +96,7 @@ <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Kwa ajili ya programu mpya"</string> <string name="icon_shape_override_label" msgid="2977264953998281004">"Badilisha umbo la aikoni"</string> <string name="icon_shape_override_label_location" msgid="3841607380657692863">"kwenye Skrini ya mwanzo"</string> - <string name="icon_shape_system_default" msgid="1709762974822753030">"Tumia umbo chaguo-msingi la mfumo"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Tumia umbo chaguomsingi la mfumo"</string> <string name="icon_shape_square" msgid="633575066111622774">"Mraba"</string> <string name="icon_shape_squircle" msgid="5658049910802669495">"Mstatili wenye pembe duara"</string> <string name="icon_shape_circle" msgid="6550072265930144217">"Mduara"</string> @@ -130,8 +132,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Punguza urefu"</string> <string name="widget_resized" msgid="9130327887929620">"Wijeti imepunguzwa hadi upana <xliff:g id="NUMBER_0">%1$s</xliff:g> urefu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Njia za mkato"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Njia <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> za mkato za <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Njia <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> za mkato na arifa <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> za <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Ondoa"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Arifa imeondolewa"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Binafsi"</string> diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml index 1497b5a69..b21120758 100644 --- a/res/values-sw720dp/dimens.xml +++ b/res/values-sw720dp/dimens.xml @@ -15,9 +15,6 @@ --> <resources> - <!-- Dynamic Grid --> - <dimen name="dynamic_grid_min_page_indicator_size">24dp</dimen> - <!-- All Apps --> <dimen name="all_apps_button_scale_down">8dp</dimen> <dimen name="all_apps_empty_search_message_top_offset">64dp</dimen> diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml new file mode 100644 index 000000000..a51247c2d --- /dev/null +++ b/res/values-ta-rIN/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"பணியிடம்"</string> + <string name="activity_not_found" msgid="8071924732094499514">"பயன்பாடு நிறுவப்படவில்லை."</string> + <string name="activity_not_available" msgid="7456344436509528827">"பயன்பாடு இல்லை"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"குறுக்குவழி இல்லை"</string> + <string name="home_screen" msgid="806512411299847073">"முகப்புத் திரை"</string> + <string name="custom_actions" msgid="3747508247759093328">"தனிப்பயன் செயல்கள்"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d அகலத்திற்கு %2$d உயரம்"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"நீங்களே சேர்க்க, தொட்டுப் பிடித்திருக்கவும்"</string> + <string name="place_automatically" msgid="8064208734425456485">"தானாகவே சேர்"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"பயன்பாடுகளில் தேடுக"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"பயன்பாடுகளை ஏற்றுகிறது…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"கூடுதல் பயன்பாடுகளைத் தேடு"</string> + <string name="notifications_header" msgid="1404149926117359025">"அறிவிப்புகள்"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"ஷார்ட்கட்டைச் சேர்க்க, தொட்டு பிடித்திருக்கவும்."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"ஷார்ட்கட்டைச் சேர்க்க, இருமுறை தட்டிப் பிடித்திருக்கவும் (அ) தனிப்பயன் செயல்களைப் பயன்படுத்தவும்."</string> + <string name="out_of_space" msgid="4691004494942118364">"முகப்புத் திரையில் இடமில்லை."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"பிடித்தவை ட்ரேயில் இடமில்லை"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"பயன்பாடுகளின் பட்டியல்"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"தனிப்பட்ட ஆப்ஸ் பட்டியல்"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"பணி ஆப்ஸ் பட்டியல்"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"முகப்பு"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"அகற்று"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"நிறுவல் நீக்கு"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"பயன்பாட்டுத் தகவல்"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"நிறுவு"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"குறுக்குவழிகளை நிறுவுதல்"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"பயனரின் அனுமதி இல்லாமல் குறுக்குவழிகளைச் சேர்க்கப் பயன்பாட்டை அனுமதிக்கிறது."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"முகப்பின் அமைப்பு மற்றும் குறுக்குவழிகளைப் படித்தல்"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"முகப்பின் அமைப்பு மற்றும் குறுக்குவழிகளை எழுதுதல்"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளை மாற்ற பயன்பாட்டை அனுமதிக்கிறது."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"ஃபோன் அழைப்புகள் செய்ய, <xliff:g id="APP_NAME">%1$s</xliff:g> அனுமதிக்கப்படவில்லை"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"விட்ஜெட்டை ஏற்றுவதில் சிக்கல்"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"அமைவு"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"இது அமைப்பு பயன்பாடு என்பதால் நிறுவல் நீக்கம் செய்ய முடியாது."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"பெயரிடப்படாத கோப்புறை"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> முடக்கப்பட்டது"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> பயன்பாட்டில், <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> அறிவிப்புகள் வந்துள்ளன</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g> பயன்பாட்டில், <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> அறிவிப்பு வந்துள்ளது</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"பக்கம் %1$d / %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"முகப்புத் திரை %1$d of %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"புதிய முகப்புத் திரை பக்கம்"</string> + <string name="folder_opened" msgid="94695026776264709">"திறக்கப்பட்டக் கோப்புறை, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"கோப்புறையை மூட, தட்டவும்"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"மாற்றிய பெயரைச் சேமிக்க, தட்டவும்"</string> + <string name="folder_closed" msgid="4100806530910930934">"கோப்புறை மூடப்பட்டது"</string> + <string name="folder_renamed" msgid="1794088362165669656">"கோப்புறை <xliff:g id="NAME">%1$s</xliff:g> என மறுபெயரிடப்பட்டது"</string> + <string name="folder_name_format" msgid="6629239338071103179">"கோப்புறை: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"ஷார்ட்கட்ஸ்"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"வால்பேப்பர்கள்"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"மொபைலைச் சுழற்றும் போது"</string> + <string name="icon_badging_title" msgid="874121399231955394">"அறிவிப்புப் புள்ளிகள்"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ஆன்"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"முடக்கப்பட்டுள்ளது"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"அறிவிப்பிற்கான அணுகல் தேவை"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"அறிவிப்புப் புள்ளிகளைக் காட்ட, <xliff:g id="NAME">%1$s</xliff:g> இன் பயன்பாட்டு அறிவிப்புகளை இயக்கவும்"</string> + <string name="title_change_settings" msgid="1376365968844349552">"அமைப்புகளை மாற்று"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"அறிவிப்புப் புள்ளிகளைக் காட்டு"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"முகப்புத் திரையில் ஐகானைச் சேர்"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"புதிய பயன்பாடுகளுக்கு"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"ஐகான் வடிவத்தை மாற்று"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"முகப்புத் திரையில்"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"அமைப்பின் இயல்புநிலையைப் பயன்படுத்து"</string> + <string name="icon_shape_square" msgid="633575066111622774">"சதுரம்"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"சதுரவட்டம்"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"வட்டம்"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"கண்ணீர்துளி"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"ஐகான் வடிவத்தை மாற்றுகிறது"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"தெரியாதது"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"அகற்று"</string> + <string name="abandoned_search" msgid="891119232568284442">"தேடு"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"பயன்பாடு நிறுவப்படவில்லை"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ஐகானுக்கான பயன்பாடு நிறுவப்படவில்லை. இதை அகற்றலாம் அல்லது பயன்பாட்டைத் தேடி கைமுறையாக நிறுவலாம்."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g>ஐப் பதிவிறக்குகிறது, <xliff:g id="PROGRESS">%2$s</xliff:g> முடிந்தது"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g>ஐ நிறுவுவதற்காகக் காத்திருக்கிறது"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> விட்ஜெட்டுகள்"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"முகப்புத் திரையில் சேர்"</string> + <string name="action_move_here" msgid="2170188780612570250">"இங்கு நகர்த்து"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"முகப்புத் திரையில் சேர்க்கப்பட்டது"</string> + <string name="item_removed" msgid="851119963877842327">"அகற்றப்பட்டது"</string> + <string name="action_move" msgid="4339390619886385032">"நகர்த்து"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"<xliff:g id="NUMBER_0">%1$s</xliff:g> வரிசை, <xliff:g id="NUMBER_1">%2$s</xliff:g> நெடுவரிசைக்கு நகர்த்து"</string> + <string name="move_to_position" msgid="6750008980455459790">"நிலை <xliff:g id="NUMBER">%1$s</xliff:g>க்கு நகர்த்து"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"விரும்பும் நிலை <xliff:g id="NUMBER">%1$s</xliff:g>க்கு நகர்த்து"</string> + <string name="item_moved" msgid="4606538322571412879">"உருப்படி நகர்த்தப்பட்டது"</string> + <string name="add_to_folder" msgid="9040534766770853243">"இந்தக் கோப்புறையில் சேர்க்கும்: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> உள்ள கோப்புறையில் சேர்க்கும்"</string> + <string name="added_to_folder" msgid="4793259502305558003">"கோப்புறையில் உருப்படி சேர்க்கப்பட்டது"</string> + <string name="create_folder_with" msgid="4050141361160214248">"இதனுடன் கோப்புறையை உருவாக்கும்: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"கோப்புறை உருவாக்கப்பட்டது"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"முகப்புத் திரைக்கு நகர்த்து"</string> + <string name="action_resize" msgid="1802976324781771067">"அளவு மாற்று"</string> + <string name="action_increase_width" msgid="8773715375078513326">"அகலத்தை அதிகரி"</string> + <string name="action_increase_height" msgid="459390020612501122">"உயரத்தை அதிகரி"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"அகலத்தைக் குறை"</string> + <string name="action_decrease_height" msgid="282377193880900022">"உயரத்தைக் குறை"</string> + <string name="widget_resized" msgid="9130327887929620">"அகலம் <xliff:g id="NUMBER_0">%1$s</xliff:g> மற்றும் உயரம் <xliff:g id="NUMBER_1">%2$s</xliff:g>க்கு விட்ஜெட் அளவு மாற்றப்பட்டது"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"குறுக்குவழிகள்"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g>க்கான <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> குறுக்குவழிகள்"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> பயன்பாட்டிற்கான <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> குறுக்குவழிகளும் <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> அறிவிப்புகளும் உள்ளன"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"நிராகரி"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"அறிவிப்பு நிராகரிக்கப்பட்டது"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"தனிப்பட்டவை"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"பணி"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"பணி விவரம்"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"பணி ஆப்ஸை இங்கு காணலாம்"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"ஒவ்வொரு பணிப் பயன்பாடும் ஒரு பேட்ஜைக் கொண்டிருக்கும். இவை, ஆப்ஸ் உங்கள் நிறுவனத்தால் பாதுகாப்பாக வைக்கப்பட்டுள்ளன என்பதைக் குறிக்கின்றன. இந்த ஆப்ஸை எளிதாக அணுக, முகப்புத் திரைக்கு நகர்த்திக்கொள்ளவும்."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"உங்கள் நிறுவனம் நிர்வகிக்கிறது"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"ஆப்ஸும் அறிவிப்புகளும் ஆஃப் செய்யப்பட்டுள்ளன"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"மூடுக"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"மூடப்பட்டது"</string> +</resources> diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 13358c09c..5ff5ecc44 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -40,10 +40,8 @@ <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை"</string> <string name="all_apps_search_market_message" msgid="1366263386197059176">"கூடுதல் பயன்பாடுகளைத் தேடு"</string> <string name="notifications_header" msgid="1404149926117359025">"அறிவிப்புகள்"</string> - <!-- no translation found for long_press_shortcut_to_add (4524750017792716791) --> - <skip /> - <!-- no translation found for long_accessible_way_to_add_shortcut (3327314059613154633) --> - <skip /> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"ஷார்ட்கட்டைச் சேர்க்க, தொட்டு பிடித்திருக்கவும்."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"ஷார்ட்கட்டைச் சேர்க்க, இருமுறை தட்டிப் பிடித்திருக்கவும் (அ) தனிப்பயன் செயல்களைப் பயன்படுத்தவும்."</string> <string name="out_of_space" msgid="4691004494942118364">"முகப்புத் திரையில் இடமில்லை."</string> <string name="hotseat_out_of_space" msgid="7448809638125333693">"பிடித்தவை ட்ரேயில் இடமில்லை"</string> <string name="all_apps_button_label" msgid="8130441508702294465">"பயன்பாடுகளின் பட்டியல்"</string> @@ -52,7 +50,7 @@ <string name="all_apps_home_button_label" msgid="252062713717058851">"முகப்பு"</string> <string name="remove_drop_target_label" msgid="7812859488053230776">"அகற்று"</string> <string name="uninstall_drop_target_label" msgid="4722034217958379417">"நிறுவல் நீக்கு"</string> - <string name="app_info_drop_target_label" msgid="692894985365717661">"ஆப்ஸ் தகவல்"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"பயன்பாட்டுத் தகவல்"</string> <string name="install_drop_target_label" msgid="2539096853673231757">"நிறுவு"</string> <string name="permlab_install_shortcut" msgid="5632423390354674437">"குறுக்குவழிகளை நிறுவுதல்"</string> <string name="permdesc_install_shortcut" msgid="923466509822011139">"பயனரின் அனுமதி இல்லாமல் குறுக்குவழிகளைச் சேர்க்கப் பயன்பாட்டை அனுமதிக்கிறது."</string> @@ -83,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"வால்பேப்பர்கள்"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"மொபைலைச் சுழற்றும் போது"</string> <string name="icon_badging_title" msgid="874121399231955394">"அறிவிப்புப் புள்ளிகள்"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ஆன்"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"முடக்கப்பட்டுள்ளது"</string> @@ -130,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"உயரத்தைக் குறை"</string> <string name="widget_resized" msgid="9130327887929620">"அகலம் <xliff:g id="NUMBER_0">%1$s</xliff:g> மற்றும் உயரம் <xliff:g id="NUMBER_1">%2$s</xliff:g>க்கு விட்ஜெட் அளவு மாற்றப்பட்டது"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"குறுக்குவழிகள்"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g>க்கான <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> குறுக்குவழிகள்"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> பயன்பாட்டிற்கான <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> குறுக்குவழிகளும் <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> அறிவிப்புகளும் உள்ளன"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"நிராகரி"</string> <string name="notification_dismissed" msgid="6002233469409822874">"அறிவிப்பு நிராகரிக்கப்பட்டது"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"தனிப்பட்டவை"</string> diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml new file mode 100644 index 000000000..bffb1a870 --- /dev/null +++ b/res/values-te-rIN/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"కార్యాలయం"</string> + <string name="activity_not_found" msgid="8071924732094499514">"యాప్ ఇన్స్టాల్ చేయబడలేదు."</string> + <string name="activity_not_available" msgid="7456344436509528827">"యాప్ అందుబాటులో లేదు"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"డౌన్లోడ్ చేసిన యాప్ సురక్షిత మోడ్లో నిలిపివేయబడింది"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"సురక్షిత మోడ్లో విడ్జెట్లు నిలిపివేయబడ్డాయి"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"షార్ట్కట్ అందుబాటులో లేదు"</string> + <string name="home_screen" msgid="806512411299847073">"హోమ్ స్క్రీన్"</string> + <string name="custom_actions" msgid="3747508247759093328">"అనుకూల చర్యలు"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"విడ్జెట్ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"విడ్జెట్ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d వెడల్పు X %2$d ఎత్తు"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"మాన్యువల్గా ఉంచడానికి నొక్కి &amp పట్టుకోండి"</string> + <string name="place_automatically" msgid="8064208734425456485">"స్వయంచాలకంగా జోడించు"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"అప్లికేషన్లను శోధించండి"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"అప్లికేషన్లను లోడ్ చేస్తోంది…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"కి సరిపోలే అప్లికేషన్లేవీ కనుగొనబడలేదు"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"మరిన్ని యాప్ల కోసం వెతుకు"</string> + <string name="notifications_header" msgid="1404149926117359025">"నోటిఫికేషన్లు"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"షార్ట్కట్ని ఎంచుకోవడం కోసం నొక్కి, పట్టుకోండి."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"రెండుసార్లు నొక్కి, పట్టుకోవడం ద్వారా షార్ట్కట్ని ఎంచుకోండి లేదా అనుకూల చర్యలను ఉపయోగించండి."</string> + <string name="out_of_space" msgid="4691004494942118364">"ఈ హోమ్ స్క్రీన్లో ఖాళీ లేదు."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"ఇష్టమైనవి ట్రేలో ఖాళీ లేదు"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"అనువర్తనాల జాబితా"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"వ్యక్తిగత యాప్ల జాబితా"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"కార్యాలయ యాప్ల జాబితా"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"హోమ్"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"తీసివేయి"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"అన్ఇన్స్టాల్ చేయి"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"యాప్ సమాచారం"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"ఇన్స్టాల్ చేయండి"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"సత్వరమార్గాలను ఇన్స్టాల్ చేయడం"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"వినియోగదారు ప్రమేయం లేకుండా సత్వరమార్గాలను జోడించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"హోమ్ సెట్టింగ్లు మరియు సత్వరమార్గాలను చదవడం"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"హోమ్లో సెట్టింగ్లు మరియు సత్వరమార్గాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"హోమ్ సెట్టింగ్లు మరియు సత్వరమార్గాలను వ్రాయడం"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"హోమ్లో సెట్టింగ్లు మరియు సత్వరమార్గాలను మార్చడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"ఫోన్ కాల్లను చేసేందుకు <xliff:g id="APP_NAME">%1$s</xliff:g>కి అనుమతి లేదు"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"విడ్జెట్ను లోడ్ చేయడంలో సమస్య"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"సెటప్ చేయి"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"ఇది సిస్టమ్ యాప్ మరియు దీన్ని అన్ఇన్స్టాల్ చేయడం సాధ్యపడదు."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"పేరు లేని ఫోల్డర్"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> నిలిపివేయబడింది"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> నోటిఫికేషన్లను కలిగి ఉన్నారు</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g> <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> నోటిఫికేషన్ను కలిగి ఉన్నారు</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%2$dలో %1$dవ పేజీ"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$dలో %1$dవ హోమ్ స్క్రీన్"</string> + <string name="workspace_new_page" msgid="257366611030256142">"కొత్త హోమ్ స్క్రీన్ పేజీ"</string> + <string name="folder_opened" msgid="94695026776264709">"ఫోల్డర్ తెరవబడింది, <xliff:g id="WIDTH">%1$d</xliff:g> X <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"ఫోల్డర్ను మూసివేయడానికి నొక్కండి"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"పేరు మార్పును సేవ్ చేయడానికి నొక్కండి"</string> + <string name="folder_closed" msgid="4100806530910930934">"ఫోల్డర్ మూసివేయబడింది"</string> + <string name="folder_renamed" msgid="1794088362165669656">"ఫోల్డర్ పేరు <xliff:g id="NAME">%1$s</xliff:g>గా మార్చబడింది"</string> + <string name="folder_name_format" msgid="6629239338071103179">"ఫోల్డర్: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"విడ్జెట్లు"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"వాల్పేపర్లు"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ఫోన్ను తిప్పినప్పుడు"</string> + <string name="icon_badging_title" msgid="874121399231955394">"నోటిఫికేషన్ డాట్లు"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"ఆన్"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"ఆఫ్"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"నోటిఫికేషన్ యాక్సెస్ అవసరం"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"నోటిఫికేషన్ డాట్లను చూపించడానికి <xliff:g id="NAME">%1$s</xliff:g>కు యాప్ నోటిఫికేషన్లను ఆన్ చేయండి"</string> + <string name="title_change_settings" msgid="1376365968844349552">"సెట్టింగ్లను మార్చు"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"నోటిఫికేషన్ డాట్లను చూపుతుంది"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"హోమ్ స్క్రీన్కి చిహ్నాన్ని జోడించు"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"కొత్త యాప్ల కోసం"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"చిహ్న ఆకారాన్ని మార్చు"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"హోమ్ స్క్రీన్పై"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"సిస్టమ్ డిఫాల్ట్ను ఉపయోగించండి"</string> + <string name="icon_shape_square" msgid="633575066111622774">"చతురస్రం"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"చతురస్రాకార వృత్తం"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"వృత్తం"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"కన్నీటి చుక్క"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"చిహ్న ఆకార మార్పులను వర్తింపజేస్తోంది"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"తెలియదు"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"తీసివేయి"</string> + <string name="abandoned_search" msgid="891119232568284442">"వెతుకు"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"ఈ యాప్ ఇన్స్టాల్ చేయబడలేదు"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ఈ చిహ్నం యొక్క యాప్ ఇన్స్టాల్ చేయబడలేదు. మీరు దీన్ని తీసివేయవచ్చు లేదా ఆ యాప్ కోసం శోధించి దాన్ని మాన్యువల్గా ఇన్స్టాల్ చేయవచ్చు."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> డౌన్లోడ్ అవుతోంది, <xliff:g id="PROGRESS">%2$s</xliff:g> పూర్తయింది"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ఇన్స్టాల్ కావడానికి వేచి ఉంది"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> విడ్జెట్లు"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"హోమ్ స్క్రీన్కు జోడించు"</string> + <string name="action_move_here" msgid="2170188780612570250">"అంశాన్ని ఇక్కడికి తరలించు"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"అంశం హోమ్స్క్రీన్కి జోడించబడింది"</string> + <string name="item_removed" msgid="851119963877842327">"అంశం తీసివేయబడింది"</string> + <string name="action_move" msgid="4339390619886385032">"అంశాన్ని తరలించు"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"అడ్డు వరుస <xliff:g id="NUMBER_0">%1$s</xliff:g> నిలువు వరుస <xliff:g id="NUMBER_1">%2$s</xliff:g>కి తరలించు"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g>వ స్థానానికి తరలించు"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"ఇష్టమైనవిలో <xliff:g id="NUMBER">%1$s</xliff:g>వ స్థానానికి తరలించు"</string> + <string name="item_moved" msgid="4606538322571412879">"అంశం తరలించబడింది"</string> + <string name="add_to_folder" msgid="9040534766770853243">"ఈ ఫోల్డర్కి జోడించండి: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> గల ఫోల్డర్కు జోడించు"</string> + <string name="added_to_folder" msgid="4793259502305558003">"అంశం ఫోల్డర్కు జోడించబడింది"</string> + <string name="create_folder_with" msgid="4050141361160214248">"ఈ పేరుతో ఫోల్డర్ను సృష్టించండి: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"ఫోల్డర్ సృష్టించబడింది"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"హోమ్స్క్రీన్కు తరలించు"</string> + <string name="action_resize" msgid="1802976324781771067">"పరిమాణం మార్చు"</string> + <string name="action_increase_width" msgid="8773715375078513326">"వెడల్పును పెంచు"</string> + <string name="action_increase_height" msgid="459390020612501122">"ఎత్తును పెంచు"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"వెడల్పును తగ్గించు"</string> + <string name="action_decrease_height" msgid="282377193880900022">"ఎత్తును తగ్గించు"</string> + <string name="widget_resized" msgid="9130327887929620">"విడ్జెట్ పరిమాణం వెడల్పు <xliff:g id="NUMBER_0">%1$s</xliff:g>కి, ఎత్తు <xliff:g id="NUMBER_1">%2$s</xliff:g>కి మార్చబడింది"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"సత్వరమార్గాలు"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> కోసం <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> సత్వరమార్గాలు"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> కోసం <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> సత్వరమార్గాలు మరియు <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> నోటిఫికేషన్లు"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"తీసివేయి"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"నోటిఫికేషన్ తీసివేయబడింది"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"వ్యక్తిగతం"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"కార్యాలయం"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"కార్యాలయ ప్రొఫైల్"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"కార్యాలయ యాప్లను ఇక్కడ కనుగొనండి"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"ప్రతి కార్యాలయ యాప్కు బ్యాడ్జ్ ఉంది మరియు మీ సంస్థ ద్వారా సురక్షితంగా ఉంచబడుతుంది. సులభ యాక్సెస్ కోసం యాప్లను మీ హోమ్ స్క్రీన్కి తరలించండి."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"మీ సంస్థ ద్వారా నిర్వహించబడతాయి"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"నోటిఫికేషన్లు మరియు యాప్లు ఆఫ్ చేయబడ్డాయి"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"మూసివేయి"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"మూసివేయబడింది"</string> +</resources> diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 3f1762d00..0967119ea 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"వాల్పేపర్లు"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"ఫోన్ను తిప్పినప్పుడు"</string> <string name="icon_badging_title" msgid="874121399231955394">"నోటిఫికేషన్ డాట్లు"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"ఆన్"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"ఆఫ్"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"ఎత్తును తగ్గించు"</string> <string name="widget_resized" msgid="9130327887929620">"విడ్జెట్ పరిమాణం వెడల్పు <xliff:g id="NUMBER_0">%1$s</xliff:g>కి, ఎత్తు <xliff:g id="NUMBER_1">%2$s</xliff:g>కి మార్చబడింది"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"సత్వరమార్గాలు"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> కోసం <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> సత్వరమార్గాలు"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> కోసం <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> సత్వరమార్గాలు మరియు <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> నోటిఫికేషన్లు"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"తీసివేయి"</string> <string name="notification_dismissed" msgid="6002233469409822874">"నోటిఫికేషన్ తీసివేయబడింది"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"వ్యక్తిగతం"</string> diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index cac233350..52ea7521e 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"วอลเปเปอร์"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"เมื่อหมุนโทรศัพท์"</string> <string name="icon_badging_title" msgid="874121399231955394">"จุดแจ้งเตือน"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"เปิด"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"ปิด"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"ลดความสูง"</string> <string name="widget_resized" msgid="9130327887929620">"ปรับขนาดของวิดเจ็ตเป็นกว้าง <xliff:g id="NUMBER_0">%1$s</xliff:g> สูง <xliff:g id="NUMBER_1">%2$s</xliff:g> แล้ว"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"ทางลัด"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ทางลัดสำหรับ <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"ทางลัด <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> รายการและการแจ้งเตือน <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> รายการสำหรับ <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"ปิด"</string> <string name="notification_dismissed" msgid="6002233469409822874">"ปิดการแจ้งเตือนแล้ว"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"ส่วนตัว"</string> diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 0b9021422..0047aaeb3 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Mga Wallpaper"</string> <string name="settings_button_text" msgid="8873672322605444408">"Mga setting ng Home"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Na-disable ng iyong admin"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Payagan ang pag-rotate ng Home screen"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Kailan maro-rotate ang telepono"</string> <string name="icon_badging_title" msgid="874121399231955394">"Mga notification dot"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Naka-on"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Naka-off"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Bawasan ang taas"</string> <string name="widget_resized" msgid="9130327887929620">"Na-resize ang widget sa lapad <xliff:g id="NUMBER_0">%1$s</xliff:g> taas <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Mga Shortcut"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> (na) shortcut para sa <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> (na) shortcut at <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> (na) notification para sa <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"I-dismiss"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Na-dismiss ang notification"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string> diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 972554424..cfa9f9eaf 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Duvar Kağıtları"</string> <string name="settings_button_text" msgid="8873672322605444408">"Ana ekran ayarları"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Yöneticiniz tarafından devre dışı bırakıldı"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Ana ekranı döndürmeye izin ver"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon döndürüldüğünde"</string> <string name="icon_badging_title" msgid="874121399231955394">"Bildirim noktaları"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Açık"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Kapalı"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Yüksekliği azalt"</string> <string name="widget_resized" msgid="9130327887929620">"Widget, <xliff:g id="NUMBER_0">%1$s</xliff:g> genişlik ve <xliff:g id="NUMBER_1">%2$s</xliff:g> yükseklik değerine yeniden boyutlandırıldı"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Kısayollar"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> için <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> kısayol"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> için <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> kısayol ve <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> bildirim"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Kapat"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Bildirim kapatıldı"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Kişisel"</string> diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 47ddc7c94..aa5c676b1 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -83,6 +83,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Фонові малюнки"</string> <string name="settings_button_text" msgid="8873672322605444408">"Налаштування Home"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Вимкнув адміністратор"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Дозволити обертання головного екрана"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Коли телефон обертається"</string> <string name="icon_badging_title" msgid="874121399231955394">"Значки сповіщень"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Увімкнено"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Вимкнено"</string> @@ -130,8 +132,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Зменшити висоту"</string> <string name="widget_resized" msgid="9130327887929620">"Розміри віджета змінено на <xliff:g id="NUMBER_0">%1$s</xliff:g> завширшки та <xliff:g id="NUMBER_1">%2$s</xliff:g> заввишки"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Ярлики"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"Ярликів для додатка <xliff:g id="APP_NAME">%2$s</xliff:g>: <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"Ярлики (<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g>) і сповіщення (<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g>) додатка <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Закрити"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Сповіщення закрито"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Особисті додатки"</string> diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml new file mode 100644 index 000000000..77aa0a1eb --- /dev/null +++ b/res/values-ur-rPK/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"دفتری"</string> + <string name="activity_not_found" msgid="8071924732094499514">"ایپ انسٹال نہیں ہے۔"</string> + <string name="activity_not_available" msgid="7456344436509528827">"ایپ دستیاب نہیں ہے"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"ڈاؤن لوڈ کردہ ایپ کو محفوظ وضع میں غیر فعال کر دیا گیا"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"ویجیٹس کو محفوظ وضع میں غیر فعال کر دیا گیا"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"شارٹ کٹ دستیاب نہیں ہے"</string> + <string name="home_screen" msgid="806512411299847073">"ہوم اسکرین"</string> + <string name="custom_actions" msgid="3747508247759093328">"حسب ضرورت کارروائیاں"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔"</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔"</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d چوڑا اور %2$d اونچا"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"دستی طور پر رکھنے کیلئے & ٹچ کرکے ہولڈ کریں"</string> + <string name="place_automatically" msgid="8064208734425456485">"خود کار طور پر شامل کریں"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ایپس تلاش کریں"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"ایپس لوڈ کی جا رہی ہیں…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" سے مماثل کوئی ایپس نہیں ملیں"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"مزید ایپس تلاش کریں"</string> + <string name="notifications_header" msgid="1404149926117359025">"اطلاعات"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"ایک شارٹ کٹ منتخب کرنے کیلئے ٹچ کر کے دبائے رکھیں۔"</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"ایک شارٹ کٹ منتخب کرنے یا حسب ضرورت کارروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور دبائے رکھیں۔"</string> + <string name="out_of_space" msgid="4691004494942118364">"اس ہوم اسکرین پر مزید کوئی گنجائش نہیں ہے۔"</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"پسندیدہ ٹرے میں مزید کوئی گنجائش نہیں ہے"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"ایپس کی فہرست"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"ذاتی ایپس کی فہرست"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"دفتری ایپس کی فہرست"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"ہوم"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"ہٹائیں"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"اَن انسٹال کریں"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"ایپ کی معلومات"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"انسٹال کریں"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"شارٹ کٹس انسٹال کریں"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"کسی ایپ کو صارف کی مداخلت کے بغیر شارٹ کٹس شامل کرنے کی اجازت دیتا ہے۔"</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"ہوم ترتیبات اور شارٹ کٹس کو پڑھیں"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"ایپ کو ہوم میں ترتیبات اور شارٹ کٹس کو پڑھنے کی اجازت دیتا ہے۔"</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"ہوم ترتیبات اور شارٹ کٹس کو لکھیں"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"ایپ کو ہوم میں ترتیبات اور شارٹ کٹس کو تبدیل کرنے کی اجازت دیتا ہے۔"</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو فون کالیں کرنے کی اجازت نہیں ہے"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"ویجیٹ کو لوڈ کرنے میں مسئلہ"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"ترتیب دیں"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"یہ ایک سسٹم ایپ ہے اور اسے اَن انسٹال نہیں کیا جا سکتا ہے۔"</string> + <string name="folder_hint_text" msgid="6617836969016293992">"بلا نام فولڈر"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> غیر فعال ہے"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> میں <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> اطلاعات ہیں</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g> میں <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> اطلاع ہے</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"صفحہ %1$d از %2$d"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"ہوم اسکرین %1$d از %2$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"نیا ہوم اسکرین صفحہ"</string> + <string name="folder_opened" msgid="94695026776264709">"فولڈر کھولا گیا، <xliff:g id="WIDTH">%1$d</xliff:g> × <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"فولڈر کو بند کرنے کیلئے تھپتھپائیں"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"نام کی تبدیلی محفوظ کرنے کیلئے تھپتھپائیں"</string> + <string name="folder_closed" msgid="4100806530910930934">"فولڈر بند ہو گیا"</string> + <string name="folder_renamed" msgid="1794088362165669656">"فولڈر کا نام تبدیل کر کے <xliff:g id="NAME">%1$s</xliff:g> کر دیا گیا"</string> + <string name="folder_name_format" msgid="6629239338071103179">"فولڈر: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"ویجیٹس"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"وال پیپرز"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"جب فون گھمایا جاتا ہے"</string> + <string name="icon_badging_title" msgid="874121399231955394">"اطلاعاتی ڈاٹس"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"آن"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"آف"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"اطلاعاتی رسائی درکار ہے"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"اطلاعاتی ڈاٹس دکھانے کی خاطر <xliff:g id="NAME">%1$s</xliff:g> کیلئے ایپ کی اطلاعات آن کریں"</string> + <string name="title_change_settings" msgid="1376365968844349552">"ترتیبات تبدیل کریں"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"اطلاعاتی ڈاٹس دکھائیں"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"آئیکن کو ہوم اسکرین میں شامل کریں"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"نئی ایپس کیلئے"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"آئیکن کی شکل تبدیل کریں"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"ہوم اسکرین پر"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"سسٹم ڈیفالٹ کا استعمال کریں"</string> + <string name="icon_shape_square" msgid="633575066111622774">"مربع"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"اسکورکل"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"حلقہ"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"آنسو کا قطرہ"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"آئيکن کی شکل کی تبدیلیاں لاگو ہو رہی ہیں"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"نامعلوم"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"ہٹائیں"</string> + <string name="abandoned_search" msgid="891119232568284442">"تلاش کریں"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"یہ ایپ انسٹال کردہ نہیں ہے"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"اس آئیکن کیلئے ایپ انسٹال کردہ نہیں ہے۔ آپ اسے ہٹا سکتے ہیں یا ایپ کو تلاش کر سکتے اور دستی طور پر اسے انسٹال کر سکتے ہیں۔"</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ڈاؤن لوڈ ہو رہا ہے، <xliff:g id="PROGRESS">%2$s</xliff:g> مکمل ہو گیا"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> انسٹال ہونے کا انتظار کر رہی ہے"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> ویجیٹس"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"ہوم اسکرین میں شامل کریں"</string> + <string name="action_move_here" msgid="2170188780612570250">"آئٹم یہاں منتقل کریں"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"آئٹم کو ہوم اسکرین میں شامل کر دیا گیا"</string> + <string name="item_removed" msgid="851119963877842327">"آئٹم ہٹا دیا گیا"</string> + <string name="action_move" msgid="4339390619886385032">"آئٹم منتقل کریں"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"قطار <xliff:g id="NUMBER_0">%1$s</xliff:g> کالم <xliff:g id="NUMBER_1">%2$s</xliff:g> میں منتقل کریں"</string> + <string name="move_to_position" msgid="6750008980455459790">"پوزیشن <xliff:g id="NUMBER">%1$s</xliff:g> میں منتقل کریں"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"پسندیدہ پوزیشن <xliff:g id="NUMBER">%1$s</xliff:g> میں منتقل کریں"</string> + <string name="item_moved" msgid="4606538322571412879">"آئٹم منتقل کر دیا گیا"</string> + <string name="add_to_folder" msgid="9040534766770853243">"فولڈر میں شامل کریں: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> کے فولڈر میں شامل کریں"</string> + <string name="added_to_folder" msgid="4793259502305558003">"آئٹم فولڈر میں شامل کر دیا گیا"</string> + <string name="create_folder_with" msgid="4050141361160214248">"اس کے ساتھ فولڈر بنائیں: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="folder_created" msgid="6409794597405184510">"فولڈر بنا دیا گیا"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"ہوم اسکرین میں منتقل کریں"</string> + <string name="action_resize" msgid="1802976324781771067">"سائز تبدیل کریں"</string> + <string name="action_increase_width" msgid="8773715375078513326">"چوڑائی بڑھائیں"</string> + <string name="action_increase_height" msgid="459390020612501122">"اونچائی بڑھائیں"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"چوڑائی کم کریں"</string> + <string name="action_decrease_height" msgid="282377193880900022">"اونچائی کم کریں"</string> + <string name="widget_resized" msgid="9130327887929620">"ویجیٹ کے سائز کو چوڑائی <xliff:g id="NUMBER_0">%1$s</xliff:g> اونچائی <xliff:g id="NUMBER_1">%2$s</xliff:g> میں تبدیل کر دیا گیا"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"شارٹ کٹس"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> کیلئے <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> شارٹ کٹس"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> کے <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> شارٹ کٹس اور <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> اطلاعات"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"برخاست کریں"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"اطلاع مسترد ہو گئی"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"ذاتی"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"دفتری"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"دفتری پروفائل"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"یہاں دفتری ایپس تلاش کریں"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"ہر دفتری ایپ میں ایک بَیج ہوتا ہے اور اسے آپ کی تنظیم محفوظ رکھتی ہے۔ زیادہ آسان رسائی کیلئے ایپس کو اپنی ہوم اسکرین پر منتقل کریں۔"</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"آپ کی تنظیم کے زیر انتظام"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"اطلاعات اور ایپس آف ہیں"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"بند کریں"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"بند"</string> +</resources> diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 255807646..d8e339df0 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"وال پیپرز"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"جب فون گھمایا جاتا ہے"</string> <string name="icon_badging_title" msgid="874121399231955394">"اطلاعاتی ڈاٹس"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"آن"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"آف"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"اونچائی کم کریں"</string> <string name="widget_resized" msgid="9130327887929620">"ویجیٹ کے سائز کو چوڑائی <xliff:g id="NUMBER_0">%1$s</xliff:g> اونچائی <xliff:g id="NUMBER_1">%2$s</xliff:g> میں تبدیل کر دیا گیا"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"شارٹ کٹس"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> کیلئے <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> شارٹ کٹس"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> کے <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> شارٹ کٹس اور <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> اطلاعات"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"برخاست کریں"</string> <string name="notification_dismissed" msgid="6002233469409822874">"اطلاع مسترد ہو گئی"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"ذاتی"</string> diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml new file mode 100644 index 000000000..0360a7132 --- /dev/null +++ b/res/values-uz-rUZ/strings.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +* Copyright (C) 2008 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 xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="649227358658669779">"Launcher3"</string> + <string name="folder_name" msgid="7371454440695724752"></string> + <string name="work_folder_name" msgid="3753320833950115786">"Ishga oid"</string> + <string name="activity_not_found" msgid="8071924732094499514">"Ilova o‘rnatilmadi."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Ilova mavjud emas"</string> + <string name="safemode_shortcut_error" msgid="9160126848219158407">"Yuklab olingan ilova xavfsiz rejimda o‘chirib qo‘yildi"</string> + <string name="safemode_widget_error" msgid="4863470563535682004">"Xavfsiz rejimda vidjetlar o‘chirib qo‘yilgan"</string> + <string name="shortcut_not_available" msgid="2536503539825726397">"Tezkor tugmadan foydalanib bo‘lmaydi"</string> + <string name="home_screen" msgid="806512411299847073">"Bosh ekran"</string> + <string name="custom_actions" msgid="3747508247759093328">"Maxsus amallar"</string> + <string name="long_press_widget_to_add" msgid="7699152356777458215">"Vidjetni tanlash uchun bosib turing."</string> + <string name="long_accessible_way_to_add" msgid="4289502106628154155">"Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning."</string> + <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> + <string name="widget_accessible_dims_format" msgid="3640149169885301790">"Eni %1$d, bo‘yi %2$d"</string> + <string name="add_item_request_drag_hint" msgid="5899764264480397019">"Qo‘lda joylashtirish uchun bosib turing"</string> + <string name="place_automatically" msgid="8064208734425456485">"Avtomatik chiqarish"</string> + <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Ilovalarni qidirish"</string> + <string name="all_apps_loading_message" msgid="5813968043155271636">"Ilovalar yuklanmoqda…"</string> + <string name="all_apps_no_search_results" msgid="3200346862396363786">"“<xliff:g id="QUERY">%1$s</xliff:g>” bilan mos hech qanday ilova topilmadi"</string> + <string name="all_apps_search_market_message" msgid="1366263386197059176">"Boshqa ilovalarni qidirish"</string> + <string name="notifications_header" msgid="1404149926117359025">"Bildirishnomalar"</string> + <string name="long_press_shortcut_to_add" msgid="4524750017792716791">"Yorliqni tanlab olish uchun bosib turing."</string> + <string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Ikki marta bosib va bosib turgan holatda yorliqni tanlang yoki maxsus amaldan foydalaning."</string> + <string name="out_of_space" msgid="4691004494942118364">"Uy ekranida bitta ham xona yo‘q."</string> + <string name="hotseat_out_of_space" msgid="7448809638125333693">"Ajratilganlarda birorta ham xona yo‘q"</string> + <string name="all_apps_button_label" msgid="8130441508702294465">"Ilovalar ro‘yxati"</string> + <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Shaxsiy ilovalar ro‘yxati"</string> + <string name="all_apps_button_work_label" msgid="7270707118948892488">"Ishchi ilovalar ro‘yxati"</string> + <string name="all_apps_home_button_label" msgid="252062713717058851">"Bosh sahifa"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Olib tashlash"</string> + <string name="uninstall_drop_target_label" msgid="4722034217958379417">"O‘chirib tashlash"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Ilova haqida"</string> + <string name="install_drop_target_label" msgid="2539096853673231757">"O‘rnatish"</string> + <string name="permlab_install_shortcut" msgid="5632423390354674437">"yorliqlar yaratish"</string> + <string name="permdesc_install_shortcut" msgid="923466509822011139">"Ilovalarga foydalanuvchidan so‘ramasdan yorliqlar qo‘shishga ruxsat beradi."</string> + <string name="permlab_read_settings" msgid="1941457408239617576">"Uy sozlamalari va yorliqlarini o‘qish"</string> + <string name="permdesc_read_settings" msgid="5833423719057558387">"Ilovaga \"Uy\" ekranidagi yorliqlar va sozlamalarni o‘qish uchun ruxsat beradi."</string> + <string name="permlab_write_settings" msgid="3574213698004620587">"Uy sozlamalari va yorliqlarini yozish"</string> + <string name="permdesc_write_settings" msgid="5440712911516509985">"Ilovaga \"Uy\" ekranidagi yorliqlar va sozlamalrni o‘zgartirish uchun ruxsat beradi."</string> + <string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga qo‘ng‘iroqlarni amalga oshirishga ruxsat berilmagan"</string> + <string name="gadget_error_text" msgid="6081085226050792095">"Vidjetni yuklashda muammo"</string> + <string name="gadget_setup_text" msgid="8274003207686040488">"Sozlash"</string> + <string name="uninstall_system_app_text" msgid="4172046090762920660">"Bu tizim ilovasi, shuning uchun o‘chirib bo‘lmaydi."</string> + <string name="folder_hint_text" msgid="6617836969016293992">"Nomsiz jild"</string> + <string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi o‘chirib qo‘yildi"</string> + <plurals name="badged_app_label" formatted="false" msgid="7948068486082879291"> + <item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>, <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> ta bildirishnoma bor</item> + <item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>, <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> ta bildirishnoma bor</item> + </plurals> + <string name="default_scroll_format" msgid="7475544710230993317">"%2$ddan %1$d ta sahifa"</string> + <string name="workspace_scroll_format" msgid="8458889198184077399">"Uy ekrani %2$ddan %1$d"</string> + <string name="workspace_new_page" msgid="257366611030256142">"Yangi bosh ekran sahifasi"</string> + <string name="folder_opened" msgid="94695026776264709">"Jild ochildi, <xliff:g id="WIDTH">%1$d</xliff:g> ga <xliff:g id="HEIGHT">%2$d</xliff:g>"</string> + <string name="folder_tap_to_close" msgid="4625795376335528256">"Jildni yopish uchun ustiga bosing"</string> + <string name="folder_tap_to_rename" msgid="4017685068016979677">"O‘zgarishni saqlash uchun ustiga bosing"</string> + <string name="folder_closed" msgid="4100806530910930934">"Jild yopildi"</string> + <string name="folder_renamed" msgid="1794088362165669656">"Jild nomi <xliff:g id="NAME">%1$s</xliff:g>ga o‘zgartirildi"</string> + <string name="folder_name_format" msgid="6629239338071103179">"Jild: <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="widget_button_text" msgid="2880537293434387943">"Vidjetlar"</string> + <string name="wallpaper_button_text" msgid="8404103075899945851">"Fon rasmlari"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Bosh ekran sozlamalari"</string> + <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administrator tomonidan o‘chirilgan"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Asosiy ekranni aylantirishga ruxsat berish"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon burilganda"</string> + <string name="icon_badging_title" msgid="874121399231955394">"Bildirishnoma belgilari"</string> + <string name="icon_badging_desc_on" msgid="2627952638544674079">"Yoniq"</string> + <string name="icon_badging_desc_off" msgid="5503319969924580241">"O‘chiq"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"Bildirishnomalarga ruxsat berilmagan"</string> + <string name="msg_missing_notification_access" msgid="281113995110910548">"Bildirishnoma belgilarini ko‘rsatish uchun <xliff:g id="NAME">%1$s</xliff:g> ilovasida bildirishnomalarni yoqing"</string> + <string name="title_change_settings" msgid="1376365968844349552">"Sozlamalarni o‘zgartirish"</string> + <string name="icon_badging_service_title" msgid="2309733118428242174">"Bildirishnoma belgilarini ko‘rsatish"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Bosh ekranga ikonka chiqarish"</string> + <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish"</string> + <string name="icon_shape_override_label" msgid="2977264953998281004">"Ikonka shaklini o‘zgartirish"</string> + <string name="icon_shape_override_label_location" msgid="3841607380657692863">"Bosh ekranda"</string> + <string name="icon_shape_system_default" msgid="1709762974822753030">"Standart tizim parametrlaridan foydalanish"</string> + <string name="icon_shape_square" msgid="633575066111622774">"Kvadrat"</string> + <string name="icon_shape_squircle" msgid="5658049910802669495">"Qirralari aylana kvadrat"</string> + <string name="icon_shape_circle" msgid="6550072265930144217">"Aylana"</string> + <string name="icon_shape_teardrop" msgid="4525869388200835463">"Tomchi"</string> + <string name="icon_shape_override_progress" msgid="3461735694970239908">"Ikonka shakli o‘zgartirilmoqda"</string> + <string name="package_state_unknown" msgid="7592128424511031410">"Noma’lum"</string> + <string name="abandoned_clean_this" msgid="7610119707847920412">"O‘chirish"</string> + <string name="abandoned_search" msgid="891119232568284442">"Qidirish"</string> + <string name="abandoned_promises_title" msgid="7096178467971716750">"Ushbu ilova o‘rnatilmagan"</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Ilova o‘rnatilmagan. Belgini o‘chirib tashlashingiz yoki ilovani topib, uni qo‘lda o‘rnatishingiz mumkin."</string> + <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> yuklab olinmoqda, <xliff:g id="PROGRESS">%2$s</xliff:g> bajarildi"</string> + <string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> ilovasi o‘rnatilishi kutilmoqda"</string> + <string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> vidjetlari"</string> + <string name="action_add_to_workspace" msgid="8902165848117513641">"Bosh ekranga qo‘shish"</string> + <string name="action_move_here" msgid="2170188780612570250">"Obyektni bu yerga ko‘chirish"</string> + <string name="item_added_to_workspace" msgid="4211073925752213539">"Obyekt bosh ekranga qo‘shildi"</string> + <string name="item_removed" msgid="851119963877842327">"Obyekt o‘chirib tashlandi"</string> + <string name="action_move" msgid="4339390619886385032">"Obyektni ko‘chirib o‘tkazish"</string> + <string name="move_to_empty_cell" msgid="2833711483015685619">"<xliff:g id="NUMBER_0">%1$s</xliff:g> <xliff:g id="NUMBER_1">%2$s</xliff:g> katakka ko‘chirib o‘tkazish"</string> + <string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g>-joyga ko‘chirib o‘tkazish"</string> + <string name="move_to_hotseat_position" msgid="6295412897075147808">"Sevimlilarga (<xliff:g id="NUMBER">%1$s</xliff:g>) ko‘chirib o‘tkazish"</string> + <string name="item_moved" msgid="4606538322571412879">"Element ko‘chirib o‘tkazildi"</string> + <string name="add_to_folder" msgid="9040534766770853243">"<xliff:g id="NAME">%1$s</xliff:g> jildiga qo‘shish"</string> + <string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> ilovasi bor jildga qo‘shish"</string> + <string name="added_to_folder" msgid="4793259502305558003">"Element jildga qo‘shildi"</string> + <string name="create_folder_with" msgid="4050141361160214248">"<xliff:g id="NAME">%1$s</xliff:g> bilan jild yaratish"</string> + <string name="folder_created" msgid="6409794597405184510">"Jild yaratildi"</string> + <string name="action_move_to_workspace" msgid="1603837886334246317">"Bosh ekranga ko‘chirish"</string> + <string name="action_resize" msgid="1802976324781771067">"O‘lchamini o‘zgartirish"</string> + <string name="action_increase_width" msgid="8773715375078513326">"Enini uzaytirish"</string> + <string name="action_increase_height" msgid="459390020612501122">"Bo‘yini uzaytirish"</string> + <string name="action_decrease_width" msgid="1374549771083094654">"Enini kichraytirish"</string> + <string name="action_decrease_height" msgid="282377193880900022">"Bo‘yini kichraytirish"</string> + <string name="widget_resized" msgid="9130327887929620">"Vidjetning eni <xliff:g id="NUMBER_0">%1$s</xliff:g>, bo‘yi <xliff:g id="NUMBER_1">%2$s</xliff:g> qilib o‘zgartirildi"</string> + <string name="action_deep_shortcut" msgid="2864038805849372848">"Tezkor tugmalar"</string> + <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> ilovasi uchun <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ta tezkor tugma"</string> + <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> ilovasi uchun <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ta yorliq va <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ta bildirishnoma"</string> + <string name="action_dismiss_notification" msgid="5909461085055959187">"Yopish"</string> + <string name="notification_dismissed" msgid="6002233469409822874">"Bildirishnoma yopildi"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"Shaxsiy"</string> + <string name="all_apps_work_tab" msgid="4884822796154055118">"Ishchi"</string> + <string name="work_profile_toggle_label" msgid="3081029915775481146">"Ishchi profil"</string> + <string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Ishga oid ilovalarni shu yerdan topish mumkin"</string> + <string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Nishonga ega har bir ishga oid ilova tashkilotingiz tomonidan himoyalanadi. Ishga oid ilovalarga osonroq kirish uchun ularni bosh ekranga chiqaring."</string> + <string name="work_mode_on_label" msgid="4781128097185272916">"Tashkilotingiz tomonidan boshqariladi"</string> + <string name="work_mode_off_label" msgid="3194894777601421047">"Bildirishnomalar va ilovalar faol emas"</string> + <string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Yopish"</string> + <string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Yopiq"</string> +</resources> diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index e9f36a842..6b53e9657 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Jild: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Vidjetlar"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Fon rasmlari"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Home sozlamalari"</string> + <string name="settings_button_text" msgid="8873672322605444408">"Bosh ekran sozlamalari"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administrator tomonidan o‘chirilgan"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Asosiy ekranni aylantirishga ruxsat berish"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon burilganda"</string> <string name="icon_badging_title" msgid="874121399231955394">"Bildirishnoma belgilari"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Yoniq"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"O‘chiq"</string> @@ -88,7 +90,7 @@ <string name="msg_missing_notification_access" msgid="281113995110910548">"Bildirishnoma belgilarini ko‘rsatish uchun <xliff:g id="NAME">%1$s</xliff:g> ilovasida bildirishnomalarni yoqing"</string> <string name="title_change_settings" msgid="1376365968844349552">"Sozlamalarni o‘zgartirish"</string> <string name="icon_badging_service_title" msgid="2309733118428242174">"Bildirishnoma belgilarini ko‘rsatish"</string> - <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Bosh ekranga ikonka qo‘shish"</string> + <string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Bosh ekranga ikonka chiqarish"</string> <string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish"</string> <string name="icon_shape_override_label" msgid="2977264953998281004">"Ikonka shaklini o‘zgartirish"</string> <string name="icon_shape_override_label_location" msgid="3841607380657692863">"Bosh ekranda"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Bo‘yini kichraytirish"</string> <string name="widget_resized" msgid="9130327887929620">"Vidjetning eni <xliff:g id="NUMBER_0">%1$s</xliff:g>, bo‘yi <xliff:g id="NUMBER_1">%2$s</xliff:g> qilib o‘zgartirildi"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Tezkor tugmalar"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g> ilovasi uchun <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ta tezkor tugma"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g> ilovasi uchun <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> ta yorliq va <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ta bildirishnoma"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Yopish"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Bildirishnoma yopildi"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Shaxsiy"</string> diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 65a5eccf8..ab88cfec6 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"Thư mục: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"Tiện ích con"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Hình nền"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Cài đặt trang 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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Khi xoay điện thoại"</string> <string name="icon_badging_title" msgid="874121399231955394">"Dấu chấm thông báo"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Đang bật"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Đã tắt"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Giảm chiều cao"</string> <string name="widget_resized" msgid="9130327887929620">"Đã đổi kích thước tiện ích thành chiều rộng <xliff:g id="NUMBER_0">%1$s</xliff:g> chiều cao <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Lối tắt"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> phím tắt cho <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> phím tắt và <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> thông báo cho <xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Loại bỏ"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Đã loại bỏ thông báo"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Cá nhân"</string> diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index f8dd3cd05..a92208c83 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"壁纸"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"手机旋转时"</string> <string name="icon_badging_title" msgid="874121399231955394">"通知圆点"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"开启"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"关闭"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"减小高度"</string> <string name="widget_resized" msgid="9130327887929620">"微件尺寸已调整为:宽度 <xliff:g id="NUMBER_0">%1$s</xliff:g>,高度 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"快捷方式"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="APP_NAME">%2$s</xliff:g>有 <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> 个快捷方式"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="APP_NAME">%3$s</xliff:g>的 <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> 个快捷方式和 <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> 条通知"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"关闭"</string> <string name="notification_dismissed" msgid="6002233469409822874">"已关闭通知"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"个人"</string> diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 4828006cb..0f253003b 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -79,8 +79,10 @@ <string name="folder_name_format" msgid="6629239338071103179">"資料夾:<xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="widget_button_text" msgid="2880537293434387943">"小工具"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"桌布"</string> - <string name="settings_button_text" msgid="8873672322605444408">"Home 設定"</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> + <string name="allow_rotation_desc" msgid="8662546029078692509">"當手機旋轉時"</string> <string name="icon_badging_title" msgid="874121399231955394">"通知圓點"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"開啟"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"關閉"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"減少高度"</string> <string name="widget_resized" msgid="9130327887929620">"已調整小工具的大小至闊 <xliff:g id="NUMBER_0">%1$s</xliff:g> 高 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"捷徑"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"「<xliff:g id="APP_NAME">%2$s</xliff:g>」嘅 <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> 個捷徑"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"「<xliff:g id="APP_NAME">%3$s</xliff:g>」嘅 <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> 個捷徑同 <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> 個通知"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"關閉"</string> <string name="notification_dismissed" msgid="6002233469409822874">"關閉咗通知"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"個人"</string> diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 1a8d51534..c187b968b 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"桌布"</string> <string name="settings_button_text" msgid="8873672322605444408">"Home 設定"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"已由你的管理員停用"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"允許旋轉主螢幕"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"當手機旋轉時"</string> <string name="icon_badging_title" msgid="874121399231955394">"通知圓點"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"已啟用"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"已停用"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"減少高度"</string> <string name="widget_resized" msgid="9130327887929620">"已將小工具的寬度和高度分別調整為 <xliff:g id="NUMBER_0">%1$s</xliff:g> 和 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"捷徑"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"「<xliff:g id="APP_NAME">%2$s</xliff:g>」有 <xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> 個捷徑"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> 個捷徑和 <xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> 則「<xliff:g id="APP_NAME">%3$s</xliff:g>」通知"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"關閉"</string> <string name="notification_dismissed" msgid="6002233469409822874">"已關閉通知"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"個人"</string> diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 126145eac..6f92847c1 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -81,6 +81,8 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"Izithombe zangemuva"</string> <string name="settings_button_text" msgid="8873672322605444408">"Izilungiselelo zasekhaya"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Kukhutshazwe umlawuli wakho"</string> + <string name="allow_rotation_title" msgid="7728578836261442095">"Vumela ukuphendukiswa kwesikrini sasekhaya"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"Uma ifoni iphendukiswa"</string> <string name="icon_badging_title" msgid="874121399231955394">"Amachashazi esaziso"</string> <string name="icon_badging_desc_on" msgid="2627952638544674079">"Kuvuliwe"</string> <string name="icon_badging_desc_off" msgid="5503319969924580241">"Kuvaliwe"</string> @@ -128,8 +130,8 @@ <string name="action_decrease_height" msgid="282377193880900022">"Nciphisa ubude"</string> <string name="widget_resized" msgid="9130327887929620">"Iwijethi inikezwe usayizi omusha ngobubanzi obungu-<xliff:g id="NUMBER_0">%1$s</xliff:g> ubude obungu-<xliff:g id="NUMBER_1">%2$s</xliff:g>"</string> <string name="action_deep_shortcut" msgid="2864038805849372848">"Izinqamuleli"</string> - <string name="shortcuts_menu_description" msgid="406159963824238648">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> izinqamuleli ze-<xliff:g id="APP_NAME">%2$s</xliff:g>"</string> - <string name="shortcuts_menu_with_notifications_description" msgid="8985659504915468840">"<xliff:g id="NUMBER_OF_SHORTCUTS">%1$d</xliff:g> izinqamuleli nezaziso ezingu-<xliff:g id="NUMBER_OF_NOTIFICATIONS">%2$d</xliff:g> ze-<xliff:g id="APP_NAME">%3$s</xliff:g>"</string> + <!-- no translation found for shortcuts_menu_with_notifications_description (2676582286544232849) --> + <skip /> <string name="action_dismiss_notification" msgid="5909461085055959187">"Cashisa"</string> <string name="notification_dismissed" msgid="6002233469409822874">"Isaziso sicashisiwe"</string> <string name="all_apps_personal_tab" msgid="4190252696685155002">"Okomuntu siqu"</string> diff --git a/res/values/config.xml b/res/values/config.xml index a40afe113..d5bb131ef 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -41,9 +41,6 @@ <item type="id" name="drag_event_parity" /> <!-- AllApps & Launcher transitions --> - <!-- The alpha of the AppsCustomize bg in spring loaded mode --> - <integer name="config_workspaceScrimAlpha">76</integer> - <!-- Out of 100, the percent to shrink the workspace during spring loaded mode. --> <integer name="config_workspaceSpringLoadShrinkPercentage">90</integer> @@ -139,6 +136,7 @@ <item type="id" name="action_move_screen_forwards" /> <item type="id" name="action_resize" /> <item type="id" name="action_deep_shortcuts" /> + <item type="id" name="action_shortcuts_and_notifications"/> <item type="id" name="action_dismiss_notification" /> <!-- QSB IDs. DO not change --> @@ -147,6 +145,7 @@ <item type="id" name="search_container_all_apps" /> <!-- Recents --> + <item type="id" name="overview_panel"/> <integer name="config_recentsMaxThumbnailCacheSize">6</integer> <integer name="config_recentsMaxIconCacheSize">12</integer> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index b1ad11ef0..07e0b04dd 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -20,7 +20,6 @@ <!-- Dynamic Grid --> <dimen name="dynamic_grid_edge_margin">8dp</dimen> - <dimen name="dynamic_grid_min_page_indicator_size">24dp</dimen> <dimen name="dynamic_grid_page_indicator_line_height">1dp</dimen> <dimen name="dynamic_grid_icon_drawable_padding">8dp</dimen> <dimen name="dynamic_grid_workspace_top_padding">8dp</dimen> @@ -42,6 +41,7 @@ <dimen name="all_apps_scrim_radius">8dp</dimen> <dimen name="all_apps_scrim_margin">8dp</dimen> <dimen name="all_apps_scrim_blur">4dp</dimen> + <dimen name="vertical_drag_handle_size">24dp</dimen> <!-- Drop target bar --> <dimen name="dynamic_grid_drop_target_size">48dp</dimen> diff --git a/res/values/strings.xml b/res/values/strings.xml index bcb90e3fd..7bc11c3be 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -179,6 +179,10 @@ <string name="msg_disabled_by_admin">Disabled by your admin</string> <!-- Strings for settings --> + <!-- Title for Allow Rotation setting. [CHAR LIMIT=50] --> + <string name="allow_rotation_title">Allow Home screen rotation</string> + <!-- Text explaining when the home screen will get rotated. [CHAR LIMIT=100] --> + <string name="allow_rotation_desc">When phone is rotated</string> <!-- Title for Notification dots setting. Tapping this will link to the system Notifications settings screen where the user can turn off notification dots globally. [CHAR LIMIT=50] --> <string name="icon_badging_title">Notification dots</string> <!-- Text to indicate that the system icon badging setting is on [CHAR LIMIT=100] --> @@ -240,6 +244,11 @@ <!-- Title for a bottom sheet that shows widgets for a particular app --> <string name="widgets_bottom_sheet_title"><xliff:g id="name" example="Messenger">%1$s</xliff:g> widgets</string> + <!-- Accessibility title for the popup containing a list of widgets. [CHAR_LIMIT=50] --> + <string name="widgets_list">Widgets list</string> + <!-- Text announced by accessibility when the popup containing the list of widgets is closed. [CHAR_LIMIT=100] --> + <string name="widgets_list_closed">Widgets list closed</string> + <!-- Strings for accessibility actions --> <!-- Accessibility action to add an app to workspace. [CHAR_LIMIT=30] --> <string name="action_add_to_workspace">Add to Home screen</string> @@ -306,11 +315,9 @@ <!-- Accessibility action to show quick actions menu for an icon. [CHAR_LIMIT=30] --> <string name="action_deep_shortcut">Shortcuts</string> - - <!-- Accessibility description for the shortcuts menu shown for an app. --> - <string name="shortcuts_menu_description"><xliff:g id="number_of_shortcuts" example="3">%1$d</xliff:g> shortcuts for <xliff:g id="app_name" example="Messenger">%2$s</xliff:g></string> - <!-- Accessibility description when the shortcuts menu has notifications as well as shortcuts. --> - <string name="shortcuts_menu_with_notifications_description"><xliff:g id="number_of_shortcuts" example="3">%1$d</xliff:g> shortcuts and <xliff:g id="number_of_notifications" example="3">%2$d</xliff:g> notifications for <xliff:g id="app_name" example="Messenger">%3$s</xliff:g></string> + <!-- Accessibility description when the context menu of a launcher icon that has notifications as well as shortcuts (providing quick access to app's actions). The "shortcuts" translation should be consistent with the one for action_deep_shortcut. [CHAR_LIMIT=50] --> + <string name="shortcuts_menu_with_notifications_description">Shortcuts and notifications + </string> <!-- Accessibility action to dismiss a notification in the shortcuts menu for an icon. [CHAR_LIMIT=30] --> <string name="action_dismiss_notification">Dismiss</string> diff --git a/res/values/styles.xml b/res/values/styles.xml index 38b5daedb..631626f44 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -28,7 +28,7 @@ </style> <style name="BaseLauncherThemeWithCustomAttrs" parent="@style/BaseLauncherTheme"> - <item name="allAppsScrimColor">#CCFFFFFF</item> + <item name="allAppsScrimColor">#EAFFFFFF</item> <item name="allAppsNavBarScrimColor">#66FFFFFF</item> <item name="popupColorPrimary">#FFF</item> <item name="popupColorSecondary">#F5F5F5</item> <!-- Gray 100 --> @@ -60,8 +60,8 @@ <item name="android:textColorTertiary">#CCFFFFFF</item> <item name="android:textColorHint">#A0FFFFFF</item> <item name="android:colorControlHighlight">#A0FFFFFF</item> - <item name="android:colorPrimary">#FF333333</item> - <item name="allAppsScrimColor">#7A212121</item> + <item name="android:colorPrimary">#FF212121</item> + <item name="allAppsScrimColor">#EA212121</item> <item name="allAppsNavBarScrimColor">#80000000</item> <item name="popupColorPrimary">?android:attr/colorPrimary</item> <item name="popupColorSecondary">#424242</item> <!-- Gray 800 --> diff --git a/res/xml/launcher_preferences.xml b/res/xml/launcher_preferences.xml index 7bb19f334..3bba73a6c 100644 --- a/res/xml/launcher_preferences.xml +++ b/res/xml/launcher_preferences.xml @@ -34,8 +34,14 @@ android:title="@string/auto_add_shortcuts_label" android:summary="@string/auto_add_shortcuts_description" android:defaultValue="true" - android:persistent="true" - /> + android:persistent="true" /> + + <SwitchPreference + android:key="pref_allowRotation" + android:title="@string/allow_rotation_title" + android:summary="@string/allow_rotation_desc" + android:defaultValue="@bool/allow_rotation" + android:persistent="true" /> <ListPreference android:key="pref_override_icon_shape" diff --git a/src/com/android/launcher3/AbstractFloatingView.java b/src/com/android/launcher3/AbstractFloatingView.java index b0c5baf6b..c75509eab 100644 --- a/src/com/android/launcher3/AbstractFloatingView.java +++ b/src/com/android/launcher3/AbstractFloatingView.java @@ -16,10 +16,18 @@ package com.android.launcher3; +import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_FOCUSED; +import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED; +import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; + +import static com.android.launcher3.compat.AccessibilityManagerCompat.isAccessibilityEnabled; +import static com.android.launcher3.compat.AccessibilityManagerCompat.sendCustomAccessibilityEvent; + import android.annotation.SuppressLint; import android.content.Context; import android.support.annotation.IntDef; import android.util.AttributeSet; +import android.util.Pair; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; @@ -70,6 +78,9 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch public static final int TYPE_REBIND_SAFE = TYPE_WIDGETS_FULL_SHEET | TYPE_QUICKSTEP_PREVIEW | TYPE_ON_BOARD_POPUP; + // 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; + protected boolean mIsOpen; public AbstractFloatingView(Context context, AttributeSet attrs) { @@ -90,10 +101,13 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch } public final void close(boolean animate) { - animate &= !Utilities.isPowerSaverOn(getContext()); + animate &= !Utilities.isPowerSaverPreventingAnimation(getContext()); + if (mIsOpen) { + BaseActivity.fromContext(getContext()).getUserEventDispatcher() + .resetElapsedContainerMillis("container closed"); + } handleClose(animate); - BaseActivity.fromContext(getContext()).getUserEventDispatcher() - .resetElapsedContainerMillis("container closed"); + mIsOpen = false; } protected abstract void handleClose(boolean animate); @@ -109,9 +123,11 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch protected abstract boolean isOfType(@FloatingViewType int type); - public void onBackPressed() { + /** @return Whether the back is consumed. If false, Launcher will handle the back as well. */ + public boolean onBackPressed() { logActionCommand(Action.Command.BACK); close(true); + return true; } @Override @@ -119,6 +135,25 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch return false; } + protected void announceAccessibilityChanges() { + Pair<View, String> targetInfo = getAccessibilityTarget(); + if (targetInfo == null || !isAccessibilityEnabled(getContext())) { + return; + } + sendCustomAccessibilityEvent( + targetInfo.first, TYPE_WINDOW_STATE_CHANGED, targetInfo.second); + + if (mIsOpen) { + sendAccessibilityEvent(TYPE_VIEW_FOCUSED); + } + BaseDraggingActivity.fromContext(getContext()).getDragLayer() + .sendAccessibilityEvent(TYPE_WINDOW_CONTENT_CHANGED); + } + + protected Pair<View, String> getAccessibilityTarget() { + return null; + } + protected static <T extends AbstractFloatingView> T getOpenView( BaseDraggingActivity activity, @FloatingViewType int type) { BaseDragLayer dragLayer = activity.getDragLayer(); @@ -170,6 +205,11 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch } public static AbstractFloatingView getTopOpenView(BaseDraggingActivity activity) { - return getOpenView(activity, TYPE_ALL); + return getTopOpenViewWithType(activity, TYPE_ALL); + } + + public static AbstractFloatingView getTopOpenViewWithType(BaseDraggingActivity activity, + @FloatingViewType int type) { + return getOpenView(activity, type); } } diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index ae631a446..421966755 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -16,33 +16,70 @@ package com.android.launcher3; +import static com.android.launcher3.util.SystemUiController.UI_STATE_OVERVIEW; + +import static java.lang.annotation.RetentionPolicy.SOURCE; + import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; -import android.graphics.Point; -import android.view.Display; +import android.content.res.Configuration; +import android.support.annotation.IntDef; import android.view.View.AccessibilityDelegate; import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; import com.android.launcher3.logging.UserEventDispatcher; +import com.android.launcher3.uioverrides.UiFactory; import com.android.launcher3.util.SystemUiController; +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.lang.annotation.Retention; import java.util.ArrayList; public abstract class BaseActivity extends Activity { + public static final int INVISIBLE_BY_STATE_HANDLER = 1 << 0; + public static final int INVISIBLE_BY_APP_TRANSITIONS = 1 << 1; + public static final int INVISIBLE_ALL = + INVISIBLE_BY_STATE_HANDLER | INVISIBLE_BY_APP_TRANSITIONS; + + @Retention(SOURCE) + @IntDef( + flag = true, + value = {INVISIBLE_BY_STATE_HANDLER, INVISIBLE_BY_APP_TRANSITIONS}) + public @interface InvisibilityFlags{} + private final ArrayList<OnDeviceProfileChangeListener> mDPChangeListeners = new ArrayList<>(); + private final ArrayList<MultiWindowModeChangedListener> mMultiWindowModeChangedListeners = + new ArrayList<>(); protected DeviceProfile mDeviceProfile; protected UserEventDispatcher mUserEventDispatcher; protected SystemUiController mSystemUiController; - private boolean mStarted; + private static final int ACTIVITY_STATE_STARTED = 1 << 0; + private static final int ACTIVITY_STATE_RESUMED = 1 << 1; + /** + * State flag indicating if the user is active or the actitvity when to background as a result + * of user action. + * @see #isUserActive() + */ + private static final int ACTIVITY_STATE_USER_ACTIVE = 1 << 2; + + @Retention(SOURCE) + @IntDef( + flag = true, + value = {ACTIVITY_STATE_STARTED, ACTIVITY_STATE_RESUMED, ACTIVITY_STATE_USER_ACTIVE}) + public @interface ActivityFlags{} + + @ActivityFlags + private int mActivityFlags; + // When the recents animation is running, the visibility of the Launcher is managed by the // animation - private boolean mForceInvisible; - private boolean mUserActive; + @InvisibilityFlags private int mForceInvisible; public DeviceProfile getDeviceProfile() { return mDeviceProfile; @@ -84,35 +121,62 @@ public abstract class BaseActivity extends Activity { @Override protected void onStart() { - mStarted = true; + mActivityFlags |= ACTIVITY_STATE_STARTED; super.onStart(); } @Override protected void onResume() { - mUserActive = true; + mActivityFlags |= ACTIVITY_STATE_RESUMED | ACTIVITY_STATE_USER_ACTIVE; super.onResume(); } @Override protected void onUserLeaveHint() { - mUserActive = false; + mActivityFlags &= ~ACTIVITY_STATE_USER_ACTIVE; super.onUserLeaveHint(); } @Override + public void onMultiWindowModeChanged(boolean isInMultiWindowMode, Configuration newConfig) { + super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig); + for (int i = mMultiWindowModeChangedListeners.size() - 1; i >= 0; i--) { + mMultiWindowModeChangedListeners.get(i).onMultiWindowModeChanged(isInMultiWindowMode); + } + } + + @Override protected void onStop() { - mStarted = false; - mForceInvisible = false; + mActivityFlags &= ~ACTIVITY_STATE_STARTED & ~ACTIVITY_STATE_USER_ACTIVE; + mForceInvisible = 0; super.onStop(); } + @Override + protected void onPause() { + mActivityFlags &= ~ACTIVITY_STATE_RESUMED; + super.onPause(); + + // Reset the overridden sysui flags used for the task-swipe launch animation, we do this + // here instead of at the end of the animation because the start of the new activity does + // not happen immediately, which would cause us to reset to launcher's sysui flags and then + // back to the new app (causing a flash) + getSystemUiController().updateUiState(UI_STATE_OVERVIEW, 0); + } + public boolean isStarted() { - return mStarted; + return (mActivityFlags & ACTIVITY_STATE_STARTED) != 0; + } + + /** + * isResumed in already defined as a hidden final method in Activity.java + */ + public boolean hasBeenResumed() { + return (mActivityFlags & ACTIVITY_STATE_RESUMED) != 0; } public boolean isUserActive() { - return mUserActive; + return (mActivityFlags & ACTIVITY_STATE_USER_ACTIVE) != 0; } public void addOnDeviceProfileChangeListener(OnDeviceProfileChangeListener listener) { @@ -129,32 +193,51 @@ public abstract class BaseActivity extends Activity { } } + public void addMultiWindowModeChangedListener(MultiWindowModeChangedListener listener) { + mMultiWindowModeChangedListeners.add(listener); + } + + public void removeMultiWindowModeChangedListener(MultiWindowModeChangedListener listener) { + mMultiWindowModeChangedListeners.remove(listener); + } + /** * Used to set the override visibility state, used only to handle the transition home with the * recents animation. * @see LauncherAppTransitionManagerImpl.getWallpaperOpenRunner() */ - public void setForceInvisible(boolean invisible) { - mForceInvisible = invisible; + public void addForceInvisibleFlag(@InvisibilityFlags int flag) { + mForceInvisible |= flag; + } + + public void clearForceInvisibleFlag(@InvisibilityFlags int flag) { + mForceInvisible &= ~flag; } + /** * @return Wether this activity should be considered invisible regardless of actual visibility. */ public boolean isForceInvisible() { - return mForceInvisible; + return mForceInvisible != 0; } - /** - * Sets the device profile, adjusting it accordingly in case of multi-window - */ - protected void setDeviceProfile(DeviceProfile dp) { - mDeviceProfile = dp; - if (isInMultiWindowModeCompat()) { - Display display = getWindowManager().getDefaultDisplay(); - Point mwSize = new Point(); - display.getSize(mwSize); - mDeviceProfile = mDeviceProfile.getMultiWindowProfile(this, mwSize); + public interface MultiWindowModeChangedListener { + void onMultiWindowModeChanged(boolean isInMultiWindowMode); + } + + @Override + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + if (!UiFactory.dumpActivity(this, writer)) { + super.dump(prefix, fd, writer, args); } } + + protected void dumpMisc(PrintWriter writer) { + writer.println(" deviceProfile isTransposed=" + getDeviceProfile().isVerticalBarLayout()); + writer.println(" orientation=" + getResources().getConfiguration().orientation); + writer.println(" mSystemUiController: " + mSystemUiController); + writer.println(" mActivityFlags: " + mActivityFlags); + writer.println(" mForceInvisible: " + mForceInvisible); + } } diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java index bde9ad310..e47dbe535 100644 --- a/src/com/android/launcher3/BaseDraggingActivity.java +++ b/src/com/android/launcher3/BaseDraggingActivity.java @@ -28,13 +28,15 @@ import android.os.StrictMode; import android.os.UserHandle; import android.util.Log; import android.view.ActionMode; +import android.view.Surface; import android.view.View; import android.widget.Toast; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.dynamicui.WallpaperColorInfo; +import com.android.launcher3.uioverrides.DisplayRotationListener; +import com.android.launcher3.uioverrides.WallpaperColorInfo; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.views.BaseDragLayer; @@ -61,10 +63,13 @@ public abstract class BaseDraggingActivity extends BaseActivity private int mThemeRes = R.style.LauncherTheme; + private DisplayRotationListener mRotationListener; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mIsSafeModeEnabled = getPackageManager().isSafeMode(); + mRotationListener = new DisplayRotationListener(this, this::onDeviceRotationChanged); // Update theme WallpaperColorInfo wallpaperColorInfo = WallpaperColorInfo.getInstance(this); @@ -237,12 +242,30 @@ public abstract class BaseDraggingActivity extends BaseActivity protected void onDestroy() { super.onDestroy(); WallpaperColorInfo.getInstance(this).removeOnChangeListener(this); + mRotationListener.disable(); } public <T extends BaseDraggingActivity> void setOnStartCallback(OnStartCallback<T> callback) { mOnStartCallback = callback; } + protected void onDeviceProfileInitiated() { + if (mDeviceProfile.isVerticalBarLayout()) { + mRotationListener.enable(); + mDeviceProfile.updateIsSeascape(getWindowManager()); + } else { + mRotationListener.disable(); + } + } + + private void onDeviceRotationChanged() { + if (mDeviceProfile.updateIsSeascape(getWindowManager())) { + reapplyUi(); + } + } + + protected abstract void reapplyUi(); + /** * Callback for listening for onStart */ diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 41bfcb7ae..fb7c0ced4 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -65,27 +65,6 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, private static final int[] STATE_PRESSED = new int[] {android.R.attr.state_pressed}; - private final BaseDraggingActivity mActivity; - private Drawable mIcon; - private final boolean mCenterVertically; - - private final CheckLongPressHelper mLongPressHelper; - private final StylusEventHelper mStylusEventHelper; - private final float mSlop; - - private final boolean mLayoutHorizontal; - private final int mIconSize; - @ViewDebug.ExportedProperty(category = "launcher") - private int mTextColor; - private boolean mIsIconVisible = true; - - private BadgeInfo mBadgeInfo; - private BadgeRenderer mBadgeRenderer; - private int mBadgeColor; - private float mBadgeScale; - private boolean mForceHideBadge; - private Point mTempSpaceForBadgeOffset = new Point(); - private Rect mTempIconBounds = new Rect(); private static final Property<BubbleTextView, Float> BADGE_SCALE_PROPERTY = new Property<BubbleTextView, Float>(Float.TYPE, "badgeScale") { @@ -101,19 +80,45 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } }; - public static final Property<BubbleTextView, Integer> TEXT_ALPHA_PROPERTY - = new Property<BubbleTextView, Integer>(Integer.class, "textAlpha") { + public static final Property<BubbleTextView, Float> TEXT_ALPHA_PROPERTY + = new Property<BubbleTextView, Float>(Float.class, "textAlpha") { @Override - public Integer get(BubbleTextView bubbleTextView) { - return bubbleTextView.getTextAlpha(); + public Float get(BubbleTextView bubbleTextView) { + return bubbleTextView.mTextAlpha; } @Override - public void set(BubbleTextView bubbleTextView, Integer alpha) { + public void set(BubbleTextView bubbleTextView, Float alpha) { bubbleTextView.setTextAlpha(alpha); } }; + private final BaseDraggingActivity mActivity; + private Drawable mIcon; + private final boolean mCenterVertically; + + private final CheckLongPressHelper mLongPressHelper; + private final StylusEventHelper mStylusEventHelper; + private final float mSlop; + + private final boolean mLayoutHorizontal; + private final int mIconSize; + + @ViewDebug.ExportedProperty(category = "launcher") + private boolean mIsIconVisible = true; + @ViewDebug.ExportedProperty(category = "launcher") + private int mTextColor; + @ViewDebug.ExportedProperty(category = "launcher") + private float mTextAlpha = 1; + + private BadgeInfo mBadgeInfo; + private BadgeRenderer mBadgeRenderer; + private int mBadgeColor; + private float mBadgeScale; + private boolean mForceHideBadge; + private Point mTempSpaceForBadgeOffset = new Point(); + private Rect mTempIconBounds = new Rect(); + @ViewDebug.ExportedProperty(category = "launcher") private boolean mStayPressed; @ViewDebug.ExportedProperty(category = "launcher") @@ -166,7 +171,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, setEllipsize(TruncateAt.END); setAccessibilityDelegate(mActivity.getAccessibilityDelegate()); - + setTextAlpha(1f); } @Override @@ -404,13 +409,17 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, @Override public void setTextColor(int color) { mTextColor = color; - super.setTextColor(color); + super.setTextColor(getModifiedColor()); } @Override public void setTextColor(ColorStateList colors) { mTextColor = colors.getDefaultColor(); - super.setTextColor(colors); + if (Float.compare(mTextAlpha, 1) == 0) { + super.setTextColor(colors); + } else { + super.setTextColor(getModifiedColor()); + } } public boolean shouldTextBeVisible() { @@ -421,19 +430,21 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } public void setTextVisibility(boolean visible) { - if (visible) { - super.setTextColor(mTextColor); - } else { - setTextAlpha(0); - } + setTextAlpha(visible ? 1 : 0); } - public void setTextAlpha(int alpha) { - super.setTextColor(ColorUtils.setAlphaComponent(mTextColor, alpha)); + private void setTextAlpha(float alpha) { + mTextAlpha = alpha; + super.setTextColor(getModifiedColor()); } - private int getTextAlpha() { - return Color.alpha(getCurrentTextColor()); + private int getModifiedColor() { + if (mTextAlpha == 0) { + // Special case to prevent text shadows in high contrast mode + return Color.TRANSPARENT; + } + return ColorUtils.setAlphaComponent( + mTextColor, Math.round(Color.alpha(mTextColor) * mTextAlpha)); } /** @@ -441,8 +452,8 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, * @param fadeIn Whether the text should fade in or fade out. */ public ObjectAnimator createTextAlphaAnimator(boolean fadeIn) { - int toAlpha = shouldTextBeVisible() && fadeIn ? Color.alpha(mTextColor) : 0; - return ObjectAnimator.ofInt(this, TEXT_ALPHA_PROPERTY, toAlpha); + float toAlpha = shouldTextBeVisible() && fadeIn ? 1 : 0; + return ObjectAnimator.ofFloat(this, TEXT_ALPHA_PROPERTY, toAlpha); } @Override diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java index c86688020..ed8c42d07 100644 --- a/src/com/android/launcher3/ButtonDropTarget.java +++ b/src/com/android/launcher3/ButtonDropTarget.java @@ -45,6 +45,7 @@ import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; +import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.Themes; import com.android.launcher3.util.Thunk; @@ -192,8 +193,10 @@ public abstract class ButtonDropTarget extends TextView mCurrentFilter = new ColorMatrix(); } - Themes.setColorScaleOnMatrix(getTextColor(), mSrcFilter); - Themes.setColorScaleOnMatrix(targetColor, mDstFilter); + int defaultTextColor = mOriginalTextColor.getDefaultColor(); + Themes.setColorChangeOnMatrix(defaultTextColor, getTextColor(), mSrcFilter); + Themes.setColorChangeOnMatrix(defaultTextColor, targetColor, mDstFilter); + ValueAnimator anim1 = ValueAnimator.ofObject( new FloatArrayEvaluator(mCurrentFilter.getArray()), mSrcFilter.getArray(), mDstFilter.getArray()); @@ -373,5 +376,5 @@ public abstract class ButtonDropTarget extends TextView return !mText.equals(displayedText); } - public abstract int getControlTypeForLogging(); + public abstract Target getDropTargetForLogging(); } diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 797908261..6c2fd8e53 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -1980,7 +1980,7 @@ public class CellLayout extends ViewGroup { // Animations are disabled in power save mode, causing the repeated animation to jump // spastically between beginning and end states. Since this looks bad, we don't repeat // the animation in power save mode. - if (!Utilities.isPowerSaverOn(getContext())) { + if (!Utilities.isPowerSaverPreventingAnimation(getContext())) { va.setRepeatMode(ValueAnimator.REVERSE); va.setRepeatCount(ValueAnimator.INFINITE); } diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java index 28d11291b..64a58fb8c 100644 --- a/src/com/android/launcher3/DeleteDropTarget.java +++ b/src/com/android/launcher3/DeleteDropTarget.java @@ -24,10 +24,14 @@ import android.view.View; import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.folder.Folder; +import com.android.launcher3.logging.LoggerUtils; import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; +import com.android.launcher3.userevent.nano.LauncherLogProto.Target; public class DeleteDropTarget extends ButtonDropTarget { + private int mControlType = ControlType.DEFAULT_CONTROLTYPE; + public DeleteDropTarget(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -49,6 +53,7 @@ public class DeleteDropTarget extends ButtonDropTarget { public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) { super.onDragStart(dragObject, options); setTextBasedOnDragSource(dragObject.dragInfo); + setControlTypeBasedOnDragSource(dragObject.dragInfo); } /** @@ -83,6 +88,14 @@ public class DeleteDropTarget extends ButtonDropTarget { } } + /** + * Set mControlType depending on the drag item. + */ + private void setControlTypeBasedOnDragSource(ItemInfo item) { + mControlType = item.id != ItemInfo.NO_ID ? ControlType.REMOVE_TARGET + : ControlType.CANCEL_TARGET; + } + @Override public void completeDrop(DragObject d) { ItemInfo item = d.dragInfo; @@ -106,7 +119,9 @@ public class DeleteDropTarget extends ButtonDropTarget { } @Override - public int getControlTypeForLogging() { - return ControlType.REMOVE_TARGET; + public Target getDropTargetForLogging() { + Target t = LoggerUtils.newTarget(Target.Type.CONTROL); + t.controlType = mControlType; + return t; } } diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 4deed73b6..2f4772806 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -25,6 +25,8 @@ import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; import android.util.DisplayMetrics; +import android.view.Surface; +import android.view.WindowManager; import com.android.launcher3.CellLayout.ContainerType; import com.android.launcher3.badge.BadgeRenderer; @@ -68,8 +70,8 @@ public class DeviceProfile { public float workspaceSpringLoadShrinkFactor; public final int workspaceSpringLoadedBottomSpace; - // Page indicator - public final int pageIndicatorSizePx; + // Drag handle + public final int verticalDragHandleSizePx; // Workspace icons public int iconSizePx; @@ -118,6 +120,7 @@ public class DeviceProfile { private final Rect mInsets = new Rect(); public final Rect workspacePadding = new Rect(); private final Rect mHotseatPadding = new Rect(); + private boolean mIsSeascape; // Icon badges public BadgeRenderer mBadgeRenderer; @@ -157,8 +160,8 @@ public class DeviceProfile { res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_layout_padding); cellLayoutBottomPaddingPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_layout_bottom_padding); - pageIndicatorSizePx = res.getDimensionPixelSize( - R.dimen.dynamic_grid_min_page_indicator_size); + verticalDragHandleSizePx = res.getDimensionPixelSize( + R.dimen.vertical_drag_handle_size); defaultPageSpacingPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_workspace_page_spacing); topWorkspacePadding = @@ -205,7 +208,7 @@ public class DeviceProfile { // in portrait mode closer together by adding more height to the hotseat. // Note: This calculation was created after noticing a pattern in the design spec. int extraSpace = getCellSize().y - iconSizePx - iconDrawablePaddingPx; - hotseatBarSizePx += extraSpace - pageIndicatorSizePx; + hotseatBarSizePx += extraSpace - verticalDragHandleSizePx; // Recalculate the available dimensions using the new hotseat size. updateAvailableDimensions(dm, res); @@ -329,7 +332,7 @@ public class DeviceProfile { if (!isVerticalLayout) { int expectedWorkspaceHeight = availableHeightPx - hotseatBarSizePx - - pageIndicatorSizePx - topWorkspacePadding; + - verticalDragHandleSizePx - topWorkspacePadding; float minRequiredHeight = dropTargetBarSizePx + workspaceSpringLoadedBottomSpace; workspaceSpringLoadShrinkFactor = Math.min( res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f, @@ -426,13 +429,13 @@ public class DeviceProfile { padding.right = hotseatBarSidePaddingPx; if (isSeascape()) { padding.left += hotseatBarSizePx; - padding.right += pageIndicatorSizePx; + padding.right += verticalDragHandleSizePx; } else { - padding.left += pageIndicatorSizePx; + padding.left += verticalDragHandleSizePx; padding.right += hotseatBarSizePx; } } else { - int paddingBottom = hotseatBarSizePx + pageIndicatorSizePx; + int paddingBottom = hotseatBarSizePx + verticalDragHandleSizePx; if (isTablet) { // Pad the left and right of the workspace to ensure consistent spacing // between all icons @@ -499,7 +502,7 @@ public class DeviceProfile { mInsets.top + dropTargetBarSizePx + edgeMarginPx, mInsets.left + availableWidthPx - edgeMarginPx, mInsets.top + availableHeightPx - hotseatBarSizePx - - pageIndicatorSizePx - edgeMarginPx); + - verticalDragHandleSizePx - edgeMarginPx); } } @@ -519,9 +522,22 @@ public class DeviceProfile { return isLandscape && transposeLayoutWithOrientation; } + /** + * Updates orientation information and returns true if it has changed from the previous value. + */ + public boolean updateIsSeascape(WindowManager wm) { + if (isVerticalBarLayout()) { + boolean isSeascape = wm.getDefaultDisplay().getRotation() == Surface.ROTATION_270; + if (mIsSeascape != isSeascape) { + mIsSeascape = isSeascape; + return true; + } + } + return false; + } + public boolean isSeascape() { - // TODO: This might not hold true for multi window mode, use configuration insead. - return isVerticalBarLayout() && mInsets.left > mInsets.right; + return isVerticalBarLayout() && mIsSeascape; } public boolean shouldFadeAdjacentWorkspaceScreens() { diff --git a/src/com/android/launcher3/FastBitmapDrawable.java b/src/com/android/launcher3/FastBitmapDrawable.java index 3873a819f..1b91e8804 100644 --- a/src/com/android/launcher3/FastBitmapDrawable.java +++ b/src/com/android/launcher3/FastBitmapDrawable.java @@ -174,10 +174,6 @@ public class FastBitmapDrawable extends Drawable { return getBounds().height(); } - public Bitmap getBitmap() { - return mBitmap; - } - @Override public boolean isStateful() { return true; diff --git a/src/com/android/launcher3/FirstFrameAnimatorHelper.java b/src/com/android/launcher3/FirstFrameAnimatorHelper.java index 4eac4a4a7..e7ca12148 100644 --- a/src/com/android/launcher3/FirstFrameAnimatorHelper.java +++ b/src/com/android/launcher3/FirstFrameAnimatorHelper.java @@ -24,7 +24,8 @@ import android.view.View; import android.view.ViewPropertyAnimator; import android.view.ViewTreeObserver; import com.android.launcher3.util.Thunk; -import com.android.launcher3.util.TraceHelper; + +import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; /* * This is a helper class that listens to updates from the corresponding animation. @@ -36,7 +37,6 @@ public class FirstFrameAnimatorHelper extends AnimatorListenerAdapter private static final String TAG = "FirstFrameAnimatorHlpr"; private static final boolean DEBUG = false; private static final int MAX_DELAY = 1000; - private static final int IDEAL_FRAME_DURATION = 16; private final View mTarget; private long mStartFrame; private long mStartTime = -1; @@ -109,9 +109,9 @@ public class FirstFrameAnimatorHelper extends AnimatorListenerAdapter // prevents a large jump in the animation due to an expensive first frame } else if (frameNum == 1 && currentTime < mStartTime + MAX_DELAY && !mAdjustedSecondFrameTime && - currentTime > mStartTime + IDEAL_FRAME_DURATION && - currentPlayTime > IDEAL_FRAME_DURATION) { - animation.setCurrentPlayTime(IDEAL_FRAME_DURATION); + currentTime > mStartTime + SINGLE_FRAME_MS && + currentPlayTime > SINGLE_FRAME_MS) { + animation.setCurrentPlayTime(SINGLE_FRAME_MS); mAdjustedSecondFrameTime = true; } else { if (frameNum > 1) { diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index ab730741f..8d79737c5 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -107,6 +107,8 @@ public class IconCache { private final BitmapFactory.Options mLowResOptions; private final BitmapFactory.Options mHighResOptions; + private int mPendingIconRequestCount = 0; + public IconCache(Context context, InvariantDeviceProfile inv) { mContext = context; mPackageManager = context.getPackageManager(); @@ -411,8 +413,13 @@ public class IconCache { */ public IconLoadRequest updateIconInBackground(final ItemInfoUpdateReceiver caller, final ItemInfoWithIcon info) { - Runnable request = new Runnable() { + Preconditions.assertUIThread(); + if (mPendingIconRequestCount <= 0) { + LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_FOREGROUND); + } + mPendingIconRequestCount ++; + IconLoadRequest request = new IconLoadRequest(mWorkerHandler, this::onIconRequestEnd) { @Override public void run() { if (info instanceof AppInfo || info instanceof ShortcutInfo) { @@ -420,17 +427,21 @@ public class IconCache { } else if (info instanceof PackageItemInfo) { getTitleAndIconForApp((PackageItemInfo) info, false); } - mMainThreadExecutor.execute(new Runnable() { - - @Override - public void run() { - caller.reapplyItemInfo(info); - } + mMainThreadExecutor.execute(() -> { + caller.reapplyItemInfo(info); + onEnd(); }); } }; - mWorkerHandler.post(request); - return new IconLoadRequest(request, mWorkerHandler); + Utilities.postAsyncCallback(mWorkerHandler, request); + return request; + } + + private void onIconRequestEnd() { + mPendingIconRequestCount --; + if (mPendingIconRequestCount <= 0) { + LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_BACKGROUND); + } } /** @@ -707,17 +718,27 @@ public class IconCache { return false; } - public static class IconLoadRequest { - private final Runnable mRunnable; + public static abstract class IconLoadRequest implements Runnable { private final Handler mHandler; + private final Runnable mEndRunnable; + + private boolean mEnded = false; - IconLoadRequest(Runnable runnable, Handler handler) { - mRunnable = runnable; + IconLoadRequest(Handler handler, Runnable endRunnable) { mHandler = handler; + mEndRunnable = endRunnable; } public void cancel() { - mHandler.removeCallbacks(mRunnable); + mHandler.removeCallbacks(this); + onEnd(); + } + + public void onEnd() { + if (!mEnded) { + mEnded = true; + mEndRunnable.run(); + } } } @@ -780,7 +801,7 @@ public class IconCache { } private static final class IconDB extends SQLiteCacheHelper { - private final static int RELEASE_VERSION = 21; + private final static int RELEASE_VERSION = 22; private final static String TABLE_NAME = "icons"; private final static String COLUMN_ROWID = "rowid"; diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 90c55c983..14390ec02 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -22,6 +22,7 @@ import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.dragndrop.DragLayer.ALPHA_INDEX_LAUNCHER_LOAD; import static com.android.launcher3.logging.LoggerUtils.newContainerTarget; import android.animation.Animator; @@ -45,9 +46,11 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.database.sqlite.SQLiteDatabase; +import android.graphics.Point; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.os.Parcelable; import android.os.Process; import android.os.StrictMode; @@ -57,6 +60,7 @@ import android.text.TextUtils; import android.text.method.TextKeyListener; import android.util.Log; import android.util.SparseArray; +import android.view.Display; import android.view.KeyEvent; import android.view.KeyboardShortcutGroup; import android.view.KeyboardShortcutInfo; @@ -81,7 +85,6 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragView; -import com.android.launcher3.dynamicui.WallpaperColorInfo; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.folder.FolderIconPreviewVerifier; import com.android.launcher3.keyboard.CustomActionsPopup; @@ -104,6 +107,8 @@ import com.android.launcher3.util.ActivityResultInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.MultiHashMap; +import com.android.launcher3.util.MultiValueAlpha; +import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.PendingRequestArgs; @@ -195,7 +200,6 @@ public class Launcher extends BaseDraggingActivity private final int[] mTmpAddItemCellCoordinates = new int[2]; @Thunk Hotseat mHotseat; - private View mDragHandleIndicator; @Nullable private View mHotseatSearchBox; private DropTargetBar mDropTargetBar; @@ -207,6 +211,8 @@ public class Launcher extends BaseDraggingActivity // UI and state for the overview panel private View mOverviewPanel; + private View mOverviewPanelContainer; + @Thunk boolean mWorkspaceLoading = true; private OnResumeCallback mOnResumeCallback; @@ -218,9 +224,6 @@ public class Launcher extends BaseDraggingActivity private IconCache mIconCache; private LauncherAccessibilityDelegate mAccessibilityDelegate; - private ObjectAnimator mScrimAnimator; - private boolean mShouldFadeInScrim; - private PopupDataProvider mPopupDataProvider; private int mSynchronouslyBoundPage = PagedView.INVALID_PAGE; @@ -238,15 +241,12 @@ public class Launcher extends BaseDraggingActivity private PendingRequestArgs mPendingRequestArgs; public ViewGroupFocusHelper mFocusHandler; - private boolean mAppLaunchSuccess; private RotationHelper mRotationHelper; - // Used to keep track of the swipe up state - private SharedPreferences.OnSharedPreferenceChangeListener mSharedPrefsListener = - (sharedPreferences, s) -> { - mDragLayer.setup(mDragController); - }; + + private final Handler mHandler = new Handler(); + private final Runnable mLogOnDelayedResume = this::logOnDelayedResume; @Override protected void onCreate(Bundle savedInstanceState) { @@ -275,13 +275,13 @@ public class Launcher extends BaseDraggingActivity initDeviceProfile(app.getInvariantDeviceProfile()); mSharedPrefs = Utilities.getPrefs(this); - mSharedPrefs.registerOnSharedPreferenceChangeListener(mSharedPrefsListener); mIconCache = app.getIconCache(); mAccessibilityDelegate = new LauncherAccessibilityDelegate(this); mDragController = new DragController(this); mAllAppsController = new AllAppsTransitionController(this); mStateManager = new LauncherStateManager(this); + UiFactory.onCreate(this); mAppWidgetManager = AppWidgetManagerCompat.getInstance(this); @@ -317,7 +317,7 @@ public class Launcher extends BaseDraggingActivity if (!internalStateHandled) { // If we are not binding synchronously, show a fade in animation when // the first page bind completes. - mDragLayer.setAlpha(0); + mDragLayer.getAlphaProperty(ALPHA_INDEX_LAUNCHER_LOAD).setValue(0); } } else { // Pages bound synchronously. @@ -333,11 +333,7 @@ public class Launcher extends BaseDraggingActivity getRootView().dispatchInsets(); // Listen for broadcasts - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_SCREEN_OFF); - filter.addAction(Intent.ACTION_USER_PRESENT); // When the device wakes up + keyguard is gone - registerReceiver(mReceiver, filter); - mShouldFadeInScrim = true; + registerReceiver(mScreenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); getSystemUiController().updateUiState(SystemUiController.UI_STATE_BASE_WINDOW, Themes.getAttrBoolean(this, R.attr.isWorkspaceDarkText)); @@ -357,12 +353,8 @@ public class Launcher extends BaseDraggingActivity mUserEventDispatcher = null; initDeviceProfile(mDeviceProfile.inv); dispatchDeviceProfileChanged(); - - getRootView().dispatchInsets(); - getStateManager().reapplyState(); - - // Recreate touch controllers - mDragLayer.setup(mDragController); + reapplyUi(); + mDragLayer.recreateControllers(); // TODO: We can probably avoid rebind when only screen size changed. rebindModel(); @@ -374,6 +366,12 @@ public class Launcher extends BaseDraggingActivity } @Override + protected void reapplyUi() { + getRootView().dispatchInsets(); + getStateManager().reapplyState(true /* cancelCurrentAnimation */); + } + + @Override public void rebindModel() { int currentPage = mWorkspace.getNextPage(); if (mModel.startLoader(currentPage)) { @@ -384,7 +382,14 @@ public class Launcher extends BaseDraggingActivity private void initDeviceProfile(InvariantDeviceProfile idp) { // Load configuration-specific DeviceProfile - setDeviceProfile(idp.getDeviceProfile(this)); + mDeviceProfile = idp.getDeviceProfile(this); + if (isInMultiWindowModeCompat()) { + Display display = getWindowManager().getDefaultDisplay(); + Point mwSize = new Point(); + display.getSize(mwSize); + mDeviceProfile = mDeviceProfile.getMultiWindowProfile(this, mwSize); + } + onDeviceProfileInitiated(); mModelWriter = mModel.getWriter(mDeviceProfile.isVerticalBarLayout(), true); } @@ -727,15 +732,16 @@ public class Launcher extends BaseDraggingActivity if (mLauncherCallbacks != null) { mLauncherCallbacks.onStop(); } + getUserEventDispatcher().logActionCommand(Action.Command.STOP, + mStateManager.getState().containerType, -1); + mAppWidgetHost.setListenIfResumed(false); - if (!mAppLaunchSuccess) { - getUserEventDispatcher().logActionCommand(Action.Command.STOP, - mStateManager.getState().containerType, -1); - } NotificationListener.removeNotificationsChangedListener(); getStateManager().moveToRestState(); + // Workaround for b/78520668, explicitly trim memory once UI is hidden + onTrimMemory(TRIM_MEMORY_UI_HIDDEN); } @Override @@ -748,26 +754,15 @@ public class Launcher extends BaseDraggingActivity } mAppWidgetHost.setListenIfResumed(true); NotificationListener.setNotificationsChangedListener(mPopupDataProvider); + UiFactory.onStart(this); + } - if (mShouldFadeInScrim && mLauncherView.getBackground() != null) { - if (mScrimAnimator != null) { - mScrimAnimator.cancel(); - } - mLauncherView.getBackground().setAlpha(0); - mScrimAnimator = ObjectAnimator.ofInt(mLauncherView.getBackground(), - LauncherAnimUtils.DRAWABLE_ALPHA, 0, 255); - mScrimAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mScrimAnimator = null; - } - }); - mScrimAnimator.setDuration(600); - mScrimAnimator.setStartDelay(getWindow().getTransitionBackgroundFadeDuration()); - mScrimAnimator.start(); + private void logOnDelayedResume() { + if (hasBeenResumed()) { + getUserEventDispatcher().logActionCommand(Action.Command.RESUME, + mStateManager.getState().containerType, -1); + getUserEventDispatcher().startSession(); } - mShouldFadeInScrim = false; - UiFactory.onStart(this); } @Override @@ -776,8 +771,9 @@ public class Launcher extends BaseDraggingActivity super.onResume(); TraceHelper.partitionSection("ON_RESUME", "superCall"); - mAppLaunchSuccess = false; - getUserEventDispatcher().resetElapsedSessionMillis(); + mHandler.removeCallbacks(mLogOnDelayedResume); + Utilities.postAsyncCallback(mHandler, mLogOnDelayedResume); + setOnResumeCallback(null); // Process any items that were added while Launcher was away. InstallShortcutReceiver.disableAndFlushInstallQueue( @@ -786,7 +782,7 @@ public class Launcher extends BaseDraggingActivity // Refresh shortcuts if the permission changed. mModel.refreshShortcutsIfRequired(); - DiscoveryBounce.showIfNeeded(this); + DiscoveryBounce.showForHomeIfNeeded(this); if (mLauncherCallbacks != null) { mLauncherCallbacks.onResume(); } @@ -914,8 +910,8 @@ public class Launcher extends BaseDraggingActivity mWorkspace = mDragLayer.findViewById(R.id.workspace); mWorkspace.initParentViews(mDragLayer); mOverviewPanel = findViewById(R.id.overview_panel); + mOverviewPanelContainer = findViewById(R.id.overview_panel_container); mHotseat = findViewById(R.id.hotseat); - mDragHandleIndicator = findViewById(R.id.drag_indicator); mHotseatSearchBox = findViewById(R.id.search_container_hotseat); mLauncherView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN @@ -923,7 +919,8 @@ public class Launcher extends BaseDraggingActivity | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); // Setup the drag layer - mDragLayer.setup(mDragController); + mDragLayer.setup(mDragController, mWorkspace); + UiFactory.setOnTouchControllersChangedListener(this, mDragLayer::recreateControllers); mWorkspace.setup(mDragController); // Until the workspace is bound, ensure that we keep the wallpaper offset locked to the @@ -1100,21 +1097,13 @@ public class Launcher extends BaseDraggingActivity hostView.setOnFocusChangeListener(mFocusHandler); } - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + private final BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - if (Intent.ACTION_SCREEN_OFF.equals(action)) { - // Reset AllApps to its initial state only if we are not in the middle of - // processing a multi-step drop - if (mAppsView != null && mPendingRequestArgs == null) { - mStateManager.goToState(NORMAL); - } - mShouldFadeInScrim = true; - } else if (Intent.ACTION_USER_PRESENT.equals(action)) { - // ACTION_USER_PRESENT is sent after onStart/onResume. This covers the case where - // the user unlocked and the Launcher is not in the foreground. - mShouldFadeInScrim = false; + // Reset AllApps to its initial state only if we are not in the middle of + // processing a multi-step drop + if (mPendingRequestArgs == null) { + mStateManager.goToState(NORMAL); } } }; @@ -1148,12 +1137,6 @@ public class Launcher extends BaseDraggingActivity } } - public void onQuickstepGestureStarted(boolean isVisible) { - if (mLauncherCallbacks != null) { - mLauncherCallbacks.onQuickstepGestureStarted(isVisible); - } - } - public AllAppsTransitionController getAllAppsController() { return mAllAppsController; } @@ -1180,10 +1163,6 @@ public class Launcher extends BaseDraggingActivity return mHotseat; } - public View getDragHandleIndicator() { - return mDragHandleIndicator; - } - public View getHotseatSearchBox() { return mHotseatSearchBox; } @@ -1192,6 +1171,10 @@ public class Launcher extends BaseDraggingActivity return (T) mOverviewPanel; } + public <T extends View> T getOverviewPanelContainer() { + return (T) mOverviewPanelContainer; + } + public DropTargetBar getDropTargetBar() { return mDropTargetBar; } @@ -1255,7 +1238,7 @@ public class Launcher extends BaseDraggingActivity } // Reset the apps view - if (!alreadyOnHome && mAppsView != null) { + if (!alreadyOnHome) { mAppsView.reset(isStarted() /* animate */); } @@ -1270,7 +1253,7 @@ public class Launcher extends BaseDraggingActivity } if (mLauncherCallbacks != null) { - mLauncherCallbacks.onHomeIntent(); + mLauncherCallbacks.onHomeIntent(internalStateHandled); } } @@ -1324,9 +1307,11 @@ public class Launcher extends BaseDraggingActivity public void onDestroy() { super.onDestroy(); - unregisterReceiver(mReceiver); + unregisterReceiver(mScreenOffReceiver); mWorkspace.removeFolderListeners(); + UiFactory.setOnTouchControllersChangedListener(this, null); + // Stop callbacks from LauncherModel // It's possible to receive onDestroy after a new Launcher activity has // been created. In this case, don't interfere with the new Launcher. @@ -1335,7 +1320,6 @@ public class Launcher extends BaseDraggingActivity LauncherAppState.getInstance(this).setLauncher(null); } mRotationHelper.destroy(); - mSharedPrefs.unregisterOnSharedPreferenceChangeListener(mSharedPrefsListener); try { mAppWidgetHost.stopListening(); @@ -1615,8 +1599,8 @@ public class Launcher extends BaseDraggingActivity // by using if-else statements. UserEventDispatcher ued = getUserEventDispatcher(); AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(this); - if (topView != null) { - topView.onBackPressed(); + if (topView != null && topView.onBackPressed()) { + // Handled by the floating view. } else if (!isInState(NORMAL)) { LauncherState lastState = mStateManager.getLastState(); ued.logActionCommand(Action.Command.BACK, mStateManager.getState().containerType, @@ -1662,8 +1646,8 @@ public class Launcher extends BaseDraggingActivity } public boolean startActivitySafely(View v, Intent intent, ItemInfo item) { - mAppLaunchSuccess = super.startActivitySafely(v, intent, item); - if (mAppLaunchSuccess && v instanceof BubbleTextView) { + boolean success = super.startActivitySafely(v, intent, item); + if (success && v instanceof BubbleTextView) { // This is set to the view that launched the activity that navigated the user away // from launcher. Since there is no callback for when the activity has finished // launching, enable the press state and keep this reference to reset the press @@ -1672,7 +1656,7 @@ public class Launcher extends BaseDraggingActivity btv.setStayPressed(true); setOnResumeCallback(btv); } - return mAppLaunchSuccess; + return success; } boolean isHotseatLayout(View layout) { @@ -2119,9 +2103,18 @@ public class Launcher extends BaseDraggingActivity @Override public void finishFirstPageBind(final ViewOnDrawExecutor executor) { - if (mDragLayer.getAlpha() < 1) { - mDragLayer.animate().alpha(1).withEndAction( - executor == null ? null : executor::onLoadAnimationCompleted).start(); + AlphaProperty property = mDragLayer.getAlphaProperty(ALPHA_INDEX_LAUNCHER_LOAD); + if (property.getValue() < 1) { + ObjectAnimator anim = ObjectAnimator.ofFloat(property, MultiValueAlpha.VALUE, 1); + if (executor != null) { + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + executor.onLoadAnimationCompleted(); + } + }); + } + anim.start(); } else if (executor != null) { executor.onLoadAnimationCompleted(); } @@ -2298,8 +2291,8 @@ public class Launcher extends BaseDraggingActivity writer.print(prefix + "\tmWorkspaceLoading=" + mWorkspaceLoading); writer.print(" mPendingRequestArgs=" + mPendingRequestArgs); writer.println(" mPendingActivityResult=" + mPendingActivityResult); - writer.println(" deviceProfile isTransposed=" + getDeviceProfile().isVerticalBarLayout()); - writer.println(" orientation=" + getResources().getConfiguration().orientation); + writer.println(" mRotationHelper: " + mRotationHelper); + dumpMisc(writer); try { FileLog.flushAll(writer); @@ -2324,15 +2317,18 @@ public class Launcher extends BaseDraggingActivity shortcutInfos.add(new KeyboardShortcutInfo(getString(R.string.all_apps_button_label), KeyEvent.KEYCODE_A, KeyEvent.META_CTRL_ON)); } - View currentFocus = getCurrentFocus(); - if (new CustomActionsPopup(this, currentFocus).canShow()) { - shortcutInfos.add(new KeyboardShortcutInfo(getString(R.string.custom_actions), - KeyEvent.KEYCODE_O, KeyEvent.META_CTRL_ON)); - } - if (currentFocus.getTag() instanceof ItemInfo - && DeepShortcutManager.supportsShortcuts((ItemInfo) currentFocus.getTag())) { - shortcutInfos.add(new KeyboardShortcutInfo(getString(R.string.action_deep_shortcut), - KeyEvent.KEYCODE_S, KeyEvent.META_CTRL_ON)); + final View currentFocus = getCurrentFocus(); + if (currentFocus != null) { + if (new CustomActionsPopup(this, currentFocus).canShow()) { + shortcutInfos.add(new KeyboardShortcutInfo(getString(R.string.custom_actions), + KeyEvent.KEYCODE_O, KeyEvent.META_CTRL_ON)); + } + if (currentFocus.getTag() instanceof ItemInfo + && DeepShortcutManager.supportsShortcuts((ItemInfo) currentFocus.getTag())) { + shortcutInfos.add(new KeyboardShortcutInfo( + getString(R.string.shortcuts_menu_with_notifications_description), + KeyEvent.KEYCODE_S, KeyEvent.META_CTRL_ON)); + } } if (!shortcutInfos.isEmpty()) { data.add(new KeyboardShortcutGroup(getString(R.string.home_screen), shortcutInfos)); diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java index 9869fdf7e..03ffded72 100644 --- a/src/com/android/launcher3/LauncherAnimUtils.java +++ b/src/com/android/launcher3/LauncherAnimUtils.java @@ -39,6 +39,9 @@ public class LauncherAnimUtils { public static final int SPRING_LOADED_TRANSITION_MS = 150; public static final int SPRING_LOADED_EXIT_DELAY = 500; + // The progress of an animation to all apps must be at least this far along to snap to all apps. + public static final float MIN_PROGRESS_TO_ALL_APPS = 0.5f; + static WeakHashMap<Animator, Object> sAnimators = new WeakHashMap<Animator, Object>(); static Animator.AnimatorListener sEndAnimListener = new Animator.AnimatorListener() { public void onAnimationStart(Animator animation) { @@ -165,16 +168,8 @@ public class LauncherAnimUtils { } }; - public static final Property<View, Float> ELEVATION = - new Property<View, Float>(Float.class, "elevation") { - @Override - public Float get(View view) { - return view.getElevation(); - } - - @Override - public void set(View view, Float elevation) { - view.setElevation(elevation); - } - }; + /** Increase the duration if we prevented the fling, as we are going against a high velocity. */ + public static int blockedFlingDurationFactor(float velocity) { + return (int) Utilities.boundToRange(Math.abs(velocity) / 2, 2f, 6f); + } } diff --git a/src/com/android/launcher3/LauncherCallbacks.java b/src/com/android/launcher3/LauncherCallbacks.java index 35faaeac8..34bdb3c24 100644 --- a/src/com/android/launcher3/LauncherCallbacks.java +++ b/src/com/android/launcher3/LauncherCallbacks.java @@ -18,7 +18,6 @@ package com.android.launcher3; import android.content.Intent; import android.os.Bundle; -import android.view.Menu; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -50,7 +49,7 @@ public interface LauncherCallbacks { void onAttachedToWindow(); void onDetachedFromWindow(); void dump(String prefix, FileDescriptor fd, PrintWriter w, String[] args); - void onHomeIntent(); + void onHomeIntent(boolean internalStateHandled); boolean handleBackPressed(); void onTrimMemory(int level); @@ -70,12 +69,4 @@ public interface LauncherCallbacks { * Extensions points for adding / replacing some other aspects of the Launcher experience. */ boolean hasSettings(); - - /** - * Called when launcher integrated quickstep and some quickstep gesture started. It can be - * called multiple times for a single gesture an UI or background thread. - * - * @param isVisible if Launcher was visible when the gesture started. - */ - void onQuickstepGestureStarted(boolean isVisible); } diff --git a/src/com/android/launcher3/LauncherRootView.java b/src/com/android/launcher3/LauncherRootView.java index b1273b64c..3cf6d62b5 100644 --- a/src/com/android/launcher3/LauncherRootView.java +++ b/src/com/android/launcher3/LauncherRootView.java @@ -1,5 +1,8 @@ package com.android.launcher3; +import static com.android.launcher3.util.SystemUiController.FLAG_DARK_NAV; +import static com.android.launcher3.util.SystemUiController.UI_STATE_ROOT_VIEW; + import android.annotation.TargetApi; import android.app.ActivityManager; import android.content.Context; @@ -11,22 +14,14 @@ import android.util.AttributeSet; import android.view.View; import android.view.ViewDebug; -import com.android.launcher3.util.Themes; - -import static com.android.launcher3.util.SystemUiController.FLAG_DARK_NAV; -import static com.android.launcher3.util.SystemUiController.UI_STATE_ROOT_VIEW; - public class LauncherRootView extends InsettableFrameLayout { private final Launcher mLauncher; private final Paint mOpaquePaint; + @ViewDebug.ExportedProperty(category = "launcher") - private boolean mDrawSideInsetBar; - @ViewDebug.ExportedProperty(category = "launcher") - private int mLeftInsetBarWidth; - @ViewDebug.ExportedProperty(category = "launcher") - private int mRightInsetBarWidth; + private final Rect mConsumedInsets = new Rect(); private View mAlignedView; private WindowStateListener mWindowStateListener; @@ -54,18 +49,26 @@ public class LauncherRootView extends InsettableFrameLayout { @TargetApi(23) @Override protected boolean fitSystemWindows(Rect insets) { - mDrawSideInsetBar = (insets.right > 0 || insets.left > 0) && + mConsumedInsets.setEmpty(); + boolean drawInsetBar = false; + if (mLauncher.isInMultiWindowModeCompat() + && (insets.left > 0 || insets.right > 0 || insets.bottom > 0)) { + mConsumedInsets.left = insets.left; + mConsumedInsets.right = insets.right; + mConsumedInsets.bottom = insets.bottom; + insets = new Rect(0, insets.top, 0, 0); + drawInsetBar = true; + } else if ((insets.right > 0 || insets.left > 0) && (!Utilities.ATLEAST_MARSHMALLOW || - getContext().getSystemService(ActivityManager.class).isLowRamDevice()); - if (mDrawSideInsetBar) { - mLeftInsetBarWidth = insets.left; - mRightInsetBarWidth = insets.right; + getContext().getSystemService(ActivityManager.class).isLowRamDevice())) { + mConsumedInsets.left = insets.left; + mConsumedInsets.right = insets.right; insets = new Rect(0, insets.top, 0, insets.bottom); - } else { - mLeftInsetBarWidth = mRightInsetBarWidth = 0; + drawInsetBar = true; } + mLauncher.getSystemUiController().updateUiState( - UI_STATE_ROOT_VIEW, mDrawSideInsetBar ? FLAG_DARK_NAV : 0); + UI_STATE_ROOT_VIEW, drawInsetBar ? FLAG_DARK_NAV : 0); // Update device profile before notifying th children. mLauncher.getDeviceProfile().updateInsets(insets); @@ -73,16 +76,19 @@ public class LauncherRootView extends InsettableFrameLayout { setInsets(insets); if (mAlignedView != null) { - // Apply margins on aligned view to handle left/right insets. + // Apply margins on aligned view to handle consumed insets. MarginLayoutParams lp = (MarginLayoutParams) mAlignedView.getLayoutParams(); - if (lp.leftMargin != mLeftInsetBarWidth || lp.rightMargin != mRightInsetBarWidth) { - lp.leftMargin = mLeftInsetBarWidth; - lp.rightMargin = mRightInsetBarWidth; + if (lp.leftMargin != mConsumedInsets.left || lp.rightMargin != mConsumedInsets.right || + lp.bottomMargin != mConsumedInsets.bottom) { + lp.leftMargin = mConsumedInsets.left; + lp.rightMargin = mConsumedInsets.right; + lp.topMargin = mConsumedInsets.top; + lp.bottomMargin = mConsumedInsets.bottom; mAlignedView.setLayoutParams(lp); } } if (resetState) { - mLauncher.getStateManager().reapplyState(); + mLauncher.getStateManager().reapplyState(true /* cancelCurrentAnimation */); } return true; // I'll take it from here @@ -95,11 +101,10 @@ public class LauncherRootView extends InsettableFrameLayout { if (!insets.equals(mInsets)) { super.setInsets(insets); } - setBackground(insets.top == 0 ? null - : Themes.getAttrDrawable(getContext(), R.attr.workspaceStatusBarScrim)); } public void dispatchInsets() { + mLauncher.getDeviceProfile().updateInsets(mInsets); super.setInsets(mInsets); } @@ -108,14 +113,16 @@ public class LauncherRootView extends InsettableFrameLayout { super.dispatchDraw(canvas); // If the right inset is opaque, draw a black rectangle to ensure that is stays opaque. - if (mDrawSideInsetBar) { - if (mRightInsetBarWidth > 0) { - int width = getWidth(); - canvas.drawRect(width - mRightInsetBarWidth, 0, width, getHeight(), mOpaquePaint); - } - if (mLeftInsetBarWidth > 0) { - canvas.drawRect(0, 0, mLeftInsetBarWidth, getHeight(), mOpaquePaint); - } + if (mConsumedInsets.right > 0) { + int width = getWidth(); + canvas.drawRect(width - mConsumedInsets.right, 0, width, getHeight(), mOpaquePaint); + } + if (mConsumedInsets.left > 0) { + canvas.drawRect(0, 0, mConsumedInsets.left, getHeight(), mOpaquePaint); + } + if (mConsumedInsets.bottom > 0) { + int height = getHeight(); + canvas.drawRect(0, height - mConsumedInsets.bottom, getWidth(), height, mOpaquePaint); } } diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java index 4697b82f8..fbe27b0ac 100644 --- a/src/com/android/launcher3/LauncherState.java +++ b/src/com/android/launcher3/LauncherState.java @@ -21,6 +21,7 @@ import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CH import static com.android.launcher3.anim.Interpolators.ACCEL_2; import static com.android.launcher3.states.RotationHelper.REQUEST_NONE; +import android.graphics.Rect; import android.view.View; import android.view.animation.Interpolator; @@ -50,19 +51,17 @@ public class LauncherState { public static final int ALL_APPS_HEADER = 1 << 2; public static final int ALL_APPS_HEADER_EXTRA = 1 << 3; // e.g. app predictions public static final int ALL_APPS_CONTENT = 1 << 4; - public static final int DRAG_HANDLE_INDICATOR = 1 << 5; - - protected static final int FLAG_SHOW_SCRIM = 1 << 0; - protected static final int FLAG_MULTI_PAGE = 1 << 1; - protected static final int FLAG_DISABLE_ACCESSIBILITY = 1 << 2; - protected static final int FLAG_DISABLE_RESTORE = 1 << 3; - protected static final int FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED = 1 << 4; - protected static final int FLAG_DISABLE_PAGE_CLIPPING = 1 << 5; - protected static final int FLAG_PAGE_BACKGROUNDS = 1 << 6; - protected static final int FLAG_ALL_APPS_SCRIM = 1 << 7; - protected static final int FLAG_DISABLE_INTERACTION = 1 << 8; - protected static final int FLAG_OVERVIEW_UI = 1 << 9; - protected static final int FLAG_HIDE_BACK_BUTTON = 1 << 10; + + protected static final int FLAG_MULTI_PAGE = 1 << 0; + protected static final int FLAG_DISABLE_ACCESSIBILITY = 1 << 1; + protected static final int FLAG_DISABLE_RESTORE = 1 << 2; + protected static final int FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED = 1 << 3; + protected static final int FLAG_DISABLE_PAGE_CLIPPING = 1 << 4; + protected static final int FLAG_PAGE_BACKGROUNDS = 1 << 5; + protected static final int FLAG_DISABLE_INTERACTION = 1 << 6; + protected static final int FLAG_OVERVIEW_UI = 1 << 7; + protected static final int FLAG_HIDE_BACK_BUTTON = 1 << 8; + protected static final int FLAG_HAS_SYS_UI_SCRIM = 1 << 9; protected static final PageAlphaProvider DEFAULT_ALPHA_PROVIDER = new PageAlphaProvider(ACCEL_2) { @@ -77,8 +76,9 @@ public class LauncherState { /** * TODO: Create a separate class for NORMAL state. */ - public static final LauncherState NORMAL = new LauncherState(0, ContainerType.WORKSPACE, - 0, FLAG_DISABLE_RESTORE | FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED | FLAG_HIDE_BACK_BUTTON); + public static final LauncherState NORMAL = new LauncherState(0, ContainerType.WORKSPACE, 0, + FLAG_DISABLE_RESTORE | FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED | FLAG_HIDE_BACK_BUTTON | + FLAG_HAS_SYS_UI_SCRIM); /** * Various Launcher states arranged in the increasing order of UI layers @@ -88,6 +88,8 @@ public class LauncherState { public static final LauncherState FAST_OVERVIEW = new FastOverviewState(3); public static final LauncherState ALL_APPS = new AllAppsState(4); + protected static final Rect sTempRect = new Rect(); + public final int ordinal; /** @@ -116,9 +118,7 @@ public class LauncherState { * * @see WorkspaceStateTransitionAnimation */ - public final boolean hasScrim; public final boolean hasWorkspacePageBackground; - public final boolean hasAllAppsScrim; public final int transitionDuration; @@ -149,14 +149,13 @@ public class LauncherState { */ public final boolean hideBackButton; + public final boolean hasSysUiScrim; + public LauncherState(int id, int containerType, int transitionDuration, int flags) { this.containerType = containerType; this.transitionDuration = transitionDuration; - this.hasScrim = (flags & FLAG_SHOW_SCRIM) != 0; this.hasWorkspacePageBackground = (flags & FLAG_PAGE_BACKGROUNDS) != 0; - this.hasAllAppsScrim = (flags & FLAG_ALL_APPS_SCRIM) != 0; - this.hasMultipleVisiblePages = (flags & FLAG_MULTI_PAGE) != 0; this.workspaceAccessibilityFlag = (flags & FLAG_DISABLE_ACCESSIBILITY) != 0 ? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS @@ -167,6 +166,7 @@ public class LauncherState { this.disableInteraction = (flags & FLAG_DISABLE_INTERACTION) != 0; this.overviewUi = (flags & FLAG_OVERVIEW_UI) != 0; this.hideBackButton = (flags & FLAG_HIDE_BACK_BUTTON) != 0; + this.hasSysUiScrim = (flags & FLAG_HAS_SYS_UI_SCRIM) != 0; this.ordinal = id; sAllStates[id] = this; @@ -186,7 +186,7 @@ public class LauncherState { * translationY factor where 0 is top aligned and 0.5 is centered vertically */ public float[] getOverviewScaleAndTranslationYFactor(Launcher launcher) { - return new float[] {1.2f, 0.2f}; + return new float[] {1.1f, 0f}; } public void onStateEnabled(Launcher launcher) { @@ -201,9 +201,9 @@ public class LauncherState { public int getVisibleElements(Launcher launcher) { if (launcher.getDeviceProfile().isVerticalBarLayout()) { - return HOTSEAT_ICONS | DRAG_HANDLE_INDICATOR; + return HOTSEAT_ICONS; } - return HOTSEAT_ICONS | DRAG_HANDLE_INDICATOR | HOTSEAT_SEARCH_BOX; + return HOTSEAT_ICONS | HOTSEAT_SEARCH_BOX; } /** @@ -215,6 +215,10 @@ public class LauncherState { return 1f; } + public float getWorkspaceScrimAlpha(Launcher launcher) { + return 0; + } + public String getDescription(Launcher launcher) { return launcher.getWorkspace().getCurrentPageDescription(); } diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index 534c8ae35..e6fc4c6d4 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -16,7 +16,17 @@ package com.android.launcher3; +import static android.view.View.VISIBLE; import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_FADE; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_SCALE; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_FADE; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_SCALE; +import static com.android.launcher3.anim.Interpolators.ACCEL; +import static com.android.launcher3.anim.Interpolators.DEACCEL; +import static com.android.launcher3.anim.Interpolators.DEACCEL_1_7; +import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2; +import static com.android.launcher3.anim.Interpolators.clampToProgress; import static com.android.launcher3.anim.PropertySetter.NO_ANIM_PROPERTY_SETTER; import android.animation.Animator; @@ -24,6 +34,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.os.Handler; import android.os.Looper; +import android.support.annotation.IntDef; import android.view.View; import com.android.launcher3.anim.AnimationSuccessListener; @@ -33,6 +44,8 @@ import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.anim.PropertySetter.AnimatedPropertySetter; import com.android.launcher3.uioverrides.UiFactory; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; /** @@ -80,6 +93,21 @@ public class LauncherStateManager { public static final String TAG = "StateManager"; + // We separate the state animations into "atomic" and "non-atomic" components. The atomic + // components may be run atomically - that is, all at once, instead of user-controlled. However, + // atomic components are not restricted to this purpose; they can be user-controlled alongside + // non atomic components as well. + @IntDef(flag = true, value = { + NON_ATOMIC_COMPONENT, + ATOMIC_COMPONENT + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AnimationComponents {} + public static final int NON_ATOMIC_COMPONENT = 1 << 0; + public static final int ATOMIC_COMPONENT = 1 << 1; + + public static final int ANIM_ALL = NON_ATOMIC_COMPONENT | ATOMIC_COMPONENT; + private final AnimationConfig mConfig = new AnimationConfig(); private final Handler mUiHandler; private final Launcher mLauncher; @@ -121,7 +149,7 @@ public class LauncherStateManager { * @see #goToState(LauncherState, boolean, Runnable) */ public void goToState(LauncherState state) { - goToState(state, mLauncher.isStarted() /* animated */, 0, null); + goToState(state, !mLauncher.isForceInvisible() && mLauncher.isStarted() /* animated */); } /** @@ -157,6 +185,13 @@ public class LauncherStateManager { } public void reapplyState() { + reapplyState(false); + } + + public void reapplyState(boolean cancelCurrentAnimation) { + if (cancelCurrentAnimation) { + cancelAnimation(); + } if (mConfig.mCurrentAnimation == null) { for (StateHandler handler : getStateHandlers()) { handler.setState(mState); @@ -173,7 +208,7 @@ public class LauncherStateManager { onCompleteRunnable.run(); } return; - } else if (!mConfig.userControlled && animated) { + } else if (!mConfig.userControlled && animated && mConfig.mTargetState == state) { // We are running the same animation as requested if (onCompleteRunnable != null) { mConfig.mCurrentAnimation.addListener(new AnimationSuccessListener() { @@ -212,8 +247,10 @@ public class LauncherStateManager { // transition plays in reverse and use the same duration as previous state. mConfig.duration = state == NORMAL ? mState.transitionDuration : state.transitionDuration; + AnimatorSetBuilder builder = new AnimatorSetBuilder(); + prepareForAtomicAnimation(mState, state, builder); AnimatorSet animation = createAnimationToNewWorkspaceInternal( - state, new AnimatorSetBuilder(), onCompleteRunnable); + state, builder, onCompleteRunnable); Runnable runnable = new StartAnimRunnable(animation, state.getFinalFocus(mLauncher)); if (delay > 0) { mUiHandler.postDelayed(runnable, delay); @@ -223,6 +260,43 @@ public class LauncherStateManager { } /** + * Prepares for a non-user controlled animation from fromState to toState. Preparations include: + * - Setting interpolators for various animations included in the state transition. + * - Setting some start values (e.g. scale) for views that are hidden but about to be shown. + */ + public void prepareForAtomicAnimation(LauncherState fromState, LauncherState toState, + AnimatorSetBuilder builder) { + if (fromState == NORMAL && toState.overviewUi) { + builder.setInterpolator(ANIM_WORKSPACE_SCALE, OVERSHOOT_1_2); + builder.setInterpolator(ANIM_WORKSPACE_FADE, OVERSHOOT_1_2); + builder.setInterpolator(ANIM_OVERVIEW_SCALE, OVERSHOOT_1_2); + builder.setInterpolator(ANIM_OVERVIEW_FADE, OVERSHOOT_1_2); + + // Start from a higher overview scale, but only if we're invisible so we don't jump. + UiFactory.prepareToShowOverview(mLauncher); + } else if (fromState.overviewUi && toState == NORMAL) { + builder.setInterpolator(ANIM_WORKSPACE_SCALE, DEACCEL); + builder.setInterpolator(ANIM_WORKSPACE_FADE, ACCEL); + builder.setInterpolator(ANIM_OVERVIEW_SCALE, clampToProgress(ACCEL, 0, 0.9f)); + builder.setInterpolator(ANIM_OVERVIEW_FADE, DEACCEL_1_7); + Workspace workspace = mLauncher.getWorkspace(); + + // Start from a higher workspace scale, but only if we're invisible so we don't jump. + boolean isWorkspaceVisible = workspace.getVisibility() == VISIBLE; + if (isWorkspaceVisible) { + CellLayout currentChild = (CellLayout) workspace.getChildAt( + workspace.getCurrentPage()); + isWorkspaceVisible = currentChild.getVisibility() == VISIBLE + && currentChild.getShortcutsAndWidgets().getAlpha() > 0; + } + if (!isWorkspaceVisible) { + workspace.setScaleX(0.92f); + workspace.setScaleY(0.92f); + } + } + } + + /** * Creates a {@link AnimatorPlaybackController} that can be used for a controlled * state transition. * @param state the final state for the transition. @@ -231,16 +305,26 @@ public class LauncherStateManager { */ public AnimatorPlaybackController createAnimationToNewWorkspace( LauncherState state, long duration) { - return createAnimationToNewWorkspace(state, new AnimatorSetBuilder(), duration); + return createAnimationToNewWorkspace(state, duration, LauncherStateManager.ANIM_ALL); } public AnimatorPlaybackController createAnimationToNewWorkspace( - LauncherState state, AnimatorSetBuilder builder, long duration) { + LauncherState state, long duration, @AnimationComponents int animComponents) { + return createAnimationToNewWorkspace(state, new AnimatorSetBuilder(), duration, null, + animComponents); + } + + public AnimatorPlaybackController createAnimationToNewWorkspace(LauncherState state, + AnimatorSetBuilder builder, long duration, Runnable onCancelRunnable, + @AnimationComponents int animComponents) { mConfig.reset(); mConfig.userControlled = true; + mConfig.animComponents = animComponents; mConfig.duration = duration; - return AnimatorPlaybackController.wrap( - createAnimationToNewWorkspaceInternal(state, builder, null), duration); + mConfig.playbackController = AnimatorPlaybackController.wrap( + createAnimationToNewWorkspaceInternal(state, builder, null), duration, + onCancelRunnable); + return mConfig.playbackController; } protected AnimatorSet createAnimationToNewWorkspaceInternal(final LauncherState state, @@ -280,7 +364,7 @@ public class LauncherStateManager { onStateTransitionEnd(state); } }); - mConfig.setAnimation(animation); + mConfig.setAnimation(animation, state); return mConfig.mCurrentAnimation; } @@ -351,17 +435,47 @@ public class LauncherStateManager { mConfig.reset(); } + public void setCurrentUserControlledAnimation(AnimatorPlaybackController controller) { + clearCurrentAnimation(); + setCurrentAnimation(controller.getTarget()); + mConfig.userControlled = true; + mConfig.playbackController = controller; + } + /** * Sets the animation as the current state animation, i.e., canceled when * starting another animation and may block some launcher interactions while running. + * + * @param childAnimations Set of animations with the new target is controlling. */ - public void setCurrentAnimation(AnimatorSet anim) { + public void setCurrentAnimation(AnimatorSet anim, Animator... childAnimations) { + for (Animator childAnim : childAnimations) { + if (childAnim == null) { + continue; + } + if (mConfig.playbackController != null + && mConfig.playbackController.getTarget() == childAnim) { + clearCurrentAnimation(); + break; + } else if (mConfig.mCurrentAnimation == childAnim) { + clearCurrentAnimation(); + break; + } + } boolean reapplyNeeded = mConfig.mCurrentAnimation != null; cancelAnimation(); if (reapplyNeeded) { reapplyState(); } - mConfig.setAnimation(anim); + mConfig.setAnimation(anim, null); + } + + private void clearCurrentAnimation() { + if (mConfig.mCurrentAnimation != null) { + mConfig.mCurrentAnimation.removeListener(mConfig); + mConfig.mCurrentAnimation = null; + } + mConfig.playbackController = null; } private class StartAnimRunnable implements Runnable { @@ -389,28 +503,41 @@ public class LauncherStateManager { public static class AnimationConfig extends AnimatorListenerAdapter { public long duration; public boolean userControlled; - private PropertySetter mProperSetter; + public AnimatorPlaybackController playbackController; + public @AnimationComponents int animComponents = ANIM_ALL; + private PropertySetter mPropertySetter; private AnimatorSet mCurrentAnimation; + private LauncherState mTargetState; + /** + * Cancels the current animation and resets config variables. + */ public void reset() { duration = 0; userControlled = false; - mProperSetter = null; - - if (mCurrentAnimation != null) { + animComponents = ANIM_ALL; + mPropertySetter = null; + mTargetState = null; + + if (playbackController != null) { + playbackController.getAnimationPlayer().cancel(); + playbackController.dispatchOnCancel(); + } else if (mCurrentAnimation != null) { mCurrentAnimation.setDuration(0); mCurrentAnimation.cancel(); - mCurrentAnimation = null; } + + mCurrentAnimation = null; + playbackController = null; } - public PropertySetter getProperSetter(AnimatorSetBuilder builder) { - if (mProperSetter == null) { - mProperSetter = duration == 0 ? NO_ANIM_PROPERTY_SETTER + public PropertySetter getPropertySetter(AnimatorSetBuilder builder) { + if (mPropertySetter == null) { + mPropertySetter = duration == 0 ? NO_ANIM_PROPERTY_SETTER : new AnimatedPropertySetter(duration, builder); } - return mProperSetter; + return mPropertySetter; } @Override @@ -420,10 +547,19 @@ public class LauncherStateManager { } } - public void setAnimation(AnimatorSet animation) { + public void setAnimation(AnimatorSet animation, LauncherState targetState) { mCurrentAnimation = animation; + mTargetState = targetState; mCurrentAnimation.addListener(this); } + + public boolean playAtomicComponent() { + return (animComponents & ATOMIC_COMPONENT) != 0; + } + + public boolean playNonAtomicComponent() { + return (animComponents & NON_ATOMIC_COMPONENT) != 0; + } } public interface StateHandler { diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 15bf76da5..efbd00489 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -27,6 +27,7 @@ import android.content.res.TypedArray; import android.graphics.Matrix; import android.graphics.Rect; import android.os.Bundle; +import android.provider.Settings; import android.util.AttributeSet; import android.util.Log; import android.view.InputDevice; @@ -44,6 +45,7 @@ import android.view.animation.Interpolator; import android.widget.ScrollView; import com.android.launcher3.anim.Interpolators; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.pageindicators.PageIndicator; import com.android.launcher3.touch.OverScroll; import com.android.launcher3.util.Thunk; @@ -92,7 +94,6 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou @ViewDebug.ExportedProperty(category = "launcher") protected int mCurrentPage; - private int mChildCountOnLastLayout; @ViewDebug.ExportedProperty(category = "launcher") protected int mNextPage = INVALID_PAGE; @@ -108,7 +109,7 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou private float mLastMotionXRemainder; private float mTotalMotionX; - private int[] mPageScrolls; + protected int[] mPageScrolls; protected final static int TOUCH_STATE_REST = 0; protected final static int TOUCH_STATE_SCROLLING = 1; @@ -203,7 +204,6 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou if (mPageIndicatorViewId > -1) { mPageIndicator = parent.findViewById(mPageIndicatorViewId); mPageIndicator.setMarkersCount(getChildCount()); - mPageIndicator.setPageDescription(getPageIndicatorDescription()); } } @@ -240,6 +240,12 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou return index; } + protected void scrollAndForceFinish(int scrollX) { + scrollTo(scrollX, 0); + mScroller.setFinalX(scrollX); + forceFinishScroller(true); + } + /** * Updates the scroll of the current page immediately to its final scroll position. We use this * in CustomizePagedView to allow tabs to share the same PagedView while resetting the scroll of @@ -251,9 +257,7 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou if (0 <= mCurrentPage && mCurrentPage < getPageCount()) { newX = getScrollForPage(mCurrentPage); } - scrollTo(newX, 0); - mScroller.setFinalX(newX); - forceFinishScroller(true); + scrollAndForceFinish(newX); } private void abortScrollerAnimation(boolean resetNextPage) { @@ -310,7 +314,6 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou private void updatePageIndicator() { if (mPageIndicator != null) { - mPageIndicator.setPageDescription(getPageIndicatorDescription()); mPageIndicator.setActiveMarker(getNextPage()); } } @@ -541,22 +544,27 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou setMeasuredDimension(widthSize, heightSize); } + protected void restoreScrollOnLayout() { + setCurrentPage(getNextPage()); + } + @SuppressLint("DrawAllocation") @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { mIsLayoutValid = true; - if (getChildCount() == 0) { - return; - } - - if (DEBUG) Log.d(TAG, "PagedView.onLayout()"); final int childCount = getChildCount(); - boolean pageScrollChanged = false; - if (mPageScrolls == null || childCount != mChildCountOnLastLayout) { + if (mPageScrolls == null || childCount != mPageScrolls.length) { mPageScrolls = new int[childCount]; pageScrollChanged = true; } + + if (childCount == 0) { + return; + } + + if (DEBUG) Log.d(TAG, "PagedView.onLayout()"); + if (getPageScrolls(mPageScrolls, true, SIMPLE_SCROLL_LOGIC)) { pageScrollChanged = true; } @@ -591,9 +599,8 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou } if (mScroller.isFinished() && pageScrollChanged) { - setCurrentPage(getNextPage()); + restoreScrollOnLayout(); } - mChildCountOnLastLayout = childCount; } /** @@ -609,18 +616,18 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou final int endIndex = mIsRtl ? -1 : childCount; final int delta = mIsRtl ? -1 : 1; - int verticalPadding = getPaddingTop() + getPaddingBottom(); + final int verticalCenter = (getPaddingTop() + getMeasuredHeight() + mInsets.top + - mInsets.bottom - getPaddingBottom()) / 2; - int scrollOffsetLeft = mInsets.left + getPaddingLeft(); - int childLeft = scrollOffsetLeft; + final int scrollOffsetLeft = mInsets.left + getPaddingLeft(); boolean pageScrollChanged = false; - for (int i = startIndex; i != endIndex; i += delta) { + for (int i = startIndex, childLeft = scrollOffsetLeft + offsetForPageScrolls(); + i != endIndex; + i += delta) { final View child = getPageAt(i); if (scrollLogic.shouldIncludeView(child)) { - int childTop = getPaddingTop() + mInsets.top; - childTop += (getMeasuredHeight() - mInsets.top - mInsets.bottom - verticalPadding - - child.getMeasuredHeight()) / 2; + final int childTop = verticalCenter - child.getMeasuredHeight() / 2; final int childWidth = child.getMeasuredWidth(); if (layoutChildren) { @@ -659,6 +666,10 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou } } + protected int offsetForPageScrolls() { + return 0; + } + public void setPageSpacing(int pageSpacing) { mPageSpacing = pageSpacing; requestLayout(); @@ -695,7 +706,11 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) { int page = indexToPage(indexOfChild(child)); if (page != mCurrentPage || !mScroller.isFinished()) { - snapToPage(page); + if (immediate) { + setCurrentPage(page); + } else { + snapToPage(page); + } return true; } return false; @@ -1165,11 +1180,19 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou mNextPage = getPageNearestToCenterOfScreen(unscaledScrollX); int firstPageScroll = getScrollForPage(!mIsRtl ? 0 : getPageCount() - 1); int lastPageScroll = getScrollForPage(!mIsRtl ? getPageCount() - 1 : 0); - if (mSettleOnPageInFreeScroll && unscaledScrollX > firstPageScroll - && unscaledScrollX < lastPageScroll) { - // Make sure we land directly on a page. If flinging past one of the ends, - // don't change the velocity as it will get stopped at the end anyway. - mScroller.setFinalX((int) (getScrollForPage(mNextPage) * getScaleX())); + if (mSettleOnPageInFreeScroll && unscaledScrollX > 0 + && unscaledScrollX < mMaxScrollX) { + // If scrolling ends in the half of the added space that is closer to the + // end, settle to the end. Otherwise snap to the nearest page. + // If flinging past one of the ends, don't change the velocity as it will + // get stopped at the end anyway. + final int finalX = unscaledScrollX < firstPageScroll / 2 ? + 0 : + unscaledScrollX > (lastPageScroll + mMaxScrollX) / 2 ? + mMaxScrollX : + getScrollForPage(mNextPage); + + mScroller.setFinalX((int) (finalX * getScaleX())); // Ensure the scroll/snap doesn't happen too fast; int extraScrollDuration = OVERSCROLL_PAGE_SNAP_ANIMATION_DURATION - mScroller.getDuration(); @@ -1408,7 +1431,7 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou return snapToPage(whichPage, duration, false, null); } - protected boolean snapToPage(int whichPage, int duration, TimeInterpolator interpolator) { + public boolean snapToPage(int whichPage, int duration, TimeInterpolator interpolator) { return snapToPage(whichPage, duration, false, interpolator); } @@ -1427,6 +1450,12 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou protected boolean snapToPage(int whichPage, int delta, int duration, boolean immediate, TimeInterpolator interpolator) { + + if (FeatureFlags.IS_DOGFOOD_BUILD) { + duration *= Settings.System.getFloat(getContext().getContentResolver(), + Settings.System.WINDOW_ANIMATION_SCALE, 1); + } + whichPage = validateNewPage(whichPage); mNextPage = whichPage; @@ -1466,12 +1495,20 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou return Math.abs(delta) > 0; } - public void scrollLeft() { - if (getNextPage() > 0) snapToPage(getNextPage() - 1); + public boolean scrollLeft() { + if (getNextPage() > 0) { + snapToPage(getNextPage() - 1); + return true; + } + return false; } - public void scrollRight() { - if (getNextPage() < getChildCount() -1) snapToPage(getNextPage() + 1); + public boolean scrollRight() { + if (getNextPage() < getChildCount() - 1) { + snapToPage(getNextPage() + 1); + return true; + } + return false; } @Override @@ -1481,17 +1518,24 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou return ScrollView.class.getName(); } + protected boolean isPageOrderFlipped() { + return false; + } + /* Accessibility */ @SuppressWarnings("deprecation") @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); + final boolean pagesFlipped = isPageOrderFlipped(); info.setScrollable(getPageCount() > 1); if (getCurrentPage() < getPageCount() - 1) { - info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); + info.addAction(pagesFlipped ? AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD + : AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); } if (getCurrentPage() > 0) { - info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); + info.addAction(pagesFlipped ? AccessibilityNodeInfo.ACTION_SCROLL_FORWARD + : AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); } // Accessibility-wise, PagedView doesn't support long click, so disabling it. @@ -1520,27 +1564,23 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou if (super.performAccessibilityAction(action, arguments)) { return true; } + final boolean pagesFlipped = isPageOrderFlipped(); switch (action) { case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: { - if (getCurrentPage() < getPageCount() - 1) { - scrollRight(); + if (pagesFlipped ? scrollLeft() : scrollRight()) { return true; } } break; case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: { - if (getCurrentPage() > 0) { - scrollLeft(); + if (pagesFlipped ? scrollRight() : scrollLeft()) { return true; } - } break; + } + break; } return false; } - protected String getPageIndicatorDescription() { - return getCurrentPageDescription(); - } - protected boolean canAnnouncePageDescription() { return true; } @@ -1558,11 +1598,6 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou return mDownMotionY; } - @Override - public boolean onHoverEvent(android.view.MotionEvent event) { - return true; - } - protected interface ComputePageScrollsLogic { boolean shouldIncludeView(View view); diff --git a/src/com/android/launcher3/SecondaryDropTarget.java b/src/com/android/launcher3/SecondaryDropTarget.java index 024b4eb59..76e85e255 100644 --- a/src/com/android/launcher3/SecondaryDropTarget.java +++ b/src/com/android/launcher3/SecondaryDropTarget.java @@ -8,8 +8,6 @@ import static com.android.launcher3.ItemInfoWithIcon.FLAG_SYSTEM_NO; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP; import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.RECONFIGURE; import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.UNINSTALL; -import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType.SETTINGS_BUTTON; -import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType.UNINSTALL_TARGET; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetManager; @@ -33,6 +31,8 @@ import android.widget.Toast; import com.android.launcher3.Launcher.OnResumeCallback; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.dragndrop.DragOptions; +import com.android.launcher3.logging.LoggerUtils; +import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.Themes; @@ -52,7 +52,7 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList private final Alarm mCacheExpireAlarm; - private int mCurrentAccessibilityAction = -1; + protected int mCurrentAccessibilityAction = -1; public SecondaryDropTarget(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -70,7 +70,7 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList setupUi(UNINSTALL); } - private void setupUi(int action) { + protected void setupUi(int action) { if (action == mCurrentAccessibilityAction) { return; } @@ -98,8 +98,11 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList } @Override - public int getControlTypeForLogging() { - return mCurrentAccessibilityAction == UNINSTALL ? UNINSTALL_TARGET : SETTINGS_BUTTON; + public Target getDropTargetForLogging() { + Target t = LoggerUtils.newTarget(Target.Type.CONTROL); + t.controlType = mCurrentAccessibilityAction == UNINSTALL ? ControlType.UNINSTALL_TARGET + : ControlType.SETTINGS_BUTTON; + return t; } @Override diff --git a/src/com/android/launcher3/SettingsActivity.java b/src/com/android/launcher3/SettingsActivity.java index c9bd32b08..32c198ab0 100644 --- a/src/com/android/launcher3/SettingsActivity.java +++ b/src/com/android/launcher3/SettingsActivity.java @@ -16,6 +16,9 @@ package com.android.launcher3; +import static com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY; +import static com.android.launcher3.states.RotationHelper.getAllowRotationDefaultValue; + import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; @@ -59,6 +62,7 @@ public class SettingsActivity extends Activity { private static final String NOTIFICATION_ENABLED_LISTENERS = "enabled_notification_listeners"; private static final String EXTRA_FRAGMENT_ARG_KEY = ":settings:fragment_args_key"; + private static final String EXTRA_SHOW_FRAGMENT_ARGS = ":settings:show_fragment_args"; private static final int DELAY_HIGHLIGHT_DURATION_MILLIS = 600; private static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted"; @@ -123,6 +127,16 @@ public class SettingsActivity extends Activity { getPreferenceScreen().removePreference(iconShapeOverride); } } + + // Setup allow rotation preference + Preference rotationPref = findPreference(ALLOW_ROTATION_PREFERENCE_KEY); + if (getResources().getBoolean(R.bool.allow_rotation)) { + // Launcher supports rotation by default. No need to show this setting. + getPreferenceScreen().removePreference(rotationPref); + } else { + // Initialize the UI once + rotationPref.setDefaultValue(getAllowRotationDefaultValue()); + } } @Override @@ -273,9 +287,13 @@ public class SettingsActivity extends Activity { @Override public void onClick(DialogInterface dialogInterface, int i) { ComponentName cn = new ComponentName(getActivity(), NotificationListener.class); + Bundle showFragmentArgs = new Bundle(); + showFragmentArgs.putString(EXTRA_FRAGMENT_ARG_KEY, cn.flattenToString()); + Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra(":settings:fragment_args_key", cn.flattenToString()); + .putExtra(EXTRA_FRAGMENT_ARG_KEY, cn.flattenToString()) + .putExtra(EXTRA_SHOW_FRAGMENT_ARGS, showFragmentArgs); getActivity().startActivity(intent); } } diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index cabccbf65..4bd9a9bf2 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -35,9 +35,10 @@ import android.graphics.RectF; import android.os.Build; import android.os.Bundle; import android.os.DeadObjectException; +import android.os.Handler; +import android.os.Message; import android.os.PowerManager; import android.os.TransactionTooLargeException; -import android.support.v4.os.BuildCompat; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; @@ -81,7 +82,8 @@ public final class Utilities { private static final Matrix sMatrix = new Matrix(); private static final Matrix sInverseMatrix = new Matrix(); - public static final boolean ATLEAST_P = BuildCompat.isAtLeastP(); + public static final boolean ATLEAST_P = + Build.VERSION.SDK_INT >= Build.VERSION_CODES.P; public static final boolean ATLEAST_OREO_MR1 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1; @@ -101,11 +103,14 @@ public final class Utilities { public static final boolean ATLEAST_LOLLIPOP_MR1 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1; + public static final int SINGLE_FRAME_MS = 16; + /** * Indicates if the device has a debug build. Should only be used to store additional info or * add extra logging and not for changing the app behavior. */ - public static final boolean IS_DEBUG_DEVICE = Build.TYPE.toLowerCase().contains("debug"); + public static final boolean IS_DEBUG_DEVICE = Build.TYPE.toLowerCase().contains("debug") + || Build.TYPE.toLowerCase().equals("eng"); // An intent extra to indicate the horizontal scroll of the wallpaper. public static final String EXTRA_WALLPAPER_OFFSET = "com.android.launcher3.WALLPAPER_OFFSET"; @@ -487,7 +492,11 @@ public final class Utilities { LauncherFiles.DEVICE_PREFERENCES_KEY, Context.MODE_PRIVATE); } - public static boolean isPowerSaverOn(Context context) { + public static boolean isPowerSaverPreventingAnimation(Context context) { + if (ATLEAST_P) { + // Battery saver mode no longer prevents animations. + return false; + } PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); return powerManager.isPowerSaveMode(); } @@ -574,4 +583,12 @@ public final class Utilities { return hashSet; } + /** + * Utility method to post a runnable on the handler, skipping the synchronization barriers. + */ + public static void postAsyncCallback(Handler handler, Runnable callback) { + Message msg = Message.obtain(handler, callback); + msg.setAsynchronous(true); + handler.sendMessage(msg); + } } diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java index a658d585c..7af4bf979 100644 --- a/src/com/android/launcher3/WidgetPreviewLoader.java +++ b/src/com/android/launcher3/WidgetPreviewLoader.java @@ -338,7 +338,8 @@ public class WidgetPreviewLoader { int previewWidth; int previewHeight; - if (widgetPreviewExists) { + if (widgetPreviewExists && drawable.getIntrinsicWidth() > 0 + && drawable.getIntrinsicHeight() > 0) { previewWidth = drawable.getIntrinsicWidth(); previewHeight = drawable.getIntrinsicHeight(); } else { @@ -358,8 +359,8 @@ public class WidgetPreviewLoader { scale = maxPreviewWidth / (float) (previewWidth); } if (scale != 1f) { - previewWidth = (int) (scale * previewWidth); - previewHeight = (int) (scale * previewHeight); + previewWidth = Math.max((int)(scale * previewWidth), 1); + 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 diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 1e2e3b10b..6631f771c 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -22,6 +22,7 @@ import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_TRANSITION_M import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.SPRING_LOADED; +import static com.android.launcher3.dragndrop.DragLayer.ALPHA_INDEX_OVERLAY; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -75,14 +76,11 @@ import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.folder.PreviewBackground; import com.android.launcher3.graphics.DragPreviewProvider; import com.android.launcher3.graphics.PreloadIconDrawable; -import com.android.launcher3.graphics.ViewScrim; -import com.android.launcher3.graphics.WorkspaceAndHotseatScrim; import com.android.launcher3.pageindicators.WorkspacePageIndicator; import com.android.launcher3.popup.PopupContainerWithArrow; import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider; import com.android.launcher3.touch.ItemLongClickListener; import com.android.launcher3.touch.WorkspaceTouchListener; -import com.android.launcher3.uioverrides.UiFactory; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; @@ -195,7 +193,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator> // Variables relating to the creation of user folders by hovering shortcuts over shortcuts private static final int FOLDER_CREATION_TIMEOUT = 0; - public static final int REORDER_TIMEOUT = 350; + public static final int REORDER_TIMEOUT = 650; private final Alarm mFolderCreationAlarm = new Alarm(); private final Alarm mReorderAlarm = new Alarm(); private PreviewBackground mFolderCreateBg; @@ -280,9 +278,6 @@ public class Workspace extends PagedView<WorkspacePageIndicator> // Disable multitouch across the workspace/all apps/customize tray setMotionEventSplittingEnabled(true); - - // Attach a scrim - new WorkspaceAndHotseatScrim(this).attach(); setOnTouchListener(new WorkspaceTouchListener(mLauncher, this)); } @@ -476,7 +471,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator> super.onViewAdded(child); } - boolean isTouchActive() { + public boolean isTouchActive() { return mTouchState != TOUCH_STATE_REST; } @@ -517,6 +512,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator> } // Remove the pages and clear the screen models + removeFolderListeners(); removeAllViews(); mScreenOrder.clear(); mWorkspaceScreens.clear(); @@ -973,19 +969,9 @@ public class Workspace extends PagedView<WorkspacePageIndicator> @Override public boolean onInterceptTouchEvent(MotionEvent ev) { - switch (ev.getAction() & MotionEvent.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: + if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { mXDown = ev.getX(); mYDown = ev.getY(); - break; - case MotionEvent.ACTION_POINTER_UP: - case MotionEvent.ACTION_UP: - if (mTouchState == TOUCH_STATE_REST) { - final CellLayout currentPage = (CellLayout) getChildAt(mCurrentPage); - if (currentPage != null) { - onWallpaperTap(ev); - } - } } return super.onInterceptTouchEvent(ev); } @@ -1189,7 +1175,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator> // different effects based on device performance. On at least one relatively high-end // device I've tried, translating the launcher causes things to get quite laggy. mLauncher.getDragLayer().setTranslationX(transX); - mLauncher.getDragLayer().setAlpha(alpha); + mLauncher.getDragLayer().getAlphaProperty(ALPHA_INDEX_OVERLAY).setValue(alpha); } /** @@ -1311,7 +1297,9 @@ public class Workspace extends PagedView<WorkspacePageIndicator> } private void updatePageAlphaValues() { - if (!workspaceInModalState() && !mIsSwitchingState) { + // We need to check the isDragging case because updatePageAlphaValues is called between + // goToState(SPRING_LOADED) and onStartStateTransition. + if (!workspaceInModalState() && !mIsSwitchingState && !mDragController.isDragging()) { int screenCenter = getScrollX() + getMeasuredWidth() / 2; for (int i = 0; i < getChildCount(); i++) { CellLayout child = (CellLayout) getChildAt(i); @@ -1442,7 +1430,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator> } } - protected void onWallpaperTap(MotionEvent ev) { + public void onWallpaperTap(MotionEvent ev) { final int[] position = mTempXY; getLocationOnScreen(position); @@ -2162,7 +2150,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator> } // Invalidating the scrim will also force this CellLayout // to be invalidated so that it is highlighted if necessary. - ViewScrim.get(this).invalidate(); + mLauncher.getDragLayer().getScrim().invalidate(); } public CellLayout getCurrentDragOverlappingLayout() { @@ -2973,25 +2961,29 @@ public class Workspace extends PagedView<WorkspacePageIndicator> } @Override - public void scrollLeft() { + public boolean scrollLeft() { + boolean result = false; if (!workspaceInModalState() && !mIsSwitchingState) { - super.scrollLeft(); + result = super.scrollLeft(); } Folder openFolder = Folder.getOpen(mLauncher); if (openFolder != null) { openFolder.completeDragExit(); } + return result; } @Override - public void scrollRight() { + public boolean scrollRight() { + boolean result = false; if (!workspaceInModalState() && !mIsSwitchingState) { - super.scrollRight(); + result = super.scrollRight(); } Folder openFolder = Folder.getOpen(mLauncher); if (openFolder != null) { openFolder.completeDragExit(); } + return result; } /** diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java index 420a7c418..e734e7053 100644 --- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java +++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java @@ -18,19 +18,24 @@ package com.android.launcher3; import static com.android.launcher3.LauncherAnimUtils.DRAWABLE_ALPHA; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; -import static com.android.launcher3.LauncherState.DRAG_HANDLE_INDICATOR; import static com.android.launcher3.LauncherState.HOTSEAT_ICONS; import static com.android.launcher3.LauncherState.HOTSEAT_SEARCH_BOX; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_FADE; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_SCALE; +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; +import static com.android.launcher3.graphics.WorkspaceAndHotseatScrim.SCRIM_PROGRESS; +import static com.android.launcher3.graphics.WorkspaceAndHotseatScrim.SYSUI_PROGRESS; import android.view.View; +import android.view.animation.Interpolator; import com.android.launcher3.LauncherState.PageAlphaProvider; import com.android.launcher3.LauncherStateManager.AnimationConfig; import com.android.launcher3.anim.AnimatorSetBuilder; -import com.android.launcher3.anim.Interpolators; import com.android.launcher3.anim.PropertySetter; -import com.android.launcher3.graphics.ViewScrim; +import com.android.launcher3.graphics.WorkspaceAndHotseatScrim; /** * Manages the animations between each of the workspace states. @@ -48,12 +53,13 @@ public class WorkspaceStateTransitionAnimation { } public void setState(LauncherState toState) { - setWorkspaceProperty(toState, NO_ANIM_PROPERTY_SETTER); + setWorkspaceProperty(toState, NO_ANIM_PROPERTY_SETTER, new AnimatorSetBuilder(), + new AnimationConfig()); } public void setStateWithAnimation(LauncherState toState, AnimatorSetBuilder builder, AnimationConfig config) { - setWorkspaceProperty(toState, config.getProperSetter(builder)); + setWorkspaceProperty(toState, config.getPropertySetter(builder), builder, config); } public float getFinalScale() { @@ -63,57 +69,72 @@ public class WorkspaceStateTransitionAnimation { /** * Starts a transition animation for the workspace. */ - private void setWorkspaceProperty(LauncherState state, PropertySetter propertySetter) { + private void setWorkspaceProperty(LauncherState state, PropertySetter propertySetter, + AnimatorSetBuilder builder, AnimationConfig config) { float[] scaleAndTranslation = state.getWorkspaceScaleAndTranslation(mLauncher); mNewScale = scaleAndTranslation[0]; PageAlphaProvider pageAlphaProvider = state.getWorkspacePageAlphaProvider(mLauncher); final int childCount = mWorkspace.getChildCount(); for (int i = 0; i < childCount; i++) { applyChildState(state, (CellLayout) mWorkspace.getChildAt(i), i, pageAlphaProvider, - propertySetter); + propertySetter, builder, config); } - propertySetter.setFloat(mWorkspace, SCALE_PROPERTY, mNewScale, Interpolators.ZOOM_OUT); - propertySetter.setFloat(mWorkspace, View.TRANSLATION_X, - scaleAndTranslation[1], Interpolators.ZOOM_OUT); - propertySetter.setFloat(mWorkspace, View.TRANSLATION_Y, - scaleAndTranslation[2], Interpolators.ZOOM_OUT); - int elements = state.getVisibleElements(mLauncher); - float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0; - propertySetter.setViewAlpha(mLauncher.getHotseat().getLayout(), hotseatIconsAlpha, + Interpolator fadeInterpolator = builder.getInterpolator(ANIM_WORKSPACE_FADE, pageAlphaProvider.interpolator); - propertySetter.setViewAlpha(mLauncher.getWorkspace().getPageIndicator(), - hotseatIconsAlpha, pageAlphaProvider.interpolator); + boolean playAtomicComponent = config.playAtomicComponent(); + if (playAtomicComponent) { + Interpolator scaleInterpolator = builder.getInterpolator(ANIM_WORKSPACE_SCALE, ZOOM_OUT); + propertySetter.setFloat(mWorkspace, SCALE_PROPERTY, mNewScale, scaleInterpolator); + float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0; + propertySetter.setViewAlpha(mLauncher.getHotseat().getLayout(), hotseatIconsAlpha, + fadeInterpolator); + propertySetter.setViewAlpha(mLauncher.getWorkspace().getPageIndicator(), + hotseatIconsAlpha, fadeInterpolator); + } - propertySetter.setViewAlpha(mLauncher.getHotseatSearchBox(), - (elements & HOTSEAT_SEARCH_BOX) != 0 ? 1 : 0, - pageAlphaProvider.interpolator); + if (!config.playNonAtomicComponent()) { + // Only the alpha and scale, handled above, are included in the atomic animation. + return; + } - propertySetter.setViewAlpha(mLauncher.getDragHandleIndicator(), - (elements & DRAG_HANDLE_INDICATOR) != 0 ? 1 : 0, - pageAlphaProvider.interpolator); + Interpolator translationInterpolator = !playAtomicComponent ? LINEAR : ZOOM_OUT; + propertySetter.setFloat(mWorkspace, View.TRANSLATION_X, + scaleAndTranslation[1], translationInterpolator); + propertySetter.setFloat(mWorkspace, View.TRANSLATION_Y, + scaleAndTranslation[2], translationInterpolator); + + propertySetter.setViewAlpha(mLauncher.getHotseatSearchBox(), + (elements & HOTSEAT_SEARCH_BOX) != 0 ? 1 : 0, fadeInterpolator); // Set scrim - propertySetter.setFloat(ViewScrim.get(mWorkspace), ViewScrim.PROGRESS, - state.hasScrim ? 1 : 0, Interpolators.LINEAR); - propertySetter.setFloat(ViewScrim.get(mLauncher.getAppsView()), ViewScrim.PROGRESS, - state.hasAllAppsScrim ? 1 : 0, Interpolators.LINEAR); + WorkspaceAndHotseatScrim scrim = mLauncher.getDragLayer().getScrim(); + propertySetter.setFloat(scrim, SCRIM_PROGRESS, state.getWorkspaceScrimAlpha(mLauncher), + LINEAR); + propertySetter.setFloat(scrim, SYSUI_PROGRESS, state.hasSysUiScrim ? 1 : 0, LINEAR); } public void applyChildState(LauncherState state, CellLayout cl, int childIndex) { applyChildState(state, cl, childIndex, state.getWorkspacePageAlphaProvider(mLauncher), - NO_ANIM_PROPERTY_SETTER); + NO_ANIM_PROPERTY_SETTER, new AnimatorSetBuilder(), new AnimationConfig()); } private void applyChildState(LauncherState state, CellLayout cl, int childIndex, - PageAlphaProvider pageAlphaProvider, PropertySetter propertySetter) { + PageAlphaProvider pageAlphaProvider, PropertySetter propertySetter, + AnimatorSetBuilder builder, AnimationConfig config) { float pageAlpha = pageAlphaProvider.getPageAlpha(childIndex); int drawableAlpha = Math.round(pageAlpha * (state.hasWorkspacePageBackground ? 255 : 0)); - propertySetter.setInt(cl.getScrimBackground(), - DRAWABLE_ALPHA, drawableAlpha, Interpolators.ZOOM_OUT); - propertySetter.setFloat(cl.getShortcutsAndWidgets(), View.ALPHA, - pageAlpha, pageAlphaProvider.interpolator); + if (config.playNonAtomicComponent()) { + propertySetter.setInt(cl.getScrimBackground(), + DRAWABLE_ALPHA, drawableAlpha, ZOOM_OUT); + } + if (config.playAtomicComponent()) { + Interpolator fadeInterpolator = builder.getInterpolator(ANIM_WORKSPACE_FADE, + pageAlphaProvider.interpolator); + propertySetter.setFloat(cl.getShortcutsAndWidgets(), View.ALPHA, + pageAlpha, fadeInterpolator); + } } }
\ No newline at end of file diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java index 4398f6e6b..81a0e1d5d 100644 --- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java @@ -25,8 +25,6 @@ import com.android.launcher3.DropTarget.DragObject; import com.android.launcher3.FolderInfo; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; -import com.android.launcher3.touch.ItemLongClickListener; -import com.android.launcher3.widget.LauncherAppWidgetHostView; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings.Favorites; @@ -37,9 +35,12 @@ import com.android.launcher3.Workspace; import com.android.launcher3.dragndrop.DragController.DragListener; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.folder.Folder; +import com.android.launcher3.notification.NotificationListener; import com.android.launcher3.popup.PopupContainerWithArrow; import com.android.launcher3.shortcuts.DeepShortcutManager; +import com.android.launcher3.touch.ItemLongClickListener; import com.android.launcher3.util.Thunk; +import com.android.launcher3.widget.LauncherAppWidgetHostView; import java.util.ArrayList; @@ -55,6 +56,7 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme protected static final int MOVE_TO_WORKSPACE = R.id.action_move_to_workspace; protected static final int RESIZE = R.id.action_resize; public static final int DEEP_SHORTCUTS = R.id.action_deep_shortcuts; + public static final int SHORTCUTS_AND_NOTIFICATIONS = R.id.action_shortcuts_and_notifications; public enum DragType { ICON, @@ -92,6 +94,12 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme launcher.getText(R.string.action_resize))); mActions.put(DEEP_SHORTCUTS, new AccessibilityAction(DEEP_SHORTCUTS, launcher.getText(R.string.action_deep_shortcut))); + mActions.put(SHORTCUTS_AND_NOTIFICATIONS, new AccessibilityAction(DEEP_SHORTCUTS, + launcher.getText(R.string.shortcuts_menu_with_notifications_description))); + } + + public void addAccessibilityAction(int action, int actionLabel) { + mActions.put(action, new AccessibilityAction(action, mLauncher.getText(actionLabel))); } @Override @@ -107,7 +115,8 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme // If the request came from keyboard, do not add custom shortcuts as that is already // exposed as a direct shortcut if (!fromKeyboard && DeepShortcutManager.supportsShortcuts(item)) { - info.addAction(mActions.get(DEEP_SHORTCUTS)); + info.addAction(mActions.get(NotificationListener.getInstanceIfConnected() != null + ? SHORTCUTS_AND_NOTIFICATIONS : DEEP_SHORTCUTS)); } for (ButtonDropTarget target : mLauncher.getDropTargetBar().getDropTargets()) { diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index ae41794ad..f8648bba0 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -15,8 +15,6 @@ */ package com.android.launcher3.allapps; -import static com.android.launcher3.anim.Interpolators.DEACCEL_2; - import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; @@ -47,8 +45,8 @@ import com.android.launcher3.InsettableFrameLayout; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.graphics.ColorScrim; import com.android.launcher3.keyboard.FocusedItemDecorator; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ItemInfoMatcher; @@ -111,10 +109,6 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo mAllAppsStore.addUpdateListener(this::onAppsUpdated); - // Attach a scrim to be drawn behind all-apps and hotseat - new ColorScrim(this, Themes.getAttrColor(context, R.attr.allAppsScrimColor), DEACCEL_2) - .attach(); - addSpringView(R.id.all_apps_header); addSpringView(R.id.apps_list_view); addSpringView(R.id.all_apps_tabs_view_pager); @@ -125,6 +119,13 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo } @Override + protected void setDampedScrollShift(float shift) { + // Bound the shift amount to avoid content from drawing on top (Y-val) of the QSB. + float maxShift = getSearchView().getHeight() / 2f; + super.setDampedScrollShift(Utilities.boundToRange(shift, -maxShift, maxShift)); + } + + @Override public void onDeviceProfileChanged(DeviceProfile dp) { for (AdapterHolder holder : mAH) { if (holder.recyclerView != null) { diff --git a/src/com/android/launcher3/allapps/AllAppsPagedView.java b/src/com/android/launcher3/allapps/AllAppsPagedView.java index b2e35a473..69068c6ee 100644 --- a/src/com/android/launcher3/allapps/AllAppsPagedView.java +++ b/src/com/android/launcher3/allapps/AllAppsPagedView.java @@ -76,4 +76,9 @@ public class AllAppsPagedView extends PagedView<PersonalWorkSlidingTabStrip> { super.determineScrollingStart(ev); } } + + @Override + public boolean hasOverlappingRendering() { + return false; + } } diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index a7447b7b8..a6c1346f6 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -415,4 +415,8 @@ public class AllAppsRecyclerView extends BaseRecyclerView implements LogContaine y + mEmptySearchBackground.getIntrinsicHeight()); } + @Override + public boolean hasOverlappingRendering() { + return false; + } } diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index ed9873eaf..b5c821ac2 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -3,6 +3,8 @@ package com.android.launcher3.allapps; import static com.android.launcher3.LauncherState.ALL_APPS_CONTENT; import static com.android.launcher3.LauncherState.ALL_APPS_HEADER; import static com.android.launcher3.LauncherState.ALL_APPS_HEADER_EXTRA; +import static com.android.launcher3.LauncherState.OVERVIEW; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_SCALE; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_VERTICAL_PROGRESS; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.LINEAR; @@ -23,10 +25,13 @@ import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherStateManager.AnimationConfig; import com.android.launcher3.LauncherStateManager.StateHandler; import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorSetBuilder; import com.android.launcher3.anim.PropertySetter; +import com.android.launcher3.uioverrides.UiFactory; import com.android.launcher3.util.Themes; +import com.android.launcher3.views.ScrimView; /** * Handles AllApps view transition. @@ -55,6 +60,7 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil }; private AllAppsContainerView mAppsView; + private ScrimView mScrimView; private final Launcher mLauncher; private final boolean mIsDarkTheme; @@ -99,7 +105,6 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil mAppsView.setAlpha(1); mLauncher.getHotseat().setTranslationY(0); mLauncher.getWorkspace().getPageIndicator().setTranslationY(0); - mLauncher.getDragHandleIndicator().setTranslationY(0); } } @@ -114,6 +119,7 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil */ public void setProgress(float progress) { mProgress = progress; + mScrimView.setProgress(progress); float shiftCurrent = progress * mShiftRange; mAppsView.setTranslationY(shiftCurrent); @@ -122,12 +128,12 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil if (!mIsVerticalLayout) { mLauncher.getHotseat().setTranslationY(hotseatTranslation); mLauncher.getWorkspace().getPageIndicator().setTranslationY(hotseatTranslation); - mLauncher.getDragHandleIndicator().setTranslationY(hotseatTranslation); } // Use a light system UI (dark icons) if all apps is behind at least half of the // status bar. - boolean forceChange = shiftCurrent <= mShiftRange / 4; + boolean forceChange = shiftCurrent - mScrimView.getDragHandleSize() + <= mLauncher.getDeviceProfile().getInsets().top / 2; if (forceChange) { mLauncher.getSystemUiController().updateUiState(UI_STATE_ALL_APPS, !mIsDarkTheme); } else { @@ -159,22 +165,36 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil AnimatorSetBuilder builder, AnimationConfig config) { float targetProgress = toState.getVerticalProgress(mLauncher); if (Float.compare(mProgress, targetProgress) == 0) { - setAlphas(toState, config.getProperSetter(builder)); + setAlphas(toState, config.getPropertySetter(builder)); // Fail fast onProgressAnimationEnd(); return; } - Interpolator interpolator = config.userControlled ? LINEAR : FAST_OUT_SLOW_IN; + if (!config.playNonAtomicComponent()) { + // There is no atomic component for the all apps transition, so just return early. + return; + } + + Interpolator interpolator = config.userControlled ? LINEAR : toState == OVERVIEW + ? builder.getInterpolator(ANIM_OVERVIEW_SCALE, FAST_OUT_SLOW_IN) + : FAST_OUT_SLOW_IN; ObjectAnimator anim = ObjectAnimator.ofFloat(this, ALL_APPS_PROGRESS, mProgress, targetProgress); anim.setDuration(config.duration); anim.setInterpolator(builder.getInterpolator(ANIM_VERTICAL_PROGRESS, interpolator)); anim.addListener(getProgressAnimatorListener()); + if (toState.hideBackButton) { + anim.addUpdateListener(animation -> { + final float alpha = (float) animation.getAnimatedValue(); + UiFactory.setBackButtonAlpha(mLauncher, 1 - Utilities.boundToRange(alpha, 0, 1), + false /* animate */); + }); + } builder.play(anim); - setAlphas(toState, config.getProperSetter(builder)); + setAlphas(toState, config.getPropertySetter(builder)); } private void setAlphas(LauncherState toState, PropertySetter setter) { @@ -205,6 +225,7 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil public void setupViews(AllAppsContainerView appsView) { mAppsView = appsView; + mScrimView = mLauncher.findViewById(R.id.scrim_view); } /** @@ -213,6 +234,10 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil public void setScrollRangeDelta(float delta) { mScrollRangeDelta = delta; mShiftRange = mLauncher.getDeviceProfile().heightPx - mScrollRangeDelta; + + if (mScrimView != null) { + mScrimView.reInitUi(); + } } /** diff --git a/src/com/android/launcher3/allapps/DiscoveryBounce.java b/src/com/android/launcher3/allapps/DiscoveryBounce.java index fddafb2a6..e1cd06a8b 100644 --- a/src/com/android/launcher3/allapps/DiscoveryBounce.java +++ b/src/com/android/launcher3/allapps/DiscoveryBounce.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * Copyright (C) 2018 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. @@ -17,35 +17,46 @@ package com.android.launcher3.allapps; import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.LauncherState.OVERVIEW; +import static com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType.HOTSEAT; +import static com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType.PREDICTION; import android.animation.Animator; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; +import android.animation.Keyframe; +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; +import android.animation.TimeInterpolator; import android.app.ActivityManager; -import android.content.Context; +import android.os.Handler; import android.view.MotionEvent; +import android.view.animation.PathInterpolator; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.states.InternalStateHandler; /** - * Floating view responsible for showing discovery bounce animation + * Abstract base class of floating view responsible for showing discovery bounce animation */ public class DiscoveryBounce extends AbstractFloatingView { - public static final String APPS_VIEW_SHOWN = "launcher.apps_view_shown"; + private static final long DELAY_MS = 450; + + public static final String HOME_BOUNCE_SEEN = "launcher.apps_view_shown"; + public static final String SHELF_BOUNCE_SEEN = "launcher.shelf_bounce_seen"; private final Launcher mLauncher; private final Animator mDiscoBounceAnimation; - public DiscoveryBounce(Launcher launcher) { + public DiscoveryBounce(Launcher launcher, Animator animator) { super(launcher, null); mLauncher = launcher; - mDiscoBounceAnimation = AnimatorInflater.loadAnimator(mLauncher, - R.animator.discovery_bounce); + mDiscoBounceAnimation = animator; AllAppsTransitionController controller = mLauncher.getAllAppsController(); mDiscoBounceAnimation.setTarget(controller); mDiscoBounceAnimation.addListener(controller.getProgressAnimatorListener()); @@ -73,6 +84,14 @@ public class DiscoveryBounce extends AbstractFloatingView { } @Override + public boolean onBackPressed() { + super.onBackPressed(); + // Go back to the previous state (from a user's perspective this floating view isn't + // something to go back from). + return false; + } + + @Override public boolean onControllerInterceptTouchEvent(MotionEvent ev) { handleClose(false); return false; @@ -96,17 +115,75 @@ public class DiscoveryBounce extends AbstractFloatingView { return (type & TYPE_ON_BOARD_POPUP) != 0; } - public static void showIfNeeded(Launcher launcher) { + public static void showForHomeIfNeeded(Launcher launcher) { + showForHomeIfNeeded(launcher, true); + } + + private static void showForHomeIfNeeded(Launcher launcher, boolean withDelay) { if (!launcher.isInState(NORMAL) - || launcher.getSharedPrefs().getBoolean(APPS_VIEW_SHOWN, false) + || launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false) || AbstractFloatingView.getTopOpenView(launcher) != null || UserManagerCompat.getInstance(launcher).isDemoUser() || ActivityManager.isRunningInTestHarness()) { return; } - DiscoveryBounce view = new DiscoveryBounce(launcher); + if (withDelay) { + new Handler().postDelayed(() -> showForHomeIfNeeded(launcher, false), DELAY_MS); + return; + } + + DiscoveryBounce view = new DiscoveryBounce(launcher, + AnimatorInflater.loadAnimator(launcher, R.animator.discovery_bounce)); + view.mIsOpen = true; + launcher.getDragLayer().addView(view); + launcher.getUserEventDispatcher().logActionBounceTip(HOTSEAT); + } + + public static void showForOverviewIfNeeded(Launcher launcher) { + showForOverviewIfNeeded(launcher, true); + } + + private static void showForOverviewIfNeeded(Launcher launcher, boolean withDelay) { + if (!launcher.isInState(OVERVIEW) + || !launcher.hasBeenResumed() + || launcher.isForceInvisible() + || launcher.getDeviceProfile().isVerticalBarLayout() + || launcher.getSharedPrefs().getBoolean(SHELF_BOUNCE_SEEN, false) + || UserManagerCompat.getInstance(launcher).isDemoUser() + || ActivityManager.isRunningInTestHarness()) { + return; + } + + if (withDelay) { + new Handler().postDelayed(() -> showForOverviewIfNeeded(launcher, false), DELAY_MS); + return; + } else if (InternalStateHandler.hasPending() + || AbstractFloatingView.getTopOpenView(launcher) != null) { + // TODO: Move these checks to the top and call this method after invalidate handler. + return; + } + + float verticalProgress = OVERVIEW.getVerticalProgress(launcher); + + TimeInterpolator pathInterpolator = new PathInterpolator(0.35f, 0, 0.5f, 1); + Keyframe keyframe3 = Keyframe.ofFloat(0.423f, verticalProgress - (1 - 0.9738f)); + keyframe3.setInterpolator(pathInterpolator); + Keyframe keyframe4 = Keyframe.ofFloat(0.754f, verticalProgress); + keyframe4.setInterpolator(pathInterpolator); + + PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofKeyframe("progress", + Keyframe.ofFloat(0, verticalProgress), + Keyframe.ofFloat(0.246f, verticalProgress), keyframe3, keyframe4, + Keyframe.ofFloat(1f, verticalProgress)); + ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(null, + new PropertyValuesHolder[]{propertyValuesHolder}); + animator.setDuration(2166); + animator.setRepeatCount(5); + + DiscoveryBounce view = new DiscoveryBounce(launcher, animator); view.mIsOpen = true; launcher.getDragLayer().addView(view); + launcher.getUserEventDispatcher().logActionBounceTip(PREDICTION); } } diff --git a/src/com/android/launcher3/allapps/FloatingHeaderView.java b/src/com/android/launcher3/allapps/FloatingHeaderView.java index 461f5b5ba..462e7f34e 100644 --- a/src/com/android/launcher3/allapps/FloatingHeaderView.java +++ b/src/com/android/launcher3/allapps/FloatingHeaderView.java @@ -74,6 +74,7 @@ public class FloatingHeaderView extends LinearLayout implements protected boolean mTabsHidden; protected int mMaxTranslation; + private boolean mMainRVActive = true; public FloatingHeaderView(@NonNull Context context) { this(context, null); @@ -95,7 +96,7 @@ public class FloatingHeaderView extends LinearLayout implements mMainRV = setupRV(mMainRV, mAH[AllAppsContainerView.AdapterHolder.MAIN].recyclerView); mWorkRV = setupRV(mWorkRV, mAH[AllAppsContainerView.AdapterHolder.WORK].recyclerView); mParent = (ViewGroup) mMainRV.getParent(); - setMainActive(true); + setMainActive(mMainRVActive || mWorkRV == null); reset(false); } @@ -108,6 +109,7 @@ public class FloatingHeaderView extends LinearLayout implements public void setMainActive(boolean active) { mCurrentRV = active ? mMainRV : mWorkRV; + mMainRVActive = active; } public int getMaxTranslation() { @@ -237,6 +239,11 @@ public class FloatingHeaderView extends LinearLayout implements public boolean hasVisibleContent() { return false; } + + @Override + public boolean hasOverlappingRendering() { + return false; + } } diff --git a/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java b/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java index a069d5d4d..a916697bf 100644 --- a/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java +++ b/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java @@ -25,6 +25,7 @@ import android.util.AttributeSet; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; + import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; @@ -169,8 +170,7 @@ public class PersonalWorkSlidingTabStrip extends LinearLayout implements PageInd public void setMarkersCount(int numMarkers) { } @Override - public void setPageDescription(CharSequence description) { - // We don't want custom page description as the tab-bar already has two tabs with their - // own descriptions. + public boolean hasOverlappingRendering() { + return false; } } diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java index ad61c55db..ab6635e45 100644 --- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java +++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java @@ -62,6 +62,10 @@ public class AppsSearchContainerLayout extends ExtendedEditText private AlphabeticalAppsList mApps; private AllAppsContainerView mAppsView; + // This value was used to position the QSB. We store it here for translationY animations. + private final float mFixedTranslationY; + private final float mMarginTopAdjusting; + public AppsSearchContainerLayout(Context context) { this(context, null); } @@ -79,6 +83,9 @@ public class AppsSearchContainerLayout extends ExtendedEditText mSearchQueryBuilder = new SpannableStringBuilder(); Selection.setSelection(mSearchQueryBuilder, 0); + mFixedTranslationY = getTranslationY(); + mMarginTopAdjusting = mFixedTranslationY - getPaddingTop(); + // Update the hint to contain the icon. // Prefix the original hint with two spaces. The first space gets replaced by the icon // using span. The second space is used for a singe space character between the hint @@ -195,14 +202,16 @@ public class AppsSearchContainerLayout extends ExtendedEditText @Override public void setInsets(Rect insets) { + MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams(); + mlp.topMargin = Math.round(Math.max(-mFixedTranslationY, insets.top - mMarginTopAdjusting)); + requestLayout(); + DeviceProfile dp = mLauncher.getDeviceProfile(); if (dp.isVerticalBarLayout()) { mLauncher.getAllAppsController().setScrollRangeDelta(0); } else { - MarginLayoutParams mlp = ((MarginLayoutParams) getLayoutParams()); - int myBot = mlp.topMargin + (int) getTranslationY() + mlp.height; mLauncher.getAllAppsController().setScrollRangeDelta( - dp.hotseatBarBottomPaddingPx + myBot); + insets.bottom + mlp.topMargin + mFixedTranslationY); } } } diff --git a/src/com/android/launcher3/anim/AnimatorPlaybackController.java b/src/com/android/launcher3/anim/AnimatorPlaybackController.java index 087752df1..84085cb6c 100644 --- a/src/com/android/launcher3/anim/AnimatorPlaybackController.java +++ b/src/com/android/launcher3/anim/AnimatorPlaybackController.java @@ -17,6 +17,7 @@ package com.android.launcher3.anim; import android.animation.Animator; import android.animation.Animator.AnimatorListener; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; @@ -34,63 +35,78 @@ import java.util.List; */ public abstract class AnimatorPlaybackController implements ValueAnimator.AnimatorUpdateListener { + public static AnimatorPlaybackController wrap(AnimatorSet anim, long duration) { + return wrap(anim, duration, null); + } + /** * Creates an animation controller for the provided animation. * The actual duration does not matter as the animation is manually controlled. It just * needs to be larger than the total number of pixels so that we don't have jittering due * to float (animation-fraction * total duration) to int conversion. */ - public static AnimatorPlaybackController wrap(AnimatorSet anim, long duration) { + public static AnimatorPlaybackController wrap(AnimatorSet anim, long duration, + Runnable onCancelRunnable) { /** * TODO: use {@link AnimatorSet#setCurrentPlayTime(long)} once b/68382377 is fixed. */ - return new AnimatorPlaybackControllerVL(anim, duration); + return new AnimatorPlaybackControllerVL(anim, duration, onCancelRunnable); } private final ValueAnimator mAnimationPlayer; private final long mDuration; protected final AnimatorSet mAnim; - private AnimatorSet mOriginalTarget; protected float mCurrentFraction; private Runnable mEndAction; - protected AnimatorPlaybackController(AnimatorSet anim, long duration) { + protected boolean mTargetCancelled = false; + protected Runnable mOnCancelRunnable; + + protected AnimatorPlaybackController(AnimatorSet anim, long duration, + Runnable onCancelRunnable) { mAnim = anim; - mOriginalTarget = mAnim; mDuration = duration; + mOnCancelRunnable = onCancelRunnable; mAnimationPlayer = ValueAnimator.ofFloat(0, 1); mAnimationPlayer.setInterpolator(Interpolators.LINEAR); mAnimationPlayer.addListener(new OnAnimationEndDispatcher()); mAnimationPlayer.addUpdateListener(this); - } - public AnimatorSet getTarget() { - return mAnim; - } + mAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationCancel(Animator animation) { + mTargetCancelled = true; + if (mOnCancelRunnable != null) { + mOnCancelRunnable.run(); + mOnCancelRunnable = null; + } + } + + @Override + public void onAnimationEnd(Animator animation) { + mTargetCancelled = false; + mOnCancelRunnable = null; + } - public void setOriginalTarget(AnimatorSet anim) { - mOriginalTarget = anim; + @Override + public void onAnimationStart(Animator animation) { + mTargetCancelled = false; + } + }); } - public AnimatorSet getOriginalTarget() { - return mOriginalTarget; + public AnimatorSet getTarget() { + return mAnim; } public long getDuration() { return mDuration; } - public AnimatorPlaybackController cloneFor(AnimatorSet anim) { - AnimatorPlaybackController controller = AnimatorPlaybackController.wrap(anim, mDuration); - controller.setOriginalTarget(mOriginalTarget); - controller.setPlayFraction(mCurrentFraction); - return controller; - } - /** * Starts playing the animation forward from current position. */ @@ -170,12 +186,37 @@ public abstract class AnimatorPlaybackController implements ValueAnimator.Animat } } + public void dispatchOnCancel() { + dispatchOnCancelRecursively(mAnim); + } + + private void dispatchOnCancelRecursively(Animator animator) { + for (AnimatorListener l : nonNullList(animator.getListeners())) { + l.onAnimationCancel(animator); + } + + if (animator instanceof AnimatorSet) { + for (Animator anim : nonNullList(((AnimatorSet) animator).getChildAnimations())) { + dispatchOnCancelRecursively(anim); + } + } + } + + public void setOnCancelRunnable(Runnable runnable) { + mOnCancelRunnable = runnable; + } + + public Runnable getOnCancelRunnable() { + return mOnCancelRunnable; + } + public static class AnimatorPlaybackControllerVL extends AnimatorPlaybackController { private final ValueAnimator[] mChildAnimations; - private AnimatorPlaybackControllerVL(AnimatorSet anim, long duration) { - super(anim, duration); + private AnimatorPlaybackControllerVL(AnimatorSet anim, long duration, + Runnable onCancelRunnable) { + super(anim, duration, onCancelRunnable); // Build animation list ArrayList<ValueAnimator> childAnims = new ArrayList<>(); @@ -206,6 +247,11 @@ public abstract class AnimatorPlaybackController implements ValueAnimator.Animat @Override public void setPlayFraction(float fraction) { mCurrentFraction = fraction; + // Let the animator report the progress but don't apply the progress to child + // animations if it has been cancelled. + if (mTargetCancelled) { + return; + } long playPos = clampDuration(fraction); for (ValueAnimator anim : mChildAnimations) { anim.setCurrentPlayTime(Math.min(playPos, anim.getDuration())); diff --git a/src/com/android/launcher3/anim/AnimatorSetBuilder.java b/src/com/android/launcher3/anim/AnimatorSetBuilder.java index b209a2dee..f10bce8d2 100644 --- a/src/com/android/launcher3/anim/AnimatorSetBuilder.java +++ b/src/com/android/launcher3/anim/AnimatorSetBuilder.java @@ -16,7 +16,6 @@ package com.android.launcher3.anim; import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.util.SparseArray; import android.view.animation.Interpolator; @@ -32,7 +31,10 @@ import java.util.List; public class AnimatorSetBuilder { public static final int ANIM_VERTICAL_PROGRESS = 0; - public static final int ANIM_OVERVIEW_TRANSLATION = 1; + public static final int ANIM_WORKSPACE_SCALE = 1; + public static final int ANIM_WORKSPACE_FADE = 2; + public static final int ANIM_OVERVIEW_SCALE = 3; + public static final int ANIM_OVERVIEW_FADE = 4; protected final ArrayList<Animator> mAnims = new ArrayList<>(); @@ -56,9 +58,9 @@ public class AnimatorSetBuilder { AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); anim.playTogether(mAnims); if (!mOnFinishRunnables.isEmpty()) { - anim.addListener(new AnimatorListenerAdapter() { + anim.addListener(new AnimationSuccessListener() { @Override - public void onAnimationEnd(Animator animation) { + public void onAnimationSuccess(Animator animation) { for (Runnable onFinishRunnable : mOnFinishRunnables) { onFinishRunnable.run(); } diff --git a/src/com/android/launcher3/anim/Interpolators.java b/src/com/android/launcher3/anim/Interpolators.java index 06ddf2208..bace7df57 100644 --- a/src/com/android/launcher3/anim/Interpolators.java +++ b/src/com/android/launcher3/anim/Interpolators.java @@ -38,6 +38,7 @@ public class Interpolators { public static final Interpolator DEACCEL = new DecelerateInterpolator(); public static final Interpolator DEACCEL_1_5 = new DecelerateInterpolator(1.5f); + public static final Interpolator DEACCEL_1_7 = new DecelerateInterpolator(1.7f); public static final Interpolator DEACCEL_2 = new DecelerateInterpolator(2); public static final Interpolator DEACCEL_2_5 = new DecelerateInterpolator(2.5f); public static final Interpolator DEACCEL_3 = new DecelerateInterpolator(3f); @@ -57,9 +58,7 @@ public class Interpolators { EXAGGERATED_EASE = new PathInterpolator(exaggeratedEase); } - public static final Interpolator APP_CLOSE_ALPHA = new PathInterpolator(0.4f, 0, 1f, 1f); - - public static final Interpolator OVERSHOOT_0 = new OvershootInterpolator(0); + public static final Interpolator OVERSHOOT_1_2 = new OvershootInterpolator(1.2f); public static final Interpolator TOUCH_RESPONSE_INTERPOLATOR = new PathInterpolator(0.3f, 0f, 0.1f, 1f); @@ -116,4 +115,24 @@ public class Interpolators { public static Interpolator scrollInterpolatorForVelocity(float velocity) { return Math.abs(velocity) > FAST_FLING_PX_MS ? SCROLL : SCROLL_CUBIC; } + + /** + * Runs the given interpolator such that the entire progress is set between the given bounds. + * That is, we set the interpolation to 0 until lowerBound and reach 1 by upperBound. + */ + public static Interpolator clampToProgress(Interpolator interpolator, float lowerBound, + float upperBound) { + if (upperBound <= lowerBound) { + throw new IllegalArgumentException("lowerBound must be less than upperBound"); + } + return t -> { + if (t < lowerBound) { + return 0; + } + if (t > upperBound) { + return 1; + } + return interpolator.getInterpolation((t - lowerBound) / (upperBound - lowerBound)); + }; + } }
\ No newline at end of file diff --git a/src/com/android/launcher3/compat/UserManagerCompatVP.java b/src/com/android/launcher3/compat/UserManagerCompatVP.java index 2e8a8eb21..fa3902b76 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVP.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVP.java @@ -15,41 +15,20 @@ */ package com.android.launcher3.compat; +import android.annotation.TargetApi; import android.content.Context; +import android.os.Build; import android.os.UserHandle; -import android.os.UserManager; -import android.util.Log; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +@TargetApi(Build.VERSION_CODES.P) public class UserManagerCompatVP extends UserManagerCompatVNMr1 { - private static final String TAG = "UserManagerCompatVP"; - - private Method mRequestQuietModeEnabled; UserManagerCompatVP(Context context) { super(context); - // TODO: Replace it with proper API call once SDK is ready. - try { - mRequestQuietModeEnabled = UserManager.class.getDeclaredMethod( - "requestQuietModeEnabled", boolean.class, UserHandle.class); - } catch (NoSuchMethodException e) { - Log.e(TAG, "requestQuietModeEnabled is not available", e); - } } @Override public boolean requestQuietModeEnabled(boolean enableQuietMode, UserHandle user) { - if (mRequestQuietModeEnabled == null) { - return false; - } - try { - return (boolean) - mRequestQuietModeEnabled.invoke(mUserManager, enableQuietMode, user); - } catch (IllegalAccessException | InvocationTargetException e) { - Log.e(TAG, "Failed to invoke mRequestQuietModeEnabled", e); - } - return false; + return mUserManager.requestQuietModeEnabled(enableQuietMode, user); } } diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index 8519365e7..53e9e2dac 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -1,3 +1,4 @@ + /* * Copyright (C) 2008 The Android Open Source Project * @@ -42,10 +43,12 @@ import com.android.launcher3.DropTargetBar; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.ShortcutAndWidgetContainer; +import com.android.launcher3.Workspace; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.ViewScrim; +import com.android.launcher3.graphics.WorkspaceAndHotseatScrim; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.uioverrides.UiFactory; import com.android.launcher3.util.Thunk; @@ -58,6 +61,12 @@ import java.util.ArrayList; */ public class DragLayer extends BaseDragLayer<Launcher> { + public static final int ALPHA_INDEX_OVERLAY = 0; + public static final int ALPHA_INDEX_LAUNCHER_LOAD = 1; + public static final int ALPHA_INDEX_TRANSITIONS = 2; + public static final int ALPHA_INDEX_SWIPE_UP = 3; + private static final int ALPHA_CHANNEL_COUNT = 4; + public static final int ANIMATION_END_DISAPPEAR = 0; public static final int ANIMATION_END_REMAIN_VISIBLE = 2; @@ -77,6 +86,7 @@ public class DragLayer extends BaseDragLayer<Launcher> { // Related to adjacent page hints private final ViewGroupFocusHelper mFocusIndicatorHelper; + private final WorkspaceAndHotseatScrim mScrim; /** * Used to create a new DragLayer from XML. @@ -85,17 +95,23 @@ public class DragLayer extends BaseDragLayer<Launcher> { * @param attrs The attributes set containing the Workspace's customization values. */ public DragLayer(Context context, AttributeSet attrs) { - super(context, attrs); + super(context, attrs, ALPHA_CHANNEL_COUNT); // Disable multitouch across the workspace/all apps/customize tray setMotionEventSplittingEnabled(false); setChildrenDrawingOrderEnabled(true); mFocusIndicatorHelper = new ViewGroupFocusHelper(this); + mScrim = new WorkspaceAndHotseatScrim(this); } - public void setup(DragController dragController) { + public void setup(DragController dragController, Workspace workspace) { mDragController = dragController; + mScrim.setWorkspace(workspace); + recreateControllers(); + } + + public void recreateControllers() { mControllers = UiFactory.createTouchControllers(mActivity); } @@ -108,18 +124,6 @@ public class DragLayer extends BaseDragLayer<Launcher> { return mDragController.dispatchKeyEvent(event) || super.dispatchKeyEvent(event); } - public boolean isEventOverHotseat(MotionEvent ev) { - return isEventOverView(mActivity.getHotseat(), ev); - } - - private boolean isEventOverFolder(Folder folder, MotionEvent ev) { - return isEventOverView(folder, ev); - } - - private boolean isEventOverDropTargetBar(MotionEvent ev) { - return isEventOverView(mActivity.getDropTargetBar(), ev); - } - @Override protected boolean drawChild(Canvas canvas, View child, long drawingTime) { ViewScrim scrim = ViewScrim.get(child); @@ -139,24 +143,29 @@ public class DragLayer extends BaseDragLayer<Launcher> { return super.findActiveController(ev); } + private boolean isEventOverAccessibleDropTargetBar(MotionEvent ev) { + return isInAccessibleDrag() && isEventOverView(mActivity.getDropTargetBar(), ev); + } + @Override public boolean onInterceptHoverEvent(MotionEvent ev) { if (mActivity == null || mActivity.getWorkspace() == null) { return false; } - Folder currentFolder = Folder.getOpen(mActivity); - if (currentFolder == null) { + AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(mActivity); + if (!(topView instanceof Folder)) { return false; } else { AccessibilityManager accessibilityManager = (AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); if (accessibilityManager.isTouchExplorationEnabled()) { + Folder currentFolder = (Folder) topView; final int action = ev.getAction(); boolean isOverFolderOrSearchBar; switch (action) { case MotionEvent.ACTION_HOVER_ENTER: - isOverFolderOrSearchBar = isEventOverFolder(currentFolder, ev) || - (isInAccessibleDrag() && isEventOverDropTargetBar(ev)); + isOverFolderOrSearchBar = isEventOverView(topView, ev) || + isEventOverAccessibleDropTargetBar(ev); if (!isOverFolderOrSearchBar) { sendTapOutsideFolderAccessibilityEvent(currentFolder.isEditingName()); mHoverPointClosesFolder = true; @@ -165,8 +174,8 @@ public class DragLayer extends BaseDragLayer<Launcher> { mHoverPointClosesFolder = false; break; case MotionEvent.ACTION_HOVER_MOVE: - isOverFolderOrSearchBar = isEventOverFolder(currentFolder, ev) || - (isInAccessibleDrag() && isEventOverDropTargetBar(ev)); + isOverFolderOrSearchBar = isEventOverView(topView, ev) || + isEventOverAccessibleDropTargetBar(ev); if (!isOverFolderOrSearchBar && !mHoverPointClosesFolder) { sendTapOutsideFolderAccessibilityEvent(currentFolder.isEditingName()); mHoverPointClosesFolder = true; @@ -201,18 +210,8 @@ public class DragLayer extends BaseDragLayer<Launcher> { @Override public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { - // Shortcuts can appear above folder - View topView = AbstractFloatingView.getTopOpenView(mActivity); - if (topView != null) { - if (child == topView) { - return super.onRequestSendAccessibilityEvent(child, event); - } - if (isInAccessibleDrag() && child instanceof DropTargetBar) { - return super.onRequestSendAccessibilityEvent(child, event); - } - // Skip propagating onRequestSendAccessibilityEvent for all other children - // which are not topView - return false; + if (isInAccessibleDrag() && child instanceof DropTargetBar) { + return true; } return super.onRequestSendAccessibilityEvent(child, event); } @@ -221,11 +220,9 @@ public class DragLayer extends BaseDragLayer<Launcher> { public void addChildrenForAccessibility(ArrayList<View> childrenForAccessibility) { View topView = AbstractFloatingView.getTopOpenView(mActivity); if (topView != null) { - // Only add the top view as a child for accessibility when it is open - childrenForAccessibility.add(topView); - + addAccessibleChildToList(topView, childrenForAccessibility); if (isInAccessibleDrag()) { - childrenForAccessibility.add(mActivity.getDropTargetBar()); + addAccessibleChildToList(mActivity.getDropTargetBar(), childrenForAccessibility); } } else { super.addChildrenForAccessibility(childrenForAccessibility); @@ -462,6 +459,7 @@ public class DragLayer extends BaseDragLayer<Launcher> { case ANIMATION_END_REMAIN_VISIBLE: break; } + mDropAnim = null; } }); mDropAnim.start(); @@ -471,6 +469,7 @@ public class DragLayer extends BaseDragLayer<Launcher> { if (mDropAnim != null) { mDropAnim.cancel(); } + mDropAnim = null; if (mDropView != null) { mDragController.onDeferredEndDrag(mDropView); } @@ -542,7 +541,24 @@ public class DragLayer extends BaseDragLayer<Launcher> { @Override protected void dispatchDraw(Canvas canvas) { // Draw the background below children. + mScrim.draw(canvas); mFocusIndicatorHelper.draw(canvas); super.dispatchDraw(canvas); } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mScrim.setSize(w, h); + } + + @Override + public void setInsets(Rect insets) { + super.setInsets(insets); + mScrim.onInsetsChanged(insets); + } + + public WorkspaceAndHotseatScrim getScrim() { + return mScrim; + } } diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index e1e1f83a7..1e5f8545b 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -288,7 +288,7 @@ public class DragView extends View { if (mScaledMaskPath != null) { mBgSpringDrawable.setColorFilter(mBaseFilter); - mBgSpringDrawable.setColorFilter(mBaseFilter); + mFgSpringDrawable.setColorFilter(mBaseFilter); mBadge.setColorFilter(mBaseFilter); } } else { diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 12d7dc77a..6b13da70c 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -31,6 +31,7 @@ import android.text.InputType; import android.text.Selection; import android.util.AttributeSet; import android.util.Log; +import android.util.Pair; import android.view.ActionMode; import android.view.FocusFinder; import android.view.KeyEvent; @@ -39,6 +40,7 @@ import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; +import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.view.animation.AnimationUtils; import android.view.inputmethod.EditorInfo; @@ -507,32 +509,21 @@ public class Folder extends AbstractFloatingView implements DragSource, // dropping. One resulting issue is that replaceFolderWithFinalItem() can be called twice. mDeleteFolderOnDropCompleted = false; - final Runnable onCompleteRunnable; centerAboutIcon(); AnimatorSet anim = new FolderAnimationManager(this, true /* isOpening */).getAnimator(); - onCompleteRunnable = new Runnable() { - @Override - public void run() { - mLauncher.getUserEventDispatcher().resetElapsedContainerMillis("folder opened"); - } - }; anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { mFolderIcon.setBackgroundVisible(false); mFolderIcon.drawLeaveBehindIfExists(); - - sendCustomAccessibilityEvent( - Folder.this, - AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, - mContent.getAccessibilityDescription()); } @Override public void onAnimationEnd(Animator animation) { mState = STATE_OPEN; + announceAccessibilityChanges(); - onCompleteRunnable.run(); + mLauncher.getUserEventDispatcher().resetElapsedContainerMillis("folder opened"); mContent.setFocusOnFirstChild(); } }); @@ -580,11 +571,6 @@ public class Folder extends AbstractFloatingView implements DragSource, } mContent.verifyVisibleHighResIcons(mContent.getNextPage()); - - // Notify the accessibility manager that this folder "window" has appeared and occluded - // the workspace items - sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - dragLayer.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); } public void beginExternalDrag() { @@ -614,18 +600,17 @@ public class Folder extends AbstractFloatingView implements DragSource, mFolderIcon.clearLeaveBehindIfExists(); } - if (!(getParent() instanceof DragLayer)) return; - DragLayer parent = (DragLayer) getParent(); - if (animate) { animateClosed(); } else { closeComplete(false); + post(this::announceAccessibilityChanges); } // Notify the accessibility manager that this folder "window" has disappeared and no // longer occludes the workspace items - parent.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + mLauncher.getDragLayer().sendAccessibilityEvent( + AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } private void animateClosed() { @@ -634,18 +619,18 @@ public class Folder extends AbstractFloatingView implements DragSource, @Override public void onAnimationEnd(Animator animation) { closeComplete(true); - } - @Override - public void onAnimationStart(Animator animation) { - sendCustomAccessibilityEvent( - Folder.this, - AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, - getContext().getString(R.string.folder_closed)); + announceAccessibilityChanges(); } }); startAnimation(a); } + @Override + protected Pair<View, String> getAccessibilityTarget() { + return Pair.create(mContent, mIsOpen ? mContent.getAccessibilityDescription() + : getContext().getString(R.string.folder_closed)); + } + private void closeComplete(boolean wasAnimated) { // TODO: Clear all active animations. DragLayer parent = (DragLayer) getParent(); @@ -1452,12 +1437,13 @@ public class Folder extends AbstractFloatingView implements DragSource, } @Override - public void onBackPressed() { + public boolean onBackPressed() { if (isEditingName()) { mFolderName.dispatchBackKey(); } else { super.onBackPressed(); } + return true; } @Override diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index ec448e997..9ae377535 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -16,6 +16,7 @@ package com.android.launcher3.folder; +import static com.android.launcher3.BubbleTextView.TEXT_ALPHA_PROPERTY; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; @@ -172,9 +173,8 @@ public class FolderAnimationManager { AnimatorSet a = LauncherAnimUtils.createAnimatorSet(); // Initialize the Folder items' text. - PropertyResetListener colorResetListener = new PropertyResetListener<>( - BubbleTextView.TEXT_ALPHA_PROPERTY, - Color.alpha(Themes.getAttrColor(mContext, android.R.attr.textColorSecondary))); + PropertyResetListener colorResetListener = + new PropertyResetListener<>(TEXT_ALPHA_PROPERTY, 1f); for (BubbleTextView icon : mFolder.getItemsOnPage(mFolder.mContent.getCurrentPage())) { if (mIsOpening) { icon.setTextVisibility(false); diff --git a/src/com/android/launcher3/graphics/ColorScrim.java b/src/com/android/launcher3/graphics/ColorScrim.java index 1ffce1823..96d93d83b 100644 --- a/src/com/android/launcher3/graphics/ColorScrim.java +++ b/src/com/android/launcher3/graphics/ColorScrim.java @@ -23,7 +23,7 @@ import android.view.animation.Interpolator; import com.android.launcher3.R; import com.android.launcher3.anim.Interpolators; -import com.android.launcher3.dynamicui.WallpaperColorInfo; +import com.android.launcher3.uioverrides.WallpaperColorInfo; /** * Simple scrim which draws a color diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index 680c02022..a2a08015e 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -24,6 +24,7 @@ import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; +import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; @@ -66,12 +67,10 @@ public class IconNormalizer { private final int mMaxSize; private final Bitmap mBitmap; - private final Bitmap mBitmapARGB; private final Canvas mCanvas; private final Paint mPaintMaskShape; private final Paint mPaintMaskShapeOutline; private final byte[] mPixels; - private final int[] mPixelsARGB; private final Rect mAdaptiveIconBounds; private float mAdaptiveIconScale; @@ -80,11 +79,9 @@ public class IconNormalizer { private final float[] mLeftBorder; private final float[] mRightBorder; private final Rect mBounds; + private final Path mShapePath; private final Matrix mMatrix; - private final Paint mPaintIcon; - private final Canvas mCanvasARGB; - /** package private **/ IconNormalizer(Context context) { // Use twice the icon size as maximum size to avoid scaling down twice. @@ -92,19 +89,11 @@ public class IconNormalizer { mBitmap = Bitmap.createBitmap(mMaxSize, mMaxSize, Bitmap.Config.ALPHA_8); mCanvas = new Canvas(mBitmap); mPixels = new byte[mMaxSize * mMaxSize]; - mPixelsARGB = new int[mMaxSize * mMaxSize]; mLeftBorder = new float[mMaxSize]; mRightBorder = new float[mMaxSize]; mBounds = new Rect(); mAdaptiveIconBounds = new Rect(); - // Needed for isShape() method - mBitmapARGB = Bitmap.createBitmap(mMaxSize, mMaxSize, Bitmap.Config.ARGB_8888); - mCanvasARGB = new Canvas(mBitmapARGB); - - mPaintIcon = new Paint(); - mPaintIcon.setColor(Color.WHITE); - mPaintMaskShape = new Paint(); mPaintMaskShape.setColor(Color.RED); mPaintMaskShape.setStyle(Paint.Style.FILL); @@ -114,8 +103,9 @@ public class IconNormalizer { mPaintMaskShapeOutline.setStrokeWidth(2 * context.getResources().getDisplayMetrics().density); mPaintMaskShapeOutline.setStyle(Paint.Style.STROKE); mPaintMaskShapeOutline.setColor(Color.BLACK); - mPaintMaskShapeOutline.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); + mPaintMaskShapeOutline.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + mShapePath = new Path(); mMatrix = new Matrix(); mAdaptiveIconScale = SCALE_NOT_INITIALIZED; } @@ -139,41 +129,49 @@ public class IconNormalizer { // Condition 2: // Actual icon (white) and the fitted shape (e.g., circle)(red) XOR operation // should generate transparent image, if the actual icon is equivalent to the shape. - mBitmapARGB.eraseColor(Color.TRANSPARENT); - mCanvasARGB.drawBitmap(mBitmap, 0, 0, mPaintIcon); // Fit the shape within the icon's bounding box mMatrix.reset(); mMatrix.setScale(mBounds.width(), mBounds.height()); mMatrix.postTranslate(mBounds.left, mBounds.top); - maskPath.transform(mMatrix); + maskPath.transform(mMatrix, mShapePath); // XOR operation - mCanvasARGB.drawPath(maskPath, mPaintMaskShape); + mCanvas.drawPath(mShapePath, mPaintMaskShape); // DST_OUT operation around the mask path outline - mCanvasARGB.drawPath(maskPath, mPaintMaskShapeOutline); + mCanvas.drawPath(mShapePath, mPaintMaskShapeOutline); // Check if the result is almost transparent - return isTransparentBitmap(mBitmapARGB); + return isTransparentBitmap(); } /** * Used to determine if certain the bitmap is transparent. */ - private boolean isTransparentBitmap(Bitmap bitmap) { - int w = mBounds.width(); - int h = mBounds.height(); - bitmap.getPixels(mPixelsARGB, 0 /* the first index to write into the array */, - w /* stride */, - mBounds.left, mBounds.top, - w, h); + private boolean isTransparentBitmap() { + ByteBuffer buffer = ByteBuffer.wrap(mPixels); + buffer.rewind(); + mBitmap.copyPixelsToBuffer(buffer); + + int y = mBounds.top; + // buffer position + int index = y * mMaxSize; + // buffer shift after every row, width of buffer = mMaxSize + int rowSizeDiff = mMaxSize - mBounds.right; + int sum = 0; - for (int i = w * h - 1; i >= 0; i--) { - if(Color.alpha(mPixelsARGB[i]) > MIN_VISIBLE_ALPHA) { + for (; y < mBounds.bottom; y++) { + index += mBounds.left; + for (int x = mBounds.left; x < mBounds.right; x++) { + if ((mPixels[index] & 0xFF) > MIN_VISIBLE_ALPHA) { sum++; + } + index++; } + index += rowSizeDiff; } + float percentageDiffPixels = ((float) sum) / (mBounds.width() * mBounds.height()); return percentageDiffPixels < PIXEL_DIFF_PERCENTAGE_THRESHOLD; } @@ -304,7 +302,7 @@ public class IconNormalizer { mBounds.bottom = bottomY; if (outBounds != null) { - outBounds.set(((float) mBounds.left) / width, ((float) mBounds.top), + outBounds.set(((float) mBounds.left) / width, ((float) mBounds.top) / height, 1 - ((float) mBounds.right) / width, 1 - ((float) mBounds.bottom) / height); } diff --git a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java index 2318a778b..bc4a06d5e 100644 --- a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java +++ b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java @@ -16,6 +16,14 @@ package com.android.launcher3.graphics; +import static android.content.Intent.ACTION_SCREEN_OFF; +import static android.content.Intent.ACTION_USER_PRESENT; + +import android.animation.ObjectAnimator; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -25,8 +33,10 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.graphics.Shader; +import android.graphics.drawable.Drawable; import android.support.v4.graphics.ColorUtils; import android.util.DisplayMetrics; +import android.util.Property; import android.view.View; import com.android.launcher3.CellLayout; @@ -34,14 +44,69 @@ import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; -import com.android.launcher3.dynamicui.WallpaperColorInfo; +import com.android.launcher3.uioverrides.WallpaperColorInfo; +import com.android.launcher3.util.Themes; /** * View scrim which draws behind hotseat and workspace */ -public class WorkspaceAndHotseatScrim extends ViewScrim<Workspace> implements +public class WorkspaceAndHotseatScrim implements View.OnAttachStateChangeListener, WallpaperColorInfo.OnChangeListener { + public static Property<WorkspaceAndHotseatScrim, Float> SCRIM_PROGRESS = + new Property<WorkspaceAndHotseatScrim, Float>(Float.TYPE, "scrimProgress") { + @Override + public Float get(WorkspaceAndHotseatScrim scrim) { + return scrim.mScrimProgress; + } + + @Override + public void set(WorkspaceAndHotseatScrim scrim, Float value) { + scrim.setScrimProgress(value); + } + }; + + public static Property<WorkspaceAndHotseatScrim, Float> SYSUI_PROGRESS = + new Property<WorkspaceAndHotseatScrim, Float>(Float.TYPE, "sysUiProgress") { + @Override + public Float get(WorkspaceAndHotseatScrim scrim) { + return scrim.mSysUiProgress; + } + + @Override + public void set(WorkspaceAndHotseatScrim scrim, Float value) { + scrim.setSysUiProgress(value); + } + }; + + private static Property<WorkspaceAndHotseatScrim, Float> SYSUI_ANIM_MULTIPLIER = + new Property<WorkspaceAndHotseatScrim, Float>(Float.TYPE, "sysUiAnimMultiplier") { + @Override + public Float get(WorkspaceAndHotseatScrim scrim) { + return scrim.mSysUiAnimMultiplier; + } + + @Override + public void set(WorkspaceAndHotseatScrim scrim, Float value) { + scrim.mSysUiAnimMultiplier = value; + scrim.reapplySysUiAlpha(); + } + }; + + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (ACTION_SCREEN_OFF.equals(action)) { + mAnimateScrimOnNextDraw = true; + } else if (ACTION_USER_PRESENT.equals(action)) { + // ACTION_USER_PRESENT is sent after onStart/onResume. This covers the case where + // the user unlocked and the Launcher is not in the foreground. + mAnimateScrimOnNextDraw = false; + } + } + }; + private static final int DARK_SCRIM_COLOR = 0x55000000; private static final int MAX_HOTSEAT_SCRIM_ALPHA = 100; private static final int ALPHA_MASK_HEIGHT_DP = 500; @@ -51,42 +116,62 @@ public class WorkspaceAndHotseatScrim extends ViewScrim<Workspace> implements private final Rect mHighlightRect = new Rect(); private final Launcher mLauncher; private final WallpaperColorInfo mWallpaperColorInfo; + private final View mRoot; + + private Workspace mWorkspace; + + private final boolean mHasSysUiScrim; + private boolean mDrawTopScrim, mDrawBottomScrim; - private final boolean mHasHotseatScrim; private final RectF mFinalMaskRect = new RectF(); private final Paint mBottomMaskPaint = new Paint(Paint.FILTER_BITMAP_FLAG); - private final Bitmap mBottomMask; private final int mMaskHeight; + private final Drawable mTopScrim; + private int mFullScrimColor; - private final int mMaxAlpha; - private int mAlpha = 0; + private float mScrimProgress; + private int mScrimAlpha = 0; + + private float mSysUiProgress = 1; + private boolean mHideSysUiScrim; - public WorkspaceAndHotseatScrim(Workspace view) { - super(view); + private boolean mAnimateScrimOnNextDraw = false; + private float mSysUiAnimMultiplier = 1; + + public WorkspaceAndHotseatScrim(View view) { + mRoot = view; mLauncher = Launcher.getLauncher(view.getContext()); mWallpaperColorInfo = WallpaperColorInfo.getInstance(mLauncher); - mMaxAlpha = mLauncher.getResources().getInteger(R.integer.config_workspaceScrimAlpha); mMaskHeight = Utilities.pxFromDp(ALPHA_MASK_BITMAP_DP, view.getResources().getDisplayMetrics()); - mHasHotseatScrim = !mWallpaperColorInfo.supportsDarkText(); - mBottomMask = mHasHotseatScrim ? createDitheredAlphaMask() : null; + mHasSysUiScrim = !mWallpaperColorInfo.supportsDarkText(); + if (mHasSysUiScrim) { + mTopScrim = Themes.getAttrDrawable(view.getContext(), R.attr.workspaceStatusBarScrim); + mBottomMask = createDitheredAlphaMask(); + } else { + mTopScrim = null; + mBottomMask = null; + } view.addOnAttachStateChangeListener(this); onExtractedColorsChanged(mWallpaperColorInfo); } - @Override - public void draw(Canvas canvas, int width, int height) { + public void setWorkspace(Workspace workspace) { + mWorkspace = workspace; + } + + public void draw(Canvas canvas) { // Draw the background below children. - if (mAlpha > 0) { + if (mScrimAlpha > 0) { // Update the scroll position first to ensure scrim cutout is in the right place. - mView.computeScrollWithoutInvalidation(); - CellLayout currCellLayout = mView.getCurrentDragOverlappingLayout(); + mWorkspace.computeScrollWithoutInvalidation(); + CellLayout currCellLayout = mWorkspace.getCurrentDragOverlappingLayout(); canvas.save(); if (currCellLayout != null && currCellLayout != mLauncher.getHotseat().getLayout()) { // Cut a hole in the darkening scrim on the page that should be highlighted, if any. @@ -95,40 +180,122 @@ public class WorkspaceAndHotseatScrim extends ViewScrim<Workspace> implements canvas.clipRect(mHighlightRect, Region.Op.DIFFERENCE); } - canvas.drawColor(ColorUtils.setAlphaComponent(mFullScrimColor, mAlpha)); + canvas.drawColor(ColorUtils.setAlphaComponent(mFullScrimColor, mScrimAlpha)); canvas.restore(); } - if (mHasHotseatScrim && !mLauncher.getDeviceProfile().isVerticalBarLayout()) { - mFinalMaskRect.set(0, height - mMaskHeight, width, height); - mBottomMaskPaint.setAlpha(Math.round(MAX_HOTSEAT_SCRIM_ALPHA * (1 - mProgress))); - canvas.drawBitmap(mBottomMask, null, mFinalMaskRect, mBottomMaskPaint); + if (!mHideSysUiScrim && mHasSysUiScrim) { + if (mSysUiProgress <= 0) { + mAnimateScrimOnNextDraw = false; + return; + } + + if (mAnimateScrimOnNextDraw) { + mSysUiAnimMultiplier = 0; + reapplySysUiAlphaNoInvalidate(); + + ObjectAnimator anim = ObjectAnimator.ofFloat(this, SYSUI_ANIM_MULTIPLIER, 1); + anim.setAutoCancel(true); + anim.setDuration(600); + anim.setStartDelay(mLauncher.getWindow().getTransitionBackgroundFadeDuration()); + anim.start(); + mAnimateScrimOnNextDraw = false; + } + + if (mDrawTopScrim) { + mTopScrim.draw(canvas); + } + if (mDrawBottomScrim) { + canvas.drawBitmap(mBottomMask, null, mFinalMaskRect, mBottomMaskPaint); + } } } - @Override - protected void onProgressChanged() { - mAlpha = Math.round(mMaxAlpha * mProgress); + public void onInsetsChanged(Rect insets) { + mDrawTopScrim = insets.top > 0; + mDrawBottomScrim = !mLauncher.getDeviceProfile().isVerticalBarLayout(); + } + + private void setScrimProgress(float progress) { + if (mScrimProgress != progress) { + mScrimProgress = progress; + mScrimAlpha = Math.round(255 * mScrimProgress); + invalidate(); + } } @Override public void onViewAttachedToWindow(View view) { mWallpaperColorInfo.addOnChangeListener(this); onExtractedColorsChanged(mWallpaperColorInfo); + + if (mHasSysUiScrim) { + IntentFilter filter = new IntentFilter(ACTION_SCREEN_OFF); + filter.addAction(ACTION_USER_PRESENT); // When the device wakes up + keyguard is gone + mRoot.getContext().registerReceiver(mReceiver, filter); + } } @Override public void onViewDetachedFromWindow(View view) { mWallpaperColorInfo.removeOnChangeListener(this); + if (mHasSysUiScrim) { + mRoot.getContext().unregisterReceiver(mReceiver); + } } @Override public void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo) { // for super light wallpaper it needs to be darken for contrast to workspace // for dark wallpapers the text is white so darkening works as well - mFullScrimColor = ColorUtils.compositeColors(DARK_SCRIM_COLOR, - wallpaperColorInfo.getMainColor()); - mBottomMaskPaint.setColor(mFullScrimColor); + mBottomMaskPaint.setColor(ColorUtils.compositeColors(DARK_SCRIM_COLOR, + wallpaperColorInfo.getMainColor())); + reapplySysUiAlpha(); + mFullScrimColor = wallpaperColorInfo.getMainColor(); + if (mScrimAlpha > 0) { + invalidate(); + } + } + + public void setSize(int w, int h) { + if (mHasSysUiScrim) { + mTopScrim.setBounds(0, 0, w, h); + mFinalMaskRect.set(0, h - mMaskHeight, w, h); + } + } + + public void hideSysUiScrim(boolean hideSysUiScrim) { + mHideSysUiScrim = hideSysUiScrim; + if (!hideSysUiScrim) { + mAnimateScrimOnNextDraw = true; + } + invalidate(); + } + + private void setSysUiProgress(float progress) { + if (progress != mSysUiProgress) { + mSysUiProgress = progress; + reapplySysUiAlpha(); + } + } + + private void reapplySysUiAlpha() { + if (mHasSysUiScrim) { + reapplySysUiAlphaNoInvalidate(); + if (!mHideSysUiScrim) { + invalidate(); + } + } + } + + private void reapplySysUiAlphaNoInvalidate() { + float factor = mSysUiProgress * mSysUiAnimMultiplier; + mBottomMaskPaint.setAlpha(Math.round(MAX_HOTSEAT_SCRIM_ALPHA * factor)); + mTopScrim.setAlpha(Math.round(255 * factor)); + } + + public void invalidate() { + mRoot.invalidate(); } public Bitmap createDitheredAlphaMask() { diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index 01b1424a0..83593aaa0 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -31,6 +31,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; import com.android.launcher3.userevent.nano.LauncherLogProto.ItemType; import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; +import com.android.launcher3.userevent.nano.LauncherLogProto.TipType; import com.android.launcher3.util.InstantAppResolver; import java.lang.reflect.Field; @@ -76,7 +77,7 @@ public class LoggerUtils { } return str; case Action.Type.COMMAND: return getFieldName(action.command, Action.Command.class); - default: return UNKNOWN; + default: return getFieldName(action.type, Action.Type.class); } } @@ -84,23 +85,32 @@ public class LoggerUtils { if (t == null){ return ""; } + String str = ""; switch (t.type) { case Target.Type.ITEM: - return getItemStr(t); + str = getItemStr(t); + break; case Target.Type.CONTROL: - return getFieldName(t.controlType, ControlType.class); + str = getFieldName(t.controlType, ControlType.class); + break; case Target.Type.CONTAINER: - String str = getFieldName(t.containerType, ContainerType.class); + str = getFieldName(t.containerType, ContainerType.class); if (t.containerType == ContainerType.WORKSPACE || t.containerType == ContainerType.HOTSEAT) { str += " id=" + t.pageIndex; } else if (t.containerType == ContainerType.FOLDER) { str += " grid(" + t.gridX + "," + t.gridY+ ")"; } - return str; + break; default: - return "UNKNOWN TARGET TYPE"; + str += "UNKNOWN TARGET TYPE"; } + + if (t.tipType != TipType.DEFAULT_NONE) { + str += " " + getFieldName(t.tipType, TipType.class); + } + + return str; } private static String getItemStr(Target t) { @@ -121,6 +131,9 @@ public class LoggerUtils { + "), pageIdx=" + t.pageIndex; } + if (t.itemType == ItemType.TASK) { + typeStr += ", pageIdx=" + t.pageIndex; + } return typeStr; } @@ -167,11 +180,10 @@ public class LoggerUtils { if (!(v instanceof ButtonDropTarget)) { return newTarget(Target.Type.CONTAINER); } - Target t = newTarget(Target.Type.CONTROL); if (v instanceof ButtonDropTarget) { - t.controlType = ((ButtonDropTarget) v).getControlTypeForLogging(); + return ((ButtonDropTarget) v).getDropTargetForLogging(); } - return t; + return newTarget(Target.Type.CONTROL); } public static Target newTarget(int targetType, TargetExtension extension) { @@ -186,6 +198,13 @@ public class LoggerUtils { t.type = targetType; return t; } + + public static Target newControlTarget(int controlType) { + Target t = newTarget(Target.Type.CONTROL); + t.controlType = controlType; + return t; + } + public static Target newContainerTarget(int containerType) { Target t = newTarget(Target.Type.CONTAINER); t.containerType = containerType; @@ -197,11 +216,13 @@ public class LoggerUtils { a.type = type; return a; } + public static Action newCommandAction(int command) { Action a = newAction(Action.Type.COMMAND); a.command = command; return a; } + public static Action newTouchAction(int touch) { Action a = newAction(Action.Type.TOUCH); a.touch = touch; diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index bf870cca0..1842e19a4 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -16,8 +16,10 @@ package com.android.launcher3.logging; +import static com.android.launcher3.logging.LoggerUtils.newAction; import static com.android.launcher3.logging.LoggerUtils.newCommandAction; import static com.android.launcher3.logging.LoggerUtils.newContainerTarget; +import static com.android.launcher3.logging.LoggerUtils.newControlTarget; import static com.android.launcher3.logging.LoggerUtils.newDropTarget; import static com.android.launcher3.logging.LoggerUtils.newItemTarget; import static com.android.launcher3.logging.LoggerUtils.newLauncherEvent; @@ -123,6 +125,7 @@ public class UserEventDispatcher { return null; } + private boolean mSessionStarted; private long mElapsedContainerMillis; private long mElapsedSessionMillis; private long mActionDurationMillis; @@ -130,6 +133,7 @@ public class UserEventDispatcher { private boolean mIsInLandscapeMode; private String mUuidStr; protected InstantAppResolver mInstantAppResolver; + private boolean mAppOrTaskLaunch; // APP_ICON SHORTCUT WIDGET // -------------------------------------------------------------- @@ -161,9 +165,13 @@ public class UserEventDispatcher { fillIntentInfo(event.srcTarget[0], intent); } dispatchUserEvent(event, intent); + mAppOrTaskLaunch = true; } - public void logTaskLaunchOrDismiss(int action, int direction, ComponentKey componentKey) { + public void logActionTip(int actionType, int viewType) { } + + public void logTaskLaunchOrDismiss(int action, int direction, int taskIndex, + ComponentKey componentKey) { LauncherEvent event = newLauncherEvent(newTouchAction(action), // TAP or SWIPE or FLING newTarget(Target.Type.ITEM)); if (action == Action.Touch.SWIPE || action == Action.Touch.FLING) { @@ -171,8 +179,10 @@ public class UserEventDispatcher { event.action.dir = direction; } event.srcTarget[0].itemType = LauncherLogProto.ItemType.TASK; + event.srcTarget[0].pageIndex = taskIndex; fillComponentInfo(event.srcTarget[0], componentKey.componentName); dispatchUserEvent(event, null); + mAppOrTaskLaunch = true; } protected void fillIntentInfo(Target target, Intent intent) { @@ -207,6 +217,13 @@ public class UserEventDispatcher { public void logActionCommand(int command, Target srcTarget, Target dstTarget) { LauncherEvent event = newLauncherEvent(newCommandAction(command), srcTarget); + if (command == Action.Command.STOP) { + if (mAppOrTaskLaunch || !mSessionStarted) { + mSessionStarted = false; + return; + } + } + if (dstTarget != null) { event.destTarget = new Target[1]; event.destTarget[0] = dstTarget; @@ -243,6 +260,15 @@ public class UserEventDispatcher { logActionOnControl(action, controlType, controlInContainer, -1); } + public void logActionOnControl(int action, int controlType, int parentContainer, + int grandParentContainer){ + LauncherEvent event = newLauncherEvent(newTouchAction(action), + newControlTarget(controlType), + newContainerTarget(parentContainer), + newContainerTarget(grandParentContainer)); + dispatchUserEvent(event, null); + } + public void logActionOnControl(int action, int controlType, @Nullable View controlInContainer, int parentContainerType) { final LauncherEvent event = (controlInContainer == null && parentContainerType < 0) @@ -269,6 +295,13 @@ public class UserEventDispatcher { dispatchUserEvent(event, null); } + public void logActionBounceTip(int containerType) { + LauncherEvent event = newLauncherEvent(newAction(Action.Type.TIP), + newContainerTarget(containerType)); + event.srcTarget[0].tipType = LauncherLogProto.TipType.BOUNCE; + dispatchUserEvent(event, null); + } + public void logActionOnContainer(int action, int dir, int containerType) { logActionOnContainer(action, dir, containerType, 0); } @@ -285,7 +318,7 @@ public class UserEventDispatcher { * Used primarily for swipe up and down when state changes when swipe up happens from the * navbar bezel, the {@param srcChildContainerType} is NAVBAR and * {@param srcParentContainerType} is either one of the two - * (1) WORKSPACE: if the launcher the foreground activity + * (1) WORKSPACE: if the launcher is the foreground activity * (2) APP: if another app was the foreground activity */ public void logStateChangeAction(int action, int dir, int srcChildTargetType, @@ -375,7 +408,8 @@ public class UserEventDispatcher { } - public final void resetElapsedSessionMillis() { + public final void startSession() { + mSessionStarted = true; mElapsedSessionMillis = SystemClock.uptimeMillis(); mElapsedContainerMillis = SystemClock.uptimeMillis(); } @@ -385,6 +419,7 @@ public class UserEventDispatcher { } public void dispatchUserEvent(LauncherEvent ev, Intent intent) { + mAppOrTaskLaunch = false; ev.isInLandscapeMode = mIsInLandscapeMode; ev.isInMultiWindowMode = mIsInMultiWindowMode; ev.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis; @@ -393,7 +428,8 @@ public class UserEventDispatcher { if (!IS_VERBOSE) { return; } - String log = "action:" + LoggerUtils.getActionStr(ev.action); + String log = "\n-----------------------------------------------------" + + "\naction:" + LoggerUtils.getActionStr(ev.action); if (ev.srcTarget != null && ev.srcTarget.length > 0) { log += "\n Source " + getTargetsStr(ev.srcTarget); } diff --git a/src/com/android/launcher3/notification/NotificationListener.java b/src/com/android/launcher3/notification/NotificationListener.java index 1fd70780b..b527b6a8d 100644 --- a/src/com/android/launcher3/notification/NotificationListener.java +++ b/src/com/android/launcher3/notification/NotificationListener.java @@ -150,22 +150,12 @@ public class NotificationListener extends NotificationListenerService { public void onCreate() { super.onCreate(); sIsCreated = true; - mNotificationBadgingObserver = new SettingsObserver.Secure(getContentResolver()) { - @Override - public void onSettingChanged(boolean isNotificationBadgingEnabled) { - if (!isNotificationBadgingEnabled) { - requestUnbind(); - } - } - }; - mNotificationBadgingObserver.register(NOTIFICATION_BADGING); } @Override public void onDestroy() { super.onDestroy(); sIsCreated = false; - mNotificationBadgingObserver.unregister(); } public static @Nullable NotificationListener getInstanceIfConnected() { @@ -203,6 +193,17 @@ public class NotificationListener extends NotificationListenerService { public void onListenerConnected() { super.onListenerConnected(); sIsConnected = true; + + mNotificationBadgingObserver = new SettingsObserver.Secure(getContentResolver()) { + @Override + public void onSettingChanged(boolean isNotificationBadgingEnabled) { + if (!isNotificationBadgingEnabled) { + requestUnbind(); + } + } + }; + mNotificationBadgingObserver.register(NOTIFICATION_BADGING); + onNotificationFullRefresh(); } @@ -214,11 +215,16 @@ public class NotificationListener extends NotificationListenerService { public void onListenerDisconnected() { super.onListenerDisconnected(); sIsConnected = false; + mNotificationBadgingObserver.unregister(); } @Override public void onNotificationPosted(final StatusBarNotification sbn) { super.onNotificationPosted(sbn); + if (sbn == null) { + // There is a bug in platform where we can get a null notification; just ignore it. + return; + } mWorkerHandler.obtainMessage(MSG_NOTIFICATION_POSTED, new NotificationPostedMsg(sbn)) .sendToTarget(); if (sStatusBarNotificationsChangedListener != null) { @@ -244,6 +250,10 @@ public class NotificationListener extends NotificationListenerService { @Override public void onNotificationRemoved(final StatusBarNotification sbn) { super.onNotificationRemoved(sbn); + if (sbn == null) { + // There is a bug in platform where we can get a null notification; just ignore it. + return; + } Pair<PackageUserKey, NotificationKeyData> packageUserKeyAndNotificationKey = new Pair<>(PackageUserKey.fromNotification(sbn), NotificationKeyData.fromNotification(sbn)); diff --git a/src/com/android/launcher3/pageindicators/PageIndicator.java b/src/com/android/launcher3/pageindicators/PageIndicator.java index 3ce72917e..8fafb6fdd 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicator.java +++ b/src/com/android/launcher3/pageindicators/PageIndicator.java @@ -25,6 +25,4 @@ public interface PageIndicator { void setActiveMarker(int activePage); void setMarkersCount(int numMarkers); - - void setPageDescription(CharSequence description); } diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java index 524ec3cb9..709975f02 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java @@ -228,11 +228,6 @@ public class PageIndicatorDots extends View implements PageIndicator { } @Override - public void setPageDescription(CharSequence description) { - setContentDescription(description); - } - - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Add extra spacing of mDotRadius on all sides so than entry animation could be run. int width = MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY ? diff --git a/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java b/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java index 4ad7feb90..654e59335 100644 --- a/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java +++ b/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java @@ -24,7 +24,7 @@ import com.android.launcher3.Insettable; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; -import com.android.launcher3.dynamicui.WallpaperColorInfo; +import com.android.launcher3.uioverrides.WallpaperColorInfo; /** * A PageIndicator that briefly shows a fraction of a line when moving between pages @@ -41,8 +41,9 @@ public class WorkspacePageIndicator extends View implements Insettable, PageIndi private static final int LINE_ALPHA_ANIMATOR_INDEX = 0; private static final int NUM_PAGES_ANIMATOR_INDEX = 1; private static final int TOTAL_SCROLL_ANIMATOR_INDEX = 2; + private static final int ANIMATOR_COUNT = 3; - private ValueAnimator[] mAnimators = new ValueAnimator[3]; + private ValueAnimator[] mAnimators = new ValueAnimator[ANIMATOR_COUNT]; private final Handler mDelayedLineFadeHandler = new Handler(Looper.getMainLooper()); private final Launcher mLauncher; @@ -186,11 +187,6 @@ public class WorkspacePageIndicator extends View implements Insettable, PageIndi } } - @Override - public void setPageDescription(CharSequence description) { - setContentDescription(description); - } - public void setShouldAutoHide(boolean shouldAutoHide) { mShouldAutoHide = shouldAutoHide; if (shouldAutoHide && mLinePaint.getAlpha() > 0) { @@ -237,6 +233,28 @@ public class WorkspacePageIndicator extends View implements Insettable, PageIndi mAnimators[animatorIndex].start(); } + /** + * Pauses all currently running animations. + */ + public void pauseAnimations() { + for (int i = 0; i < ANIMATOR_COUNT; i++) { + if (mAnimators[i] != null) { + mAnimators[i].pause(); + } + } + } + + /** + * Force-ends all currently running or paused animations. + */ + public void skipAnimationsToEnd() { + for (int i = 0; i < ANIMATOR_COUNT; i++) { + if (mAnimators[i] != null) { + mAnimators[i].end(); + } + } + } + @Override public void setInsets(Rect insets) { DeviceProfile grid = mLauncher.getDeviceProfile(); diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java index bd08aaa0e..90987775b 100644 --- a/src/com/android/launcher3/popup/ArrowPopup.java +++ b/src/com/android/launcher3/popup/ArrowPopup.java @@ -35,7 +35,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; -import android.view.accessibility.AccessibilityEvent; import android.view.animation.AccelerateDecelerateInterpolator; import com.android.launcher3.AbstractFloatingView; @@ -52,8 +51,6 @@ import com.android.launcher3.util.Themes; import java.util.ArrayList; import java.util.Collections; -import static com.android.launcher3.compat.AccessibilityManagerCompat.sendCustomAccessibilityEvent; - /** * A container for shortcuts to deep links and notifications associated with an app. */ @@ -370,11 +367,8 @@ public abstract class ArrowPopup extends AbstractFloatingView { openAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { + announceAccessibilityChanges(); mOpenCloseAnimator = null; - sendCustomAccessibilityEvent( - ArrowPopup.this, - AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, - getContext().getString(R.string.action_deep_shortcut)); } }); diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index b522b5513..f276fbfea 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -34,6 +34,7 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.AttributeSet; +import android.util.Pair; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; @@ -213,6 +214,7 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, } } + @TargetApi(Build.VERSION_CODES.P) private void populateAndShow(final BubbleTextView originalIcon, final List<String> shortcutIds, final List<NotificationKeyData> notificationKeys, List<SystemShortcut> systemShortcuts) { mNumNotifications = notificationKeys.size(); @@ -261,14 +263,8 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, reorderAndShow(viewsToFlip); ItemInfo originalItemInfo = (ItemInfo) originalIcon.getTag(); - int numShortcuts = mShortcuts.size() + systemShortcuts.size(); - if (mNumNotifications == 0) { - setContentDescription(getContext().getString(R.string.shortcuts_menu_description, - numShortcuts, originalIcon.getContentDescription().toString())); - } else { - setContentDescription(getContext().getString( - R.string.shortcuts_menu_with_notifications_description, numShortcuts, - mNumNotifications, originalIcon.getContentDescription().toString())); + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + setAccessibilityPaneTitle(getTitleForAccessibility()); } mLauncher.getDragController().addDragListener(this); @@ -284,6 +280,17 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, this, shortcutIds, mShortcuts, notificationKeys)); } + private String getTitleForAccessibility() { + return getContext().getString(mNumNotifications == 0 ? + R.string.action_deep_shortcut : + R.string.shortcuts_menu_with_notifications_description); + } + + @Override + protected Pair<View, String> getAccessibilityTarget() { + return Pair.create(this, ""); + } + @Override protected void getTargetObjectLocation(Rect outPos) { mLauncher.getDragLayer().getDescendantRectRelativeToSelf(mOriginalIcon, outPos); diff --git a/src/com/android/launcher3/qsb/QsbWidgetHostView.java b/src/com/android/launcher3/qsb/QsbWidgetHostView.java index a8a41f664..7d8a4db0e 100644 --- a/src/com/android/launcher3/qsb/QsbWidgetHostView.java +++ b/src/com/android/launcher3/qsb/QsbWidgetHostView.java @@ -73,6 +73,18 @@ public class QsbWidgetHostView extends AppWidgetHostView { return getDefaultView(this); } + @Override + protected View getDefaultView() { + View v = super.getDefaultView(); + v.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + Launcher.getLauncher(getContext()).startSearch("", false, null, true); + } + }); + return v; + } + public static View getDefaultView(ViewGroup parent) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.qsb_default_view, parent, false); diff --git a/src/com/android/launcher3/states/InternalStateHandler.java b/src/com/android/launcher3/states/InternalStateHandler.java index 0a2c3e4fa..cf7c6ba39 100644 --- a/src/com/android/launcher3/states/InternalStateHandler.java +++ b/src/com/android/launcher3/states/InternalStateHandler.java @@ -60,6 +60,10 @@ public abstract class InternalStateHandler extends Binder { return sScheduler.clearReference(this); } + public static boolean hasPending() { + return sScheduler.hasPending(); + } + public static boolean handleCreate(Launcher launcher, Intent intent) { return handleIntent(launcher, intent, false, false); } @@ -132,5 +136,9 @@ public abstract class InternalStateHandler extends Binder { } return false; } + + public boolean hasPending() { + return mPendingHandler.get() != null; + } } }
\ No newline at end of file diff --git a/src/com/android/launcher3/states/RotationHelper.java b/src/com/android/launcher3/states/RotationHelper.java index 8f8364819..e8664458d 100644 --- a/src/com/android/launcher3/states/RotationHelper.java +++ b/src/com/android/launcher3/states/RotationHelper.java @@ -18,28 +18,43 @@ package com.android.launcher3.states; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LOCKED; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; -import static android.provider.Settings.System.ACCELEROMETER_ROTATION; -import static android.provider.Settings.System.getUriFor; +import static android.util.DisplayMetrics.DENSITY_DEVICE_STABLE; + +import static com.android.launcher3.Utilities.ATLEAST_NOUGAT; import android.app.Activity; -import android.content.ContentResolver; -import android.database.ContentObserver; -import android.os.Handler; -import android.provider.Settings; +import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.content.res.Resources; import com.android.launcher3.R; +import com.android.launcher3.Utilities; /** * Utility class to manage launcher rotation */ -public class RotationHelper extends ContentObserver { +public class RotationHelper implements OnSharedPreferenceChangeListener { + + public static final String ALLOW_ROTATION_PREFERENCE_KEY = "pref_allowRotation"; + + public static boolean getAllowRotationDefaultValue() { + if (ATLEAST_NOUGAT) { + // If the device was scaled, used the original dimensions to determine if rotation + // is allowed of not. + Resources res = Resources.getSystem(); + int originalSmallestWidth = res.getConfiguration().smallestScreenWidthDp + * res.getDisplayMetrics().densityDpi / DENSITY_DEVICE_STABLE; + return originalSmallestWidth >= 600; + } + return false; + } public static final int REQUEST_NONE = 0; public static final int REQUEST_ROTATE = 1; public static final int REQUEST_LOCK = 2; private final Activity mActivity; - private final ContentResolver mCr; + private final SharedPreferences mPrefs; private final boolean mIgnoreAutoRotateSettings; private boolean mAutoRotateEnabled; @@ -60,23 +75,24 @@ public class RotationHelper extends ContentObserver { private int mLastActivityFlags = -1; public RotationHelper(Activity activity) { - super(new Handler()); mActivity = activity; // On large devices we do not handle auto-rotate differently. mIgnoreAutoRotateSettings = mActivity.getResources().getBoolean(R.bool.allow_rotation); if (!mIgnoreAutoRotateSettings) { - mCr = mActivity.getContentResolver(); - mCr.registerContentObserver(getUriFor(ACCELEROMETER_ROTATION), false, this); - mAutoRotateEnabled = Settings.System.getInt(mCr, ACCELEROMETER_ROTATION, 1) == 1; + mPrefs = Utilities.getPrefs(mActivity); + mPrefs.registerOnSharedPreferenceChangeListener(this); + mAutoRotateEnabled = mPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY, + getAllowRotationDefaultValue()); } else { - mCr = null; + mPrefs = null; } } @Override - public void onChange(boolean selfChange) { - mAutoRotateEnabled = Settings.System.getInt(mCr, ACCELEROMETER_ROTATION, 1) == 1; + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { + mAutoRotateEnabled = mPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY, + getAllowRotationDefaultValue()); notifyChange(); } @@ -104,8 +120,8 @@ public class RotationHelper extends ContentObserver { public void destroy() { if (!mDestroyed) { mDestroyed = true; - if (mCr != null) { - mCr.unregisterContentObserver(this); + if (mPrefs != null) { + mPrefs.unregisterOnSharedPreferenceChangeListener(this); } } } @@ -121,19 +137,25 @@ public class RotationHelper extends ContentObserver { SCREEN_ORIENTATION_LOCKED : SCREEN_ORIENTATION_UNSPECIFIED; } else if (mCurrentStateRequest == REQUEST_LOCK) { activityFlags = SCREEN_ORIENTATION_LOCKED; - } else if (mIgnoreAutoRotateSettings || mCurrentStateRequest == REQUEST_ROTATE) { + } else if (mIgnoreAutoRotateSettings || mCurrentStateRequest == REQUEST_ROTATE + || mAutoRotateEnabled) { activityFlags = SCREEN_ORIENTATION_UNSPECIFIED; - } else if (mAutoRotateEnabled) { - // If auto rotation is on, lock to device orientation - activityFlags = SCREEN_ORIENTATION_NOSENSOR; } else { // If auto rotation is off, allow rotation on the activity, in case the user is using // forced rotation. - activityFlags = SCREEN_ORIENTATION_UNSPECIFIED; + activityFlags = SCREEN_ORIENTATION_NOSENSOR; } if (activityFlags != mLastActivityFlags) { mLastActivityFlags = activityFlags; - mActivity.setRequestedOrientation(mLastActivityFlags); + mActivity.setRequestedOrientation(activityFlags); } } + + @Override + public String toString() { + return String.format("[mStateHandlerRequest=%d, mCurrentStateRequest=%d," + + " mLastActivityFlags=%d, mIgnoreAutoRotateSettings=%b, mAutoRotateEnabled=%b]", + mStateHandlerRequest, mCurrentStateRequest, mLastActivityFlags, + mIgnoreAutoRotateSettings, mAutoRotateEnabled); + } } diff --git a/src/com/android/launcher3/states/SpringLoadedState.java b/src/com/android/launcher3/states/SpringLoadedState.java index 90d3821a3..aa7d0d5a3 100644 --- a/src/com/android/launcher3/states/SpringLoadedState.java +++ b/src/com/android/launcher3/states/SpringLoadedState.java @@ -33,7 +33,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; */ public class SpringLoadedState extends LauncherState { - private static final int STATE_FLAGS = FLAG_SHOW_SCRIM | FLAG_MULTI_PAGE | + private static final int STATE_FLAGS = FLAG_MULTI_PAGE | FLAG_DISABLE_ACCESSIBILITY | FLAG_DISABLE_RESTORE | FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED | FLAG_DISABLE_PAGE_CLIPPING | FLAG_PAGE_BACKGROUNDS | FLAG_HIDE_BACK_BUTTON; @@ -86,6 +86,11 @@ public class SpringLoadedState extends LauncherState { } @Override + public float getWorkspaceScrimAlpha(Launcher launcher) { + return 0.3f; + } + + @Override public void onStateDisabled(final Launcher launcher) { launcher.getWorkspace().getPageIndicator().setShouldAutoHide(true); diff --git a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java index f1195edf3..0e6853869 100644 --- a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java +++ b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java @@ -15,36 +15,58 @@ */ package com.android.launcher3.touch; +import static com.android.launcher3.LauncherAnimUtils.MIN_PROGRESS_TO_ALL_APPS; +import static com.android.launcher3.LauncherState.ALL_APPS; +import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.LauncherState.OVERVIEW; +import static com.android.launcher3.LauncherStateManager.ANIM_ALL; +import static com.android.launcher3.LauncherStateManager.ATOMIC_COMPONENT; +import static com.android.launcher3.LauncherStateManager.NON_ATOMIC_COMPONENT; +import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; import android.animation.ValueAnimator; -import android.util.Log; +import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.LauncherState; +import com.android.launcher3.LauncherStateManager.AnimationComponents; +import com.android.launcher3.LauncherStateManager.AnimationConfig; +import com.android.launcher3.LauncherStateManager.StateHandler; import com.android.launcher3.Utilities; +import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; +import com.android.launcher3.anim.AnimatorSetBuilder; +import com.android.launcher3.uioverrides.UiFactory; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; -import com.android.launcher3.util.TouchController; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.launcher3.util.FlingBlockCheck; import com.android.launcher3.util.PendingAnimation; +import com.android.launcher3.util.TouchController; /** * TouchController for handling state changes */ -public abstract class AbstractStateChangeTouchController extends AnimatorListenerAdapter +public abstract class AbstractStateChangeTouchController implements TouchController, SwipeDetector.Listener { private static final String TAG = "ASCTouchController"; - public static final float RECATCH_REJECTION_FRACTION = .0875f; - public static final int SINGLE_FRAME_MS = 16; // Progress after which the transition is assumed to be a success in case user does not fling public static final float SUCCESS_TRANSITION_PROGRESS = 0.5f; + /** + * Play an atomic recents animation when the progress from NORMAL to OVERVIEW reaches this. + */ + public static final float ATOMIC_OVERVIEW_ANIM_THRESHOLD = 0.5f; + protected static final long ATOMIC_DURATION = 200; + protected final Launcher mLauncher; protected final SwipeDetector mDetector; @@ -60,6 +82,18 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene // Ratio of transition process [0, 1] to drag displacement (px) private float mProgressMultiplier; private float mDisplacementShift; + private boolean mCanBlockFling; + private FlingBlockCheck mFlingBlockCheck = new FlingBlockCheck(); + + private AnimatorSet mAtomicAnim; + private boolean mPassedOverviewAtomicThreshold; + // mAtomicAnim plays the atomic components of the state animations when we pass the threshold. + // However, if we reinit to transition to a new state (e.g. OVERVIEW -> ALL_APPS) before the + // atomic animation finishes, we only control the non-atomic components so that we don't + // interfere with the atomic animation. When the atomic animation ends, we start controlling + // the atomic components as well, using this controller. + private AnimatorPlaybackController mAtomicComponentsController; + private float mAtomicComponentsStartProgress; public AbstractStateChangeTouchController(Launcher l, SwipeDetector.Direction dir) { mLauncher = l; @@ -68,12 +102,6 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene protected abstract boolean canInterceptTouch(MotionEvent ev); - /** - * Initializes the {@code mFromState} and {@code mToState} and swipe direction to use for - * the detector. In case of disabling swipe, return 0. - */ - protected abstract int getSwipeDirection(MotionEvent ev); - @Override public final boolean onControllerInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { @@ -88,16 +116,10 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene boolean ignoreSlopWhenSettling = false; if (mCurrentAnimation != null) { - if (mCurrentAnimation.getProgressFraction() > 1 - RECATCH_REJECTION_FRACTION) { - directionsToDetectScroll = SwipeDetector.DIRECTION_POSITIVE; - } else if (mCurrentAnimation.getProgressFraction() < RECATCH_REJECTION_FRACTION ) { - directionsToDetectScroll = SwipeDetector.DIRECTION_NEGATIVE; - } else { - directionsToDetectScroll = SwipeDetector.DIRECTION_BOTH; - ignoreSlopWhenSettling = true; - } + directionsToDetectScroll = SwipeDetector.DIRECTION_BOTH; + ignoreSlopWhenSettling = true; } else { - directionsToDetectScroll = getSwipeDirection(ev); + directionsToDetectScroll = getSwipeDirection(); if (directionsToDetectScroll == 0) { mNoIntercept = true; return false; @@ -115,6 +137,18 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene return mDetector.isDraggingOrSettling(); } + private int getSwipeDirection() { + LauncherState fromState = mLauncher.getStateManager().getState(); + int swipeDirection = 0; + if (getTargetState(fromState, true /* isDragTowardPositive */) != fromState) { + swipeDirection |= SwipeDetector.DIRECTION_POSITIVE; + } + if (getTargetState(fromState, false /* isDragTowardPositive */) != fromState) { + swipeDirection |= SwipeDetector.DIRECTION_NEGATIVE; + } + return swipeDirection; + } + @Override public final boolean onControllerTouchEvent(MotionEvent ev) { return mDetector.onTouchEvent(ev); @@ -131,7 +165,12 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene protected abstract LauncherState getTargetState(LauncherState fromState, boolean isDragTowardPositive); - protected abstract float initCurrentAnimation(); + protected abstract float initCurrentAnimation(@AnimationComponents int animComponents); + + /** + * Returns the container that the touch started from when leaving NORMAL state. + */ + protected abstract int getLogContainerTypeForNormalState(); private boolean reinitCurrentAnimation(boolean reachedToState, boolean isDragTowardPositive) { LauncherState newFromState = mFromState == null ? mLauncher.getStateManager().getState() @@ -142,26 +181,74 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene return false; } + if (reachedToState) { + logReachedState(Touch.SWIPE); + } + if (newFromState == ALL_APPS) { + mStartContainerType = ContainerType.ALLAPPS; + } else if (newFromState == NORMAL) { + mStartContainerType = getLogContainerTypeForNormalState(); + } else if (newFromState == OVERVIEW){ + mStartContainerType = ContainerType.TASKSWITCHER; + } + mFromState = newFromState; mToState = newToState; mStartProgress = 0; - mProgressMultiplier = initCurrentAnimation(); - mCurrentAnimation.getTarget().addListener(this); + mPassedOverviewAtomicThreshold = false; + if (mCurrentAnimation != null) { + mCurrentAnimation.setOnCancelRunnable(null); + } + int animComponents = goingBetweenNormalAndOverview(mFromState, mToState) + ? NON_ATOMIC_COMPONENT : ANIM_ALL; + if (mAtomicAnim != null) { + // Control the non-atomic components until the atomic animation finishes, then control + // the atomic components as well. + animComponents = NON_ATOMIC_COMPONENT; + mAtomicAnim.addListener(new AnimationSuccessListener() { + @Override + public void onAnimationSuccess(Animator animation) { + cancelAtomicComponentsController(); + if (mCurrentAnimation != null) { + mAtomicComponentsStartProgress = mCurrentAnimation.getProgressFraction(); + long duration = (long) (getShiftRange() * 2); + mAtomicComponentsController = AnimatorPlaybackController.wrap( + createAtomicAnimForState(mFromState, mToState, duration), duration); + mAtomicComponentsController.dispatchOnStart(); + } + } + }); + } + if (goingBetweenNormalAndOverview(mFromState, mToState)) { + cancelAtomicComponentsController(); + } + mProgressMultiplier = initCurrentAnimation(animComponents); + mCurrentAnimation.getAnimationPlayer().addUpdateListener(animation -> + setBackButtonAlphaWithProgress((float) animation.getAnimatedValue())); mCurrentAnimation.dispatchOnStart(); return true; } + private boolean goingBetweenNormalAndOverview(LauncherState fromState, LauncherState toState) { + return (fromState == NORMAL || fromState == OVERVIEW) + && (toState == NORMAL || toState == OVERVIEW) + && mPendingAnimation == null; + } + @Override public void onDragStart(boolean start) { if (mCurrentAnimation == null) { mFromState = mToState = null; + mAtomicComponentsController = null; reinitCurrentAnimation(false, mDetector.wasInitialTouchPositive()); mDisplacementShift = 0; } else { mCurrentAnimation.pause(); mStartProgress = mCurrentAnimation.getProgressFraction(); } + mCanBlockFling = mFromState == NORMAL; + mFlingBlockCheck.unblockFling(); } @Override @@ -173,17 +260,75 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene if (progress <= 0) { if (reinitCurrentAnimation(false, isDragTowardPositive)) { mDisplacementShift = displacement; + if (mCanBlockFling) { + mFlingBlockCheck.blockFling(); + } } } else if (progress >= 1) { if (reinitCurrentAnimation(true, isDragTowardPositive)) { mDisplacementShift = displacement; + if (mCanBlockFling) { + mFlingBlockCheck.blockFling(); + } } + } else { + mFlingBlockCheck.onEvent(); } + return true; } protected void updateProgress(float fraction) { mCurrentAnimation.setPlayFraction(fraction); + if (mAtomicComponentsController != null) { + mAtomicComponentsController.setPlayFraction(fraction - mAtomicComponentsStartProgress); + } + maybeUpdateAtomicAnim(mFromState, mToState, fraction); + setBackButtonAlphaWithProgress(fraction); + } + + /** + * When going between normal and overview states, see if we passed the overview threshold and + * play the appropriate atomic animation if so. + */ + private void maybeUpdateAtomicAnim(LauncherState fromState, LauncherState toState, + float progress) { + if (!goingBetweenNormalAndOverview(fromState, toState)) { + return; + } + float threshold = toState == OVERVIEW ? ATOMIC_OVERVIEW_ANIM_THRESHOLD + : 1f - ATOMIC_OVERVIEW_ANIM_THRESHOLD; + boolean passedThreshold = progress >= threshold; + if (passedThreshold != mPassedOverviewAtomicThreshold) { + LauncherState atomicFromState = passedThreshold ? fromState: toState; + LauncherState atomicToState = passedThreshold ? toState : fromState; + mPassedOverviewAtomicThreshold = passedThreshold; + if (mAtomicAnim != null) { + mAtomicAnim.cancel(); + } + mAtomicAnim = createAtomicAnimForState(atomicFromState, atomicToState, ATOMIC_DURATION); + mAtomicAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mAtomicAnim = null; + } + }); + mAtomicAnim.start(); + mLauncher.getDragLayer().performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK); + } + } + + private AnimatorSet createAtomicAnimForState(LauncherState fromState, LauncherState targetState, + long duration) { + AnimatorSetBuilder builder = new AnimatorSetBuilder(); + mLauncher.getStateManager().prepareForAtomicAnimation(fromState, targetState, builder); + AnimationConfig config = new AnimationConfig(); + config.animComponents = ATOMIC_COMPONENT; + config.duration = duration; + for (StateHandler handler : mLauncher.getStateManager().getStateHandlers()) { + handler.setStateWithAnimation(targetState, builder, config); + } + return builder.build(); } @Override @@ -192,6 +337,11 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene final LauncherState targetState; final float progress = mCurrentAnimation.getProgressFraction(); + boolean blockedFling = fling && mFlingBlockCheck.isBlocked(); + if (blockedFling) { + fling = false; + } + if (fling) { logAction = Touch.FLING; targetState = @@ -200,13 +350,17 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene // snap to top or bottom using the release velocity } else { logAction = Touch.SWIPE; - targetState = (progress > SUCCESS_TRANSITION_PROGRESS) ? mToState : mFromState; + float successProgress = mToState == ALL_APPS + ? MIN_PROGRESS_TO_ALL_APPS : SUCCESS_TRANSITION_PROGRESS; + targetState = (progress > successProgress) ? mToState : mFromState; } - final float endProgress; final float startProgress; final long duration; + // Increase the duration if we prevented the fling, as we are going against a high velocity. + final int durationMultiplier = blockedFling && targetState == mFromState + ? LauncherAnimUtils.blockedFlingDurationFactor(velocity) : 1; if (targetState == mToState) { endProgress = 1; @@ -217,9 +371,16 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene startProgress = Utilities.boundToRange( progress + velocity * SINGLE_FRAME_MS * mProgressMultiplier, 0f, 1f); duration = SwipeDetector.calculateDuration(velocity, - endProgress - Math.max(progress, 0)); + endProgress - Math.max(progress, 0)) * durationMultiplier; } } else { + // Let the state manager know that the animation didn't go to the target state, + // but don't cancel ourselves (we already clean up when the animation completes). + Runnable onCancel = mCurrentAnimation.getOnCancelRunnable(); + mCurrentAnimation.setOnCancelRunnable(null); + mCurrentAnimation.dispatchOnCancel(); + mCurrentAnimation.setOnCancelRunnable(onCancel); + endProgress = 0; if (progress <= 0) { duration = 0; @@ -228,15 +389,65 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene startProgress = Utilities.boundToRange( progress + velocity * SINGLE_FRAME_MS * mProgressMultiplier, 0f, 1f); duration = SwipeDetector.calculateDuration(velocity, - Math.min(progress, 1) - endProgress); + Math.min(progress, 1) - endProgress) * durationMultiplier; } } mCurrentAnimation.setEndAction(() -> onSwipeInteractionCompleted(targetState, logAction)); ValueAnimator anim = mCurrentAnimation.getAnimationPlayer(); anim.setFloatValues(startProgress, endProgress); - updateSwipeCompleteAnimation(anim, duration, targetState, velocity, fling); + maybeUpdateAtomicAnim(mFromState, targetState, targetState == mToState ? 1f : 0f); + updateSwipeCompleteAnimation(anim, Math.max(duration, getRemainingAtomicDuration()), + targetState, velocity, fling); + mCurrentAnimation.dispatchOnStart(); anim.start(); + if (mAtomicAnim == null) { + startAtomicComponentsAnim(endProgress, anim.getDuration()); + } else { + mAtomicAnim.addListener(new AnimationSuccessListener() { + @Override + public void onAnimationSuccess(Animator animator) { + startAtomicComponentsAnim(endProgress, anim.getDuration()); + } + }); + } + } + + /** + * Animates the atomic components from the current progress to the final progress. + * + * Note that this only applies when we are controlling the atomic components separately from + * the non-atomic components, which only happens if we reinit before the atomic animation + * finishes. + */ + private void startAtomicComponentsAnim(float toProgress, long duration) { + if (mAtomicComponentsController != null) { + ValueAnimator atomicAnim = mAtomicComponentsController.getAnimationPlayer(); + atomicAnim.setFloatValues(mAtomicComponentsController.getProgressFraction(), toProgress); + atomicAnim.setDuration(duration); + atomicAnim.start(); + atomicAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mAtomicComponentsController = null; + } + }); + } + } + + private long getRemainingAtomicDuration() { + if (mAtomicAnim == null) { + return 0; + } + if (Utilities.ATLEAST_OREO) { + return mAtomicAnim.getTotalDuration() - mAtomicAnim.getCurrentPlayTime(); + } else { + long remainingDuration = 0; + for (Animator anim : mAtomicAnim.getChildAnimations()) { + remainingDuration = Math.max(remainingDuration, anim.getDuration()); + } + return remainingDuration; + } } protected void updateSwipeCompleteAnimation(ValueAnimator animator, long expectedDuration, @@ -260,28 +471,41 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene } if (shouldGoToTargetState) { if (targetState != mFromState) { - // Transition complete. log the action - mLauncher.getUserEventDispatcher().logStateChangeAction(logAction, - getDirectionForLog(), - mStartContainerType, - mFromState.containerType, - mToState.containerType, - mLauncher.getWorkspace().getCurrentPage()); + logReachedState(logAction); } mLauncher.getStateManager().goToState(targetState, false /* animated */); } } + private void setBackButtonAlphaWithProgress(float progress) { + if (mFromState.hideBackButton ^ mToState.hideBackButton) { + progress = Utilities.boundToRange(progress, 0, 1); + final float alpha = mToState.hideBackButton ? 1 - progress : progress; + UiFactory.setBackButtonAlpha(mLauncher, alpha, false /* animate */); + } + } + + private void logReachedState(int logAction) { + // Transition complete. log the action + mLauncher.getUserEventDispatcher().logStateChangeAction(logAction, + getDirectionForLog(), + mStartContainerType, + mFromState.containerType, + mToState.containerType, + mLauncher.getWorkspace().getCurrentPage()); + } + protected void clearState() { mCurrentAnimation = null; + cancelAtomicComponentsController(); mDetector.finishedScrolling(); + mDetector.setDetectableScrollConditions(0, false); } - @Override - public void onAnimationCancel(Animator animation) { - if (mCurrentAnimation != null && animation == mCurrentAnimation.getOriginalTarget()) { - Log.e(TAG, "Who dare cancel the animation when I am in control", new Exception()); - clearState(); + private void cancelAtomicComponentsController() { + if (mAtomicComponentsController != null) { + mAtomicComponentsController.getAnimationPlayer().cancel(); + mAtomicComponentsController = null; } } } diff --git a/src/com/android/launcher3/touch/SwipeDetector.java b/src/com/android/launcher3/touch/SwipeDetector.java index 4b36ad99d..703e4fdab 100644 --- a/src/com/android/launcher3/touch/SwipeDetector.java +++ b/src/com/android/launcher3/touch/SwipeDetector.java @@ -194,6 +194,10 @@ public class SwipeDetector { mIgnoreSlopWhenSettling = ignoreSlop; } + public int getScrollDirections() { + return mScrollConditions; + } + private boolean shouldScrollStart(MotionEvent ev, int pointerIndex) { // reject cases where the angle or slop condition is not met. if (Math.max(mDir.getActiveTouchSlop(ev, pointerIndex, mDownPos), mTouchSlop) diff --git a/src/com/android/launcher3/touch/WorkspaceTouchListener.java b/src/com/android/launcher3/touch/WorkspaceTouchListener.java index 23f55aa17..f59f14e58 100644 --- a/src/com/android/launcher3/touch/WorkspaceTouchListener.java +++ b/src/com/android/launcher3/touch/WorkspaceTouchListener.java @@ -17,6 +17,7 @@ package com.android.launcher3.touch; import static android.view.MotionEvent.ACTION_CANCEL; import static android.view.MotionEvent.ACTION_DOWN; +import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; import static android.view.ViewConfiguration.getLongPressTimeout; @@ -30,6 +31,7 @@ import android.view.View; import android.view.View.OnTouchListener; import com.android.launcher3.AbstractFloatingView; +import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.Workspace; @@ -71,8 +73,7 @@ public class WorkspaceTouchListener implements OnTouchListener, Runnable { int action = ev.getActionMasked(); if (action == ACTION_DOWN) { // Check if we can handle long press. - boolean handleLongPress = AbstractFloatingView.getTopOpenView(mLauncher) == null - && mLauncher.isInState(NORMAL); + boolean handleLongPress = canHandleLongPress(); if (handleLongPress) { // Check if the event is not near the edges @@ -122,12 +123,28 @@ public class WorkspaceTouchListener implements OnTouchListener, Runnable { // We don't want to handle touch, let workspace handle it as usual. result = false; } + + if (action == ACTION_UP || action == ACTION_POINTER_UP) { + if (!mWorkspace.isTouchActive()) { + final CellLayout currentPage = + (CellLayout) mWorkspace.getChildAt(mWorkspace.getCurrentPage()); + if (currentPage != null) { + mWorkspace.onWallpaperTap(ev); + } + } + } + if (action == ACTION_UP || action == ACTION_CANCEL) { cancelLongPress(); } return result; } + private boolean canHandleLongPress() { + return AbstractFloatingView.getTopOpenView(mLauncher) == null + && mLauncher.isInState(NORMAL); + } + private void cancelLongPress() { mWorkspace.removeCallbacks(this); mLongPressState = STATE_CANCELLED; @@ -136,15 +153,19 @@ public class WorkspaceTouchListener implements OnTouchListener, Runnable { @Override public void run() { if (mLongPressState == STATE_REQUESTED) { - mLongPressState = STATE_PENDING_PARENT_INFORM; - mWorkspace.getParent().requestDisallowInterceptTouchEvent(true); - - mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - mLauncher.getUserEventDispatcher().logActionOnContainer(Action.Touch.LONGPRESS, - Action.Direction.NONE, ContainerType.WORKSPACE, - mWorkspace.getCurrentPage()); - OptionsPopupView.showDefaultOptions(mLauncher, mTouchDownPoint.x, mTouchDownPoint.y); + if (canHandleLongPress()) { + mLongPressState = STATE_PENDING_PARENT_INFORM; + mWorkspace.getParent().requestDisallowInterceptTouchEvent(true); + + mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, + HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + mLauncher.getUserEventDispatcher().logActionOnContainer(Action.Touch.LONGPRESS, + Action.Direction.NONE, ContainerType.WORKSPACE, + mWorkspace.getCurrentPage()); + OptionsPopupView.showDefaultOptions(mLauncher, mTouchDownPoint.x, mTouchDownPoint.y); + } else { + cancelLongPress(); + } } } } diff --git a/src/com/android/launcher3/util/FlingBlockCheck.java b/src/com/android/launcher3/util/FlingBlockCheck.java new file mode 100644 index 000000000..f9575b97a --- /dev/null +++ b/src/com/android/launcher3/util/FlingBlockCheck.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2018 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.util; + +import android.os.SystemClock; + +/** + * Determines whether a fling should be blocked. Currently we block flings when crossing thresholds + * to new states, and unblock after a short duration. + */ +public class FlingBlockCheck { + // Allow flinging to a new state after waiting this many milliseconds. + private static final long UNBLOCK_FLING_PAUSE_DURATION = 200; + + private boolean mBlockFling; + private long mBlockFlingTime; + + public void blockFling() { + mBlockFling = true; + mBlockFlingTime = SystemClock.uptimeMillis(); + } + + public void unblockFling() { + mBlockFling = false; + mBlockFlingTime = 0; + } + + public void onEvent() { + // We prevent flinging after passing a state, but allow it if the user pauses briefly. + if (SystemClock.uptimeMillis() - mBlockFlingTime >= UNBLOCK_FLING_PAUSE_DURATION) { + mBlockFling = false; + } + } + + public boolean isBlocked() { + return mBlockFling; + } +} diff --git a/src/com/android/launcher3/util/MultiValueAlpha.java b/src/com/android/launcher3/util/MultiValueAlpha.java new file mode 100644 index 000000000..f810f483d --- /dev/null +++ b/src/com/android/launcher3/util/MultiValueAlpha.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2018 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.util; + +import android.util.Property; +import android.view.View; + +/** + * Utility class to handle separating a single value as a factor of multiple values + */ +public class MultiValueAlpha { + + public static final Property<AlphaProperty, Float> VALUE = + new Property<AlphaProperty, Float>(Float.TYPE, "value") { + + @Override + public Float get(AlphaProperty alphaProperty) { + return alphaProperty.mValue; + } + + @Override + public void set(AlphaProperty object, Float value) { + object.setValue(value); + } + }; + + private final View mView; + private final AlphaProperty[] mMyProperties; + + private int mValidMask; + + public MultiValueAlpha(View view, int size) { + mView = view; + mMyProperties = new AlphaProperty[size]; + + mValidMask = 0; + for (int i = 0; i < size; i++) { + int myMask = 1 << i; + mValidMask |= myMask; + mMyProperties[i] = new AlphaProperty(myMask); + } + } + + public AlphaProperty getProperty(int index) { + return mMyProperties[index]; + } + + public class AlphaProperty { + + private final int mMyMask; + + private float mValue = 1; + // Factor of all other alpha channels, only valid if mMyMask is present in mValidMask. + private float mOthers = 1; + + AlphaProperty(int myMask) { + mMyMask = myMask; + } + + public void setValue(float value) { + if (mValue == value) { + return; + } + + if ((mValidMask & mMyMask) == 0) { + // Our cache value is not correct, recompute it. + mOthers = 1; + for (AlphaProperty prop : mMyProperties) { + if (prop != this) { + mOthers *= prop.mValue; + } + } + } + + // Since we have changed our value, all other caches except our own need to be + // recomputed. Change mValidMask to indicate the new valid caches (only our own). + mValidMask = mMyMask; + mValue = value; + + mView.setAlpha(mOthers * mValue); + } + + public float getValue() { + return mValue; + } + } +} diff --git a/src/com/android/launcher3/util/SystemUiController.java b/src/com/android/launcher3/util/SystemUiController.java index edbf05a7c..86995b70f 100644 --- a/src/com/android/launcher3/util/SystemUiController.java +++ b/src/com/android/launcher3/util/SystemUiController.java @@ -16,11 +16,14 @@ package com.android.launcher3.util; +import android.text.TextUtils; import android.view.View; import android.view.Window; import com.android.launcher3.Utilities; +import java.util.Arrays; + /** * Utility class to manage various window flags to control system UI. */ @@ -31,6 +34,7 @@ public class SystemUiController { public static final int UI_STATE_ALL_APPS = 1; public static final int UI_STATE_WIDGET_BOTTOM_SHEET = 2; public static final int UI_STATE_ROOT_VIEW = 3; + public static final int UI_STATE_OVERVIEW = 4; public static final int FLAG_LIGHT_NAV = 1 << 0; public static final int FLAG_DARK_NAV = 1 << 1; @@ -38,7 +42,7 @@ public class SystemUiController { public static final int FLAG_DARK_STATUS = 1 << 3; private final Window mWindow; - private final int[] mStates = new int[4]; + private final int[] mStates = new int[5]; public SystemUiController(Window window) { mWindow = window; @@ -77,4 +81,9 @@ public class SystemUiController { mWindow.getDecorView().setSystemUiVisibility(newFlags); } } + + @Override + public String toString() { + return "mStates=" + Arrays.toString(mStates); + } } diff --git a/src/com/android/launcher3/util/Themes.java b/src/com/android/launcher3/util/Themes.java index 89597b9ed..d22509344 100644 --- a/src/com/android/launcher3/util/Themes.java +++ b/src/com/android/launcher3/util/Themes.java @@ -78,4 +78,23 @@ public class Themes { target.setScale(Color.red(color) / 255f, Color.green(color) / 255f, Color.blue(color) / 255f, Color.alpha(color) / 255f); } + + /** + * Changes a color matrix such that, when applied to srcColor, it produces dstColor. + * + * Note that values on the last column of target ColorMatrix can be negative, and may result in + * negative values when applied on a color. Such negative values will be automatically shifted + * up to 0 by the framework. + * + * @param srcColor The color to start from + * @param dstColor The color to create by applying target on srcColor + * @param target The ColorMatrix to transform the color + */ + public static void setColorChangeOnMatrix(int srcColor, int dstColor, ColorMatrix target) { + target.reset(); + target.getArray()[4] = Color.red(dstColor) - Color.red(srcColor); + target.getArray()[9] = Color.green(dstColor) - Color.green(srcColor); + target.getArray()[14] = Color.blue(dstColor) - Color.blue(srcColor); + target.getArray()[19] = Color.alpha(dstColor) - Color.alpha(srcColor); + } } diff --git a/src/com/android/launcher3/views/AbstractSlideInView.java b/src/com/android/launcher3/views/AbstractSlideInView.java index 7c4529dd7..c8d14572e 100644 --- a/src/com/android/launcher3/views/AbstractSlideInView.java +++ b/src/com/android/launcher3/views/AbstractSlideInView.java @@ -81,6 +81,7 @@ public abstract class AbstractSlideInView extends AbstractFloatingView @Override public void onAnimationEnd(Animator animation) { mSwipeDetector.finishedScrolling(); + announceAccessibilityChanges(); } }); } diff --git a/src/com/android/launcher3/views/BaseDragLayer.java b/src/com/android/launcher3/views/BaseDragLayer.java index 489e59e75..2f142acc9 100644 --- a/src/com/android/launcher3/views/BaseDragLayer.java +++ b/src/com/android/launcher3/views/BaseDragLayer.java @@ -30,10 +30,14 @@ import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.InsettableFrameLayout; import com.android.launcher3.Utilities; +import com.android.launcher3.util.MultiValueAlpha; +import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; import com.android.launcher3.util.TouchController; import java.util.ArrayList; +import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; + /** * A viewgroup with utility methods for drag-n-drop and touch interception */ @@ -43,17 +47,18 @@ public abstract class BaseDragLayer<T extends BaseDraggingActivity> extends Inse protected final Rect mHitRect = new Rect(); protected final T mActivity; + private final MultiValueAlpha mMultiValueAlpha; protected TouchController[] mControllers; protected TouchController mActiveController; private TouchCompleteListener mTouchCompleteListener; - public BaseDragLayer(Context context, AttributeSet attrs) { + public BaseDragLayer(Context context, AttributeSet attrs, int alphaChannelCount) { super(context, attrs); mActivity = (T) BaseActivity.fromContext(context); + mMultiValueAlpha = new MultiValueAlpha(this, alphaChannelCount); } - public boolean isEventOverView(View view, MotionEvent ev) { getDescendantRectRelativeToSelf(view, mHitRect); return mHitRect.contains((int) ev.getX(), (int) ev.getY()); @@ -112,12 +117,35 @@ public abstract class BaseDragLayer<T extends BaseDraggingActivity> extends Inse View topView = AbstractFloatingView.getTopOpenView(mActivity); if (topView != null) { // Only add the top view as a child for accessibility when it is open - childrenForAccessibility.add(topView); + addAccessibleChildToList(topView, childrenForAccessibility); } else { super.addChildrenForAccessibility(childrenForAccessibility); } } + protected void addAccessibleChildToList(View child, ArrayList<View> outList) { + if (child.isImportantForAccessibility()) { + outList.add(child); + } else { + child.addChildrenForAccessibility(outList); + } + } + + @Override + public void onViewRemoved(View child) { + super.onViewRemoved(child); + if (child instanceof AbstractFloatingView) { + // Handles the case where the view is removed without being properly closed. + // This can happen if something goes wrong during a state change/transition. + postDelayed(() -> { + AbstractFloatingView floatingView = (AbstractFloatingView) child; + if (floatingView.isOpen()) { + floatingView.close(false); + } + }, SINGLE_FRAME_MS); + } + } + @Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); @@ -259,6 +287,10 @@ public abstract class BaseDragLayer<T extends BaseDraggingActivity> extends Inse return new LayoutParams(p); } + public AlphaProperty getAlphaProperty(int index) { + return mMultiValueAlpha.getProperty(index); + } + public static class LayoutParams extends InsettableFrameLayout.LayoutParams { public int x, y; public boolean customPosition = false; diff --git a/src/com/android/launcher3/views/LauncherDragIndicator.java b/src/com/android/launcher3/views/LauncherDragIndicator.java deleted file mode 100644 index 986e4bee3..000000000 --- a/src/com/android/launcher3/views/LauncherDragIndicator.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2018 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.LauncherState.ALL_APPS; - -import android.content.Context; -import android.graphics.Rect; -import android.os.Bundle; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.accessibility.AccessibilityNodeInfo; -import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; -import android.widget.FrameLayout; -import android.widget.ImageView; - -import com.android.launcher3.DeviceProfile; -import com.android.launcher3.Insettable; -import com.android.launcher3.Launcher; -import com.android.launcher3.R; -import com.android.launcher3.Utilities; -import com.android.launcher3.userevent.nano.LauncherLogProto.Action; -import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; - -public class LauncherDragIndicator extends ImageView implements Insettable, OnClickListener { - - private static final int WALLPAPERS = R.string.wallpaper_button_text; - private static final int WIDGETS = R.string.widget_button_text; - private static final int SETTINGS = R.string.settings_button_text; - - protected final Launcher mLauncher; - - public LauncherDragIndicator(Context context) { - this(context, null); - } - - public LauncherDragIndicator(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public LauncherDragIndicator(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - mLauncher = Launcher.getLauncher(context); - setOnClickListener(this); - } - - @Override - public void setInsets(Rect insets) { - DeviceProfile grid = mLauncher.getDeviceProfile(); - FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); - - if (grid.isVerticalBarLayout()) { - if (grid.isSeascape()) { - lp.leftMargin = grid.hotseatBarSidePaddingPx; - lp.rightMargin = insets.right; - lp.gravity = Gravity.RIGHT | Gravity.BOTTOM; - } else { - lp.leftMargin = insets.left; - lp.rightMargin = grid.hotseatBarSidePaddingPx; - lp.gravity = Gravity.LEFT | Gravity.BOTTOM; - } - lp.bottomMargin = grid.workspacePadding.bottom; - setImageResource(R.drawable.all_apps_handle_landscape); - } else { - lp.leftMargin = lp.rightMargin = 0; - lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; - lp.bottomMargin = getPortraitBottomMargin(grid, insets); - setImageResource(R.drawable.ic_drag_indicator); - } - - lp.width = lp.height = grid.pageIndicatorSizePx; - setLayoutParams(lp); - } - - protected int getPortraitBottomMargin(DeviceProfile grid, Rect insets) { - return grid.hotseatBarSizePx + insets.bottom - grid.pageIndicatorSizePx; - } - - @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - initCustomActions(info); - } - - protected void initCustomActions(AccessibilityNodeInfo info) { - Context context = getContext(); - if (Utilities.isWallpaperAllowed(context)) { - info.addAction(new AccessibilityAction(WALLPAPERS, context.getText(WALLPAPERS))); - } - info.addAction(new AccessibilityAction(WIDGETS, context.getText(WIDGETS))); - info.addAction(new AccessibilityAction(SETTINGS, context.getText(SETTINGS))); - } - - @Override - public boolean performAccessibilityAction(int action, Bundle arguments) { - if (action == WALLPAPERS) { - return OptionsPopupView.startWallpaperPicker(this); - } else if (action == WIDGETS) { - return OptionsPopupView.onWidgetsClicked(this); - } else if (action == SETTINGS) { - return OptionsPopupView.startSettings(this); - } - return super.performAccessibilityAction(action, arguments); - } - - @Override - public void onClick(View view) { - if (!mLauncher.isInState(ALL_APPS)) { - mLauncher.getUserEventDispatcher().logActionOnControl( - Action.Touch.TAP, ControlType.ALL_APPS_BUTTON); - mLauncher.getStateManager().goToState(ALL_APPS); - } - } -} diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index 56b92c7c6..c17857f77 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -184,6 +184,7 @@ public class OptionsPopupView extends ArrowPopup Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER) .putExtra(EXTRA_WALLPAPER_OFFSET, launcher.getWorkspace().getWallpaperOffsetForCenterPage()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); String pickerPackage = launcher.getString(R.string.wallpaper_picker_package); if (!TextUtils.isEmpty(pickerPackage)) { diff --git a/src/com/android/launcher3/views/RecyclerViewFastScroller.java b/src/com/android/launcher3/views/RecyclerViewFastScroller.java index 1cd669986..05bab8b45 100644 --- a/src/com/android/launcher3/views/RecyclerViewFastScroller.java +++ b/src/com/android/launcher3/views/RecyclerViewFastScroller.java @@ -372,4 +372,11 @@ public class RecyclerViewFastScroller extends View { } return sTempRect.contains((int) x, (int) y); } + + @Override + public boolean hasOverlappingRendering() { + // There is actually some overlap between the track and the thumb. But since the track + // alpha is so low, it does not matter. + return false; + } } diff --git a/src/com/android/launcher3/views/ScrimView.java b/src/com/android/launcher3/views/ScrimView.java new file mode 100644 index 000000000..6bbce00fe --- /dev/null +++ b/src/com/android/launcher3/views/ScrimView.java @@ -0,0 +1,404 @@ +/* + * Copyright (C) 2018 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 android.content.Context.ACCESSIBILITY_SERVICE; +import static android.support.v4.graphics.ColorUtils.compositeColors; +import static android.support.v4.graphics.ColorUtils.setAlphaComponent; +import static android.view.MotionEvent.ACTION_DOWN; + +import static com.android.launcher3.LauncherState.ALL_APPS; +import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.anim.Interpolators.ACCEL; +import static com.android.launcher3.anim.Interpolators.DEACCEL; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.Keyframe; +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; +import android.animation.RectEvaluator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; +import android.support.v4.widget.ExploreByTouchHelper; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener; + +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Insettable; +import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherState; +import com.android.launcher3.LauncherStateManager; +import com.android.launcher3.LauncherStateManager.StateListener; +import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.uioverrides.WallpaperColorInfo; +import com.android.launcher3.uioverrides.WallpaperColorInfo.OnChangeListener; +import com.android.launcher3.userevent.nano.LauncherLogProto.Action; +import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; +import com.android.launcher3.util.Themes; + +import java.util.List; + +/** + * Simple scrim which draws a flat color + */ +public class ScrimView extends View implements Insettable, OnChangeListener, + AccessibilityStateChangeListener, StateListener { + + private static final int WALLPAPERS = R.string.wallpaper_button_text; + private static final int WIDGETS = R.string.widget_button_text; + private static final int SETTINGS = R.string.settings_button_text; + + private final Rect mTempRect = new Rect(); + private final int[] mTempPos = new int[2]; + + protected final Launcher mLauncher; + private final WallpaperColorInfo mWallpaperColorInfo; + private final AccessibilityManager mAM; + protected final int mEndScrim; + + protected float mMaxScrimAlpha; + + protected float mProgress = 1; + protected int mScrimColor; + + protected int mCurrentFlatColor; + protected int mEndFlatColor; + protected int mEndFlatColorAlpha; + + protected final int mDragHandleSize; + private final Rect mDragHandleBounds; + private final RectF mHitRect = new RectF(); + + private final AccessibilityHelper mAccessibilityHelper; + @Nullable + protected Drawable mDragHandle; + + public ScrimView(Context context, AttributeSet attrs) { + super(context, attrs); + mLauncher = Launcher.getLauncher(context); + mWallpaperColorInfo = WallpaperColorInfo.getInstance(context); + mEndScrim = Themes.getAttrColor(context, R.attr.allAppsScrimColor); + + mMaxScrimAlpha = 0.7f; + + mDragHandleSize = context.getResources() + .getDimensionPixelSize(R.dimen.vertical_drag_handle_size); + mDragHandleBounds = new Rect(0, 0, mDragHandleSize, mDragHandleSize); + + mAccessibilityHelper = createAccessibilityHelper(); + ViewCompat.setAccessibilityDelegate(this, mAccessibilityHelper); + + mAM = (AccessibilityManager) context.getSystemService(ACCESSIBILITY_SERVICE); + } + + @NonNull + protected AccessibilityHelper createAccessibilityHelper() { + return new AccessibilityHelper(); + } + + @Override + public void setInsets(Rect insets) { + updateDragHandleBounds(); + updateDragHandleVisibility(null); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + updateDragHandleBounds(); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + mWallpaperColorInfo.addOnChangeListener(this); + onExtractedColorsChanged(mWallpaperColorInfo); + + mAM.addAccessibilityStateChangeListener(this); + onAccessibilityStateChanged(mAM.isEnabled()); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mWallpaperColorInfo.removeOnChangeListener(this); + mAM.removeAccessibilityStateChangeListener(this); + } + + @Override + public boolean hasOverlappingRendering() { + return false; + } + + @Override + public void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo) { + mScrimColor = wallpaperColorInfo.getMainColor(); + mEndFlatColor = compositeColors(mEndScrim, setAlphaComponent( + mScrimColor, Math.round(mMaxScrimAlpha * 255))); + mEndFlatColorAlpha = Color.alpha(mEndFlatColor); + updateColors(); + invalidate(); + } + + public void setProgress(float progress) { + if (mProgress != progress) { + mProgress = progress; + updateColors(); + updateDragHandleAlpha(); + invalidate(); + } + } + + public void reInitUi() { } + + protected void updateColors() { + mCurrentFlatColor = mProgress >= 1 ? 0 : setAlphaComponent( + mEndFlatColor, Math.round((1 - mProgress) * mEndFlatColorAlpha)); + } + + protected void updateDragHandleAlpha() { + if (mDragHandle != null) { + mDragHandle.setAlpha(Math.round(255 * Utilities.boundToRange(mProgress, 0, 1))); + } + } + + @Override + protected void onDraw(Canvas canvas) { + if (mCurrentFlatColor != 0) { + canvas.drawColor(mCurrentFlatColor); + } + if (mDragHandle != null) { + mDragHandle.draw(canvas); + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + boolean value = super.onTouchEvent(event); + if (!value && mDragHandle != null && event.getAction() == ACTION_DOWN + && mDragHandle.getAlpha() == 255 + && mHitRect.contains(event.getX(), event.getY())) { + + final Drawable drawable = mDragHandle; + mDragHandle = null; + drawable.setBounds(mDragHandleBounds); + + Rect topBounds = new Rect(mDragHandleBounds); + topBounds.offset(0, -mDragHandleBounds.height() / 2); + + Rect invalidateRegion = new Rect(mDragHandleBounds); + invalidateRegion.top = topBounds.top; + + Keyframe frameTop = Keyframe.ofObject(0.6f, topBounds); + frameTop.setInterpolator(DEACCEL); + Keyframe frameBot = Keyframe.ofObject(1, mDragHandleBounds); + frameBot.setInterpolator(ACCEL); + PropertyValuesHolder holder = PropertyValuesHolder .ofKeyframe("bounds", + Keyframe.ofObject(0, mDragHandleBounds), frameTop, frameBot); + holder.setEvaluator(new RectEvaluator()); + + ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(drawable, holder); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + getOverlay().remove(drawable); + updateDragHandleVisibility(drawable); + } + }); + anim.addUpdateListener((v) -> invalidate(invalidateRegion)); + getOverlay().add(drawable); + anim.start(); + } + return value; + } + + protected void updateDragHandleBounds() { + DeviceProfile grid = mLauncher.getDeviceProfile(); + final int left; + final int width = getMeasuredWidth(); + final int top = getMeasuredHeight() - mDragHandleSize - grid.getInsets().bottom; + final int topMargin; + + if (grid.isVerticalBarLayout()) { + topMargin = grid.workspacePadding.bottom; + if (grid.isSeascape()) { + left = width - grid.getInsets().right - mDragHandleSize; + } else { + left = mDragHandleSize + grid.getInsets().left; + } + } else { + left = (width - mDragHandleSize) / 2; + topMargin = grid.hotseatBarSizePx; + } + mDragHandleBounds.offsetTo(left, top - topMargin); + mHitRect.set(mDragHandleBounds); + float inset = -mDragHandleSize / 2; + mHitRect.inset(inset, inset); + + if (mDragHandle != null) { + mDragHandle.setBounds(mDragHandleBounds); + } + } + + @Override + public void onAccessibilityStateChanged(boolean enabled) { + LauncherStateManager stateManager = mLauncher.getStateManager(); + stateManager.removeStateListener(this); + + if (enabled) { + stateManager.addStateListener(this); + onStateSetImmediately(mLauncher.getStateManager().getState()); + } else { + setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); + } + updateDragHandleVisibility(null); + } + + private void updateDragHandleVisibility(Drawable recycle) { + boolean visible = mLauncher.getDeviceProfile().isVerticalBarLayout() || mAM.isEnabled(); + boolean wasVisible = mDragHandle != null; + if (visible != wasVisible) { + if (visible) { + mDragHandle = recycle != null ? recycle : + mLauncher.getDrawable(R.drawable.drag_handle_indicator); + mDragHandle.setBounds(mDragHandleBounds); + + updateDragHandleAlpha(); + } else { + mDragHandle = null; + } + invalidate(); + } + } + + @Override + public boolean dispatchHoverEvent(MotionEvent event) { + return mAccessibilityHelper.dispatchHoverEvent(event) || super.dispatchHoverEvent(event); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return mAccessibilityHelper.dispatchKeyEvent(event) || super.dispatchKeyEvent(event); + } + + @Override + public void onFocusChanged(boolean gainFocus, int direction, + Rect previouslyFocusedRect) { + super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); + mAccessibilityHelper.onFocusChanged(gainFocus, direction, previouslyFocusedRect); + } + + @Override + public void onStateTransitionStart(LauncherState toState) {} + + @Override + public void onStateTransitionComplete(LauncherState finalState) { + onStateSetImmediately(finalState); + } + + @Override + public void onStateSetImmediately(LauncherState state) { + setImportantForAccessibility(state == ALL_APPS + ? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS + : IMPORTANT_FOR_ACCESSIBILITY_AUTO); + } + + protected class AccessibilityHelper extends ExploreByTouchHelper { + + private static final int DRAG_HANDLE_ID = 1; + + public AccessibilityHelper() { + super(ScrimView.this); + } + + @Override + protected int getVirtualViewAt(float x, float y) { + return mDragHandleBounds.contains((int) x, (int) y) + ? DRAG_HANDLE_ID : INVALID_ID; + } + + @Override + protected void getVisibleVirtualViews(List<Integer> virtualViewIds) { + virtualViewIds.add(DRAG_HANDLE_ID); + } + + @Override + protected void onPopulateNodeForVirtualView(int virtualViewId, + AccessibilityNodeInfoCompat node) { + node.setContentDescription(getContext().getString(R.string.all_apps_button_label)); + node.setBoundsInParent(mDragHandleBounds); + + getLocationOnScreen(mTempPos); + mTempRect.set(mDragHandleBounds); + mTempRect.offset(mTempPos[0], mTempPos[1]); + node.setBoundsInScreen(mTempRect); + + node.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK); + node.setClickable(true); + node.setFocusable(true); + + if (mLauncher.isInState(NORMAL)) { + Context context = getContext(); + if (Utilities.isWallpaperAllowed(context)) { + node.addAction( + new AccessibilityActionCompat(WALLPAPERS, context.getText(WALLPAPERS))); + } + node.addAction(new AccessibilityActionCompat(WIDGETS, context.getText(WIDGETS))); + node.addAction(new AccessibilityActionCompat(SETTINGS, context.getText(SETTINGS))); + } + } + + @Override + protected boolean onPerformActionForVirtualView( + int virtualViewId, int action, Bundle arguments) { + if (action == AccessibilityNodeInfoCompat.ACTION_CLICK) { + mLauncher.getUserEventDispatcher().logActionOnControl( + Action.Touch.TAP, ControlType.ALL_APPS_BUTTON, + mLauncher.getStateManager().getState().containerType); + mLauncher.getStateManager().goToState(ALL_APPS); + return true; + } else if (action == WALLPAPERS) { + return OptionsPopupView.startWallpaperPicker(ScrimView.this); + } else if (action == WIDGETS) { + return OptionsPopupView.onWidgetsClicked(ScrimView.this); + } else if (action == SETTINGS) { + return OptionsPopupView.startSettings(ScrimView.this); + } + + return false; + } + } + + public int getDragHandleSize() { + return mDragHandleSize; + } +} diff --git a/src/com/android/launcher3/views/SpringRelativeLayout.java b/src/com/android/launcher3/views/SpringRelativeLayout.java index 090b3e6b9..598738b9f 100644 --- a/src/com/android/launcher3/views/SpringRelativeLayout.java +++ b/src/com/android/launcher3/views/SpringRelativeLayout.java @@ -24,7 +24,6 @@ import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.EdgeEffectFactory; import android.util.AttributeSet; -import android.util.Log; import android.util.SparseBooleanArray; import android.view.View; import android.widget.EdgeEffect; @@ -58,6 +57,7 @@ public class SpringRelativeLayout extends RelativeLayout { private final SpringAnimation mSpring; private float mDampedScrollShift = 0; + private SpringEdgeEffect mActiveEdge; public SpringRelativeLayout(Context context) { this(context, null); @@ -90,7 +90,14 @@ public class SpringRelativeLayout extends RelativeLayout { return super.drawChild(canvas, child, drawingTime); } - private void setDampedScrollShift(float shift) { + private void setActiveEdge(SpringEdgeEffect edge) { + if (mActiveEdge != edge && mActiveEdge != null) { + mActiveEdge.mDistance = 0; + } + mActiveEdge = edge; + } + + protected void setDampedScrollShift(float shift) { if (shift != mDampedScrollShift) { mDampedScrollShift = shift; invalidate(); @@ -144,6 +151,7 @@ public class SpringRelativeLayout extends RelativeLayout { @Override public void onPull(float deltaDistance, float displacement) { + setActiveEdge(this); mDistance += deltaDistance * (mVelocityMultiplier / 3f); setDampedScrollShift(mDistance * getHeight()); } diff --git a/src/com/android/launcher3/widget/WidgetsBottomSheet.java b/src/com/android/launcher3/widget/WidgetsBottomSheet.java index a2584852b..5ce7e0453 100644 --- a/src/com/android/launcher3/widget/WidgetsBottomSheet.java +++ b/src/com/android/launcher3/widget/WidgetsBottomSheet.java @@ -20,6 +20,7 @@ import android.animation.PropertyValuesHolder; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; +import android.util.Pair; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -72,7 +73,7 @@ public class WidgetsBottomSheet extends BaseWidgetSheet implements Insettable { mLauncher.getDragLayer().addView(this); mIsOpen = false; - open(true); + animateOpen(); } @Override @@ -129,20 +130,16 @@ public class WidgetsBottomSheet extends BaseWidgetSheet implements Insettable { return widget; } - private void open(boolean animate) { + private void animateOpen() { if (mIsOpen || mOpenCloseAnimator.isRunning()) { return; } mIsOpen = true; setupNavBarColor(); - if (animate) { - mOpenCloseAnimator.setValues( - PropertyValuesHolder.ofFloat(TRANSLATION_SHIFT, TRANSLATION_SHIFT_OPENED)); - mOpenCloseAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); - mOpenCloseAnimator.start(); - } else { - setTranslationShift(TRANSLATION_SHIFT_OPENED); - } + mOpenCloseAnimator.setValues( + PropertyValuesHolder.ofFloat(TRANSLATION_SHIFT, TRANSLATION_SHIFT_OPENED)); + mOpenCloseAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); + mOpenCloseAnimator.start(); } @Override @@ -170,4 +167,10 @@ public class WidgetsBottomSheet extends BaseWidgetSheet implements Insettable { protected int getElementsRowCount() { return 1; } + + @Override + protected Pair<View, String> getAccessibilityTarget() { + return Pair.create(findViewById(R.id.title), getContext().getString( + mIsOpen ? R.string.widgets_list : R.string.widgets_list_closed)); + } } diff --git a/src/com/android/launcher3/widget/WidgetsFullSheet.java b/src/com/android/launcher3/widget/WidgetsFullSheet.java index a622624dc..e94d81d75 100644 --- a/src/com/android/launcher3/widget/WidgetsFullSheet.java +++ b/src/com/android/launcher3/widget/WidgetsFullSheet.java @@ -21,8 +21,10 @@ import android.animation.PropertyValuesHolder; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; +import android.util.Pair; import android.view.LayoutInflater; import android.view.MotionEvent; +import android.view.View; import android.view.animation.AnimationUtils; import com.android.launcher3.Insettable; @@ -55,6 +57,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet mAdapter = new WidgetsListAdapter(context, LayoutInflater.from(context), apps.getWidgetCache(), apps.getIconCache(), this, this); + } public WidgetsFullSheet(Context context, AttributeSet attrs) { @@ -77,6 +80,12 @@ public class WidgetsFullSheet extends BaseWidgetSheet } @Override + protected Pair<View, String> getAccessibilityTarget() { + return Pair.create(mRecyclerView, getContext().getString( + mIsOpen ? R.string.widgets_list : R.string.widgets_list_closed)); + } + + @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); mLauncher.getAppWidgetHost().addProviderChangeListener(this); @@ -149,10 +158,6 @@ public class WidgetsFullSheet extends BaseWidgetSheet } private void open(boolean animate) { - if (mIsOpen) { - return; - } - mIsOpen = true; if (animate) { if (mLauncher.getDragLayer().getInsets().bottom > 0) { mContent.setAlpha(0); @@ -180,6 +185,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet } else { setTranslationShift(TRANSLATION_SHIFT_OPENED); mAdapter.setApplyBitmapDeferred(false, mRecyclerView); + post(this::announceAccessibilityChanges); } } @@ -212,6 +218,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet public static WidgetsFullSheet show(Launcher launcher, boolean animate) { WidgetsFullSheet sheet = (WidgetsFullSheet) launcher.getLayoutInflater() .inflate(R.layout.widgets_full_sheet, launcher.getDragLayer(), false); + sheet.mIsOpen = true; launcher.getDragLayer().addView(sheet); sheet.open(animate); return sheet; diff --git a/src/com/android/launcher3/widget/WidgetsRowViewHolder.java b/src/com/android/launcher3/widget/WidgetsRowViewHolder.java index bc85db610..8f269a643 100644 --- a/src/com/android/launcher3/widget/WidgetsRowViewHolder.java +++ b/src/com/android/launcher3/widget/WidgetsRowViewHolder.java @@ -29,7 +29,8 @@ public class WidgetsRowViewHolder extends ViewHolder { public WidgetsRowViewHolder(ViewGroup v) { super(v); - cellContainer = (ViewGroup) v.findViewById(R.id.widgets_cell_list); - title = (BubbleTextView) v.findViewById(R.id.section); + cellContainer = v.findViewById(R.id.widgets_cell_list); + title = v.findViewById(R.id.section); + title.setAccessibilityDelegate(null); } } diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java b/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java index 49a9dc7c9..4a2f544e8 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java @@ -16,7 +16,7 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherAnimUtils.ALL_APPS_TRANSITION_MS; -import static com.android.launcher3.allapps.DiscoveryBounce.APPS_VIEW_SHOWN; +import static com.android.launcher3.allapps.DiscoveryBounce.HOME_BOUNCE_SEEN; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; import android.view.View; @@ -34,7 +34,7 @@ public class AllAppsState extends LauncherState { private static final float PARALLAX_COEFFICIENT = .125f; - private static final int STATE_FLAGS = FLAG_DISABLE_ACCESSIBILITY | FLAG_ALL_APPS_SCRIM; + private static final int STATE_FLAGS = FLAG_DISABLE_ACCESSIBILITY; private static final PageAlphaProvider PAGE_ALPHA_PROVIDER = new PageAlphaProvider(DEACCEL_2) { @Override @@ -49,8 +49,8 @@ public class AllAppsState extends LauncherState { @Override public void onStateEnabled(Launcher launcher) { - if (!launcher.getSharedPrefs().getBoolean(APPS_VIEW_SHOWN, false)) { - launcher.getSharedPrefs().edit().putBoolean(APPS_VIEW_SHOWN, true).apply(); + if (!launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false)) { + launcher.getSharedPrefs().edit().putBoolean(HOME_BOUNCE_SEEN, true).apply(); } AbstractFloatingView.closeAllOpenViews(launcher); diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsSwipeController.java b/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsSwipeController.java index d1cddc18f..e9dc800e3 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsSwipeController.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsSwipeController.java @@ -8,6 +8,7 @@ import android.view.MotionEvent; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; +import com.android.launcher3.LauncherStateManager.AnimationComponents; import com.android.launcher3.touch.AbstractStateChangeTouchController; import com.android.launcher3.touch.SwipeDetector; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; @@ -17,12 +18,17 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; */ public class AllAppsSwipeController extends AbstractStateChangeTouchController { + private MotionEvent mTouchDownEvent; + public AllAppsSwipeController(Launcher l) { super(l, SwipeDetector.VERTICAL); } @Override protected boolean canInterceptTouch(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + mTouchDownEvent = ev; + } if (mCurrentAnimation != null) { // If we are already animating from a previous state, we can intercept. return true; @@ -41,18 +47,6 @@ public class AllAppsSwipeController extends AbstractStateChangeTouchController { } @Override - protected int getSwipeDirection(MotionEvent ev) { - if (mLauncher.isInState(ALL_APPS)) { - mStartContainerType = ContainerType.ALLAPPS; - return SwipeDetector.DIRECTION_NEGATIVE; - } else { - mStartContainerType = mLauncher.getDragLayer().isEventOverHotseat(ev) ? - ContainerType.HOTSEAT : ContainerType.WORKSPACE; - return SwipeDetector.DIRECTION_POSITIVE; - } - } - - @Override protected LauncherState getTargetState(LauncherState fromState, boolean isDragTowardPositive) { if (fromState == NORMAL && isDragTowardPositive) { return ALL_APPS; @@ -63,11 +57,17 @@ public class AllAppsSwipeController extends AbstractStateChangeTouchController { } @Override - protected float initCurrentAnimation() { + protected int getLogContainerTypeForNormalState() { + return mLauncher.getDragLayer().isEventOverView(mLauncher.getHotseat(), mTouchDownEvent) ? + ContainerType.HOTSEAT : ContainerType.WORKSPACE; + } + + @Override + protected float initCurrentAnimation(@AnimationComponents int animComponents) { float range = getShiftRange(); long maxAccuracy = (long) (2 * range); mCurrentAnimation = mLauncher.getStateManager() - .createAnimationToNewWorkspace(mToState, maxAccuracy); + .createAnimationToNewWorkspace(mToState, maxAccuracy, animComponents); float startVerticalShift = mFromState.getVerticalProgress(mLauncher) * range; float endVerticalShift = mToState.getVerticalProgress(mLauncher) * range; float totalShift = endVerticalShift - startVerticalShift; diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/DisplayRotationListener.java b/src_ui_overrides/com/android/launcher3/uioverrides/DisplayRotationListener.java new file mode 100644 index 000000000..b1a67e9f2 --- /dev/null +++ b/src_ui_overrides/com/android/launcher3/uioverrides/DisplayRotationListener.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2018 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.uioverrides; + +import android.content.Context; +import android.view.OrientationEventListener; + +/** + * Utility class for listening for rotation changes + */ +public class DisplayRotationListener extends OrientationEventListener { + + private final Runnable mCallback; + + public DisplayRotationListener(Context context, Runnable callback) { + super(context); + mCallback = callback; + } + + @Override + public void onOrientationChanged(int i) { + mCallback.run(); + } +} diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java b/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java index be9d5b734..db98f9a80 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java @@ -16,10 +16,15 @@ package com.android.launcher3.uioverrides; +import android.app.Activity; +import android.content.Context; + import com.android.launcher3.Launcher; import com.android.launcher3.LauncherStateManager.StateHandler; import com.android.launcher3.util.TouchController; +import java.io.PrintWriter; + public class UiFactory { public static TouchController[] createTouchControllers(Launcher launcher) { @@ -27,6 +32,8 @@ public class UiFactory { launcher.getDragController(), new AllAppsSwipeController(launcher)}; } + public static void setOnTouchControllersChangedListener(Context context, Runnable listener) { } + public static StateHandler[] getStateHandler(Launcher launcher) { return new StateHandler[] { launcher.getAllAppsController(), launcher.getWorkspace() }; @@ -36,9 +43,19 @@ public class UiFactory { public static void onLauncherStateOrFocusChanged(Launcher launcher) { } + public static void onCreate(Launcher launcher) { } + public static void onStart(Launcher launcher) { } public static void onLauncherStateOrResumeChanged(Launcher launcher) { } public static void onTrimMemory(Launcher launcher, int level) { } + + public static boolean dumpActivity(Activity activity, PrintWriter writer) { + return false; + } + + public static void prepareToShowOverview(Launcher launcher) { } + + public static void setBackButtonAlpha(Launcher launcher, float alpha, boolean animate) { } } diff --git a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java b/src_ui_overrides/com/android/launcher3/uioverrides/WallpaperColorInfo.java index 32605a2eb..21070941b 100644 --- a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/WallpaperColorInfo.java @@ -1,11 +1,28 @@ -package com.android.launcher3.dynamicui; +/* + * Copyright (C) 2018 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.uioverrides; import android.content.Context; import android.graphics.Color; import android.util.Pair; -import com.android.launcher3.compat.WallpaperColorsCompat; -import com.android.launcher3.compat.WallpaperManagerCompat; +import com.android.launcher3.uioverrides.dynamicui.WallpaperColorsCompat; +import com.android.launcher3.uioverrides.dynamicui.WallpaperManagerCompat; +import com.android.launcher3.uioverrides.dynamicui.ColorExtractionAlgorithm; import java.util.ArrayList; @@ -78,10 +95,10 @@ public class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChange } mSupportsDarkText = wallpaperColors != null ? (wallpaperColors.getColorHints() - & WallpaperColorsCompat.HINT_SUPPORTS_DARK_TEXT) > 0 : false; + & WallpaperColorsCompat.HINT_SUPPORTS_DARK_TEXT) > 0 : false; mIsDark = wallpaperColors != null ? (wallpaperColors.getColorHints() - & WallpaperColorsCompat.HINT_SUPPORTS_DARK_THEME) > 0 : false; + & WallpaperColorsCompat.HINT_SUPPORTS_DARK_THEME) > 0 : false; } public void addOnChangeListener(OnChangeListener listener) { @@ -107,4 +124,4 @@ public class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChange public interface OnChangeListener { void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo); } -} +}
\ No newline at end of file diff --git a/src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/ColorExtractionAlgorithm.java index baedf9063..0444212b8 100644 --- a/src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/ColorExtractionAlgorithm.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.launcher3.dynamicui; +package com.android.launcher3.uioverrides.dynamicui; import android.content.Context; import android.graphics.Color; @@ -27,7 +27,6 @@ import android.util.Range; import com.android.launcher3.R; import com.android.launcher3.Utilities; -import com.android.launcher3.compat.WallpaperColorsCompat; import java.util.Arrays; import java.util.LinkedList; diff --git a/src/com/android/launcher3/compat/WallpaperColorsCompat.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperColorsCompat.java index e25b9d929..d984a840d 100644 --- a/src/com/android/launcher3/compat/WallpaperColorsCompat.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperColorsCompat.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.launcher3.compat; +package com.android.launcher3.uioverrides.dynamicui; /** * A compatibility layer around platform implementation of WallpaperColors diff --git a/src/com/android/launcher3/compat/WallpaperManagerCompat.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompat.java index 00258c7da..5c533ff34 100644 --- a/src/com/android/launcher3/compat/WallpaperManagerCompat.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompat.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.launcher3.compat; +package com.android.launcher3.uioverrides.dynamicui; import android.content.Context; import android.support.annotation.Nullable; @@ -31,7 +31,7 @@ public abstract class WallpaperManagerCompat { if (sInstance == null) { context = context.getApplicationContext(); - if (Utilities.ATLEAST_OREO) { + if (Utilities.ATLEAST_OREO_MR1) { try { sInstance = new WallpaperManagerCompatVOMR1(context); } catch (Throwable e) { diff --git a/src/com/android/launcher3/compat/WallpaperManagerCompatVL.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVL.java index 299f09021..4a8bbbd5a 100644 --- a/src/com/android/launcher3/compat/WallpaperManagerCompatVL.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVL.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.launcher3.compat; +package com.android.launcher3.uioverrides.dynamicui; import static android.app.WallpaperManager.FLAG_SYSTEM; @@ -58,7 +58,7 @@ public class WallpaperManagerCompatVL extends WallpaperManagerCompat { private static final String VERSION_PREFIX = "1,"; private static final String KEY_COLORS = "wallpaper_parsed_colors"; private static final String ACTION_EXTRACTION_COMPLETE = - "com.android.launcher3.compat.WallpaperManagerCompatVL.EXTRACTION_COMPLETE"; + "com.android.launcher3.uioverrides.dynamicui.WallpaperManagerCompatVL.EXTRACTION_COMPLETE"; private final ArrayList<OnColorsChangedListenerCompat> mListeners = new ArrayList<>(); diff --git a/src/com/android/launcher3/compat/WallpaperManagerCompatVOMR1.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVOMR1.java index 524f266fc..4509e05aa 100644 --- a/src/com/android/launcher3/compat/WallpaperManagerCompatVOMR1.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVOMR1.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.launcher3.compat; +package com.android.launcher3.uioverrides.dynamicui; import android.annotation.TargetApi; import android.app.WallpaperColors; @@ -26,7 +26,6 @@ import android.util.Log; import java.lang.reflect.Method; - @TargetApi(27) public class WallpaperManagerCompatVOMR1 extends WallpaperManagerCompat { diff --git a/tests/AndroidManifest-common.xml b/tests/AndroidManifest-common.xml index a54268af0..af8b15cef 100644 --- a/tests/AndroidManifest-common.xml +++ b/tests/AndroidManifest-common.xml @@ -18,8 +18,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.launcher3.tests"> - <uses-sdk android:targetSdkVersion="25" android:minSdkVersion="21"/> - <application android:debuggable="true"> <uses-library android:name="android.test.runner" /> |