From 9b29ca5add472b6bdebfa7936142b3aad6cbe3c5 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 17 Feb 2017 10:39:44 -0800 Subject: [PATCH 001/446] Defining HomeScreenElementTheme for elements which appear on top of wallpaper > Using HomeScreenElementTheme for workspace items > Fixing view inflation where wrong layout inflater was being used Change-Id: I92e278dbfb609ad7af9c2f47351f23f03cf12049 --- res/drawable/ic_setting.xml | 2 +- res/drawable/ic_wallpaper.xml | 2 +- res/drawable/ic_widget.xml | 2 +- res/layout-land/launcher.xml | 2 ++ res/layout-port/launcher.xml | 1 + res/layout-sw720dp/launcher.xml | 1 + res/layout/drop_target_bar_horz.xml | 1 + res/layout/drop_target_bar_vert.xml | 1 + res/layout/hotseat.xml | 1 + res/layout/overview_panel.xml | 4 +++- res/layout/page_indicator.xml | 1 + res/values/colors.xml | 5 ----- res/values/styles.xml | 14 ++++++++++++-- src/com/android/launcher3/CellLayout.java | 3 ++- src/com/android/launcher3/Launcher.java | 5 +++-- src/com/android/launcher3/PagedView.java | 8 ++++---- src/com/android/launcher3/WidgetPreviewLoader.java | 9 +++++---- src/com/android/launcher3/Workspace.java | 9 ++++----- src/com/android/launcher3/folder/FolderIcon.java | 3 ++- .../android/launcher3/folder/FolderPagedView.java | 4 ---- .../launcher3/pageindicators/CaretDrawable.java | 2 +- 21 files changed, 47 insertions(+), 33 deletions(-) diff --git a/res/drawable/ic_setting.xml b/res/drawable/ic_setting.xml index e89c158c8b..b0009c59ef 100644 --- a/res/drawable/ic_setting.xml +++ b/res/drawable/ic_setting.xml @@ -19,6 +19,6 @@ Copyright (C) 2016 The Android Open Source Project android:viewportWidth="48.0" android:viewportHeight="48.0"> diff --git a/res/drawable/ic_wallpaper.xml b/res/drawable/ic_wallpaper.xml index b7fcfbf55b..30f6d1ae46 100644 --- a/res/drawable/ic_wallpaper.xml +++ b/res/drawable/ic_wallpaper.xml @@ -19,6 +19,6 @@ Copyright (C) 2016 The Android Open Source Project android:viewportWidth="48.0" android:viewportHeight="48.0"> diff --git a/res/drawable/ic_widget.xml b/res/drawable/ic_widget.xml index 97706e36d7..6c1469daad 100644 --- a/res/drawable/ic_widget.xml +++ b/res/drawable/ic_widget.xml @@ -19,6 +19,6 @@ Copyright (C) 2016 The Android Open Source Project android:viewportWidth="48.0" android:viewportHeight="48.0"> diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml index ef0dfdcc6b..6c1b1d3ca6 100644 --- a/res/layout-land/launcher.xml +++ b/res/layout-land/launcher.xml @@ -35,6 +35,7 @@ diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml index dd981dd20e..1fdf546b88 100644 --- a/res/layout-port/launcher.xml +++ b/res/layout-port/launcher.xml @@ -36,6 +36,7 @@ - #80c6c5c5 - #FFF - #FFFFFFFF - #FF000000 - #FFFFFFFF - #40FFFFFF #FFF diff --git a/res/values/styles.xml b/res/values/styles.xml index 8a46e839f0..26ddb9c6a7 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -29,6 +29,17 @@ + + + @@ -86,7 +96,7 @@ 7.5dp 16dp 16dp - @color/workspace_icon_text_color + ?android:attr/textColorPrimary @dimen/drop_target_text_size true end diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index e0fcbf04d5..cac6c065a9 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -57,6 +57,7 @@ import com.android.launcher3.graphics.DragPreviewProvider; import com.android.launcher3.util.CellAndSpan; import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.ParcelableSparseArray; +import com.android.launcher3.util.Themes; import com.android.launcher3.util.Thunk; import java.lang.annotation.Retention; @@ -236,7 +237,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { for (int i = 0; i < mDragOutlines.length; i++) { mDragOutlines[i] = new Rect(-1, -1, -1, -1); } - mDragOutlinePaint.setColor(getResources().getColor(R.color.outline_color)); + mDragOutlinePaint.setColor(Themes.getAttrColor(context, android.R.attr.textColorPrimary)); // When dragging things around the home screens, we show a green outline of // where the item will land. The outlines gradually fade out, leaving a trail diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 14b9c82902..c5cefa6780 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -65,6 +65,7 @@ import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.KeyboardShortcutGroup; import android.view.KeyboardShortcutInfo; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MotionEvent; import android.view.View; @@ -1432,8 +1433,8 @@ public class Launcher extends BaseActivity * @return A View inflated from layoutResId. */ public View createShortcut(ViewGroup parent, ShortcutInfo info) { - BubbleTextView favorite = (BubbleTextView) getLayoutInflater().inflate(R.layout.app_icon, - parent, false); + BubbleTextView favorite = (BubbleTextView) LayoutInflater.from(parent.getContext()) + .inflate(R.layout.app_icon, parent, false); favorite.applyFromShortcutInfo(info); favorite.setCompoundDrawablePadding(mDeviceProfile.iconDrawablePaddingPx); favorite.setOnClickListener(this); diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index fb6a611e75..31e3dda328 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -50,6 +50,7 @@ import android.view.animation.Interpolator; import com.android.launcher3.anim.PropertyListBuilder; import com.android.launcher3.pageindicators.PageIndicator; import com.android.launcher3.util.LauncherEdgeEffect; +import com.android.launcher3.util.Themes; import com.android.launcher3.util.Thunk; import java.util.ArrayList; @@ -226,11 +227,10 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mMinSnapVelocity = (int) (MIN_SNAP_VELOCITY * density); setOnHierarchyChangeListener(this); setWillNotDraw(false); - } - protected void setEdgeGlowColor(int color) { - mEdgeGlowLeft.setColor(color); - mEdgeGlowRight.setColor(color); + int edgeEffectColor = Themes.getAttrColor(getContext(), android.R.attr.colorEdgeEffect); + mEdgeGlowLeft.setColor(edgeEffectColor); + mEdgeGlowRight.setColor(edgeEffectColor); } protected void setDefaultInterpolator(Interpolator interpolator) { diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java index 689cc9b3eb..6dc65d9a53 100644 --- a/src/com/android/launcher3/WidgetPreviewLoader.java +++ b/src/com/android/launcher3/WidgetPreviewLoader.java @@ -416,19 +416,20 @@ public class WidgetPreviewLoader { float shadowBlur = res.getDimension(R.dimen.widget_preview_shadow_blur); float keyShadowDistance = res.getDimension(R.dimen.widget_preview_key_shadow_distance); float corner = res.getDimension(R.dimen.widget_preview_corner_radius); + int shadowColor = ColorUtils.setAlphaComponent( + res.getColor(R.color.default_shadow_color_no_alpha), + ShadowGenerator.AMBIENT_SHADOW_ALPHA); RectF bounds = new RectF(shadowBlur, shadowBlur, width - shadowBlur, height - shadowBlur - keyShadowDistance); p.setColor(Color.WHITE); // Key shadow - p.setShadowLayer(shadowBlur, 0, keyShadowDistance, - ShadowGenerator.KEY_SHADOW_ALPHA << 24); + p.setShadowLayer(shadowBlur, 0, keyShadowDistance, shadowColor); c.drawRoundRect(bounds, corner, corner, p); // Ambient shadow - p.setShadowLayer(shadowBlur, 0, 0, - ColorUtils.setAlphaComponent(Color.BLACK, ShadowGenerator.AMBIENT_SHADOW_ALPHA)); + p.setShadowLayer(shadowBlur, 0, 0, shadowColor); c.drawRoundRect(bounds, corner, corner, p); p.clearShadowLayer(); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 56aa69e5cd..6d52ea3daa 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -43,6 +43,7 @@ import android.util.AttributeSet; import android.util.Log; import android.util.Property; import android.util.SparseArray; +import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; @@ -528,8 +529,6 @@ public class Workspace extends PagedView // Set the wallpaper dimensions when Launcher starts up setWallpaperDimension(); - - setEdgeGlowColor(getResources().getColor(R.color.workspace_edge_effect_color)); } @Override @@ -622,7 +621,7 @@ public class Workspace extends PagedView if (qsb == null) { // In transposed layout, we add the QSB in the Grid. As workspace does not touch the // edges, we do not need a full width QSB. - qsb = mLauncher.getLayoutInflater().inflate( + qsb = LayoutInflater.from(getContext()).inflate( mLauncher.getDeviceProfile().isVerticalBarLayout() ? R.layout.qsb_container : R.layout.qsb_blocker_view, firstPage, false); @@ -707,7 +706,7 @@ public class Workspace extends PagedView // Inflate the cell layout, but do not add it automatically so that we can get the newly // created CellLayout. - CellLayout newScreen = (CellLayout) mLauncher.getLayoutInflater().inflate( + CellLayout newScreen = (CellLayout) LayoutInflater.from(getContext()).inflate( R.layout.workspace_screen, this, false /* attachToRoot */); newScreen.setOnLongClickListener(mLongClickListener); newScreen.setOnClickListener(mLauncher); @@ -725,7 +724,7 @@ public class Workspace extends PagedView public void createCustomContentContainer() { CellLayout customScreen = (CellLayout) - mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, this, false); + LayoutInflater.from(getContext()).inflate(R.layout.workspace_screen, this, false); customScreen.disableDragTarget(); customScreen.disableJailContent(); diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 96d56759df..6045400225 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -177,7 +177,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { } DeviceProfile grid = launcher.getDeviceProfile(); - FolderIcon icon = (FolderIcon) LayoutInflater.from(launcher).inflate(resId, group, false); + FolderIcon icon = (FolderIcon) LayoutInflater.from(group.getContext()) + .inflate(resId, group, false); // For performance and compatibility reasons we render the preview using a software layer. // In particular, hardware path clipping has spotty ecosystem support and bad performance. diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index eecce183a6..532e5a6c75 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -35,17 +35,14 @@ import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; -import com.android.launcher3.LauncherModel; import com.android.launcher3.PagedView; import com.android.launcher3.R; import com.android.launcher3.ShortcutAndWidgetContainer; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace.ItemOperator; -import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.pageindicators.PageIndicator; -import com.android.launcher3.util.Themes; import com.android.launcher3.util.Thunk; import java.util.ArrayList; @@ -108,7 +105,6 @@ public class FolderPagedView extends PagedView { mIsRtl = Utilities.isRtl(getResources()); setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); - setEdgeGlowColor(Themes.getAttrColor(context, android.R.attr.colorEdgeEffect)); mFocusIndicatorHelper = new ViewGroupFocusHelper(this); } diff --git a/src/com/android/launcher3/pageindicators/CaretDrawable.java b/src/com/android/launcher3/pageindicators/CaretDrawable.java index 0a00e24e92..32e57a9f62 100644 --- a/src/com/android/launcher3/pageindicators/CaretDrawable.java +++ b/src/com/android/launcher3/pageindicators/CaretDrawable.java @@ -46,7 +46,7 @@ public class CaretDrawable extends Drawable { final int strokeWidth = res.getDimensionPixelSize(R.dimen.all_apps_caret_stroke_width); final int shadowSpread = res.getDimensionPixelSize(R.dimen.all_apps_caret_shadow_spread); - mCaretPaint.setColor(res.getColor(R.color.workspace_icon_text_color)); + mCaretPaint.setColor(Themes.getAttrColor(context, android.R.attr.textColorPrimary)); mCaretPaint.setAntiAlias(true); mCaretPaint.setStrokeWidth(strokeWidth); mCaretPaint.setStyle(Paint.Style.STROKE); From 6da272816e4ed56233a92d00a9bf0e0d03e60533 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 27 Feb 2017 19:28:29 -0800 Subject: [PATCH 002/446] Import translations. DO NOT MERGE Change-Id: I90e9961d90f475836e1b0344c9aefc9d17a7b40f Auto-generated-cl: translation import --- res/values-af/strings.xml | 6 ++---- res/values-am/strings.xml | 6 ++---- res/values-ar/strings.xml | 6 ++---- res/values-az-rAZ/strings.xml | 6 ++---- res/values-b+sr+Latn/strings.xml | 6 ++---- res/values-be-rBY/strings.xml | 6 ++---- res/values-bg/strings.xml | 6 ++---- res/values-bn-rBD/strings.xml | 6 ++---- res/values-bs-rBA/strings.xml | 6 ++---- res/values-ca/strings.xml | 6 ++---- res/values-cs/strings.xml | 6 ++---- res/values-da/strings.xml | 6 ++---- res/values-de/strings.xml | 6 ++---- res/values-el/strings.xml | 6 ++---- res/values-en-rAU/strings.xml | 6 ++---- res/values-en-rGB/strings.xml | 6 ++---- res/values-en-rIN/strings.xml | 6 ++---- res/values-es-rUS/strings.xml | 6 ++---- res/values-es/strings.xml | 6 ++---- res/values-et-rEE/strings.xml | 6 ++---- res/values-eu-rES/strings.xml | 6 ++---- res/values-fa/strings.xml | 6 ++---- res/values-fi/strings.xml | 6 ++---- res/values-fr-rCA/strings.xml | 6 ++---- res/values-fr/strings.xml | 6 ++---- res/values-gl-rES/strings.xml | 6 ++---- res/values-gu-rIN/strings.xml | 6 ++---- res/values-hi/strings.xml | 6 ++---- res/values-hr/strings.xml | 6 ++---- res/values-hu/strings.xml | 6 ++---- res/values-hy-rAM/strings.xml | 6 ++---- res/values-in/strings.xml | 6 ++---- res/values-is-rIS/strings.xml | 6 ++---- res/values-it/strings.xml | 6 ++---- res/values-iw/strings.xml | 6 ++---- res/values-ja/strings.xml | 6 ++---- res/values-ka-rGE/strings.xml | 6 ++---- res/values-kk-rKZ/strings.xml | 6 ++---- res/values-km-rKH/strings.xml | 6 ++---- res/values-kn-rIN/strings.xml | 6 ++---- res/values-ko/strings.xml | 6 ++---- res/values-ky-rKG/strings.xml | 6 ++---- res/values-lo-rLA/strings.xml | 6 ++---- res/values-lt/strings.xml | 6 ++---- res/values-lv/strings.xml | 6 ++---- res/values-mk-rMK/strings.xml | 6 ++---- res/values-ml-rIN/strings.xml | 6 ++---- res/values-mn-rMN/strings.xml | 6 ++---- res/values-mr-rIN/strings.xml | 6 ++---- res/values-ms-rMY/strings.xml | 6 ++---- res/values-my-rMM/strings.xml | 6 ++---- res/values-nb/strings.xml | 6 ++---- res/values-ne-rNP/strings.xml | 6 ++---- res/values-nl/strings.xml | 6 ++---- res/values-pa-rIN/strings.xml | 6 ++---- res/values-pl/strings.xml | 6 ++---- res/values-pt-rPT/strings.xml | 6 ++---- res/values-pt/strings.xml | 6 ++---- res/values-ro/strings.xml | 6 ++---- res/values-ru/strings.xml | 6 ++---- res/values-si-rLK/strings.xml | 6 ++---- res/values-sk/strings.xml | 6 ++---- res/values-sl/strings.xml | 6 ++---- res/values-sq-rAL/strings.xml | 6 ++---- res/values-sr/strings.xml | 6 ++---- res/values-sv/strings.xml | 6 ++---- res/values-sw/strings.xml | 6 ++---- res/values-ta-rIN/strings.xml | 6 ++---- res/values-te-rIN/strings.xml | 6 ++---- res/values-th/strings.xml | 6 ++---- res/values-tl/strings.xml | 6 ++---- res/values-tr/strings.xml | 6 ++---- res/values-uk/strings.xml | 6 ++---- res/values-ur-rPK/strings.xml | 6 ++---- res/values-uz-rUZ/strings.xml | 6 ++---- res/values-vi/strings.xml | 6 ++---- res/values-zh-rCN/strings.xml | 6 ++---- res/values-zh-rHK/strings.xml | 6 ++---- res/values-zh-rTW/strings.xml | 6 ++---- res/values-zu/strings.xml | 6 ++---- 80 files changed, 160 insertions(+), 320 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 5fe2f1d8f2..b8ca41c670 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -33,10 +33,8 @@ "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" "%1$d breed by %2$d hoog" - - - - + "Raak en hou om op tuisskerm te plaas" + "Plaas outomaties" "Deursoek programme" "Laai tans programme …" "Geen programme gevind wat met \"%1$s\" ooreenstem nie" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 92f83ed5a6..092ff5f395 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -33,10 +33,8 @@ "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" "%1$d ስፋት በ%2$d ከፍታ" - - - - + "በመነሻ ማያ ገጽ ላይ ለማስቀመጥ ነካ ያድርጉ እና ይያዙ" + "በራስ-ሰር ያስቀምጡ" "መተግበሪያዎችን ይፈልጉ" "መተግበሪያዎችን በመጫን ላይ..." "ከ«%1$s» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 3862774e87..733d97f44f 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -33,10 +33,8 @@ "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" "‏العرض %1$d الطول %2$d" - - - - + "المس الرمز مع الاستمرار لوضعه على الشاشة الرئيسية" + "إضافة الرمز إلى الشاشة الرئيسية تلقائيًا" "البحث في التطبيقات" "جارٍ تحميل التطبيقات…" "لم يتم العثور على أية تطبيقات تتطابق مع \"%1$s\"" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index d38e4ed41e..7acb5cea4c 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -33,10 +33,8 @@ "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" "%2$d hündürlük %1$d enində" - - - - + "Əsas ekranda yerləşdirmək üçün toxunub saxlayın" + "Avtomatik yerləşdirin" "Tətbiq Axtarın" "Tətbiqlər endirilir..." "\"%1$s\" sorğusuna uyğun Tətbiqlər tapılmadı" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 8d166536c3..610dc10203 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -33,10 +33,8 @@ "Dvaput dodirnite i zadržite da biste izabrali vidžet ili koristite prilagođene radnje." "%1$d×%2$d" "širina od %1$d i visina od %2$d" - - - - + "Dodirnite i zadržite da biste postavili na početni ekran" + "Postavi automatski" "Pretražite aplikacije" "Aplikacije se učitavaju..." "Nije pronađena nijedna aplikacija za „%1$s“" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index f1b3aeea49..4487dbf29d 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -33,10 +33,8 @@ "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць віджэт або выкарыстоўваць карыстальніцкія дзеянні." "%1$d × %2$d" "Шырына: %1$d, вышыня: %2$d" - - - - + "Дакраніцеся і ўтрымлівайце, каб размясціць на галоўным экране" + "Размясціць аўтаматычна" "Пошук у Праграмах" "Ідзе загрузка праграм…" "Праграм, якія адпавядаюць запыту \"%1$s\", не знойдзена" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 4b9bba6cc4..12374a1aa2 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -33,10 +33,8 @@ "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" "Ширина %1$d и височина %2$d" - - - - + "Докоснете и задръжте, за да поставите на началния екран" + "Автоматично поставяне" "Търсене в приложенията" "Приложенията се зареждат…" "Няма намерени приложения, съответстващи на „%1$s“" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 0d639a6456..346dc27950 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -33,10 +33,8 @@ "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" "%2$d উচ্চতা অনুযায়ী %1$d প্রস্থ" - - - - + "হোম স্ক্রিনে রাখতে টাচ করে ধরে থাকুন" + "স্বয়ংক্রিয়ভাবে রাখুন" "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন" "অ্যাপ্লিকেশানগুলি লোড হচ্ছে..." "\"%1$s\" এর সাথে মেলে এমন কোনো অ্যাপ্লিকেশান পাওয়া যায়নি" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 4a658d2a1b..28d349954b 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -33,10 +33,8 @@ "Dvaput dodirnite & i držite da biste uzeli vidžet ili koristite prilagođene radnje." "%1$d × %2$d" "Širina %1$d, visina %2$d" - - - - + "Dodirnite i držite da postavite na početni ekran" + "Postavi automatski" "Pretraži aplikacije" "Aplikacije se učitavaju…" "Nije pronađena nijedna aplikacija koja odgovara upitu \"%1$s\"" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 36d18bfade..08cfe50d12 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -33,10 +33,8 @@ "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" "%1$d d\'amplada per %2$d d\'alçada" - - - - + "Toca i mantén premut l\'element per col·locar-lo a la pantalla d\'inici" + "Col·loca automàticament" "Cerca a les aplicacions" "S\'estan carregant les aplicacions..." "No s\'ha trobat cap aplicació que coincideixi amb %1$s" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index d34c22b747..cbaf023dea 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -33,10 +33,8 @@ "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" "šířka %1$d, výška %2$d" - - - - + "Chcete-li položku umístit na plochu, klepněte na ni a podržte ji" + "Umístit automaticky" "Hledat aplikace" "Načítání aplikací…" "Dotazu „%1$s“ neodpovídají žádné aplikace" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 009750cbe8..2f88537a63 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -33,10 +33,8 @@ "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" "%1$d i bredden og %2$d i højden" - - - - + "Tryk, og hold fingeren nede for at placere på startskærmen" + "Placer automatisk" "Søg i Apps" "Indlæser apps…" "Der blev ikke fundet nogen apps, som matcher \"%1$s\"" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index e28517b19a..96c761b003 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -33,10 +33,8 @@ "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" "%1$d breit und %2$d hoch" - - - - + "Zum Hinzufügen zum Startbildschirm gedrückt halten" + "Automatisch hinzufügen" "In Apps suchen" "Apps werden geladen..." "Keine Apps für \"%1$s\" gefunden" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 00be6b305b..9b3b8d159a 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -33,10 +33,8 @@ "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" "Πλάτος %1$d επί ύψος %2$d" - - - - + "Αγγίξτε παρατεταμένα για να το τοποθετήσετε στην αρχική οθόνη" + "Αυτόματη τοποθέτηση" "Αναζήτηση εφαρμογών" "Φόρτωση εφαρμογών…" "Δεν βρέθηκαν εφαρμογές για το ερώτημα \"%1$s\"" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 15e3b476b4..8b969b3bc3 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -33,10 +33,8 @@ "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "%1$d wide by %2$d high" - - - - + "Touch & hold to place on home screen" + "Place automatically" "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 15e3b476b4..8b969b3bc3 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -33,10 +33,8 @@ "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "%1$d wide by %2$d high" - - - - + "Touch & hold to place on home screen" + "Place automatically" "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 15e3b476b4..8b969b3bc3 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -33,10 +33,8 @@ "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "%1$d wide by %2$d high" - - - - + "Touch & hold to place on home screen" + "Place automatically" "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 791cf9854c..b358cc004a 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -33,10 +33,8 @@ "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" "%1$d de ancho por %2$d de alto" - - - - + "Mantén presionado para ubicarlo en la pantalla principal" + "Ubicar de manera automática" "Buscar aplicaciones" "Cargando aplicaciones…" "No hay aplicaciones que coincidan con %1$s." diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index da229d63e0..135023ce0d 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -33,10 +33,8 @@ "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" "%1$d de ancho por %2$d de alto" - - - - + "Mantén pulsado el elemento para añadirlo a la pantalla de inicio" + "Añadir automáticamente" "Busca aplicaciones" "Cargando aplicaciones…" "No se han encontrado aplicaciones que contengan \"%1$s\"" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 5b376ccf4a..5b738d48b4 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -33,10 +33,8 @@ "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" "%1$d lai ja %2$d kõrge" - - - - + "Puudutage pikalt avaekraanile paigutamiseks" + "Paiguta automaatselt" "Otsige rakendustest" "Rakenduste laadimine ..." "Päringule „%1$s” ei vastanud ükski rakendus" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index f6062db3a9..5d9afc1613 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -33,10 +33,8 @@ "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" "%1$d zabal eta %2$d luze" - - - - + "Eduki sakatuta jarri nahi duzun tokia hasierako pantailan" + "Jarri automatikoki" "Bilatu aplikazioetan" "Aplikazioak kargatzen…" "Ez da aurkitu \"%1$s\" bilaketarekin bat datorren aplikaziorik" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 5a29aaee6a..417e139579 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -33,10 +33,8 @@ "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" "‏%1$d عرض در %2$d طول" - - - - + "برای قرار دادن در صفحه اصلی لمس کنید و نگه‌دارید" + "افزودن خودکار" "جستجوی برنامه‌ها" "در حال بارگیری برنامه‌ها..." "هیچ برنامه‌ای مطابق با «%1$s» پیدا نشد" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index f0a12117e1..7de8412106 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -33,10 +33,8 @@ "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" "Leveys: %1$d, korkeus: %2$d" - - - - + "Sijoita aloitusnäytölle koskettamalla pitkään." + "Sijoita automaattisesti" "Sovellushaku" "Ladataan sovelluksia…" "”%1$s” ei palauttanut sovelluksia." diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 6509f2973f..ea588e8ffd 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -33,10 +33,8 @@ "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" "%1$d de largeur sur %2$d de hauteur" - - - - + "Maintenez le doigt sur l\'élément pour le placer sur l\'écran d\'accueil" + "Placer automatiquement" "Rechercher des applications" "Chargement des applications en cours..." "Aucune application trouvée correspondant à « %1$s »" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index d3a15b13c7..d72b5768ff 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -33,10 +33,8 @@ "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" "%1$d de largeur et %2$d de hauteur" - - - - + "Appuyez de manière prolongée pour placer l\'élément sur l\'écran d\'accueil" + "Placer automatiquement" "Rechercher dans les applications" "Chargement des applications en cours…" "Aucune application ne correspond à la requête \"%1$s\"." diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index b3e8a69058..e3e8282052 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -33,10 +33,8 @@ "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" "%1$d de largo por %2$d de alto" - - - - + "Mantén premido o elemento para colocalo na pantalla de inicio" + "Colocar automaticamente" "Aplicacións de busca" "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index d61df90598..66fdf0291d 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -33,10 +33,8 @@ "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" "%1$d પહોળાઈ X %2$d ઊંચાઈ" - - - - + "હોમ સ્ક્રીન પર મૂકવા માટે ટચ કરો અને પકડો" + "આપમેળે મૂકો" "શોધ ઍપ્લિકેશનો" "ઍપ્લિકેશનો લોડ કરી રહ્યું છે…" "\"%1$s\" થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 900ebb0cb6..aaed5721af 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -33,10 +33,8 @@ "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" "%1$d चौड़ाई गुणा %2$d ऊंचाई" - - - - + "होम स्क्रीन पर रखने के लिए स्पर्श करके रखें" + "अपने आप रखें" "ऐप्‍स खोजें" "ऐप्स लोड हो रहे हैं..." "\"%1$s\" से मिलान करने वाला कोई ऐप नहीं मिला" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index a74de331e8..6a22b371d7 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -33,10 +33,8 @@ "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" "%1$d širine i %2$d visine" - - - - + "Dodirnite i zadržite stavku da biste je postavili na početni zaslon" + "Postavi automatski" "Pretraži aplikacije" "Učitavanje aplikacija…" "Nema aplikacija podudarnih s upitom \"%1$s\"" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 633443379d..ff600250ea 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -33,10 +33,8 @@ "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" "%1$d széles és %2$d magas" - - - - + "Tartsa lenyomva, hogy elhelyezhesse a kezdőképernyőn" + "Automatikus elhelyezés" "Alkalmazások keresése" "Alkalmazások betöltése…" "Egy alkalmazás sem található a(z) „%1$s” lekérdezésre." diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index ea3b9dc520..63690bc398 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -33,10 +33,8 @@ "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" "Լայնությունը՝ %1$d, բարձրությունը՝ %2$d" - - - - + "Հպեք և պահեք՝ գլխավոր էկրանին ավելացնելու համար" + "Ավելացնել ավտոմատ կերպով" "Հավելվածների որոնում" "Հավելվածների բեռնում…" %1$s» հարցմանը համապատասխանող հավելվածներ չեն գտնվել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 4c826ea3cb..6e6a0d1ca1 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -33,10 +33,8 @@ "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" "lebar %1$d x tinggi %2$d" - - - - + "Sentuh & tahan untuk ditempatkan di layar utama" + "Tempatkan otomatis" "Telusuri Apps" "Memuat Aplikasi..." "Tidak ditemukan Aplikasi yang cocok dengan \"%1$s\"" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 186c174b7d..4b034c89e8 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -33,10 +33,8 @@ "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" "%1$d á breidd og %2$d á hæð" - - - - + "Haltu inni til að setja á heimaskjáinn" + "Staðsetja sjálfkrafa" "Leita í forritum" "Hleður forrit…" "Ekki fundust forrit sem samsvara „%1$s“" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 6b44c5b812..ffc640576e 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -33,10 +33,8 @@ "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" "%1$d di larghezza per %2$d di altezza" - - - - + "Tieni premuto per posizionare l\'elemento nella schermata Home" + "Posiziona automaticamente" "Cerca app" "Caricamento di app…" "Nessuna app trovata corrispondente a \"%1$s\"" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index e28fb9f3a9..a92447f8d0 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -33,10 +33,8 @@ "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" "‏רוחב %1$d על גובה %2$d" - - - - + "גע והחזק כדי למקם במסך דף הבית" + "מקם אוטומטית" "חפש אפליקציות" "טוען אפליקציות…" "לא נמצאו אפליקציות התואמות ל-\"%1$s\"" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index fc058e49a9..0b3f57bb25 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -33,10 +33,8 @@ "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" "幅 %1$d、高さ %2$d" - - - - + "押し続けると、ホーム画面に追加できます" + "自動的に追加" "アプリを検索" "アプリを読み込んでいます…" "「%1$s」に一致するアプリは見つかりませんでした" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index f2c480d72d..57ec4ffe75 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -33,10 +33,8 @@ "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" "სიგრძე: %1$d, სიგანე: %2$d" - - - - + "ხანგრძლივად შეეხეთ მთავარ ეკრანზე განსათავსებლად" + "ავტომატურად განთავსება" "აპების ძიება" "აპები იტვირთება..." "„%1$s“-ის თანხვედრი აპები არ მოიძებნა" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 1919ac193f..2a8362b8dd 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -33,10 +33,8 @@ "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" "Ені: %1$d, биіктігі: %2$d" - - - - + "Басып тұрып, негізгі экранда қойылатын жерге апарыңыз" + "Автоматты қою" "Қолданбаларды іздеу" "Қолданбалар жүктелуде…" %1$s» сұрауына сәйкес келетін қолданбалар жоқ" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 40f47021bd..373fab6259 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -33,10 +33,8 @@ "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" "ទទឺង %1$d គុណនឹងកម្ពស់ %2$d" - - - - + "សង្កត់​ឲ្យជាប់​ដើម្បី​ដាក់វា​នៅលើ​អេក្រង់​ដើម" + "ដាក់​ដោយ​ស្វ័យប្រវត្តិ" "ស្វែងរកកម្មវិធី" "កំពុងដំណើរការកម្មវិធី..." "គ្មានកម្មវិធីដែលត្រូវជាមួយ \"%1$s\" ទេ" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 1c29c745d2..437f194933 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -33,10 +33,8 @@ "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" "%1$d ಅಗಲ ಮತ್ತು %2$d ಎತ್ತರ" - - - - + "ಮುಖಪುಟ ಪರದೆಯ ಮೇಲೆ ಇಡಲು ಟಚ್ ಮಾಡಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ" + "ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಇಡಿ" "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." "\"%1$s\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index cede509c92..9540a252c5 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -33,10 +33,8 @@ "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" "너비 %1$d, 높이 %2$d" - - - - + "길게 터치하여 홈 화면에 추가" + "자동으로 추가" "앱 검색" "앱 로드 중..." "\'%1$s\'와(과) 일치하는 앱이 없습니다." diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 8e02c3b70c..bfdb052ac4 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -33,10 +33,8 @@ "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" "Туурасы: %1$d, бийиктиги: %2$d" - - - - + "Басып туруп, башкы экранга сүйрөп барып, таштаңыз" + "Автоматтык түрдө жайгаштыруу" "Колдонмолорду издөө" "Колдонмолор жүктөлүүдө…" "\"%1$s\" дал келген колдонмолор табылган жок" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 3d39ccf9c7..9fd29ded9d 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -33,10 +33,8 @@ "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" "ກວ້າງ %1$d ຄູນສູງ %2$d" - - - - + "ແຕະຄ້າງໄວ້ເພື່ອວາງໄວ້ໜ້າຫຼັກ" + "ວາງອັດຕະໂນມັດ" "ຊອກຫາແອັບ" "​ກຳ​ລັງ​ໂຫລດ​ແອັບ..." "ບໍ່​ພົບ​ແອັບ​ໃດ​ທີ່​ກົງ​ກັນ \"%1$s\"" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 3f075fb4f4..8c6c5439b2 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -33,10 +33,8 @@ "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" "%1$d plotis ir %2$d aukštis" - - - - + "Palieskite ir palaikykite, kad padėtumėte pagrindiniame ekrane" + "Padėti automatiškai" "Ieškoti programų" "Įkeliamos programos..." "Nerasta jokių užklausą „%1$s“ atitinkančių programų" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 57f5f78f9f..7b4c23634f 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -33,10 +33,8 @@ "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" "%1$d plats un %2$d augsts" - - - - + "Sākuma ekrānā pieskarieties kādai vietai un turiet" + "Novietot automātiski" "Meklēt lietotnes" "Notiek lietotņu ielāde…" "Vaicājumam “%1$s” neatbilda neviena lietotne." diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index f82b39a480..b6f24cfbf0 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -33,10 +33,8 @@ "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" "%1$d широк на %2$d висок" - - - - + "Допрете и задржете за да поставите на почетниот екран" + "Постави автоматски" "Пребарување апликации" "Се вчитуваат апликации…" "Не се најдени апликации што одговараат на „%1$s“" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index d1185c12d7..4d435c0e53 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -33,10 +33,8 @@ "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" "%1$d വീതിയും %2$d ഉയരവും" - - - - + "ഹോം സ്‌ക്രീനിൽ ‌സ്ഥാപിക്കാൻ സ്‌പർശിച്ച് ‌പിടിക്കുക" + "സ്വയമേവ ‌സ്ഥാപിക്കുക" "ആപ്പുകളെ തിരയുക" "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 7b70aaeb3a..718b92085e 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -33,10 +33,8 @@ "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" "%1$d өргөн %2$d өндөр" - - - - + "Нүүр дэлгэцэд байршуулахын тулд дараад, хүлээнэ үү" + "Автоматаар байршуулах" "Апп хайх" "Аппликейшныг ачаалж байна..." "\"%1$s\"-д нийцэх апп олдсонгүй" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index c8e6377809..ba2e07db33 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -33,10 +33,8 @@ "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" "%1$d रूंद बाय %2$d उंच" - - - - + "मुख्यपृष्ठावर ठेवण्यासाठी स्पर्श करा आणि धरून ठेवा" + "स्वयंचलितपणे ठेवा" "अॅप्स शोधा" "अॅप्स लोड करीत आहे..." "\"%1$s\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 45410f327a..18dbcff5c5 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -33,10 +33,8 @@ "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" "Lebar %1$d kali tinggi %2$d" - - - - + "Sentuh & tahan untuk meletakkan pada skrin utama" + "Letakkan secara automatik" "Cari Apl" "Memuatkan Apl…" "Tiada Apl yang ditemui sepadan dengan \"%1$s\"" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index e79ff88f16..df0d2b00f4 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -33,10 +33,8 @@ "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" "အလျား %1$d နှင့် အမြင့် %2$d" - - - - + "ပင်မစာမျက်နှာတွင် ထားရန် ထိပြီး ဖိထားပါ" + "အလိုအလျောက် ထားရန်" "ရှာဖွေမှု အက်ပ်များ" "အက်ပ်များ ရယူနေစဉ်..." "\"%1$s\" နှင့်ကိုက်ညီသည့် အပ်ဖ်များမတွေ့ပါ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 591c626690..5f428907bd 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -33,10 +33,8 @@ "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" "%1$d bredde x %2$d høyde" - - - - + "Trykk og hold for å plassere på startskjermen" + "Plassér automatisk" "Søk i apper" "Laster inn apper …" "Fant ingen apper som samsvarer med «%1$s»" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 91b1e1b8f1..9670c6198d 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -33,10 +33,8 @@ "विजेटलाई छान्न वा आफू अनुकूल कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" "%1$d चौडाइ गुणा %2$d उचाइ" - - - - + "गृह स्क्रिनमा राख्न छुनुहोस् र थिची राख्नुहोस्‌" + "स्वतः राख्नुहोस्" "अनुप्रयोगहरू खोज्नुहोस्" "अनुप्रयोगहरू लोड गरिँदै..." "\"%1$s\" सँग मिल्दो कुनै अनुप्रयोगहरू फेला परेनन्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 4223743c99..80a5a9c372 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -33,10 +33,8 @@ "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" "%1$d breed en %2$d hoog" - - - - + "Tik op een item en houd dit vast om het op het startscherm te plaatsen" + "Automatisch plaatsen" "Apps zoeken" "Apps laden…" "Er zijn geen apps gevonden die overeenkomen met \'%1$s\'" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index c1192c5a60..87ebf9ce7e 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -33,10 +33,8 @@ "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" "%1$d ਚੌੜਾਈ ਅਤੇ %2$d ਲੰਬਾਈ" - - - - + "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਰੱਖਣ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ" + "ਸਵੈਚਲਿਤ ਤਰੀਕੇ ਨਾਲ ਰੱਖੋ" "ਐਪਸ ਖੋਜੋ" "ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..." "\"%1$s\" ਨਾਲ ਮਿਲਦੀਆਂ ਕੋਈ ਵੀ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index ed60ee395c..a7edf72e8c 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -33,10 +33,8 @@ "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" "Szerokość %1$d, wysokość %2$d" - - - - + "Kliknij i przytrzymaj, by umieścić na ekranie głównym" + "Umieść automatycznie" "Szukaj w aplikacjach" "Wczytuję aplikacje…" "Nie znaleziono aplikacji pasujących do zapytania „%1$s”" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 37e16aa3c8..d06702b20c 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -33,10 +33,8 @@ "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" "%1$d de largura por %2$d de altura" - - - - + "Toque sem soltar para colocar no ecrã principal" + "Colocar automaticamente" "Pesquisar aplicações" "A carregar aplicações..." "Não foram encontradas aplic. que correspondam a \"%1$s\"" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index b142e6cacf..60bfbf6258 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -33,10 +33,8 @@ "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" "%1$d de largura por %2$d de altura" - - - - + "Toque e mantenha-o pressionado para posicionar na tela inicial" + "Posicionar automaticamente" "Pesquisar apps" "Carregando apps…" "Nenhum app encontrado que corresponda a \"%1$s\"" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 3d92993cf9..2b63ef38a4 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -33,10 +33,8 @@ "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" "%1$d lățime și %2$d înălțime" - - - - + "Atingeți lung pentru a plasa pe ecranul de pornire" + "Plasare automată" "Căutați aplicații" "Se încarcă aplicațiile..." "Nu s-a găsit nicio aplicație pentru „%1$s”" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 0e2fc96156..fa523d3151 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -33,10 +33,8 @@ "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" "Ширина %1$d, высота %2$d" - - - - + "Нажмите и удерживайте, чтобы добавить на главный экран" + "Добавить на главный экран автоматически" "Поиск приложений" "Загрузка…" "По запросу \"%1$s\" ничего не найдено" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 5bfd10c0ed..6ea617fd45 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -33,10 +33,8 @@ "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" "පළල %1$d උස %2$d" - - - - + "මුල් පිටු තිරයෙහි තැබීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න" + "ස්වයංක්‍රියව තබන්න" "යෙදුම් සෙවීම" "යෙදුම් පූරණය වෙමින්…" "\"%1$s\" සමග ගැළපෙන යෙදුම් හමු නොවිණි" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index cc956768b7..90e81807ca 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -33,10 +33,8 @@ "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" "šírka %1$d, výška %2$d" - - - - + "Klepnutím a podržaním umiestníte na plochu" + "Umiestniť automaticky" "Hľadať aplikácie" "Načítavajú sa aplikácie..." "Nenašli sa žiadne aplikácie zodpovedajúce dopytu %1$s" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 4bbefaa07a..f4cb4ae6df 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -33,10 +33,8 @@ "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" "Širina %1$d, višina %2$d" - - - - + "Dotaknite se elementa in ga pridržite, da ga postavite na začetni zaslon" + "Postavi samodejno" "Iskanje po aplikacijah" "Nalaganje aplikacij …" "Ni aplikacij, ki bi ustrezale poizvedbi »%1$s«" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 2c6c8d6f34..d8f025a66f 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -33,10 +33,8 @@ "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" "%1$d i gjerë me %2$d i lartë" - - - - + "Prek dhe mbaj të shtypur për të vendosur në ekranin bazë" + "Vendos automatikisht" "Kërko për aplikacione" "Po ngarkon aplikacionet..." "Nuk u gjet asnjë aplikacion që përputhet me \"%1$s\"" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 086b9fa5bf..924df7f125 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -33,10 +33,8 @@ "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" "ширина од %1$d и висина од %2$d" - - - - + "Додирните и задржите да бисте поставили на почетни екран" + "Постави аутоматски" "Претражите апликације" "Апликације се учитавају..." "Није пронађена ниједна апликација за „%1$s“" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 255381a6a6..a77a4021c5 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -33,10 +33,8 @@ "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" "%1$d bred gånger %2$d hög" - - - - + "Placera på startskärmen genom att trycka länge" + "Placera automatiskt" "Sök efter appar" "Läser in appar …" "Det gick inte att hitta några appar som matchar %1$s" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 76a14871c6..1eda703ca1 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -33,10 +33,8 @@ "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" "Upana wa %1$d na kimo cha %2$d" - - - - + "Gusa na ushikilie ili uweke kwenye skrini ya kwanza" + "Weka kiotomatiki" "Tafuta Programu" "Inapakia Programu..." "Haikupata programu zinazolingana na \"%1$s\"" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 49658dd261..f2d3e09c30 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -33,10 +33,8 @@ "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" "%1$d அகலத்திற்கு %2$d உயரம்" - - - - + "முகப்புத் திரையில் சேர்க்க, அதைத் தொட்டுப் பிடித்திருக்கவும்" + "தானாகவே சேர்" "பயன்பாடுகளில் தேடுக" "பயன்பாடுகளை ஏற்றுகிறது..." "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index f42309d6a0..668710fd49 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -33,10 +33,8 @@ "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" "%1$d వెడల్పు X %2$d ఎత్తు" - - - - + "హోమ్ స్క్రీన్‌లో ఉంచడానికి నొక్కి & పట్టుకోండి" + "స్వయంచాలకంగా ఉంచండి" "అనువర్తనాలను శోధించండి" "అనువర్తనాలను లోడ్ చేస్తోంది…" "\"%1$s\"కి సరిపోలే అనువర్తనాలేవీ కనుగొనబడలేదు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index ef6766042b..0e3fea16f2 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -33,10 +33,8 @@ "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" "กว้าง %1$d x สูง %2$d" - - - - + "แตะค้างไว้เพื่อวางบนหน้าจอหลัก" + "วางโดยอัตโนมัติ" "ค้นหาแอป" "กำลังโหลดแอป…" "ไม่พบแอปที่ตรงกับ \"%1$s\"" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 50b0df36ed..172f855862 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -33,10 +33,8 @@ "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" "%1$d ang lapad at %2$d ang taas" - - - - + "Pindutin nang matagal upang ilagay sa home screen" + "Awtomatikong ilagay" "Mga App sa Paghahanap" "Nilo-load ang Mga App…" "Walang nakitang Mga App na tumutugma sa \"%1$s\"" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 296de0f754..b8a02efdbe 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -33,10 +33,8 @@ "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" "genişlik: %1$d, yükseklik: %2$d" - - - - + "Ana ekrana yerleştirmek için dokunun ve basılı tutun" + "Otomatik olarak yerleştir" "Uygulamalarda Ara" "Uygulamalar Yükleniyor…" "\"%1$s\" ile eşleşen uygulama bulunamadı" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 0d6c6bc90f..1e5c42aec7 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -33,10 +33,8 @@ "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" "Ширина – %1$d, висота – %2$d" - - - - + "Натисніть і утримуйте, щоб додати на головний екран" + "Додати автоматично" "Пошук додатків" "Завантаження додатків…" "Немає додатків для запиту \"%1$s\"" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index e7a1af8c7e..3508d5bef3 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -33,10 +33,8 @@ "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" "‏%1$d چوڑا اور ‎%2$d اونچا" - - - - + "ہوم اسکرین پر رکھنے کیلئے ٹچ کریں اور دبائے رکھیں" + "خودکار طور پر رکھیں" "ایپس تلاش کریں" "ایپس لوڈ ہو رہی ہیں…" "\"%1$s\" سے مماثل کوئی ایپس نہیں ملیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 0f8535392f..af6eabd4ae 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -33,10 +33,8 @@ "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" "Eni %1$d, bo‘yi %2$d" - - - - + "Bosh ekranga chiqarish uchun bosib turing" + "Avtomatik joylashtirish" "Ilovalar ichidan qidirish" "Ilovalar yuklanmoqda…" "“%1$s” so‘rovi bo‘yicha hech narsa topilmadi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index d83ba5467a..dcaf872727 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -33,10 +33,8 @@ "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" "Rộng %1$d x cao %2$d" - - - - + "Chạm và giữ để đặt lên màn hình chính" + "Tự động đặt" "Tìm kiếm ứng dụng" "Đang tải ứng dụng..." "Không tìm thấy ứng dụng nào phù hợp với \"%1$s\"" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index c037948417..09b89669b9 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -33,10 +33,8 @@ "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" "宽 %1$d,高 %2$d" - - - - + "触摸并按住即可放在主屏幕上" + "自动放置" "搜索应用" "正在加载应用…" "未找到与“%1$s”相符的应用" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 15a62e5833..61138c6b78 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -33,10 +33,8 @@ "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" "%1$d 闊,%2$d 高" - - - - + "輕觸並按住即可放在主畫面上" + "自動放置" "搜尋應用程式" "正在載入應用程式…" "無法找到與「%1$s」相符的應用程式" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 3d77283341..a54671b657 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -33,10 +33,8 @@ "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" "寬度為 %1$d,高度為 %2$d" - - - - + "按住即可放在主螢幕上" + "自動放置" "搜尋應用程式" "正在載入應用程式…" "找不到符合「%1$s」的應用程式" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index edbb64dd6e..9c0c7e84ef 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -33,10 +33,8 @@ "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" "%1$d ububanzi ngokungu-%2$d ukuya phezulu" - - - - + "Thinta uphinde ubambe ukuze ubeke kusikrini sasekhaya" + "Beka ngokuzenzakalela" "Sesha Izinhlelo Zokusebenza" "Ilayisha izinhlelo zokusebenza..." "Azikho izinhlelo zokusebenza ezitholakele ezifana ne-\"%1$s\"" From 655ec42ce50e18f2ce597901707057b5898e110a Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 7 Feb 2017 11:40:22 -0800 Subject: [PATCH 003/446] Added FolderIconPreviewVerifier class. This class verifies whether an item in a Foder is displayed in the FolderIcon preview, based on the item's rank. We use this class to determine which items in a Folder will be displayed in the preview. Bug: 35064148 Change-Id: Ia21bccbd95c348efeac62591ae3696a4c60b5339 --- src/com/android/launcher3/LauncherModel.java | 19 ++++-- .../folder/ClippedFolderIconLayoutRule.java | 20 ------ .../android/launcher3/folder/FolderIcon.java | 23 ++++++- .../folder/FolderIconPreviewVerifier.java | 64 ++++++++++++++++++ .../launcher3/folder/FolderPagedView.java | 65 ++++++++++++------- .../folder/StackFolderIconLayoutRule.java | 6 -- 6 files changed, 139 insertions(+), 58 deletions(-) create mode 100644 src/com/android/launcher3/folder/FolderIconPreviewVerifier.java diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 8c90c2cb15..845fdbfebc 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -48,6 +48,7 @@ import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dynamicui.ExtractionUtils; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.folder.FolderIconPreviewVerifier; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.AddWorkspaceItemsTask; @@ -1260,17 +1261,23 @@ public class LauncherModel extends BroadcastReceiver } } - // Sort all the folder items and make sure the first 3 items are high resolution. + FolderIconPreviewVerifier verifier = + new FolderIconPreviewVerifier(mApp.getInvariantDeviceProfile()); + // Sort the folder items and make sure all items in the preview are high resolution. for (FolderInfo folder : sBgDataModel.folders) { Collections.sort(folder.contents, Folder.ITEM_POS_COMPARATOR); - int pos = 0; + verifier.setFolderInfo(folder); + + int numItemsInPreview = 0; for (ShortcutInfo info : folder.contents) { - if (info.usingLowResIcon && - info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { + if (info.usingLowResIcon + && info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION + && verifier.isItemInPreview(info.rank)) { mIconCache.getTitleAndIcon(info, false); + numItemsInPreview++; } - pos ++; - if (pos >= FolderIcon.NUM_ITEMS_IN_PREVIEW) { + + if (numItemsInPreview >= FolderIcon.NUM_ITEMS_IN_PREVIEW) { break; } } diff --git a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java index 840fcf5fe1..194a62fe4e 100644 --- a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java +++ b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java @@ -129,24 +129,4 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule public boolean clipToBackground() { return true; } - - @Override - public List getItemsToDisplay(Folder folder) { - List items = new ArrayList<>(folder.getItemsInReadingOrder()); - int numItems = items.size(); - if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION && numItems > MAX_NUM_ITEMS_IN_PREVIEW) { - // We match the icons in the preview with the layout of the opened folder (b/27944225), - // but we still need to figure out how we want to handle updating the preview when the - // upper left quadrant changes. - int appsPerRow = folder.mContent.getPageAt(0).getCountX(); - int appsToDelete = appsPerRow - MAX_NUM_ITEMS_PER_ROW; - - // We only display the upper left quadrant. - while (appsToDelete > 0) { - items.remove(MAX_NUM_ITEMS_PER_ROW); - appsToDelete--; - } - } - return items.subList(0, Math.min(numItems, MAX_NUM_ITEMS_IN_PREVIEW)); - } } diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index fce902e495..5ba2f79c48 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -121,6 +121,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { private float mSlop; + FolderIconPreviewVerifier mPreviewVerifier; private PreviewItemDrawingParams mTmpParams = new PreviewItemDrawingParams(0, 0, 0, 0); private ArrayList mDrawingParams = new ArrayList(); private Drawable mReferenceDrawable = null; @@ -222,6 +223,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { private void setFolder(Folder folder) { mFolder = folder; + mPreviewVerifier = new FolderIconPreviewVerifier(mLauncher.getDeviceProfile().inv); updateItemDrawingParams(false); } @@ -933,8 +935,26 @@ public class FolderIcon extends FrameLayout implements FolderListener { return mFolderName.getVisibility() == VISIBLE; } + private List getItemsToDisplay() { + mPreviewVerifier.setFolderInfo(mFolder.getInfo()); + + List itemsToDisplay = new ArrayList<>(); + List allItems = mFolder.getItemsInReadingOrder(); + int numItems = allItems.size(); + for (int rank = 0; rank < numItems; ++rank) { + if (mPreviewVerifier.isItemInPreview(rank)) { + itemsToDisplay.add(allItems.get(rank)); + } + + if (itemsToDisplay.size() == FolderIcon.NUM_ITEMS_IN_PREVIEW) { + break; + } + } + return itemsToDisplay; + } + private void updateItemDrawingParams(boolean animate) { - List items = mPreviewLayoutRule.getItemsToDisplay(mFolder); + List items = getItemsToDisplay(); int nItemsInPreview = items.size(); int prevNumItems = mDrawingParams.size(); @@ -1120,6 +1140,5 @@ public class FolderIcon extends FrameLayout implements FolderListener { float scaleForItem(int index, int totalNumItems); int maxNumItems(); boolean clipToBackground(); - List getItemsToDisplay(Folder folder); } } diff --git a/src/com/android/launcher3/folder/FolderIconPreviewVerifier.java b/src/com/android/launcher3/folder/FolderIconPreviewVerifier.java new file mode 100644 index 0000000000..de962b021d --- /dev/null +++ b/src/com/android/launcher3/folder/FolderIconPreviewVerifier.java @@ -0,0 +1,64 @@ +/* + * 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. + */ + +package com.android.launcher3.folder; + +import com.android.launcher3.FolderInfo; +import com.android.launcher3.InvariantDeviceProfile; +import com.android.launcher3.config.FeatureFlags; + +/** + * Verifies whether an item in a Folder is displayed in the FolderIcon preview. + */ +public class FolderIconPreviewVerifier { + + private final int mMaxGridCountX; + private final int mMaxGridCountY; + private final int mMaxItemsPerPage; + private final int[] mGridSize = new int[2]; + + private int mGridCountX; + private boolean mDisplayingUpperLeftQuadrant = false; + + public FolderIconPreviewVerifier(InvariantDeviceProfile profile) { + mMaxGridCountX = profile.numFolderColumns; + mMaxGridCountY = profile.numFolderRows; + mMaxItemsPerPage = mMaxGridCountX * mMaxGridCountY; + } + + public void setFolderInfo(FolderInfo info) { + int numItemsInFolder = info.contents.size(); + mDisplayingUpperLeftQuadrant = FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION + && !FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON + && numItemsInFolder > FolderIcon.NUM_ITEMS_IN_PREVIEW; + + if (mDisplayingUpperLeftQuadrant) { + FolderPagedView.calculateGridSize(info.contents.size(), 0, 0, mMaxGridCountX, + mMaxGridCountY, mMaxItemsPerPage, mGridSize); + mGridCountX = mGridSize[0]; + } + } + + public boolean isItemInPreview(int rank) { + if (mDisplayingUpperLeftQuadrant) { + // Returns true iff the icon is in the 2x2 upper left quadrant of the Folder. + int col = rank % mGridCountX; + int row = rank / mGridCountX; + return col < 2 && row < 2; + } + return rank < FolderIcon.NUM_ITEMS_IN_PREVIEW; + } +} diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index eecce183a6..f29fb9a05b 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -42,7 +42,6 @@ import com.android.launcher3.ShortcutAndWidgetContainer; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace.ItemOperator; -import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.pageindicators.PageIndicator; import com.android.launcher3.util.Themes; @@ -68,7 +67,7 @@ public class FolderPagedView extends PagedView { */ private static final float SCROLL_HINT_FRACTION = 0.07f; - private static final int[] sTempPosArray = new int[2]; + private static final int[] sTmpArray = new int[2]; public final boolean mIsRtl; @@ -120,40 +119,58 @@ public class FolderPagedView extends PagedView { } /** - * Sets up the grid size such that {@param count} items can fit in the grid. + * Calculates the grid size such that {@param count} items can fit in the grid. * The grid size is calculated such that countY <= countX and countX = ceil(sqrt(count)) while * maintaining the restrictions of {@link #mMaxCountX} & {@link #mMaxCountY}. */ - private void setupContentDimensions(int count) { - mAllocatedContentSize = count; + public static void calculateGridSize(int count, int countX, int countY, int maxCountX, + int maxCountY, int maxItemsPerPage, int[] out) { boolean done; - if (count >= mMaxItemsPerPage) { - mGridCountX = mMaxCountX; - mGridCountY = mMaxCountY; + int gridCountX = countX; + int gridCountY = countY; + + if (count >= maxItemsPerPage) { + gridCountX = maxCountX; + gridCountY = maxCountY; done = true; } else { done = false; } while (!done) { - int oldCountX = mGridCountX; - int oldCountY = mGridCountY; - if (mGridCountX * mGridCountY < count) { + int oldCountX = gridCountX; + int oldCountY = gridCountY; + if (gridCountX * gridCountY < count) { // Current grid is too small, expand it - if ((mGridCountX <= mGridCountY || mGridCountY == mMaxCountY) && mGridCountX < mMaxCountX) { - mGridCountX++; - } else if (mGridCountY < mMaxCountY) { - mGridCountY++; + if ((gridCountX <= gridCountY || gridCountY == maxCountY) + && gridCountX < maxCountX) { + gridCountX++; + } else if (gridCountY < maxCountY) { + gridCountY++; } - if (mGridCountY == 0) mGridCountY++; - } else if ((mGridCountY - 1) * mGridCountX >= count && mGridCountY >= mGridCountX) { - mGridCountY = Math.max(0, mGridCountY - 1); - } else if ((mGridCountX - 1) * mGridCountY >= count) { - mGridCountX = Math.max(0, mGridCountX - 1); + if (gridCountY == 0) gridCountY++; + } else if ((gridCountY - 1) * gridCountX >= count && gridCountY >= gridCountX) { + gridCountY = Math.max(0, gridCountY - 1); + } else if ((gridCountX - 1) * gridCountY >= count) { + gridCountX = Math.max(0, gridCountX - 1); } - done = mGridCountX == oldCountX && mGridCountY == oldCountY; + done = gridCountX == oldCountX && gridCountY == oldCountY; } + out[0] = gridCountX; + out[1] = gridCountY; + } + + /** + * Sets up the grid size such that {@param count} items can fit in the grid. + */ + public void setupContentDimensions(int count) { + mAllocatedContentSize = count; + calculateGridSize(count, mGridCountX, mGridCountY, mMaxCountX, mMaxCountY, mMaxItemsPerPage, + sTmpArray); + mGridCountX = sTmpArray[0]; + mGridCountY = sTmpArray[1]; + // Update grid size for (int i = getPageCount() - 1; i >= 0; i--) { getPageAt(i).setGridSize(mGridCountX, mGridCountY); @@ -400,12 +417,12 @@ public class FolderPagedView extends PagedView { public int findNearestArea(int pixelX, int pixelY) { int pageIndex = getNextPage(); CellLayout page = getPageAt(pageIndex); - page.findNearestArea(pixelX, pixelY, 1, 1, sTempPosArray); + page.findNearestArea(pixelX, pixelY, 1, 1, sTmpArray); if (mFolder.isLayoutRtl()) { - sTempPosArray[0] = page.getCountX() - sTempPosArray[0] - 1; + sTmpArray[0] = page.getCountX() - sTmpArray[0] - 1; } return Math.min(mAllocatedContentSize - 1, - pageIndex * mMaxItemsPerPage + sTempPosArray[1] * mGridCountX + sTempPosArray[0]); + pageIndex * mMaxItemsPerPage + sTmpArray[1] * mGridCountX + sTmpArray[0]); } public boolean isFull() { diff --git a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java index 297203ae20..1f4e648138 100644 --- a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java +++ b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java @@ -98,10 +98,4 @@ public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { public boolean clipToBackground() { return false; } - - @Override - public List getItemsToDisplay(Folder folder) { - List items = folder.getItemsInReadingOrder(); - return items.subList(0, Math.min(items.size(), MAX_NUM_ITEMS_IN_PREVIEW)); - } } From fc0ce83745ea40d03b312eade8a88a07ed990030 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 28 Feb 2017 15:10:10 -0800 Subject: [PATCH 004/446] Prepare Folder for new Folder animation implementation. Refactored animator logic to separate methods, so that it is easier to swap out implementation with the LAUNCHER3_NEW_FOLDER_ANIMATION flag. ie. AnimatorSet anim = LAUNCHER3_NEW_FOLDER_ANIMATION ? getNewOpeningAnimatorSet() : getOpeningAnimatorSet(); Bug: 35064148 Change-Id: I32a646aaed5081438d7a733dc3e7cceb484998ab --- src/com/android/launcher3/folder/Folder.java | 121 +++++++++++-------- 1 file changed, 69 insertions(+), 52 deletions(-) diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 3d2ffb4ff0..763ab96f32 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -66,6 +66,7 @@ import com.android.launcher3.UninstallDropTarget.DropTargetSource; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace.ItemOperator; import com.android.launcher3.accessibility.AccessibleDragListenerAdapter; +import com.android.launcher3.anim.AnimationLayerSet; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dragndrop.DragController; @@ -510,6 +511,58 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mState = STATE_SMALL; } + private AnimatorSet getOpeningAnimatorSet() { + AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); + + int width = getFolderWidth(); + int height = getFolderHeight(); + + float transX = - 0.075f * (width / 2 - getPivotX()); + float transY = - 0.075f * (height / 2 - getPivotY()); + setTranslationX(transX); + setTranslationY(transY); + PropertyValuesHolder tx = PropertyValuesHolder.ofFloat(TRANSLATION_X, transX, 0); + PropertyValuesHolder ty = PropertyValuesHolder.ofFloat(TRANSLATION_Y, transY, 0); + + Animator drift = ObjectAnimator.ofPropertyValuesHolder(this, tx, ty); + drift.setDuration(mMaterialExpandDuration); + drift.setStartDelay(mMaterialExpandStagger); + drift.setInterpolator(new LogDecelerateInterpolator(100, 0)); + + int rx = (int) Math.max(Math.max(width - getPivotX(), 0), getPivotX()); + int ry = (int) Math.max(Math.max(height - getPivotY(), 0), getPivotY()); + float radius = (float) Math.hypot(rx, ry); + + Animator reveal = new CircleRevealOutlineProvider((int) getPivotX(), + (int) getPivotY(), 0, radius).createRevealAnimator(this); + reveal.setDuration(mMaterialExpandDuration); + reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); + + mContent.setAlpha(0f); + Animator iconsAlpha = ObjectAnimator.ofFloat(mContent, "alpha", 0f, 1f); + iconsAlpha.setDuration(mMaterialExpandDuration); + iconsAlpha.setStartDelay(mMaterialExpandStagger); + iconsAlpha.setInterpolator(new AccelerateInterpolator(1.5f)); + + mFooter.setAlpha(0f); + Animator textAlpha = ObjectAnimator.ofFloat(mFooter, "alpha", 0f, 1f); + textAlpha.setDuration(mMaterialExpandDuration); + textAlpha.setStartDelay(mMaterialExpandStagger); + textAlpha.setInterpolator(new AccelerateInterpolator(1.5f)); + + anim.play(drift); + anim.play(iconsAlpha); + anim.play(textAlpha); + anim.play(reveal); + + AnimationLayerSet layerSet = new AnimationLayerSet(); + layerSet.addView(mContent); + layerSet.addView(mFooter); + anim.addListener(layerSet); + + return anim; + } + /** * Opens the user folder described by the specified tag. The opening of the folder * is animated relative to the specified View. If the View is null, no animation @@ -554,55 +607,10 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mFolderIcon.growAndFadeOut(); - AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); - int width = getFolderWidth(); - int height = getFolderHeight(); - - float transX = - 0.075f * (width / 2 - getPivotX()); - float transY = - 0.075f * (height / 2 - getPivotY()); - setTranslationX(transX); - setTranslationY(transY); - PropertyValuesHolder tx = PropertyValuesHolder.ofFloat(TRANSLATION_X, transX, 0); - PropertyValuesHolder ty = PropertyValuesHolder.ofFloat(TRANSLATION_Y, transY, 0); - - Animator drift = ObjectAnimator.ofPropertyValuesHolder(this, tx, ty); - drift.setDuration(mMaterialExpandDuration); - drift.setStartDelay(mMaterialExpandStagger); - drift.setInterpolator(new LogDecelerateInterpolator(100, 0)); - - int rx = (int) Math.max(Math.max(width - getPivotX(), 0), getPivotX()); - int ry = (int) Math.max(Math.max(height - getPivotY(), 0), getPivotY()); - float radius = (float) Math.hypot(rx, ry); - - Animator reveal = new CircleRevealOutlineProvider((int) getPivotX(), - (int) getPivotY(), 0, radius).createRevealAnimator(this); - reveal.setDuration(mMaterialExpandDuration); - reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); - - mContent.setAlpha(0f); - Animator iconsAlpha = ObjectAnimator.ofFloat(mContent, "alpha", 0f, 1f); - iconsAlpha.setDuration(mMaterialExpandDuration); - iconsAlpha.setStartDelay(mMaterialExpandStagger); - iconsAlpha.setInterpolator(new AccelerateInterpolator(1.5f)); - - mFooter.setAlpha(0f); - Animator textAlpha = ObjectAnimator.ofFloat(mFooter, "alpha", 0f, 1f); - textAlpha.setDuration(mMaterialExpandDuration); - textAlpha.setStartDelay(mMaterialExpandStagger); - textAlpha.setInterpolator(new AccelerateInterpolator(1.5f)); - - anim.play(drift); - anim.play(iconsAlpha); - anim.play(textAlpha); - anim.play(reveal); - - mContent.setLayerType(LAYER_TYPE_HARDWARE, null); - mFooter.setLayerType(LAYER_TYPE_HARDWARE, null); + AnimatorSet anim = getOpeningAnimatorSet(); onCompleteRunnable = new Runnable() { @Override public void run() { - mContent.setLayerType(LAYER_TYPE_NONE, null); - mFooter.setLayerType(LAYER_TYPE_NONE, null); mLauncher.getUserEventDispatcher().resetElapsedContainerMillis(); } }; @@ -715,12 +723,22 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC parent.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } + private AnimatorSet getClosingAnimatorSet() { + AnimatorSet animatorSet = LauncherAnimUtils.createAnimatorSet(); + animatorSet.play(LauncherAnimUtils.ofViewAlphaAndScale(this, 0, 0.9f, 0.9f)); + + AnimationLayerSet layerSet = new AnimationLayerSet(); + layerSet.addView(this); + animatorSet.addListener(layerSet); + + return animatorSet; + } + private void animateClosed() { - final ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale(this, 0, 0.9f, 0.9f); - oa.addListener(new AnimatorListenerAdapter() { + AnimatorSet a = getClosingAnimatorSet(); + a.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - setLayerType(LAYER_TYPE_NONE, null); closeComplete(true); } @Override @@ -732,9 +750,8 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mState = STATE_ANIMATING; } }); - oa.setDuration(mExpandDuration); - setLayerType(LAYER_TYPE_HARDWARE, null); - oa.start(); + a.setDuration(mExpandDuration); + a.start(); } private void closeComplete(boolean wasAnimated) { From 529af302dc2141f6e5e4eabbe981c228a9a0df2c Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 28 Feb 2017 14:18:54 -0800 Subject: [PATCH 005/446] Use FolderIconPreviewVerifier to check if item is in preview. Bug: 35064148 Bug: 33600656 Change-Id: I71a03636276e6169c7eb8c68eecf31f37fde2d56 --- src/com/android/launcher3/BubbleTextView.java | 5 ++++- src/com/android/launcher3/LauncherModel.java | 4 +++- src/com/android/launcher3/folder/FolderPagedView.java | 4 +++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 107d7006aa..af64b87892 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -40,6 +40,7 @@ import com.android.launcher3.IconCache.ItemInfoUpdateReceiver; import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.badge.BadgeRenderer; import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.folder.FolderIconPreviewVerifier; import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.graphics.HolographicOutlineHelper; import com.android.launcher3.graphics.IconPalette; @@ -548,7 +549,9 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { applyFromApplicationInfo((AppInfo) info); } else if (info instanceof ShortcutInfo) { applyFromShortcutInfo((ShortcutInfo) info); - if ((info.rank < FolderIcon.NUM_ITEMS_IN_PREVIEW) && (info.container >= 0)) { + FolderIconPreviewVerifier verifier = + new FolderIconPreviewVerifier(mLauncher.getDeviceProfile().inv); + if (verifier.isItemInPreview(info.rank) && (info.container >= 0)) { View folderIcon = mLauncher.getWorkspace().getHomescreenIconByItemId(info.container); if (folderIcon != null) { diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 845fdbfebc..e7a8783ac4 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -884,6 +884,8 @@ public class LauncherModel extends BroadcastReceiver Intent intent; String targetPkg; + FolderIconPreviewVerifier verifier = + new FolderIconPreviewVerifier(mApp.getInvariantDeviceProfile()); while (!mStopped && c.moveToNext()) { try { if (c.user == null) { @@ -1008,7 +1010,7 @@ public class LauncherModel extends BroadcastReceiver } boolean useLowResIcon = !c.isOnWorkspaceOrHotseat() && - c.getInt(rankIndex) >= FolderIcon.NUM_ITEMS_IN_PREVIEW; + !verifier.isItemInPreview(c.getInt(rankIndex)); if (c.restoreFlag != 0) { // Already verified above that user is same as default user diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index f29fb9a05b..bc78324e77 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -331,6 +331,8 @@ public class FolderPagedView extends PagedView { int position = 0; int newX, newY, rank; + FolderIconPreviewVerifier verifier = new FolderIconPreviewVerifier( + Launcher.getLauncher(getContext()).getDeviceProfile().inv); rank = 0; for (int i = 0; i < itemCount; i++) { View v = list.size() > i ? list.get(i) : null; @@ -363,7 +365,7 @@ public class FolderPagedView extends PagedView { currentPage.addViewToCellLayout( v, -1, mFolder.mLauncher.getViewIdForItem(info), lp, true); - if (rank < FolderIcon.NUM_ITEMS_IN_PREVIEW && v instanceof BubbleTextView) { + if (verifier.isItemInPreview(rank) && v instanceof BubbleTextView) { ((BubbleTextView) v).verifyHighRes(); } } From 5fcbad03ef33fa8e25de79b115905592d761ef83 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 1 Mar 2017 16:06:21 -0800 Subject: [PATCH 006/446] Added getIconSize method to PreviewLayoutRule interface. This will be used in new Folder animation. Bug: 35064148 Change-Id: I5573336c0b8a9db8d1e600b1e16de07f48f35a21 --- .../launcher3/folder/ClippedFolderIconLayoutRule.java | 5 +++++ src/com/android/launcher3/folder/FolderIcon.java | 1 + .../android/launcher3/folder/StackFolderIconLayoutRule.java | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java index 194a62fe4e..503c2ec9f3 100644 --- a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java +++ b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java @@ -120,6 +120,11 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule return scale * mBaselineIconScale; } + @Override + public float getIconSize() { + return mIconSize; + } + @Override public int maxNumItems() { return MAX_NUM_ITEMS_IN_PREVIEW; diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 407f923bfc..d84a9d2e3f 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -1138,6 +1138,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { PreviewItemDrawingParams params); void init(int availableSpace, int intrinsicIconSize, boolean rtl); float scaleForItem(int index, int totalNumItems); + float getIconSize(); int maxNumItems(); boolean clipToBackground(); } diff --git a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java index 1f4e648138..9c8c2efdb8 100644 --- a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java +++ b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java @@ -86,6 +86,11 @@ public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { return MAX_NUM_ITEMS_IN_PREVIEW; } + @Override + public float getIconSize() { + return mBaselineIconSize; + } + @Override public float scaleForItem(int index, int numItems) { // Scale is determined by the position of the icon in the preview. From 6aa3729e98502d4cffc40a7e602628b85d558edd Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 6 Feb 2017 10:46:24 -0800 Subject: [PATCH 007/446] Launcher dump proto that will be used for: $ adb shell dumpsys activity provider com.android.launcher3/com.android.launcher3.LauncherProvider To see how the proto is filled: go/launcher-proto-dump b/31772480 Change-Id: I8e0f1e5e38148a3dfeabd2fc057392193b2625dd --- protos/launcher_dump.proto | 75 +++++++++ src/com/android/launcher3/LauncherModel.java | 5 + .../android/launcher3/LauncherProvider.java | 15 ++ .../launcher3/logging/DumpTargetWrapper.java | 149 ++++++++++++++++++ .../launcher3/logging/LoggerUtils.java | 33 +++- .../android/launcher3/model/BgDataModel.java | 112 ++++++++++++- 6 files changed, 376 insertions(+), 13 deletions(-) create mode 100644 protos/launcher_dump.proto create mode 100644 src/com/android/launcher3/logging/DumpTargetWrapper.java diff --git a/protos/launcher_dump.proto b/protos/launcher_dump.proto new file mode 100644 index 0000000000..dc8fbda250 --- /dev/null +++ b/protos/launcher_dump.proto @@ -0,0 +1,75 @@ +/* + * 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. + */ +syntax = "proto2"; + +option java_package = "com.android.launcher3.model"; +option java_outer_classname = "LauncherDumpProto"; + +package model; + +message DumpTarget { + enum Type { + NONE = 0; + ITEM = 1; + CONTAINER = 2; + } + + optional Type type = 1; + optional int32 page_id = 2; + optional int32 grid_x = 3; + optional int32 grid_y = 4; + + // For container types only + optional ContainerType container_type = 5; + + // For item types only + optional ItemType item_type = 6; + + optional string package_name = 7; // All ItemTypes except UNKNOWN type + optional string component = 8; // All ItemTypes except UNKNOWN type + optional string item_id = 9; // For Pinned Shortcuts and appWidgetId + + optional int32 span_x = 10 [default = 1];// Used for ItemType.WIDGET + optional int32 span_y = 11 [default = 1];// Used for ItemType.WIDGET + optional UserType user_type = 12; +} + +// Used to define what type of item a Target would represent. +enum ItemType { + UNKNOWN_ITEMTYPE = 0; // Launcher specific items + APP_ICON = 1; // Regular app icons + WIDGET = 2; // Elements from AppWidgetManager + SHORTCUT = 3; // ShortcutManager +} + +// Used to define what type of container a Target would represent. +enum ContainerType { + UNKNOWN_CONTAINERTYPE = 0; + WORKSPACE = 1; + HOTSEAT = 2; + FOLDER = 3; +} + +// Used to define what type of control a Target would represent. +enum UserType { + DEFAULT = 0; + WORK = 1; +} + +// Main message; +message LauncherImpression { + repeated DumpTarget targets = 1; +} diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 845fdbfebc..6a78367d92 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -128,6 +128,11 @@ public class LauncherModel extends BroadcastReceiver // our monitoring of the package manager provides all updates and we never // need to do a requery. This is only ever touched from the loader thread. private boolean mModelLoaded; + public boolean isModelLoaded() { + synchronized (mLock) { + return mModelLoaded && mLoaderTask == null; + } + } /** * Set of runnables to be called on the background thread after the workspace binding diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index e250b3f29f..e6d7181077 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -47,6 +47,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; import android.util.Log; +import android.view.ViewGroup; import com.android.launcher3.AutoInstallsLayout.LayoutParserCallback; import com.android.launcher3.LauncherSettings.Favorites; @@ -63,6 +64,8 @@ import com.android.launcher3.util.NoLocaleSqliteContext; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Thunk; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; @@ -85,6 +88,18 @@ public class LauncherProvider extends ContentProvider { protected DatabaseHelper mOpenHelper; + /** + * $ adb shell dumpsys activity provider com.android.launcher3 + */ + @Override + public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { + LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); + if (appState == null || !appState.getModel().isModelLoaded()) { + return; + } + appState.getModel().dumpState("", fd, writer, args); + } + @Override public boolean onCreate() { if (ProviderConfig.IS_DOGFOOD_BUILD) { diff --git a/src/com/android/launcher3/logging/DumpTargetWrapper.java b/src/com/android/launcher3/logging/DumpTargetWrapper.java new file mode 100644 index 0000000000..2646a22429 --- /dev/null +++ b/src/com/android/launcher3/logging/DumpTargetWrapper.java @@ -0,0 +1,149 @@ +/* + * 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. + */ +package com.android.launcher3.logging; + +import android.os.Process; +import android.text.TextUtils; + +import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherSettings; +import com.android.launcher3.model.nano.LauncherDumpProto; +import com.android.launcher3.model.nano.LauncherDumpProto.ContainerType; +import com.android.launcher3.model.nano.LauncherDumpProto.DumpTarget; +import com.android.launcher3.model.nano.LauncherDumpProto.ItemType; +import com.android.launcher3.model.nano.LauncherDumpProto.UserType; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class can be used when proto definition doesn't support nesting. + */ +public class DumpTargetWrapper { + DumpTarget node; + ArrayList children; + + public DumpTargetWrapper() { + children = new ArrayList<>(); + } + + public DumpTargetWrapper(DumpTarget t) { + this(); + node = t; + } + + public DumpTargetWrapper(int containerType, int id) { + this(); + node = newContainerTarget(containerType, id); + } + + public DumpTargetWrapper(ItemInfo info) { + this(); + node = newItemTarget(info); + } + + public DumpTarget getDumpTarget() { + return node; + } + + public void add(DumpTargetWrapper child) { + children.add(child); + } + + public List getFlattenedList() { + ArrayList list = new ArrayList<>(); + list.add(node); + if (!children.isEmpty()) { + for(DumpTargetWrapper t: children) { + list.addAll(t.getFlattenedList()); + } + list.add(node); // add a delimiter empty object + } + return list; + } + public DumpTarget newItemTarget(ItemInfo info) { + DumpTarget dt = new DumpTarget(); + dt.type = DumpTarget.Type.ITEM; + + switch (info.itemType) { + case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: + dt.itemType = ItemType.APP_ICON; + break; + case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: + dt.itemType = ItemType.UNKNOWN_ITEMTYPE; + break; + case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: + dt.itemType = ItemType.WIDGET; + break; + case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: + dt.itemType = ItemType.SHORTCUT; + break; + } + return dt; + } + + public DumpTarget newContainerTarget(int type, int id) { + DumpTarget dt = new DumpTarget(); + dt.type = DumpTarget.Type.CONTAINER; + dt.containerType = type; + dt.pageId = id; + return dt; + } + + public static String getDumpTargetStr(DumpTarget t) { + if (t == null){ + return ""; + } + switch (t.type) { + case LauncherDumpProto.DumpTarget.Type.ITEM: + return getItemStr(t); + case LauncherDumpProto.DumpTarget.Type.CONTAINER: + String str = LoggerUtils.getFieldName(t.containerType, ContainerType.class); + if (t.containerType == ContainerType.WORKSPACE) { + str += " id=" + t.pageId; + } else if (t.containerType == ContainerType.FOLDER) { + str += " grid(" + t.gridX + "," + t.gridY+ ")"; + } + return str; + default: + return "UNKNOWN TARGET TYPE"; + } + } + + private static String getItemStr(DumpTarget t) { + String typeStr = LoggerUtils.getFieldName(t.itemType, ItemType.class); + if (!TextUtils.isEmpty(t.packageName)) { + typeStr += ", package=" + t.packageName; + } + if (!TextUtils.isEmpty(t.component)) { + typeStr += ", component=" + t.component; + } + return typeStr + ", grid(" + t.gridX + "," + t.gridY + "), span(" + t.spanX + "," + t.spanY + + "), pageIdx=" + t.pageId + " user=" + t.userType; + } + + public DumpTarget writeToDumpTarget(ItemInfo info) { + node.component = info.getTargetComponent() == null? "": + info.getTargetComponent().flattenToString(); + node.packageName = info.getIntent() == null? "": info.getIntent().getPackage(); + node.gridX = info.cellX; + node.gridY = info.cellY; + node.spanX = info.spanX; + node.spanY = info.spanY; + node.userType = (info.user.equals(Process.myUserHandle()))? UserType.DEFAULT : UserType.WORK; + return node; + } +} diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index c13e8b3367..499fdc7d38 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -1,5 +1,21 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.android.launcher3.logging; +import android.text.TextUtils; import android.util.ArrayMap; import android.util.SparseArray; import android.view.View; @@ -27,7 +43,7 @@ public class LoggerUtils { private static final ArrayMap> sNameCache = new ArrayMap<>(); private static final String UNKNOWN = "UNKNOWN"; - private static String getFieldName(int value, Class c) { + public static String getFieldName(int value, Class c) { SparseArray cache; synchronized (sNameCache) { cache = sNameCache.get(c); @@ -68,8 +84,13 @@ public class LoggerUtils { case Target.Type.CONTROL: return getFieldName(t.controlType, ControlType.class); case Target.Type.CONTAINER: - return getFieldName(t.containerType, ContainerType.class) - + " id=" + t.pageIndex; + String str = getFieldName(t.containerType, ContainerType.class); + if (t.containerType == ContainerType.WORKSPACE) { + str += " id=" + t.pageIndex; + } else if (t.containerType == ContainerType.FOLDER) { + str += " grid(" + t.gridX + "," + t.gridY+ ")"; + } + return str; default: return "UNKNOWN TARGET TYPE"; } @@ -86,10 +107,8 @@ public class LoggerUtils { if (t.intentHash != 0) { typeStr += ", intentHash=" + t.intentHash; } - if (t.spanX != 0) { - typeStr += ", spanX=" + t.spanX; - } - return typeStr + ", grid=(" + t.gridX + "," + t.gridY + "), id=" + t.pageIndex; + return typeStr + ", grid(" + t.gridX + "," + t.gridY + "), span(" + t.spanX + "," + t.spanY + + "), pageIdx=" + t.pageIndex; } public static Target newItemTarget(View v) { diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 6b64087a2b..0e73ca6d3d 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -24,19 +24,27 @@ import android.util.MutableInt; import com.android.launcher3.FolderInfo; import com.android.launcher3.InstallShortcutReceiver; import com.android.launcher3.ItemInfo; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.logging.LoggerUtils; +import com.android.launcher3.logging.DumpTargetWrapper; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.shortcuts.ShortcutKey; +import com.android.launcher3.model.nano.LauncherDumpProto; +import com.android.launcher3.model.nano.LauncherDumpProto.ContainerType; +import com.android.launcher3.model.nano.LauncherDumpProto.DumpTarget; +import com.android.launcher3.model.nano.LauncherDumpProto.ItemType; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.MultiHashMap; +import com.google.protobuf.nano.MessageNano; import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; @@ -102,21 +110,31 @@ public class BgDataModel { deepShortcutMap.clear(); } - // TODO: current dump is very cryptic and hard to understand. Make it more legible. - public synchronized void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { - writer.println(prefix + "Data Model:"); - for (int i = 0; i < workspaceScreens.size(); i++) { - writer.println(prefix + "\tIndex of workspaceScreens:" + workspaceScreens.get(i).toString()); + public synchronized void dump(String prefix, FileDescriptor fd, PrintWriter writer, + String[] args) { + if (args.length > 0 && TextUtils.equals(args[0], "--proto")) { + dumpProto(prefix, fd, writer, args); + return; } + writer.println(prefix + "Data Model:"); + writer.print(prefix + " ---- workspace screens: "); + for (int i = 0; i < workspaceScreens.size(); i++) { + writer.print(" " + workspaceScreens.get(i).toString()); + } + writer.println(); + writer.println(prefix + " ---- workspace items "); for (int i = 0; i < workspaceItems.size(); i++) { writer.println(prefix + '\t' + workspaceItems.get(i).toString()); } + writer.println(prefix + " ---- appwidget items "); for (int i = 0; i < appWidgets.size(); i++) { writer.println(prefix + '\t' + appWidgets.get(i).toString()); } + writer.println(prefix + " ---- folder items "); for (int i = 0; i< folders.size(); i++) { writer.println(prefix + '\t' + folders.valueAt(i).toString()); } + writer.println(prefix + " ---- items id map "); for (int i = 0; i< itemsIdMap.size(); i++) { writer.println(prefix + '\t' + itemsIdMap.valueAt(i).toString()); } @@ -133,6 +151,88 @@ public class BgDataModel { } } + private synchronized void dumpProto(String prefix, FileDescriptor fd, PrintWriter writer, + String[] args) { + + // Add top parent nodes. (L1) + DumpTargetWrapper hotseat = new DumpTargetWrapper(ContainerType.HOTSEAT, 0); + LongArrayMap workspaces = new LongArrayMap<>(); + for (int i = 0; i < workspaceScreens.size(); i++) { + workspaces.put(new Long(workspaceScreens.get(i)), + new DumpTargetWrapper(ContainerType.WORKSPACE, i)); + } + DumpTargetWrapper dtw; + // Add non leaf / non top nodes (L2) + for (int i = 0; i < folders.size(); i++) { + FolderInfo fInfo = folders.valueAt(i); + dtw = new DumpTargetWrapper(ContainerType.FOLDER, folders.size()); + dtw.writeToDumpTarget(fInfo); + for(ShortcutInfo sInfo: fInfo.contents) { + DumpTargetWrapper child = new DumpTargetWrapper(sInfo); + child.writeToDumpTarget(sInfo); + dtw.add(child); + } + if (fInfo.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + hotseat.add(dtw); + } else if (fInfo.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { + workspaces.get(new Long(fInfo.screenId)).add(dtw); + } + } + // Add leaf nodes (L3): *Info + for (int i = 0; i < workspaceItems.size(); i++) { + ItemInfo info = workspaceItems.get(i); + if (info instanceof FolderInfo) { + continue; + } + dtw = new DumpTargetWrapper(info); + dtw.writeToDumpTarget(info); + if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + hotseat.add(dtw); + } else if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { + workspaces.get(new Long(info.screenId)).add(dtw); + } + } + for (int i = 0; i < appWidgets.size(); i++) { + ItemInfo info = appWidgets.get(i); + dtw = new DumpTargetWrapper(info); + dtw.writeToDumpTarget(info); + if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + hotseat.add(dtw); + } else if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { + workspaces.get(new Long(info.screenId)).add(dtw); + } + } + + + // Traverse target wrapper + ArrayList targetList = new ArrayList<>(); + targetList.addAll(hotseat.getFlattenedList()); + for (int i = 0; i < workspaces.size(); i++) { + targetList.addAll(workspaces.valueAt(i).getFlattenedList()); + } + + if (args.length > 1 && TextUtils.equals(args[1], "--debug")) { + for (int i = 0; i < targetList.size(); i++) { + writer.println(prefix + DumpTargetWrapper.getDumpTargetStr(targetList.get(i))); + } + return; + } else { + LauncherDumpProto.LauncherImpression proto = new LauncherDumpProto.LauncherImpression(); + proto.targets = new DumpTarget[targetList.size()]; + for (int i = 0; i < targetList.size(); i++) { + proto.targets[i] = targetList.get(i); + } + FileOutputStream fos = new FileOutputStream(fd); + try { + + fos.write(MessageNano.toByteArray(proto)); + Log.d(TAG, MessageNano.toByteArray(proto).length + "Bytes"); + } catch (IOException e) { + Log.e(TAG, "Exception writing dumpsys --proto", e); + } + } + } + public synchronized void removeItem(Context context, ItemInfo... items) { removeItem(context, Arrays.asList(items)); } From da9ac1f01a16a2fe13e321d6fada5cb63f534bc2 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 2 Mar 2017 12:36:08 -0800 Subject: [PATCH 008/446] Add shadow to Adaptive Icons Bug: 35920618 Change-Id: Ib48a656f988d1f007c32ab15cb28d120fab1e94f --- .../android/launcher3/graphics/LauncherIcons.java | 14 ++++++++++++-- .../com/android/launcher3/config/FeatureFlags.java | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 1a50dfe14a..5db395be6e 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -201,7 +201,7 @@ public class LauncherIcons { int textureWidth = iconBitmapSize; int textureHeight = iconBitmapSize; - final Bitmap bitmap = Bitmap.createBitmap(textureWidth, textureHeight, + Bitmap bitmap = Bitmap.createBitmap(textureWidth, textureHeight, Bitmap.Config.ARGB_8888); final Canvas canvas = sCanvas; canvas.setBitmap(bitmap); @@ -218,6 +218,16 @@ public class LauncherIcons { icon.setBounds(sOldBounds); canvas.setBitmap(null); + if (FeatureFlags.ADAPTIVE_ICON_SHADOW && Utilities.isAtLeastO()) { + try { + Class clazz = Class.forName("android.graphics.drawable.AdaptiveIconDrawable"); + if (clazz.isAssignableFrom(icon.getClass())) { + bitmap = ShadowGenerator.getInstance(context).recreateIcon(bitmap); + } + } catch (Exception e) { + // do nothing + } + } return bitmap; } } @@ -233,7 +243,7 @@ public class LauncherIcons { } try { - Class clazz = Class.forName("android.graphics.drawable.MaskableIconDrawable"); + Class clazz = Class.forName("android.graphics.drawable.AdaptiveIconDrawable"); if (!clazz.isAssignableFrom(drawable.getClass())) { Drawable maskWrapper = context.getDrawable(R.drawable.mask_drawable_wrapper).mutate(); diff --git a/src_config/com/android/launcher3/config/FeatureFlags.java b/src_config/com/android/launcher3/config/FeatureFlags.java index 7459c0c779..ab2e7180fe 100644 --- a/src_config/com/android/launcher3/config/FeatureFlags.java +++ b/src_config/com/android/launcher3/config/FeatureFlags.java @@ -44,4 +44,6 @@ public final class FeatureFlags { public static final boolean BADGE_ICONS = true; // When enabled, icons not supporting {@link MaskableIconDrawable} will be wrapped in this class. public static final boolean LEGACY_ICON_TREATMENT = false; + // When enabled, adaptive icons would have shadows baked when being stored to icon cache. + public static final boolean ADAPTIVE_ICON_SHADOW = true; } From af479026526be438dd6e4c32dba4c5cabe4f46fb Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 3 Mar 2017 14:03:55 -0800 Subject: [PATCH 009/446] Moves OutlineProvider / Animation files to anim package. Change-Id: If444bbc71009510ded54d50ef746717f6c8b277f --- src/com/android/launcher3/LauncherStateTransitionAnimation.java | 2 +- .../launcher3/{util => anim}/CircleRevealOutlineProvider.java | 2 +- .../android/launcher3/anim/PillHeightRevealOutlineProvider.java | 2 -- .../launcher3/{util => anim}/PillRevealOutlineProvider.java | 2 +- .../launcher3/{util => anim}/RevealOutlineAnimation.java | 2 +- src/com/android/launcher3/folder/Folder.java | 2 +- src/com/android/launcher3/popup/PopupItemView.java | 2 +- 7 files changed, 6 insertions(+), 8 deletions(-) rename src/com/android/launcher3/{util => anim}/CircleRevealOutlineProvider.java (97%) rename src/com/android/launcher3/{util => anim}/PillRevealOutlineProvider.java (98%) rename src/com/android/launcher3/{util => anim}/RevealOutlineAnimation.java (98%) diff --git a/src/com/android/launcher3/LauncherStateTransitionAnimation.java b/src/com/android/launcher3/LauncherStateTransitionAnimation.java index 39c466db88..f5af979ce9 100644 --- a/src/com/android/launcher3/LauncherStateTransitionAnimation.java +++ b/src/com/android/launcher3/LauncherStateTransitionAnimation.java @@ -32,7 +32,7 @@ import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.AnimationLayerSet; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.util.CircleRevealOutlineProvider; +import com.android.launcher3.anim.CircleRevealOutlineProvider; import com.android.launcher3.util.Thunk; import com.android.launcher3.widget.WidgetsContainerView; diff --git a/src/com/android/launcher3/util/CircleRevealOutlineProvider.java b/src/com/android/launcher3/anim/CircleRevealOutlineProvider.java similarity index 97% rename from src/com/android/launcher3/util/CircleRevealOutlineProvider.java rename to src/com/android/launcher3/anim/CircleRevealOutlineProvider.java index 9fe51476da..9fb6b498bb 100644 --- a/src/com/android/launcher3/util/CircleRevealOutlineProvider.java +++ b/src/com/android/launcher3/anim/CircleRevealOutlineProvider.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.launcher3.util; +package com.android.launcher3.anim; public class CircleRevealOutlineProvider extends RevealOutlineAnimation { diff --git a/src/com/android/launcher3/anim/PillHeightRevealOutlineProvider.java b/src/com/android/launcher3/anim/PillHeightRevealOutlineProvider.java index be1e2d644b..679e8e32f5 100644 --- a/src/com/android/launcher3/anim/PillHeightRevealOutlineProvider.java +++ b/src/com/android/launcher3/anim/PillHeightRevealOutlineProvider.java @@ -18,8 +18,6 @@ package com.android.launcher3.anim; import android.graphics.Rect; -import com.android.launcher3.util.PillRevealOutlineProvider; - /** * Extension of {@link PillRevealOutlineProvider} which only changes the height of the pill. * For now, we assume the height is added/removed from the bottom. diff --git a/src/com/android/launcher3/util/PillRevealOutlineProvider.java b/src/com/android/launcher3/anim/PillRevealOutlineProvider.java similarity index 98% rename from src/com/android/launcher3/util/PillRevealOutlineProvider.java rename to src/com/android/launcher3/anim/PillRevealOutlineProvider.java index a57d69fab7..450f9db9a7 100644 --- a/src/com/android/launcher3/util/PillRevealOutlineProvider.java +++ b/src/com/android/launcher3/anim/PillRevealOutlineProvider.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.launcher3.util; +package com.android.launcher3.anim; import android.graphics.Rect; import android.view.ViewOutlineProvider; diff --git a/src/com/android/launcher3/util/RevealOutlineAnimation.java b/src/com/android/launcher3/anim/RevealOutlineAnimation.java similarity index 98% rename from src/com/android/launcher3/util/RevealOutlineAnimation.java rename to src/com/android/launcher3/anim/RevealOutlineAnimation.java index 4560477753..4b270dbecb 100644 --- a/src/com/android/launcher3/util/RevealOutlineAnimation.java +++ b/src/com/android/launcher3/anim/RevealOutlineAnimation.java @@ -1,4 +1,4 @@ -package com.android.launcher3.util; +package com.android.launcher3.anim; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 763ab96f32..c63dd5861f 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -76,7 +76,7 @@ import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.pageindicators.PageIndicatorDots; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; -import com.android.launcher3.util.CircleRevealOutlineProvider; +import com.android.launcher3.anim.CircleRevealOutlineProvider; import com.android.launcher3.util.Thunk; import java.util.ArrayList; diff --git a/src/com/android/launcher3/popup/PopupItemView.java b/src/com/android/launcher3/popup/PopupItemView.java index b839d99ff9..eeece881b6 100644 --- a/src/com/android/launcher3/popup/PopupItemView.java +++ b/src/com/android/launcher3/popup/PopupItemView.java @@ -36,7 +36,7 @@ import android.widget.FrameLayout; import com.android.launcher3.LogAccelerateInterpolator; import com.android.launcher3.R; import com.android.launcher3.Utilities; -import com.android.launcher3.util.PillRevealOutlineProvider; +import com.android.launcher3.anim.PillRevealOutlineProvider; /** * An abstract {@link FrameLayout} that supports animating an item's content From d4d171425e64ee23a8e3034eebeee3270f21002b Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 3 Mar 2017 13:27:06 -0800 Subject: [PATCH 010/446] Added RoundedRectRevealOutlineProvider. This will be used in the new Folder animation. In the opening animation, the reveal starts out as a circle and progessively turns into a rounded rectangle. The closing animation is the reverse. Bug: 35064148 Change-Id: I8accbaa83abee881bc3e16119c7602796c9963cb --- .../RoundedRectRevealOutlineProvider.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java diff --git a/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java b/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java new file mode 100644 index 0000000000..9c09477bbf --- /dev/null +++ b/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java @@ -0,0 +1,57 @@ +/* + * 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. + */ + +package com.android.launcher3.anim; + +import android.graphics.Rect; + +/** + * A {@link RevealOutlineAnimation} that provides an outline that interpolates between two radii + * and two {@link Rect}s. + * + * An example usage of this provider is an outline that starts out as a circle and ends + * as a rounded rectangle. + */ +public class RoundedRectRevealOutlineProvider extends RevealOutlineAnimation { + private final float mStartRadius; + private final float mEndRadius; + + private final Rect mStartRect; + private final Rect mEndRect; + + public RoundedRectRevealOutlineProvider(float startRadius, float endRadius, Rect startRect, + Rect endRect) { + mStartRadius = startRadius; + mEndRadius = endRadius; + mStartRect = startRect; + mEndRect = endRect; + } + + @Override + public boolean shouldRemoveElevationDuringAnimation() { + return false; + } + + @Override + public void setProgress(float progress) { + mOutlineRadius = (1 - progress) * mStartRadius + progress * mEndRadius; + + mOutline.left = (int) ((1 - progress) * mStartRect.left + progress * mEndRect.left); + mOutline.top = (int) ((1 - progress) * mStartRect.top + progress * mEndRect.top); + mOutline.right = (int) ((1 - progress) * mStartRect.right + progress * mEndRect.right); + mOutline.bottom = (int) ((1 - progress) * mStartRect.bottom + progress * mEndRect.bottom); + } +} From ebb6dd7aa622649113cc0025b707524317a73054 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 6 Mar 2017 06:31:19 -0800 Subject: [PATCH 011/446] Import translations. DO NOT MERGE Change-Id: I58011b44e3012ad2f34d77483f17e0708537f1eb Auto-generated-cl: translation import --- res/values-pt/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 60bfbf6258..c5a11717c0 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -33,7 +33,7 @@ "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" "%1$d de largura por %2$d de altura" - "Toque e mantenha-o pressionado para posicionar na tela inicial" + "Toque e segure-o para posicionar na tela inicial" "Posicionar automaticamente" "Pesquisar apps" "Carregando apps…" From 471701162642d4cbfc5cebdd448e9a7af4c7c51f Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 3 Mar 2017 14:57:14 -0800 Subject: [PATCH 012/446] New folder animations. Added FolderAnimationManager, which manages the opening and closing animations. All of the animations are done in the Folder. ie. When the users taps on the FolderIcon, we immediately hide the FolderIcon and show the Folder inits place before starting the animation. Bug: 35064148 Change-Id: Icacdbbf78a25489f2eab4fd352f2c6ed71eb710b --- .../folder_closing_interpolator.xml | 24 ++ .../folder_opening_interpolator.xml | 24 ++ src/com/android/launcher3/BubbleTextView.java | 4 + .../anim/RevealOutlineAnimation.java | 4 + src/com/android/launcher3/folder/Folder.java | 47 ++- .../folder/FolderAnimationManager.java | 333 ++++++++++++++++++ .../android/launcher3/folder/FolderIcon.java | 22 +- 7 files changed, 444 insertions(+), 14 deletions(-) create mode 100644 res/interpolator/folder_closing_interpolator.xml create mode 100644 res/interpolator/folder_opening_interpolator.xml create mode 100644 src/com/android/launcher3/folder/FolderAnimationManager.java diff --git a/res/interpolator/folder_closing_interpolator.xml b/res/interpolator/folder_closing_interpolator.xml new file mode 100644 index 0000000000..e6e012eda1 --- /dev/null +++ b/res/interpolator/folder_closing_interpolator.xml @@ -0,0 +1,24 @@ + + + + diff --git a/res/interpolator/folder_opening_interpolator.xml b/res/interpolator/folder_opening_interpolator.xml new file mode 100644 index 0000000000..b95d4548ff --- /dev/null +++ b/res/interpolator/folder_opening_interpolator.xml @@ -0,0 +1,24 @@ + + + + diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 3b8fb0ac8d..f9a6742d8f 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -590,6 +590,10 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { .isEmpty(); } + public int getIconSize() { + return mIconSize; + } + /** * Interface to be implemented by the grand parent to allow click shadow effect. */ diff --git a/src/com/android/launcher3/anim/RevealOutlineAnimation.java b/src/com/android/launcher3/anim/RevealOutlineAnimation.java index 4b270dbecb..51d00d9477 100644 --- a/src/com/android/launcher3/anim/RevealOutlineAnimation.java +++ b/src/com/android/launcher3/anim/RevealOutlineAnimation.java @@ -83,4 +83,8 @@ public abstract class RevealOutlineAnimation extends ViewOutlineProvider { public void getOutline(View v, Outline outline) { outline.setRoundRect(mOutline, mOutlineRadius); } + + public float getRadius() { + return mOutlineRadius; + } } diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index c63dd5861f..5b0dfdb9fe 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -46,6 +46,7 @@ import android.widget.TextView; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Alarm; import com.android.launcher3.AppInfo; +import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.DragSource; @@ -82,6 +83,7 @@ import com.android.launcher3.util.Thunk; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.List; /** * Represents a set of icons chosen by the user or generated by the system. @@ -134,8 +136,10 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC @Thunk final ArrayList mItemsInReadingOrder = new ArrayList(); + private FolderAnimationManager mFolderAnimationManager; + private final int mExpandDuration; - private final int mMaterialExpandDuration; + public final int mMaterialExpandDuration; private final int mMaterialExpandStagger; protected final Launcher mLauncher; @@ -476,6 +480,8 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } } }); + + mFolderAnimationManager = new FolderAnimationManager(this); } /** @@ -512,6 +518,9 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } private AnimatorSet getOpeningAnimatorSet() { + prepareReveal(); + mFolderIcon.growAndFadeOut(); + AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); int width = getFolderWidth(); @@ -602,12 +611,11 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mDeleteFolderOnDropCompleted = false; final Runnable onCompleteRunnable; - prepareReveal(); centerAboutIcon(); - mFolderIcon.growAndFadeOut(); - - AnimatorSet anim = getOpeningAnimatorSet(); + AnimatorSet anim = FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION + ? mFolderAnimationManager.getOpeningAnimator() + : getOpeningAnimatorSet(); onCompleteRunnable = new Runnable() { @Override public void run() { @@ -705,7 +713,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mFolderName.dispatchBackKey(); } - if (mFolderIcon != null) { + if (mFolderIcon != null && !FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) { mFolderIcon.shrinkAndFadeIn(animate); } @@ -730,12 +738,14 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC AnimationLayerSet layerSet = new AnimationLayerSet(); layerSet.addView(this); animatorSet.addListener(layerSet); - + animatorSet.setDuration(mExpandDuration); return animatorSet; } private void animateClosed() { - AnimatorSet a = getClosingAnimatorSet(); + AnimatorSet a = FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION + ? mFolderAnimationManager.getClosingAnimator() + : getClosingAnimatorSet(); a.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { @@ -750,7 +760,6 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mState = STATE_ANIMATING; } }); - a.setDuration(mExpandDuration); a.start(); } @@ -1453,6 +1462,26 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC return mItemsInReadingOrder; } + public List getItemsOnCurrentPage() { + ArrayList allItems = getItemsInReadingOrder(); + int currentPage = mContent.getCurrentPage(); + int lastPage = mContent.getPageCount() - 1; + int totalItemsInFolder = allItems.size(); + int itemsPerPage = mContent.itemsPerPage(); + int numItemsOnCurrentPage = currentPage == lastPage + ? totalItemsInFolder - (itemsPerPage * currentPage) + : itemsPerPage; + + int startIndex = currentPage * itemsPerPage; + int endIndex = startIndex + numItemsOnCurrentPage; + + List itemsOnCurrentPage = new ArrayList<>(numItemsOnCurrentPage); + for (int i = startIndex; i < endIndex; ++i) { + itemsOnCurrentPage.add((BubbleTextView) allItems.get(i)); + } + return itemsOnCurrentPage; + } + public void onFocusChange(View v, boolean hasFocus) { if (v == mFolderName) { if (hasFocus) { diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java new file mode 100644 index 0000000000..28133219f1 --- /dev/null +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -0,0 +1,333 @@ +/* + * 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. + */ + +package com.android.launcher3.folder; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.animation.TimeInterpolator; +import android.content.Context; +import android.graphics.Color; +import android.graphics.Rect; +import android.graphics.drawable.GradientDrawable; +import android.support.v4.graphics.ColorUtils; +import android.util.Property; +import android.view.View; +import android.view.animation.AnimationUtils; + +import com.android.launcher3.BubbleTextView; +import com.android.launcher3.CellLayout; +import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherAnimUtils; +import com.android.launcher3.R; +import com.android.launcher3.ShortcutAndWidgetContainer; +import com.android.launcher3.Utilities; +import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; +import com.android.launcher3.dragndrop.DragLayer; +import com.android.launcher3.util.Themes; + +import java.util.List; + +/** + * Manages the opening and closing animations for a {@link Folder}. + * + * All of the animations are done in the Folder. + * ie. When the user taps on the FolderIcon, we immediately hide the FolderIcon and show the Folder + * in its place before starting the animation. + */ +public class FolderAnimationManager { + + private Folder mFolder; + private FolderPagedView mContent; + private GradientDrawable mFolderBackground; + + private FolderIcon mFolderIcon; + private FolderIcon.PreviewBackground mPreviewBackground; + + private Context mContext; + private Launcher mLauncher; + + private Animator mRevealAnimator; + private final TimeInterpolator mOpeningInterpolator; + private final TimeInterpolator mClosingInterpolator; + + private final FolderIcon.PreviewItemDrawingParams mTmpParams = + new FolderIcon.PreviewItemDrawingParams(0, 0, 0, 0); + + private final Property SCALE_PROPERTY = + new Property(Float.class, "scale") { + @Override + public Float get(View view) { + return view.getScaleX(); + } + + @Override + public void set(View view, Float scale) { + view.setScaleX(scale); + view.setScaleY(scale); + } + }; + + private final Property, Integer> ITEMS_TEXT_COLOR_PROPERTY = + new Property, Integer>(Integer.class, "textColor") { + @Override + public Integer get(List items) { + return items.get(0).getCurrentTextColor(); + } + + @Override + public void set(List items, Integer color) { + setItemsTextColor(items, color); + } + }; + + public FolderAnimationManager(Folder folder) { + mFolder = folder; + mContent = folder.mContent; + mFolderBackground = (GradientDrawable) mFolder.getBackground(); + + mFolderIcon = folder.mFolderIcon; + mPreviewBackground = mFolderIcon.mBackground; + + mContext = folder.getContext(); + mLauncher = folder.mLauncher; + + mOpeningInterpolator = AnimationUtils.loadInterpolator(mContext, + R.interpolator.folder_opening_interpolator); + mClosingInterpolator = AnimationUtils.loadInterpolator(mContext, + R.interpolator.folder_closing_interpolator); + } + + public AnimatorSet getOpeningAnimator() { + mFolder.setPivotX(0); + mFolder.setPivotY(0); + + AnimatorSet a = getAnimatorSet(true /* isOpening */); + a.setInterpolator(mOpeningInterpolator); + a.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mFolderIcon.setVisibility(View.INVISIBLE); + } + }); + return a; + } + + public AnimatorSet getClosingAnimator() { + AnimatorSet a = getAnimatorSet(false /* isOpening */); + a.setInterpolator(mClosingInterpolator); + a.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mFolderIcon.setVisibility(View.VISIBLE); + } + }); + return a; + } + + /** + * Prepares the Folder for animating between open / closed states. + * + * @param isOpening If true, return the animator set for the opening animation. + */ + private AnimatorSet getAnimatorSet(final boolean isOpening) { + final DragLayer.LayoutParams lp = (DragLayer.LayoutParams) mFolder.getLayoutParams(); + FolderIcon.PreviewLayoutRule rule = mFolderIcon.getLayoutRule(); + final List itemsInPreview = mFolderIcon.getItemsToDisplay(); + + // Match size/scale of icons in the preview + float previewScale = rule.scaleForItem(0, itemsInPreview.size()); + float previewSize = rule.getIconSize() * previewScale; + float folderScale = previewSize / itemsInPreview.get(0).getIconSize(); + + final float initialScale = folderScale; + final float finalScale = 1f; + float scale = isOpening ? initialScale : finalScale; + mFolder.setScaleX(scale); + mFolder.setScaleY(scale); + + // Match position of the FolderIcon + final Rect folderIconPos = new Rect(); + float scaleRelativeToDragLayer = mLauncher.getDragLayer() + .getDescendantRectRelativeToSelf(mFolderIcon, folderIconPos); + folderScale *= scaleRelativeToDragLayer; + + // We want to create a small X offset for the preview items, so that they follow their + // expected path to their final locations. ie. an icon should not move right, if it's final + // location is to its left. This value is arbitrarily defined. + final int nudgeOffsetX = (int) (previewSize / 2); + + final int paddingOffsetX = (int) ((mFolder.getPaddingLeft() + mContent.getPaddingLeft()) + * folderScale); + final int paddingOffsetY = (int) ((mFolder.getPaddingTop() + mContent.getPaddingTop()) + * folderScale); + + int initialX = folderIconPos.left + mFolderIcon.mBackground.getOffsetX() - paddingOffsetX + - nudgeOffsetX; + int initialY = folderIconPos.top + mFolderIcon.mBackground.getOffsetY() - paddingOffsetY; + final float xDistance = initialX - lp.x; + final float yDistance = initialY - lp.y; + + // Set up the Folder background. + final int finalColor = Themes.getAttrColor(mContext, android.R.attr.colorPrimary); + final int initialColor = + ColorUtils.setAlphaComponent(finalColor, mPreviewBackground.getBackgroundAlpha()); + mFolderBackground.setColor(isOpening ? initialColor : finalColor); + + // Initialize the Folder items' text. + final List itemsOnCurrentPage = mFolder.getItemsOnCurrentPage(); + final int finalTextColor = Themes.getAttrColor(mContext, android.R.attr.textColorSecondary); + setItemsTextColor(itemsOnCurrentPage, isOpening ? Color.TRANSPARENT : finalTextColor); + + // Create the animators. + AnimatorSet a = LauncherAnimUtils.createAnimatorSet(); + a.setDuration(mFolder.mMaterialExpandDuration); + + ObjectAnimator translationX = isOpening + ? ObjectAnimator.ofFloat(mFolder, View.TRANSLATION_X, xDistance, 0) + : ObjectAnimator.ofFloat(mFolder, View.TRANSLATION_X, 0, xDistance); + a.play(translationX); + + ObjectAnimator translationY = isOpening + ? ObjectAnimator.ofFloat(mFolder, View.TRANSLATION_Y, yDistance, 0) + : ObjectAnimator.ofFloat(mFolder, View.TRANSLATION_Y, 0, yDistance); + a.play(translationY); + + ObjectAnimator scaleAnimator = isOpening + ? ObjectAnimator.ofFloat(mFolder, SCALE_PROPERTY, initialScale, finalScale) + : ObjectAnimator.ofFloat(mFolder, SCALE_PROPERTY, finalScale, initialScale); + a.play(scaleAnimator); + + ObjectAnimator itemsTextColor = isOpening + ? ObjectAnimator.ofArgb(itemsOnCurrentPage, ITEMS_TEXT_COLOR_PROPERTY, + Color.TRANSPARENT, finalTextColor) + : ObjectAnimator.ofArgb(itemsOnCurrentPage, ITEMS_TEXT_COLOR_PROPERTY, + finalTextColor, Color.TRANSPARENT); + a.play(itemsTextColor); + + ObjectAnimator backgroundColor = isOpening + ? ObjectAnimator.ofArgb(mFolderBackground, "color", initialColor, finalColor) + : ObjectAnimator.ofArgb(mFolderBackground, "color", finalColor, initialColor); + a.play(backgroundColor); + + // Set up the reveal animation that clips the Folder. + float stroke = mPreviewBackground.getStrokeWidth(); + int initialSize = (int) ((mFolderIcon.mBackground.getRadius() * 2 + stroke) / folderScale); + int totalOffsetX = paddingOffsetX + Math.round(nudgeOffsetX / folderScale); + int unscaledStroke = (int) Math.floor(stroke / folderScale); + Rect startRect = new Rect(totalOffsetX + unscaledStroke, unscaledStroke, + totalOffsetX + initialSize, initialSize); + Rect endRect = new Rect(0, 0, lp.width, lp.height); + a.play(getRevealAnimator(isOpening, initialSize / 2f, startRect, endRect)); + + addPreviewItemAnimatorsToSet(a, isOpening, folderScale, nudgeOffsetX); + return a; + } + + private Animator getRevealAnimator(boolean isOpening, float circleRadius, Rect start, + Rect end) { + boolean revealIsRunning = mRevealAnimator != null && mRevealAnimator.isRunning(); + final float finalRadius = revealIsRunning + ? ((RoundedRectRevealOutlineProvider) mFolder.getOutlineProvider()).getRadius() + : Utilities.pxFromDp(2, mContext.getResources().getDisplayMetrics()); + if (revealIsRunning) { + mRevealAnimator.cancel(); + } + mRevealAnimator = new RoundedRectRevealOutlineProvider(circleRadius, finalRadius, + start, end).createRevealAnimator(mFolder, !isOpening); + return mRevealAnimator; + } + + /** + * Animate the items that are displayed in the preview. + */ + private void addPreviewItemAnimatorsToSet(AnimatorSet animatorSet, boolean isOpening, + final float folderScale, int nudgeOffsetX) { + FolderIcon.PreviewLayoutRule rule = mFolderIcon.getLayoutRule(); + final List itemsInPreview = mFolderIcon.getItemsToDisplay(); + final int numItemsInPreview = itemsInPreview.size(); + + ShortcutAndWidgetContainer cwc = mContent.getPageAt(0).getShortcutsAndWidgets(); + for (int i = 0; i < numItemsInPreview; ++i) { + final BubbleTextView btv = itemsInPreview.get(i); + CellLayout.LayoutParams btvLp = (CellLayout.LayoutParams) btv.getLayoutParams(); + + // Calculate the final values in the LayoutParams. + btvLp.isLockedToGrid = true; + cwc.setupLp(btv); + + // Match scale of icons in the preview. + float previewScale = rule.scaleForItem(i, numItemsInPreview); + float previewSize = rule.getIconSize() * previewScale; + float iconScale = previewSize / itemsInPreview.get(i).getIconSize(); + + final float initialScale = iconScale / folderScale; + final float finalScale = 1f; + float scale = isOpening ? initialScale : finalScale; + btv.setScaleX(scale); + btv.setScaleY(scale); + + // Match positions of the icons in the folder with their positions in the preview + rule.computePreviewItemDrawingParams(i, numItemsInPreview, mTmpParams); + // The PreviewLayoutRule assumes that the icon size takes up the entire width so we + // offset by the actual size. + int iconOffsetX = (int) ((btvLp.width - btv.getIconSize()) * iconScale) / 2; + + final int previewPosX = + (int) ((mTmpParams.transX - iconOffsetX + nudgeOffsetX) / folderScale); + final int previewPosY = (int) (mTmpParams.transY / folderScale); + + final float xDistance = previewPosX - btvLp.x; + final float yDistance = previewPosY - btvLp.y; + + ObjectAnimator translationX = isOpening + ? ObjectAnimator.ofFloat(btv, View.TRANSLATION_X, xDistance, 0) + : ObjectAnimator.ofFloat(btv, View.TRANSLATION_X, 0, xDistance); + animatorSet.play(translationX); + + ObjectAnimator translationY = isOpening + ? ObjectAnimator.ofFloat(btv, View.TRANSLATION_Y, yDistance, 0) + : ObjectAnimator.ofFloat(btv, View.TRANSLATION_Y, 0, yDistance); + animatorSet.play(translationY); + + ObjectAnimator scaleAnimator = isOpening + ? ObjectAnimator.ofFloat(btv, SCALE_PROPERTY, initialScale, finalScale) + : ObjectAnimator.ofFloat(btv, SCALE_PROPERTY, finalScale, initialScale); + animatorSet.play(scaleAnimator); + + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + btv.setTranslationX(0.0f); + btv.setTranslationY(0.0f); + btv.setScaleX(1f); + btv.setScaleY(1f); + } + }); + } + } + + private void setItemsTextColor(List items, int color) { + int size = items.size(); + + for (int i = 0; i < size; ++i) { + items.get(i).setTextColor(color); + } + } +} diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 92577b7e3a..9395572bfc 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -407,6 +407,10 @@ public class FolderIcon extends FrameLayout implements FolderListener { mBadgeInfo = badgeInfo; } + public PreviewLayoutRule getLayoutRule() { + return mPreviewLayoutRule; + } + /** * Sets mBadgeScale to 1 or 0, animating if oldCount or newCount is 0 * (the badge is being added or removed). @@ -824,6 +828,14 @@ public class FolderIcon extends FrameLayout implements FolderListener { }; animateScale(1f, 1f, onStart, onEnd); } + + public int getBackgroundAlpha() { + return (int) Math.min(MAX_BG_OPACITY, BG_OPACITY * mColorMultiplier); + } + + public float getStrokeWidth() { + return mStrokeWidth; + } } public void setFolderBackground(PreviewBackground bg) { @@ -991,15 +1003,15 @@ public class FolderIcon extends FrameLayout implements FolderListener { return mFolderName.getVisibility() == VISIBLE; } - private List getItemsToDisplay() { + public List getItemsToDisplay() { mPreviewVerifier.setFolderInfo(mFolder.getInfo()); - List itemsToDisplay = new ArrayList<>(); + List itemsToDisplay = new ArrayList<>(); List allItems = mFolder.getItemsInReadingOrder(); int numItems = allItems.size(); for (int rank = 0; rank < numItems; ++rank) { if (mPreviewVerifier.isItemInPreview(rank)) { - itemsToDisplay.add(allItems.get(rank)); + itemsToDisplay.add((BubbleTextView) allItems.get(rank)); } if (itemsToDisplay.size() == FolderIcon.NUM_ITEMS_IN_PREVIEW) { @@ -1010,7 +1022,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { } private void updateItemDrawingParams(boolean animate) { - List items = getItemsToDisplay(); + List items = getItemsToDisplay(); int nItemsInPreview = items.size(); int prevNumItems = mDrawingParams.size(); @@ -1025,7 +1037,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { for (int i = 0; i < mDrawingParams.size(); i++) { PreviewItemDrawingParams p = mDrawingParams.get(i); - p.drawable = ((TextView) items.get(i)).getCompoundDrawables()[1]; + p.drawable = items.get(i).getCompoundDrawables()[1]; if (!animate || FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON) { computePreviewItemDrawingParams(i, nItemsInPreview, p); From f35968764cbfe08c27f636d62e08350c0e862522 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 7 Mar 2017 08:22:05 -0800 Subject: [PATCH 013/446] Turn on FeatureFlag for LAUNCHER3_NEW_FOLDER_ANIMATION. Bug: 35064148 Change-Id: I18fa8f3477d9749f879e27b2291d3f998476a655 --- src_config/com/android/launcher3/config/FeatureFlags.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_config/com/android/launcher3/config/FeatureFlags.java b/src_config/com/android/launcher3/config/FeatureFlags.java index 80eebece2e..d9b74333d1 100644 --- a/src_config/com/android/launcher3/config/FeatureFlags.java +++ b/src_config/com/android/launcher3/config/FeatureFlags.java @@ -28,7 +28,7 @@ public final class FeatureFlags { public static boolean LAUNCHER3_USE_SYSTEM_DRAG_DRIVER = true; public static boolean LAUNCHER3_DISABLE_PINCH_TO_OVERVIEW = false; public static boolean LAUNCHER3_ALL_APPS_PULL_UP = true; - public static boolean LAUNCHER3_NEW_FOLDER_ANIMATION = false; + public static boolean LAUNCHER3_NEW_FOLDER_ANIMATION = true; // When enabled allows to use any point on the fast scrollbar to start dragging. public static boolean LAUNCHER3_DIRECT_SCROLL = true; // When enabled while all-apps open, the soft input will be set to adjust resize . From 39f817e60a4a32f5eb4dc38233446bc5e6f22657 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 7 Mar 2017 08:03:40 -0800 Subject: [PATCH 014/446] Fix bug where first page Folder text stays transparent. This can happen where you drag a new item to a Folder that has a full first page. Bug: 36022385 Bug: 35064148 Change-Id: I092a79a13b7f779f09ee7a79488a16fe8bfbc2fd --- .../folder/FolderAnimationManager.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index 28133219f1..d14bb40eca 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -69,7 +69,7 @@ public class FolderAnimationManager { private final FolderIcon.PreviewItemDrawingParams mTmpParams = new FolderIcon.PreviewItemDrawingParams(0, 0, 0, 0); - private final Property SCALE_PROPERTY = + private static final Property SCALE_PROPERTY = new Property(Float.class, "scale") { @Override public Float get(View view) { @@ -83,7 +83,7 @@ public class FolderAnimationManager { } }; - private final Property, Integer> ITEMS_TEXT_COLOR_PROPERTY = + private static final Property, Integer> ITEMS_TEXT_COLOR_PROPERTY = new Property, Integer>(Integer.class, "textColor") { @Override public Integer get(List items) { @@ -92,7 +92,11 @@ public class FolderAnimationManager { @Override public void set(List items, Integer color) { - setItemsTextColor(items, color); + int size = items.size(); + + for (int i = 0; i < size; ++i) { + items.get(i).setTextColor(color); + } } }; @@ -192,7 +196,8 @@ public class FolderAnimationManager { // Initialize the Folder items' text. final List itemsOnCurrentPage = mFolder.getItemsOnCurrentPage(); final int finalTextColor = Themes.getAttrColor(mContext, android.R.attr.textColorSecondary); - setItemsTextColor(itemsOnCurrentPage, isOpening ? Color.TRANSPARENT : finalTextColor); + ITEMS_TEXT_COLOR_PROPERTY.set(itemsOnCurrentPage, isOpening ? Color.TRANSPARENT + : finalTextColor); // Create the animators. AnimatorSet a = LauncherAnimUtils.createAnimatorSet(); @@ -235,6 +240,14 @@ public class FolderAnimationManager { Rect endRect = new Rect(0, 0, lp.width, lp.height); a.play(getRevealAnimator(isOpening, initialSize / 2f, startRect, endRect)); + a.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + ITEMS_TEXT_COLOR_PROPERTY.set(itemsOnCurrentPage, finalTextColor); + } + }); + addPreviewItemAnimatorsToSet(a, isOpening, folderScale, nudgeOffsetX); return a; } @@ -322,12 +335,4 @@ public class FolderAnimationManager { }); } } - - private void setItemsTextColor(List items, int color) { - int size = items.size(); - - for (int i = 0; i < size; ++i) { - items.get(i).setTextColor(color); - } - } } From b26d8b656484395ef42c2170f3041ecd9bd49ff9 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 7 Mar 2017 09:10:06 -0800 Subject: [PATCH 015/446] Fixing broken gradle build Change-Id: I82432d2076639f43db0270ec3f90a03d0896bab2 --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 51ac5a1a82..5d4288e201 100644 --- a/build.gradle +++ b/build.gradle @@ -90,6 +90,7 @@ protobuf { remove java javanano { option "java_package=launcher_log.proto|com.android.launcher3.userevent.nano" + option "java_package=launcher_dump.proto|com.android.launcher3.model.nano" option "enum_style=java" } } From 3d706ad70365052e3224fc4f4b0e7d1f5e8abf22 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 6 Mar 2017 16:56:39 -0800 Subject: [PATCH 016/446] Separating the config and flags in different directories so that it is easier to override one or the other Bug: 36001650 Change-Id: I713f4f5dbcf902614ce9f6c7a73bdace7bdf1ea0 --- Android.mk | 1 + build.gradle | 2 +- src/com/android/launcher3/CellLayout.java | 4 ++-- src/com/android/launcher3/FocusHelper.java | 4 ++-- .../android/launcher3/InvariantDeviceProfile.java | 3 +-- src/com/android/launcher3/Launcher.java | 3 +-- src/com/android/launcher3/LauncherAppState.java | 4 ++-- src/com/android/launcher3/LauncherModel.java | 4 ++-- src/com/android/launcher3/LauncherProvider.java | 6 ++---- src/com/android/launcher3/LauncherSettings.java | 10 ++++------ src/com/android/launcher3/Utilities.java | 4 ++-- src/com/android/launcher3/Workspace.java | 9 ++++----- .../launcher3/allapps/AlphabeticalAppsList.java | 4 ++-- src/com/android/launcher3/folder/Folder.java | 3 +-- .../launcher3/graphics/DragPreviewProvider.java | 4 ++-- .../graphics/HolographicOutlineHelper.java | 4 ++-- src/com/android/launcher3/logging/FileLog.java | 11 +++++------ .../launcher3/logging/UserEventDispatcher.java | 5 ++--- src/com/android/launcher3/model/BgDataModel.java | 6 ++---- src/com/android/launcher3/model/WidgetsModel.java | 7 ++----- .../android/launcher3/provider/ImportDataTask.java | 10 +++++----- src/com/android/launcher3/util/Preconditions.java | 10 +++++----- .../android/launcher3/util/SQLiteCacheHelper.java | 4 ++-- .../ProviderConfig.java => BuildConfig.java} | 14 +++++++------- .../com/android/launcher3/config/FeatureFlags.java | 3 +++ .../launcher3/model/AddWorkspaceItemsTaskTest.java | 4 ++-- .../model/BaseModelUpdateTaskTestCase.java | 4 ++-- .../launcher3/model/GridSizeMigrationTaskTest.java | 5 ++--- 28 files changed, 70 insertions(+), 82 deletions(-) rename src_config/com/android/launcher3/{config/ProviderConfig.java => BuildConfig.java} (67%) rename {src_config => src_flags}/com/android/launcher3/config/FeatureFlags.java (97%) diff --git a/Android.mk b/Android.mk index 713d0828ad..6cb40c51ae 100644 --- a/Android.mk +++ b/Android.mk @@ -31,6 +31,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ LOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ $(call all-java-files-under, src_config) \ + $(call all-java-files-under, src_flags) \ $(call all-proto-files-under, protos) LOCAL_RESOURCE_DIR := \ diff --git a/build.gradle b/build.gradle index 5d4288e201..d6dbbabe68 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ android { sourceSets { main { res.srcDirs = ['res'] - java.srcDirs = ['src', 'src_config'] + java.srcDirs = ['src', 'src_flags'] manifest.srcFile 'AndroidManifest-common.xml' proto.srcDirs 'protos/' } diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 8179dad29a..70137aa7cc 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -51,7 +51,7 @@ import com.android.launcher3.accessibility.DragAndDropAccessibilityDelegate; import com.android.launcher3.accessibility.FolderAccessibilityHelper; import com.android.launcher3.accessibility.WorkspaceAccessibilityHelper; import com.android.launcher3.anim.PropertyListBuilder; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DragPreviewProvider; import com.android.launcher3.util.CellAndSpan; @@ -568,7 +568,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { try { dispatchRestoreInstanceState(states); } catch (IllegalArgumentException ex) { - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (FeatureFlags.IS_DOGFOOD_BUILD) { throw ex; } // Mismatched viewId / viewType preventing restore. Skip restore on production builds. diff --git a/src/com/android/launcher3/FocusHelper.java b/src/com/android/launcher3/FocusHelper.java index b36734bab4..fe7acda17b 100644 --- a/src/com/android/launcher3/FocusHelper.java +++ b/src/com/android/launcher3/FocusHelper.java @@ -22,7 +22,7 @@ import android.view.SoundEffectConstants; import android.view.View; import android.view.ViewGroup; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderPagedView; import com.android.launcher3.util.FocusLogic; @@ -93,7 +93,7 @@ public class FocusHelper { } if (!(v.getParent() instanceof ShortcutAndWidgetContainer)) { - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (FeatureFlags.IS_DOGFOOD_BUILD) { throw new IllegalStateException("Parent of the focused item is not supported."); } else { return false; diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index 8aeab87120..146c2eee7f 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -28,7 +28,6 @@ import android.view.Display; import android.view.WindowManager; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.logging.FileLog; import com.android.launcher3.util.Thunk; @@ -335,7 +334,7 @@ public class InvariantDeviceProfile { } public int getAllAppsButtonRank() { - if (ProviderConfig.IS_DOGFOOD_BUILD && FeatureFlags.NO_ALL_APPS_ICON) { + if (FeatureFlags.IS_DOGFOOD_BUILD && FeatureFlags.NO_ALL_APPS_ICON) { throw new IllegalAccessError("Accessing all apps rank when all-apps is disabled"); } return numHotseatIcons / 2; diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index f9e6f4b902..9b37649777 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -91,7 +91,6 @@ import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.PinItemRequestCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; @@ -3386,7 +3385,7 @@ public class Launcher extends BaseActivity Object tag = v.getTag(); String desc = "Collision while binding workspace item: " + item + ". Collides with " + tag; - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (FeatureFlags.IS_DOGFOOD_BUILD) { throw (new RuntimeException(desc)); } else { Log.d(TAG, desc); diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index 2e75579ca8..f2d66fe812 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -26,7 +26,7 @@ import android.util.Log; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.UserManagerCompat; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dynamicui.ExtractionUtils; import com.android.launcher3.model.GridSizeMigrationTask; import com.android.launcher3.util.ConfigMonitor; @@ -38,7 +38,7 @@ import java.util.concurrent.ExecutionException; public class LauncherAppState { - public static final boolean PROFILE_STARTUP = ProviderConfig.IS_DOGFOOD_BUILD; + public static final boolean PROFILE_STARTUP = FeatureFlags.IS_DOGFOOD_BUILD; // We do not need any synchronization for this variable as its only written on UI thread. private static LauncherAppState INSTANCE; diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 384f20237d..4cc1f64e6c 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -44,7 +44,7 @@ import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo; import com.android.launcher3.compat.UserManagerCompat; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dynamicui.ExtractionUtils; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; @@ -1408,7 +1408,7 @@ public class LauncherModel extends BroadcastReceiver return Utilities.longCompare(lhs.screenId, rhs.screenId); } default: - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (FeatureFlags.IS_DOGFOOD_BUILD) { throw new RuntimeException("Unexpected container type when " + "sorting workspace items."); } diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index e6d7181077..b83ddb9273 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -47,14 +47,12 @@ import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; import android.util.Log; -import android.view.ViewGroup; import com.android.launcher3.AutoInstallsLayout.LayoutParserCallback; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.LauncherSettings.WorkspaceScreens; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dynamicui.ExtractionUtils; import com.android.launcher3.logging.FileLog; import com.android.launcher3.provider.LauncherDbUtils; @@ -77,7 +75,7 @@ public class LauncherProvider extends ContentProvider { private static final int DATABASE_VERSION = 27; - public static final String AUTHORITY = ProviderConfig.AUTHORITY; + public static final String AUTHORITY = (BuildConfig.APPLICATION_ID + ".settings").intern(); static final String EMPTY_DATABASE_CREATED = "EMPTY_DATABASE_CREATED"; @@ -102,7 +100,7 @@ public class LauncherProvider extends ContentProvider { @Override public boolean onCreate() { - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (FeatureFlags.IS_DOGFOOD_BUILD) { Log.d(TAG, "Launcher process started"); } mListenerHandler = new Handler(mListenerWrapper); diff --git a/src/com/android/launcher3/LauncherSettings.java b/src/com/android/launcher3/LauncherSettings.java index af2c10275f..e8e0eb2344 100644 --- a/src/com/android/launcher3/LauncherSettings.java +++ b/src/com/android/launcher3/LauncherSettings.java @@ -22,8 +22,6 @@ import android.net.Uri; import android.os.Bundle; import android.provider.BaseColumns; -import com.android.launcher3.config.ProviderConfig; - /** * Settings related utilities. */ @@ -101,7 +99,7 @@ public class LauncherSettings { * The content:// style URL for this table */ public static final Uri CONTENT_URI = Uri.parse("content://" + - ProviderConfig.AUTHORITY + "/" + TABLE_NAME); + LauncherProvider.AUTHORITY + "/" + TABLE_NAME); /** * The rank of this screen -- ie. how it is ordered relative to the other screens. @@ -121,7 +119,7 @@ public class LauncherSettings { * The content:// style URL for this table */ public static final Uri CONTENT_URI = Uri.parse("content://" + - ProviderConfig.AUTHORITY + "/" + TABLE_NAME); + LauncherProvider.AUTHORITY + "/" + TABLE_NAME); /** * The content:// style URL for a given row, identified by its id. @@ -131,7 +129,7 @@ public class LauncherSettings { * @return The unique content URL for the specified row. */ public static Uri getContentUri(long id) { - return Uri.parse("content://" + ProviderConfig.AUTHORITY + + return Uri.parse("content://" + LauncherProvider.AUTHORITY + "/" + TABLE_NAME + "/" + id); } @@ -280,7 +278,7 @@ public class LauncherSettings { public static final class Settings { public static final Uri CONTENT_URI = Uri.parse("content://" + - ProviderConfig.AUTHORITY + "/settings"); + LauncherProvider.AUTHORITY + "/settings"); public static final String METHOD_CLEAR_EMPTY_DB_FLAG = "clear_empty_db_flag"; public static final String METHOD_WAS_EMPTY_DB_CREATED = "get_empty_db_flag"; diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index abc53673b9..2413d8ae65 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -51,7 +51,7 @@ import android.view.View; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; import java.io.ByteArrayOutputStream; import java.io.Closeable; @@ -575,7 +575,7 @@ public final class Utilities { try { c.close(); } catch (IOException e) { - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (FeatureFlags.IS_DOGFOOD_BUILD) { Log.d(TAG, "Error closing", e); } } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index ef00a8d60a..2a88a23596 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -64,7 +64,6 @@ import com.android.launcher3.anim.AnimationLayerSet; import com.android.launcher3.badge.FolderBadgeInfo; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; @@ -2618,7 +2617,7 @@ public class Workspace extends PagedView CellLayout parentCell = getParentCellLayoutForView(cell); if (parentCell != null) { parentCell.removeView(cell); - } else if (ProviderConfig.IS_DOGFOOD_BUILD) { + } else if (FeatureFlags.IS_DOGFOOD_BUILD) { throw new NullPointerException("mDragInfo.cell has null parent"); } addInScreen(cell, container, screenId, mTargetCell[0], mTargetCell[1], @@ -2951,7 +2950,7 @@ public class Workspace extends PagedView ItemInfo item = d.dragInfo; if (item == null) { - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (FeatureFlags.IS_DOGFOOD_BUILD) { throw new NullPointerException("DragObject has null info"); } return; @@ -3608,7 +3607,7 @@ public class Workspace extends PagedView mDragInfo.container, mDragInfo.screenId); if (cellLayout != null) { cellLayout.onDropChild(mDragInfo.cell); - } else if (ProviderConfig.IS_DOGFOOD_BUILD) { + } else if (FeatureFlags.IS_DOGFOOD_BUILD) { throw new RuntimeException("Invalid state: cellLayout == null in " + "Workspace#onDropCompleted. Please file a bug. "); }; @@ -3634,7 +3633,7 @@ public class Workspace extends PagedView CellLayout parentCell = getParentCellLayoutForView(v); if (parentCell != null) { parentCell.removeView(v); - } else if (ProviderConfig.IS_DOGFOOD_BUILD) { + } else if (FeatureFlags.IS_DOGFOOD_BUILD) { // When an app is uninstalled using the drop target, we wait until resume to remove // the icon. We also remove all the corresponding items from the workspace at // {@link Launcher#bindComponentsRemoved}. That call can come before or after diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java index f228470f4d..9e32d257dd 100644 --- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java +++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java @@ -24,7 +24,7 @@ import android.util.Log; import com.android.launcher3.AppInfo; import com.android.launcher3.Launcher; import com.android.launcher3.compat.AlphabeticIndexCompat; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.discovery.AppDiscoveryAppInfo; import com.android.launcher3.discovery.AppDiscoveryItem; import com.android.launcher3.discovery.AppDiscoveryUpdateState; @@ -440,7 +440,7 @@ public class AlphabeticalAppsList { if (info != null) { mPredictedApps.add(info); } else { - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (FeatureFlags.IS_DOGFOOD_BUILD) { Log.e(TAG, "Predicted app not found: " + ck); } } diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 5b0dfdb9fe..fe8f0ce620 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -69,7 +69,6 @@ import com.android.launcher3.Workspace.ItemOperator; import com.android.launcher3.accessibility.AccessibleDragListenerAdapter; import com.android.launcher3.anim.AnimationLayerSet; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragController.DragListener; import com.android.launcher3.dragndrop.DragLayer; @@ -591,7 +590,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC dragLayer.addView(this); mDragController.addDropTarget(this); } else { - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (FeatureFlags.IS_DOGFOOD_BUILD) { Log.e(TAG, "Opening folder (" + this + ") which already has a parent:" + getParent()); } diff --git a/src/com/android/launcher3/graphics/DragPreviewProvider.java b/src/com/android/launcher3/graphics/DragPreviewProvider.java index bb136f7a37..492d853735 100644 --- a/src/com/android/launcher3/graphics/DragPreviewProvider.java +++ b/src/com/android/launcher3/graphics/DragPreviewProvider.java @@ -29,7 +29,7 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetHostView; import com.android.launcher3.R; import com.android.launcher3.Workspace; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.FolderIcon; /** @@ -138,7 +138,7 @@ public class DragPreviewProvider { } public final void generateDragOutline(Canvas canvas) { - if (ProviderConfig.IS_DOGFOOD_BUILD && generatedDragOutline != null) { + if (FeatureFlags.IS_DOGFOOD_BUILD && generatedDragOutline != null) { throw new RuntimeException("Drag outline generated twice"); } diff --git a/src/com/android/launcher3/graphics/HolographicOutlineHelper.java b/src/com/android/launcher3/graphics/HolographicOutlineHelper.java index c9873d9eaa..b221828837 100644 --- a/src/com/android/launcher3/graphics/HolographicOutlineHelper.java +++ b/src/com/android/launcher3/graphics/HolographicOutlineHelper.java @@ -31,7 +31,7 @@ import android.util.SparseArray; import com.android.launcher3.BubbleTextView; import com.android.launcher3.R; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; import java.nio.ByteBuffer; @@ -86,7 +86,7 @@ public class HolographicOutlineHelper { * bitmap. */ public void applyExpensiveOutlineWithBlur(Bitmap srcDst, Canvas srcDstCanvas) { - if (ProviderConfig.IS_DOGFOOD_BUILD && srcDst.getConfig() != Bitmap.Config.ALPHA_8) { + if (FeatureFlags.IS_DOGFOOD_BUILD && srcDst.getConfig() != Bitmap.Config.ALPHA_8) { throw new RuntimeException("Outline blue is only supported on alpha bitmaps"); } diff --git a/src/com/android/launcher3/logging/FileLog.java b/src/com/android/launcher3/logging/FileLog.java index ffb41b76bf..4c83e9ac22 100644 --- a/src/com/android/launcher3/logging/FileLog.java +++ b/src/com/android/launcher3/logging/FileLog.java @@ -6,9 +6,8 @@ import android.os.Message; import android.util.Log; import android.util.Pair; -import com.android.launcher3.LauncherModel; import com.android.launcher3.Utilities; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; import java.io.BufferedReader; import java.io.File; @@ -40,7 +39,7 @@ public final class FileLog { private static File sLogsDirectory = null; public static void setDir(File logsDir) { - if (ProviderConfig.IS_DOGFOOD_BUILD || Utilities.IS_DEBUG_DEVICE) { + if (FeatureFlags.IS_DOGFOOD_BUILD || Utilities.IS_DEBUG_DEVICE) { synchronized (DATE_FORMAT) { // If the target directory changes, stop any active thread. if (sHandler != null && !logsDir.equals(sLogsDirectory)) { @@ -77,7 +76,7 @@ public final class FileLog { } public static void print(String tag, String msg, Exception e) { - if (!ProviderConfig.IS_DOGFOOD_BUILD) { + if (!FeatureFlags.IS_DOGFOOD_BUILD) { return; } String out = String.format("%s %s %s", DATE_FORMAT.format(new Date()), tag, msg); @@ -103,7 +102,7 @@ public final class FileLog { * @param out if not null, all the persisted logs are copied to the writer. */ public static void flushAll(PrintWriter out) throws InterruptedException { - if (!ProviderConfig.IS_DOGFOOD_BUILD) { + if (!FeatureFlags.IS_DOGFOOD_BUILD) { return; } CountDownLatch latch = new CountDownLatch(1); @@ -136,7 +135,7 @@ public final class FileLog { @Override public boolean handleMessage(Message msg) { - if (sLogsDirectory == null || !ProviderConfig.IS_DOGFOOD_BUILD) { + if (sLogsDirectory == null || !FeatureFlags.IS_DOGFOOD_BUILD) { return true; } switch (msg.what) { diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index 90e4531175..04ca247415 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -29,8 +29,7 @@ import com.android.launcher3.DropTarget; import com.android.launcher3.ItemInfo; import com.android.launcher3.R; import com.android.launcher3.Utilities; -import com.android.launcher3.config.ProviderConfig; -import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent; @@ -61,7 +60,7 @@ public class UserEventDispatcher { private static final String TAG = "UserEvent"; private static final boolean IS_VERBOSE = - ProviderConfig.IS_DOGFOOD_BUILD && Utilities.isPropertyEnabled(LogConfig.USEREVENT); + FeatureFlags.IS_DOGFOOD_BUILD && Utilities.isPropertyEnabled(LogConfig.USEREVENT); private static UserEventDispatcher sInstance; private static final Object LOCK = new Object(); diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 0e73ca6d3d..930c854c38 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -27,8 +27,7 @@ import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.config.ProviderConfig; -import com.android.launcher3.logging.LoggerUtils; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.logging.DumpTargetWrapper; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -36,7 +35,6 @@ import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.model.nano.LauncherDumpProto; import com.android.launcher3.model.nano.LauncherDumpProto.ContainerType; import com.android.launcher3.model.nano.LauncherDumpProto.DumpTarget; -import com.android.launcher3.model.nano.LauncherDumpProto.ItemType; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.MultiHashMap; @@ -242,7 +240,7 @@ public class BgDataModel { switch (item.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: folders.remove(item.id); - if (ProviderConfig.IS_DOGFOOD_BUILD) { + if (FeatureFlags.IS_DOGFOOD_BUILD) { for (ItemInfo info : itemsIdMap) { if (info.container == item.id) { // We are deleting a folder which still contains items that diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java index 95c54f7673..d2adbde236 100644 --- a/src/com/android/launcher3/model/WidgetsModel.java +++ b/src/com/android/launcher3/model/WidgetsModel.java @@ -3,9 +3,7 @@ package com.android.launcher3.model; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; -import android.content.Intent; import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.os.Process; import android.os.UserHandle; import android.util.Log; @@ -19,8 +17,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.ShortcutConfigActivityInfo; -import com.android.launcher3.compat.UserManagerCompat; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.Preconditions; @@ -79,7 +76,7 @@ public class WidgetsModel { } setWidgetsAndShortcuts(widgetsAndShortcuts, context); } catch (Exception e) { - if (!ProviderConfig.IS_DOGFOOD_BUILD && Utilities.isBinderSizeError(e)) { + if (!FeatureFlags.IS_DOGFOOD_BUILD && Utilities.isBinderSizeError(e)) { // the returned value may be incomplete and will not be refreshed until the next // time Launcher starts. // TODO: after figuring out a repro step, introduce a dirty bit to check when diff --git a/src/com/android/launcher3/provider/ImportDataTask.java b/src/com/android/launcher3/provider/ImportDataTask.java index b0482f8b20..3e4cd0192b 100644 --- a/src/com/android/launcher3/provider/ImportDataTask.java +++ b/src/com/android/launcher3/provider/ImportDataTask.java @@ -37,6 +37,7 @@ import com.android.launcher3.DefaultLayoutParser; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherFiles; +import com.android.launcher3.LauncherProvider; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.LauncherSettings.Settings; @@ -46,7 +47,6 @@ import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.GridSizeMigrationTask; import com.android.launcher3.util.LongArrayMap; @@ -112,7 +112,7 @@ public class ImportDataTask { screenOps.add(ContentProviderOperation.newInsert( LauncherSettings.WorkspaceScreens.CONTENT_URI).withValues(v).build()); } - mContext.getContentResolver().applyBatch(ProviderConfig.AUTHORITY, screenOps); + mContext.getContentResolver().applyBatch(LauncherProvider.AUTHORITY, screenOps); importWorkspaceItems(allScreens.get(0), screenIdMap); GridSizeMigrationTask.markForMigration(mContext, mMaxGridSizeX, mMaxGridSizeY, mHotseatSize); @@ -289,7 +289,7 @@ public class ImportDataTask { } if (insertOperations.size() >= BATCH_INSERT_SIZE) { - mContext.getContentResolver().applyBatch(ProviderConfig.AUTHORITY, + mContext.getContentResolver().applyBatch(LauncherProvider.AUTHORITY, insertOperations); insertOperations.clear(); } @@ -300,7 +300,7 @@ public class ImportDataTask { throw new Exception("Insufficient data"); } if (!insertOperations.isEmpty()) { - mContext.getContentResolver().applyBatch(ProviderConfig.AUTHORITY, + mContext.getContentResolver().applyBatch(LauncherProvider.AUTHORITY, insertOperations); insertOperations.clear(); } @@ -319,7 +319,7 @@ public class ImportDataTask { mHotseatSize = (int) hotseatItems.keyAt(hotseatItems.size() - 1) + 1; if (!insertOperations.isEmpty()) { - mContext.getContentResolver().applyBatch(ProviderConfig.AUTHORITY, + mContext.getContentResolver().applyBatch(LauncherProvider.AUTHORITY, insertOperations); } } diff --git a/src/com/android/launcher3/util/Preconditions.java b/src/com/android/launcher3/util/Preconditions.java index 89353e110c..7ab0d3103d 100644 --- a/src/com/android/launcher3/util/Preconditions.java +++ b/src/com/android/launcher3/util/Preconditions.java @@ -19,7 +19,7 @@ package com.android.launcher3.util; import android.os.Looper; import com.android.launcher3.LauncherModel; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; /** * A set of utility methods for thread verification. @@ -27,25 +27,25 @@ import com.android.launcher3.config.ProviderConfig; public class Preconditions { public static void assertNotNull(Object o) { - if (ProviderConfig.IS_DOGFOOD_BUILD && o == null) { + if (FeatureFlags.IS_DOGFOOD_BUILD && o == null) { throw new IllegalStateException(); } } public static void assertWorkerThread() { - if (ProviderConfig.IS_DOGFOOD_BUILD && !isSameLooper(LauncherModel.getWorkerLooper())) { + if (FeatureFlags.IS_DOGFOOD_BUILD && !isSameLooper(LauncherModel.getWorkerLooper())) { throw new IllegalStateException(); } } public static void assertUIThread() { - if (ProviderConfig.IS_DOGFOOD_BUILD && !isSameLooper(Looper.getMainLooper())) { + if (FeatureFlags.IS_DOGFOOD_BUILD && !isSameLooper(Looper.getMainLooper())) { throw new IllegalStateException(); } } public static void assertNonUiThread() { - if (ProviderConfig.IS_DOGFOOD_BUILD && isSameLooper(Looper.getMainLooper())) { + if (FeatureFlags.IS_DOGFOOD_BUILD && isSameLooper(Looper.getMainLooper())) { throw new IllegalStateException(); } } diff --git a/src/com/android/launcher3/util/SQLiteCacheHelper.java b/src/com/android/launcher3/util/SQLiteCacheHelper.java index 1ff6293a05..5344416ead 100644 --- a/src/com/android/launcher3/util/SQLiteCacheHelper.java +++ b/src/com/android/launcher3/util/SQLiteCacheHelper.java @@ -10,7 +10,7 @@ import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import com.android.launcher3.Utilities; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.config.FeatureFlags; /** * An extension of {@link SQLiteOpenHelper} with utility methods for a single table cache DB. @@ -19,7 +19,7 @@ import com.android.launcher3.config.ProviderConfig; public abstract class SQLiteCacheHelper { private static final String TAG = "SQLiteCacheHelper"; - private static final boolean NO_ICON_CACHE = ProviderConfig.IS_DOGFOOD_BUILD && + private static final boolean NO_ICON_CACHE = FeatureFlags.IS_DOGFOOD_BUILD && Utilities.isPropertyEnabled(LogConfig.MEMORY_ONLY_ICON_CACHE); private final String mTableName; diff --git a/src_config/com/android/launcher3/config/ProviderConfig.java b/src_config/com/android/launcher3/BuildConfig.java similarity index 67% rename from src_config/com/android/launcher3/config/ProviderConfig.java rename to src_config/com/android/launcher3/BuildConfig.java index 491fa657a8..4df75a1a12 100644 --- a/src_config/com/android/launcher3/config/ProviderConfig.java +++ b/src_config/com/android/launcher3/BuildConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * 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. @@ -14,11 +14,11 @@ * limitations under the License. */ -package com.android.launcher3.config; +package com.android.launcher3; -public class ProviderConfig { - - public static final String AUTHORITY = "com.android.launcher3.settings".intern(); - - public static final boolean IS_DOGFOOD_BUILD = true; +/** + * Config file used by Make. This file is automatically generated when using gradle. + */ +public class BuildConfig { + public static final String APPLICATION_ID = "com.android.launcher3"; } diff --git a/src_config/com/android/launcher3/config/FeatureFlags.java b/src_flags/com/android/launcher3/config/FeatureFlags.java similarity index 97% rename from src_config/com/android/launcher3/config/FeatureFlags.java rename to src_flags/com/android/launcher3/config/FeatureFlags.java index d9b74333d1..87e987162e 100644 --- a/src_config/com/android/launcher3/config/FeatureFlags.java +++ b/src_flags/com/android/launcher3/config/FeatureFlags.java @@ -20,6 +20,9 @@ package com.android.launcher3.config; * Defines a set of flags used to control various launcher behaviors */ public final class FeatureFlags { + + public static final boolean IS_DOGFOOD_BUILD = true; + private FeatureFlags() {} // Custom flags go below this diff --git a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java index d0ba9074cb..883be5aa3d 100644 --- a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java +++ b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java @@ -10,9 +10,9 @@ import android.net.Uri; import android.util.Pair; import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherProvider; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.Provider; @@ -178,6 +178,6 @@ public class AddWorkspaceItemsTaskTest extends BaseModelUpdateTaskTestCase { v.put(LauncherSettings.WorkspaceScreens.SCREEN_RANK, i); ops.add(ContentProviderOperation.newInsert(uri).withValues(v).build()); } - getMockContentResolver().applyBatch(ProviderConfig.AUTHORITY, ops); + getMockContentResolver().applyBatch(LauncherProvider.AUTHORITY, ops); } } diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index b9944db98d..2ad3cba0fe 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -24,7 +24,7 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel.BaseModelUpdateTask; import com.android.launcher3.LauncherModel.Callbacks; -import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.LauncherProvider; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.Provider; import com.android.launcher3.util.TestLauncherProvider; @@ -64,7 +64,7 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2 Date: Tue, 7 Mar 2017 09:28:14 -0800 Subject: [PATCH 017/446] Fix bug where FolderIcon is invisible when closing Folder with no animation. When we open the Folder, we set the FolderIcon to View.INVISIBLE. It is possible to close the Folder without animating it (ie. when apps are being auto added / auto closed to Work Profile Folder), and so the FolderIcon is never set to View.VISIBLE. Bug: 35064148 Change-Id: I2fc5b7ecaceffde0a3f3875870897c18e6e8dadf --- src/com/android/launcher3/folder/Folder.java | 8 ++++++-- .../android/launcher3/folder/FolderAnimationManager.java | 6 ------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 5b0dfdb9fe..23777bdc86 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -771,10 +771,14 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } mDragController.removeDropTarget(this); clearFocus(); - if (wasAnimated) { - mFolderIcon.requestFocus(); + if (mFolderIcon != null) { + mFolderIcon.setVisibility(View.VISIBLE); + if (wasAnimated) { + mFolderIcon.requestFocus(); + } } + if (mRearrangeOnClose) { rearrangeChildren(); mRearrangeOnClose = false; diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index d14bb40eca..9ce1c57c7a 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -135,12 +135,6 @@ public class FolderAnimationManager { public AnimatorSet getClosingAnimator() { AnimatorSet a = getAnimatorSet(false /* isOpening */); a.setInterpolator(mClosingInterpolator); - a.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mFolderIcon.setVisibility(View.VISIBLE); - } - }); return a; } From b265ba74490d8ded8659db0d63f50c471d793802 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 14 Feb 2017 15:03:45 -0800 Subject: [PATCH 018/446] Removing DeferredHandler and using a simple Handler to post callbacks DeferredHandler was added when we were posting each icon separately, to prevent starvation. But since then we have moved to binding batct items during bind. Also fixing waitForIdle not waiting the second time. waitForIdle was using a global variable to maintain state, and was not waiting properly when its called the second time before binding deep shortcuts Original Change-Id: I9c1289cb3bfb74f86e53ec7ac6dd76bb39666b2d Change-Id: I9e6b3ae65fbd3aec3a46092efc5249c4525efedf --- .../android/launcher3/DeferredHandler.java | 120 --------------- src/com/android/launcher3/LauncherModel.java | 141 ++++++------------ .../android/launcher3/MainThreadExecutor.java | 4 +- .../android/launcher3/model/ModelWriter.java | 4 +- ...ooperExecuter.java => LooperExecutor.java} | 4 +- .../launcher3/util/LooperIdleLock.java | 71 +++++++++ .../launcher3/util/ViewOnDrawExecutor.java | 10 +- .../model/BaseModelUpdateTaskTestCase.java | 10 +- .../launcher3/ui/widget/BindWidgetTest.java | 5 +- 9 files changed, 136 insertions(+), 233 deletions(-) delete mode 100644 src/com/android/launcher3/DeferredHandler.java rename src/com/android/launcher3/util/{LooperExecuter.java => LooperExecutor.java} (95%) create mode 100644 src/com/android/launcher3/util/LooperIdleLock.java diff --git a/src/com/android/launcher3/DeferredHandler.java b/src/com/android/launcher3/DeferredHandler.java deleted file mode 100644 index a43ab67239..0000000000 --- a/src/com/android/launcher3/DeferredHandler.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * 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. - */ - -package com.android.launcher3; - -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.os.MessageQueue; - -import com.android.launcher3.util.Thunk; - -import java.util.LinkedList; - -/** - * Queue of things to run on a looper thread. Items posted with {@link #post} will not - * be actually enqued on the handler until after the last one has run, to keep from - * starving the thread. - * - * This class is fifo. - */ -public class DeferredHandler { - @Thunk LinkedList mQueue = new LinkedList<>(); - private MessageQueue mMessageQueue = Looper.myQueue(); - private Impl mHandler = new Impl(); - - @Thunk class Impl extends Handler implements MessageQueue.IdleHandler { - public void handleMessage(Message msg) { - Runnable r; - synchronized (mQueue) { - if (mQueue.size() == 0) { - return; - } - r = mQueue.removeFirst(); - } - r.run(); - synchronized (mQueue) { - scheduleNextLocked(); - } - } - - public boolean queueIdle() { - handleMessage(null); - return false; - } - } - - private class IdleRunnable implements Runnable { - Runnable mRunnable; - - IdleRunnable(Runnable r) { - mRunnable = r; - } - - public void run() { - mRunnable.run(); - } - } - - public DeferredHandler() { - } - - /** Schedule runnable to run after everything that's on the queue right now. */ - public void post(Runnable runnable) { - synchronized (mQueue) { - mQueue.add(runnable); - if (mQueue.size() == 1) { - scheduleNextLocked(); - } - } - } - - /** Schedule runnable to run when the queue goes idle. */ - public void postIdle(final Runnable runnable) { - post(new IdleRunnable(runnable)); - } - - public void cancelAll() { - synchronized (mQueue) { - mQueue.clear(); - } - } - - /** Runs all queued Runnables from the calling thread. */ - public void flush() { - LinkedList queue = new LinkedList<>(); - synchronized (mQueue) { - queue.addAll(mQueue); - mQueue.clear(); - } - for (Runnable r : queue) { - r.run(); - } - } - - void scheduleNextLocked() { - if (mQueue.size() > 0) { - Runnable peek = mQueue.getFirst(); - if (peek instanceof IdleRunnable) { - mMessageQueue.addIdleHandler(mHandler); - } else { - mHandler.sendEmptyMessage(1); - } - } - } -} - diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 384f20237d..10b65a9852 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -72,6 +72,7 @@ import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.LooperIdleLock; import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageManagerHelper; @@ -110,9 +111,9 @@ public class LauncherModel extends BroadcastReceiver private static final int ITEMS_CHUNK = 6; // batch size for the workspace icons private static final long INVALID_SCREEN_ID = -1L; + private final MainThreadExecutor mUiExecutor = new MainThreadExecutor(); @Thunk final LauncherAppState mApp; @Thunk final Object mLock = new Object(); - @Thunk DeferredHandler mHandler = new DeferredHandler(); @Thunk LoaderTask mLoaderTask; @Thunk boolean mIsLoaderTaskRunning; @Thunk boolean mHasLoaderCompletedOnce; @@ -218,17 +219,6 @@ public class LauncherModel extends BroadcastReceiver mUserManager = UserManagerCompat.getInstance(context); } - /** Runs the specified runnable immediately if called from the main thread, otherwise it is - * posted on the main thread handler. */ - private void runOnMainThread(Runnable r) { - if (sWorkerThread.getThreadId() == Process.myTid()) { - // If we are on the worker thread, post onto the main handler - mHandler.post(r); - } else { - r.run(); - } - } - /** Runs the specified runnable immediately if called from the worker thread, otherwise it is * posted on the worker thread handler. */ private static void runOnWorkerThread(Runnable r) { @@ -378,8 +368,6 @@ public class LauncherModel extends BroadcastReceiver public void initialize(Callbacks callbacks) { synchronized (mLock) { Preconditions.assertUIThread(); - // Remove any queued UI runnables - mHandler.cancelAll(); mCallbacks = new WeakReference<>(callbacks); } } @@ -543,11 +531,11 @@ public class LauncherModel extends BroadcastReceiver if (mCallbacks != null && mCallbacks.get() != null) { final Callbacks oldCallbacks = mCallbacks.get(); // Clear any pending bind-runnables from the synchronized load process. - runOnMainThread(new Runnable() { - public void run() { - oldCallbacks.clearPendingBinds(); - } - }); + mUiExecutor.execute(new Runnable() { + public void run() { + oldCallbacks.clearPendingBinds(); + } + }); // If there is already one running, tell it to stop. stopLoaderLocked(); @@ -598,7 +586,6 @@ public class LauncherModel extends BroadcastReceiver @Thunk boolean mIsLoadingAndBindingWorkspace; private boolean mStopped; - @Thunk boolean mLoadAndBindStepFinished; LoaderTask(Context context, int pageToBindFirst) { mContext = context; @@ -610,34 +597,10 @@ public class LauncherModel extends BroadcastReceiver // This way we don't start loading all apps until the workspace has settled // down. synchronized (LoaderTask.this) { - final long workspaceWaitTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; - - mHandler.postIdle(new Runnable() { - public void run() { - synchronized (LoaderTask.this) { - mLoadAndBindStepFinished = true; - if (DEBUG_LOADERS) { - Log.d(TAG, "done with previous binding step"); - } - LoaderTask.this.notify(); - } - } - }); - - while (!mStopped && !mLoadAndBindStepFinished) { - try { - // Just in case mFlushingWorkerThread changes but we aren't woken up, - // wait no longer than 1sec at a time - this.wait(1000); - } catch (InterruptedException ex) { - // Ignore - } - } - if (DEBUG_LOADERS) { - Log.d(TAG, "waited " - + (SystemClock.uptimeMillis()-workspaceWaitTime) - + "ms for previous step to finish binding"); - } + LooperIdleLock idleLock = new LooperIdleLock(this, Looper.getMainLooper()); + // Just in case mFlushingWorkerThread changes but we aren't woken up, + // wait no longer than 1sec at a time + while (!mStopped && idleLock.awaitLocked(1000)); } } @@ -660,15 +623,6 @@ public class LauncherModel extends BroadcastReceiver } } - // XXX: Throw an exception if we are already loading (since we touch the worker thread - // data structures, we can't allow any other thread to touch that data, but because - // this call is synchronous, we can get away with not locking). - - // The LauncherModel is static in the LauncherAppState and mHandler may have queued - // operations from the previous activity. We need to ensure that all queued operations - // are executed before any synchronous binding work is done. - mHandler.flush(); - // Divide the set of loaded items into those that we are binding synchronously, and // everything else that is to be bound normally (asynchronously). bindWorkspace(synchronousBindPage); @@ -696,6 +650,7 @@ public class LauncherModel extends BroadcastReceiver } try { + long now = 0; if (DEBUG_LOADERS) Log.d(TAG, "step 1.1: loading workspace"); // Set to false in bindWorkspace() mIsLoadingAndBindingWorkspace = true; @@ -706,8 +661,12 @@ public class LauncherModel extends BroadcastReceiver bindWorkspace(mPageToBindFirst); // Take a break - if (DEBUG_LOADERS) Log.d(TAG, "step 1 completed, wait for idle"); + if (DEBUG_LOADERS) { + Log.d(TAG, "step 1 completed, wait for idle"); + now = SystemClock.uptimeMillis(); + } waitForIdle(); + if (DEBUG_LOADERS) Log.d(TAG, "Waited " + (SystemClock.uptimeMillis() - now) + "ms"); verifyNotStopped(); // second step @@ -719,8 +678,12 @@ public class LauncherModel extends BroadcastReceiver updateIconCache(); // Take a break - if (DEBUG_LOADERS) Log.d(TAG, "step 2 completed, wait for idle"); + if (DEBUG_LOADERS) { + Log.d(TAG, "step 2 completed, wait for idle"); + now = SystemClock.uptimeMillis(); + } waitForIdle(); + if (DEBUG_LOADERS) Log.d(TAG, "Waited " + (SystemClock.uptimeMillis() - now) + "ms"); verifyNotStopped(); // third step @@ -1433,7 +1396,7 @@ public class LauncherModel extends BroadcastReceiver } } }; - runOnMainThread(r); + mUiExecutor.execute(r); } private void bindWorkspaceItems(final Callbacks oldCallbacks, @@ -1539,11 +1502,11 @@ public class LauncherModel extends BroadcastReceiver } } }; - runOnMainThread(r); + mUiExecutor.execute(r); bindWorkspaceScreens(oldCallbacks, orderedScreenIds); - Executor mainExecutor = new DeferredMainThreadExecutor(); + Executor mainExecutor = mUiExecutor; // Load items on the current page. bindWorkspaceItems(oldCallbacks, currentWorkspaceItems, currentAppWidgets, mainExecutor); @@ -1553,7 +1516,7 @@ public class LauncherModel extends BroadcastReceiver // This ensures that the first screen is immediately visible (eg. during rotation) // In case of !validFirstPage, bind all pages one after other. final Executor deferredExecutor = - validFirstPage ? new ViewOnDrawExecutor(mHandler) : mainExecutor; + validFirstPage ? new ViewOnDrawExecutor(mUiExecutor) : mainExecutor; mainExecutor.execute(new Runnable() { @Override @@ -1613,7 +1576,7 @@ public class LauncherModel extends BroadcastReceiver } } }; - runOnMainThread(r); + mUiExecutor.execute(r); } } @@ -1663,7 +1626,7 @@ public class LauncherModel extends BroadcastReceiver } } }; - runOnMainThread(r); + mUiExecutor.execute(r); } private void loadAllApps() { @@ -1711,21 +1674,21 @@ public class LauncherModel extends BroadcastReceiver heuristic.processUserApps(apps); } }; - runOnMainThread(new Runnable() { + mUiExecutor.execute(new Runnable() { - @Override - public void run() { - // Check isLoadingWorkspace on the UI thread, as it is updated on - // the UI thread. - if (mIsLoadingAndBindingWorkspace) { - synchronized (mBindCompleteRunnables) { - mBindCompleteRunnables.add(r); - } - } else { - runOnWorkerThread(r); - } - } - }); + @Override + public void run() { + // Check isLoadingWorkspace on the UI thread, as it is updated on + // the UI thread. + if (mIsLoadingAndBindingWorkspace) { + synchronized (mBindCompleteRunnables) { + mBindCompleteRunnables.add(r); + } + } else { + runOnWorkerThread(r); + } + } + }); } } // Huh? Shouldn't this be inside the Runnable below? @@ -1733,7 +1696,7 @@ public class LauncherModel extends BroadcastReceiver mBgAllAppsList.added = new ArrayList(); // Post callback on main thread - mHandler.post(new Runnable() { + mUiExecutor.execute(new Runnable() { public void run() { final long bindTime = SystemClock.uptimeMillis(); @@ -1787,7 +1750,7 @@ public class LauncherModel extends BroadcastReceiver } } }; - runOnMainThread(r); + mUiExecutor.execute(r); } /** @@ -1838,12 +1801,12 @@ public class LauncherModel extends BroadcastReceiver public static abstract class BaseModelUpdateTask implements Runnable { private LauncherModel mModel; - private DeferredHandler mUiHandler; + private Executor mUiExecutor; /* package private */ void init(LauncherModel model) { mModel = model; - mUiHandler = mModel.mHandler; + mUiExecutor = mModel.mUiExecutor; } @Override @@ -1866,7 +1829,7 @@ public class LauncherModel extends BroadcastReceiver */ public final void scheduleCallbackTask(final CallbackTask task) { final Callbacks callbacks = mModel.getCallback(); - mUiHandler.post(new Runnable() { + mUiExecutor.execute(new Runnable() { public void run() { Callbacks cb = mModel.getCallback(); if (callbacks == cb && cb != null) { @@ -1911,7 +1874,7 @@ public class LauncherModel extends BroadcastReceiver private void bindWidgetsModel(final Callbacks callbacks) { final MultiHashMap widgets = mBgWidgetsModel.getWidgetsMap().clone(); - mHandler.post(new Runnable() { + mUiExecutor.execute(new Runnable() { @Override public void run() { Callbacks cb = getCallback(); @@ -1968,14 +1931,6 @@ public class LauncherModel extends BroadcastReceiver } } - @Thunk class DeferredMainThreadExecutor implements Executor { - - @Override - public void execute(Runnable command) { - runOnMainThread(command); - } - } - /** * @return the looper for the worker thread which can be used to start background tasks. */ diff --git a/src/com/android/launcher3/MainThreadExecutor.java b/src/com/android/launcher3/MainThreadExecutor.java index 4ca0a59d81..5094682333 100644 --- a/src/com/android/launcher3/MainThreadExecutor.java +++ b/src/com/android/launcher3/MainThreadExecutor.java @@ -18,14 +18,14 @@ package com.android.launcher3; import android.os.Looper; -import com.android.launcher3.util.LooperExecuter; +import com.android.launcher3.util.LooperExecutor; /** * An executor service that executes its tasks on the main thread. * * Shutting down this executor is not supported. */ -public class MainThreadExecutor extends LooperExecuter { +public class MainThreadExecutor extends LooperExecutor { public MainThreadExecutor() { super(Looper.getMainLooper()); diff --git a/src/com/android/launcher3/model/ModelWriter.java b/src/com/android/launcher3/model/ModelWriter.java index 4931dca14f..032ed780d6 100644 --- a/src/com/android/launcher3/model/ModelWriter.java +++ b/src/com/android/launcher3/model/ModelWriter.java @@ -34,7 +34,7 @@ import com.android.launcher3.LauncherSettings.Settings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.util.ContentWriter; import com.android.launcher3.util.ItemInfoMatcher; -import com.android.launcher3.util.LooperExecuter; +import com.android.launcher3.util.LooperExecutor; import java.util.ArrayList; import java.util.Arrays; @@ -55,7 +55,7 @@ public class ModelWriter { public ModelWriter(Context context, BgDataModel dataModel, boolean hasVerticalHotseat) { mContext = context; mBgDataModel = dataModel; - mWorkerExecutor = new LooperExecuter(LauncherModel.getWorkerLooper()); + mWorkerExecutor = new LooperExecutor(LauncherModel.getWorkerLooper()); mHasVerticalHotseat = hasVerticalHotseat; } diff --git a/src/com/android/launcher3/util/LooperExecuter.java b/src/com/android/launcher3/util/LooperExecutor.java similarity index 95% rename from src/com/android/launcher3/util/LooperExecuter.java rename to src/com/android/launcher3/util/LooperExecutor.java index 4db999bcef..5b7c20bbfb 100644 --- a/src/com/android/launcher3/util/LooperExecuter.java +++ b/src/com/android/launcher3/util/LooperExecutor.java @@ -25,11 +25,11 @@ import java.util.concurrent.TimeUnit; /** * Extension of {@link AbstractExecutorService} which executed on a provided looper. */ -public class LooperExecuter extends AbstractExecutorService { +public class LooperExecutor extends AbstractExecutorService { private final Handler mHandler; - public LooperExecuter(Looper looper) { + public LooperExecutor(Looper looper) { mHandler = new Handler(looper); } diff --git a/src/com/android/launcher3/util/LooperIdleLock.java b/src/com/android/launcher3/util/LooperIdleLock.java new file mode 100644 index 0000000000..35cac14e37 --- /dev/null +++ b/src/com/android/launcher3/util/LooperIdleLock.java @@ -0,0 +1,71 @@ +/* + * 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. + */ + +package com.android.launcher3.util; + +import android.os.Looper; +import android.os.MessageQueue; + +import com.android.launcher3.Utilities; + +/** + * Utility class to block execution until the UI looper is idle. + */ +public class LooperIdleLock implements MessageQueue.IdleHandler, Runnable { + + private final Object mLock; + + private boolean mIsLocked; + + public LooperIdleLock(Object lock, Looper looper) { + mLock = lock; + mIsLocked = true; + if (Utilities.ATLEAST_MARSHMALLOW) { + looper.getQueue().addIdleHandler(this); + } else { + // Looper.myQueue() only gives the current queue. Move the execution to the UI thread + // so that the IdleHandler is attached to the correct message queue. + new LooperExecutor(looper).execute(this); + } + } + + @Override + public void run() { + Looper.myQueue().addIdleHandler(this); + } + + @Override + public boolean queueIdle() { + synchronized (mLock) { + mIsLocked = false; + mLock.notify(); + } + return false; + } + + public boolean awaitLocked(long ms) { + if (mIsLocked) { + try { + // Just in case mFlushingWorkerThread changes but we aren't woken up, + // wait no longer than 1sec at a time + mLock.wait(ms); + } catch (InterruptedException ex) { + // Ignore + } + } + return mIsLocked; + } +} diff --git a/src/com/android/launcher3/util/ViewOnDrawExecutor.java b/src/com/android/launcher3/util/ViewOnDrawExecutor.java index 9bd2882444..4cb6ca8314 100644 --- a/src/com/android/launcher3/util/ViewOnDrawExecutor.java +++ b/src/com/android/launcher3/util/ViewOnDrawExecutor.java @@ -16,12 +16,10 @@ package com.android.launcher3.util; -import android.util.Log; import android.view.View; import android.view.View.OnAttachStateChangeListener; import android.view.ViewTreeObserver.OnDrawListener; -import com.android.launcher3.DeferredHandler; import com.android.launcher3.Launcher; import java.util.ArrayList; @@ -34,7 +32,7 @@ public class ViewOnDrawExecutor implements Executor, OnDrawListener, Runnable, OnAttachStateChangeListener { private final ArrayList mTasks = new ArrayList<>(); - private final DeferredHandler mHandler; + private final Executor mExecutor; private Launcher mLauncher; private View mAttachedView; @@ -43,8 +41,8 @@ public class ViewOnDrawExecutor implements Executor, OnDrawListener, Runnable, private boolean mLoadAnimationCompleted; private boolean mFirstDrawCompleted; - public ViewOnDrawExecutor(DeferredHandler handler) { - mHandler = handler; + public ViewOnDrawExecutor(Executor executor) { + mExecutor = executor; } public void attachTo(Launcher launcher) { @@ -92,7 +90,7 @@ public class ViewOnDrawExecutor implements Executor, OnDrawListener, Runnable, // Post the pending tasks after both onDraw and onLoadAnimationCompleted have been called. if (mLoadAnimationCompleted && mFirstDrawCompleted && !mCompleted) { for (final Runnable r : mTasks) { - mHandler.post(r); + mExecutor.execute(r); } markCompleted(); } diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index b9944db98d..633c3f0879 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -16,7 +16,6 @@ import android.test.ProviderTestCase2; import com.android.launcher3.AllAppsList; import com.android.launcher3.AppFilter; import com.android.launcher3.AppInfo; -import com.android.launcher3.DeferredHandler; import com.android.launcher3.IconCache; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; @@ -36,6 +35,7 @@ import java.io.InputStreamReader; import java.lang.reflect.Field; import java.util.HashMap; import java.util.List; +import java.util.concurrent.Executor; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Mockito.atLeast; @@ -102,14 +102,14 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2 captor = ArgumentCaptor.forClass(Runnable.class); - verify(mockHandler, atLeast(0)).post(captor.capture()); + verify(mockExecutor, atLeast(0)).execute(captor.capture()); return captor.getAllValues(); } diff --git a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java index df2b662851..97f7b505a1 100644 --- a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java @@ -39,13 +39,12 @@ import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.ui.LauncherInstrumentationTestCase; import com.android.launcher3.util.ContentWriter; -import com.android.launcher3.util.LooperExecuter; +import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.widget.PendingAddWidgetInfo; import com.android.launcher3.widget.WidgetHostViewLoader; import java.util.Set; import java.util.concurrent.Callable; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** @@ -340,7 +339,7 @@ public class BindWidgetTest extends LauncherInstrumentationTestCase { * Blocks the current thread until all the jobs in the main worker thread are complete. */ private void waitUntilLoaderIdle() throws Exception { - new LooperExecuter(LauncherModel.getWorkerLooper()) + new LooperExecutor(LauncherModel.getWorkerLooper()) .submit(new Runnable() { @Override public void run() { } From 88c07e5b8157fc806ac80fb984559813cba1e4bf Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 7 Mar 2017 15:27:00 -0800 Subject: [PATCH 019/446] Updating test as per API changes Change-Id: I746bf48254ebfcad18426d47c61a54f8a11f5cf8 --- .../android/launcher3/testcomponent/RequestPinItemActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/com/android/launcher3/testcomponent/RequestPinItemActivity.java b/tests/src/com/android/launcher3/testcomponent/RequestPinItemActivity.java index c2dd2259d3..2a031af69c 100644 --- a/tests/src/com/android/launcher3/testcomponent/RequestPinItemActivity.java +++ b/tests/src/com/android/launcher3/testcomponent/RequestPinItemActivity.java @@ -84,6 +84,6 @@ public class RequestPinItemActivity extends BaseTestingActivity { } private void requestWidget(ComponentName cn) { - AppWidgetManager.getInstance(this).requestPinAppWidget(cn, mCallback); + AppWidgetManager.getInstance(this).requestPinAppWidget(cn, null, mCallback); } } From 5f3f4d428021ce1a21a9fba4c681ec9ec2ccdf37 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 8 Mar 2017 12:22:34 -0800 Subject: [PATCH 020/446] Added new interpolators for preview items in large folders. With larger folders, we want the preview items to reach their final positions faster (when opening) and later (when closing) so that they appear aligned with the rest of the folder items when they are both visible. Bug: 35064148 Change-Id: I170ac2db36a3a20ebe5505711ea59e625050bc1b --- ...lder_preview_item_closing_interpolator.xml | 24 +++++++++++++++ ...lder_preview_item_opening_interpolator.xml | 24 +++++++++++++++ .../folder/FolderAnimationManager.java | 29 +++++++++++++++++-- 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 res/interpolator/folder_preview_item_closing_interpolator.xml create mode 100644 res/interpolator/folder_preview_item_opening_interpolator.xml diff --git a/res/interpolator/folder_preview_item_closing_interpolator.xml b/res/interpolator/folder_preview_item_closing_interpolator.xml new file mode 100644 index 0000000000..1d77081e53 --- /dev/null +++ b/res/interpolator/folder_preview_item_closing_interpolator.xml @@ -0,0 +1,24 @@ + + + + diff --git a/res/interpolator/folder_preview_item_opening_interpolator.xml b/res/interpolator/folder_preview_item_opening_interpolator.xml new file mode 100644 index 0000000000..dcf01579bb --- /dev/null +++ b/res/interpolator/folder_preview_item_opening_interpolator.xml @@ -0,0 +1,24 @@ + + + + diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index 9ce1c57c7a..6ce572d94f 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -65,6 +65,8 @@ public class FolderAnimationManager { private Animator mRevealAnimator; private final TimeInterpolator mOpeningInterpolator; private final TimeInterpolator mClosingInterpolator; + private final TimeInterpolator mPreviewItemOpeningInterpolator; + private final TimeInterpolator mPreviewItemClosingInterpolator; private final FolderIcon.PreviewItemDrawingParams mTmpParams = new FolderIcon.PreviewItemDrawingParams(0, 0, 0, 0); @@ -115,6 +117,10 @@ public class FolderAnimationManager { R.interpolator.folder_opening_interpolator); mClosingInterpolator = AnimationUtils.loadInterpolator(mContext, R.interpolator.folder_closing_interpolator); + mPreviewItemOpeningInterpolator = AnimationUtils.loadInterpolator(mContext, + R.interpolator.folder_preview_item_opening_interpolator); + mPreviewItemClosingInterpolator = AnimationUtils.loadInterpolator(mContext, + R.interpolator.folder_preview_item_closing_interpolator); } public AnimatorSet getOpeningAnimator() { @@ -122,7 +128,6 @@ public class FolderAnimationManager { mFolder.setPivotY(0); AnimatorSet a = getAnimatorSet(true /* isOpening */); - a.setInterpolator(mOpeningInterpolator); a.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { @@ -134,7 +139,6 @@ public class FolderAnimationManager { public AnimatorSet getClosingAnimator() { AnimatorSet a = getAnimatorSet(false /* isOpening */); - a.setInterpolator(mClosingInterpolator); return a; } @@ -242,6 +246,12 @@ public class FolderAnimationManager { } }); + // We set the interpolator on all current child animators here, because the preview item + // animators may use a different interpolator. + for (Animator animator : a.getChildAnimations()) { + animator.setInterpolator(isOpening ? mOpeningInterpolator : mClosingInterpolator); + } + addPreviewItemAnimatorsToSet(a, isOpening, folderScale, nudgeOffsetX); return a; } @@ -269,6 +279,8 @@ public class FolderAnimationManager { final List itemsInPreview = mFolderIcon.getItemsToDisplay(); final int numItemsInPreview = itemsInPreview.size(); + TimeInterpolator previewItemInterpolator = getPreviewItemInterpolator(isOpening); + ShortcutAndWidgetContainer cwc = mContent.getPageAt(0).getShortcutsAndWidgets(); for (int i = 0; i < numItemsInPreview; ++i) { final BubbleTextView btv = itemsInPreview.get(i); @@ -305,16 +317,19 @@ public class FolderAnimationManager { ObjectAnimator translationX = isOpening ? ObjectAnimator.ofFloat(btv, View.TRANSLATION_X, xDistance, 0) : ObjectAnimator.ofFloat(btv, View.TRANSLATION_X, 0, xDistance); + translationX.setInterpolator(previewItemInterpolator); animatorSet.play(translationX); ObjectAnimator translationY = isOpening ? ObjectAnimator.ofFloat(btv, View.TRANSLATION_Y, yDistance, 0) : ObjectAnimator.ofFloat(btv, View.TRANSLATION_Y, 0, yDistance); + translationY.setInterpolator(previewItemInterpolator); animatorSet.play(translationY); ObjectAnimator scaleAnimator = isOpening ? ObjectAnimator.ofFloat(btv, SCALE_PROPERTY, initialScale, finalScale) : ObjectAnimator.ofFloat(btv, SCALE_PROPERTY, finalScale, initialScale); + scaleAnimator.setInterpolator(previewItemInterpolator); animatorSet.play(scaleAnimator); animatorSet.addListener(new AnimatorListenerAdapter() { @@ -329,4 +344,14 @@ public class FolderAnimationManager { }); } } + + private TimeInterpolator getPreviewItemInterpolator(boolean isOpening) { + if (mFolder.getItemCount() > FolderIcon.NUM_ITEMS_IN_PREVIEW) { + // With larger folders, we want the preview items to reach their final positions faster + // (when opening) and later (when closing) so that they appear aligned with the rest of + // the folder items when they are both visible. + return isOpening ? mPreviewItemOpeningInterpolator : mPreviewItemClosingInterpolator; + } + return isOpening ? mOpeningInterpolator : mClosingInterpolator; + } } From ec191d7c5191b29fd53b1915a772e07f92d34d9d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 11 Mar 2017 21:33:53 -0800 Subject: [PATCH 021/446] Import translations. DO NOT MERGE Change-Id: I8129a870f11208d842a0b5cffaeb0ae7c3be2c06 Auto-generated-cl: translation import --- res/values-af/strings.xml | 4 ++++ res/values-am/strings.xml | 4 ++++ res/values-ar/strings.xml | 4 ++++ res/values-az-rAZ/strings.xml | 4 ++++ res/values-b+sr+Latn/strings.xml | 4 ++++ res/values-be-rBY/strings.xml | 4 ++++ res/values-bg/strings.xml | 4 ++++ res/values-bn-rBD/strings.xml | 4 ++++ res/values-bs-rBA/strings.xml | 4 ++++ res/values-ca/strings.xml | 4 ++++ res/values-cs/strings.xml | 4 ++++ res/values-da/strings.xml | 4 ++++ res/values-de/strings.xml | 4 ++++ res/values-el/strings.xml | 4 ++++ res/values-en-rAU/strings.xml | 4 ++++ res/values-en-rGB/strings.xml | 4 ++++ res/values-en-rIN/strings.xml | 4 ++++ res/values-es-rUS/strings.xml | 4 ++++ res/values-es/strings.xml | 4 ++++ res/values-et-rEE/strings.xml | 4 ++++ res/values-eu-rES/strings.xml | 4 ++++ res/values-fa/strings.xml | 4 ++++ res/values-fi/strings.xml | 4 ++++ res/values-fr-rCA/strings.xml | 4 ++++ res/values-fr/strings.xml | 4 ++++ res/values-gl-rES/strings.xml | 4 ++++ res/values-gu-rIN/strings.xml | 4 ++++ res/values-hi/strings.xml | 4 ++++ res/values-hr/strings.xml | 4 ++++ res/values-hu/strings.xml | 4 ++++ res/values-hy-rAM/strings.xml | 4 ++++ res/values-in/strings.xml | 4 ++++ res/values-is-rIS/strings.xml | 4 ++++ res/values-it/strings.xml | 4 ++++ res/values-iw/strings.xml | 4 ++++ res/values-ja/strings.xml | 4 ++++ res/values-ka-rGE/strings.xml | 4 ++++ res/values-kk-rKZ/strings.xml | 4 ++++ res/values-km-rKH/strings.xml | 4 ++++ res/values-kn-rIN/strings.xml | 4 ++++ res/values-ko/strings.xml | 4 ++++ res/values-ky-rKG/strings.xml | 4 ++++ res/values-lo-rLA/strings.xml | 4 ++++ res/values-lt/strings.xml | 4 ++++ res/values-lv/strings.xml | 4 ++++ res/values-mk-rMK/strings.xml | 4 ++++ res/values-ml-rIN/strings.xml | 4 ++++ res/values-mn-rMN/strings.xml | 4 ++++ res/values-mr-rIN/strings.xml | 4 ++++ res/values-ms-rMY/strings.xml | 4 ++++ res/values-my-rMM/strings.xml | 4 ++++ res/values-nb/strings.xml | 4 ++++ res/values-ne-rNP/strings.xml | 4 ++++ res/values-nl/strings.xml | 4 ++++ res/values-pa-rIN/strings.xml | 4 ++++ res/values-pl/strings.xml | 4 ++++ res/values-pt-rPT/strings.xml | 4 ++++ res/values-pt/strings.xml | 4 ++++ res/values-ro/strings.xml | 4 ++++ res/values-ru/strings.xml | 4 ++++ res/values-si-rLK/strings.xml | 4 ++++ res/values-sk/strings.xml | 4 ++++ res/values-sl/strings.xml | 4 ++++ res/values-sq-rAL/strings.xml | 4 ++++ res/values-sr/strings.xml | 4 ++++ res/values-sv/strings.xml | 4 ++++ res/values-sw/strings.xml | 4 ++++ res/values-ta-rIN/strings.xml | 4 ++++ res/values-te-rIN/strings.xml | 4 ++++ res/values-th/strings.xml | 4 ++++ res/values-tl/strings.xml | 4 ++++ res/values-tr/strings.xml | 4 ++++ res/values-uk/strings.xml | 4 ++++ res/values-ur-rPK/strings.xml | 4 ++++ res/values-uz-rUZ/strings.xml | 4 ++++ res/values-vi/strings.xml | 4 ++++ res/values-zh-rCN/strings.xml | 4 ++++ res/values-zh-rHK/strings.xml | 4 ++++ res/values-zh-rTW/strings.xml | 4 ++++ res/values-zu/strings.xml | 4 ++++ 80 files changed, 320 insertions(+) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index b8ca41c670..0fa856c6ab 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -75,6 +75,10 @@ "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" + + + + "Onbekend" "Verwyder" "Soek" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 092ff5f395..199da7761b 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -75,6 +75,10 @@ "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "ስልኩ ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" + + + + "የማይታወቅ" "አስወግድ" "ፈልግ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 733d97f44f..0c74f938d0 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -75,6 +75,10 @@ "السماح بتدوير الشاشة الرئيسية" "عند تدوير الهاتف" "لا يسمح إعداد العرض الحالي بالتدوير" + + + + "غير معروفة" "إزالة" "بحث" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 7acb5cea4c..f0e7233517 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -75,6 +75,10 @@ "Əsas ekranın firlanmağına icazə verin" "Telefon çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" + + + + "Naməlum" "Yığışdır" "Axtarış" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 610dc10203..388b1b4432 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -75,6 +75,10 @@ "Dozvoli rotaciju početnog ekrana" "Kada se telefon rotira" "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" + + + + "Nepoznato" "Ukloni" "Pretraži" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index 4487dbf29d..21edf6208e 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -75,6 +75,10 @@ "Дазволіць паварот галоўнага экрана" "Пры павароце тэлефона" "Бягучая налада дысплэя не прадугледжвае паварот" + + + + "Невядома" "Выдаліць" "Шукаць" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 12374a1aa2..865bafc8cf 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -75,6 +75,10 @@ "Разрешаване на завъртането на началния екран" "При завъртане на телефона" "Текущата настройка на екрана не разрешава завъртане" + + + + "Няма информация" "Премахване" "Търсене" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 346dc27950..5f949924e5 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -75,6 +75,10 @@ "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "যখন ফোনটি ঘোরানো হয়" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" + + + + "অজানা" "সরান" "অনুসন্ধান" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 28d349954b..fb5a24a7d7 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -75,6 +75,10 @@ "Dozvoli rotiranje početnog ekrana" "Kada se telefon zarotira" "Trenutne postavke ekrana ne dozvoljavaju rotiranje" + + + + "Nepoznato" "Ukloni" "Traži" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 08cfe50d12..a3f8f07e31 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -75,6 +75,10 @@ "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" + + + + "Desconegut" "Suprimeix" "Cerca" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index cbaf023dea..25859837d8 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -75,6 +75,10 @@ "Povolit otáčení plochy" "Při otočení telefonu" "Aktuální nastavení displeje neumožňuje otáčení" + + + + "Neznámé" "Odstranit" "Hledat" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 2f88537a63..4b9fb9d376 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -75,6 +75,10 @@ "Tillad rotation af startskærmen" "Når telefonen roteres" "Den aktuelle indstilling for visning tillader ikke rotation" + + + + "Ukendt" "Fjern" "Søg" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 96c761b003..2f18a00d26 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -75,6 +75,10 @@ "Drehung des Startbildschirms zulassen" "Bei Drehung des Smartphones" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" + + + + "Unbekannt" "Entfernen" "Suchen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 9b3b8d159a..6a4e79e481 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -75,6 +75,10 @@ "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν το τηλέφωνο περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" + + + + "Άγνωστο" "Κατάργηση" "Αναζήτηση" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 8b969b3bc3..0d58f1d178 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -75,6 +75,10 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" + + + + "Unknown" "Remove" "Search" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 8b969b3bc3..0d58f1d178 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -75,6 +75,10 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" + + + + "Unknown" "Remove" "Search" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 8b969b3bc3..0d58f1d178 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -75,6 +75,10 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" + + + + "Unknown" "Remove" "Search" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index b358cc004a..2e9a5947dd 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -75,6 +75,10 @@ "Permitir la rotación de la pantalla principal" "Al girar el teléfono" "La configuración actual no permite la rotación de la pantalla" + + + + "Desconocido" "Eliminar" "Buscar" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 135023ce0d..f11ecab1d8 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -75,6 +75,10 @@ "Permitir rotación de la pantalla de inicio" "Al girar el teléfono" "La configuración de pantalla actual no permite girar la pantalla" + + + + "Desconocido" "Quitar" "Buscar" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 5b738d48b4..257f281c09 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -75,6 +75,10 @@ "Luba avaekraani pööramine" "Kui telefoni pööratakse" "Praegune kuvaseade ei luba pööramist" + + + + "Teadmata" "Eemalda" "Otsing" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 5d9afc1613..7e23a449ab 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -75,6 +75,10 @@ "Baimendu hasierako pantaila biratzea" "Telefonoa biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" + + + + "Ezezaguna" "Kendu" "Bilatu" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 417e139579..9876d5e881 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -75,6 +75,10 @@ "امکان دادن به چرخش صفحه اصلی" "وقتی تلفن چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" + + + + "نامشخص" "حذف" "جستجو" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 7de8412106..1c4bb88c2a 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -75,6 +75,10 @@ "Salli aloitusnäytön kiertäminen" "Kun puhelinta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." + + + + "Tuntematon" "Poista" "Haku" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index ea588e8ffd..5f00c11e3c 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -75,6 +75,10 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le mode d\'affichage actuel ne permet pas le pivotement" + + + + "Inconnu" "Supprimer" "Rechercher" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index d72b5768ff..034a6551cf 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -75,6 +75,10 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." + + + + "Inconnu" "Supprimer" "Rechercher" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index e3e8282052..f32d963bb4 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -75,6 +75,10 @@ "Permitir xirar a pantalla de inicio" "Ao xirar o teléfono" "A configuración de visualización actual non permite xirar a pantalla" + + + + "Descoñecido" "Eliminar" "Buscar" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 66fdf0291d..36cfd6efe6 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -75,6 +75,10 @@ "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" + + + + "અજાણ્યો" "દૂર કરો" "શોધો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index aaed5721af..f11d67b532 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -75,6 +75,10 @@ "होमस्क्रीन घुमाने की अनुमति दें" "फ़ोन घुुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" + + + + "अज्ञात" "निकालें" "खोजें" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 6a22b371d7..3f3adf1711 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -75,6 +75,10 @@ "Dopusti zakretanje početnog zaslona" "Kada se telefon zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" + + + + "Nepoznato" "Ukloni" "Traži" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index ff600250ea..69dae7d60b 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -75,6 +75,10 @@ "A kezdőképernyő elforgatásának engedélyezése" "A telefon elforgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" + + + + "Ismeretlen" "Eltávolítás" "Keresés" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 63690bc398..47b32191f0 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -75,6 +75,10 @@ "Թույլ տալ հիմնական էկրանի պտտումը" "Հեռախոսը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" + + + + "Անհայտ է" "Հեռացնել" "Գտնել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 6e6a0d1ca1..1d64cf8b1f 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -75,6 +75,10 @@ "Izinkan layar Utama diputar" "Saat ponsel diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" + + + + "Tidak dikenal" "Buang" "Telusuri" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 4b034c89e8..c525f57b73 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -75,6 +75,10 @@ "Leyfa snúning fyrir heimaskjá" "Þegar símanum er snúið" "Núverandi skjástilling leyfir ekki snúning" + + + + "Óþekkt" "Fjarlægja" "Leita" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index ffc640576e..fd522de9ef 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -75,6 +75,10 @@ "Consenti rotazione della schermata Home" "Con il telefono ruotato" "L\'impostazione corrente del display non consente la rotazione" + + + + "Sconosciuto" "Rimuovi" "Cerca" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index a92447f8d0..e037d2139f 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -75,6 +75,10 @@ "אפשרות סיבוב של מסך דף הבית" "כאשר הטלפון מסובב" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" + + + + "לא ידוע" "הסר" "חפש" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 0b3f57bb25..3003cacfed 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -75,6 +75,10 @@ "ホーム画面の回転を許可" "スマートフォンが回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" + + + + "不明" "削除" "検索" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 57ec4ffe75..8f1edfc4d7 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -75,6 +75,10 @@ "მთავარი ეკრანის შეტრიალების დაშვება" "ტელეფონის შეტრიალებისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" + + + + "უცნობი" "ამოშლა" "ძიება" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 2a8362b8dd..dfb5aea494 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -75,6 +75,10 @@ "Негізгі экранның бұрылуына рұқсат ету" "Телефон бұрылғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" + + + + "Белгісіз" "Алып тастау" "Іздеу" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 373fab6259..dbfe9d369d 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -75,6 +75,10 @@ "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" + + + + "មិន​ស្គាល់" "លុបចេញ" "ស្វែងរក" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 437f194933..4817b28742 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -75,6 +75,10 @@ "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" + + + + "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" "ಹುಡುಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 9540a252c5..5d67857acf 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -75,6 +75,10 @@ "홈 화면 회전 허용" "휴대전화 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." + + + + "알 수 없음" "삭제" "검색" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index bfdb052ac4..a43a7ebabf 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -75,6 +75,10 @@ "Башкы экранды айлантууга уруксат берүү" "Телефон айланганда" "Экранды айлантуу параметри өчүрүлгөн" + + + + "Белгисиз" "Алып салуу" "Издөө" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 9fd29ded9d..2de98dd9c1 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -75,6 +75,10 @@ "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນໂທລະສັບ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" + + + + "​ບໍ່​ຮູ້​ຈັກ" "ລຶບ​" "ຊອກຫາ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 8c6c5439b2..41298d792f 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -75,6 +75,10 @@ "Leisti pasukti pagrindinį ekraną" "Kai telefonas pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" + + + + "Nežinoma" "Pašalinti" "Ieškoti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 7b4c23634f..e623a63bbf 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -75,6 +75,10 @@ "Atļaut sākuma ekrāna pagriešanu" "Pagriežot tālruni" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." + + + + "Nezināma" "Noņemt" "Meklēt" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index b6f24cfbf0..e267c40a17 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -75,6 +75,10 @@ "Дозволете ротација на Почетниот екран" "Кога телефонот се ротира" "Тековната поставка на Екранот не дозволува ротација" + + + + "Непознато" "Отстрани" "Барај" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 4d435c0e53..37b0f4bbe0 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -75,6 +75,10 @@ "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" + + + + "അജ്ഞാതം" "നീക്കംചെയ്യുക" "തിരയുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 718b92085e..81f41daff1 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -75,6 +75,10 @@ "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Утсыг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" + + + + "Тодорхойгүй" "Устгах" "Хайх" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index ba2e07db33..424d69de4b 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -75,6 +75,10 @@ "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "फोन फिरविला जातो तेव्हा" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" + + + + "अज्ञात" "काढा" "शोधा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 18dbcff5c5..748ebd1227 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -75,6 +75,10 @@ "Benarkan putaran Skrin Utama" "Apabila telefon diputar" "Tetapan Paparan semasa tidak membenarkan putaran" + + + + "Tidak diketahui" "Alih keluar" "Carian" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index df0d2b00f4..3f7bf241f4 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -75,6 +75,10 @@ "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" "ဖုန်းကိုလှည့်ထားစဉ်" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" + + + + "မသိရ" "ဖယ်ရှားရန်" "ရှာဖွေရန်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 5f428907bd..21e15bedf7 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -75,6 +75,10 @@ "Tillat rotasjon av startskjermen" "Når telefonen roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" + + + + "Ukjent" "Fjern" "Søk" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 9670c6198d..1012f765ad 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -75,6 +75,10 @@ "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "फोनलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" + + + + "अज्ञात" "हटाउनुहोस्" "खोजी गर्नुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 80a5a9c372..e6c64990ed 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -75,6 +75,10 @@ "Draaien van startscherm toestaan" "Wanneer de telefoon gedraaid is" "Huidige scherminstelling staat draaien niet toe" + + + + "Onbekend" "Verwijderen" "Zoeken" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 87ebf9ce7e..719ade8916 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -75,6 +75,10 @@ "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" + + + + "ਅਗਿਆਤ" "ਹਟਾਓ" "ਖੋਜੋ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index a7edf72e8c..b56a0c0058 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -75,6 +75,10 @@ "Zezwalaj na obrót ekranu głównego" "Po obróceniu telefonu" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" + + + + "Brak informacji" "Usuń" "Szukaj" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index d06702b20c..5e4641b784 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -75,6 +75,10 @@ "Permitir rotação do ecrã principal" "Quando o telemóvel é rodado" "A definição de visualização atual não permite a rotação" + + + + "Desconhecido" "Remover" "Pesquisar" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index c5a11717c0..40919acc9a 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -75,6 +75,10 @@ "Permitir rotação da tela inicial" "Quando o smartphone for girado" "A configuração atual de exibição não permite rotação" + + + + "Desconhecido" "Remover" "Pesquisar" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 2b63ef38a4..e629299333 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -75,6 +75,10 @@ "Permiteți rotirea ecranului de pornire" "Când telefonul este rotit" "Setarea actuală a afișajului nu permite rotirea" + + + + "Necunoscut" "Eliminați" "Căutați" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index fa523d3151..786f3de619 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -75,6 +75,10 @@ "Разрешить поворачивать главный экран" "Когда телефон повернут" "В настройках отключен поворот экрана" + + + + "Неизвестно" "Удалить" "Найти" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 6ea617fd45..7a450e4983 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -75,6 +75,10 @@ "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "දුරකථනය කරකවන විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" + + + + "නොදනී" "ඉවත් කරන්න" "සොයන්න" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 90e81807ca..93c1d26719 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -75,6 +75,10 @@ "Povoliť otáčanie plochy" "Pri otočení telefónu" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" + + + + "Neznáme" "Odstrániť" "Vyhľadať" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index f4cb4ae6df..5274e4b846 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -75,6 +75,10 @@ "Omogočanje sukanja začetnega zaslona" "Ko se telefon zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" + + + + "Neznano" "Odstrani" "Iskanje" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index d8f025a66f..66a3f1d46a 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -75,6 +75,10 @@ "Lejo rrotullimin e ekranit kryesor" "Kur telefoni rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" + + + + "I panjohur" "Hiq" "Kërko" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 924df7f125..5a6df3a5db 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -75,6 +75,10 @@ "Дозволи ротацију почетног екрана" "Када се телефон ротира" "Актуелно подешавање приказа не дозвољава ротацију" + + + + "Непознато" "Уклони" "Претражи" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index a77a4021c5..3730e8f659 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -75,6 +75,10 @@ "Tillåt rotering av startskärmen" "När mobilen vrids" "Rotering tillåts inte i de nuvarande skärminställningarna" + + + + "Okänt" "Ta bort" "Sök" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 1eda703ca1..05540c9071 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -77,6 +77,10 @@ "Ruhusu kuzungusha skrini ya Kwanza" "Simu inapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" + + + + "Yasiyojulikana" "Ondoa" "Tafuta" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index f2d3e09c30..59f29fb168 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -75,6 +75,10 @@ "முகப்புத் திரை சுழற்சியை அனுமதி" "மொபைலைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" + + + + "தெரியாதது" "அகற்று" "தேடு" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 668710fd49..54a78a2d48 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -75,6 +75,10 @@ "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "ఫోన్‌‌ను తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" + + + + "తెలియదు" "తీసివేయి" "శోధించు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 0e3fea16f2..109c61fe60 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -75,6 +75,10 @@ "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนโทรศัพท์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" + + + + "ไม่รู้จัก" "ลบ" "ค้นหา" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 172f855862..a2f5fcfa10 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -75,6 +75,10 @@ "Payagan ang pag-rotate ng Home screen" "Kailan maro-rotate ang telepono" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" + + + + "Hindi kilala" "Alisin" "Maghanap" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index b8a02efdbe..f55331d229 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -75,6 +75,10 @@ "Ana ekranı döndürmeye izin ver" "Telefon döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" + + + + "Bilinmiyor" "Kaldır" "Ara" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 1e5c42aec7..420b9284b7 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -75,6 +75,10 @@ "Дозволити обертання головного екрана" "Коли телефон обертається" "Поточні налаштування дисплея не підтримують обертання" + + + + "Невідомо" "Видалити" "Шукати" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 3508d5bef3..e5c7c58ce9 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -75,6 +75,10 @@ "ہوم اسکرین گھمانے کی اجازت دیں" "جب فون گھمایا جاتا ہے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" + + + + "نامعلوم" "ہٹائیں" "تلاش کریں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index af6eabd4ae..8e050b87ee 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -75,6 +75,10 @@ "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" + + + + "Noma’lum" "O‘chirish" "Qidirish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index dcaf872727..462d365c99 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -75,6 +75,10 @@ "Cho phép xoay Màn hình chính" "Khi xoay điện thoại" "Cài đặt Hiển thị hiện tại không cho phép xoay" + + + + "Không xác định" "Xóa" "Tìm kiếm" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 09b89669b9..e54499bd8b 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -75,6 +75,10 @@ "允许旋转主屏幕" "手机旋转时" "当前的显示设置不允许旋转设备" + + + + "未知" "移除" "搜索" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 61138c6b78..04e1435388 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -75,6 +75,10 @@ "允許主畫面旋轉" "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" + + + + "不明" "移除" "搜尋" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index a54671b657..6a28e4cd72 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -75,6 +75,10 @@ "允許旋轉主螢幕" "當手機旋轉時" "目前的顯示設定不允許旋轉畫面" + + + + "不明" "移除" "搜尋" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 9c0c7e84ef..55c3ed650c 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -75,6 +75,10 @@ "Vumela ukuphendukiswa kwesikrini sasekhaya" "Uma ifoni iphendukiswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" + + + + "Akwaziwa" "Susa" "Sesha" From a7cddd2c9649a8bab7c860374c5d95c0a4b7135c Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 14 Mar 2017 14:12:19 -0700 Subject: [PATCH 022/446] Refactor Folder/FolderAnimationManager code. * FolderAnimationManager is now lazy loaded. * Extract methods to simplify code. Bug: 35064148 Change-Id: I08a72ef19a1f21637f033059d5e228ef67135ccd --- src/com/android/launcher3/folder/Folder.java | 49 ++++-- .../folder/FolderAnimationManager.java | 152 +++++++----------- 2 files changed, 96 insertions(+), 105 deletions(-) diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 6262231be4..94b17c35b4 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -135,7 +135,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC @Thunk final ArrayList mItemsInReadingOrder = new ArrayList(); - private FolderAnimationManager mFolderAnimationManager; + private AnimatorSet mCurrentAnimator; private final int mExpandDuration; public final int mMaterialExpandDuration; @@ -479,8 +479,6 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } } }); - - mFolderAnimationManager = new FolderAnimationManager(this); } /** @@ -516,7 +514,30 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mState = STATE_SMALL; } - private AnimatorSet getOpeningAnimatorSet() { + private void startAnimation(final AnimatorSet a) { + long startTime = 0; + if (mCurrentAnimator != null && mCurrentAnimator.isRunning()) { + // This allows a nice transition when closing a Folder while it is still animating open. + startTime = mCurrentAnimator.getDuration() - mCurrentAnimator.getCurrentPlayTime(); + mCurrentAnimator.cancel(); + } + a.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mState = STATE_ANIMATING; + mCurrentAnimator = a; + } + + @Override + public void onAnimationEnd(Animator animation) { + mCurrentAnimator = null; + } + }); + a.setCurrentPlayTime(startTime); + a.start(); + } + + private AnimatorSet getOpeningAnimator() { prepareReveal(); mFolderIcon.growAndFadeOut(); @@ -613,8 +634,8 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC centerAboutIcon(); AnimatorSet anim = FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION - ? mFolderAnimationManager.getOpeningAnimator() - : getOpeningAnimatorSet(); + ? new FolderAnimationManager(this, true /* isOpening */).getAnimator() + : getOpeningAnimator(); onCompleteRunnable = new Runnable() { @Override public void run() { @@ -624,11 +645,14 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { + if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) { + mFolderIcon.setVisibility(INVISIBLE); + } + Utilities.sendCustomAccessibilityEvent( Folder.this, AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, mContent.getAccessibilityDescription()); - mState = STATE_ANIMATING; } @Override public void onAnimationEnd(Animator animation) { @@ -680,7 +704,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } mPageIndicator.stopAllAnimations(); - anim.start(); + startAnimation(anim); // Make sure the folder picks up the last drag move even if the finger doesn't move. if (mDragController.isDragging()) { @@ -736,7 +760,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC parent.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } - private AnimatorSet getClosingAnimatorSet() { + private AnimatorSet getClosingAnimator() { AnimatorSet animatorSet = LauncherAnimUtils.createAnimatorSet(); animatorSet.play(LauncherAnimUtils.ofViewAlphaAndScale(this, 0, 0.9f, 0.9f)); @@ -749,8 +773,8 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC private void animateClosed() { AnimatorSet a = FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION - ? mFolderAnimationManager.getClosingAnimator() - : getClosingAnimatorSet(); + ? new FolderAnimationManager(this, false /* isOpening */).getAnimator() + : getClosingAnimator(); a.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { @@ -762,10 +786,9 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC Folder.this, AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, getContext().getString(R.string.folder_closed)); - mState = STATE_ANIMATING; } }); - a.start(); + startAnimation(a); } private void closeComplete(boolean wasAnimated) { diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index 6ce572d94f..c1c974ca31 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -62,7 +62,8 @@ public class FolderAnimationManager { private Context mContext; private Launcher mLauncher; - private Animator mRevealAnimator; + private final boolean mIsOpening; + private final TimeInterpolator mOpeningInterpolator; private final TimeInterpolator mClosingInterpolator; private final TimeInterpolator mPreviewItemOpeningInterpolator; @@ -102,7 +103,7 @@ public class FolderAnimationManager { } }; - public FolderAnimationManager(Folder folder) { + public FolderAnimationManager(Folder folder, boolean isOpening) { mFolder = folder; mContent = folder.mContent; mFolderBackground = (GradientDrawable) mFolder.getBackground(); @@ -113,6 +114,8 @@ public class FolderAnimationManager { mContext = folder.getContext(); mLauncher = folder.mLauncher; + mIsOpening = isOpening; + mOpeningInterpolator = AnimationUtils.loadInterpolator(mContext, R.interpolator.folder_opening_interpolator); mClosingInterpolator = AnimationUtils.loadInterpolator(mContext, @@ -123,31 +126,11 @@ public class FolderAnimationManager { R.interpolator.folder_preview_item_closing_interpolator); } - public AnimatorSet getOpeningAnimator() { - mFolder.setPivotX(0); - mFolder.setPivotY(0); - - AnimatorSet a = getAnimatorSet(true /* isOpening */); - a.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - mFolderIcon.setVisibility(View.INVISIBLE); - } - }); - return a; - } - - public AnimatorSet getClosingAnimator() { - AnimatorSet a = getAnimatorSet(false /* isOpening */); - return a; - } /** * Prepares the Folder for animating between open / closed states. - * - * @param isOpening If true, return the animator set for the opening animation. */ - private AnimatorSet getAnimatorSet(final boolean isOpening) { + public AnimatorSet getAnimator() { final DragLayer.LayoutParams lp = (DragLayer.LayoutParams) mFolder.getLayoutParams(); FolderIcon.PreviewLayoutRule rule = mFolderIcon.getLayoutRule(); final List itemsInPreview = mFolderIcon.getItemsToDisplay(); @@ -159,9 +142,11 @@ public class FolderAnimationManager { final float initialScale = folderScale; final float finalScale = 1f; - float scale = isOpening ? initialScale : finalScale; + float scale = mIsOpening ? initialScale : finalScale; mFolder.setScaleX(scale); mFolder.setScaleY(scale); + mFolder.setPivotX(0); + mFolder.setPivotY(0); // Match position of the FolderIcon final Rect folderIconPos = new Rect(); @@ -189,45 +174,14 @@ public class FolderAnimationManager { final int finalColor = Themes.getAttrColor(mContext, android.R.attr.colorPrimary); final int initialColor = ColorUtils.setAlphaComponent(finalColor, mPreviewBackground.getBackgroundAlpha()); - mFolderBackground.setColor(isOpening ? initialColor : finalColor); + mFolderBackground.setColor(mIsOpening ? initialColor : finalColor); // Initialize the Folder items' text. - final List itemsOnCurrentPage = mFolder.getItemsOnCurrentPage(); + final List items = mFolder.getItemsOnCurrentPage(); final int finalTextColor = Themes.getAttrColor(mContext, android.R.attr.textColorSecondary); - ITEMS_TEXT_COLOR_PROPERTY.set(itemsOnCurrentPage, isOpening ? Color.TRANSPARENT + ITEMS_TEXT_COLOR_PROPERTY.set(items, mIsOpening ? Color.TRANSPARENT : finalTextColor); - // Create the animators. - AnimatorSet a = LauncherAnimUtils.createAnimatorSet(); - a.setDuration(mFolder.mMaterialExpandDuration); - - ObjectAnimator translationX = isOpening - ? ObjectAnimator.ofFloat(mFolder, View.TRANSLATION_X, xDistance, 0) - : ObjectAnimator.ofFloat(mFolder, View.TRANSLATION_X, 0, xDistance); - a.play(translationX); - - ObjectAnimator translationY = isOpening - ? ObjectAnimator.ofFloat(mFolder, View.TRANSLATION_Y, yDistance, 0) - : ObjectAnimator.ofFloat(mFolder, View.TRANSLATION_Y, 0, yDistance); - a.play(translationY); - - ObjectAnimator scaleAnimator = isOpening - ? ObjectAnimator.ofFloat(mFolder, SCALE_PROPERTY, initialScale, finalScale) - : ObjectAnimator.ofFloat(mFolder, SCALE_PROPERTY, finalScale, initialScale); - a.play(scaleAnimator); - - ObjectAnimator itemsTextColor = isOpening - ? ObjectAnimator.ofArgb(itemsOnCurrentPage, ITEMS_TEXT_COLOR_PROPERTY, - Color.TRANSPARENT, finalTextColor) - : ObjectAnimator.ofArgb(itemsOnCurrentPage, ITEMS_TEXT_COLOR_PROPERTY, - finalTextColor, Color.TRANSPARENT); - a.play(itemsTextColor); - - ObjectAnimator backgroundColor = isOpening - ? ObjectAnimator.ofArgb(mFolderBackground, "color", initialColor, finalColor) - : ObjectAnimator.ofArgb(mFolderBackground, "color", finalColor, initialColor); - a.play(backgroundColor); - // Set up the reveal animation that clips the Folder. float stroke = mPreviewBackground.getStrokeWidth(); int initialSize = (int) ((mFolderIcon.mBackground.getRadius() * 2 + stroke) / folderScale); @@ -236,50 +190,52 @@ public class FolderAnimationManager { Rect startRect = new Rect(totalOffsetX + unscaledStroke, unscaledStroke, totalOffsetX + initialSize, initialSize); Rect endRect = new Rect(0, 0, lp.width, lp.height); - a.play(getRevealAnimator(isOpening, initialSize / 2f, startRect, endRect)); + float finalRadius = Utilities.pxFromDp(2, mContext.getResources().getDisplayMetrics()); + + // Create the animators. + AnimatorSet a = LauncherAnimUtils.createAnimatorSet(); + a.setDuration(mFolder.mMaterialExpandDuration); + + a.play(getAnimator(mFolder, View.TRANSLATION_X, xDistance, 0f)); + a.play(getAnimator(mFolder, View.TRANSLATION_Y, yDistance, 0f)); + a.play(getAnimator(mFolder, SCALE_PROPERTY, initialScale, finalScale)); + a.play(getAnimator(items, ITEMS_TEXT_COLOR_PROPERTY, Color.TRANSPARENT, finalTextColor)); + a.play(getAnimator(mFolderBackground, "color", initialColor, finalColor)); + a.play(new RoundedRectRevealOutlineProvider(initialSize / 2f, finalRadius, startRect, + endRect).createRevealAnimator(mFolder, !mIsOpening)); a.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); - ITEMS_TEXT_COLOR_PROPERTY.set(itemsOnCurrentPage, finalTextColor); + ITEMS_TEXT_COLOR_PROPERTY.set(items, finalTextColor); + mFolder.setTranslationX(0.0f); + mFolder.setTranslationY(0.0f); + mFolder.setScaleX(1f); + mFolder.setScaleY(1f); } }); // We set the interpolator on all current child animators here, because the preview item // animators may use a different interpolator. for (Animator animator : a.getChildAnimations()) { - animator.setInterpolator(isOpening ? mOpeningInterpolator : mClosingInterpolator); + animator.setInterpolator(mIsOpening ? mOpeningInterpolator : mClosingInterpolator); } - addPreviewItemAnimatorsToSet(a, isOpening, folderScale, nudgeOffsetX); + addPreviewItemAnimatorsToSet(a, folderScale, nudgeOffsetX); return a; } - private Animator getRevealAnimator(boolean isOpening, float circleRadius, Rect start, - Rect end) { - boolean revealIsRunning = mRevealAnimator != null && mRevealAnimator.isRunning(); - final float finalRadius = revealIsRunning - ? ((RoundedRectRevealOutlineProvider) mFolder.getOutlineProvider()).getRadius() - : Utilities.pxFromDp(2, mContext.getResources().getDisplayMetrics()); - if (revealIsRunning) { - mRevealAnimator.cancel(); - } - mRevealAnimator = new RoundedRectRevealOutlineProvider(circleRadius, finalRadius, - start, end).createRevealAnimator(mFolder, !isOpening); - return mRevealAnimator; - } - /** * Animate the items that are displayed in the preview. */ - private void addPreviewItemAnimatorsToSet(AnimatorSet animatorSet, boolean isOpening, - final float folderScale, int nudgeOffsetX) { + private void addPreviewItemAnimatorsToSet(AnimatorSet animatorSet, final float folderScale, + int nudgeOffsetX) { FolderIcon.PreviewLayoutRule rule = mFolderIcon.getLayoutRule(); final List itemsInPreview = mFolderIcon.getItemsToDisplay(); final int numItemsInPreview = itemsInPreview.size(); - TimeInterpolator previewItemInterpolator = getPreviewItemInterpolator(isOpening); + TimeInterpolator previewItemInterpolator = getPreviewItemInterpolator(); ShortcutAndWidgetContainer cwc = mContent.getPageAt(0).getShortcutsAndWidgets(); for (int i = 0; i < numItemsInPreview; ++i) { @@ -297,7 +253,7 @@ public class FolderAnimationManager { final float initialScale = iconScale / folderScale; final float finalScale = 1f; - float scale = isOpening ? initialScale : finalScale; + float scale = mIsOpening ? initialScale : finalScale; btv.setScaleX(scale); btv.setScaleY(scale); @@ -314,21 +270,15 @@ public class FolderAnimationManager { final float xDistance = previewPosX - btvLp.x; final float yDistance = previewPosY - btvLp.y; - ObjectAnimator translationX = isOpening - ? ObjectAnimator.ofFloat(btv, View.TRANSLATION_X, xDistance, 0) - : ObjectAnimator.ofFloat(btv, View.TRANSLATION_X, 0, xDistance); + Animator translationX = getAnimator(btv, View.TRANSLATION_X, xDistance, 0f); translationX.setInterpolator(previewItemInterpolator); animatorSet.play(translationX); - ObjectAnimator translationY = isOpening - ? ObjectAnimator.ofFloat(btv, View.TRANSLATION_Y, yDistance, 0) - : ObjectAnimator.ofFloat(btv, View.TRANSLATION_Y, 0, yDistance); + Animator translationY = getAnimator(btv, View.TRANSLATION_Y, yDistance, 0f); translationY.setInterpolator(previewItemInterpolator); animatorSet.play(translationY); - ObjectAnimator scaleAnimator = isOpening - ? ObjectAnimator.ofFloat(btv, SCALE_PROPERTY, initialScale, finalScale) - : ObjectAnimator.ofFloat(btv, SCALE_PROPERTY, finalScale, initialScale); + Animator scaleAnimator = getAnimator(btv, SCALE_PROPERTY, initialScale, finalScale); scaleAnimator.setInterpolator(previewItemInterpolator); animatorSet.play(scaleAnimator); @@ -345,13 +295,31 @@ public class FolderAnimationManager { } } - private TimeInterpolator getPreviewItemInterpolator(boolean isOpening) { + private TimeInterpolator getPreviewItemInterpolator() { if (mFolder.getItemCount() > FolderIcon.NUM_ITEMS_IN_PREVIEW) { // With larger folders, we want the preview items to reach their final positions faster // (when opening) and later (when closing) so that they appear aligned with the rest of // the folder items when they are both visible. - return isOpening ? mPreviewItemOpeningInterpolator : mPreviewItemClosingInterpolator; + return mIsOpening ? mPreviewItemOpeningInterpolator : mPreviewItemClosingInterpolator; } - return isOpening ? mOpeningInterpolator : mClosingInterpolator; + return mIsOpening ? mOpeningInterpolator : mClosingInterpolator; + } + + private Animator getAnimator(View view, Property property, float v1, float v2) { + return mIsOpening + ? ObjectAnimator.ofFloat(view, property, v1, v2) + : ObjectAnimator.ofFloat(view, property, v2, v1); + } + + private Animator getAnimator(List items, Property property, int v1, int v2) { + return mIsOpening + ? ObjectAnimator.ofArgb(items, property, v1, v2) + : ObjectAnimator.ofArgb(items, property, v2, v1); + } + + private Animator getAnimator(GradientDrawable drawable, String property, int v1, int v2) { + return mIsOpening + ? ObjectAnimator.ofArgb(drawable, property, v1, v2) + : ObjectAnimator.ofArgb(drawable, property, v2, v1); } } From 817afa34472dba49b1dee0489da11f410ff09fcd Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Wed, 15 Mar 2017 11:56:47 -0700 Subject: [PATCH 023/446] Show promise app icon in All Apps while installation process. This CL only modifies the model and is behind a feature flag which per default is set to false. The app icon will appear as a promise icon, it reacts on icon or label changes and the icon will be remove on finishing the installation process. With this CL the progress of the installation process is not visible. Bug: 23952570 Change-Id: I510825d0b0b1b01eb14f7e50f0a2358b0d8b99b5 --- src/com/android/launcher3/AllAppsList.java | 56 ++++++++------- src/com/android/launcher3/IconCache.java | 3 +- src/com/android/launcher3/LauncherModel.java | 32 +++++++++ src/com/android/launcher3/PromiseAppInfo.java | 47 +++++++++++++ .../compat/PackageInstallerCompat.java | 31 +++++++-- .../compat/PackageInstallerCompatVL.java | 69 +++++++++++++++---- .../model/PackageInstallStateChangedTask.java | 44 +++++++++++- .../launcher3/config/FeatureFlags.java | 3 +- .../PackageInstallStateChangedTaskTest.java | 5 +- 9 files changed, 242 insertions(+), 48 deletions(-) create mode 100644 src/com/android/launcher3/PromiseAppInfo.java diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index 5b42cad963..d7f0180fa2 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -18,10 +18,15 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; +import android.os.Process; import android.os.UserHandle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.ItemInfoMatcher; @@ -69,7 +74,7 @@ public class AllAppsList { if (!mAppFilter.shouldShowApp(info.componentName)) { return; } - if (findActivity(data, info.componentName, info.user)) { + if (findAppInfo(info.componentName, info.user) != null) { return; } mIconCache.getTitleAndIcon(info, activityInfo, true /* useLowResIcon */); @@ -78,6 +83,25 @@ public class AllAppsList { added.add(info); } + public void addPromiseApp(Context context, + PackageInstallerCompat.PackageInstallInfo installInfo) { + ApplicationInfo applicationInfo = LauncherAppsCompat.getInstance(context) + .getApplicationInfo(installInfo.packageName, 0, Process.myUserHandle()); + // only if not yet installed + if (applicationInfo == null) { + PromiseAppInfo info = new PromiseAppInfo(installInfo); + mIconCache.getTitleAndIcon(info, info.usingLowResIcon); + data.add(info); + added.add(info); + } + } + + public void removePromiseApp(AppInfo appInfo) { + // the removed list is handled by the caller + // so not adding it here + data.remove(appInfo); + } + public void clear() { data.clear(); // TODO: do we clear these too? @@ -169,9 +193,7 @@ public class AllAppsList { // Find enabled activities and add them to the adapter // Also updates existing activities with new labels/icons for (final LauncherActivityInfo info : matches) { - AppInfo applicationInfo = findApplicationInfoLocked( - info.getComponentName().getPackageName(), user, - info.getComponentName().getClassName()); + AppInfo applicationInfo = findAppInfo(info.getComponentName(), user); if (applicationInfo == null) { add(new AppInfo(context, info, user), info); } else { @@ -208,28 +230,14 @@ public class AllAppsList { } /** - * Returns whether apps contains component. + * Find an AppInfo object for the given componentName + * + * @return the corresponding AppInfo or null */ - private static boolean findActivity(ArrayList apps, ComponentName component, - UserHandle user) { - final int N = apps.size(); - for (int i = 0; i < N; i++) { - final AppInfo info = apps.get(i); - if (info.user.equals(user) && info.componentName.equals(component)) { - return true; - } - } - return false; - } - - /** - * Find an ApplicationInfo object for the given packageName and className. - */ - private AppInfo findApplicationInfoLocked(String packageName, UserHandle user, - String className) { + private @Nullable AppInfo findAppInfo(@NonNull ComponentName componentName, + @NonNull UserHandle user) { for (AppInfo info: data) { - if (user.equals(info.user) && packageName.equals(info.componentName.getPackageName()) - && className.equals(info.componentName.getClassName())) { + if (componentName.equals(info.componentName) && user.equals(info.user)) { return info; } } diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 1f473a26f6..a5552aafdc 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -437,9 +437,10 @@ public class IconCache { * Updates {@param application} only if a valid entry is found. */ public synchronized void updateTitleAndIcon(AppInfo application) { + boolean usePackageIcon = application instanceof PromiseAppInfo; CacheEntry entry = cacheLocked(application.componentName, Provider.of(null), - application.user, false, application.usingLowResIcon); + application.user, usePackageIcon, application.usingLowResIcon); if (entry.icon != null && !isDefaultIcon(entry.icon, application.user)) { applyCacheEntry(entry, application); } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 35811d38a2..707ec8642d 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -25,7 +25,9 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; +import android.content.pm.PackageInstaller; import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; @@ -573,6 +575,25 @@ public class LauncherModel extends BroadcastReceiver screensUri, null, null, null, LauncherSettings.WorkspaceScreens.SCREEN_RANK)); } + public void onInstallSessionCreated(final PackageInstallInfo sessionInfo) { + enqueueModelUpdateTask(new ExtendedModelTask() { + @Override + public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { + apps.addPromiseApp(app.getContext(), sessionInfo); + if (!apps.added.isEmpty()) { + final ArrayList arrayList = new ArrayList<>(apps.added); + apps.added.clear(); + scheduleCallbackTask(new CallbackTask() { + @Override + public void execute(Callbacks callbacks) { + callbacks.bindAppsAdded(null, null, null, arrayList); + } + }); + } + } + }); + } + /** * Runnable for the thread that loads the contents of the launcher: * - workspace icons @@ -1691,10 +1712,21 @@ public class LauncherModel extends BroadcastReceiver }); } } + + if (FeatureFlags.LAUNCHER3_PROMISE_APPS_IN_ALL_APPS) { + // get all active sessions and add them to the all apps list + PackageInstallerCompat installer = PackageInstallerCompat.getInstance(mContext); + for (PackageInstaller.SessionInfo info : installer.getAllVerifiedSessions()) { + mBgAllAppsList.addPromiseApp(mContext, + PackageInstallInfo.fromInstallingState(info)); + } + } + // Huh? Shouldn't this be inside the Runnable below? final ArrayList added = mBgAllAppsList.added; mBgAllAppsList.added = new ArrayList(); + // Post callback on main thread mUiExecutor.execute(new Runnable() { public void run() { diff --git a/src/com/android/launcher3/PromiseAppInfo.java b/src/com/android/launcher3/PromiseAppInfo.java new file mode 100644 index 0000000000..04ba1d366f --- /dev/null +++ b/src/com/android/launcher3/PromiseAppInfo.java @@ -0,0 +1,47 @@ +/* + * 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. + */ + +package com.android.launcher3; + +import android.content.Intent; +import android.support.annotation.NonNull; + +import com.android.launcher3.compat.PackageInstallerCompat; + +public class PromiseAppInfo extends AppInfo { + + public int level = 0; + + public PromiseAppInfo(@NonNull PackageInstallerCompat.PackageInstallInfo installInfo) { + componentName = installInfo.componentName; + intent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_LAUNCHER) + .setComponent(componentName) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + } + + @Override + public ShortcutInfo makeShortcut() { + ShortcutInfo shortcut = new ShortcutInfo(this); + shortcut.setInstallProgress(level); + // We need to update the component name when the apk is installed + shortcut.status |= ShortcutInfo.FLAG_AUTOINTALL_ICON; + // Since the user is manually placing it on homescreen, it should not be auto-removed later + shortcut.status |= ShortcutInfo.FLAG_RESTORE_STARTED; + return shortcut; + } +} diff --git a/src/com/android/launcher3/compat/PackageInstallerCompat.java b/src/com/android/launcher3/compat/PackageInstallerCompat.java index c7fe0cec83..112cca5402 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompat.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompat.java @@ -16,9 +16,13 @@ package com.android.launcher3.compat; +import android.content.ComponentName; import android.content.Context; +import android.content.pm.PackageInstaller; +import android.support.annotation.NonNull; import java.util.HashMap; +import java.util.List; public abstract class PackageInstallerCompat { @@ -46,19 +50,34 @@ public abstract class PackageInstallerCompat { public abstract void onStop(); public static final class PackageInstallInfo { + public final ComponentName componentName; public final String packageName; + public final int state; + public final int progress; - public int state; - public int progress; - - public PackageInstallInfo(String packageName) { - this.packageName = packageName; + private PackageInstallInfo(@NonNull PackageInstaller.SessionInfo info) { + this.state = STATUS_INSTALLING; + this.packageName = info.getAppPackageName(); + this.componentName = new ComponentName(packageName, ""); + this.progress = (int) (info.getProgress() * 100f); } public PackageInstallInfo(String packageName, int state, int progress) { - this.packageName = packageName; this.state = state; + this.packageName = packageName; + this.componentName = new ComponentName(packageName, ""); this.progress = progress; } + + public static PackageInstallInfo fromInstallingState(PackageInstaller.SessionInfo info) { + return new PackageInstallInfo(info); + } + + public static PackageInstallInfo fromState(int state, String packageName) { + return new PackageInstallInfo(packageName, state, 0 /* progress */); + } + } + + public abstract List getAllVerifiedSessions(); } diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index b87582f552..d7cd032f7b 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -17,6 +17,7 @@ package com.android.launcher3.compat; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageInstaller.SessionCallback; import android.content.pm.PackageInstaller.SessionInfo; @@ -28,23 +29,31 @@ import android.util.SparseArray; import com.android.launcher3.IconCache; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.Thunk; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; +import java.util.List; public class PackageInstallerCompatVL extends PackageInstallerCompat { + private static final boolean DEBUG = false; + @Thunk final SparseArray mActiveSessions = new SparseArray<>(); @Thunk final PackageInstaller mInstaller; private final IconCache mCache; private final Handler mWorker; + private final Context mAppContext; + private final HashMap mSessionVerifiedMap = new HashMap<>(); PackageInstallerCompatVL(Context context) { + mAppContext = context.getApplicationContext(); mInstaller = context.getPackageManager().getPackageInstaller(); mCache = LauncherAppState.getInstance(context).getIconCache(); mWorker = new Handler(LauncherModel.getWorkerLooper()); - mInstaller.registerSessionCallback(mCallback, mWorker); } @@ -52,7 +61,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { public HashMap updateAndGetActiveSessionCache() { HashMap activePackages = new HashMap<>(); UserHandle user = Process.myUserHandle(); - for (SessionInfo info : mInstaller.getAllSessions()) { + for (SessionInfo info : getAllVerifiedSessions()) { addSessionInfoToCache(info, user); if (info.getAppPackageName() != null) { activePackages.put(info.getAppPackageName(), (int) (info.getProgress() * 100)); @@ -86,7 +95,14 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { @Override public void onCreated(int sessionId) { - pushSessionDisplayToLauncher(sessionId); + SessionInfo sessionInfo = pushSessionDisplayToLauncher(sessionId); + if (FeatureFlags.LAUNCHER3_PROMISE_APPS_IN_ALL_APPS && sessionInfo != null) { + LauncherAppState app = LauncherAppState.getInstanceNoCreate(); + if (app != null) { + app.getModel().onInstallSessionCreated( + PackageInstallInfo.fromInstallingState(sessionInfo)); + } + } } @Override @@ -97,18 +113,17 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { mActiveSessions.remove(sessionId); if (packageName != null) { - sendUpdate(new PackageInstallInfo(packageName, - success ? STATUS_INSTALLED : STATUS_FAILED, 0)); + sendUpdate(PackageInstallInfo.fromState( + success ? STATUS_INSTALLED : STATUS_FAILED, + packageName)); } } @Override public void onProgressChanged(int sessionId, float progress) { - SessionInfo session = mInstaller.getSessionInfo(sessionId); + SessionInfo session = verify(mInstaller.getSessionInfo(sessionId)); if (session != null && session.getAppPackageName() != null) { - sendUpdate(new PackageInstallInfo(session.getAppPackageName(), - STATUS_INSTALLING, - (int) (session.getProgress() * 100))); + sendUpdate(PackageInstallInfo.fromInstallingState(session)); } } @@ -120,16 +135,46 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { pushSessionDisplayToLauncher(sessionId); } - private void pushSessionDisplayToLauncher(int sessionId) { - SessionInfo session = mInstaller.getSessionInfo(sessionId); + private SessionInfo pushSessionDisplayToLauncher(int sessionId) { + SessionInfo session = verify(mInstaller.getSessionInfo(sessionId)); if (session != null && session.getAppPackageName() != null) { + mActiveSessions.put(sessionId, session.getAppPackageName()); addSessionInfoToCache(session, Process.myUserHandle()); LauncherAppState app = LauncherAppState.getInstanceNoCreate(); - if (app != null) { app.getModel().updateSessionDisplayInfo(session.getAppPackageName()); } + return session; } + return null; } }; + + private PackageInstaller.SessionInfo verify(PackageInstaller.SessionInfo sessionInfo) { + if (sessionInfo == null || sessionInfo.getInstallerPackageName() == null) { + return null; + } + String pkg = sessionInfo.getAppPackageName(); + synchronized (mSessionVerifiedMap) { + if (!mSessionVerifiedMap.containsKey(pkg)) { + LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(mAppContext); + boolean hasSystemFlag = launcherApps.getApplicationInfo(pkg, + ApplicationInfo.FLAG_SYSTEM, Process.myUserHandle()) != null; + mSessionVerifiedMap.put(pkg, DEBUG || hasSystemFlag); + } + } + return mSessionVerifiedMap.get(pkg) ? sessionInfo : null; + } + + @Override + public List getAllVerifiedSessions() { + List list = new ArrayList<>(mInstaller.getAllSessions()); + Iterator it = list.iterator(); + while (it.hasNext()) { + if (verify(it.next()) == null) { + it.remove(); + } + } + return list; + } } diff --git a/src/com/android/launcher3/model/PackageInstallStateChangedTask.java b/src/com/android/launcher3/model/PackageInstallStateChangedTask.java index 5d04325e82..9c5f18917e 100644 --- a/src/com/android/launcher3/model/PackageInstallStateChangedTask.java +++ b/src/com/android/launcher3/model/PackageInstallStateChangedTask.java @@ -18,15 +18,18 @@ package com.android.launcher3.model; import android.content.ComponentName; import com.android.launcher3.AllAppsList; +import com.android.launcher3.AppInfo; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; +import com.android.launcher3.PromiseAppInfo; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo; +import java.util.ArrayList; import java.util.HashSet; /** @@ -47,6 +50,46 @@ public class PackageInstallStateChangedTask extends ExtendedModelTask { return; } + synchronized (apps) { + final ArrayList updated = new ArrayList<>(); + final ArrayList removed = new ArrayList<>(); + for (int i=0; i < apps.size(); i++) { + final AppInfo appInfo = apps.get(i); + final ComponentName tgtComp = appInfo.getTargetComponent(); + if (tgtComp != null && tgtComp.getPackageName().equals(mInstallInfo.packageName)) { + if (appInfo instanceof PromiseAppInfo) { + final PromiseAppInfo promiseAppInfo = (PromiseAppInfo) appInfo; + if (mInstallInfo.state == PackageInstallerCompat.STATUS_INSTALLING) { + promiseAppInfo.level = mInstallInfo.progress; + updated.add(appInfo); + } else if (mInstallInfo.state == PackageInstallerCompat.STATUS_FAILED + || mInstallInfo.state == PackageInstallerCompat.STATUS_INSTALLED) { + apps.removePromiseApp(appInfo); + removed.add(appInfo); + } + } + } + } + if (!updated.isEmpty()) { + scheduleCallbackTask(new CallbackTask() { + @Override + public void execute(Callbacks callbacks) { + // TODO: this currently causes unnecessary relayouts + // we need to introduce a new bindPromiseAppsChanged + callbacks.bindAppsUpdated(updated); + } + }); + } + if (!removed.isEmpty()) { + scheduleCallbackTask(new CallbackTask() { + @Override + public void execute(Callbacks callbacks) { + callbacks.bindAppInfosRemoved(removed); + } + }); + } + } + synchronized (dataModel) { final HashSet updates = new HashSet<>(); for (ItemInfo info : dataModel.itemsIdMap) { @@ -56,7 +99,6 @@ public class PackageInstallStateChangedTask extends ExtendedModelTask { if (si.isPromise() && (cn != null) && mInstallInfo.packageName.equals(cn.getPackageName())) { si.setInstallProgress(mInstallInfo.progress); - if (mInstallInfo.state == PackageInstallerCompat.STATUS_FAILED) { // Mark this info as broken. si.status &= ~ShortcutInfo.FLAG_INSTALL_SESSION_ACTIVE; diff --git a/src_flags/com/android/launcher3/config/FeatureFlags.java b/src_flags/com/android/launcher3/config/FeatureFlags.java index 87e987162e..9e20748120 100644 --- a/src_flags/com/android/launcher3/config/FeatureFlags.java +++ b/src_flags/com/android/launcher3/config/FeatureFlags.java @@ -36,7 +36,8 @@ public final class FeatureFlags { public static boolean LAUNCHER3_DIRECT_SCROLL = true; // When enabled while all-apps open, the soft input will be set to adjust resize . public static boolean LAUNCHER3_UPDATE_SOFT_INPUT_MODE = false; - + // When enabled the promise icon is visible in all apps while installation an app. + public static boolean LAUNCHER3_PROMISE_APPS_IN_ALL_APPS = false; // Feature flag to enable moving the QSB on the 0th screen of the workspace. public static final boolean QSB_ON_FIRST_SCREEN = true; diff --git a/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java b/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java index d6555620cb..ed893c42e4 100644 --- a/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java +++ b/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java @@ -21,9 +21,8 @@ public class PackageInstallStateChangedTaskTest extends BaseModelUpdateTaskTestC } private PackageInstallStateChangedTask newTask(String pkg, int progress) { - PackageInstallInfo installInfo = new PackageInstallInfo(pkg); - installInfo.progress = progress; - installInfo.state = PackageInstallerCompat.STATUS_INSTALLING; + int state = PackageInstallerCompat.STATUS_INSTALLING; + PackageInstallInfo installInfo = new PackageInstallInfo(pkg, state, progress); return new PackageInstallStateChangedTask(installInfo); } From b52d61db7e9bfd536d8b241f359ed93186a0e664 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 18 Mar 2017 04:30:10 -0700 Subject: [PATCH 024/446] Import translations. DO NOT MERGE Change-Id: Ibf2574d0c79c4dd1e0f44bcdc1b89caab9fabc01 Auto-generated-cl: translation import --- res/values-af/strings.xml | 6 ++---- res/values-am/strings.xml | 6 ++---- res/values-ar/strings.xml | 6 ++---- res/values-az-rAZ/strings.xml | 6 ++---- res/values-b+sr+Latn/strings.xml | 6 ++---- res/values-be-rBY/strings.xml | 6 ++---- res/values-bg/strings.xml | 6 ++---- res/values-bn-rBD/strings.xml | 6 ++---- res/values-bs-rBA/strings.xml | 6 ++---- res/values-ca/strings.xml | 6 ++---- res/values-cs/strings.xml | 6 ++---- res/values-da/strings.xml | 6 ++---- res/values-de/strings.xml | 6 ++---- res/values-el/strings.xml | 6 ++---- res/values-en-rAU/strings.xml | 6 ++---- res/values-en-rGB/strings.xml | 6 ++---- res/values-en-rIN/strings.xml | 6 ++---- res/values-es-rUS/strings.xml | 6 ++---- res/values-es/strings.xml | 6 ++---- res/values-et-rEE/strings.xml | 6 ++---- res/values-eu-rES/strings.xml | 6 ++---- res/values-fa/strings.xml | 6 ++---- res/values-fi/strings.xml | 6 ++---- res/values-fr-rCA/strings.xml | 6 ++---- res/values-fr/strings.xml | 6 ++---- res/values-gl-rES/strings.xml | 6 ++---- res/values-gu-rIN/strings.xml | 6 ++---- res/values-hi/strings.xml | 6 ++---- res/values-hr/strings.xml | 6 ++---- res/values-hu/strings.xml | 6 ++---- res/values-hy-rAM/strings.xml | 6 ++---- res/values-in/strings.xml | 6 ++---- res/values-is-rIS/strings.xml | 6 ++---- res/values-it/strings.xml | 6 ++---- res/values-iw/strings.xml | 6 ++---- res/values-ja/strings.xml | 6 ++---- res/values-ka-rGE/strings.xml | 6 ++---- res/values-kk-rKZ/strings.xml | 6 ++---- res/values-km-rKH/strings.xml | 6 ++---- res/values-kn-rIN/strings.xml | 6 ++---- res/values-ko/strings.xml | 6 ++---- res/values-ky-rKG/strings.xml | 6 ++---- res/values-lo-rLA/strings.xml | 6 ++---- res/values-lt/strings.xml | 6 ++---- res/values-lv/strings.xml | 6 ++---- res/values-mk-rMK/strings.xml | 6 ++---- res/values-ml-rIN/strings.xml | 6 ++---- res/values-mn-rMN/strings.xml | 6 ++---- res/values-mr-rIN/strings.xml | 6 ++---- res/values-ms-rMY/strings.xml | 6 ++---- res/values-my-rMM/strings.xml | 6 ++---- res/values-nb/strings.xml | 6 ++---- res/values-ne-rNP/strings.xml | 6 ++---- res/values-nl/strings.xml | 6 ++---- res/values-pa-rIN/strings.xml | 6 ++---- res/values-pl/strings.xml | 6 ++---- res/values-pt-rPT/strings.xml | 6 ++---- res/values-pt/strings.xml | 6 ++---- res/values-ro/strings.xml | 6 ++---- res/values-ru/strings.xml | 6 ++---- res/values-si-rLK/strings.xml | 6 ++---- res/values-sk/strings.xml | 6 ++---- res/values-sl/strings.xml | 6 ++---- res/values-sq-rAL/strings.xml | 6 ++---- res/values-sr/strings.xml | 6 ++---- res/values-sv/strings.xml | 6 ++---- res/values-sw/strings.xml | 6 ++---- res/values-ta-rIN/strings.xml | 6 ++---- res/values-te-rIN/strings.xml | 6 ++---- res/values-th/strings.xml | 6 ++---- res/values-tl/strings.xml | 6 ++---- res/values-tr/strings.xml | 6 ++---- res/values-uk/strings.xml | 6 ++---- res/values-ur-rPK/strings.xml | 6 ++---- res/values-uz-rUZ/strings.xml | 6 ++---- res/values-vi/strings.xml | 6 ++---- res/values-zh-rCN/strings.xml | 6 ++---- res/values-zh-rHK/strings.xml | 6 ++---- res/values-zh-rTW/strings.xml | 6 ++---- res/values-zu/strings.xml | 6 ++---- 80 files changed, 160 insertions(+), 320 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 0fa856c6ab..7d4a6978aa 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -75,10 +75,8 @@ "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" - - - - + "Voeg ikoon by tuisskerm" + "Vir nuwe programme" "Onbekend" "Verwyder" "Soek" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 199da7761b..9f07b44f50 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -75,10 +75,8 @@ "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "ስልኩ ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" - - - - + "አዶ ወደ የመነሻ ማያ ገጽ አክል" + "ለአዲስ መተግበሪያዎች" "የማይታወቅ" "አስወግድ" "ፈልግ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 0c74f938d0..fcadbe18d3 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -75,10 +75,8 @@ "السماح بتدوير الشاشة الرئيسية" "عند تدوير الهاتف" "لا يسمح إعداد العرض الحالي بالتدوير" - - - - + "إضافة رمز إلى الشاشة الرئيسية" + "للتطبيقات الجديدة" "غير معروفة" "إزالة" "بحث" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index f0e7233517..e37cdf9b21 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -75,10 +75,8 @@ "Əsas ekranın firlanmağına icazə verin" "Telefon çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" - - - - + "Əsas ekrana ikona əlavə edin" + "Yeni tətbiqlər üçün" "Naməlum" "Yığışdır" "Axtarış" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 388b1b4432..0beee9790d 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -75,10 +75,8 @@ "Dozvoli rotaciju početnog ekrana" "Kada se telefon rotira" "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" - - - - + "Dodaj ikonu na početni ekran" + "Za nove aplikacije" "Nepoznato" "Ukloni" "Pretraži" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index 21edf6208e..db064702b0 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -75,10 +75,8 @@ "Дазволіць паварот галоўнага экрана" "Пры павароце тэлефона" "Бягучая налада дысплэя не прадугледжвае паварот" - - - - + "Дадаць значок на Галоўны экран" + "Для новых праграм" "Невядома" "Выдаліць" "Шукаць" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 865bafc8cf..0f1b24a6e3 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -75,10 +75,8 @@ "Разрешаване на завъртането на началния екран" "При завъртане на телефона" "Текущата настройка на екрана не разрешава завъртане" - - - - + "Добавяне на икона към началния екран" + "За нови приложения" "Няма информация" "Премахване" "Търсене" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 5f949924e5..eaad010c2c 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -75,10 +75,8 @@ "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "যখন ফোনটি ঘোরানো হয়" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" - - - - + "হোম স্ক্রিনে আইকন যোগ করুন" + "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "অজানা" "সরান" "অনুসন্ধান" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index fb5a24a7d7..db207dc9a6 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -75,10 +75,8 @@ "Dozvoli rotiranje početnog ekrana" "Kada se telefon zarotira" "Trenutne postavke ekrana ne dozvoljavaju rotiranje" - - - - + "Dodajte ikonu na početni ekran" + "Za nove aplikacije" "Nepoznato" "Ukloni" "Traži" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index a3f8f07e31..dfbfe8cf65 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -75,10 +75,8 @@ "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" - - - - + "Afegeix la icona a la pantalla d\'inici" + "Per a les aplicacions noves" "Desconegut" "Suprimeix" "Cerca" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 25859837d8..6f19c0e596 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -75,10 +75,8 @@ "Povolit otáčení plochy" "Při otočení telefonu" "Aktuální nastavení displeje neumožňuje otáčení" - - - - + "Přidat ikonu na plochu" + "Pro nové aplikace" "Neznámé" "Odstranit" "Hledat" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 4b9fb9d376..2186fb4427 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -75,10 +75,8 @@ "Tillad rotation af startskærmen" "Når telefonen roteres" "Den aktuelle indstilling for visning tillader ikke rotation" - - - - + "Føj ikon til startskærmen" + "For nye apps" "Ukendt" "Fjern" "Søg" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 2f18a00d26..f97f0280ff 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -75,10 +75,8 @@ "Drehung des Startbildschirms zulassen" "Bei Drehung des Smartphones" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" - - - - + "Symbol zu Startbildschirm hinzufügen" + "Für neue Apps" "Unbekannt" "Entfernen" "Suchen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 6a4e79e481..e045d2b5ee 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -75,10 +75,8 @@ "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν το τηλέφωνο περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" - - - - + "Προσθήκη εικονιδίου στην Αρχική οθόνη" + "Για νέες εφαρμογές" "Άγνωστο" "Κατάργηση" "Αναζήτηση" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 0d58f1d178..d6c837bcfd 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -75,10 +75,8 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - - - - + "Add icon to Home screen" + "For new apps" "Unknown" "Remove" "Search" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 0d58f1d178..d6c837bcfd 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -75,10 +75,8 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - - - - + "Add icon to Home screen" + "For new apps" "Unknown" "Remove" "Search" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 0d58f1d178..d6c837bcfd 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -75,10 +75,8 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - - - - + "Add icon to Home screen" + "For new apps" "Unknown" "Remove" "Search" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 2e9a5947dd..1a7b5615d0 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -75,10 +75,8 @@ "Permitir la rotación de la pantalla principal" "Al girar el teléfono" "La configuración actual no permite la rotación de la pantalla" - - - - + "Agregar ícono a la pantalla principal" + "Para nuevas apps" "Desconocido" "Eliminar" "Buscar" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index f11ecab1d8..9b80c56633 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -75,10 +75,8 @@ "Permitir rotación de la pantalla de inicio" "Al girar el teléfono" "La configuración de pantalla actual no permite girar la pantalla" - - - - + "Añadir icono a la pantalla de inicio" + "Para nuevas aplicaciones" "Desconocido" "Quitar" "Buscar" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 257f281c09..07834dc623 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -75,10 +75,8 @@ "Luba avaekraani pööramine" "Kui telefoni pööratakse" "Praegune kuvaseade ei luba pööramist" - - - - + "Lisa ikoon avaekraanile" + "Uute rakenduste puhul" "Teadmata" "Eemalda" "Otsing" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 7e23a449ab..17ce6d01e9 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -75,10 +75,8 @@ "Baimendu hasierako pantaila biratzea" "Telefonoa biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" - - - - + "Gehitu ikonoa hasierako pantailan" + "Aplikazio berrietan" "Ezezaguna" "Kendu" "Bilatu" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 9876d5e881..9bbecca291 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -75,10 +75,8 @@ "امکان دادن به چرخش صفحه اصلی" "وقتی تلفن چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" - - - - + "افزودن نماد به صفحه اصلی" + "برای برنامه‌های جدید" "نامشخص" "حذف" "جستجو" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 1c4bb88c2a..6595f86f62 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -75,10 +75,8 @@ "Salli aloitusnäytön kiertäminen" "Kun puhelinta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." - - - - + "Lisää kuvake aloitusruutuun" + "Uusille sovelluksille" "Tuntematon" "Poista" "Haku" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 5f00c11e3c..5d9f041a1a 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -75,10 +75,8 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le mode d\'affichage actuel ne permet pas le pivotement" - - - - + "Ajouter l\'icône à l\'écran d\'accueil" + "Pour les nouvelles applications" "Inconnu" "Supprimer" "Rechercher" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 034a6551cf..20902622be 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -75,10 +75,8 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." - - - - + "Ajouter l\'icône à l\'écran d\'accueil" + "Pour les nouvelles applications" "Inconnu" "Supprimer" "Rechercher" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index f32d963bb4..fbadfe0669 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -75,10 +75,8 @@ "Permitir xirar a pantalla de inicio" "Ao xirar o teléfono" "A configuración de visualización actual non permite xirar a pantalla" - - - - + "Engadir icona á pantalla de inicio" + "Para novas aplicacións" "Descoñecido" "Eliminar" "Buscar" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 36cfd6efe6..557896f7f3 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -75,10 +75,8 @@ "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" - - - - + "હોમ સ્ક્રીન પર આઇકન ઉમેરો" + "નવી ઍપ્લિકેશનો માટે" "અજાણ્યો" "દૂર કરો" "શોધો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index f11d67b532..ad33acadde 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -75,10 +75,8 @@ "होमस्क्रीन घुमाने की अनुमति दें" "फ़ोन घुुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" - - - - + "होम स्क्रीन में आइकन जोड़ें" + "नए ऐप्लिकेशन के लिए" "अज्ञात" "निकालें" "खोजें" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 3f3adf1711..0e01e723a6 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -75,10 +75,8 @@ "Dopusti zakretanje početnog zaslona" "Kada se telefon zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" - - - - + "Dodaj ikonu na početni zaslon" + "Za nove aplikacije" "Nepoznato" "Ukloni" "Traži" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 69dae7d60b..bcbe52f8fa 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -75,10 +75,8 @@ "A kezdőképernyő elforgatásának engedélyezése" "A telefon elforgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" - - - - + "Ikon hozzáadása a kezdőképernyőhöz" + "Új alkalmazásoknál" "Ismeretlen" "Eltávolítás" "Keresés" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 47b32191f0..f3a034fd16 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -75,10 +75,8 @@ "Թույլ տալ հիմնական էկրանի պտտումը" "Հեռախոսը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" - - - - + "Ավելացնել պատկերակը Հիմնական էկրանին" + "Նոր հավելվածների համար" "Անհայտ է" "Հեռացնել" "Գտնել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 1d64cf8b1f..c56fc2b0af 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -75,10 +75,8 @@ "Izinkan layar Utama diputar" "Saat ponsel diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" - - - - + "Tambahkan ikon ke layar Utama" + "Untuk aplikasi baru" "Tidak dikenal" "Buang" "Telusuri" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index c525f57b73..249704eadb 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -75,10 +75,8 @@ "Leyfa snúning fyrir heimaskjá" "Þegar símanum er snúið" "Núverandi skjástilling leyfir ekki snúning" - - - - + "Bæta tákni á heimaskjáinn" + "Fyrir ný forrit" "Óþekkt" "Fjarlægja" "Leita" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index fd522de9ef..18e28c9cc1 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -75,10 +75,8 @@ "Consenti rotazione della schermata Home" "Con il telefono ruotato" "L\'impostazione corrente del display non consente la rotazione" - - - - + "Aggiungi icone alla schermata Home" + "Per le nuove app" "Sconosciuto" "Rimuovi" "Cerca" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index e037d2139f..059f849083 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -75,10 +75,8 @@ "אפשרות סיבוב של מסך דף הבית" "כאשר הטלפון מסובב" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" - - - - + "הוספת סמל במסך דף הבית" + "לאפליקציות חדשות" "לא ידוע" "הסר" "חפש" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 3003cacfed..f45af77b03 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -75,10 +75,8 @@ "ホーム画面の回転を許可" "スマートフォンが回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" - - - - + "ホーム画面にアイコンを追加" + "新しいアプリをダウンロードしたときに" "不明" "削除" "検索" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 8f1edfc4d7..21f440b913 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -75,10 +75,8 @@ "მთავარი ეკრანის შეტრიალების დაშვება" "ტელეფონის შეტრიალებისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" - - - - + "ხატულას მთავარ ეკრანზე დამატება" + "ახალი აპებისთვის" "უცნობი" "ამოშლა" "ძიება" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index dfb5aea494..7fc61b98b7 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -75,10 +75,8 @@ "Негізгі экранның бұрылуына рұқсат ету" "Телефон бұрылғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" - - - - + "Негізгі экранға белгіше енгізу" + "Жаңа қолданбаларға арналған" "Белгісіз" "Алып тастау" "Іздеу" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index dbfe9d369d..8b271e5a8c 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -75,10 +75,8 @@ "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" - - - - + "បញ្ចូល​រូបតំណាង​ទៅ​អេក្រង់​ដើម" + "សម្រាប់កម្មវិធីថ្មី" "មិន​ស្គាល់" "លុបចេញ" "ស្វែងរក" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 4817b28742..209bdab190 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -75,10 +75,8 @@ "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" - - - - + "ಮುಖಪುಟದ ಪರದೆಗೆ ಐಕಾನ್ ಸೇರಿಸಿ" + "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" "ಹುಡುಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 5d67857acf..08b73f80d5 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -75,10 +75,8 @@ "홈 화면 회전 허용" "휴대전화 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." - - - - + "홈 화면에 아이콘 추가" + "새로 설치한 앱에 적용" "알 수 없음" "삭제" "검색" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index a43a7ebabf..e5465aa1df 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -75,10 +75,8 @@ "Башкы экранды айлантууга уруксат берүү" "Телефон айланганда" "Экранды айлантуу параметри өчүрүлгөн" - - - - + "Башкы экранга сүрөтчө кошуу" + "Жаңы колдонмолор үчүн" "Белгисиз" "Алып салуу" "Издөө" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 2de98dd9c1..7783c7aa8b 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -75,10 +75,8 @@ "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນໂທລະສັບ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" - - - - + "ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ" + "ສຳລັບແອັບໃໝ່" "​ບໍ່​ຮູ້​ຈັກ" "ລຶບ​" "ຊອກຫາ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 41298d792f..b44549ae05 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -75,10 +75,8 @@ "Leisti pasukti pagrindinį ekraną" "Kai telefonas pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" - - - - + "Pridėti piktogr. prie pagrindinio ekrano" + "Skirta naujoms programoms" "Nežinoma" "Pašalinti" "Ieškoti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index e623a63bbf..a623294f48 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -75,10 +75,8 @@ "Atļaut sākuma ekrāna pagriešanu" "Pagriežot tālruni" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." - - - - + "Pievienot ikonu sākuma ekrānā" + "Jaunām lietotnēm" "Nezināma" "Noņemt" "Meklēt" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index e267c40a17..e6ca38f8e3 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -75,10 +75,8 @@ "Дозволете ротација на Почетниот екран" "Кога телефонот се ротира" "Тековната поставка на Екранот не дозволува ротација" - - - - + "Додајте икона на почетниот екран" + "За нови апликации" "Непознато" "Отстрани" "Барај" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 37b0f4bbe0..8ec29d33da 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -75,10 +75,8 @@ "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" - - - - + "ഹോം സ്ക്രീനിലേക്ക് ഐക്കൺ ചേർക്കുക" + "പുതിയ ആപ്പുകൾക്ക്" "അജ്ഞാതം" "നീക്കംചെയ്യുക" "തിരയുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 81f41daff1..c8dfdd58c1 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -75,10 +75,8 @@ "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Утсыг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" - - - - + "Нүүр хуудаст дүрс тэмдэг нэмэх" + "Шинэ аппад зориулсан" "Тодорхойгүй" "Устгах" "Хайх" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 424d69de4b..4056b033e1 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -75,10 +75,8 @@ "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "फोन फिरविला जातो तेव्हा" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" - - - - + "मुख्य स्क्रीनवर चिन्ह जोडा" + "नवीन अॅप्ससाठी" "अज्ञात" "काढा" "शोधा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 748ebd1227..9ec1813314 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -75,10 +75,8 @@ "Benarkan putaran Skrin Utama" "Apabila telefon diputar" "Tetapan Paparan semasa tidak membenarkan putaran" - - - - + "Tambahkan ikon pada Skrin Utama" + "Untuk apl baharu" "Tidak diketahui" "Alih keluar" "Carian" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 3f7bf241f4..5da5f6552e 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -75,10 +75,8 @@ "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" "ဖုန်းကိုလှည့်ထားစဉ်" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" - - - - + "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" + "အက်ပ်အသစ်များအတွက်" "မသိရ" "ဖယ်ရှားရန်" "ရှာဖွေရန်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 21e15bedf7..694c6fc952 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -75,10 +75,8 @@ "Tillat rotasjon av startskjermen" "Når telefonen roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" - - - - + "Legg til ikon på startsiden" + "For nye apper" "Ukjent" "Fjern" "Søk" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 1012f765ad..01ec5bd2b5 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -75,10 +75,8 @@ "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "फोनलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" - - - - + "गृह स्क्रिनमा आइकन थप्नुहोस्" + "नयाँ अनुप्रयोगका लागि" "अज्ञात" "हटाउनुहोस्" "खोजी गर्नुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e6c64990ed..a477893b7c 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -75,10 +75,8 @@ "Draaien van startscherm toestaan" "Wanneer de telefoon gedraaid is" "Huidige scherminstelling staat draaien niet toe" - - - - + "Pictogram toevoegen aan startscherm" + "Voor nieuwe apps" "Onbekend" "Verwijderen" "Zoeken" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 719ade8916..71d9942a59 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -75,10 +75,8 @@ "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" - - - - + "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" + "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਅਗਿਆਤ" "ਹਟਾਓ" "ਖੋਜੋ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index b56a0c0058..4225d37786 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -75,10 +75,8 @@ "Zezwalaj na obrót ekranu głównego" "Po obróceniu telefonu" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" - - - - + "Dodaj ikonę do ekranu głównego" + "W przypadku nowych aplikacji" "Brak informacji" "Usuń" "Szukaj" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 5e4641b784..4754bb82d2 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -75,10 +75,8 @@ "Permitir rotação do ecrã principal" "Quando o telemóvel é rodado" "A definição de visualização atual não permite a rotação" - - - - + "Adicionar ícone ao ecrã principal" + "Para novas aplicações" "Desconhecido" "Remover" "Pesquisar" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 40919acc9a..2f15b4044c 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -75,10 +75,8 @@ "Permitir rotação da tela inicial" "Quando o smartphone for girado" "A configuração atual de exibição não permite rotação" - - - - + "Adicionar ícone à tela inicial" + "Para novos apps" "Desconhecido" "Remover" "Pesquisar" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index e629299333..8bb73f2a76 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -75,10 +75,8 @@ "Permiteți rotirea ecranului de pornire" "Când telefonul este rotit" "Setarea actuală a afișajului nu permite rotirea" - - - - + "Adaugă pictograme în ecranul de pornire" + "Pentru aplicații noi" "Necunoscut" "Eliminați" "Căutați" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 786f3de619..bfecf591a3 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -75,10 +75,8 @@ "Разрешить поворачивать главный экран" "Когда телефон повернут" "В настройках отключен поворот экрана" - - - - + "Добавлять значки" + "Добавлять значки установленных приложений на главный экран." "Неизвестно" "Удалить" "Найти" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 7a450e4983..a5d34caf96 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -75,10 +75,8 @@ "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "දුරකථනය කරකවන විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" - - - - + "මුල් පිටු තිරය වෙත අයිකනය එක් කරන්න" + "නව යෙදුම් සඳහා" "නොදනී" "ඉවත් කරන්න" "සොයන්න" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 93c1d26719..239bf2915f 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -75,10 +75,8 @@ "Povoliť otáčanie plochy" "Pri otočení telefónu" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" - - - - + "Pridať ikonu na plochu" + "Pri inštalácii novej aplikácie" "Neznáme" "Odstrániť" "Vyhľadať" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 5274e4b846..b245c54e42 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -75,10 +75,8 @@ "Omogočanje sukanja začetnega zaslona" "Ko se telefon zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" - - - - + "Dodaj ikono na začetni zaslon" + "Za nove aplikacije" "Neznano" "Odstrani" "Iskanje" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 66a3f1d46a..4adac7f351 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -75,10 +75,8 @@ "Lejo rrotullimin e ekranit kryesor" "Kur telefoni rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" - - - - + "Shto ikonë në ekranin bazë" + "Për aplikacionet e reja" "I panjohur" "Hiq" "Kërko" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 5a6df3a5db..f6a28da81b 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -75,10 +75,8 @@ "Дозволи ротацију почетног екрана" "Када се телефон ротира" "Актуелно подешавање приказа не дозвољава ротацију" - - - - + "Додај икону на почетни екран" + "За нове апликације" "Непознато" "Уклони" "Претражи" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 3730e8f659..c740167366 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -75,10 +75,8 @@ "Tillåt rotering av startskärmen" "När mobilen vrids" "Rotering tillåts inte i de nuvarande skärminställningarna" - - - - + "Lägg till ikonen på startskärmen" + "För nya appar" "Okänt" "Ta bort" "Sök" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 05540c9071..0c677ec43c 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -77,10 +77,8 @@ "Ruhusu kuzungusha skrini ya Kwanza" "Simu inapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" - - - - + "Ongeza aikoni kwenye Skrini ya kwanza" + "Kwa ajili ya programu mpya" "Yasiyojulikana" "Ondoa" "Tafuta" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 59f29fb168..15e0c200ec 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -75,10 +75,8 @@ "முகப்புத் திரை சுழற்சியை அனுமதி" "மொபைலைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" - - - - + "முகப்புத் திரையில் ஐகானைச் சேர்" + "புதிய பயன்பாடுகளுக்கு" "தெரியாதது" "அகற்று" "தேடு" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 54a78a2d48..9c1c3e184c 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -75,10 +75,8 @@ "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "ఫోన్‌‌ను తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" - - - - + "హోమ్ స్క్రీన్‌కి చిహ్నాన్ని జోడించు" + "కొత్త అనువర్తనాల కోసం" "తెలియదు" "తీసివేయి" "శోధించు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 109c61fe60..39c60aa0e7 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -75,10 +75,8 @@ "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนโทรศัพท์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" - - - - + "เพิ่มไอคอนในหน้าจอหลัก" + "สำหรับแอปใหม่" "ไม่รู้จัก" "ลบ" "ค้นหา" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index a2f5fcfa10..1838865390 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -75,10 +75,8 @@ "Payagan ang pag-rotate ng Home screen" "Kailan maro-rotate ang telepono" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" - - - - + "Idagdag ang icon sa Home screen" + "Para sa mga bagong app" "Hindi kilala" "Alisin" "Maghanap" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index f55331d229..61360820d4 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -75,10 +75,8 @@ "Ana ekranı döndürmeye izin ver" "Telefon döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" - - - - + "Ana ekrana simge ekle" + "Yeni uygulamalar için" "Bilinmiyor" "Kaldır" "Ara" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 420b9284b7..bc36a50609 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -75,10 +75,8 @@ "Дозволити обертання головного екрана" "Коли телефон обертається" "Поточні налаштування дисплея не підтримують обертання" - - - - + "Додати значок на головний екран" + "Для нових додатків" "Невідомо" "Видалити" "Шукати" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index e5c7c58ce9..0bd45c8811 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -75,10 +75,8 @@ "ہوم اسکرین گھمانے کی اجازت دیں" "جب فون گھمایا جاتا ہے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" - - - - + "آئیکن کو ہوم اسکرین میں شامل کریں" + "نئی ایپس کیلئے" "نامعلوم" "ہٹائیں" "تلاش کریں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 8e050b87ee..fd5d013cff 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -75,10 +75,8 @@ "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" - - - - + "Bosh ekranga ikonka qo‘shish" + "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" "Noma’lum" "O‘chirish" "Qidirish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 462d365c99..9b9d04c088 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -75,10 +75,8 @@ "Cho phép xoay Màn hình chính" "Khi xoay điện thoại" "Cài đặt Hiển thị hiện tại không cho phép xoay" - - - - + "Thêm biểu tượng vào màn hình chính" + "Cho ứng dụng mới" "Không xác định" "Xóa" "Tìm kiếm" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index e54499bd8b..545bf4a6b6 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -75,10 +75,8 @@ "允许旋转主屏幕" "手机旋转时" "当前的显示设置不允许旋转设备" - - - - + "将图标添加到主屏幕" + "适用于新应用" "未知" "移除" "搜索" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 04e1435388..7afb3aed5f 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -75,10 +75,8 @@ "允許主畫面旋轉" "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" - - - - + "將圖示加到主畫面" + "適用於新安裝的應用程式" "不明" "移除" "搜尋" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 6a28e4cd72..4425c6618c 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -75,10 +75,8 @@ "允許旋轉主螢幕" "當手機旋轉時" "目前的顯示設定不允許旋轉畫面" - - - - + "將圖示加到主螢幕" + "適用於新安裝的應用程式" "不明" "移除" "搜尋" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 55c3ed650c..0be9ebc197 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -75,10 +75,8 @@ "Vumela ukuphendukiswa kwesikrini sasekhaya" "Uma ifoni iphendukiswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" - - - - + "Engeza isithonjana eskrinini sasekhaya" + "Kwezinhlelo zokusebenza ezintsha" "Akwaziwa" "Susa" "Sesha" From 7a5a355ab8064d24e866c71dfee69520696a1201 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 20 Mar 2017 12:22:14 -0700 Subject: [PATCH 025/446] Make LEGACY_ICON_TREATMENT flag work - targetSdk needs to be 26 - android:color attribute has been deleted Change-Id: I6b1fc5402233fb8844b475d562984cf6924e33ac --- res/drawable-v26/adaptive_icon_drawable_wrapper.xml | 2 +- res/values/colors.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/res/drawable-v26/adaptive_icon_drawable_wrapper.xml b/res/drawable-v26/adaptive_icon_drawable_wrapper.xml index 7ad8e2c64e..2d78b699f4 100644 --- a/res/drawable-v26/adaptive_icon_drawable_wrapper.xml +++ b/res/drawable-v26/adaptive_icon_drawable_wrapper.xml @@ -15,7 +15,7 @@ limitations under the License. --> - + diff --git a/res/values/colors.xml b/res/values/colors.xml index e344571db8..455729c427 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -36,4 +36,5 @@ #E0E0E0 @color/notification_color_beneath #E0E0E0 + #FFFFFF From 08ffaae3b627a124eaaf8610f5ea8f1898700d45 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Mon, 20 Mar 2017 11:30:27 -0700 Subject: [PATCH 026/446] Show promise app icon progress in All Apps and setup market intent on clicking promise app icon in All Apps. Only the progress will be changed with animation on progress update, no relayout is performed. If the icon is newly bound, the progress will not be animated. Bug: 23952570 Change-Id: I98d3f945f08a2abadf53f20e6007c15e56d5d410 --- src/com/android/launcher3/BubbleTextView.java | 32 +++++++++++++------ src/com/android/launcher3/InfoDropTarget.java | 6 ++++ src/com/android/launcher3/Launcher.java | 24 +++++++++++++- src/com/android/launcher3/LauncherModel.java | 1 + src/com/android/launcher3/PromiseAppInfo.java | 5 +++ .../allapps/AllAppsContainerView.java | 13 ++++++++ .../model/PackageInstallStateChangedTask.java | 11 +++---- 7 files changed, 75 insertions(+), 17 deletions(-) diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index f9a6742d8f..add0185ba5 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -39,7 +39,6 @@ import com.android.launcher3.IconCache.IconLoadRequest; import com.android.launcher3.IconCache.ItemInfoUpdateReceiver; import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.badge.BadgeRenderer; -import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.folder.FolderIconPreviewVerifier; import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.graphics.HolographicOutlineHelper; @@ -181,6 +180,10 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { // Verify high res immediately verifyHighRes(); + if (info instanceof PromiseAppInfo) { + PromiseAppInfo promiseAppInfo = (PromiseAppInfo) info; + applyProgressLevel(promiseAppInfo.level); + } applyBadgeState(info, false /* animate */); } @@ -476,27 +479,36 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { ((info.hasStatusFlag(ShortcutInfo.FLAG_INSTALL_SESSION_ACTIVE) ? info.getInstallProgress() : 0)) : 100; - setContentDescription(progressLevel > 0 ? - getContext().getString(R.string.app_downloading_title, info.title, - NumberFormat.getPercentInstance().format(progressLevel * 0.01)) : - getContext().getString(R.string.app_waiting_download_title, info.title)); + PreloadIconDrawable preloadDrawable = applyProgressLevel(progressLevel); + if (preloadDrawable != null && promiseStateChanged) { + preloadDrawable.maybePerformFinishedAnimation(); + } + } + } + + public PreloadIconDrawable applyProgressLevel(int progressLevel) { + if (getTag() instanceof ItemInfoWithIcon) { + ItemInfoWithIcon info = (ItemInfoWithIcon) getTag(); + setContentDescription(progressLevel > 0 + ? getContext().getString(R.string.app_downloading_title, info.title, + NumberFormat.getPercentInstance().format(progressLevel * 0.01)) + : getContext().getString(R.string.app_waiting_download_title, info.title)); if (mIcon != null) { final PreloadIconDrawable preloadDrawable; if (mIcon instanceof PreloadIconDrawable) { preloadDrawable = (PreloadIconDrawable) mIcon; + preloadDrawable.setLevel(progressLevel); } else { preloadDrawable = DrawableFactory.get(getContext()) .newPendingIcon(info.iconBitmap, getContext()); + preloadDrawable.setLevel(progressLevel); setIcon(preloadDrawable); } - - preloadDrawable.setLevel(progressLevel); - if (promiseStateChanged) { - preloadDrawable.maybePerformFinishedAnimation(); - } + return preloadDrawable; } } + return null; } public void applyBadgeState(ItemInfo itemInfo, boolean animate) { diff --git a/src/com/android/launcher3/InfoDropTarget.java b/src/com/android/launcher3/InfoDropTarget.java index 34adf47a18..2f61a01ed7 100644 --- a/src/com/android/launcher3/InfoDropTarget.java +++ b/src/com/android/launcher3/InfoDropTarget.java @@ -60,6 +60,12 @@ public class InfoDropTarget extends UninstallDropTarget { */ public static boolean startDetailsActivityForInfo( ItemInfo info, Launcher launcher, DropTargetResultCallback callback) { + if (info instanceof PromiseAppInfo) { + PromiseAppInfo promiseAppInfo = (PromiseAppInfo) info; + launcher.startActivity(promiseAppInfo.getMarketIntent()); + return true; + } + boolean result = false; ComponentName componentName = null; if (info instanceof AppInfo) { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index d5baabfc00..c7f0b4748a 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2454,7 +2454,13 @@ public class Launcher extends BaseActivity private void startAppShortcutOrInfoActivity(View v) { ItemInfo item = (ItemInfo) v.getTag(); - Intent intent = item.getIntent(); + Intent intent; + if (item instanceof PromiseAppInfo) { + PromiseAppInfo promiseAppInfo = (PromiseAppInfo) item; + intent = promiseAppInfo.getMarketIntent(); + } else { + intent = item.getIntent(); + } if (intent == null) { throw new IllegalArgumentException("Input must have a valid intent"); } @@ -3762,6 +3768,22 @@ public class Launcher extends BaseActivity } } + @Override + public void bindPromiseAppProgressUpdated(final PromiseAppInfo app) { + Runnable r = new Runnable() { + public void run() { + bindPromiseAppProgressUpdated(app); + } + }; + if (waitUntilResume(r)) { + return; + } + + if (mAppsView != null) { + mAppsView.updatePromiseAppProgress(app); + } + } + @Override public void bindWidgetsRestored(final ArrayList widgets) { Runnable r = new Runnable() { diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 707ec8642d..39b9dd3d2c 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -195,6 +195,7 @@ public class LauncherModel extends BroadcastReceiver ArrayList addAnimated, ArrayList addedApps); public void bindAppsUpdated(ArrayList apps); + public void bindPromiseAppProgressUpdated(PromiseAppInfo app); public void bindShortcutsChanged(ArrayList updated, ArrayList removed, UserHandle user); public void bindWidgetsRestored(ArrayList widgets); diff --git a/src/com/android/launcher3/PromiseAppInfo.java b/src/com/android/launcher3/PromiseAppInfo.java index 04ba1d366f..1749dde088 100644 --- a/src/com/android/launcher3/PromiseAppInfo.java +++ b/src/com/android/launcher3/PromiseAppInfo.java @@ -20,6 +20,7 @@ import android.content.Intent; import android.support.annotation.NonNull; import com.android.launcher3.compat.PackageInstallerCompat; +import com.android.launcher3.util.PackageManagerHelper; public class PromiseAppInfo extends AppInfo { @@ -44,4 +45,8 @@ public class PromiseAppInfo extends AppInfo { shortcut.status |= ShortcutInfo.FLAG_RESTORE_STARTED; return shortcut; } + + public Intent getMarketIntent() { + return PackageManagerHelper.getMarketIntent(componentName.getPackageName()); + } } diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index cc5fa8ce15..7219141cd3 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -37,6 +37,7 @@ import android.view.ViewGroup; import com.android.launcher3.AppInfo; import com.android.launcher3.BaseContainerView; +import com.android.launcher3.BubbleTextView; import com.android.launcher3.DeleteDropTarget; import com.android.launcher3.DeviceProfile; import com.android.launcher3.DragSource; @@ -45,6 +46,7 @@ import com.android.launcher3.ExtendedEditText; import com.android.launcher3.Insettable; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; +import com.android.launcher3.PromiseAppInfo; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; @@ -158,6 +160,17 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mSearchBarController.refreshSearchResult(); } + public void updatePromiseAppProgress(PromiseAppInfo app) { + int childCount = mAppsRecyclerView.getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = mAppsRecyclerView.getChildAt(i); + if (child instanceof BubbleTextView && child.getTag() == app) { + BubbleTextView bubbleTextView = (BubbleTextView) child; + bubbleTextView.applyProgressLevel(app.level); + } + } + } + /** * Removes some apps from the list. */ diff --git a/src/com/android/launcher3/model/PackageInstallStateChangedTask.java b/src/com/android/launcher3/model/PackageInstallStateChangedTask.java index 9c5f18917e..f8793e0788 100644 --- a/src/com/android/launcher3/model/PackageInstallStateChangedTask.java +++ b/src/com/android/launcher3/model/PackageInstallStateChangedTask.java @@ -51,7 +51,7 @@ public class PackageInstallStateChangedTask extends ExtendedModelTask { } synchronized (apps) { - final ArrayList updated = new ArrayList<>(); + PromiseAppInfo updated = null; final ArrayList removed = new ArrayList<>(); for (int i=0; i < apps.size(); i++) { final AppInfo appInfo = apps.get(i); @@ -61,7 +61,7 @@ public class PackageInstallStateChangedTask extends ExtendedModelTask { final PromiseAppInfo promiseAppInfo = (PromiseAppInfo) appInfo; if (mInstallInfo.state == PackageInstallerCompat.STATUS_INSTALLING) { promiseAppInfo.level = mInstallInfo.progress; - updated.add(appInfo); + updated = promiseAppInfo; } else if (mInstallInfo.state == PackageInstallerCompat.STATUS_FAILED || mInstallInfo.state == PackageInstallerCompat.STATUS_INSTALLED) { apps.removePromiseApp(appInfo); @@ -70,13 +70,12 @@ public class PackageInstallStateChangedTask extends ExtendedModelTask { } } } - if (!updated.isEmpty()) { + if (updated != null) { + final PromiseAppInfo updatedPromiseApp = updated; scheduleCallbackTask(new CallbackTask() { @Override public void execute(Callbacks callbacks) { - // TODO: this currently causes unnecessary relayouts - // we need to introduce a new bindPromiseAppsChanged - callbacks.bindAppsUpdated(updated); + callbacks.bindPromiseAppProgressUpdated(updatedPromiseApp); } }); } From bf2d46efad889fc2b123fe191845b32095748842 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Tue, 21 Mar 2017 15:49:06 -0700 Subject: [PATCH 027/446] Enable Promise App Icon in All Apps. - feature flag defaults to true - avoid adding additional workspace shortcut if promise shortcut already exists - handle promise app removal in package added callback for success case Change-Id: I694701e35cc94481a9c337df3a17b1e5aa2c3b4c --- .../compat/PackageInstallerCompatVL.java | 2 +- .../model/AddWorkspaceItemsTask.java | 19 +++++++++++++--- .../model/PackageInstallStateChangedTask.java | 3 +-- .../launcher3/model/PackageUpdatedTask.java | 22 +++++++++---------- .../launcher3/config/FeatureFlags.java | 2 +- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index d7cd032f7b..bbf1546299 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -154,7 +154,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { if (sessionInfo == null || sessionInfo.getInstallerPackageName() == null) { return null; } - String pkg = sessionInfo.getAppPackageName(); + String pkg = sessionInfo.getInstallerPackageName(); synchronized (mSessionVerifiedMap) { if (!mSessionVerifiedMap.containsKey(pkg)) { LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(mAppContext); diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index 969605483a..edc64e5b3c 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -33,6 +33,7 @@ import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.Utilities; import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.Provider; @@ -140,7 +141,7 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { * the workspace has been loaded. We identify a shortcut by its intent. */ protected boolean shortcutExists(BgDataModel dataModel, Intent intent, UserHandle user) { - final String intentWithPkg, intentWithoutPkg; + final String compPkgName, intentWithPkg, intentWithoutPkg; if (intent == null) { // Skip items with null intents return true; @@ -148,19 +149,21 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { if (intent.getComponent() != null) { // If component is not null, an intent with null package will produce // the same result and should also be a match. - String packageName = intent.getComponent().getPackageName(); + compPkgName = intent.getComponent().getPackageName(); if (intent.getPackage() != null) { intentWithPkg = intent.toUri(0); intentWithoutPkg = new Intent(intent).setPackage(null).toUri(0); } else { - intentWithPkg = new Intent(intent).setPackage(packageName).toUri(0); + intentWithPkg = new Intent(intent).setPackage(compPkgName).toUri(0); intentWithoutPkg = intent.toUri(0); } } else { + compPkgName = null; intentWithPkg = intent.toUri(0); intentWithoutPkg = intent.toUri(0); } + boolean isLauncherAppTarget = Utilities.isLauncherAppTarget(intent); synchronized (dataModel) { for (ItemInfo item : dataModel.itemsIdMap) { if (item instanceof ShortcutInfo) { @@ -172,6 +175,16 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { if (intentWithPkg.equals(s) || intentWithoutPkg.equals(s)) { return true; } + + // checking for existing promise icon with same package name + if (isLauncherAppTarget + && info.isPromise() + && info.hasStatusFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON) + && info.getTargetComponent() != null + && compPkgName != null + && compPkgName.equals(info.getTargetComponent().getPackageName())) { + return true; + } } } } diff --git a/src/com/android/launcher3/model/PackageInstallStateChangedTask.java b/src/com/android/launcher3/model/PackageInstallStateChangedTask.java index f8793e0788..76b90a8e20 100644 --- a/src/com/android/launcher3/model/PackageInstallStateChangedTask.java +++ b/src/com/android/launcher3/model/PackageInstallStateChangedTask.java @@ -62,8 +62,7 @@ public class PackageInstallStateChangedTask extends ExtendedModelTask { if (mInstallInfo.state == PackageInstallerCompat.STATUS_INSTALLING) { promiseAppInfo.level = mInstallInfo.progress; updated = promiseAppInfo; - } else if (mInstallInfo.state == PackageInstallerCompat.STATUS_FAILED - || mInstallInfo.state == PackageInstallerCompat.STATUS_INSTALLED) { + } else if (mInstallInfo.state == PackageInstallerCompat.STATUS_FAILED) { apps.removePromiseApp(appInfo); removed.add(appInfo); } diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index ee7186aa42..87b63ffdac 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -18,9 +18,8 @@ package com.android.launcher3.model; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.graphics.Bitmap; +import android.os.Process; import android.os.UserHandle; import android.util.Log; @@ -31,7 +30,6 @@ import com.android.launcher3.InstallShortcutReceiver; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; -import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; @@ -40,10 +38,12 @@ import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.ManagedProfileHeuristic; +import com.android.launcher3.util.PackageManagerHelper; import java.util.ArrayList; import java.util.Arrays; @@ -94,6 +94,9 @@ public class PackageUpdatedTask extends ExtendedModelTask { for (int i = 0; i < N; i++) { if (DEBUG) Log.d(TAG, "mAllAppsList.addPackage " + packages[i]); iconCache.updateIconsForPkg(packages[i], mUser); + if (FeatureFlags.LAUNCHER3_PROMISE_APPS_IN_ALL_APPS) { + appsList.removePackage(packages[i], Process.myUserHandle()); + } appsList.addPackage(context, packages[i], mUser); } @@ -224,15 +227,12 @@ public class PackageUpdatedTask extends ExtendedModelTask { if (si.isPromise() && mOp == OP_ADD) { if (si.hasStatusFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) { // Auto install icon - PackageManager pm = context.getPackageManager(); - ResolveInfo matched = pm.resolveActivity( - new Intent(Intent.ACTION_MAIN) - .setComponent(cn).addCategory(Intent.CATEGORY_LAUNCHER), - PackageManager.MATCH_DEFAULT_ONLY); - if (matched == null) { + LauncherAppsCompat launcherApps + = LauncherAppsCompat.getInstance(context); + if (!launcherApps.isActivityEnabledForProfile(cn, mUser)) { // Try to find the best match activity. - Intent intent = pm.getLaunchIntentForPackage( - cn.getPackageName()); + Intent intent = new PackageManagerHelper(context) + .getAppLaunchIntent(cn.getPackageName(), mUser); if (intent != null) { cn = intent.getComponent(); appInfo = addedOrUpdatedApps.get(cn); diff --git a/src_flags/com/android/launcher3/config/FeatureFlags.java b/src_flags/com/android/launcher3/config/FeatureFlags.java index 9e20748120..4b3e2e40a1 100644 --- a/src_flags/com/android/launcher3/config/FeatureFlags.java +++ b/src_flags/com/android/launcher3/config/FeatureFlags.java @@ -37,7 +37,7 @@ public final class FeatureFlags { // When enabled while all-apps open, the soft input will be set to adjust resize . public static boolean LAUNCHER3_UPDATE_SOFT_INPUT_MODE = false; // When enabled the promise icon is visible in all apps while installation an app. - public static boolean LAUNCHER3_PROMISE_APPS_IN_ALL_APPS = false; + public static boolean LAUNCHER3_PROMISE_APPS_IN_ALL_APPS = true; // Feature flag to enable moving the QSB on the 0th screen of the workspace. public static final boolean QSB_ON_FIRST_SCREEN = true; From 0eb6326b5f8fbc2450ac9156fdf05c41f73f5876 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Wed, 22 Mar 2017 13:14:24 -0700 Subject: [PATCH 028/446] Fixes a crash in the AllAppsFastScrollHelper where on updating the activated flag on the views it was trying to retrieve an item from the model for a non-existing position in the model. The fix is to check the position to the model size. It's not clear in what circumstance the model (ArrayList) can differ to the position returned from the view-holder's getAdapterPosition(). Bug: 36176501 Change-Id: I01b8daaad884702f9ed0e1caaa03d0ebaca69d39 --- .../android/launcher3/allapps/AllAppsFastScrollHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java b/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java index a1ff8223a2..7d70a3e966 100644 --- a/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java +++ b/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java @@ -210,7 +210,9 @@ public class AllAppsFastScrollHelper implements AllAppsGridAdapter.BindViewCallb for (RecyclerView.ViewHolder viewHolder : mTrackedFastScrollViews) { int pos = viewHolder.getAdapterPosition(); boolean isActive = false; - if (mCurrentFastScrollSection != null && pos > -1) { + if (mCurrentFastScrollSection != null + && pos > RecyclerView.NO_POSITION + && pos < mApps.getAdapterItems().size()) { AlphabeticalAppsList.AdapterItem item = mApps.getAdapterItems().get(pos); isActive = item != null && mCurrentFastScrollSection.equals(item.sectionName) && From ce74d2a81387d40653385085e2b590253796d2c6 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 23 Mar 2017 10:17:55 -0700 Subject: [PATCH 029/446] Smoother folder animation tweaks. 1. Start preview item animations later opening 2. Finish item animations sooner when closing 3. 1 & 2 allow the preview items to move as part of the Folder and allows for a smoother animation 4. Remove setCurrentPlayTime as it is O API. Bug: 36522198 Bug: 35064148 Change-Id: If63d4d032078ff4e28b72a09e35da3a71f1d0e27 --- ...lder_preview_item_closing_interpolator.xml | 2 +- res/values/config.xml | 1 + src/com/android/launcher3/folder/Folder.java | 9 ++- .../folder/FolderAnimationManager.java | 55 +++++++++++++++---- 4 files changed, 54 insertions(+), 13 deletions(-) diff --git a/res/interpolator/folder_preview_item_closing_interpolator.xml b/res/interpolator/folder_preview_item_closing_interpolator.xml index 1d77081e53..d8ddb0ca86 100644 --- a/res/interpolator/folder_preview_item_closing_interpolator.xml +++ b/res/interpolator/folder_preview_item_closing_interpolator.xml @@ -18,7 +18,7 @@ --> diff --git a/res/values/config.xml b/res/values/config.xml index 745bce3f5f..4c19dec22c 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -58,6 +58,7 @@ 120 200 60 + 30 800 diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index bce13bc400..20c2612d3b 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -25,6 +25,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; +import android.support.v4.os.BuildCompat; import android.text.InputType; import android.text.Selection; import android.util.AttributeSet; @@ -518,7 +519,9 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC long startTime = 0; if (mCurrentAnimator != null && mCurrentAnimator.isRunning()) { // This allows a nice transition when closing a Folder while it is still animating open. - startTime = mCurrentAnimator.getDuration() - mCurrentAnimator.getCurrentPlayTime(); + if (BuildCompat.isAtLeastO()) { + startTime = mCurrentAnimator.getDuration() - mCurrentAnimator.getCurrentPlayTime(); + } mCurrentAnimator.cancel(); } a.addListener(new AnimatorListenerAdapter() { @@ -533,7 +536,9 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mCurrentAnimator = null; } }); - a.setCurrentPlayTime(startTime); + if (BuildCompat.isAtLeastO()) { + a.setCurrentPlayTime(startTime); + } a.start(); } diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index c1c974ca31..a62d1b7423 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -64,6 +64,9 @@ public class FolderAnimationManager { private final boolean mIsOpening; + private final int mDuration; + private final int mDelay; + private final TimeInterpolator mOpeningInterpolator; private final TimeInterpolator mClosingInterpolator; private final TimeInterpolator mPreviewItemOpeningInterpolator; @@ -116,6 +119,9 @@ public class FolderAnimationManager { mIsOpening = isOpening; + mDuration = mFolder.mMaterialExpandDuration; + mDelay = mContext.getResources().getInteger(R.integer.config_folderDelay); + mOpeningInterpolator = AnimationUtils.loadInterpolator(mContext, R.interpolator.folder_opening_interpolator); mClosingInterpolator = AnimationUtils.loadInterpolator(mContext, @@ -194,14 +200,13 @@ public class FolderAnimationManager { // Create the animators. AnimatorSet a = LauncherAnimUtils.createAnimatorSet(); - a.setDuration(mFolder.mMaterialExpandDuration); - a.play(getAnimator(mFolder, View.TRANSLATION_X, xDistance, 0f)); - a.play(getAnimator(mFolder, View.TRANSLATION_Y, yDistance, 0f)); - a.play(getAnimator(mFolder, SCALE_PROPERTY, initialScale, finalScale)); - a.play(getAnimator(items, ITEMS_TEXT_COLOR_PROPERTY, Color.TRANSPARENT, finalTextColor)); - a.play(getAnimator(mFolderBackground, "color", initialColor, finalColor)); - a.play(new RoundedRectRevealOutlineProvider(initialSize / 2f, finalRadius, startRect, + play(a, getAnimator(mFolder, View.TRANSLATION_X, xDistance, 0f)); + play(a, getAnimator(mFolder, View.TRANSLATION_Y, yDistance, 0f)); + play(a, getAnimator(mFolder, SCALE_PROPERTY, initialScale, finalScale)); + play(a, getAnimator(items, ITEMS_TEXT_COLOR_PROPERTY, Color.TRANSPARENT, finalTextColor)); + play(a, getAnimator(mFolderBackground, "color", initialColor, finalColor)); + play(a, new RoundedRectRevealOutlineProvider(initialSize / 2f, finalRadius, startRect, endRect).createRevealAnimator(mFolder, !mIsOpening)); a.addListener(new AnimatorListenerAdapter() { @@ -272,17 +277,42 @@ public class FolderAnimationManager { Animator translationX = getAnimator(btv, View.TRANSLATION_X, xDistance, 0f); translationX.setInterpolator(previewItemInterpolator); - animatorSet.play(translationX); + play(animatorSet, translationX); Animator translationY = getAnimator(btv, View.TRANSLATION_Y, yDistance, 0f); translationY.setInterpolator(previewItemInterpolator); - animatorSet.play(translationY); + play(animatorSet, translationY); Animator scaleAnimator = getAnimator(btv, SCALE_PROPERTY, initialScale, finalScale); scaleAnimator.setInterpolator(previewItemInterpolator); - animatorSet.play(scaleAnimator); + play(animatorSet, scaleAnimator); + + if (mFolder.getItemCount() > FolderIcon.NUM_ITEMS_IN_PREVIEW) { + // These delays allows the preview items to move as part of the Folder's motion, + // and its only necessary for large folders because of differing interpolators. + if (mIsOpening) { + translationX.setStartDelay(mDelay); + translationY.setStartDelay(mDelay); + scaleAnimator.setStartDelay(mDelay); + } + translationX.setDuration(translationX.getDuration() - mDelay); + translationY.setDuration(translationY.getDuration() - mDelay); + scaleAnimator.setDuration(scaleAnimator.getDuration() - mDelay); + } animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + super.onAnimationStart(animation); + // Necessary to initialize values here because of the start delay. + if (mIsOpening) { + btv.setTranslationX(xDistance); + btv.setTranslationY(yDistance); + btv.setScaleX(initialScale); + btv.setScaleY(initialScale); + } + } + @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); @@ -295,6 +325,11 @@ public class FolderAnimationManager { } } + private void play(AnimatorSet as, Animator a) { + a.setDuration(mDuration); + as.play(a); + } + private TimeInterpolator getPreviewItemInterpolator() { if (mFolder.getItemCount() > FolderIcon.NUM_ITEMS_IN_PREVIEW) { // With larger folders, we want the preview items to reach their final positions faster From 91d143943095ea0f71630b763e6e97df7cd128d3 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 23 Mar 2017 15:22:47 -0700 Subject: [PATCH 030/446] Remove setCurrentPlayTime call as it causes a crash. In the previous change [1], we remove the duration from the AnimatorSet so that the preview item animations can finish faster than the other animations. This causes the call to setCurrentPlayTime to crash, because we never set a duration on the AnimatorSet. This can be solved by creating a ValueAnimatorSet (future CL). 1: If63d4d032078ff4e28b72a09e35da3a71f1d0e27 Bug: 35064148 Change-Id: Ieed21e1ba8e669132188ce15fc20195ac841d14c --- src/com/android/launcher3/folder/Folder.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 20c2612d3b..8bbc99d6ec 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -516,12 +516,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } private void startAnimation(final AnimatorSet a) { - long startTime = 0; if (mCurrentAnimator != null && mCurrentAnimator.isRunning()) { - // This allows a nice transition when closing a Folder while it is still animating open. - if (BuildCompat.isAtLeastO()) { - startTime = mCurrentAnimator.getDuration() - mCurrentAnimator.getCurrentPlayTime(); - } mCurrentAnimator.cancel(); } a.addListener(new AnimatorListenerAdapter() { @@ -536,9 +531,6 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mCurrentAnimator = null; } }); - if (BuildCompat.isAtLeastO()) { - a.setCurrentPlayTime(startTime); - } a.start(); } From f0cbf0f8b850db450b12ff35c523d5006ee72e5b Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 27 Mar 2017 11:29:19 -0700 Subject: [PATCH 031/446] Disable drag and drop on Folder when its animating. Bug: 36644495 Bug: 35064148 Change-Id: Icd335a773359152fa2680e84f56c3e2eef3551e0 --- src/com/android/launcher3/folder/Folder.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 8bbc99d6ec..945c8dc629 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -1085,6 +1085,9 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } public boolean isDropEnabled() { + if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) { + return mState != STATE_ANIMATING; + } return true; } From f5a6ee0bfb26c3e001ff8cae314ef32a100913bc Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 20 Mar 2017 16:15:40 -0700 Subject: [PATCH 032/446] Legacy icon treatment - normalize - circle detection b/36563706 LEGACY_ICON_TREATMENT can only be turned on IF DISABLE_ICON_NORMALIZATION is false. This is fine since, when all apps migrated to adaptive icons we won't need icon normalization AND we won't need legacy icon treatment. Change-Id: Ic5745a5c521e670ce699f6a74733739cb7986f71 --- .../graphics/FixedScaleDrawable.java | 8 +- .../launcher3/graphics/IconNormalizer.java | 169 +++++++++++++++++- .../launcher3/graphics/LauncherIcons.java | 61 ++++++- .../launcher3/config/FeatureFlags.java | 4 +- 4 files changed, 222 insertions(+), 20 deletions(-) diff --git a/src/com/android/launcher3/graphics/FixedScaleDrawable.java b/src/com/android/launcher3/graphics/FixedScaleDrawable.java index 4be4bd5526..7ee3d80021 100644 --- a/src/com/android/launcher3/graphics/FixedScaleDrawable.java +++ b/src/com/android/launcher3/graphics/FixedScaleDrawable.java @@ -19,15 +19,17 @@ public class FixedScaleDrawable extends DrawableWrapper { // TODO b/33553066 use the constant defined in MaskableIconDrawable private static final float LEGACY_ICON_SCALE = .7f * .6667f; + private float mScale; public FixedScaleDrawable() { super(new ColorDrawable()); + mScale = LEGACY_ICON_SCALE; } @Override public void draw(Canvas canvas) { int saveCount = canvas.save(Canvas.MATRIX_SAVE_FLAG); - canvas.scale(LEGACY_ICON_SCALE, LEGACY_ICON_SCALE, + canvas.scale(mScale, mScale, getBounds().exactCenterX(), getBounds().exactCenterY()); super.draw(canvas); canvas.restoreToCount(saveCount); @@ -38,4 +40,8 @@ public class FixedScaleDrawable extends DrawableWrapper { @Override public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme) { } + + public void setScale(float scale) { + mScale = scale * LEGACY_ICON_SCALE; + } } diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index 70b3dd6c93..069895a38a 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -20,15 +20,31 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; +import android.graphics.drawable.AdaptiveIconDrawable; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; import com.android.launcher3.LauncherAppState; +import com.android.launcher3.Utilities; +import java.io.File; +import java.io.FileOutputStream; import java.nio.ByteBuffer; +import java.util.Random; public class IconNormalizer { + private static final String TAG = "IconNormalizer"; + private static final boolean DEBUG = false; // Ratio of icon visible area to full icon size for a square shaped icon private static final float MAX_SQUARE_AREA_FACTOR = 375.0f / 576; // Ratio of icon visible area to full icon size for a circular shaped icon @@ -42,17 +58,35 @@ public class IconNormalizer { private static final int MIN_VISIBLE_ALPHA = 40; + // Shape detection related constants + private static final float BOUND_RATIO_MARGIN = .05f; + private static final float PIXEL_DIFF_PERCENTAGE_THRESHOLD = 0.1f; + private static final float SCALE_NOT_INITIALIZED = 0; + private static final Object LOCK = new Object(); private static IconNormalizer sIconNormalizer; private final int mMaxSize; private final Bitmap mBitmap; + private final Bitmap mBitmapARGB; private final Canvas mCanvas; + private final Paint mPaintMaskShape; private final byte[] mPixels; + private final int[] mPixelsARGB; + private float mAdaptiveIconScale; // for each y, stores the position of the leftmost x and the rightmost x private final float[] mLeftBorder; private final float[] mRightBorder; + private final Rect mBounds; + private final RectF mShapeBounds; + private final Matrix mMatrix; + + private Paint mPaintIcon; + private Canvas mCanvasARGB; + + private File mDir; + private Random mRandom; private IconNormalizer(Context context) { // Use twice the icon size as maximum size to avoid scaling down twice. @@ -60,9 +94,112 @@ 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(); + + // Needed for isShape() method + mBitmapARGB = Bitmap.createBitmap(mMaxSize, mMaxSize, Bitmap.Config.ARGB_8888); + mCanvasARGB = new Canvas(mBitmapARGB); + mShapeBounds = new RectF(); + + mPaintIcon = new Paint(); + mPaintIcon.setColor(Color.WHITE); + mPaintMaskShape = new Paint(); + mPaintMaskShape.setColor(Color.RED); + mPaintMaskShape.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR)); + mMatrix = new Matrix(); + int[] mPixels = new int[mMaxSize * mMaxSize]; + mAdaptiveIconScale = SCALE_NOT_INITIALIZED; + + // Only needed when DEBUG == true + if (DEBUG) { + mDir = context.getExternalFilesDir(null); + mRandom = new Random(); + } + } + + /** + * Returns if the shape of the icon is same as the path. + * For this method to work, the shape path bounds should be in [0,1]x[0,1] bounds. + */ + private boolean isShape(Path maskPath) { + // Condition1: + // If width and height of the path not close to a square, then the icon shape is + // not same as the mask shape. + float iconRatio = ((float) mBounds.width()) / mBounds.height(); + if (Math.abs(iconRatio - 1) > BOUND_RATIO_MARGIN) { + if (DEBUG) { + Log.d(TAG, "Not same as mask shape because width != height. " + iconRatio); + } + return false; + } + + // 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. + int id = mRandom.nextInt(); + mBitmapARGB.eraseColor(Color.TRANSPARENT); + mCanvasARGB.drawBitmap(mBitmap, 0, 0, mPaintIcon); + + if (DEBUG) { + final File beforeFile = new File(mDir, "isShape" + id + "_before.png"); + try { + mBitmapARGB.compress(Bitmap.CompressFormat.PNG, 100, + new FileOutputStream(beforeFile)); + } catch (Exception e) {} + } + + // Fit the shape within the icon's bounding box + mMatrix.setScale(mBounds.width(), mBounds.height()); + mMatrix.postTranslate(mBounds.left, mBounds.top); + maskPath.transform(mMatrix); + maskPath.computeBounds(mShapeBounds, false); + + // XOR operation + mCanvasARGB.drawPath(maskPath, mPaintMaskShape); + + if (DEBUG) { + final File afterFile = new File(mDir, "isShape" + id + "_after.png"); + try { + mBitmapARGB.compress(Bitmap.CompressFormat.PNG, 100, + new FileOutputStream(afterFile)); + } catch (Exception e) {} + } + + // Check if the XOR operation result is almost transparent + if (!isTransparentBitmap(mBitmapARGB)) { + if (DEBUG) { + Log.d(TAG, "Not same as mask shape"); + } + return false; + } + return true; + } + + /** + * 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); + int sum = 0; + for (int i = 0; i < w * h; i++) { + if(Color.alpha(mPixelsARGB[i]) > MIN_VISIBLE_ALPHA) { + sum++; + } + } + float percentageDiffPixels = ((float) sum) / (mBounds.width() * mBounds.height()); + boolean transparentImage = percentageDiffPixels < PIXEL_DIFF_PERCENTAGE_THRESHOLD; + if (DEBUG) { + Log.d(TAG, "Total # pixel that is different:" + percentageDiffPixels + "="+ sum + "/" + mBounds.width() * mBounds.height()); + } + return transparentImage; } /** @@ -79,7 +216,13 @@ public class IconNormalizer { * * @param outBounds optional rect to receive the fraction distance from each edge. */ - public synchronized float getScale(Drawable d, RectF outBounds) { + public synchronized float getScale(@NonNull Drawable d, @Nullable RectF outBounds, + @Nullable Path path, @Nullable boolean[] outMaskShape) { + if (Utilities.isAtLeastO() && d instanceof AdaptiveIconDrawable && + mAdaptiveIconScale != SCALE_NOT_INITIALIZED) { + outBounds.set(mBounds); + return mAdaptiveIconScale; + } int width = d.getIntrinsicWidth(); int height = d.getIntrinsicHeight(); if (width <= 0 || height <= 0) { @@ -169,20 +312,30 @@ public class IconNormalizer { if (hullByRect < CIRCLE_AREA_BY_RECT) { scaleRequired = MAX_CIRCLE_AREA_FACTOR; } else { - scaleRequired = MAX_SQUARE_AREA_FACTOR + LINEAR_SCALE_SLOPE * (1 - hullByRect); + scaleRequired = MAX_SQUARE_AREA_FACTOR + LINEAR_SCALE_SLOPE * (1 - hullByRect); } + mBounds.left = leftX; + mBounds.right = rightX; + + mBounds.top = topY; + mBounds.bottom = bottomY; if (outBounds != null) { - outBounds.left = ((float) leftX) / width; - outBounds.right = 1 - ((float) rightX) / width; - - outBounds.top = ((float) topY) / height; - outBounds.bottom = 1 - ((float) bottomY) / height; + outBounds.set(((float) mBounds.left) / width, ((float) mBounds.top), + 1 - ((float) mBounds.right) / width, + 1 - ((float) mBounds.bottom) / height); } + if (outMaskShape != null && outMaskShape.length > 0) { + outMaskShape[0] = isShape(path); + } float areaScale = area / (width * height); // Use sqrt of the final ratio as the images is scaled across both width and height. float scale = areaScale > scaleRequired ? (float) Math.sqrt(scaleRequired / areaScale) : 1; + if (Utilities.isAtLeastO() && d instanceof AdaptiveIconDrawable && + mAdaptiveIconScale == SCALE_NOT_INITIALIZED) { + mAdaptiveIconScale = scale; + } return scale; } diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index ef54661d30..ab589f1982 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -28,6 +28,7 @@ import android.graphics.Paint; import android.graphics.PaintFlagsDrawFilter; import android.graphics.Rect; import android.graphics.RectF; +import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.PaintDrawable; @@ -94,8 +95,29 @@ public class LauncherIcons { */ public static Bitmap createBadgedIconBitmap( Drawable icon, UserHandle user, Context context) { - float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? - 1 : IconNormalizer.getInstance(context).getScale(icon, null); + + IconNormalizer normalizer; + float scale = 1f; + if (!FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION) { + normalizer = IconNormalizer.getInstance(context); + if (Utilities.isAtLeastO()) { + boolean[] outShape = new boolean[1]; + AdaptiveIconDrawable dr = (AdaptiveIconDrawable) + context.getDrawable(R.drawable.adaptive_icon_drawable_wrapper).mutate(); + dr.setBounds(0, 0, 1, 1); + scale = normalizer.getScale(icon, null, dr.getIconMask(), outShape); + if (FeatureFlags.LEGACY_ICON_TREATMENT && + !outShape[0]){ + Drawable wrappedIcon = wrapToAdaptiveIconDrawable(context, icon, scale); + if (wrappedIcon != icon) { + icon = wrappedIcon; + scale = normalizer.getScale(icon, null, null, null); + } + } + } else { + scale = normalizer.getScale(icon, null, null, null); + } + } Bitmap bitmap = createIconBitmap(icon, context, scale); return badgeIconForUser(bitmap, user, context); } @@ -124,8 +146,29 @@ public class LauncherIcons { */ public static Bitmap createScaledBitmapWithoutShadow(Drawable icon, Context context) { RectF iconBounds = new RectF(); - float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? - 1 : IconNormalizer.getInstance(context).getScale(icon, iconBounds); + IconNormalizer normalizer; + float scale = 1f; + if (!FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION) { + normalizer = IconNormalizer.getInstance(context); + if (Utilities.isAtLeastO()) { + boolean[] outShape = new boolean[1]; + AdaptiveIconDrawable dr = (AdaptiveIconDrawable) + context.getDrawable(R.drawable.adaptive_icon_drawable_wrapper).mutate(); + dr.setBounds(0, 0, 1, 1); + scale = normalizer.getScale(icon, iconBounds, dr.getIconMask(), outShape); + if (Utilities.isAtLeastO() && FeatureFlags.LEGACY_ICON_TREATMENT && + !outShape[0]) { + Drawable wrappedIcon = wrapToAdaptiveIconDrawable(context, icon, scale); + if (wrappedIcon != icon) { + icon = wrappedIcon; + scale = normalizer.getScale(icon, iconBounds, null, null); + } + } + } else { + scale = normalizer.getScale(icon, iconBounds, null, null); + } + + } scale = Math.min(scale, ShadowGenerator.getScaleForBounds(iconBounds)); return createIconBitmap(icon, context, scale); } @@ -165,10 +208,8 @@ public class LauncherIcons { * @param scale the scale to apply before drawing {@param icon} on the canvas */ public static Bitmap createIconBitmap(Drawable icon, Context context, float scale) { - icon = wrapToAdaptiveIconDrawable(context, icon); synchronized (sCanvas) { final int iconBitmapSize = LauncherAppState.getIDP(context).iconBitmapSize; - int width = iconBitmapSize; int height = iconBitmapSize; @@ -236,7 +277,7 @@ public class LauncherIcons { * shrink the legacy icon and set it as foreground. Use color drawable as background to * create AdaptiveIconDrawable. */ - static Drawable wrapToAdaptiveIconDrawable(Context context, Drawable drawable) { + static Drawable wrapToAdaptiveIconDrawable(Context context, Drawable drawable, float scale) { if (!(FeatureFlags.LEGACY_ICON_TREATMENT && Utilities.isAtLeastO())) { return drawable; } @@ -246,8 +287,10 @@ public class LauncherIcons { if (!clazz.isAssignableFrom(drawable.getClass())) { Drawable iconWrapper = context.getDrawable(R.drawable.adaptive_icon_drawable_wrapper).mutate(); - ((FixedScaleDrawable) clazz.getMethod("getForeground").invoke(iconWrapper)) - .setDrawable(drawable); + FixedScaleDrawable fsd = ((FixedScaleDrawable) clazz.getMethod("getForeground") + .invoke(iconWrapper)); + fsd.setDrawable(drawable); + fsd.setScale(scale); return iconWrapper; } diff --git a/src_flags/com/android/launcher3/config/FeatureFlags.java b/src_flags/com/android/launcher3/config/FeatureFlags.java index 4b3e2e40a1..1c3e19f80f 100644 --- a/src_flags/com/android/launcher3/config/FeatureFlags.java +++ b/src_flags/com/android/launcher3/config/FeatureFlags.java @@ -49,8 +49,8 @@ public final class FeatureFlags { public static final boolean LIGHT_STATUS_BAR = false; // When enabled icons are badged with the number of notifications associated with that app. public static final boolean BADGE_ICONS = true; - // When enabled, icons not supporting {@link MaskableIconDrawable} will be wrapped in this class. - public static final boolean LEGACY_ICON_TREATMENT = false; + // When enabled, icons not supporting {@link AdaptiveIconDrawable} will be wrapped in {@link FixedScaleDrawable}. + public static final boolean LEGACY_ICON_TREATMENT = true; // When enabled, adaptive icons would have shadows baked when being stored to icon cache. public static final boolean ADAPTIVE_ICON_SHADOW = true; // When enabled, app discovery will be enabled if service is implemented From dcd8b5c27292b6549fb02f85e954c1b2f010b35d Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Tue, 28 Mar 2017 11:13:15 -0700 Subject: [PATCH 033/446] Fix NPE Change-Id: If816a3cafa42f92ec32cd77ba3a3a902201d9ca4 --- src/com/android/launcher3/graphics/IconNormalizer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index 069895a38a..ce2bca649b 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -220,7 +220,9 @@ public class IconNormalizer { @Nullable Path path, @Nullable boolean[] outMaskShape) { if (Utilities.isAtLeastO() && d instanceof AdaptiveIconDrawable && mAdaptiveIconScale != SCALE_NOT_INITIALIZED) { - outBounds.set(mBounds); + if (outBounds != null) { + outBounds.set(mBounds); + } return mAdaptiveIconScale; } int width = d.getIntrinsicWidth(); From 24b81caaa937aa79ab63b0e0846337d07f233425 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Tue, 28 Mar 2017 11:44:07 -0700 Subject: [PATCH 034/446] Enable feature flag for: Setting soft input to adjust resize while all apps is open. Bug: 35947394 Change-Id: Ia17ea11174a2a7276c243df7ed23dfa720200967 --- src_flags/com/android/launcher3/config/FeatureFlags.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_flags/com/android/launcher3/config/FeatureFlags.java b/src_flags/com/android/launcher3/config/FeatureFlags.java index 1c3e19f80f..a97823dafe 100644 --- a/src_flags/com/android/launcher3/config/FeatureFlags.java +++ b/src_flags/com/android/launcher3/config/FeatureFlags.java @@ -35,7 +35,7 @@ public final class FeatureFlags { // When enabled allows to use any point on the fast scrollbar to start dragging. public static boolean LAUNCHER3_DIRECT_SCROLL = true; // When enabled while all-apps open, the soft input will be set to adjust resize . - public static boolean LAUNCHER3_UPDATE_SOFT_INPUT_MODE = false; + public static boolean LAUNCHER3_UPDATE_SOFT_INPUT_MODE = true; // When enabled the promise icon is visible in all apps while installation an app. public static boolean LAUNCHER3_PROMISE_APPS_IN_ALL_APPS = true; From 3d6d4cacdcff3f08ac8f19ea72f986726e4c08af Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Tue, 28 Mar 2017 11:52:26 -0700 Subject: [PATCH 035/446] Fix NPE when DEBUG = false Change-Id: I1d2fcb7a636369bf5dcabdda1a7ba5b106a0677b --- src/com/android/launcher3/graphics/IconNormalizer.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index ce2bca649b..e0a7795d2a 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -113,11 +113,8 @@ public class IconNormalizer { int[] mPixels = new int[mMaxSize * mMaxSize]; mAdaptiveIconScale = SCALE_NOT_INITIALIZED; - // Only needed when DEBUG == true - if (DEBUG) { - mDir = context.getExternalFilesDir(null); - mRandom = new Random(); - } + mDir = context.getExternalFilesDir(null); + mRandom = new Random(); } /** From c06af333cbcebb183d13d004cccf5c9d69a70af0 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Tue, 28 Mar 2017 12:23:22 -0700 Subject: [PATCH 036/446] Minor Refactoring only: no functional change - organizing imports - remove redundant modifiers on LauncherCallback interface - fix typos Change-Id: I61eb985cac7c1379b6b804a67d4f234386d3d1b4 --- .../android/launcher3/AutoInstallsLayout.java | 2 +- .../launcher3/InsettableFrameLayout.java | 3 - src/com/android/launcher3/Launcher.java | 1 - .../android/launcher3/LauncherAnimUtils.java | 2 - .../android/launcher3/LauncherCallbacks.java | 82 +++++++++---------- src/com/android/launcher3/LauncherModel.java | 3 +- .../LauncherStateTransitionAnimation.java | 2 +- src/com/android/launcher3/PromiseAppInfo.java | 2 +- .../launcher3/SessionCommitReceiver.java | 1 - src/com/android/launcher3/ShortcutInfo.java | 6 +- src/com/android/launcher3/Utilities.java | 1 - .../FolderAccessibilityHelper.java | 2 +- .../LauncherAccessibilityDelegate.java | 3 +- .../ShortcutMenuAccessibilityDelegate.java | 1 - .../WorkspaceAccessibilityHelper.java | 2 +- .../allapps/AllAppsFastScrollHelper.java | 4 - .../launcher3/allapps/AllAppsGridAdapter.java | 2 +- .../AllAppsRecyclerViewContainerView.java | 1 - .../compat/AppWidgetManagerCompat.java | 1 - .../compat/LauncherAppsCompatVO.java | 3 +- .../launcher3/discovery/AppDiscoveryItem.java | 1 - .../launcher3/dragndrop/AddItemActivity.java | 4 +- .../launcher3/dragndrop/DragLayer.java | 1 - .../launcher3/dragndrop/DragOptions.java | 2 - .../dragndrop/LivePreviewWidgetCell.java | 1 - .../folder/ClippedFolderIconLayoutRule.java | 7 -- src/com/android/launcher3/folder/Folder.java | 3 +- .../launcher3/folder/PreviewImageView.java | 1 - .../folder/StackFolderIconLayoutRule.java | 4 - .../launcher3/graphics/IconNormalizer.java | 2 +- .../keyboard/CustomActionsPopup.java | 2 +- .../launcher3/logging/LoggerUtils.java | 1 - .../model/AddWorkspaceItemsTask.java | 2 +- .../android/launcher3/model/BgDataModel.java | 6 +- .../launcher3/model/CacheDataUpdatedTask.java | 1 - .../android/launcher3/model/LoaderCursor.java | 2 +- .../launcher3/model/PackageUpdatedTask.java | 2 +- .../model/SdCardAvailableReceiver.java | 1 - .../launcher3/model/ShortcutsChangedTask.java | 1 - .../model/UserLockStateChangedTask.java | 1 - .../pageindicators/CaretDrawable.java | 3 +- .../PageIndicatorCaretLandscape.java | 2 - .../provider/LossyScreenMigrationTask.java | 2 - .../ShortcutDragPreviewProvider.java | 2 +- .../shortcuts/ShortcutInfoCompat.java | 4 - .../launcher3/testing/LauncherExtension.java | 2 - .../android/launcher3/util/FocusLogic.java | 1 - .../android/launcher3/util/TestingUtils.java | 2 - .../launcher3/widget/WidgetsListAdapter.java | 1 - .../launcher3/widget/WidgetsRecyclerView.java | 3 +- 50 files changed, 68 insertions(+), 123 deletions(-) diff --git a/src/com/android/launcher3/AutoInstallsLayout.java b/src/com/android/launcher3/AutoInstallsLayout.java index c4086a89dd..98eb208eb2 100644 --- a/src/com/android/launcher3/AutoInstallsLayout.java +++ b/src/com/android/launcher3/AutoInstallsLayout.java @@ -393,7 +393,7 @@ public class AutoInstallsLayout { return -1; } - mValues.put(Favorites.RESTORED, ShortcutInfo.FLAG_AUTOINTALL_ICON); + mValues.put(Favorites.RESTORED, ShortcutInfo.FLAG_AUTOINSTALL_ICON); final Intent intent = new Intent(Intent.ACTION_MAIN, null) .addCategory(Intent.CATEGORY_LAUNCHER) .setComponent(new ComponentName(packageName, className)) diff --git a/src/com/android/launcher3/InsettableFrameLayout.java b/src/com/android/launcher3/InsettableFrameLayout.java index 154641cabe..be7649013c 100644 --- a/src/com/android/launcher3/InsettableFrameLayout.java +++ b/src/com/android/launcher3/InsettableFrameLayout.java @@ -9,9 +9,6 @@ import android.view.ViewDebug; import android.view.ViewGroup; import android.widget.FrameLayout; -import com.android.launcher3.allapps.AllAppsContainerView; -import com.android.launcher3.config.FeatureFlags; - public class InsettableFrameLayout extends FrameLayout implements ViewGroup.OnHierarchyChangeListener, Insettable { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 4713ae82ba..28d0b5893a 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -90,7 +90,6 @@ import com.android.launcher3.anim.AnimationLayerSet; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.PinItemRequestCompat; -import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java index aa7f5ee5fe..2be2021f1c 100644 --- a/src/com/android/launcher3/LauncherAnimUtils.java +++ b/src/com/android/launcher3/LauncherAnimUtils.java @@ -23,9 +23,7 @@ import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.util.Property; import android.view.View; -import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.widget.ViewAnimator; import java.util.HashSet; import java.util.WeakHashMap; diff --git a/src/com/android/launcher3/LauncherCallbacks.java b/src/com/android/launcher3/LauncherCallbacks.java index 2bac11f975..ff037b8f90 100644 --- a/src/com/android/launcher3/LauncherCallbacks.java +++ b/src/com/android/launcher3/LauncherCallbacks.java @@ -17,13 +17,11 @@ package com.android.launcher3; import android.content.Intent; -import android.graphics.Rect; import android.os.Bundle; import android.view.Menu; import android.view.View; import com.android.launcher3.allapps.AllAppsSearchBarController; -import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.util.ComponentKey; import java.io.FileDescriptor; @@ -44,61 +42,61 @@ public interface LauncherCallbacks { * Activity life-cycle methods. These methods are triggered after * the code in the corresponding Launcher method is executed. */ - public void preOnCreate(); - public void onCreate(Bundle savedInstanceState); - public void preOnResume(); - public void onResume(); - public void onStart(); - public void onStop(); - public void onPause(); - public void onDestroy(); - public void onSaveInstanceState(Bundle outState); - public void onPostCreate(Bundle savedInstanceState); - public void onNewIntent(Intent intent); - public void onActivityResult(int requestCode, int resultCode, Intent data); - public void onRequestPermissionsResult(int requestCode, String[] permissions, + void preOnCreate(); + void onCreate(Bundle savedInstanceState); + void preOnResume(); + void onResume(); + void onStart(); + void onStop(); + void onPause(); + void onDestroy(); + void onSaveInstanceState(Bundle outState); + void onPostCreate(Bundle savedInstanceState); + void onNewIntent(Intent intent); + void onActivityResult(int requestCode, int resultCode, Intent data); + void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults); - public void onWindowFocusChanged(boolean hasFocus); - public void onAttachedToWindow(); - public void onDetachedFromWindow(); - public boolean onPrepareOptionsMenu(Menu menu); - public void dump(String prefix, FileDescriptor fd, PrintWriter w, String[] args); - public void onHomeIntent(); - public boolean handleBackPressed(); - public void onTrimMemory(int level); + void onWindowFocusChanged(boolean hasFocus); + void onAttachedToWindow(); + void onDetachedFromWindow(); + boolean onPrepareOptionsMenu(Menu menu); + void dump(String prefix, FileDescriptor fd, PrintWriter w, String[] args); + void onHomeIntent(); + boolean handleBackPressed(); + void onTrimMemory(int level); /* * Extension points for providing custom behavior on certain user interactions. */ - public void onLauncherProviderChange(); - public void finishBindingItems(final boolean upgradePath); - public void bindAllApplications(ArrayList apps); - public void onInteractionBegin(); - public void onInteractionEnd(); + void onLauncherProviderChange(); + void finishBindingItems(final boolean upgradePath); + void bindAllApplications(ArrayList apps); + void onInteractionBegin(); + void onInteractionEnd(); @Deprecated - public void onWorkspaceLockedChanged(); + void onWorkspaceLockedChanged(); /** * Starts a search with {@param initialQuery}. Return false if search was not started. */ - public boolean startSearch( + boolean startSearch( String initialQuery, boolean selectInitialQuery, Bundle appSearchData); - public boolean hasCustomContentToLeft(); - public void populateCustomContentContainer(); - public View getQsbBar(); - public Bundle getAdditionalSearchWidgetOptions(); + boolean hasCustomContentToLeft(); + void populateCustomContentContainer(); + View getQsbBar(); + Bundle getAdditionalSearchWidgetOptions(); /* * Extensions points for adding / replacing some other aspects of the Launcher experience. */ - public boolean shouldMoveToDefaultScreenOnHomeIntent(); - public boolean hasSettings(); - public AllAppsSearchBarController getAllAppsSearchBarController(); - public List getPredictedApps(); - public static final int SEARCH_BAR_HEIGHT_NORMAL = 0, SEARCH_BAR_HEIGHT_TALL = 1; + boolean shouldMoveToDefaultScreenOnHomeIntent(); + boolean hasSettings(); + AllAppsSearchBarController getAllAppsSearchBarController(); + List getPredictedApps(); + int SEARCH_BAR_HEIGHT_NORMAL = 0, SEARCH_BAR_HEIGHT_TALL = 1; /** Must return one of {@link #SEARCH_BAR_HEIGHT_NORMAL} or {@link #SEARCH_BAR_HEIGHT_TALL} */ - public int getSearchBarHeight(); + int getSearchBarHeight(); /** * Sets the callbacks to allow reacting the actions of search overlays of the launcher. @@ -106,7 +104,7 @@ public interface LauncherCallbacks { * @param callbacks A set of callbacks to the Launcher, is actually a LauncherSearchCallback, * but for implementation purposes is passed around as an object. */ - public void setLauncherSearchCallback(Object callbacks); + void setLauncherSearchCallback(Object callbacks); - public boolean shouldShowDiscoveryBounce(); + boolean shouldShowDiscoveryBounce(); } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 58fb117a4a..d39c6ca444 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -25,7 +25,6 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; import android.content.pm.PackageInstaller; import android.net.Uri; @@ -930,7 +929,7 @@ public class LauncherModel extends BroadcastReceiver // no special handling necessary for this item c.markRestored(); } else { - if (c.hasRestoreFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) { + if (c.hasRestoreFlag(ShortcutInfo.FLAG_AUTOINSTALL_ICON)) { // We allow auto install apps to have their intent // updated after an install. intent = pmHelper.getAppLaunchIntent(targetPkg, c.user); diff --git a/src/com/android/launcher3/LauncherStateTransitionAnimation.java b/src/com/android/launcher3/LauncherStateTransitionAnimation.java index f5af979ce9..85467e06a6 100644 --- a/src/com/android/launcher3/LauncherStateTransitionAnimation.java +++ b/src/com/android/launcher3/LauncherStateTransitionAnimation.java @@ -31,8 +31,8 @@ import android.view.animation.AccelerateInterpolator; import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.AnimationLayerSet; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.anim.CircleRevealOutlineProvider; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.Thunk; import com.android.launcher3.widget.WidgetsContainerView; diff --git a/src/com/android/launcher3/PromiseAppInfo.java b/src/com/android/launcher3/PromiseAppInfo.java index 1749dde088..07515d08aa 100644 --- a/src/com/android/launcher3/PromiseAppInfo.java +++ b/src/com/android/launcher3/PromiseAppInfo.java @@ -40,7 +40,7 @@ public class PromiseAppInfo extends AppInfo { ShortcutInfo shortcut = new ShortcutInfo(this); shortcut.setInstallProgress(level); // We need to update the component name when the apk is installed - shortcut.status |= ShortcutInfo.FLAG_AUTOINTALL_ICON; + shortcut.status |= ShortcutInfo.FLAG_AUTOINSTALL_ICON; // Since the user is manually placing it on homescreen, it should not be auto-removed later shortcut.status |= ShortcutInfo.FLAG_RESTORE_STARTED; return shortcut; diff --git a/src/com/android/launcher3/SessionCommitReceiver.java b/src/com/android/launcher3/SessionCommitReceiver.java index 203bc25238..69695ae812 100644 --- a/src/com/android/launcher3/SessionCommitReceiver.java +++ b/src/com/android/launcher3/SessionCommitReceiver.java @@ -29,7 +29,6 @@ import android.text.TextUtils; import android.util.Log; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.UserManagerCompat; import java.util.List; diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 6f0417c08a..f0d9367afe 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -45,10 +45,10 @@ public class ShortcutInfo extends ItemInfoWithIcon { * be present along with {@link #FLAG_RESTORED_ICON}, and is set during default layout * parsing. */ - public static final int FLAG_AUTOINTALL_ICON = 2; //0B10; + public static final int FLAG_AUTOINSTALL_ICON = 2; //0B10; /** - * The icon is being installed. If {@link #FLAG_RESTORED_ICON} or {@link #FLAG_AUTOINTALL_ICON} + * The icon is being installed. If {@link #FLAG_RESTORED_ICON} or {@link #FLAG_AUTOINSTALL_ICON} * is set, then the icon is either being installed or is in a broken state. */ public static final int FLAG_INSTALL_SESSION_ACTIVE = 4; // 0B100; @@ -185,7 +185,7 @@ public class ShortcutInfo extends ItemInfoWithIcon { public final boolean isPromise() { - return hasStatusFlag(FLAG_RESTORED_ICON | FLAG_AUTOINTALL_ICON); + return hasStatusFlag(FLAG_RESTORED_ICON | FLAG_AUTOINSTALL_ICON); } public int getInstallProgress() { diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 17ad2b0d87..776ec2f628 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -61,7 +61,6 @@ import java.lang.reflect.Method; import java.util.Collection; import java.util.HashSet; import java.util.Locale; -import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; diff --git a/src/com/android/launcher3/accessibility/FolderAccessibilityHelper.java b/src/com/android/launcher3/accessibility/FolderAccessibilityHelper.java index d271f1d4ed..9c23c1980d 100644 --- a/src/com/android/launcher3/accessibility/FolderAccessibilityHelper.java +++ b/src/com/android/launcher3/accessibility/FolderAccessibilityHelper.java @@ -17,8 +17,8 @@ package com.android.launcher3.accessibility; import com.android.launcher3.CellLayout; -import com.android.launcher3.folder.FolderPagedView; import com.android.launcher3.R; +import com.android.launcher3.folder.FolderPagedView; /** * Implementation of {@link DragAndDropAccessibilityDelegate} to support DnD in a folder. diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java index a476650c99..e8127c45fd 100644 --- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java @@ -18,7 +18,6 @@ import com.android.launcher3.AppInfo; import com.android.launcher3.AppWidgetResizeFrame; import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; -import com.android.launcher3.popup.PopupContainerWithArrow; import com.android.launcher3.DeleteDropTarget; import com.android.launcher3.DropTarget.DragObject; import com.android.launcher3.FolderInfo; @@ -27,7 +26,6 @@ import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetHostView; import com.android.launcher3.LauncherAppWidgetInfo; -import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.PendingAddItemInfo; import com.android.launcher3.R; @@ -37,6 +35,7 @@ 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.popup.PopupContainerWithArrow; import com.android.launcher3.util.Thunk; import java.util.ArrayList; diff --git a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java index b784fe7f84..2ad0edbbcc 100644 --- a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java @@ -22,7 +22,6 @@ import android.view.accessibility.AccessibilityNodeInfo; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; diff --git a/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java b/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java index 9a23aa8138..e6f120fe64 100644 --- a/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java +++ b/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java @@ -27,9 +27,9 @@ import com.android.launcher3.CellLayout; import com.android.launcher3.FolderInfo; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; -import com.android.launcher3.accessibility.LauncherAccessibilityDelegate.DragType; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.accessibility.LauncherAccessibilityDelegate.DragType; import com.android.launcher3.dragndrop.DragLayer; /** diff --git a/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java b/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java index 7d70a3e966..e08cb15cd2 100644 --- a/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java +++ b/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java @@ -16,11 +16,7 @@ package com.android.launcher3.allapps; import android.support.v7.widget.RecyclerView; -import android.view.View; -import com.android.launcher3.BaseRecyclerViewFastScrollBar; -import com.android.launcher3.BubbleTextView; -import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.util.Thunk; import java.util.HashSet; diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java index 59cac8d26a..938e84ed09 100644 --- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java +++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java @@ -33,12 +33,12 @@ import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.widget.TextView; -import com.android.launcher3.discovery.AppDiscoveryAppInfo; import com.android.launcher3.AppInfo; import com.android.launcher3.BubbleTextView; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.allapps.AlphabeticalAppsList.AdapterItem; +import com.android.launcher3.discovery.AppDiscoveryAppInfo; import com.android.launcher3.discovery.AppDiscoveryItemView; import java.util.List; diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java index 6587ad78c9..517dc947e0 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java @@ -20,7 +20,6 @@ import android.graphics.Bitmap; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; import android.widget.RelativeLayout; import com.android.launcher3.BubbleTextView; diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java index 7911bb213d..257d0ad83e 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java @@ -22,7 +22,6 @@ import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.content.Context; -import android.graphics.Bitmap; import android.os.Bundle; import android.os.UserHandle; diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java index d7e35a2e55..da248cf949 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java @@ -25,10 +25,11 @@ import android.os.Process; import android.os.UserHandle; import android.util.Log; +import com.android.launcher3.compat.ShortcutConfigActivityInfo.ShortcutConfigActivityInfoVO; + import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; -import com.android.launcher3.compat.ShortcutConfigActivityInfo.*; public class LauncherAppsCompatVO extends LauncherAppsCompatVL { diff --git a/src/com/android/launcher3/discovery/AppDiscoveryItem.java b/src/com/android/launcher3/discovery/AppDiscoveryItem.java index 09c91acc6d..2e48b25e06 100644 --- a/src/com/android/launcher3/discovery/AppDiscoveryItem.java +++ b/src/com/android/launcher3/discovery/AppDiscoveryItem.java @@ -16,7 +16,6 @@ package com.android.launcher3.discovery; -import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; diff --git a/src/com/android/launcher3/dragndrop/AddItemActivity.java b/src/com/android/launcher3/dragndrop/AddItemActivity.java index c2a4820c8d..187e6d93dd 100644 --- a/src/com/android/launcher3/dragndrop/AddItemActivity.java +++ b/src/com/android/launcher3/dragndrop/AddItemActivity.java @@ -31,7 +31,9 @@ import android.os.Build; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; -import android.view.View.*; +import android.view.View.DragShadowBuilder; +import android.view.View.OnLongClickListener; +import android.view.View.OnTouchListener; import com.android.launcher3.BaseActivity; import com.android.launcher3.InstallShortcutReceiver; diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index 23a2577679..e1a9834866 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -58,7 +58,6 @@ import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.logging.LoggerUtils; -import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.TouchController; diff --git a/src/com/android/launcher3/dragndrop/DragOptions.java b/src/com/android/launcher3/dragndrop/DragOptions.java index 230fa2d4a5..9433aadc7e 100644 --- a/src/com/android/launcher3/dragndrop/DragOptions.java +++ b/src/com/android/launcher3/dragndrop/DragOptions.java @@ -17,8 +17,6 @@ package com.android.launcher3.dragndrop; import android.graphics.Point; -import android.support.annotation.CallSuper; -import android.view.View; import com.android.launcher3.DropTarget; diff --git a/src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java b/src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java index 36a0292da1..e36f607dea 100644 --- a/src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java +++ b/src/com/android/launcher3/dragndrop/LivePreviewWidgetCell.java @@ -4,7 +4,6 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import android.widget.FrameLayout; import android.widget.RemoteViews; diff --git a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java index 503c2ec9f3..0df787ac31 100644 --- a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java +++ b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java @@ -1,12 +1,5 @@ package com.android.launcher3.folder; -import android.view.View; - -import com.android.launcher3.config.FeatureFlags; - -import java.util.ArrayList; -import java.util.List; - public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { static final int MAX_NUM_ITEMS_IN_PREVIEW = 4; diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 945c8dc629..3ee475a263 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -25,7 +25,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; -import android.support.v4.os.BuildCompat; import android.text.InputType; import android.text.Selection; import android.util.AttributeSet; @@ -69,6 +68,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.Workspace.ItemOperator; import com.android.launcher3.accessibility.AccessibleDragListenerAdapter; import com.android.launcher3.anim.AnimationLayerSet; +import com.android.launcher3.anim.CircleRevealOutlineProvider; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragController.DragListener; @@ -77,7 +77,6 @@ import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.pageindicators.PageIndicatorDots; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; -import com.android.launcher3.anim.CircleRevealOutlineProvider; import com.android.launcher3.util.Thunk; import java.util.ArrayList; diff --git a/src/com/android/launcher3/folder/PreviewImageView.java b/src/com/android/launcher3/folder/PreviewImageView.java index c4f3ee15c2..65d9db1180 100644 --- a/src/com/android/launcher3/folder/PreviewImageView.java +++ b/src/com/android/launcher3/folder/PreviewImageView.java @@ -22,7 +22,6 @@ import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.Rect; import android.view.View; -import android.view.ViewGroup; import android.widget.ImageView; import com.android.launcher3.Launcher; diff --git a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java index 9c8c2efdb8..12bca5fdfe 100644 --- a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java +++ b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java @@ -16,12 +16,8 @@ package com.android.launcher3.folder; -import android.view.View; - import com.android.launcher3.folder.FolderIcon.PreviewItemDrawingParams; -import java.util.List; - public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { static final int MAX_NUM_ITEMS_IN_PREVIEW = 3; diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index e0a7795d2a..ebbca95c3e 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -27,8 +27,8 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; -import android.graphics.drawable.Drawable; import android.graphics.drawable.AdaptiveIconDrawable; +import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; diff --git a/src/com/android/launcher3/keyboard/CustomActionsPopup.java b/src/com/android/launcher3/keyboard/CustomActionsPopup.java index bb0b58add6..938955ca2c 100644 --- a/src/com/android/launcher3/keyboard/CustomActionsPopup.java +++ b/src/com/android/launcher3/keyboard/CustomActionsPopup.java @@ -24,10 +24,10 @@ import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.widget.PopupMenu; import android.widget.PopupMenu.OnMenuItemClickListener; -import com.android.launcher3.popup.PopupContainerWithArrow; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; +import com.android.launcher3.popup.PopupContainerWithArrow; import java.util.ArrayList; import java.util.Collections; diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index 499fdc7d38..329b7d5611 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -15,7 +15,6 @@ */ package com.android.launcher3.logging; -import android.text.TextUtils; import android.util.ArrayMap; import android.util.SparseArray; import android.view.View; diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index edc64e5b3c..10fb5828cb 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -179,7 +179,7 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { // checking for existing promise icon with same package name if (isLauncherAppTarget && info.isPromise() - && info.hasStatusFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON) + && info.hasStatusFlag(ShortcutInfo.FLAG_AUTOINSTALL_ICON) && info.getTargetComponent() != null && compPkgName != null && compPkgName.equals(info.getTargetComponent().getPackageName())) { diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 930c854c38..be93be4dc3 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -29,12 +29,12 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.logging.DumpTargetWrapper; -import com.android.launcher3.shortcuts.DeepShortcutManager; -import com.android.launcher3.shortcuts.ShortcutInfoCompat; -import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.model.nano.LauncherDumpProto; import com.android.launcher3.model.nano.LauncherDumpProto.ContainerType; import com.android.launcher3.model.nano.LauncherDumpProto.DumpTarget; +import com.android.launcher3.shortcuts.DeepShortcutManager; +import com.android.launcher3.shortcuts.ShortcutInfoCompat; +import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.MultiHashMap; diff --git a/src/com/android/launcher3/model/CacheDataUpdatedTask.java b/src/com/android/launcher3/model/CacheDataUpdatedTask.java index 46130fc0b1..d7cece4884 100644 --- a/src/com/android/launcher3/model/CacheDataUpdatedTask.java +++ b/src/com/android/launcher3/model/CacheDataUpdatedTask.java @@ -26,7 +26,6 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; -import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.ShortcutInfo; import java.util.ArrayList; diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java index 36f60b94b7..1a2c04d6e3 100644 --- a/src/com/android/launcher3/model/LoaderCursor.java +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -219,7 +219,7 @@ public class LoaderCursor extends CursorWrapper { if (!TextUtils.isEmpty(title)) { info.title = Utilities.trim(title); } - } else if (hasRestoreFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) { + } else if (hasRestoreFlag(ShortcutInfo.FLAG_AUTOINSTALL_ICON)) { if (TextUtils.isEmpty(info.title)) { info.title = getTitle(); } diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 87b63ffdac..0a2ec2acc1 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -225,7 +225,7 @@ public class PackageUpdatedTask extends ExtendedModelTask { AppInfo appInfo = addedOrUpdatedApps.get(cn); if (si.isPromise() && mOp == OP_ADD) { - if (si.hasStatusFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) { + if (si.hasStatusFlag(ShortcutInfo.FLAG_AUTOINSTALL_ICON)) { // Auto install icon LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); diff --git a/src/com/android/launcher3/model/SdCardAvailableReceiver.java b/src/com/android/launcher3/model/SdCardAvailableReceiver.java index 278669bdb0..bae5c73c1b 100644 --- a/src/com/android/launcher3/model/SdCardAvailableReceiver.java +++ b/src/com/android/launcher3/model/SdCardAvailableReceiver.java @@ -19,7 +19,6 @@ package com.android.launcher3.model; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; import android.os.UserHandle; import com.android.launcher3.LauncherModel; diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index d8a429cba4..47e83e5b95 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -21,7 +21,6 @@ import android.os.UserHandle; import com.android.launcher3.AllAppsList; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; -import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.graphics.LauncherIcons; diff --git a/src/com/android/launcher3/model/UserLockStateChangedTask.java b/src/com/android/launcher3/model/UserLockStateChangedTask.java index 363f1eeb12..fefed75524 100644 --- a/src/com/android/launcher3/model/UserLockStateChangedTask.java +++ b/src/com/android/launcher3/model/UserLockStateChangedTask.java @@ -21,7 +21,6 @@ import android.os.UserHandle; import com.android.launcher3.AllAppsList; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; -import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.compat.UserManagerCompat; diff --git a/src/com/android/launcher3/pageindicators/CaretDrawable.java b/src/com/android/launcher3/pageindicators/CaretDrawable.java index 32e57a9f62..349b41cb2a 100644 --- a/src/com/android/launcher3/pageindicators/CaretDrawable.java +++ b/src/com/android/launcher3/pageindicators/CaretDrawable.java @@ -22,12 +22,11 @@ import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; import com.android.launcher3.R; import com.android.launcher3.util.Themes; -import android.graphics.drawable.Drawable; - public class CaretDrawable extends Drawable { public static final float PROGRESS_CARET_POINTING_UP = -1f; public static final float PROGRESS_CARET_POINTING_DOWN = 1f; diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorCaretLandscape.java b/src/com/android/launcher3/pageindicators/PageIndicatorCaretLandscape.java index aedf283843..ae10aedee2 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorCaretLandscape.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorCaretLandscape.java @@ -16,9 +16,7 @@ package com.android.launcher3.pageindicators; import android.content.Context; -import android.content.res.Resources; import android.graphics.Canvas; -import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; diff --git a/src/com/android/launcher3/provider/LossyScreenMigrationTask.java b/src/com/android/launcher3/provider/LossyScreenMigrationTask.java index 4addbfa239..51890d1943 100644 --- a/src/com/android/launcher3/provider/LossyScreenMigrationTask.java +++ b/src/com/android/launcher3/provider/LossyScreenMigrationTask.java @@ -21,7 +21,6 @@ import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Point; -import android.util.Log; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherSettings.Favorites; @@ -31,7 +30,6 @@ import com.android.launcher3.model.GridSizeMigrationTask; import com.android.launcher3.util.LongArrayMap; import java.util.ArrayList; -import java.util.HashMap; /** * An extension of {@link GridSizeMigrationTask} which migrates only one screen and diff --git a/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java b/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java index ab8de6bd5e..e9d2b50eae 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java +++ b/src/com/android/launcher3/shortcuts/ShortcutDragPreviewProvider.java @@ -23,10 +23,10 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.view.View; -import com.android.launcher3.graphics.HolographicOutlineHelper; import com.android.launcher3.Launcher; import com.android.launcher3.Utilities; import com.android.launcher3.graphics.DragPreviewProvider; +import com.android.launcher3.graphics.HolographicOutlineHelper; /** * Extension of {@link DragPreviewProvider} which generates bitmaps scaled to the default icon size. diff --git a/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java b/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java index 37047bb36a..9c91c87b2e 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java +++ b/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java @@ -18,15 +18,11 @@ package com.android.launcher3.shortcuts; import android.annotation.TargetApi; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutInfo; import android.os.Build; import android.os.UserHandle; -import com.android.launcher3.ItemInfo; -import com.android.launcher3.compat.UserManagerCompat; - /** * Wrapper class for {@link android.content.pm.ShortcutInfo}, representing deep shortcuts into apps. * diff --git a/src/com/android/launcher3/testing/LauncherExtension.java b/src/com/android/launcher3/testing/LauncherExtension.java index aedca8db49..12f3b846af 100644 --- a/src/com/android/launcher3/testing/LauncherExtension.java +++ b/src/com/android/launcher3/testing/LauncherExtension.java @@ -2,7 +2,6 @@ package com.android.launcher3.testing; import android.content.Intent; import android.graphics.Color; -import android.graphics.Rect; import android.os.Bundle; import android.view.Menu; import android.view.View; @@ -12,7 +11,6 @@ import com.android.launcher3.AppInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherCallbacks; import com.android.launcher3.allapps.AllAppsSearchBarController; -import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.util.ComponentKey; import java.io.FileDescriptor; diff --git a/src/com/android/launcher3/util/FocusLogic.java b/src/com/android/launcher3/util/FocusLogic.java index afc45fe35b..b80e94d15e 100644 --- a/src/com/android/launcher3/util/FocusLogic.java +++ b/src/com/android/launcher3/util/FocusLogic.java @@ -23,7 +23,6 @@ import android.view.ViewGroup; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; -import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ShortcutAndWidgetContainer; import com.android.launcher3.config.FeatureFlags; diff --git a/src/com/android/launcher3/util/TestingUtils.java b/src/com/android/launcher3/util/TestingUtils.java index 665c371755..a7cc42b5fa 100644 --- a/src/com/android/launcher3/util/TestingUtils.java +++ b/src/com/android/launcher3/util/TestingUtils.java @@ -3,7 +3,6 @@ package com.android.launcher3.util; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.util.Log; import android.view.Gravity; import android.view.View; @@ -11,7 +10,6 @@ import android.widget.FrameLayout; import com.android.launcher3.CustomAppWidget; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; import com.android.launcher3.Utilities; diff --git a/src/com/android/launcher3/widget/WidgetsListAdapter.java b/src/com/android/launcher3/widget/WidgetsListAdapter.java index 38210fc977..5f789a2a2c 100644 --- a/src/com/android/launcher3/widget/WidgetsListAdapter.java +++ b/src/com/android/launcher3/widget/WidgetsListAdapter.java @@ -22,7 +22,6 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.LinearLayout; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; diff --git a/src/com/android/launcher3/widget/WidgetsRecyclerView.java b/src/com/android/launcher3/widget/WidgetsRecyclerView.java index e0a80c679a..f47ca3eebd 100644 --- a/src/com/android/launcher3/widget/WidgetsRecyclerView.java +++ b/src/com/android/launcher3/widget/WidgetsRecyclerView.java @@ -21,9 +21,8 @@ import android.graphics.Color; import android.support.v7.widget.LinearLayoutManager; import android.util.AttributeSet; import android.view.View; + import com.android.launcher3.BaseRecyclerView; -import com.android.launcher3.model.PackageItemInfo; -import com.android.launcher3.model.WidgetsModel; /** * The widgets recycler view. From 86160f5d5b56cec18871f8ef95aabbbee41d05f9 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 6 Feb 2017 10:46:24 -0800 Subject: [PATCH 037/446] code cleanup: regarding Favorites debug logging Change-Id: Ie4d4ffda30ce3b495c2b9fd57ea584d45cc3357d --- src/com/android/launcher3/ItemInfo.java | 23 ++++++++++--------- .../android/launcher3/LauncherSettings.java | 12 ++++++++++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/com/android/launcher3/ItemInfo.java b/src/com/android/launcher3/ItemInfo.java index 0779a3d206..11c5309f22 100644 --- a/src/com/android/launcher3/ItemInfo.java +++ b/src/com/android/launcher3/ItemInfo.java @@ -39,8 +39,10 @@ public class ItemInfo { /** * One of {@link LauncherSettings.Favorites#ITEM_TYPE_APPLICATION}, * {@link LauncherSettings.Favorites#ITEM_TYPE_SHORTCUT}, - * {@link LauncherSettings.Favorites#ITEM_TYPE_FOLDER}, or - * {@link LauncherSettings.Favorites#ITEM_TYPE_APPWIDGET}. + * {@link LauncherSettings.Favorites#ITEM_TYPE_DEEP_SHORTCUT} + * {@link LauncherSettings.Favorites#ITEM_TYPE_FOLDER}, + * {@link LauncherSettings.Favorites#ITEM_TYPE_APPWIDGET} or + * {@link LauncherSettings.Favorites#ITEM_TYPE_CUSTOM_APPWIDGET}. */ public int itemType; @@ -53,7 +55,9 @@ public class ItemInfo { public long container = NO_ID; /** - * Indicates the screen in which the shortcut appears. + * Indicates the screen in which the shortcut appears if the container types is + * {@link LauncherSettings.Favorites#CONTAINER_DESKTOP}. (i.e., ignore if the container type is + * {@link LauncherSettings.Favorites#CONTAINER_HOTSEAT}) */ public long screenId = -1; @@ -178,15 +182,12 @@ public class ItemInfo { protected String dumpProperties() { return "id=" + id - + " type=" + itemType - + " container=" + container + + " type=" + LauncherSettings.Favorites.itemTypeToString(itemType) + + " container=" + LauncherSettings.Favorites.containerToString((int)container) + " screen=" + screenId - + " cellX=" + cellX - + " cellY=" + cellY - + " spanX=" + spanX - + " spanY=" + spanY - + " minSpanX=" + minSpanX - + " minSpanY=" + minSpanY + + " cell(" + cellX + "," + cellY + ")" + + " span(" + spanX + "," + spanY + ")" + + " minSpan(" + minSpanX + "," + minSpanY + ")" + " rank=" + rank + " user=" + user + " title=" + title; diff --git a/src/com/android/launcher3/LauncherSettings.java b/src/com/android/launcher3/LauncherSettings.java index e8e0eb2344..3f047f511b 100644 --- a/src/com/android/launcher3/LauncherSettings.java +++ b/src/com/android/launcher3/LauncherSettings.java @@ -153,6 +153,18 @@ public class LauncherSettings { } } + static final String itemTypeToString(int type) { + switch(type) { + case ITEM_TYPE_APPLICATION: return "APP"; + case ITEM_TYPE_SHORTCUT: return "SHORTCUT"; + case ITEM_TYPE_FOLDER: return "FOLDER"; + case ITEM_TYPE_APPWIDGET: return "WIDGET"; + case ITEM_TYPE_CUSTOM_APPWIDGET: return "CUSTOMWIDGET"; + case ITEM_TYPE_DEEP_SHORTCUT: return "DEEPSHORTCUT"; + default: return String.valueOf(type); + } + } + /** * The screen holding the favorite (if container is CONTAINER_DESKTOP) *

Type: INTEGER

From ffd7e762617c007e58eeba5dc27c215546f9852b Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Tue, 28 Mar 2017 18:43:56 -0700 Subject: [PATCH 038/446] Fine tune the circle detection Decreased the pixel_diff_percentage from 10% to 0.5% by not counting the pixel_diff around the mask path outline. Verified that this implementation works well on both Pixel/PixelXL b/36563706 Change-Id: I8bb488f550a67e2188eff4c4b9e7717e979a741c --- src/com/android/launcher3/IconCache.java | 2 +- .../launcher3/graphics/IconNormalizer.java | 36 +++++++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index a5552aafdc..a472a3a223 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -763,7 +763,7 @@ public class IconCache { } private static final class IconDB extends SQLiteCacheHelper { - private final static int DB_VERSION = 10; + private final static int DB_VERSION = 11; private final static int RELEASE_VERSION = DB_VERSION + (FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? 0 : 1); diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index ebbca95c3e..f34933e893 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -60,7 +60,7 @@ public class IconNormalizer { // Shape detection related constants private static final float BOUND_RATIO_MARGIN = .05f; - private static final float PIXEL_DIFF_PERCENTAGE_THRESHOLD = 0.1f; + private static final float PIXEL_DIFF_PERCENTAGE_THRESHOLD = 0.005f; private static final float SCALE_NOT_INITIALIZED = 0; private static final Object LOCK = new Object(); @@ -71,6 +71,7 @@ public class IconNormalizer { 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 float mAdaptiveIconScale; @@ -79,14 +80,15 @@ public class IconNormalizer { private final float[] mLeftBorder; private final float[] mRightBorder; private final Rect mBounds; - private final RectF mShapeBounds; private final Matrix mMatrix; private Paint mPaintIcon; private Canvas mCanvasARGB; private File mDir; + private int mFileId; private Random mRandom; + private float mDensity; private IconNormalizer(Context context) { // Use twice the icon size as maximum size to avoid scaling down twice. @@ -98,17 +100,25 @@ public class IconNormalizer { mLeftBorder = new float[mMaxSize]; mRightBorder = new float[mMaxSize]; mBounds = new Rect(); - + mDensity = context.getResources().getDisplayMetrics().density; // Needed for isShape() method mBitmapARGB = Bitmap.createBitmap(mMaxSize, mMaxSize, Bitmap.Config.ARGB_8888); mCanvasARGB = new Canvas(mBitmapARGB); - mShapeBounds = new RectF(); mPaintIcon = new Paint(); mPaintIcon.setColor(Color.WHITE); + mPaintMaskShape = new Paint(); mPaintMaskShape.setColor(Color.RED); + mPaintMaskShape.setStyle(Paint.Style.FILL); mPaintMaskShape.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR)); + + mPaintMaskShapeOutline = new Paint(); + mPaintMaskShapeOutline.setStrokeWidth(2 * mDensity); + mPaintMaskShapeOutline.setStyle(Paint.Style.STROKE); + mPaintMaskShapeOutline.setColor(Color.BLACK); + mPaintMaskShapeOutline.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); + mMatrix = new Matrix(); int[] mPixels = new int[mMaxSize * mMaxSize]; mAdaptiveIconScale = SCALE_NOT_INITIALIZED; @@ -136,12 +146,12 @@ 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. - int id = mRandom.nextInt(); + mFileId = mRandom.nextInt(); mBitmapARGB.eraseColor(Color.TRANSPARENT); mCanvasARGB.drawBitmap(mBitmap, 0, 0, mPaintIcon); if (DEBUG) { - final File beforeFile = new File(mDir, "isShape" + id + "_before.png"); + final File beforeFile = new File(mDir, "isShape" + mFileId + "_before.png"); try { mBitmapARGB.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(beforeFile)); @@ -149,24 +159,28 @@ public class IconNormalizer { } // 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.computeBounds(mShapeBounds, false); // XOR operation mCanvasARGB.drawPath(maskPath, mPaintMaskShape); + // DST_OUT operation around the mask path outline + mCanvasARGB.drawPath(maskPath, mPaintMaskShapeOutline); + + boolean isTrans = isTransparentBitmap(mBitmapARGB); if (DEBUG) { - final File afterFile = new File(mDir, "isShape" + id + "_after.png"); + final File afterFile = new File(mDir, "isShape" + mFileId + "_after_" + isTrans + ".png"); try { mBitmapARGB.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(afterFile)); } catch (Exception e) {} } - // Check if the XOR operation result is almost transparent - if (!isTransparentBitmap(mBitmapARGB)) { + // Check if the result is almost transparent + if (!isTrans) { if (DEBUG) { Log.d(TAG, "Not same as mask shape"); } @@ -194,7 +208,7 @@ public class IconNormalizer { float percentageDiffPixels = ((float) sum) / (mBounds.width() * mBounds.height()); boolean transparentImage = percentageDiffPixels < PIXEL_DIFF_PERCENTAGE_THRESHOLD; if (DEBUG) { - Log.d(TAG, "Total # pixel that is different:" + percentageDiffPixels + "="+ sum + "/" + mBounds.width() * mBounds.height()); + Log.d(TAG, "Total # pixel that is different (id="+ mFileId + "):" + percentageDiffPixels + "="+ sum + "/" + mBounds.width() * mBounds.height()); } return transparentImage; } From 733abf02d11945dc33130f05a7fbdaddabf2d081 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 29 Mar 2017 13:35:29 -0700 Subject: [PATCH 039/446] Fix folder animations in spring loaded mode + polish. * Changed interpolators. Bug: 36653850 Bug: 35064148 Change-Id: I44a732be969582f718d7dc2f82a9f976331821cb --- .../folder_closing_interpolator.xml | 24 ------ ...terpolator.xml => folder_interpolator.xml} | 0 ...lder_preview_item_closing_interpolator.xml | 24 ------ ...arge_folder_preview_item_interpolator.xml} | 0 .../RoundedRectRevealOutlineProvider.java | 2 +- .../folder/FolderAnimationManager.java | 81 ++++++++++--------- 6 files changed, 42 insertions(+), 89 deletions(-) delete mode 100644 res/interpolator/folder_closing_interpolator.xml rename res/interpolator/{folder_opening_interpolator.xml => folder_interpolator.xml} (100%) delete mode 100644 res/interpolator/folder_preview_item_closing_interpolator.xml rename res/interpolator/{folder_preview_item_opening_interpolator.xml => large_folder_preview_item_interpolator.xml} (100%) diff --git a/res/interpolator/folder_closing_interpolator.xml b/res/interpolator/folder_closing_interpolator.xml deleted file mode 100644 index e6e012eda1..0000000000 --- a/res/interpolator/folder_closing_interpolator.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - diff --git a/res/interpolator/folder_opening_interpolator.xml b/res/interpolator/folder_interpolator.xml similarity index 100% rename from res/interpolator/folder_opening_interpolator.xml rename to res/interpolator/folder_interpolator.xml diff --git a/res/interpolator/folder_preview_item_closing_interpolator.xml b/res/interpolator/folder_preview_item_closing_interpolator.xml deleted file mode 100644 index d8ddb0ca86..0000000000 --- a/res/interpolator/folder_preview_item_closing_interpolator.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - diff --git a/res/interpolator/folder_preview_item_opening_interpolator.xml b/res/interpolator/large_folder_preview_item_interpolator.xml similarity index 100% rename from res/interpolator/folder_preview_item_opening_interpolator.xml rename to res/interpolator/large_folder_preview_item_interpolator.xml diff --git a/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java b/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java index 9c09477bbf..a0d1f8b654 100644 --- a/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java +++ b/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java @@ -42,7 +42,7 @@ public class RoundedRectRevealOutlineProvider extends RevealOutlineAnimation { @Override public boolean shouldRemoveElevationDuringAnimation() { - return false; + return true; } @Override diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index a62d1b7423..578921f649 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -67,10 +67,8 @@ public class FolderAnimationManager { private final int mDuration; private final int mDelay; - private final TimeInterpolator mOpeningInterpolator; - private final TimeInterpolator mClosingInterpolator; - private final TimeInterpolator mPreviewItemOpeningInterpolator; - private final TimeInterpolator mPreviewItemClosingInterpolator; + private final TimeInterpolator mFolderInterpolator; + private final TimeInterpolator mLargeFolderPreviewItemInterpolator; private final FolderIcon.PreviewItemDrawingParams mTmpParams = new FolderIcon.PreviewItemDrawingParams(0, 0, 0, 0); @@ -122,14 +120,10 @@ public class FolderAnimationManager { mDuration = mFolder.mMaterialExpandDuration; mDelay = mContext.getResources().getInteger(R.integer.config_folderDelay); - mOpeningInterpolator = AnimationUtils.loadInterpolator(mContext, - R.interpolator.folder_opening_interpolator); - mClosingInterpolator = AnimationUtils.loadInterpolator(mContext, - R.interpolator.folder_closing_interpolator); - mPreviewItemOpeningInterpolator = AnimationUtils.loadInterpolator(mContext, - R.interpolator.folder_preview_item_opening_interpolator); - mPreviewItemClosingInterpolator = AnimationUtils.loadInterpolator(mContext, - R.interpolator.folder_preview_item_closing_interpolator); + mFolderInterpolator = AnimationUtils.loadInterpolator(mContext, + R.interpolator.folder_interpolator); + mLargeFolderPreviewItemInterpolator = AnimationUtils.loadInterpolator(mContext, + R.interpolator.large_folder_preview_item_interpolator); } @@ -141,12 +135,16 @@ public class FolderAnimationManager { FolderIcon.PreviewLayoutRule rule = mFolderIcon.getLayoutRule(); final List itemsInPreview = mFolderIcon.getItemsToDisplay(); + // Match position of the FolderIcon + final Rect folderIconPos = new Rect(); + float scaleRelativeToDragLayer = mLauncher.getDragLayer() + .getDescendantRectRelativeToSelf(mFolderIcon, folderIconPos); + // Match size/scale of icons in the preview float previewScale = rule.scaleForItem(0, itemsInPreview.size()); float previewSize = rule.getIconSize() * previewScale; - float folderScale = previewSize / itemsInPreview.get(0).getIconSize(); - - final float initialScale = folderScale; + float initialScale = previewSize / itemsInPreview.get(0).getIconSize() + * scaleRelativeToDragLayer; final float finalScale = 1f; float scale = mIsOpening ? initialScale : finalScale; mFolder.setScaleX(scale); @@ -154,25 +152,24 @@ public class FolderAnimationManager { mFolder.setPivotX(0); mFolder.setPivotY(0); - // Match position of the FolderIcon - final Rect folderIconPos = new Rect(); - float scaleRelativeToDragLayer = mLauncher.getDragLayer() - .getDescendantRectRelativeToSelf(mFolderIcon, folderIconPos); - folderScale *= scaleRelativeToDragLayer; - // We want to create a small X offset for the preview items, so that they follow their // expected path to their final locations. ie. an icon should not move right, if it's final // location is to its left. This value is arbitrarily defined. - final int nudgeOffsetX = (int) (previewSize / 2); + int previewItemOffsetX = (int) (previewSize / 2); final int paddingOffsetX = (int) ((mFolder.getPaddingLeft() + mContent.getPaddingLeft()) - * folderScale); + * initialScale); final int paddingOffsetY = (int) ((mFolder.getPaddingTop() + mContent.getPaddingTop()) - * folderScale); + * initialScale); + + // Background can have a scaled radius in drag and drop mode. + int radiusDiff = mFolderIcon.mBackground.getScaledRadius() + - mFolderIcon.mBackground.getRadius(); int initialX = folderIconPos.left + mFolderIcon.mBackground.getOffsetX() - paddingOffsetX - - nudgeOffsetX; - int initialY = folderIconPos.top + mFolderIcon.mBackground.getOffsetY() - paddingOffsetY; + - previewItemOffsetX + radiusDiff; + int initialY = folderIconPos.top + mFolderIcon.mBackground.getOffsetY() - paddingOffsetY + + radiusDiff; final float xDistance = initialX - lp.x; final float yDistance = initialY - lp.y; @@ -189,13 +186,17 @@ public class FolderAnimationManager { : finalTextColor); // Set up the reveal animation that clips the Folder. - float stroke = mPreviewBackground.getStrokeWidth(); - int initialSize = (int) ((mFolderIcon.mBackground.getRadius() * 2 + stroke) / folderScale); - int totalOffsetX = paddingOffsetX + Math.round(nudgeOffsetX / folderScale); - int unscaledStroke = (int) Math.floor(stroke / folderScale); - Rect startRect = new Rect(totalOffsetX + unscaledStroke, unscaledStroke, - totalOffsetX + initialSize, initialSize); + float initialSize = (mFolderIcon.mBackground.getRadius() * 2 + + mPreviewBackground.getStrokeWidth()) * scaleRelativeToDragLayer; + + int totalOffsetX = paddingOffsetX + previewItemOffsetX; + Rect startRect = new Rect( + Math.round(totalOffsetX / initialScale), + Math.round(paddingOffsetY / initialScale), + Math.round((totalOffsetX + initialSize) / initialScale), + Math.round((paddingOffsetY + initialSize) / initialScale)); Rect endRect = new Rect(0, 0, lp.width, lp.height); + float initialRadius = initialSize / initialScale / 2f; float finalRadius = Utilities.pxFromDp(2, mContext.getResources().getDisplayMetrics()); // Create the animators. @@ -206,7 +207,7 @@ public class FolderAnimationManager { play(a, getAnimator(mFolder, SCALE_PROPERTY, initialScale, finalScale)); play(a, getAnimator(items, ITEMS_TEXT_COLOR_PROPERTY, Color.TRANSPARENT, finalTextColor)); play(a, getAnimator(mFolderBackground, "color", initialColor, finalColor)); - play(a, new RoundedRectRevealOutlineProvider(initialSize / 2f, finalRadius, startRect, + play(a, new RoundedRectRevealOutlineProvider(initialRadius, finalRadius, startRect, endRect).createRevealAnimator(mFolder, !mIsOpening)); a.addListener(new AnimatorListenerAdapter() { @@ -224,18 +225,18 @@ public class FolderAnimationManager { // We set the interpolator on all current child animators here, because the preview item // animators may use a different interpolator. for (Animator animator : a.getChildAnimations()) { - animator.setInterpolator(mIsOpening ? mOpeningInterpolator : mClosingInterpolator); + animator.setInterpolator(mFolderInterpolator); } - addPreviewItemAnimatorsToSet(a, folderScale, nudgeOffsetX); + addPreviewItemAnimators(a, initialScale / scaleRelativeToDragLayer, previewItemOffsetX); return a; } /** * Animate the items that are displayed in the preview. */ - private void addPreviewItemAnimatorsToSet(AnimatorSet animatorSet, final float folderScale, - int nudgeOffsetX) { + private void addPreviewItemAnimators(AnimatorSet animatorSet, final float folderScale, + int previewItemOffsetX) { FolderIcon.PreviewLayoutRule rule = mFolderIcon.getLayoutRule(); final List itemsInPreview = mFolderIcon.getItemsToDisplay(); final int numItemsInPreview = itemsInPreview.size(); @@ -269,7 +270,7 @@ public class FolderAnimationManager { int iconOffsetX = (int) ((btvLp.width - btv.getIconSize()) * iconScale) / 2; final int previewPosX = - (int) ((mTmpParams.transX - iconOffsetX + nudgeOffsetX) / folderScale); + (int) ((mTmpParams.transX - iconOffsetX + previewItemOffsetX) / folderScale); final int previewPosY = (int) (mTmpParams.transY / folderScale); final float xDistance = previewPosX - btvLp.x; @@ -335,9 +336,9 @@ public class FolderAnimationManager { // With larger folders, we want the preview items to reach their final positions faster // (when opening) and later (when closing) so that they appear aligned with the rest of // the folder items when they are both visible. - return mIsOpening ? mPreviewItemOpeningInterpolator : mPreviewItemClosingInterpolator; + return mLargeFolderPreviewItemInterpolator; } - return mIsOpening ? mOpeningInterpolator : mClosingInterpolator; + return mFolderInterpolator; } private Animator getAnimator(View view, Property property, float v1, float v2) { From 1877176ddbe7c7cea5def9d97ef57d949864e2b2 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 30 Mar 2017 18:27:10 -0700 Subject: [PATCH 040/446] Import translations. DO NOT MERGE Change-Id: I7567ca77e4f54c06f40362e85a398c131e51f84b Auto-generated-cl: translation import --- res/values-af/strings.xml | 6 ++++-- res/values-am/strings.xml | 6 ++++-- res/values-ar/strings.xml | 6 ++++-- res/values-az-rAZ/strings.xml | 6 ++++-- res/values-b+sr+Latn/strings.xml | 6 ++++-- res/values-be-rBY/strings.xml | 6 ++++-- res/values-bg/strings.xml | 6 ++++-- res/values-bn-rBD/strings.xml | 6 ++++-- res/values-bs-rBA/strings.xml | 6 ++++-- res/values-ca/strings.xml | 6 ++++-- res/values-cs/strings.xml | 6 ++++-- res/values-da/strings.xml | 6 ++++-- res/values-de/strings.xml | 6 ++++-- res/values-el/strings.xml | 6 ++++-- res/values-en-rAU/strings.xml | 6 ++++-- res/values-en-rGB/strings.xml | 6 ++++-- res/values-en-rIN/strings.xml | 6 ++++-- res/values-es-rUS/strings.xml | 6 ++++-- res/values-es/strings.xml | 6 ++++-- res/values-et-rEE/strings.xml | 6 ++++-- res/values-eu-rES/strings.xml | 6 ++++-- res/values-fa/strings.xml | 6 ++++-- res/values-fi/strings.xml | 6 ++++-- res/values-fr-rCA/strings.xml | 6 ++++-- res/values-fr/strings.xml | 6 ++++-- res/values-gl-rES/strings.xml | 6 ++++-- res/values-gu-rIN/strings.xml | 6 ++++-- res/values-hi/strings.xml | 6 ++++-- res/values-hr/strings.xml | 6 ++++-- res/values-hu/strings.xml | 6 ++++-- res/values-hy-rAM/strings.xml | 6 ++++-- res/values-in/strings.xml | 6 ++++-- res/values-is-rIS/strings.xml | 6 ++++-- res/values-it/strings.xml | 6 ++++-- res/values-iw/strings.xml | 6 ++++-- res/values-ja/strings.xml | 6 ++++-- res/values-ka-rGE/strings.xml | 6 ++++-- res/values-kk-rKZ/strings.xml | 6 ++++-- res/values-km-rKH/strings.xml | 6 ++++-- res/values-kn-rIN/strings.xml | 6 ++++-- res/values-ko/strings.xml | 6 ++++-- res/values-ky-rKG/strings.xml | 6 ++++-- res/values-lo-rLA/strings.xml | 6 ++++-- res/values-lt/strings.xml | 6 ++++-- res/values-lv/strings.xml | 6 ++++-- res/values-mk-rMK/strings.xml | 6 ++++-- res/values-ml-rIN/strings.xml | 6 ++++-- res/values-mn-rMN/strings.xml | 6 ++++-- res/values-mr-rIN/strings.xml | 6 ++++-- res/values-ms-rMY/strings.xml | 6 ++++-- res/values-my-rMM/strings.xml | 6 ++++-- res/values-nb/strings.xml | 6 ++++-- res/values-ne-rNP/strings.xml | 6 ++++-- res/values-nl/strings.xml | 6 ++++-- res/values-pa-rIN/strings.xml | 6 ++++-- res/values-pl/strings.xml | 6 ++++-- res/values-pt-rPT/strings.xml | 6 ++++-- res/values-pt/strings.xml | 6 ++++-- res/values-ro/strings.xml | 6 ++++-- res/values-ru/strings.xml | 6 ++++-- res/values-si-rLK/strings.xml | 6 ++++-- res/values-sk/strings.xml | 6 ++++-- res/values-sl/strings.xml | 6 ++++-- res/values-sq-rAL/strings.xml | 6 ++++-- res/values-sr/strings.xml | 6 ++++-- res/values-sv/strings.xml | 6 ++++-- res/values-sw/strings.xml | 6 ++++-- res/values-ta-rIN/strings.xml | 6 ++++-- res/values-te-rIN/strings.xml | 6 ++++-- res/values-th/strings.xml | 6 ++++-- res/values-tl/strings.xml | 6 ++++-- res/values-tr/strings.xml | 6 ++++-- res/values-uk/strings.xml | 6 ++++-- res/values-ur-rPK/strings.xml | 6 ++++-- res/values-uz-rUZ/strings.xml | 6 ++++-- res/values-vi/strings.xml | 6 ++++-- res/values-zh-rCN/strings.xml | 6 ++++-- res/values-zh-rHK/strings.xml | 6 ++++-- res/values-zh-rTW/strings.xml | 6 ++++-- res/values-zu/strings.xml | 6 ++++-- 80 files changed, 320 insertions(+), 160 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 7d4a6978aa..5d4b76761c 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -33,8 +33,10 @@ "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" "%1$d breed by %2$d hoog" - "Raak en hou om op tuisskerm te plaas" - "Plaas outomaties" + + + + "Deursoek programme" "Laai tans programme …" "Geen programme gevind wat met \"%1$s\" ooreenstem nie" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 9f07b44f50..1c21247adc 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -33,8 +33,10 @@ "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" "%1$d ስፋት በ%2$d ከፍታ" - "በመነሻ ማያ ገጽ ላይ ለማስቀመጥ ነካ ያድርጉ እና ይያዙ" - "በራስ-ሰር ያስቀምጡ" + + + + "መተግበሪያዎችን ይፈልጉ" "መተግበሪያዎችን በመጫን ላይ..." "ከ«%1$s» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index fcadbe18d3..d4563cddaf 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -33,8 +33,10 @@ "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" "‏العرض %1$d الطول %2$d" - "المس الرمز مع الاستمرار لوضعه على الشاشة الرئيسية" - "إضافة الرمز إلى الشاشة الرئيسية تلقائيًا" + + + + "البحث في التطبيقات" "جارٍ تحميل التطبيقات…" "لم يتم العثور على أية تطبيقات تتطابق مع \"%1$s\"" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index e37cdf9b21..f1e4c54ee7 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -33,8 +33,10 @@ "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" "%2$d hündürlük %1$d enində" - "Əsas ekranda yerləşdirmək üçün toxunub saxlayın" - "Avtomatik yerləşdirin" + + + + "Tətbiq Axtarın" "Tətbiqlər endirilir..." "\"%1$s\" sorğusuna uyğun Tətbiqlər tapılmadı" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 0beee9790d..ba7d1ae91e 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -33,8 +33,10 @@ "Dvaput dodirnite i zadržite da biste izabrali vidžet ili koristite prilagođene radnje." "%1$d×%2$d" "širina od %1$d i visina od %2$d" - "Dodirnite i zadržite da biste postavili na početni ekran" - "Postavi automatski" + + + + "Pretražite aplikacije" "Aplikacije se učitavaju..." "Nije pronađena nijedna aplikacija za „%1$s“" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index db064702b0..e283cc4567 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -33,8 +33,10 @@ "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць віджэт або выкарыстоўваць карыстальніцкія дзеянні." "%1$d × %2$d" "Шырына: %1$d, вышыня: %2$d" - "Дакраніцеся і ўтрымлівайце, каб размясціць на галоўным экране" - "Размясціць аўтаматычна" + + + + "Пошук у Праграмах" "Ідзе загрузка праграм…" "Праграм, якія адпавядаюць запыту \"%1$s\", не знойдзена" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 0f1b24a6e3..6cfef5c71f 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -33,8 +33,10 @@ "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" "Ширина %1$d и височина %2$d" - "Докоснете и задръжте, за да поставите на началния екран" - "Автоматично поставяне" + + + + "Търсене в приложенията" "Приложенията се зареждат…" "Няма намерени приложения, съответстващи на „%1$s“" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index eaad010c2c..4d4fd5bec5 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -33,8 +33,10 @@ "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" "%2$d উচ্চতা অনুযায়ী %1$d প্রস্থ" - "হোম স্ক্রিনে রাখতে টাচ করে ধরে থাকুন" - "স্বয়ংক্রিয়ভাবে রাখুন" + + + + "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন" "অ্যাপ্লিকেশানগুলি লোড হচ্ছে..." "\"%1$s\" এর সাথে মেলে এমন কোনো অ্যাপ্লিকেশান পাওয়া যায়নি" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index db207dc9a6..0dd20261e6 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -33,8 +33,10 @@ "Dvaput dodirnite & i držite da biste uzeli vidžet ili koristite prilagođene radnje." "%1$d × %2$d" "Širina %1$d, visina %2$d" - "Dodirnite i držite da postavite na početni ekran" - "Postavi automatski" + + + + "Pretraži aplikacije" "Aplikacije se učitavaju…" "Nije pronađena nijedna aplikacija koja odgovara upitu \"%1$s\"" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index dfbfe8cf65..c408995a31 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -33,8 +33,10 @@ "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" "%1$d d\'amplada per %2$d d\'alçada" - "Toca i mantén premut l\'element per col·locar-lo a la pantalla d\'inici" - "Col·loca automàticament" + + + + "Cerca a les aplicacions" "S\'estan carregant les aplicacions..." "No s\'ha trobat cap aplicació que coincideixi amb %1$s" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 6f19c0e596..6e7ae2d473 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -33,8 +33,10 @@ "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" "šířka %1$d, výška %2$d" - "Chcete-li položku umístit na plochu, klepněte na ni a podržte ji" - "Umístit automaticky" + + + + "Hledat aplikace" "Načítání aplikací…" "Dotazu „%1$s“ neodpovídají žádné aplikace" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 2186fb4427..7e5eb51532 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -33,8 +33,10 @@ "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" "%1$d i bredden og %2$d i højden" - "Tryk, og hold fingeren nede for at placere på startskærmen" - "Placer automatisk" + + + + "Søg i Apps" "Indlæser apps…" "Der blev ikke fundet nogen apps, som matcher \"%1$s\"" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index f97f0280ff..dd288687ff 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -33,8 +33,10 @@ "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" "%1$d breit und %2$d hoch" - "Zum Hinzufügen zum Startbildschirm gedrückt halten" - "Automatisch hinzufügen" + + + + "In Apps suchen" "Apps werden geladen..." "Keine Apps für \"%1$s\" gefunden" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index e045d2b5ee..8296ba4894 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -33,8 +33,10 @@ "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" "Πλάτος %1$d επί ύψος %2$d" - "Αγγίξτε παρατεταμένα για να το τοποθετήσετε στην αρχική οθόνη" - "Αυτόματη τοποθέτηση" + + + + "Αναζήτηση εφαρμογών" "Φόρτωση εφαρμογών…" "Δεν βρέθηκαν εφαρμογές για το ερώτημα \"%1$s\"" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index d6c837bcfd..c44aa9d340 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -33,8 +33,10 @@ "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "%1$d wide by %2$d high" - "Touch & hold to place on home screen" - "Place automatically" + + + + "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index d6c837bcfd..c44aa9d340 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -33,8 +33,10 @@ "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "%1$d wide by %2$d high" - "Touch & hold to place on home screen" - "Place automatically" + + + + "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index d6c837bcfd..c44aa9d340 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -33,8 +33,10 @@ "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "%1$d wide by %2$d high" - "Touch & hold to place on home screen" - "Place automatically" + + + + "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 1a7b5615d0..466e0b30ae 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -33,8 +33,10 @@ "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" "%1$d de ancho por %2$d de alto" - "Mantén presionado para ubicarlo en la pantalla principal" - "Ubicar de manera automática" + + + + "Buscar aplicaciones" "Cargando aplicaciones…" "No hay aplicaciones que coincidan con %1$s." diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 9b80c56633..4fd0ed9cdb 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -33,8 +33,10 @@ "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" "%1$d de ancho por %2$d de alto" - "Mantén pulsado el elemento para añadirlo a la pantalla de inicio" - "Añadir automáticamente" + + + + "Busca aplicaciones" "Cargando aplicaciones…" "No se han encontrado aplicaciones que contengan \"%1$s\"" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 07834dc623..91e7b3b88d 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -33,8 +33,10 @@ "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" "%1$d lai ja %2$d kõrge" - "Puudutage pikalt avaekraanile paigutamiseks" - "Paiguta automaatselt" + + + + "Otsige rakendustest" "Rakenduste laadimine ..." "Päringule „%1$s” ei vastanud ükski rakendus" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 17ce6d01e9..9c70d62e28 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -33,8 +33,10 @@ "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" "%1$d zabal eta %2$d luze" - "Eduki sakatuta jarri nahi duzun tokia hasierako pantailan" - "Jarri automatikoki" + + + + "Bilatu aplikazioetan" "Aplikazioak kargatzen…" "Ez da aurkitu \"%1$s\" bilaketarekin bat datorren aplikaziorik" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 9bbecca291..358b680e2e 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -33,8 +33,10 @@ "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" "‏%1$d عرض در %2$d طول" - "برای قرار دادن در صفحه اصلی لمس کنید و نگه‌دارید" - "افزودن خودکار" + + + + "جستجوی برنامه‌ها" "در حال بارگیری برنامه‌ها..." "هیچ برنامه‌ای مطابق با «%1$s» پیدا نشد" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 6595f86f62..c54d546510 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -33,8 +33,10 @@ "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" "Leveys: %1$d, korkeus: %2$d" - "Sijoita aloitusnäytölle koskettamalla pitkään." - "Sijoita automaattisesti" + + + + "Sovellushaku" "Ladataan sovelluksia…" "”%1$s” ei palauttanut sovelluksia." diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 5d9f041a1a..b595e23873 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -33,8 +33,10 @@ "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" "%1$d de largeur sur %2$d de hauteur" - "Maintenez le doigt sur l\'élément pour le placer sur l\'écran d\'accueil" - "Placer automatiquement" + + + + "Rechercher des applications" "Chargement des applications en cours..." "Aucune application trouvée correspondant à « %1$s »" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 20902622be..d6c9a04b15 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -33,8 +33,10 @@ "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" "%1$d de largeur et %2$d de hauteur" - "Appuyez de manière prolongée pour placer l\'élément sur l\'écran d\'accueil" - "Placer automatiquement" + + + + "Rechercher dans les applications" "Chargement des applications en cours…" "Aucune application ne correspond à la requête \"%1$s\"." diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index fbadfe0669..a05fc8585f 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -33,8 +33,10 @@ "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" "%1$d de largo por %2$d de alto" - "Mantén premido o elemento para colocalo na pantalla de inicio" - "Colocar automaticamente" + + + + "Aplicacións de busca" "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 557896f7f3..1932e40bc9 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -33,8 +33,10 @@ "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" "%1$d પહોળાઈ X %2$d ઊંચાઈ" - "હોમ સ્ક્રીન પર મૂકવા માટે ટચ કરો અને પકડો" - "આપમેળે મૂકો" + + + + "શોધ ઍપ્લિકેશનો" "ઍપ્લિકેશનો લોડ કરી રહ્યું છે…" "\"%1$s\" થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index ad33acadde..eb29709206 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -33,8 +33,10 @@ "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" "%1$d चौड़ाई गुणा %2$d ऊंचाई" - "होम स्क्रीन पर रखने के लिए स्पर्श करके रखें" - "अपने आप रखें" + + + + "ऐप्‍स खोजें" "ऐप्स लोड हो रहे हैं..." "\"%1$s\" से मिलान करने वाला कोई ऐप नहीं मिला" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 0e01e723a6..8a62f4eb08 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -33,8 +33,10 @@ "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" "%1$d širine i %2$d visine" - "Dodirnite i zadržite stavku da biste je postavili na početni zaslon" - "Postavi automatski" + + + + "Pretraži aplikacije" "Učitavanje aplikacija…" "Nema aplikacija podudarnih s upitom \"%1$s\"" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index bcbe52f8fa..b44d231746 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -33,8 +33,10 @@ "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" "%1$d széles és %2$d magas" - "Tartsa lenyomva, hogy elhelyezhesse a kezdőképernyőn" - "Automatikus elhelyezés" + + + + "Alkalmazások keresése" "Alkalmazások betöltése…" "Egy alkalmazás sem található a(z) „%1$s” lekérdezésre." diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index f3a034fd16..96b4ad002c 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -33,8 +33,10 @@ "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" "Լայնությունը՝ %1$d, բարձրությունը՝ %2$d" - "Հպեք և պահեք՝ գլխավոր էկրանին ավելացնելու համար" - "Ավելացնել ավտոմատ կերպով" + + + + "Հավելվածների որոնում" "Հավելվածների բեռնում…" %1$s» հարցմանը համապատասխանող հավելվածներ չեն գտնվել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index c56fc2b0af..f4f27885bb 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -33,8 +33,10 @@ "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" "lebar %1$d x tinggi %2$d" - "Sentuh & tahan untuk ditempatkan di layar utama" - "Tempatkan otomatis" + + + + "Telusuri Apps" "Memuat Aplikasi..." "Tidak ditemukan Aplikasi yang cocok dengan \"%1$s\"" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 249704eadb..b6e1e78dc6 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -33,8 +33,10 @@ "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" "%1$d á breidd og %2$d á hæð" - "Haltu inni til að setja á heimaskjáinn" - "Staðsetja sjálfkrafa" + + + + "Leita í forritum" "Hleður forrit…" "Ekki fundust forrit sem samsvara „%1$s“" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 18e28c9cc1..ad8556fb5b 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -33,8 +33,10 @@ "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" "%1$d di larghezza per %2$d di altezza" - "Tieni premuto per posizionare l\'elemento nella schermata Home" - "Posiziona automaticamente" + + + + "Cerca app" "Caricamento di app…" "Nessuna app trovata corrispondente a \"%1$s\"" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 059f849083..63107386b3 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -33,8 +33,10 @@ "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" "‏רוחב %1$d על גובה %2$d" - "גע והחזק כדי למקם במסך דף הבית" - "מקם אוטומטית" + + + + "חפש אפליקציות" "טוען אפליקציות…" "לא נמצאו אפליקציות התואמות ל-\"%1$s\"" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index f45af77b03..6ad4345ef8 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -33,8 +33,10 @@ "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" "幅 %1$d、高さ %2$d" - "押し続けると、ホーム画面に追加できます" - "自動的に追加" + + + + "アプリを検索" "アプリを読み込んでいます…" "「%1$s」に一致するアプリは見つかりませんでした" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 21f440b913..4696ca03c1 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -33,8 +33,10 @@ "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" "სიგრძე: %1$d, სიგანე: %2$d" - "ხანგრძლივად შეეხეთ მთავარ ეკრანზე განსათავსებლად" - "ავტომატურად განთავსება" + + + + "აპების ძიება" "აპები იტვირთება..." "„%1$s“-ის თანხვედრი აპები არ მოიძებნა" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 7fc61b98b7..5d7a57c8b2 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -33,8 +33,10 @@ "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" "Ені: %1$d, биіктігі: %2$d" - "Басып тұрып, негізгі экранда қойылатын жерге апарыңыз" - "Автоматты қою" + + + + "Қолданбаларды іздеу" "Қолданбалар жүктелуде…" %1$s» сұрауына сәйкес келетін қолданбалар жоқ" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 8b271e5a8c..926f3eda00 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -33,8 +33,10 @@ "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" "ទទឺង %1$d គុណនឹងកម្ពស់ %2$d" - "សង្កត់​ឲ្យជាប់​ដើម្បី​ដាក់វា​នៅលើ​អេក្រង់​ដើម" - "ដាក់​ដោយ​ស្វ័យប្រវត្តិ" + + + + "ស្វែងរកកម្មវិធី" "កំពុងដំណើរការកម្មវិធី..." "គ្មានកម្មវិធីដែលត្រូវជាមួយ \"%1$s\" ទេ" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 209bdab190..16e039de4b 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -33,8 +33,10 @@ "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" "%1$d ಅಗಲ ಮತ್ತು %2$d ಎತ್ತರ" - "ಮುಖಪುಟ ಪರದೆಯ ಮೇಲೆ ಇಡಲು ಟಚ್ ಮಾಡಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ" - "ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಇಡಿ" + + + + "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." "\"%1$s\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 08b73f80d5..bb4f0c0e61 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -33,8 +33,10 @@ "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" "너비 %1$d, 높이 %2$d" - "길게 터치하여 홈 화면에 추가" - "자동으로 추가" + + + + "앱 검색" "앱 로드 중..." "\'%1$s\'와(과) 일치하는 앱이 없습니다." diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index e5465aa1df..aa77658d29 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -33,8 +33,10 @@ "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" "Туурасы: %1$d, бийиктиги: %2$d" - "Басып туруп, башкы экранга сүйрөп барып, таштаңыз" - "Автоматтык түрдө жайгаштыруу" + + + + "Колдонмолорду издөө" "Колдонмолор жүктөлүүдө…" "\"%1$s\" дал келген колдонмолор табылган жок" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 7783c7aa8b..cd9ac5a25d 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -33,8 +33,10 @@ "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" "ກວ້າງ %1$d ຄູນສູງ %2$d" - "ແຕະຄ້າງໄວ້ເພື່ອວາງໄວ້ໜ້າຫຼັກ" - "ວາງອັດຕະໂນມັດ" + + + + "ຊອກຫາແອັບ" "​ກຳ​ລັງ​ໂຫລດ​ແອັບ..." "ບໍ່​ພົບ​ແອັບ​ໃດ​ທີ່​ກົງ​ກັນ \"%1$s\"" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index b44549ae05..e3b7ae69be 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -33,8 +33,10 @@ "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" "%1$d plotis ir %2$d aukštis" - "Palieskite ir palaikykite, kad padėtumėte pagrindiniame ekrane" - "Padėti automatiškai" + + + + "Ieškoti programų" "Įkeliamos programos..." "Nerasta jokių užklausą „%1$s“ atitinkančių programų" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index a623294f48..974f2547b5 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -33,8 +33,10 @@ "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" "%1$d plats un %2$d augsts" - "Sākuma ekrānā pieskarieties kādai vietai un turiet" - "Novietot automātiski" + + + + "Meklēt lietotnes" "Notiek lietotņu ielāde…" "Vaicājumam “%1$s” neatbilda neviena lietotne." diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index e6ca38f8e3..dd4b3ae0ab 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -33,8 +33,10 @@ "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" "%1$d широк на %2$d висок" - "Допрете и задржете за да поставите на почетниот екран" - "Постави автоматски" + + + + "Пребарување апликации" "Се вчитуваат апликации…" "Не се најдени апликации што одговараат на „%1$s“" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 8ec29d33da..7a13d1db78 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -33,8 +33,10 @@ "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" "%1$d വീതിയും %2$d ഉയരവും" - "ഹോം സ്‌ക്രീനിൽ ‌സ്ഥാപിക്കാൻ സ്‌പർശിച്ച് ‌പിടിക്കുക" - "സ്വയമേവ ‌സ്ഥാപിക്കുക" + + + + "ആപ്പുകളെ തിരയുക" "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index c8dfdd58c1..d631f7b029 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -33,8 +33,10 @@ "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" "%1$d өргөн %2$d өндөр" - "Нүүр дэлгэцэд байршуулахын тулд дараад, хүлээнэ үү" - "Автоматаар байршуулах" + + + + "Апп хайх" "Аппликейшныг ачаалж байна..." "\"%1$s\"-д нийцэх апп олдсонгүй" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 4056b033e1..c80a41095d 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -33,8 +33,10 @@ "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" "%1$d रूंद बाय %2$d उंच" - "मुख्यपृष्ठावर ठेवण्यासाठी स्पर्श करा आणि धरून ठेवा" - "स्वयंचलितपणे ठेवा" + + + + "अॅप्स शोधा" "अॅप्स लोड करीत आहे..." "\"%1$s\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 9ec1813314..cc4fc5882b 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -33,8 +33,10 @@ "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" "Lebar %1$d kali tinggi %2$d" - "Sentuh & tahan untuk meletakkan pada skrin utama" - "Letakkan secara automatik" + + + + "Cari Apl" "Memuatkan Apl…" "Tiada Apl yang ditemui sepadan dengan \"%1$s\"" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 5da5f6552e..1c11314ffe 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -33,8 +33,10 @@ "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" "အလျား %1$d နှင့် အမြင့် %2$d" - "ပင်မစာမျက်နှာတွင် ထားရန် ထိပြီး ဖိထားပါ" - "အလိုအလျောက် ထားရန်" + + + + "ရှာဖွေမှု အက်ပ်များ" "အက်ပ်များ ရယူနေစဉ်..." "\"%1$s\" နှင့်ကိုက်ညီသည့် အပ်ဖ်များမတွေ့ပါ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 694c6fc952..9536050b0b 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -33,8 +33,10 @@ "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" "%1$d bredde x %2$d høyde" - "Trykk og hold for å plassere på startskjermen" - "Plassér automatisk" + + + + "Søk i apper" "Laster inn apper …" "Fant ingen apper som samsvarer med «%1$s»" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 01ec5bd2b5..ab0ce2466d 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -33,8 +33,10 @@ "विजेटलाई छान्न वा आफू अनुकूल कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" "%1$d चौडाइ गुणा %2$d उचाइ" - "गृह स्क्रिनमा राख्न छुनुहोस् र थिची राख्नुहोस्‌" - "स्वतः राख्नुहोस्" + + + + "अनुप्रयोगहरू खोज्नुहोस्" "अनुप्रयोगहरू लोड गरिँदै..." "\"%1$s\" सँग मिल्दो कुनै अनुप्रयोगहरू फेला परेनन्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index a477893b7c..be1dfe0d5f 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -33,8 +33,10 @@ "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" "%1$d breed en %2$d hoog" - "Tik op een item en houd dit vast om het op het startscherm te plaatsen" - "Automatisch plaatsen" + + + + "Apps zoeken" "Apps laden…" "Er zijn geen apps gevonden die overeenkomen met \'%1$s\'" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 71d9942a59..df5b4077c3 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -33,8 +33,10 @@ "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" "%1$d ਚੌੜਾਈ ਅਤੇ %2$d ਲੰਬਾਈ" - "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਰੱਖਣ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ" - "ਸਵੈਚਲਿਤ ਤਰੀਕੇ ਨਾਲ ਰੱਖੋ" + + + + "ਐਪਸ ਖੋਜੋ" "ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..." "\"%1$s\" ਨਾਲ ਮਿਲਦੀਆਂ ਕੋਈ ਵੀ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 4225d37786..fcae3d263c 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -33,8 +33,10 @@ "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" "Szerokość %1$d, wysokość %2$d" - "Kliknij i przytrzymaj, by umieścić na ekranie głównym" - "Umieść automatycznie" + + + + "Szukaj w aplikacjach" "Wczytuję aplikacje…" "Nie znaleziono aplikacji pasujących do zapytania „%1$s”" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 4754bb82d2..b451db4d3d 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -33,8 +33,10 @@ "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" "%1$d de largura por %2$d de altura" - "Toque sem soltar para colocar no ecrã principal" - "Colocar automaticamente" + + + + "Pesquisar aplicações" "A carregar aplicações..." "Não foram encontradas aplic. que correspondam a \"%1$s\"" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 2f15b4044c..b38e1b2d4e 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -33,8 +33,10 @@ "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" "%1$d de largura por %2$d de altura" - "Toque e segure-o para posicionar na tela inicial" - "Posicionar automaticamente" + + + + "Pesquisar apps" "Carregando apps…" "Nenhum app encontrado que corresponda a \"%1$s\"" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 8bb73f2a76..b922bce66c 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -33,8 +33,10 @@ "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" "%1$d lățime și %2$d înălțime" - "Atingeți lung pentru a plasa pe ecranul de pornire" - "Plasare automată" + + + + "Căutați aplicații" "Se încarcă aplicațiile..." "Nu s-a găsit nicio aplicație pentru „%1$s”" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index bfecf591a3..c8d9109645 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -33,8 +33,10 @@ "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" "Ширина %1$d, высота %2$d" - "Нажмите и удерживайте, чтобы добавить на главный экран" - "Добавить на главный экран автоматически" + + + + "Поиск приложений" "Загрузка…" "По запросу \"%1$s\" ничего не найдено" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index a5d34caf96..ba11ad5ed1 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -33,8 +33,10 @@ "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" "පළල %1$d උස %2$d" - "මුල් පිටු තිරයෙහි තැබීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න" - "ස්වයංක්‍රියව තබන්න" + + + + "යෙදුම් සෙවීම" "යෙදුම් පූරණය වෙමින්…" "\"%1$s\" සමග ගැළපෙන යෙදුම් හමු නොවිණි" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 239bf2915f..0789a418a8 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -33,8 +33,10 @@ "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" "šírka %1$d, výška %2$d" - "Klepnutím a podržaním umiestníte na plochu" - "Umiestniť automaticky" + + + + "Hľadať aplikácie" "Načítavajú sa aplikácie..." "Nenašli sa žiadne aplikácie zodpovedajúce dopytu %1$s" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index b245c54e42..405047ca49 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -33,8 +33,10 @@ "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" "Širina %1$d, višina %2$d" - "Dotaknite se elementa in ga pridržite, da ga postavite na začetni zaslon" - "Postavi samodejno" + + + + "Iskanje po aplikacijah" "Nalaganje aplikacij …" "Ni aplikacij, ki bi ustrezale poizvedbi »%1$s«" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 4adac7f351..de459e9b21 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -33,8 +33,10 @@ "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" "%1$d i gjerë me %2$d i lartë" - "Prek dhe mbaj të shtypur për të vendosur në ekranin bazë" - "Vendos automatikisht" + + + + "Kërko për aplikacione" "Po ngarkon aplikacionet..." "Nuk u gjet asnjë aplikacion që përputhet me \"%1$s\"" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index f6a28da81b..8b3f9c1dee 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -33,8 +33,10 @@ "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" "ширина од %1$d и висина од %2$d" - "Додирните и задржите да бисте поставили на почетни екран" - "Постави аутоматски" + + + + "Претражите апликације" "Апликације се учитавају..." "Није пронађена ниједна апликација за „%1$s“" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index c740167366..c2368ebd3d 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -33,8 +33,10 @@ "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" "%1$d bred gånger %2$d hög" - "Placera på startskärmen genom att trycka länge" - "Placera automatiskt" + + + + "Sök efter appar" "Läser in appar …" "Det gick inte att hitta några appar som matchar %1$s" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 0c677ec43c..2494f238eb 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -33,8 +33,10 @@ "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" "Upana wa %1$d na kimo cha %2$d" - "Gusa na ushikilie ili uweke kwenye skrini ya kwanza" - "Weka kiotomatiki" + + + + "Tafuta Programu" "Inapakia Programu..." "Haikupata programu zinazolingana na \"%1$s\"" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 15e0c200ec..d21f02dc26 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -33,8 +33,10 @@ "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" "%1$d அகலத்திற்கு %2$d உயரம்" - "முகப்புத் திரையில் சேர்க்க, அதைத் தொட்டுப் பிடித்திருக்கவும்" - "தானாகவே சேர்" + + + + "பயன்பாடுகளில் தேடுக" "பயன்பாடுகளை ஏற்றுகிறது..." "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 9c1c3e184c..54ace89e91 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -33,8 +33,10 @@ "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" "%1$d వెడల్పు X %2$d ఎత్తు" - "హోమ్ స్క్రీన్‌లో ఉంచడానికి నొక్కి & పట్టుకోండి" - "స్వయంచాలకంగా ఉంచండి" + + + + "అనువర్తనాలను శోధించండి" "అనువర్తనాలను లోడ్ చేస్తోంది…" "\"%1$s\"కి సరిపోలే అనువర్తనాలేవీ కనుగొనబడలేదు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 39c60aa0e7..6276361378 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -33,8 +33,10 @@ "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" "กว้าง %1$d x สูง %2$d" - "แตะค้างไว้เพื่อวางบนหน้าจอหลัก" - "วางโดยอัตโนมัติ" + + + + "ค้นหาแอป" "กำลังโหลดแอป…" "ไม่พบแอปที่ตรงกับ \"%1$s\"" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 1838865390..0b3cf50ee2 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -33,8 +33,10 @@ "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" "%1$d ang lapad at %2$d ang taas" - "Pindutin nang matagal upang ilagay sa home screen" - "Awtomatikong ilagay" + + + + "Mga App sa Paghahanap" "Nilo-load ang Mga App…" "Walang nakitang Mga App na tumutugma sa \"%1$s\"" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 61360820d4..66f9be9663 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -33,8 +33,10 @@ "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" "genişlik: %1$d, yükseklik: %2$d" - "Ana ekrana yerleştirmek için dokunun ve basılı tutun" - "Otomatik olarak yerleştir" + + + + "Uygulamalarda Ara" "Uygulamalar Yükleniyor…" "\"%1$s\" ile eşleşen uygulama bulunamadı" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index bc36a50609..381fdb4526 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -33,8 +33,10 @@ "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" "Ширина – %1$d, висота – %2$d" - "Натисніть і утримуйте, щоб додати на головний екран" - "Додати автоматично" + + + + "Пошук додатків" "Завантаження додатків…" "Немає додатків для запиту \"%1$s\"" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 0bd45c8811..b61747b6d7 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -33,8 +33,10 @@ "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" "‏%1$d چوڑا اور ‎%2$d اونچا" - "ہوم اسکرین پر رکھنے کیلئے ٹچ کریں اور دبائے رکھیں" - "خودکار طور پر رکھیں" + + + + "ایپس تلاش کریں" "ایپس لوڈ ہو رہی ہیں…" "\"%1$s\" سے مماثل کوئی ایپس نہیں ملیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index fd5d013cff..afe26fffb0 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -33,8 +33,10 @@ "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" "Eni %1$d, bo‘yi %2$d" - "Bosh ekranga chiqarish uchun bosib turing" - "Avtomatik joylashtirish" + + + + "Ilovalar ichidan qidirish" "Ilovalar yuklanmoqda…" "“%1$s” so‘rovi bo‘yicha hech narsa topilmadi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 9b9d04c088..0df7a4b28a 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -33,8 +33,10 @@ "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" "Rộng %1$d x cao %2$d" - "Chạm và giữ để đặt lên màn hình chính" - "Tự động đặt" + + + + "Tìm kiếm ứng dụng" "Đang tải ứng dụng..." "Không tìm thấy ứng dụng nào phù hợp với \"%1$s\"" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 545bf4a6b6..e4f58fee6e 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -33,8 +33,10 @@ "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" "宽 %1$d,高 %2$d" - "触摸并按住即可放在主屏幕上" - "自动放置" + + + + "搜索应用" "正在加载应用…" "未找到与“%1$s”相符的应用" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 7afb3aed5f..44c7f184e8 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -33,8 +33,10 @@ "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" "%1$d 闊,%2$d 高" - "輕觸並按住即可放在主畫面上" - "自動放置" + + + + "搜尋應用程式" "正在載入應用程式…" "無法找到與「%1$s」相符的應用程式" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 4425c6618c..94c919fc5d 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -33,8 +33,10 @@ "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" "寬度為 %1$d,高度為 %2$d" - "按住即可放在主螢幕上" - "自動放置" + + + + "搜尋應用程式" "正在載入應用程式…" "找不到符合「%1$s」的應用程式" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 0be9ebc197..e6facfdec9 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -33,8 +33,10 @@ "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" "%1$d ububanzi ngokungu-%2$d ukuya phezulu" - "Thinta uphinde ubambe ukuze ubeke kusikrini sasekhaya" - "Beka ngokuzenzakalela" + + + + "Sesha Izinhlelo Zokusebenza" "Ilayisha izinhlelo zokusebenza..." "Azikho izinhlelo zokusebenza ezitholakele ezifana ne-\"%1$s\"" From 67a25e6ff1d7a3cdfbd73a46b792b3eb7abb9d0e Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 30 Mar 2017 18:44:33 -0700 Subject: [PATCH 041/446] Fixing broken build Change-Id: I9ec4dea773d1ca53522a216028a99fc3ed147f54 --- src/com/android/launcher3/compat/LauncherAppsCompat.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index 4580b81080..b03a302ee9 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -32,7 +32,7 @@ import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.ShortcutInfoCompat; -import com.android.launcher3.util.LooperExecuter; +import com.android.launcher3.util.LooperExecutor; import java.util.List; @@ -113,7 +113,7 @@ public abstract class LauncherAppsCompat { } } else { // Block the worker thread until the accept() is called. - new LooperExecuter(LauncherModel.getWorkerLooper()).execute(new Runnable() { + new LooperExecutor(LauncherModel.getWorkerLooper()).execute(new Runnable() { @Override public void run() { try { From 0d834f2a0a4bf40b11d2e6ba83a8cb63c2cc6f0a Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 3 Apr 2017 00:26:45 -0700 Subject: [PATCH 042/446] IconNormalizer cleanup > Remove unnecessary member variable Change-Id: Id497ba86f3a4b968fa467df3791e92ae85495495 --- src/com/android/launcher3/graphics/IconNormalizer.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index f34933e893..13f322e8bc 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -88,7 +88,6 @@ public class IconNormalizer { private File mDir; private int mFileId; private Random mRandom; - private float mDensity; private IconNormalizer(Context context) { // Use twice the icon size as maximum size to avoid scaling down twice. @@ -100,7 +99,7 @@ public class IconNormalizer { mLeftBorder = new float[mMaxSize]; mRightBorder = new float[mMaxSize]; mBounds = new Rect(); - mDensity = context.getResources().getDisplayMetrics().density; + // Needed for isShape() method mBitmapARGB = Bitmap.createBitmap(mMaxSize, mMaxSize, Bitmap.Config.ARGB_8888); mCanvasARGB = new Canvas(mBitmapARGB); @@ -114,7 +113,7 @@ public class IconNormalizer { mPaintMaskShape.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR)); mPaintMaskShapeOutline = new Paint(); - mPaintMaskShapeOutline.setStrokeWidth(2 * mDensity); + mPaintMaskShapeOutline.setStrokeWidth(2 * context.getResources().getDisplayMetrics().density); mPaintMaskShapeOutline.setStyle(Paint.Style.STROKE); mPaintMaskShapeOutline.setColor(Color.BLACK); mPaintMaskShapeOutline.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); From 2dbcfb6cb01ebf7563810aa0b7f1c6638053faed Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 4 Apr 2017 16:03:00 -0700 Subject: [PATCH 043/446] Build fix Change-Id: I2395421f19e68f33d427485039aca42094a0154f --- src/com/android/launcher3/graphics/IconShapeOverride.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/graphics/IconShapeOverride.java b/src/com/android/launcher3/graphics/IconShapeOverride.java index 6e4d366428..a0727fb4b3 100644 --- a/src/com/android/launcher3/graphics/IconShapeOverride.java +++ b/src/com/android/launcher3/graphics/IconShapeOverride.java @@ -38,7 +38,7 @@ import com.android.launcher3.LauncherFiles; import com.android.launcher3.LauncherModel; import com.android.launcher3.R; import com.android.launcher3.Utilities; -import com.android.launcher3.util.LooperExecuter; +import com.android.launcher3.util.LooperExecutor; import java.lang.reflect.Field; @@ -169,7 +169,7 @@ public class IconShapeOverride { mContext.getString(R.string.icon_shape_override_progress), true /* indeterminate */, false /* cancelable */); - new LooperExecuter(LauncherModel.getWorkerLooper()).execute( + new LooperExecutor(LauncherModel.getWorkerLooper()).execute( new OverrideApplyHandler(mContext, newValue)); } return false; From c974115e06d2b8a82c78cf66aa8eaac078149b45 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 7 Apr 2017 22:22:41 -0700 Subject: [PATCH 044/446] Import translations. DO NOT MERGE Change-Id: I5d54346e6ef1cc6b38229156698bf870035d2884 Auto-generated-cl: translation import --- res/values-af/strings.xml | 12 ++++++++---- res/values-am/strings.xml | 12 ++++++++---- res/values-ar/strings.xml | 12 ++++++++---- res/values-az-rAZ/strings.xml | 12 ++++++++---- res/values-b+sr+Latn/strings.xml | 12 ++++++++---- res/values-be-rBY/strings.xml | 12 ++++++++---- res/values-bg/strings.xml | 12 ++++++++---- res/values-bn-rBD/strings.xml | 12 ++++++++---- res/values-bs-rBA/strings.xml | 12 ++++++++---- res/values-ca/strings.xml | 12 ++++++++---- res/values-cs/strings.xml | 12 ++++++++---- res/values-da/strings.xml | 12 ++++++++---- res/values-de/strings.xml | 12 ++++++++---- res/values-el/strings.xml | 12 ++++++++---- res/values-en-rAU/strings.xml | 12 ++++++++---- res/values-en-rGB/strings.xml | 12 ++++++++---- res/values-en-rIN/strings.xml | 12 ++++++++---- res/values-es-rUS/strings.xml | 12 ++++++++---- res/values-es/strings.xml | 12 ++++++++---- res/values-et-rEE/strings.xml | 12 ++++++++---- res/values-eu-rES/strings.xml | 12 ++++++++---- res/values-fa/strings.xml | 12 ++++++++---- res/values-fi/strings.xml | 12 ++++++++---- res/values-fr-rCA/strings.xml | 12 ++++++++---- res/values-fr/strings.xml | 12 ++++++++---- res/values-gl-rES/strings.xml | 12 ++++++++---- res/values-gu-rIN/strings.xml | 12 ++++++++---- res/values-hi/strings.xml | 12 ++++++++---- res/values-hr/strings.xml | 12 ++++++++---- res/values-hu/strings.xml | 12 ++++++++---- res/values-hy-rAM/strings.xml | 12 ++++++++---- res/values-in/strings.xml | 12 ++++++++---- res/values-is-rIS/strings.xml | 12 ++++++++---- res/values-it/strings.xml | 12 ++++++++---- res/values-iw/strings.xml | 12 ++++++++---- res/values-ja/strings.xml | 12 ++++++++---- res/values-ka-rGE/strings.xml | 12 ++++++++---- res/values-kk-rKZ/strings.xml | 12 ++++++++---- res/values-km-rKH/strings.xml | 12 ++++++++---- res/values-kn-rIN/strings.xml | 12 ++++++++---- res/values-ko/strings.xml | 12 ++++++++---- res/values-ky-rKG/strings.xml | 12 ++++++++---- res/values-lo-rLA/strings.xml | 12 ++++++++---- res/values-lt/strings.xml | 12 ++++++++---- res/values-lv/strings.xml | 12 ++++++++---- res/values-mk-rMK/strings.xml | 12 ++++++++---- res/values-ml-rIN/strings.xml | 12 ++++++++---- res/values-mn-rMN/strings.xml | 12 ++++++++---- res/values-mr-rIN/strings.xml | 12 ++++++++---- res/values-ms-rMY/strings.xml | 12 ++++++++---- res/values-my-rMM/strings.xml | 12 ++++++++---- res/values-nb/strings.xml | 12 ++++++++---- res/values-ne-rNP/strings.xml | 12 ++++++++---- res/values-nl/strings.xml | 12 ++++++++---- res/values-pa-rIN/strings.xml | 12 ++++++++---- res/values-pl/strings.xml | 12 ++++++++---- res/values-pt-rPT/strings.xml | 12 ++++++++---- res/values-pt/strings.xml | 12 ++++++++---- res/values-ro/strings.xml | 12 ++++++++---- res/values-ru/strings.xml | 12 ++++++++---- res/values-si-rLK/strings.xml | 12 ++++++++---- res/values-sk/strings.xml | 12 ++++++++---- res/values-sl/strings.xml | 12 ++++++++---- res/values-sq-rAL/strings.xml | 12 ++++++++---- res/values-sr/strings.xml | 12 ++++++++---- res/values-sv/strings.xml | 12 ++++++++---- res/values-sw/strings.xml | 12 ++++++++---- res/values-ta-rIN/strings.xml | 12 ++++++++---- res/values-te-rIN/strings.xml | 12 ++++++++---- res/values-th/strings.xml | 12 ++++++++---- res/values-tl/strings.xml | 12 ++++++++---- res/values-tr/strings.xml | 12 ++++++++---- res/values-uk/strings.xml | 12 ++++++++---- res/values-ur-rPK/strings.xml | 12 ++++++++---- res/values-uz-rUZ/strings.xml | 12 ++++++++---- res/values-vi/strings.xml | 12 ++++++++---- res/values-zh-rCN/strings.xml | 12 ++++++++---- res/values-zh-rHK/strings.xml | 12 ++++++++---- res/values-zh-rTW/strings.xml | 12 ++++++++---- res/values-zu/strings.xml | 12 ++++++++---- 80 files changed, 640 insertions(+), 320 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 5d4b76761c..3aabd7eef0 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -33,10 +33,8 @@ "Dubbeltik en hou om \'n legstuk op te tel of gebruik gepasmaakte handelinge." "%1$d × %2$d" "%1$d breed by %2$d hoog" - - - - + "Raak en hou om self te plaas" + "Voeg outomaties by" "Deursoek programme" "Laai tans programme …" "Geen programme gevind wat met \"%1$s\" ooreenstem nie" @@ -79,6 +77,12 @@ "Huidige vertooninstelling laat nie rotasie toe nie" "Voeg ikoon by tuisskerm" "Vir nuwe programme" + + + + + + "Onbekend" "Verwyder" "Soek" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 1c21247adc..1ad49cc684 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -33,10 +33,8 @@ "አንድ ንዑስ ፕሮግራም ለመምረጥ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" "%1$d × %2$d" "%1$d ስፋት በ%2$d ከፍታ" - - - - + "ራስዎ ለማስቀመጥ ነክተው ይያዙት" + "በራስ-ሰር አክል" "መተግበሪያዎችን ይፈልጉ" "መተግበሪያዎችን በመጫን ላይ..." "ከ«%1$s» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም" @@ -79,6 +77,12 @@ "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" "አዶ ወደ የመነሻ ማያ ገጽ አክል" "ለአዲስ መተግበሪያዎች" + + + + + + "የማይታወቅ" "አስወግድ" "ፈልግ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index d4563cddaf..a7decde36f 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -33,10 +33,8 @@ "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" "‏العرض %1$d الطول %2$d" - - - - + "المس مع الاستمرار للإضافة يدويًا" + "إضافة تلقائيًا" "البحث في التطبيقات" "جارٍ تحميل التطبيقات…" "لم يتم العثور على أية تطبيقات تتطابق مع \"%1$s\"" @@ -79,6 +77,12 @@ "لا يسمح إعداد العرض الحالي بالتدوير" "إضافة رمز إلى الشاشة الرئيسية" "للتطبيقات الجديدة" + + + + + + "غير معروفة" "إزالة" "بحث" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index f1e4c54ee7..2c0b0916a0 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -33,10 +33,8 @@ "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." "%1$d × %2$d" "%2$d hündürlük %1$d enində" - - - - + "Manual olaraq yerləşdirmək üçün toxunaraq basıb saxlayın" + "Avtomatik əlavə edin" "Tətbiq Axtarın" "Tətbiqlər endirilir..." "\"%1$s\" sorğusuna uyğun Tətbiqlər tapılmadı" @@ -79,6 +77,12 @@ "Cari Ekran ayarı fırlatmağa icazə vermir" "Əsas ekrana ikona əlavə edin" "Yeni tətbiqlər üçün" + + + + + + "Naməlum" "Yığışdır" "Axtarış" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index ba7d1ae91e..a5eef8f42e 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -33,10 +33,8 @@ "Dvaput dodirnite i zadržite da biste izabrali vidžet ili koristite prilagođene radnje." "%1$d×%2$d" "širina od %1$d i visina od %2$d" - - - - + "Dodirnite i zadržite da biste postavili ručno" + "Automatski dodaj" "Pretražite aplikacije" "Aplikacije se učitavaju..." "Nije pronađena nijedna aplikacija za „%1$s“" @@ -79,6 +77,12 @@ "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" "Dodaj ikonu na početni ekran" "Za nove aplikacije" + + + + + + "Nepoznato" "Ukloni" "Pretraži" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index e283cc4567..15de2ad351 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -33,10 +33,8 @@ "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць віджэт або выкарыстоўваць карыстальніцкія дзеянні." "%1$d × %2$d" "Шырына: %1$d, вышыня: %2$d" - - - - + "Каб размясціць уручную, дакраніцеся і ўтрымлівайце" + "Дадаць аўтаматычна" "Пошук у Праграмах" "Ідзе загрузка праграм…" "Праграм, якія адпавядаюць запыту \"%1$s\", не знойдзена" @@ -79,6 +77,12 @@ "Бягучая налада дысплэя не прадугледжвае паварот" "Дадаць значок на Галоўны экран" "Для новых праграм" + + + + + + "Невядома" "Выдаліць" "Шукаць" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 6cfef5c71f..6f1fb663c4 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -33,10 +33,8 @@ "Докоснете двукратно и задръжте за избор на приспособление или използвайте персонализирани действия." "%1$d × %2$d" "Ширина %1$d и височина %2$d" - - - - + "Докоснете и задръжте, за да поставите ръчно" + "Автоматично добавяне" "Търсене в приложенията" "Приложенията се зареждат…" "Няма намерени приложения, съответстващи на „%1$s“" @@ -79,6 +77,12 @@ "Текущата настройка на екрана не разрешава завъртане" "Добавяне на икона към началния екран" "За нови приложения" + + + + + + "Няма информация" "Премахване" "Търсене" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 4d4fd5bec5..9f5c874dd8 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -33,10 +33,8 @@ "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" "%1$d × %2$d" "%2$d উচ্চতা অনুযায়ী %1$d প্রস্থ" - - - - + "নিজে যোগ করতে টাচ করে ধরে রাখুন" + "স্বয়ংক্রিয়ভাবে যোগ করুন" "অ্যাপ্লিকেশানগুলি অনুসন্ধান করুন" "অ্যাপ্লিকেশানগুলি লোড হচ্ছে..." "\"%1$s\" এর সাথে মেলে এমন কোনো অ্যাপ্লিকেশান পাওয়া যায়নি" @@ -79,6 +77,12 @@ "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" "হোম স্ক্রিনে আইকন যোগ করুন" "নতুন অ্যাপ্লিকেশানগুলির জন্যে" + + + + + + "অজানা" "সরান" "অনুসন্ধান" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 0dd20261e6..60e03a54aa 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -33,10 +33,8 @@ "Dvaput dodirnite & i držite da biste uzeli vidžet ili koristite prilagođene radnje." "%1$d × %2$d" "Širina %1$d, visina %2$d" - - - - + "Dodirnite i držite da postavite ručno" + "Dodaj automatski" "Pretraži aplikacije" "Aplikacije se učitavaju…" "Nije pronađena nijedna aplikacija koja odgovara upitu \"%1$s\"" @@ -79,6 +77,12 @@ "Trenutne postavke ekrana ne dozvoljavaju rotiranje" "Dodajte ikonu na početni ekran" "Za nove aplikacije" + + + + + + "Nepoznato" "Ukloni" "Traži" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index c408995a31..ce039740df 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -33,10 +33,8 @@ "Fes doble toc i mantén premut per seleccionar un widget o per utilitzar les accions personalitzades." "%1$d × %2$d" "%1$d d\'amplada per %2$d d\'alçada" - - - - + "Toca i mantén premut l\'element per col·locar-lo manualment" + "Afegeix automàticament" "Cerca a les aplicacions" "S\'estan carregant les aplicacions..." "No s\'ha trobat cap aplicació que coincideixi amb %1$s" @@ -79,6 +77,12 @@ "La configuració actual de la pantalla no permet la rotació" "Afegeix la icona a la pantalla d\'inici" "Per a les aplicacions noves" + + + + + + "Desconegut" "Suprimeix" "Cerca" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 6e7ae2d473..70c55e6276 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -33,10 +33,8 @@ "Dvojitým klepnutím a podržením vyberte widget, případně použijte vlastní akce." "%1$d × %2$d" "šířka %1$d, výška %2$d" - - - - + "Chcete-li položku umístit ručně, klepněte na ni a podržte ji" + "Přidat automaticky" "Hledat aplikace" "Načítání aplikací…" "Dotazu „%1$s“ neodpovídají žádné aplikace" @@ -79,6 +77,12 @@ "Aktuální nastavení displeje neumožňuje otáčení" "Přidat ikonu na plochu" "Pro nové aplikace" + + + + + + "Neznámé" "Odstranit" "Hledat" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 7e5eb51532..786ba72318 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -33,10 +33,8 @@ "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" "%1$d i bredden og %2$d i højden" - - - - + "Tryk, og hold fingeren nede for at placere manuelt" + "Tilføj automatisk" "Søg i Apps" "Indlæser apps…" "Der blev ikke fundet nogen apps, som matcher \"%1$s\"" @@ -79,6 +77,12 @@ "Den aktuelle indstilling for visning tillader ikke rotation" "Føj ikon til startskærmen" "For nye apps" + + + + + + "Ukendt" "Fjern" "Søg" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index dd288687ff..c88ff87f1a 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -33,10 +33,8 @@ "Zum Hinzufügen auf Widget doppeltippen und gedrückt halten oder benutzerdefinierte Aktionen verwenden." "%1$d × %2$d" "%1$d breit und %2$d hoch" - - - - + "Zum manuellen Hinzufügen gedrückt halten" + "Automatisch hinzufügen" "In Apps suchen" "Apps werden geladen..." "Keine Apps für \"%1$s\" gefunden" @@ -79,6 +77,12 @@ "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" "Symbol zu Startbildschirm hinzufügen" "Für neue Apps" + + + + + + "Unbekannt" "Entfernen" "Suchen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 8296ba4894..f251ccb939 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -33,10 +33,8 @@ "Πατήστε δύο φορές παρατεταμένα για επιλογή γραφικού στοιχείου ή χρήση προσαρμοσμένων ενεργειών." "%1$d × %2$d" "Πλάτος %1$d επί ύψος %2$d" - - - - + "Αγγίξτε παρατεταμένα για μη αυτόματη τοποθέτηση" + "Αυτόματη προσθήκη" "Αναζήτηση εφαρμογών" "Φόρτωση εφαρμογών…" "Δεν βρέθηκαν εφαρμογές για το ερώτημα \"%1$s\"" @@ -79,6 +77,12 @@ "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" "Προσθήκη εικονιδίου στην Αρχική οθόνη" "Για νέες εφαρμογές" + + + + + + "Άγνωστο" "Κατάργηση" "Αναζήτηση" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index c44aa9d340..7a314a5cae 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -33,10 +33,8 @@ "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "%1$d wide by %2$d high" - - - - + "Touch & hold to place manually" + "Add automatically" "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" @@ -79,6 +77,12 @@ "Current display setting doesn\'t permit rotation" "Add icon to Home screen" "For new apps" + + + + + + "Unknown" "Remove" "Search" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index c44aa9d340..7a314a5cae 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -33,10 +33,8 @@ "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "%1$d wide by %2$d high" - - - - + "Touch & hold to place manually" + "Add automatically" "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" @@ -79,6 +77,12 @@ "Current display setting doesn\'t permit rotation" "Add icon to Home screen" "For new apps" + + + + + + "Unknown" "Remove" "Search" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index c44aa9d340..7a314a5cae 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -33,10 +33,8 @@ "Double-tap & hold to pick up a widget or use customised actions." "%1$d × %2$d" "%1$d wide by %2$d high" - - - - + "Touch & hold to place manually" + "Add automatically" "Search Apps" "Loading Apps…" "No Apps found matching \"%1$s\"" @@ -79,6 +77,12 @@ "Current display setting doesn\'t permit rotation" "Add icon to Home screen" "For new apps" + + + + + + "Unknown" "Remove" "Search" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 466e0b30ae..4ae572a578 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -33,10 +33,8 @@ "Presiona dos veces y mantén presionado para elegir un widget o usa una acción personalizada." "%1$d × %2$d" "%1$d de ancho por %2$d de alto" - - - - + "Mantén presionado para ubicarlo manualmente" + "Agregar automáticamente" "Buscar aplicaciones" "Cargando aplicaciones…" "No hay aplicaciones que coincidan con %1$s." @@ -79,6 +77,12 @@ "La configuración actual no permite la rotación de la pantalla" "Agregar ícono a la pantalla principal" "Para nuevas apps" + + + + + + "Desconocido" "Eliminar" "Buscar" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 4fd0ed9cdb..e8346a2ce9 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -33,10 +33,8 @@ "Toca dos veces y mantén pulsado el widget que quieras seleccionar o utiliza acciones personalizadas." "%1$d × %2$d" "%1$d de ancho por %2$d de alto" - - - - + "Mantén pulsado el elemento para añadirlo manualmente" + "Añadir automáticamente" "Busca aplicaciones" "Cargando aplicaciones…" "No se han encontrado aplicaciones que contengan \"%1$s\"" @@ -79,6 +77,12 @@ "La configuración de pantalla actual no permite girar la pantalla" "Añadir icono a la pantalla de inicio" "Para nuevas aplicaciones" + + + + + + "Desconocido" "Quitar" "Buscar" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 91e7b3b88d..73c1907ef5 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -33,10 +33,8 @@ "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." "%1$d × %2$d" "%1$d lai ja %2$d kõrge" - - - - + "Puudutage pikalt, et käsitsi asetada" + "Lisa automaatselt" "Otsige rakendustest" "Rakenduste laadimine ..." "Päringule „%1$s” ei vastanud ükski rakendus" @@ -79,6 +77,12 @@ "Praegune kuvaseade ei luba pööramist" "Lisa ikoon avaekraanile" "Uute rakenduste puhul" + + + + + + "Teadmata" "Eemalda" "Otsing" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 9c70d62e28..c9af8a4e4f 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -33,10 +33,8 @@ "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." "%1$d × %2$d" "%1$d zabal eta %2$d luze" - - - - + "Eduki sakatuta eskuz gehitzeko" + "Gehitu automatikoki" "Bilatu aplikazioetan" "Aplikazioak kargatzen…" "Ez da aurkitu \"%1$s\" bilaketarekin bat datorren aplikaziorik" @@ -79,6 +77,12 @@ "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" "Gehitu ikonoa hasierako pantailan" "Aplikazio berrietan" + + + + + + "Ezezaguna" "Kendu" "Bilatu" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 358b680e2e..cd3a9f8579 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -33,10 +33,8 @@ "برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگه‌دارید یا از اقدامات سفارشی استفاده کنید." "%1$d × %2$d" "‏%1$d عرض در %2$d طول" - - - - + "برای قرار دادن به‌صورت دستی لمس کنید و بکشید" + "افزودن خودکار" "جستجوی برنامه‌ها" "در حال بارگیری برنامه‌ها..." "هیچ برنامه‌ای مطابق با «%1$s» پیدا نشد" @@ -79,6 +77,12 @@ "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" "افزودن نماد به صفحه اصلی" "برای برنامه‌های جدید" + + + + + + "نامشخص" "حذف" "جستجو" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index c54d546510..bfe6788685 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -33,10 +33,8 @@ "Valitse widget tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla kohdetta pitkään." "%1$d × %2$d" "Leveys: %1$d, korkeus: %2$d" - - - - + "Sijoita manuaalisesti koskettamalla pitkään." + "Lisää automaattisesti" "Sovellushaku" "Ladataan sovelluksia…" "”%1$s” ei palauttanut sovelluksia." @@ -79,6 +77,12 @@ "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." "Lisää kuvake aloitusruutuun" "Uusille sovelluksille" + + + + + + "Tuntematon" "Poista" "Haku" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index b595e23873..9567feec1e 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -33,10 +33,8 @@ "Touchez 2x un widget et maintenez doigt dessus pour l’ajouter ou utiliser des actions personnalisées" "%1$d × %2$d" "%1$d de largeur sur %2$d de hauteur" - - - - + "Maintenez le doigt sur l\'élément pour le placer manuellement" + "Ajouter automatiquement" "Rechercher des applications" "Chargement des applications en cours..." "Aucune application trouvée correspondant à « %1$s »" @@ -79,6 +77,12 @@ "Le mode d\'affichage actuel ne permet pas le pivotement" "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" + + + + + + "Inconnu" "Supprimer" "Rechercher" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index d6c9a04b15..2aeb7aa04c 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -33,10 +33,8 @@ "Appuyez 2 fois et maintenez la pression pour sélectionner widget ou utilisez actions personnalisées." "%1$d x %2$d" "%1$d de largeur et %2$d de hauteur" - - - - + "Appuyez de manière prolongée pour placer l\'élément manuellement" + "Ajouter automatiquement" "Rechercher dans les applications" "Chargement des applications en cours…" "Aucune application ne correspond à la requête \"%1$s\"." @@ -79,6 +77,12 @@ "Le paramètre d\'affichage actuel n\'autorise pas la rotation." "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" + + + + + + "Inconnu" "Supprimer" "Rechercher" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index a05fc8585f..8edde55a46 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -33,10 +33,8 @@ "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." "%1$d × %2$d" "%1$d de largo por %2$d de alto" - - - - + "Mantén premido o elemento para colocalo manualmente" + "Engadir automaticamente" "Aplicacións de busca" "Cargando aplicacións..." "Non se atoparon aplicacións que coincidan con \"%1$s\"" @@ -79,6 +77,12 @@ "A configuración de visualización actual non permite xirar a pantalla" "Engadir icona á pantalla de inicio" "Para novas aplicacións" + + + + + + "Descoñecido" "Eliminar" "Buscar" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 1932e40bc9..3e41270dba 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -33,10 +33,8 @@ "વિજેટ ચૂંટવા અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટેપ કરો અને પકડી રાખો." "%1$d × %2$d" "%1$d પહોળાઈ X %2$d ઊંચાઈ" - - - - + "મેન્યુઅલી મૂકવા માટે ટચ કરી દબાવી રાખો" + "આપમેળે ઉમેરો" "શોધ ઍપ્લિકેશનો" "ઍપ્લિકેશનો લોડ કરી રહ્યું છે…" "\"%1$s\" થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી" @@ -79,6 +77,12 @@ "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" "હોમ સ્ક્રીન પર આઇકન ઉમેરો" "નવી ઍપ્લિકેશનો માટે" + + + + + + "અજાણ્યો" "દૂર કરો" "શોધો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index eb29709206..91c0489339 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -33,10 +33,8 @@ "कोई विजेट चुनने के लिए डबल टैप करके रखें या कस्‍टम कार्रवाइयां चुनें." "%1$d × %2$d" "%1$d चौड़ाई गुणा %2$d ऊंचाई" - - - - + "मैन्युअल रूप से जोड़ने के लिए स्पर्श करके रखें" + "अपने आप जोड़ें" "ऐप्‍स खोजें" "ऐप्स लोड हो रहे हैं..." "\"%1$s\" से मिलान करने वाला कोई ऐप नहीं मिला" @@ -79,6 +77,12 @@ "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" "होम स्क्रीन में आइकन जोड़ें" "नए ऐप्लिकेशन के लिए" + + + + + + "अज्ञात" "निकालें" "खोजें" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 8a62f4eb08..00652db271 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -33,10 +33,8 @@ "Dodirnite dvaput i držite kako biste podigli widget ili pokušajte prilagođenim radnjama." "%1$d × %2$d" "%1$d širine i %2$d visine" - - - - + "Dodirnite i zadržite stavku da biste je postavili ručno" + "Dodaj automatski" "Pretraži aplikacije" "Učitavanje aplikacija…" "Nema aplikacija podudarnih s upitom \"%1$s\"" @@ -79,6 +77,12 @@ "Trenutačna postavka zaslona ne dopušta zakretanje" "Dodaj ikonu na početni zaslon" "Za nove aplikacije" + + + + + + "Nepoznato" "Ukloni" "Traži" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index b44d231746..4a716c137f 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -33,10 +33,8 @@ "Modul mozgatásához koppintson rá duplán és tartsa lenyomva, vagy használjon egyéni műveleteket." "%1$d × %2$d" "%1$d széles és %2$d magas" - - - - + "Tartsa lenyomva a manuális hozzáadáshoz" + "Automatikus hozzáadás" "Alkalmazások keresése" "Alkalmazások betöltése…" "Egy alkalmazás sem található a(z) „%1$s” lekérdezésre." @@ -79,6 +77,12 @@ "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" "Ikon hozzáadása a kezdőképernyőhöz" "Új alkalmazásoknál" + + + + + + "Ismeretlen" "Eltávolítás" "Keresés" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 96b4ad002c..f88e1ebf64 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -33,10 +33,8 @@ "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" "%1$d × %2$d" "Լայնությունը՝ %1$d, բարձրությունը՝ %2$d" - - - - + "Հպեք և պահեք՝ ձեռքով տեղադրելու համար" + "Ավելացնել ավտոմատ կերպով" "Հավելվածների որոնում" "Հավելվածների բեռնում…" %1$s» հարցմանը համապատասխանող հավելվածներ չեն գտնվել" @@ -79,6 +77,12 @@ "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" "Ավելացնել պատկերակը Հիմնական էկրանին" "Նոր հավելվածների համար" + + + + + + "Անհայտ է" "Հեռացնել" "Գտնել" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index f4f27885bb..8d2b4adc3d 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -33,10 +33,8 @@ "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." "%1$d × %2$d" "lebar %1$d x tinggi %2$d" - - - - + "Sentuh & tahan untuk menempatkan secara manual" + "Tambahkan otomatis" "Telusuri Apps" "Memuat Aplikasi..." "Tidak ditemukan Aplikasi yang cocok dengan \"%1$s\"" @@ -79,6 +77,12 @@ "Setelan Tampilan Saat Ini tidak memungkinkan putaran" "Tambahkan ikon ke layar Utama" "Untuk aplikasi baru" + + + + + + "Tidak dikenal" "Buang" "Telusuri" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index b6e1e78dc6..84a9c36b60 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -33,10 +33,8 @@ "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." "%1$d × %2$d" "%1$d á breidd og %2$d á hæð" - - - - + "Haltu inni til að staðsetja handvirkt" + "Bæta sjálfkrafa við" "Leita í forritum" "Hleður forrit…" "Ekki fundust forrit sem samsvara „%1$s“" @@ -79,6 +77,12 @@ "Núverandi skjástilling leyfir ekki snúning" "Bæta tákni á heimaskjáinn" "Fyrir ný forrit" + + + + + + "Óþekkt" "Fjarlægja" "Leita" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index ad8556fb5b..0613d1a286 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -33,10 +33,8 @@ "Tocca due volte e tieni premuto per scegliere un widget o per utilizzare azioni personalizzate." "%1$d × %2$d" "%1$d di larghezza per %2$d di altezza" - - - - + "Tieni premuto per posizionare l\'elemento manualmente" + "Aggiungi automaticamente" "Cerca app" "Caricamento di app…" "Nessuna app trovata corrispondente a \"%1$s\"" @@ -79,6 +77,12 @@ "L\'impostazione corrente del display non consente la rotazione" "Aggiungi icone alla schermata Home" "Per le nuove app" + + + + + + "Sconosciuto" "Rimuovi" "Cerca" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 63107386b3..52df572b0e 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -33,10 +33,8 @@ "הקש פעמיים וגע נגיעה רציפה בווידג\'ט כדי לבחור בו, או השתמש בפעולות מותאמות אישית." "%1$d × %2$d" "‏רוחב %1$d על גובה %2$d" - - - - + "גע והחזק כדי להוסיף ידנית" + "הוסף באופן אוטומטי" "חפש אפליקציות" "טוען אפליקציות…" "לא נמצאו אפליקציות התואמות ל-\"%1$s\"" @@ -79,6 +77,12 @@ "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" "הוספת סמל במסך דף הבית" "לאפליקציות חדשות" + + + + + + "לא ידוע" "הסר" "חפש" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 6ad4345ef8..c94acafd0a 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -33,10 +33,8 @@ "ダブルタップ後に押し続けてウィジェットを選択するか、カスタム操作を使用してください。" "%1$dx%2$d" "幅 %1$d、高さ %2$d" - - - - + "押し続けると、手動で追加できます" + "自動的に追加" "アプリを検索" "アプリを読み込んでいます…" "「%1$s」に一致するアプリは見つかりませんでした" @@ -79,6 +77,12 @@ "現在の [ディスプレイ] 設定では回転を使用できません" "ホーム画面にアイコンを追加" "新しいアプリをダウンロードしたときに" + + + + + + "不明" "削除" "検索" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 4696ca03c1..9a088cbfab 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -33,10 +33,8 @@ "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." "%1$d × %2$d" "სიგრძე: %1$d, სიგანე: %2$d" - - - - + "ხანგრძლივად შეეხეთ ხელით განსათავსებლად" + "ავტომატურად დამატება" "აპების ძიება" "აპები იტვირთება..." "„%1$s“-ის თანხვედრი აპები არ მოიძებნა" @@ -79,6 +77,12 @@ "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" "ხატულას მთავარ ეკრანზე დამატება" "ახალი აპებისთვის" + + + + + + "უცნობი" "ამოშლა" "ძიება" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 5d7a57c8b2..e6e8dce808 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -33,10 +33,8 @@ "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." "%1$d × %2$d" "Ені: %1$d, биіктігі: %2$d" - - - - + "Қолмен қою үшін басып ұстап тұрыңыз" + "Автоматты енгізу" "Қолданбаларды іздеу" "Қолданбалар жүктелуде…" %1$s» сұрауына сәйкес келетін қолданбалар жоқ" @@ -79,6 +77,12 @@ "Экранның ағымдағы параметрі айналуға рұқсат бермейді" "Негізгі экранға белгіше енгізу" "Жаңа қолданбаларға арналған" + + + + + + "Белгісіз" "Алып тастау" "Іздеу" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 926f3eda00..3476c21e39 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -33,10 +33,8 @@ "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" "%1$d × %2$d" "ទទឺង %1$d គុណនឹងកម្ពស់ %2$d" - - - - + "ចុច​ឲ្យជាប់​ដើម្បី​បញ្ចូលវា​ដោយផ្ទាល់" + "បញ្ចូល​ដោយ​ស្វ័យ​ប្រវត្តិ" "ស្វែងរកកម្មវិធី" "កំពុងដំណើរការកម្មវិធី..." "គ្មានកម្មវិធីដែលត្រូវជាមួយ \"%1$s\" ទេ" @@ -79,6 +77,12 @@ "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" "បញ្ចូល​រូបតំណាង​ទៅ​អេក្រង់​ដើម" "សម្រាប់កម្មវិធីថ្មី" + + + + + + "មិន​ស្គាល់" "លុបចេញ" "ស្វែងរក" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 16e039de4b..ee717ec3dc 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -33,10 +33,8 @@ "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" "%1$d × %2$d" "%1$d ಅಗಲ ಮತ್ತು %2$d ಎತ್ತರ" - - - - + "ಹಸ್ತಚಾಲಿತವಾಗಿ ಸೇರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ" + "ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೇರಿಸಿ" "ಅಪ್ಲಿಕೇಷನ್‌ಗಳನ್ನು ಹುಡುಕಿ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." "\"%1$s\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ" @@ -79,6 +77,12 @@ "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" "ಮುಖಪುಟದ ಪರದೆಗೆ ಐಕಾನ್ ಸೇರಿಸಿ" "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" + + + + + + "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" "ಹುಡುಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index bb4f0c0e61..c05d5348f4 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -33,10 +33,8 @@ "위젯을 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." "%1$d×%2$d" "너비 %1$d, 높이 %2$d" - - - - + "길게 터치하여 직접 장소 추가" + "자동으로 추가" "앱 검색" "앱 로드 중..." "\'%1$s\'와(과) 일치하는 앱이 없습니다." @@ -79,6 +77,12 @@ "현재 표시 설정에는 회전 기능이 허용되지 않습니다." "홈 화면에 아이콘 추가" "새로 설치한 앱에 적용" + + + + + + "알 수 없음" "삭제" "검색" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index aa77658d29..7eab8936e9 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -33,10 +33,8 @@ "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "%1$d × %2$d" "Туурасы: %1$d, бийиктиги: %2$d" - - - - + "Кол менен жайгаштыруу үчүн басып туруп, таштаңыз" + "Автоматтык түрдө кошуу" "Колдонмолорду издөө" "Колдонмолор жүктөлүүдө…" "\"%1$s\" дал келген колдонмолор табылган жок" @@ -79,6 +77,12 @@ "Экранды айлантуу параметри өчүрүлгөн" "Башкы экранга сүрөтчө кошуу" "Жаңы колдонмолор үчүн" + + + + + + "Белгисиз" "Алып салуу" "Издөө" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index cd9ac5a25d..25a44e4a10 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -33,10 +33,8 @@ "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." "%1$d × %2$d" "ກວ້າງ %1$d ຄູນສູງ %2$d" - - - - + "ແຕະຄ້າງໄວ້ເພື່ອວາງດ້ວຍຕົນເອງ" + "ເພີ່ມໂດຍອັດຕະໂນມັດ" "ຊອກຫາແອັບ" "​ກຳ​ລັງ​ໂຫລດ​ແອັບ..." "ບໍ່​ພົບ​ແອັບ​ໃດ​ທີ່​ກົງ​ກັນ \"%1$s\"" @@ -79,6 +77,12 @@ "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" "ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ" "ສຳລັບແອັບໃໝ່" + + + + + + "​ບໍ່​ຮູ້​ຈັກ" "ລຶບ​" "ຊອກຫາ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index e3b7ae69be..2e7530cc66 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -33,10 +33,8 @@ "Dukart palieskite ir laikykite, kad pasirinktumėte valdiklį ar naudotumėte tinkintus veiksmus." "%1$d × %2$d" "%1$d plotis ir %2$d aukštis" - - - - + "Palieskite ir palaikykite, kad padėtumėte patys" + "Pridėti automatiškai" "Ieškoti programų" "Įkeliamos programos..." "Nerasta jokių užklausą „%1$s“ atitinkančių programų" @@ -79,6 +77,12 @@ "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" "Pridėti piktogr. prie pagrindinio ekrano" "Skirta naujoms programoms" + + + + + + "Nežinoma" "Pašalinti" "Ieškoti" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 974f2547b5..6435f86eb9 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -33,10 +33,8 @@ "Lai atlasītu logrīku, veiciet dubultskārienu uz tā un turiet to vai arī veiciet pielāgotas darbības." "%1$d × %2$d" "%1$d plats un %2$d augsts" - - - - + "Pieskarieties un turiet, lai manuāli pievienotu" + "Pievienot automātiski" "Meklēt lietotnes" "Notiek lietotņu ielāde…" "Vaicājumam “%1$s” neatbilda neviena lietotne." @@ -79,6 +77,12 @@ "Pašreizējā displeja iestatījumā nav atļauta pagriešana." "Pievienot ikonu sākuma ekrānā" "Jaunām lietotnēm" + + + + + + "Nezināma" "Noņemt" "Meklēt" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index dd4b3ae0ab..b2ad13114f 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -33,10 +33,8 @@ "Допрете двапати и задржете за да изберете додаток или да користите приспособени дејства." "%1$d × %2$d" "%1$d широк на %2$d висок" - - - - + "Допрете и задржете за рачно поставување" + "Додај автоматски" "Пребарување апликации" "Се вчитуваат апликации…" "Не се најдени апликации што одговараат на „%1$s“" @@ -79,6 +77,12 @@ "Тековната поставка на Екранот не дозволува ротација" "Додајте икона на почетниот екран" "За нови апликации" + + + + + + "Непознато" "Отстрани" "Барај" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 7a13d1db78..43a3c525f0 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -33,10 +33,8 @@ "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" "%1$d വീതിയും %2$d ഉയരവും" - - - - + "സ്വമേധയാ സ്ഥാപിക്കുന്നതിന് സ്‌പർശിച്ചുപിടിക്കുക" + "സ്വയമേവ ചേർക്കുക" "ആപ്പുകളെ തിരയുക" "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" @@ -79,6 +77,12 @@ "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" "ഹോം സ്ക്രീനിലേക്ക് ഐക്കൺ ചേർക്കുക" "പുതിയ ആപ്പുകൾക്ക്" + + + + + + "അജ്ഞാതം" "നീക്കംചെയ്യുക" "തിരയുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index d631f7b029..810709741c 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -33,10 +33,8 @@ "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." "%1$d × %2$d" "%1$d өргөн %2$d өндөр" - - - - + "Гараар байршуулахын тулд дараад хүлээнэ үү" + "Автоматаар нэмэх" "Апп хайх" "Аппликейшныг ачаалж байна..." "\"%1$s\"-д нийцэх апп олдсонгүй" @@ -79,6 +77,12 @@ "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" "Нүүр хуудаст дүрс тэмдэг нэмэх" "Шинэ аппад зориулсан" + + + + + + "Тодорхойгүй" "Устгах" "Хайх" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index c80a41095d..574c722139 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -33,10 +33,8 @@ "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." "%1$d × %2$d" "%1$d रूंद बाय %2$d उंच" - - - - + "स्वतः ठेवण्यासाठी स्पर्श करा आणि धरून ठेवा" + "स्वयंचलितपणे जोडा" "अॅप्स शोधा" "अॅप्स लोड करीत आहे..." "\"%1$s\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत" @@ -79,6 +77,12 @@ "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" "मुख्य स्क्रीनवर चिन्ह जोडा" "नवीन अॅप्ससाठी" + + + + + + "अज्ञात" "काढा" "शोधा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index cc4fc5882b..e083770379 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -33,10 +33,8 @@ "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" "%1$d × %2$d" "Lebar %1$d kali tinggi %2$d" - - - - + "Sentuh & tahan untuk meletakkan widget/ikon secara manual" + "Tambahkan secara automatik" "Cari Apl" "Memuatkan Apl…" "Tiada Apl yang ditemui sepadan dengan \"%1$s\"" @@ -79,6 +77,12 @@ "Tetapan Paparan semasa tidak membenarkan putaran" "Tambahkan ikon pada Skrin Utama" "Untuk apl baharu" + + + + + + "Tidak diketahui" "Alih keluar" "Carian" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 1c11314ffe..425261f46e 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -33,10 +33,8 @@ "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" "%1$d × %2$d" "အလျား %1$d နှင့် အမြင့် %2$d" - - - - + "ကိုယ်တိုင်ထည့်ရန် ထိထားပါ" + "အလိုအလျောက် ထည့်ရန်" "ရှာဖွေမှု အက်ပ်များ" "အက်ပ်များ ရယူနေစဉ်..." "\"%1$s\" နှင့်ကိုက်ညီသည့် အပ်ဖ်များမတွေ့ပါ" @@ -79,6 +77,12 @@ "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" "အက်ပ်အသစ်များအတွက်" + + + + + + "မသိရ" "ဖယ်ရှားရန်" "ရှာဖွေရန်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 9536050b0b..ae97b803ca 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -33,10 +33,8 @@ "Dobbelttrykk og hold inne for å velge en modul eller bruke tilpassede handlinger." "%1$d × %2$d" "%1$d bredde x %2$d høyde" - - - - + "Trykk og hold for å plassere manuelt" + "Legg til automatisk" "Søk i apper" "Laster inn apper …" "Fant ingen apper som samsvarer med «%1$s»" @@ -79,6 +77,12 @@ "Med den nåværende skjerminnstillingen støttes ikke rotasjon" "Legg til ikon på startsiden" "For nye apper" + + + + + + "Ukjent" "Fjern" "Søk" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index ab0ce2466d..0896695e35 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -33,10 +33,8 @@ "विजेटलाई छान्न वा आफू अनुकूल कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" "%1$d × %2$d" "%1$d चौडाइ गुणा %2$d उचाइ" - - - - + "म्यानुअल तरिकाले थप्न छुनुहोस् र थिची राख्नुहोस्‌" + "स्वतः थप्नुहोस्" "अनुप्रयोगहरू खोज्नुहोस्" "अनुप्रयोगहरू लोड गरिँदै..." "\"%1$s\" सँग मिल्दो कुनै अनुप्रयोगहरू फेला परेनन्" @@ -79,6 +77,12 @@ "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" "गृह स्क्रिनमा आइकन थप्नुहोस्" "नयाँ अनुप्रयोगका लागि" + + + + + + "अज्ञात" "हटाउनुहोस्" "खोजी गर्नुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index be1dfe0d5f..2b126f7c24 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -33,10 +33,8 @@ "Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken." "%1$d × %2$d" "%1$d breed en %2$d hoog" - - - - + "Tik op een item en houd dit vast om het handmatig te plaatsen" + "Automatisch toevoegen" "Apps zoeken" "Apps laden…" "Er zijn geen apps gevonden die overeenkomen met \'%1$s\'" @@ -79,6 +77,12 @@ "Huidige scherminstelling staat draaien niet toe" "Pictogram toevoegen aan startscherm" "Voor nieuwe apps" + + + + + + "Onbekend" "Verwijderen" "Zoeken" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index df5b4077c3..29b8a3438e 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -33,10 +33,8 @@ "ਡਬਲ-ਟੈਪ & ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਹੋਲਡ ਕਰੋ ਅਤੇ ਕਸਟਮ ਕਿਰਿਆਵਾਂ ਵਰਤੋ।" "%1$d × %2$d" "%1$d ਚੌੜਾਈ ਅਤੇ %2$d ਲੰਬਾਈ" - - - - + "ਹੱਥੀਂ ਰੱਖਣ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ" + "ਸਵੈਚਲਿਤ ਤਰੀਕੇ ਨਾਲ ਸ਼ਾਮਲ ਕਰੋ" "ਐਪਸ ਖੋਜੋ" "ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..." "\"%1$s\" ਨਾਲ ਮਿਲਦੀਆਂ ਕੋਈ ਵੀ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ" @@ -79,6 +77,12 @@ "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" + + + + + + "ਅਗਿਆਤ" "ਹਟਾਓ" "ਖੋਜੋ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index fcae3d263c..445fd6cc32 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -33,10 +33,8 @@ "Kliknij dwukrotnie i przytrzymaj, by wybrać widżet lub użyć działań niestandardowych." "%1$d × %2$d" "Szerokość %1$d, wysokość %2$d" - - - - + "Kliknij i przytrzymaj, by umieścić ręcznie" + "Dodaj automatycznie" "Szukaj w aplikacjach" "Wczytuję aplikacje…" "Nie znaleziono aplikacji pasujących do zapytania „%1$s”" @@ -79,6 +77,12 @@ "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" "Dodaj ikonę do ekranu głównego" "W przypadku nowych aplikacji" + + + + + + "Brak informacji" "Usuń" "Szukaj" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index b451db4d3d..2f37b9dbde 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -33,10 +33,8 @@ "Toque duas vezes sem soltar para escolher um widget ou utilize ações personalizadas." "%1$d × %2$d" "%1$d de largura por %2$d de altura" - - - - + "Toque sem soltar para colocar manualmente" + "Adicionar automaticamente" "Pesquisar aplicações" "A carregar aplicações..." "Não foram encontradas aplic. que correspondam a \"%1$s\"" @@ -79,6 +77,12 @@ "A definição de visualização atual não permite a rotação" "Adicionar ícone ao ecrã principal" "Para novas aplicações" + + + + + + "Desconhecido" "Remover" "Pesquisar" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index b38e1b2d4e..4b5734dfc7 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -33,10 +33,8 @@ "Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas." "%1$d × %2$d" "%1$d de largura por %2$d de altura" - - - - + "Toque e mantenha pressionado para posicionar manualmente" + "Adicionar automaticamente" "Pesquisar apps" "Carregando apps…" "Nenhum app encontrado que corresponda a \"%1$s\"" @@ -79,6 +77,12 @@ "A configuração atual de exibição não permite rotação" "Adicionar ícone à tela inicial" "Para novos apps" + + + + + + "Desconhecido" "Remover" "Pesquisar" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index b922bce66c..4cbf6da1c4 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -33,10 +33,8 @@ "Atingeți de două ori și mențineți apăsat ca să alegeți un widget sau folosiți acțiuni personalizate." "%1$d × %2$d" "%1$d lățime și %2$d înălțime" - - - - + "Atingeți lung pentru a plasa manual" + "Adăugați automat" "Căutați aplicații" "Se încarcă aplicațiile..." "Nu s-a găsit nicio aplicație pentru „%1$s”" @@ -79,6 +77,12 @@ "Setarea actuală a afișajului nu permite rotirea" "Adaugă pictograme în ecranul de pornire" "Pentru aplicații noi" + + + + + + "Necunoscut" "Eliminați" "Căutați" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index c8d9109645..16a449d4a5 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -33,10 +33,8 @@ "Чтобы выбрать виджет, нажмите на него дважды и не отпускайте или выполните предложенные действия." "%1$d x %2$d" "Ширина %1$d, высота %2$d" - - - - + "Нажмите и удерживайте, чтобы добавить вручную" + "Добавить автоматически" "Поиск приложений" "Загрузка…" "По запросу \"%1$s\" ничего не найдено" @@ -79,6 +77,12 @@ "В настройках отключен поворот экрана" "Добавлять значки" "Добавлять значки установленных приложений на главный экран." + + + + + + "Неизвестно" "Удалить" "Найти" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index ba11ad5ed1..de2ef0a686 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -33,10 +33,8 @@ "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." "%1$d × %2$d" "පළල %1$d උස %2$d" - - - - + "අතින් ස්ථානගත කිරීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න" + "ස්වයංක්‍රියව එක් කරන්න" "යෙදුම් සෙවීම" "යෙදුම් පූරණය වෙමින්…" "\"%1$s\" සමග ගැළපෙන යෙදුම් හමු නොවිණි" @@ -79,6 +77,12 @@ "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" "මුල් පිටු තිරය වෙත අයිකනය එක් කරන්න" "නව යෙදුම් සඳහා" + + + + + + "නොදනී" "ඉවත් කරන්න" "සොයන්න" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 0789a418a8..ac10a576da 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -33,10 +33,8 @@ "Miniaplikáciu pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." "%1$d × %2$d" "šírka %1$d, výška %2$d" - - - - + "Položku umiestnite ručne klepnutím a podržaním" + "Pridať automaticky" "Hľadať aplikácie" "Načítavajú sa aplikácie..." "Nenašli sa žiadne aplikácie zodpovedajúce dopytu %1$s" @@ -79,6 +77,12 @@ "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" "Pridať ikonu na plochu" "Pri inštalácii novej aplikácie" + + + + + + "Neznáme" "Odstrániť" "Vyhľadať" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 405047ca49..372602bfc3 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -33,10 +33,8 @@ "Če želite izbrati pripomoček ali uporabiti dejanja po meri, se ga dvakrat dotaknite in ga pridržite." "%1$d × %2$d" "Širina %1$d, višina %2$d" - - - - + "Dotaknite se elementa in ga pridržite, da ga ročno dodate" + "Samodejno dodaj" "Iskanje po aplikacijah" "Nalaganje aplikacij …" "Ni aplikacij, ki bi ustrezale poizvedbi »%1$s«" @@ -79,6 +77,12 @@ "Trenutna nastavitev zaslona ne dovoljuje sukanja" "Dodaj ikono na začetni zaslon" "Za nove aplikacije" + + + + + + "Neznano" "Odstrani" "Iskanje" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index de459e9b21..688db58765 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -33,10 +33,8 @@ "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." "%1$d × %2$d" "%1$d i gjerë me %2$d i lartë" - - - - + "Prek dhe mbaj të shtypur për të vendosur në mënyrë manuale" + "Shto automatikisht" "Kërko për aplikacione" "Po ngarkon aplikacionet..." "Nuk u gjet asnjë aplikacion që përputhet me \"%1$s\"" @@ -79,6 +77,12 @@ "Cilësimi aktuali i afishimit nuk lejon rrotullimin" "Shto ikonë në ekranin bazë" "Për aplikacionet e reja" + + + + + + "I panjohur" "Hiq" "Kërko" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 8b3f9c1dee..4e8cdc9adc 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -33,10 +33,8 @@ "Двапут додирните и задржите да бисте изабрали виџет или користите прилагођене радње." "%1$d×%2$d" "ширина од %1$d и висина од %2$d" - - - - + "Додирните и задржите да бисте поставили ручно" + "Аутоматски додај" "Претражите апликације" "Апликације се учитавају..." "Није пронађена ниједна апликација за „%1$s“" @@ -79,6 +77,12 @@ "Актуелно подешавање приказа не дозвољава ротацију" "Додај икону на почетни екран" "За нове апликације" + + + + + + "Непознато" "Уклони" "Претражи" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index c2368ebd3d..5054acfd2c 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -33,10 +33,8 @@ "Tryck två gånger och håll kvar om du vill ta upp en widget eller använda anpassade åtgärder." "%1$d × %2$d" "%1$d bred gånger %2$d hög" - - - - + "Placera manuellt genom att trycka länge" + "Lägg till automatiskt" "Sök efter appar" "Läser in appar …" "Det gick inte att hitta några appar som matchar %1$s" @@ -79,6 +77,12 @@ "Rotering tillåts inte i de nuvarande skärminställningarna" "Lägg till ikonen på startskärmen" "För nya appar" + + + + + + "Okänt" "Ta bort" "Sök" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 2494f238eb..efbdd42a03 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -33,10 +33,8 @@ "Gonga mara mbili na ushikilie ile uchague wijeti au utumie vitendo maalum." "%1$d × %2$d" "Upana wa %1$d na kimo cha %2$d" - - - - + "Gusa na ushikilie ili uweke mwenyewe" + "Ongeza kiotomatiki" "Tafuta Programu" "Inapakia Programu..." "Haikupata programu zinazolingana na \"%1$s\"" @@ -81,6 +79,12 @@ "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" "Ongeza aikoni kwenye Skrini ya kwanza" "Kwa ajili ya programu mpya" + + + + + + "Yasiyojulikana" "Ondoa" "Tafuta" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index d21f02dc26..062ec3c34c 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -33,10 +33,8 @@ "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "%1$d × %2$d" "%1$d அகலத்திற்கு %2$d உயரம்" - - - - + "நீங்களே சேர்க்க, தொட்டுப் பிடித்திருக்கவும்" + "தானாகவே சேர்" "பயன்பாடுகளில் தேடுக" "பயன்பாடுகளை ஏற்றுகிறது..." "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" @@ -79,6 +77,12 @@ "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" "முகப்புத் திரையில் ஐகானைச் சேர்" "புதிய பயன்பாடுகளுக்கு" + + + + + + "தெரியாதது" "அகற்று" "தேடு" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 54ace89e91..665f160c27 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -33,10 +33,8 @@ "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" "%1$d వెడల్పు X %2$d ఎత్తు" - - - - + "మాన్యువల్‌గా ఉంచడానికి నొక్కి &amp పట్టుకోండి" + "స్వయంచాలకంగా జోడించు" "అనువర్తనాలను శోధించండి" "అనువర్తనాలను లోడ్ చేస్తోంది…" "\"%1$s\"కి సరిపోలే అనువర్తనాలేవీ కనుగొనబడలేదు" @@ -79,6 +77,12 @@ "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" "హోమ్ స్క్రీన్‌కి చిహ్నాన్ని జోడించు" "కొత్త అనువర్తనాల కోసం" + + + + + + "తెలియదు" "తీసివేయి" "శోధించు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 6276361378..48ae2c52a1 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -33,10 +33,8 @@ "แตะ 2 ครั้งค้างไว้เพื่อเลือกวิดเจ็ตหรือใช้การกระทำที่กำหนดเอง" "%1$d × %2$d" "กว้าง %1$d x สูง %2$d" - - - - + "แตะค้างไว้เพื่อวางด้วยตัวเอง" + "เพิ่มโดยอัตโนมัติ" "ค้นหาแอป" "กำลังโหลดแอป…" "ไม่พบแอปที่ตรงกับ \"%1$s\"" @@ -79,6 +77,12 @@ "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" "เพิ่มไอคอนในหน้าจอหลัก" "สำหรับแอปใหม่" + + + + + + "ไม่รู้จัก" "ลบ" "ค้นหา" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 0b3cf50ee2..170317e5a2 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -33,10 +33,8 @@ "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" "%1$d ang lapad at %2$d ang taas" - - - - + "Pindutin nang matagal upang manual na ilagay" + "Awtomatikong idagdag" "Mga App sa Paghahanap" "Nilo-load ang Mga App…" "Walang nakitang Mga App na tumutugma sa \"%1$s\"" @@ -79,6 +77,12 @@ "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" "Idagdag ang icon sa Home screen" "Para sa mga bagong app" + + + + + + "Hindi kilala" "Alisin" "Maghanap" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 66f9be9663..7c77e9908d 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -33,10 +33,8 @@ "Bir widget\'ı seçmek veya özel işlemleri kullanmak için iki kez hafifçe dokunun ve basılı tutun." "%1$d × %2$d" "genişlik: %1$d, yükseklik: %2$d" - - - - + "Manuel olarak yerleştirmek için dokunun ve basılı tutun" + "Otomatik olarak ekle" "Uygulamalarda Ara" "Uygulamalar Yükleniyor…" "\"%1$s\" ile eşleşen uygulama bulunamadı" @@ -79,6 +77,12 @@ "Mevcut Ekran ayarı, döndürmeye izin vermiyor" "Ana ekrana simge ekle" "Yeni uygulamalar için" + + + + + + "Bilinmiyor" "Kaldır" "Ara" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 381fdb4526..6940261c22 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -33,10 +33,8 @@ "Двічі натисніть і утримуйте, щоб вибрати віджет, або виконайте іншу дію." "%1$d × %2$d" "Ширина – %1$d, висота – %2$d" - - - - + "Натисніть і утримуйте, щоб додати вручну" + "Додати автоматично" "Пошук додатків" "Завантаження додатків…" "Немає додатків для запиту \"%1$s\"" @@ -79,6 +77,12 @@ "Поточні налаштування дисплея не підтримують обертання" "Додати значок на головний екран" "Для нових додатків" + + + + + + "Невідомо" "Видалити" "Шукати" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index b61747b6d7..0019d7f923 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -33,10 +33,8 @@ "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" "%1$d × %2$d" "‏%1$d چوڑا اور ‎%2$d اونچا" - - - - + "‏دستی طور پر رکھنے کیلئے ‎& ٹچ کرکے ہولڈ کریں" + "خود کار طور پر شامل کریں" "ایپس تلاش کریں" "ایپس لوڈ ہو رہی ہیں…" "\"%1$s\" سے مماثل کوئی ایپس نہیں ملیں" @@ -79,6 +77,12 @@ "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" "آئیکن کو ہوم اسکرین میں شامل کریں" "نئی ایپس کیلئے" + + + + + + "نامعلوم" "ہٹائیں" "تلاش کریں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index afe26fffb0..78e532e75c 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -33,10 +33,8 @@ "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." "%1$d × %2$d" "Eni %1$d, bo‘yi %2$d" - - - - + "Qo‘lda joylashtirish uchun bosib turing" + "Avtomatik chiqarish" "Ilovalar ichidan qidirish" "Ilovalar yuklanmoqda…" "“%1$s” so‘rovi bo‘yicha hech narsa topilmadi" @@ -79,6 +77,12 @@ "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" "Bosh ekranga ikonka qo‘shish" "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" + + + + + + "Noma’lum" "O‘chirish" "Qidirish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 0df7a4b28a..cd92c7b980 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -33,10 +33,8 @@ "Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh." "%1$d × %2$d" "Rộng %1$d x cao %2$d" - - - - + "Chạm và giữ để đặt theo cách thủ công" + "Tự động thêm" "Tìm kiếm ứng dụng" "Đang tải ứng dụng..." "Không tìm thấy ứng dụng nào phù hợp với \"%1$s\"" @@ -79,6 +77,12 @@ "Cài đặt Hiển thị hiện tại không cho phép xoay" "Thêm biểu tượng vào màn hình chính" "Cho ứng dụng mới" + + + + + + "Không xác định" "Xóa" "Tìm kiếm" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index e4f58fee6e..159598b876 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -33,10 +33,8 @@ "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" "%1$d × %2$d" "宽 %1$d,高 %2$d" - - - - + "触摸并按住即可手动放置" + "自动添加" "搜索应用" "正在加载应用…" "未找到与“%1$s”相符的应用" @@ -79,6 +77,12 @@ "当前的显示设置不允许旋转设备" "将图标添加到主屏幕" "适用于新应用" + + + + + + "未知" "移除" "搜索" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 44c7f184e8..9b87af7a7d 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -33,10 +33,8 @@ "連扲兩下,然後扲住,就可以新增小工具,或者執行自訂操作。" "%1$d × %2$d" "%1$d 闊,%2$d 高" - - - - + "按住即可手動新增" + "自動新增" "搜尋應用程式" "正在載入應用程式…" "無法找到與「%1$s」相符的應用程式" @@ -79,6 +77,12 @@ "「目前顯示屏」設定不允許旋轉" "將圖示加到主畫面" "適用於新安裝的應用程式" + + + + + + "不明" "移除" "搜尋" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 94c919fc5d..bcb299c5e0 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -33,10 +33,8 @@ "輕觸兩下並按住小工具即可選取,您也可以使用自訂動作。" "%1$d × %2$d" "寬度為 %1$d,高度為 %2$d" - - - - + "按住即可手動放置" + "自動新增" "搜尋應用程式" "正在載入應用程式…" "找不到符合「%1$s」的應用程式" @@ -79,6 +77,12 @@ "目前的顯示設定不允許旋轉畫面" "將圖示加到主螢幕" "適用於新安裝的應用程式" + + + + + + "不明" "移除" "搜尋" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index e6facfdec9..df0d79aba7 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -33,10 +33,8 @@ "Thepha kabili bese uyabamba ukuze uthathe iwijethi noma sebenzisa izenzo ezingokwezifiso." "%1$d × %2$d" "%1$d ububanzi ngokungu-%2$d ukuya phezulu" - - - - + "Thinta futhi ubambe ukuze ubeke ngokwenza" + "Engeza ngokuzenzakalelayo" "Sesha Izinhlelo Zokusebenza" "Ilayisha izinhlelo zokusebenza..." "Azikho izinhlelo zokusebenza ezitholakele ezifana ne-\"%1$s\"" @@ -79,6 +77,12 @@ "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" "Engeza isithonjana eskrinini sasekhaya" "Kwezinhlelo zokusebenza ezintsha" + + + + + + "Akwaziwa" "Susa" "Sesha" From c66c3e2ba4876c9d383c1d7deddeee474f1c4859 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Thu, 13 Apr 2017 08:20:03 -0700 Subject: [PATCH 045/446] Fix build - move system shortcut icon colors to theme Change-Id: Iae248e5fdd57310adeb898305deee4c0eaee5318 --- res/drawable/ic_info_no_shadow.xml | 2 +- res/layout/system_shortcut.xml | 1 + res/layout/system_shortcut_icon_only.xml | 1 + res/values/colors.xml | 3 --- res/values/styles.xml | 15 +++++++++++++++ .../android/launcher3/popup/PopupPopulator.java | 6 ++---- .../android/launcher3/popup/SystemShortcut.java | 6 ++---- 7 files changed, 22 insertions(+), 12 deletions(-) diff --git a/res/drawable/ic_info_no_shadow.xml b/res/drawable/ic_info_no_shadow.xml index 3d0c6d6e47..5f145c9f1a 100644 --- a/res/drawable/ic_info_no_shadow.xml +++ b/res/drawable/ic_info_no_shadow.xml @@ -19,6 +19,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/res/layout/system_shortcut.xml b/res/layout/system_shortcut.xml index 113b1bed15..cd12025882 100644 --- a/res/layout/system_shortcut.xml +++ b/res/layout/system_shortcut.xml @@ -15,6 +15,7 @@ --> #E0E0E0 @color/notification_color_beneath - - @android:color/tertiary_text_light - #E0E0E0 #FFFFFF diff --git a/res/values/styles.xml b/res/values/styles.xml index 26ddb9c6a7..c3d11e446f 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -91,6 +91,21 @@ #B0000000 + + + + + diff --git a/res/values/styles.xml b/res/values/styles.xml index c3d11e446f..e2d9ff486b 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -25,6 +25,7 @@ true true #FF757575 + @layout/all_apps_search_container diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index c96c2a7b9a..25995dd1a3 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -212,6 +212,8 @@ public class Launcher extends BaseActivity private static int NEW_APPS_ANIMATION_INACTIVE_TIMEOUT_SECONDS = 5; @Thunk static int NEW_APPS_ANIMATION_DELAY = 500; + private final ExtractedColors mExtractedColors = new ExtractedColors(); + @Thunk Workspace mWorkspace; private View mLauncherView; @Thunk DragLayer mDragLayer; @@ -260,7 +262,6 @@ public class Launcher extends BaseActivity private LauncherModel mModel; private ModelWriter mModelWriter; private IconCache mIconCache; - private ExtractedColors mExtractedColors; private LauncherAccessibilityDelegate mAccessibilityDelegate; private Handler mHandler = new Handler(); private boolean mIsResumeFromActionScreenOff; @@ -392,11 +393,10 @@ public class Launcher extends BaseActivity // LauncherModel load. mPaused = false; - mLauncherView = getLayoutInflater().inflate(R.layout.launcher, null); + mLauncherView = LayoutInflater.from(this).inflate(R.layout.launcher, null); setupViews(); mDeviceProfile.layout(this, false /* notifyListeners */); - mExtractedColors = new ExtractedColors(); loadExtractedColorsAndColorItems(); mPopupDataProvider = new PopupDataProvider(this); @@ -465,12 +465,7 @@ public class Launcher extends BaseActivity @Override public void onExtractedColorsChanged() { loadExtractedColorsAndColorItems(); - if (mAllAppsController != null) { - mAllAppsController.onExtractedColorsChanged(); - } - if (mLauncherCallbacks != null) { - mLauncherCallbacks.onExtractedColorsChanged(); - } + mExtractedColors.notifyChange(); } public ExtractedColors getExtractedColors() { diff --git a/src/com/android/launcher3/LauncherCallbacks.java b/src/com/android/launcher3/LauncherCallbacks.java index ea4aeb9297..d66b14c7dc 100644 --- a/src/com/android/launcher3/LauncherCallbacks.java +++ b/src/com/android/launcher3/LauncherCallbacks.java @@ -97,6 +97,4 @@ public interface LauncherCallbacks { int getSearchBarHeight(); boolean shouldShowDiscoveryBounce(); - - void onExtractedColorsChanged(); } diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 121ce4ce12..9c1854a367 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -42,7 +42,7 @@ import com.android.launcher3.util.TouchController; * closer to top or closer to the page indicator. */ public class AllAppsTransitionController implements TouchController, VerticalPullDetector.Listener, - View.OnLayoutChangeListener { + View.OnLayoutChangeListener, ExtractedColors.OnChangeListener { private static final String TAG = "AllAppsTrans"; private static final boolean DBG = false; @@ -107,6 +107,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul mEvaluator = new ArgbEvaluator(); mAllAppsBackgroundColor = Themes.getAttrColor(l, android.R.attr.colorPrimary); + mLauncher.getExtractedColors().addOnChangeListener(this); } @Override @@ -288,6 +289,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul mScrimView.setProgress(progress); } + @Override public void onExtractedColorsChanged() { if (FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) { if (mGradientView != null) { diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java index f291a80eee..047441985b 100644 --- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java +++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java @@ -195,6 +195,8 @@ public class AlphabeticalAppsList { private int mNumPredictedAppsPerRow; private int mNumAppRowsInAdapter; + private boolean mHasSearchDivider = true; + public AlphabeticalAppsList(Context context) { mLauncher = Launcher.getLauncher(context); mIndexer = new AlphabeticIndexCompat(context); @@ -343,6 +345,10 @@ public class AlphabeticalAppsList { onAppsUpdated(); } + public void disableSearchDivider() { + mHasSearchDivider = false; + } + /** * Updates internals when the set of apps are updated. */ @@ -429,8 +435,10 @@ public class AlphabeticalAppsList { } } - // Add the search divider - mAdapterItems.add(AdapterItem.asSearchDivider(position++)); + if (mHasSearchDivider) { + // Add the search divider + mAdapterItems.add(AdapterItem.asSearchDivider(position++)); + } // Process the predicted app components mPredictedApps.clear(); diff --git a/src/com/android/launcher3/dynamicui/ExtractedColors.java b/src/com/android/launcher3/dynamicui/ExtractedColors.java index 3c4aba130d..108a21f400 100644 --- a/src/com/android/launcher3/dynamicui/ExtractedColors.java +++ b/src/com/android/launcher3/dynamicui/ExtractedColors.java @@ -26,6 +26,7 @@ import android.util.Log; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; +import java.util.ArrayList; import java.util.Arrays; /** @@ -80,6 +81,7 @@ public class ExtractedColors { private static final String COLOR_SEPARATOR = ","; + private final ArrayList mListeners = new ArrayList<>(); private final int[] mColors; public ExtractedColors() { @@ -171,4 +173,22 @@ public class ExtractedColors { setColorAtIndex(idx, wallpaperPalette == null ? DEFAULT_VALUES[idx] : wallpaperPalette.getVibrantColor(DEFAULT_VALUES[idx])); } + + public void addOnChangeListener(OnChangeListener listener) { + mListeners.add(listener); + } + + public void notifyChange() { + for (OnChangeListener listener : mListeners) { + listener.onExtractedColorsChanged(); + } + } + + /** + * Interface for listening for extracted color changes + */ + public interface OnChangeListener { + + void onExtractedColorsChanged(); + } } diff --git a/src/com/android/launcher3/testing/LauncherExtension.java b/src/com/android/launcher3/testing/LauncherExtension.java index 36df22cd58..8d4351884a 100644 --- a/src/com/android/launcher3/testing/LauncherExtension.java +++ b/src/com/android/launcher3/testing/LauncherExtension.java @@ -219,8 +219,5 @@ public class LauncherExtension extends Launcher { public boolean shouldShowDiscoveryBounce() { return false; } - - @Override - public void onExtractedColorsChanged() { } } } From 05f30889d6ba0f803c720813067b28c9c4cf2bfd Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 3 May 2017 12:42:18 -0700 Subject: [PATCH 073/446] Adding support for DB downgrade Adding a schema file for handling DB downgrade. This schema file is part of the backup/restore set, and hence is available on a device with lower app version. Bug: 37257575 Change-Id: I69c8ef5f28d5209be6e6679412c7459d4eeda5d0 --- res/raw/downgrade_schema.json | 20 ++ res/xml/backupscheme.xml | 1 + .../android/launcher3/LauncherProvider.java | 84 +++----- .../launcher3/model/DbDowngradeHelper.java | 108 ++++++++++ .../launcher3/provider/LauncherDbUtils.java | 2 + src/com/android/launcher3/util/IOUtils.java | 55 +++++ tests/res/raw/db_schema_v10.json | 4 + .../model/DbDowngradeHelperTest.java | 194 ++++++++++++++++++ 8 files changed, 415 insertions(+), 53 deletions(-) create mode 100644 res/raw/downgrade_schema.json create mode 100644 src/com/android/launcher3/model/DbDowngradeHelper.java create mode 100644 src/com/android/launcher3/util/IOUtils.java create mode 100644 tests/res/raw/db_schema_v10.json create mode 100644 tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java diff --git a/res/raw/downgrade_schema.json b/res/raw/downgrade_schema.json new file mode 100644 index 0000000000..3c1b64f92a --- /dev/null +++ b/res/raw/downgrade_schema.json @@ -0,0 +1,20 @@ +{ + // Note: Comments are not supported in JSON schema, but android parser is lenient. + + // Maximum DB version supported by this schema + "version" : 27, + + // Downgrade from 27 to 26. Empty array indicates, the DB is compatible + "downgrade_to_26" : [], + "downgrade_to_25" : [], + "downgrade_to_24" : [], + "downgrade_to_23" : [], + "downgrade_to_22" : [ + "ALTER TABLE favorites RENAME TO temp_favorites;", + "CREATE TABLE favorites(_id INTEGER PRIMARY KEY, title TEXT, intent TEXT, container INTEGER, screen INTEGER, cellX INTEGER, cellY INTEGER, spanX INTEGER, spanY INTEGER, itemType INTEGER, appWidgetId INTEGER NOT NULL DEFAULT - 1, iconPackage TEXT, iconResource TEXT, icon BLOB, appWidgetProvider TEXT, modified INTEGER NOT NULL DEFAULT 0, restored INTEGER NOT NULL DEFAULT 0, profileId INTEGER DEFAULT 0, rank INTEGER NOT NULL DEFAULT 0);", + "INSERT INTO favorites SELECT _id, title, intent, container, screen, cellX, cellY, spanX, spanY, itemType, appWidgetId, iconPackage, iconResource, icon, appWidgetProvider, modified, restored, profileId, rank FROM temp_favorites;", + "DROP TABLE temp_favorites;" + ] + + // Missing values indicate the DB is not compatible +} \ No newline at end of file diff --git a/res/xml/backupscheme.xml b/res/xml/backupscheme.xml index 7e833a0ca1..299e92ea10 100644 --- a/res/xml/backupscheme.xml +++ b/res/xml/backupscheme.xml @@ -3,5 +3,6 @@ + \ No newline at end of file diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index bd53b4d723..c84a4312df 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -56,6 +56,7 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dynamicui.ExtractionUtils; import com.android.launcher3.graphics.IconShapeOverride; import com.android.launcher3.logging.FileLog; +import com.android.launcher3.model.DbDowngradeHelper; import com.android.launcher3.provider.LauncherDbUtils; import com.android.launcher3.provider.LauncherDbUtils.SQLiteTransaction; import com.android.launcher3.provider.RestoreDbTask; @@ -64,6 +65,7 @@ import com.android.launcher3.util.NoLocaleSqliteContext; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Thunk; +import java.io.File; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.reflect.Method; @@ -77,18 +79,12 @@ public class LauncherProvider extends ContentProvider { private static final String TAG = "LauncherProvider"; private static final boolean LOGD = false; + private static final String DOWNGRADE_SCHEMA_FILE = "downgrade_schema.json"; + /** * Represents the schema of the database. Changes in scheme need not be backwards compatible. */ - private static final int SCHEMA_VERSION = 27; - /** - * Represents the actual data. It could include additional validations and normalizations added - * overtime. These must be backwards compatible, else we risk breaking old devices during - * restore or binary version downgrade. - */ - private static final int DATA_VERSION = 3; - - private static final String PREF_KEY_DATA_VERISON = "provider_data_version"; + public static final int SCHEMA_VERSION = 27; public static final String AUTHORITY = (BuildConfig.APPLICATION_ID + ".settings").intern(); @@ -703,47 +699,30 @@ public class LauncherProvider extends ContentProvider { @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); - SharedPreferences prefs = mContext - .getSharedPreferences(LauncherFiles.DEVICE_PREFERENCES_KEY, 0); - int oldVersion = prefs.getInt(PREF_KEY_DATA_VERISON, 0); - if (oldVersion != DATA_VERSION) { - // Only run the data upgrade path for an existing db. - if (!Utilities.getPrefs(mContext).getBoolean(EMPTY_DATABASE_CREATED, false)) { - try (SQLiteTransaction t = new SQLiteTransaction(db)) { - onDataUpgrade(db, oldVersion); - t.commit(); - } catch (Exception e) { - Log.d(TAG, "Error updating data version, ignoring", e); - return; - } - } - prefs.edit().putInt(PREF_KEY_DATA_VERISON, DATA_VERSION).apply(); + + File schemaFile = mContext.getFileStreamPath(DOWNGRADE_SCHEMA_FILE); + if (!schemaFile.exists()) { + handleOneTimeDataUpgrade(db); } + DbDowngradeHelper.updateSchemaFile(schemaFile, SCHEMA_VERSION, mContext, + R.raw.downgrade_schema); } /** - * Called when the data is updated as part of app update. It can be called multiple times - * with old version, even though it had been run before. The changes made here must be - * backwards compatible, else we risk breaking old devices during restore or binary - * version downgrade. + * One-time data updated before support of onDowngrade was added. This update is backwards + * compatible and can safely be run multiple times. + * Note: No new logic should be added here after release, as the new logic might not get + * executed on an existing device. + * TODO: Move this to db upgrade path, once the downgrade path is released. */ - protected void onDataUpgrade(SQLiteDatabase db, int oldVersion) { - switch (oldVersion) { - case 0: - case 1: { - // Remove "profile extra" - UserManagerCompat um = UserManagerCompat.getInstance(mContext); - for (UserHandle user : um.getUserProfiles()) { - long serial = um.getSerialNumberForUser(user); - String sql = "update favorites set intent = replace(intent, " - + "';l.profile=" + serial + ";', ';') where itemType = 0;"; - db.execSQL(sql); - } - } - case 2: - case 3: - // data updated - return; + protected void handleOneTimeDataUpgrade(SQLiteDatabase db) { + // Remove "profile extra" + UserManagerCompat um = UserManagerCompat.getInstance(mContext); + for (UserHandle user : um.getUserProfiles()) { + long serial = um.getSerialNumberForUser(user); + String sql = "update favorites set intent = replace(intent, " + + "';l.profile=" + serial + ";', ';') where itemType = 0;"; + db.execSQL(sql); } } @@ -850,15 +829,14 @@ public class LauncherProvider extends ContentProvider { @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { - if (oldVersion == 28 && newVersion == 27) { - // TODO: remove this check. This is only applicable for internal development/testing - // and for any released version of Launcher. - return; + try { + DbDowngradeHelper.parse(mContext.getFileStreamPath(DOWNGRADE_SCHEMA_FILE)) + .onDowngrade(db, oldVersion, newVersion); + } catch (Exception e) { + Log.d(TAG, "Unable to downgrade from: " + oldVersion + " to " + newVersion + + ". Wiping databse.", e); + createEmptyDB(db); } - // This shouldn't happen -- throw our hands up in the air and start over. - Log.w(TAG, "Database version downgrade from: " + oldVersion + " to " + newVersion + - ". Wiping databse."); - createEmptyDB(db); } /** diff --git a/src/com/android/launcher3/model/DbDowngradeHelper.java b/src/com/android/launcher3/model/DbDowngradeHelper.java new file mode 100644 index 0000000000..cd86b728b1 --- /dev/null +++ b/src/com/android/launcher3/model/DbDowngradeHelper.java @@ -0,0 +1,108 @@ +/* + * 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. + */ +package com.android.launcher3.model; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; +import android.util.Log; +import android.util.SparseArray; + +import com.android.launcher3.provider.LauncherDbUtils.SQLiteTransaction; +import com.android.launcher3.util.IOUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; + +/** + * Utility class to handle DB downgrade + */ +public class DbDowngradeHelper { + + private static final String TAG = "DbDowngradeHelper"; + + private static final String KEY_VERSION = "version"; + private static final String KEY_DOWNGRADE_TO = "downgrade_to_"; + + private final SparseArray mStatements = new SparseArray<>(); + public final int version; + + private DbDowngradeHelper(int version) { + this.version = version; + } + + public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { + ArrayList allCommands = new ArrayList<>(); + + for (int i = oldVersion - 1; i >= newVersion; i--) { + String[] commands = mStatements.get(i); + if (commands == null) { + throw new SQLiteException("Downgrade path not supported to version " + i); + } + Collections.addAll(allCommands, commands); + } + + try (SQLiteTransaction t = new SQLiteTransaction(db)) { + for (String sql : allCommands) { + db.execSQL(sql); + } + t.commit(); + } + } + + public static DbDowngradeHelper parse(File file) throws JSONException, IOException { + JSONObject obj = new JSONObject(new String(IOUtils.toByteArray(file))); + DbDowngradeHelper helper = new DbDowngradeHelper(obj.getInt(KEY_VERSION)); + for (int version = helper.version - 1; version > 0; version--) { + if (obj.has(KEY_DOWNGRADE_TO + version)) { + JSONArray statements = obj.getJSONArray(KEY_DOWNGRADE_TO + version); + String[] parsed = new String[statements.length()]; + for (int i = 0; i < parsed.length; i++) { + parsed[i] = statements.getString(i); + } + helper.mStatements.put(version, parsed); + } + } + return helper; + } + + public static void updateSchemaFile(File schemaFile, int expectedVersion, + Context context, int schemaResId) { + try { + if (DbDowngradeHelper.parse(schemaFile).version >= expectedVersion) { + return; + } + } catch (Exception e) { + // Schema error + } + + // Write the updated schema + try (FileOutputStream fos = new FileOutputStream(schemaFile); + InputStream in = context.getResources().openRawResource(schemaResId)) { + IOUtils.copy(in, fos); + } catch (IOException e) { + Log.e(TAG, "Error writing schema file", e); + } + } +} diff --git a/src/com/android/launcher3/provider/LauncherDbUtils.java b/src/com/android/launcher3/provider/LauncherDbUtils.java index 6325040604..74373d3072 100644 --- a/src/com/android/launcher3/provider/LauncherDbUtils.java +++ b/src/com/android/launcher3/provider/LauncherDbUtils.java @@ -52,6 +52,7 @@ public class LauncherDbUtils { if (screenIds.isEmpty()) { // No update needed + t.commit(); return true; } if (screenIds.get(0) != 0) { @@ -71,6 +72,7 @@ public class LauncherDbUtils { if (DatabaseUtils.queryNumEntries(db, Favorites.TABLE_NAME, "container = -100 and screen = 0 and cellY = 0") == 0) { // First row is empty, no need to migrate. + t.commit(); return true; } diff --git a/src/com/android/launcher3/util/IOUtils.java b/src/com/android/launcher3/util/IOUtils.java new file mode 100644 index 0000000000..77c21fe925 --- /dev/null +++ b/src/com/android/launcher3/util/IOUtils.java @@ -0,0 +1,55 @@ +/* + * 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. + */ + +package com.android.launcher3.util; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * Supports various IO utility functions + */ +public class IOUtils { + + private static final int BUF_SIZE = 0x1000; // 4K + + public static byte[] toByteArray(File file) throws IOException { + try (InputStream in = new FileInputStream(file)) { + return toByteArray(in); + } + } + + public static byte[] toByteArray(InputStream in) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + copy(in, out); + return out.toByteArray(); + } + + public static long copy(InputStream from, OutputStream to) throws IOException { + byte[] buf = new byte[BUF_SIZE]; + long total = 0; + int r; + while ((r = from.read(buf)) != -1) { + to.write(buf, 0, r); + total += r; + } + return total; + } +} diff --git a/tests/res/raw/db_schema_v10.json b/tests/res/raw/db_schema_v10.json new file mode 100644 index 0000000000..a5e290ef7a --- /dev/null +++ b/tests/res/raw/db_schema_v10.json @@ -0,0 +1,4 @@ +{ + "version" : 10, + "downgrade_to_9" : [] +} \ No newline at end of file diff --git a/tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java b/tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java new file mode 100644 index 0000000000..1d9148ba13 --- /dev/null +++ b/tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java @@ -0,0 +1,194 @@ +/* + * 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. + */ +package com.android.launcher3.model; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNotSame; +import static junit.framework.Assert.assertTrue; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import com.android.launcher3.LauncherProvider; +import com.android.launcher3.LauncherProvider.DatabaseHelper; +import com.android.launcher3.LauncherSettings.Favorites; +import com.android.launcher3.R; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.File; + +/** + * Tests for {@link DbDowngradeHelper} + */ +@SmallTest +@RunWith(AndroidJUnit4.class) +public class DbDowngradeHelperTest { + + private static final String SCHEMA_FILE = "test_schema.json"; + private static final String DB_FILE = "test.db"; + + private Context mContext; + private File mSchemaFile; + private File mDbFile; + + @Before + public void setup() { + mContext = InstrumentationRegistry.getTargetContext(); + mSchemaFile = mContext.getFileStreamPath(SCHEMA_FILE); + mDbFile = mContext.getDatabasePath(DB_FILE); + } + + @Test + public void testUpdateSchemaFile() throws Exception { + Context myContext = InstrumentationRegistry.getContext(); + int testResId = myContext.getResources().getIdentifier( + "db_schema_v10", "raw", myContext.getPackageName()); + mSchemaFile.delete(); + assertFalse(mSchemaFile.exists()); + + DbDowngradeHelper.updateSchemaFile(mSchemaFile, 10, myContext, testResId); + assertTrue(mSchemaFile.exists()); + assertEquals(10, DbDowngradeHelper.parse(mSchemaFile).version); + + // Schema is updated on version upgrade + assertTrue(mSchemaFile.setLastModified(0)); + DbDowngradeHelper.updateSchemaFile(mSchemaFile, 11, myContext, testResId); + assertNotSame(0, mSchemaFile.lastModified()); + + // Schema is not updated when version is same + assertTrue(mSchemaFile.setLastModified(0)); + DbDowngradeHelper.updateSchemaFile(mSchemaFile, 10, myContext, testResId); + assertEquals(0, mSchemaFile.lastModified()); + + // Schema is not updated on version downgrade + DbDowngradeHelper.updateSchemaFile(mSchemaFile, 3, myContext, testResId); + assertEquals(0, mSchemaFile.lastModified()); + } + + @Test + public void testDowngrade_success_v24() throws Exception { + setupTestDb(); + + TestOpenHelper helper = new TestOpenHelper(24); + assertEquals(24, helper.getReadableDatabase().getVersion()); + helper.close(); + } + + @Test + public void testDowngrade_success_v22() throws Exception { + setupTestDb(); + + SQLiteOpenHelper helper = new TestOpenHelper(22); + assertEquals(22, helper.getWritableDatabase().getVersion()); + + // Check column does not exist + try (Cursor c = helper.getWritableDatabase().query(Favorites.TABLE_NAME, + null, null, null, null, null, null)) { + assertEquals(-1, c.getColumnIndex(Favorites.OPTIONS)); + + // Check data is present + assertEquals(10, c.getCount()); + } + helper.close(); + + helper = new DatabaseHelper(mContext, null, DB_FILE) { + @Override + public void onOpen(SQLiteDatabase db) { } + }; + assertEquals(LauncherProvider.SCHEMA_VERSION, helper.getWritableDatabase().getVersion()); + + try (Cursor c = helper.getWritableDatabase().query(Favorites.TABLE_NAME, + null, null, null, null, null, null)) { + // Check column exists + assertNotSame(-1, c.getColumnIndex(Favorites.OPTIONS)); + + // Check data is present + assertEquals(10, c.getCount()); + } + helper.close(); + } + + @Test(expected = DowngradeFailException.class) + public void testDowngrade_fail_v20() throws Exception { + setupTestDb(); + + TestOpenHelper helper = new TestOpenHelper(20); + helper.getReadableDatabase().getVersion(); + } + + private void setupTestDb() throws Exception { + mSchemaFile.delete(); + mDbFile.delete(); + + DbDowngradeHelper.updateSchemaFile(mSchemaFile, LauncherProvider.SCHEMA_VERSION, mContext, + R.raw.downgrade_schema); + + DatabaseHelper dbHelper = new DatabaseHelper(mContext, null, DB_FILE) { + @Override + public void onOpen(SQLiteDatabase db) { } + }; + // Insert dummy data + for (int i = 0; i < 10; i++) { + ContentValues values = new ContentValues(); + values.put(Favorites._ID, i); + values.put(Favorites.TITLE, "title " + i); + dbHelper.getWritableDatabase().insert(Favorites.TABLE_NAME, null, values); + } + dbHelper.close(); + } + + private class TestOpenHelper extends SQLiteOpenHelper { + + public TestOpenHelper(int version) { + super(mContext, DB_FILE, null, version); + } + + @Override + public void onCreate(SQLiteDatabase sqLiteDatabase) { + throw new RuntimeException("DB should already be created"); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + throw new RuntimeException("Only downgrade supported"); + } + + @Override + public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { + try { + DbDowngradeHelper.parse(mSchemaFile).onDowngrade(db, oldVersion, newVersion); + } catch (Exception e) { + throw new DowngradeFailException(e); + } + } + } + + private static class DowngradeFailException extends RuntimeException { + public DowngradeFailException(Exception e) { + super(e); + } + } +} From 2d89ea84530559e2002a3a4009a50bac1e568507 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 4 May 2017 11:47:53 -0700 Subject: [PATCH 074/446] Fade in background scrim when resuming from screen off. This change hides the hard cut off that appears when the Launcher window is transitioning upwards when resuming from when the screen is off. Bug: 36446766 Change-Id: I0c0fe13ee9e08d27b94916d0407ef431d82b8d6a --- src/com/android/launcher3/Launcher.java | 22 +++++++++++++++++++ .../android/launcher3/LauncherAnimUtils.java | 13 +++++++++++ .../allapps/AllAppsBackgroundDrawable.java | 4 +++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index c96c2a7b9a..f77308e144 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -18,7 +18,9 @@ package com.android.launcher3; import android.Manifest; import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.annotation.TargetApi; @@ -267,6 +269,8 @@ public class Launcher extends BaseActivity private boolean mHasFocus = false; private boolean mAttached = false; + private ObjectAnimator mScrimAnimator; + private PopupDataProvider mPopupDataProvider; private View.OnTouchListener mHapticFeedbackTouchListener; @@ -920,6 +924,24 @@ public class Launcher extends BaseActivity if (!isWorkspaceLoading()) { NotificationListener.setNotificationsChangedListener(mPopupDataProvider); } + + if (mIsResumeFromActionScreenOff && mDragLayer.getBackground() != null) { + if (mScrimAnimator != null) { + mScrimAnimator.cancel(); + } + mDragLayer.getBackground().setAlpha(0); + mScrimAnimator = ObjectAnimator.ofInt(mDragLayer.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(); + } } @Override diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java index 2be2021f1c..cfb9b570b0 100644 --- a/src/com/android/launcher3/LauncherAnimUtils.java +++ b/src/com/android/launcher3/LauncherAnimUtils.java @@ -21,6 +21,7 @@ import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; +import android.graphics.drawable.Drawable; import android.util.Property; import android.view.View; import android.view.ViewTreeObserver; @@ -128,4 +129,16 @@ public class LauncherAnimUtils { return anim; } + public static final Property DRAWABLE_ALPHA = + new Property(Integer.TYPE, "drawableAlpha") { + @Override + public Integer get(Drawable drawable) { + return drawable.getAlpha(); + } + + @Override + public void set(Drawable drawable, Integer alpha) { + drawable.setAlpha(alpha); + } + }; } diff --git a/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java b/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java index c71bc3166b..54c5bd0b21 100644 --- a/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java +++ b/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java @@ -25,6 +25,7 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.view.Gravity; +import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; /** @@ -119,7 +120,8 @@ public class AllAppsBackgroundDrawable extends Drawable { int finalAlphaI = (int) (finalAlpha * 255f); if (getAlpha() != finalAlphaI) { mBackgroundAnim = cancelAnimator(mBackgroundAnim); - mBackgroundAnim = ObjectAnimator.ofInt(this, "alpha", finalAlphaI); + mBackgroundAnim = ObjectAnimator.ofInt(this, LauncherAnimUtils.DRAWABLE_ALPHA, + finalAlphaI); mBackgroundAnim.setDuration(duration); mBackgroundAnim.start(); } From 29676acfe251a21afa786507a98bdae283ec93e8 Mon Sep 17 00:00:00 2001 From: Tony Date: Wed, 10 May 2017 21:23:57 -0500 Subject: [PATCH 075/446] Update accessibility for popup - Content description includes count of notifications. - Notifications have a dismiss action. - All icons that support shortcuts will have action to show shortcut menu, since there will be system shortcuts even if there are no deep shortcuts. Bug: 36564782 Change-Id: I51b085fa26754f2dcd93c7db6548f2edf054f494 --- res/values/config.xml | 1 + res/values/strings.xml | 8 ++++++ src/com/android/launcher3/BubbleTextView.java | 8 ------ src/com/android/launcher3/Launcher.java | 4 +-- .../LauncherAccessibilityDelegate.java | 4 +-- .../ShortcutMenuAccessibilityDelegate.java | 19 +++++++++++++ .../NotificationFooterLayout.java | 1 + .../notification/NotificationItemView.java | 4 +++ .../notification/NotificationMainView.java | 2 +- .../popup/PopupContainerWithArrow.java | 27 ++++++++++++------- 10 files changed, 56 insertions(+), 22 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index 71984d667d..bb80ec8ecf 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -140,4 +140,5 @@ + diff --git a/res/values/strings.xml b/res/values/strings.xml index 4bee87d334..f906a78e69 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -286,5 +286,13 @@ %1$d shortcuts for %2$s + + %1$d shortcuts and %2$d notifications for %3$s + + + Dismiss + + + Notification dismissed diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 07236d6a08..2e7c405275 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -674,14 +674,6 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { } } - /** - * Returns true if the view can show custom shortcuts. - */ - public boolean hasDeepShortcuts() { - return !mLauncher.getPopupDataProvider().getShortcutIdsForItem((ItemInfo) getTag()) - .isEmpty(); - } - public int getIconSize() { return mIconSize; } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 4be25bb17e..f4342a29a8 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -4054,8 +4054,8 @@ public class Launcher extends BaseActivity shortcutInfos.add(new KeyboardShortcutInfo(getString(R.string.custom_actions), KeyEvent.KEYCODE_O, KeyEvent.META_CTRL_ON)); } - if (currentFocus instanceof BubbleTextView && - ((BubbleTextView) currentFocus).hasDeepShortcuts()) { + 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)); } diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java index e8127c45fd..34335330be 100644 --- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java @@ -36,6 +36,7 @@ import com.android.launcher3.dragndrop.DragController.DragListener; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.folder.Folder; import com.android.launcher3.popup.PopupContainerWithArrow; +import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.util.Thunk; import java.util.ArrayList; @@ -103,8 +104,7 @@ 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 && host instanceof BubbleTextView - && ((BubbleTextView) host).hasDeepShortcuts()) { + if (!fromKeyboard && DeepShortcutManager.supportsShortcuts(item)) { info.addAction(mActions.get(DEEP_SHORTCUTS)); } diff --git a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java index 2ad0edbbcc..816121995f 100644 --- a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java @@ -18,6 +18,7 @@ package com.android.launcher3.accessibility; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.ItemInfo; @@ -25,6 +26,7 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.notification.NotificationMainView; import com.android.launcher3.shortcuts.DeepShortcutView; import java.util.ArrayList; @@ -35,14 +37,23 @@ import java.util.ArrayList; */ public class ShortcutMenuAccessibilityDelegate extends LauncherAccessibilityDelegate { + private static final int DISMISS_NOTIFICATION = R.id.action_dismiss_notification; + public ShortcutMenuAccessibilityDelegate(Launcher launcher) { super(launcher); + mActions.put(DISMISS_NOTIFICATION, new AccessibilityAction(DISMISS_NOTIFICATION, + launcher.getText(R.string.action_dismiss_notification))); } @Override public void addSupportedActions(View host, AccessibilityNodeInfo info, boolean fromKeyboard) { if ((host.getParent() instanceof DeepShortcutView)) { info.addAction(mActions.get(ADD_TO_WORKSPACE)); + } else if (host instanceof NotificationMainView) { + NotificationMainView notificationView = (NotificationMainView) host; + if (notificationView.canChildBeDismissed(notificationView)) { + info.addAction(mActions.get(DISMISS_NOTIFICATION)); + } } } @@ -73,6 +84,14 @@ public class ShortcutMenuAccessibilityDelegate extends LauncherAccessibilityDele onComplete.run(); } return true; + } else if (action == DISMISS_NOTIFICATION) { + if (!(host instanceof NotificationMainView)) { + return false; + } + NotificationMainView notificationView = (NotificationMainView) host; + notificationView.onChildDismissed(notificationView); + announceConfirmation(R.string.notification_dismissed); + return true; } return false; } diff --git a/src/com/android/launcher3/notification/NotificationFooterLayout.java b/src/com/android/launcher3/notification/NotificationFooterLayout.java index 1eef743fe8..051c0333dc 100644 --- a/src/com/android/launcher3/notification/NotificationFooterLayout.java +++ b/src/com/android/launcher3/notification/NotificationFooterLayout.java @@ -141,6 +141,7 @@ public class NotificationFooterLayout extends FrameLayout { icon.setBackground(info.getIconForBackground(getContext(), mBackgroundColor)); icon.setOnClickListener(info); icon.setTag(info); + icon.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); mIconRow.addView(icon, 0, mIconLayoutParams); return icon; } diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java index dd272b3bc2..997def277d 100644 --- a/src/com/android/launcher3/notification/NotificationItemView.java +++ b/src/com/android/launcher3/notification/NotificationItemView.java @@ -77,6 +77,10 @@ public class NotificationItemView extends PopupItemView implements LogContainerP mSwipeHelper.setDisableHardwareLayers(true); } + public NotificationMainView getMainView() { + return mMainView; + } + public int getHeightMinusFooter() { int footerHeight = mFooter.getParent() == null ? 0 : mFooter.getHeight(); return getHeight() - footerHeight; diff --git a/src/com/android/launcher3/notification/NotificationMainView.java b/src/com/android/launcher3/notification/NotificationMainView.java index d6e0272fe2..0d6da77ee1 100644 --- a/src/com/android/launcher3/notification/NotificationMainView.java +++ b/src/com/android/launcher3/notification/NotificationMainView.java @@ -122,7 +122,7 @@ public class NotificationMainView extends FrameLayout implements SwipeHelper.Cal @Override public boolean canChildBeDismissed(View v) { - return mNotificationInfo.dismissable; + return mNotificationInfo != null && mNotificationInfo.dismissable; } @Override diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index d4ee3b8cba..ccead37dc8 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -114,7 +114,6 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra mStartDragThreshold = getResources().getDimensionPixelSize( R.dimen.deep_shortcuts_start_drag_threshold); - // TODO: make sure the delegate works for all items, not just shortcuts. mAccessibilityDelegate = new ShortcutMenuAccessibilityDelegate(mLauncher); mIsRtl = Utilities.isRtl(getResources()); } @@ -176,7 +175,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra // Add dummy views first, and populate with real info when ready. PopupPopulator.Item[] itemsToPopulate = PopupPopulator .getItemsToPopulate(shortcutIds, notificationKeys, systemShortcuts); - addDummyViews(originalIcon, itemsToPopulate, notificationKeys.size() > 1); + addDummyViews(itemsToPopulate, notificationKeys.size() > 1); measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); orientAboutIcon(originalIcon, arrowHeight + arrowVerticalOffset); @@ -187,7 +186,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra mNotificationItemView = null; mShortcutsItemView = null; itemsToPopulate = PopupPopulator.reverseItems(itemsToPopulate); - addDummyViews(originalIcon, itemsToPopulate, notificationKeys.size() > 1); + addDummyViews(itemsToPopulate, notificationKeys.size() > 1); measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); orientAboutIcon(originalIcon, arrowHeight + arrowVerticalOffset); @@ -204,6 +203,17 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra updateNotificationHeader(); } + int numShortcuts = shortcutViews.size() + systemShortcutViews.size(); + int numNotifications = notificationKeys.size(); + if (numNotifications == 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, + numNotifications, originalIcon.getContentDescription().toString())); + } + // Add the arrow. final int arrowHorizontalOffset = resources.getDimensionPixelSize(isAlignedWithStart() ? R.dimen.popup_arrow_horizontal_offset_start : @@ -225,8 +235,8 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra systemShortcuts, systemShortcutViews)); } - private void addDummyViews(BubbleTextView originalIcon, - PopupPopulator.Item[] itemTypesToPopulate, boolean notificationFooterHasIcons) { + private void addDummyViews(PopupPopulator.Item[] itemTypesToPopulate, + boolean notificationFooterHasIcons) { final Resources res = getResources(); final int spacing = res.getDimensionPixelSize(R.dimen.popup_items_spacing); final LayoutInflater inflater = mLauncher.getLayoutInflater(); @@ -243,12 +253,14 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra int footerHeight = notificationFooterHasIcons ? res.getDimensionPixelSize(R.dimen.notification_footer_height) : 0; item.findViewById(R.id.footer).getLayoutParams().height = footerHeight; + mNotificationItemView.getMainView().setAccessibilityDelegate(mAccessibilityDelegate); + } else if (itemTypeToPopulate == PopupPopulator.Item.SHORTCUT) { + item.setAccessibilityDelegate(mAccessibilityDelegate); } boolean shouldAddBottomMargin = nextItemTypeToPopulate != null && itemTypeToPopulate.isShortcut ^ nextItemTypeToPopulate.isShortcut; - item.setAccessibilityDelegate(mAccessibilityDelegate); if (itemTypeToPopulate.isShortcut) { if (mShortcutsItemView == null) { mShortcutsItemView = (ShortcutsItemView) inflater.inflate( @@ -266,9 +278,6 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra } } } - // TODO: update this, since not all items are shortcuts - setContentDescription(getContext().getString(R.string.shortcuts_menu_description, - numItems, originalIcon.getContentDescription().toString())); } protected PopupItemView getItemViewAt(int index) { From df39ca11d632434115a318120dc0e356918b4a4a Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 12 May 2017 14:33:17 -0700 Subject: [PATCH 076/446] Removing padding override in multi-window mode Bug: 37870754 Change-Id: Ia9fa51dccbd425874245bd312c0b0e087257fa81 --- src/com/android/launcher3/DeviceProfile.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index c32f2d5503..2d1ebf1145 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -231,9 +231,6 @@ public class DeviceProfile { profile.cellHeightPx = profile.iconSizePx + profile.iconDrawablePaddingPx + Utilities.calculateTextHeight(profile.iconTextSizePx); - // The nav bar is black so we add bottom padding to visually center hotseat icons. - profile.hotseatBarBottomPaddingPx = profile.hotseatBarTopPaddingPx; - // We use these scales to measure and layout the widgets using their full invariant profile // sizes and then draw them scaled and centered to fit in their multi-window mode cellspans. float appWidgetScaleX = (float) profile.getCellSize().x / getCellSize().x; From 3b6d403d36fad92a676667e62acdaabc4a9e96b8 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 12 May 2017 14:39:01 -0700 Subject: [PATCH 077/446] Keep elevation during the Folder clip animation. Change-Id: Id2a60de89d5f0fdf6a1173a08a89b9e95e757ea4 --- .../launcher3/anim/RoundedRectRevealOutlineProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java b/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java index a0d1f8b654..9c09477bbf 100644 --- a/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java +++ b/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java @@ -42,7 +42,7 @@ public class RoundedRectRevealOutlineProvider extends RevealOutlineAnimation { @Override public boolean shouldRemoveElevationDuringAnimation() { - return true; + return false; } @Override From 6d696f8d7c4ce933eaea4e8d86270ef6a1fc07c3 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Mon, 15 May 2017 10:16:12 -0700 Subject: [PATCH 078/446] Fixes a bug in verifying the validity of a session info. b/38276210 Change-Id: I4c89fb60b21d4dbc70efb91111ac16ec16bdea4f --- .../android/launcher3/compat/PackageInstallerCompatVL.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index bbf1546299..1ffd3da014 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -24,6 +24,7 @@ import android.content.pm.PackageInstaller.SessionInfo; import android.os.Handler; import android.os.Process; import android.os.UserHandle; +import android.text.TextUtils; import android.util.SparseArray; import com.android.launcher3.IconCache; @@ -151,7 +152,9 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { }; private PackageInstaller.SessionInfo verify(PackageInstaller.SessionInfo sessionInfo) { - if (sessionInfo == null || sessionInfo.getInstallerPackageName() == null) { + if (sessionInfo == null + || sessionInfo.getInstallerPackageName() == null + || TextUtils.isEmpty(sessionInfo.getAppPackageName())) { return null; } String pkg = sessionInfo.getInstallerPackageName(); From dc19a07aba37799746f451f829a38e072c011b15 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 12 May 2017 08:17:35 -0700 Subject: [PATCH 079/446] Adding support for top padding in BaseRecyclerView. The scrollbar is drawn below the top padding. Also adding callback for getting the all-apps vertical pull range so that it can be controlled by SearchUiManager Bug: 37616877 Change-Id: Ib4642073f3e92f6676caede3bddd652fda89c86f --- res/values/dimens.xml | 10 +--------- src/com/android/launcher3/BaseRecyclerView.java | 4 +++- .../launcher3/BaseRecyclerViewFastScrollBar.java | 5 ++++- .../launcher3/allapps/AllAppsContainerView.java | 8 ++++++++ .../launcher3/allapps/AllAppsGridAdapter.java | 5 ----- .../launcher3/allapps/AllAppsRecyclerView.java | 11 ++--------- .../allapps/AllAppsTransitionController.java | 14 ++++---------- .../launcher3/allapps/SearchUiManager.java | 10 ++++++++++ .../search/AppsSearchContainerLayout.java | 16 ++++++++++++++++ 9 files changed, 48 insertions(+), 35 deletions(-) diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 6add64d76a..b0f64a604d 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -48,11 +48,6 @@ 24dp - - 8dp - - 4dp - 5dp 9dp 18dp @@ -65,9 +60,6 @@ 0dp 48dp 60dp - 4dp - 1dp - 8dp 40dp 144dp 700dp @@ -146,7 +138,7 @@ 2dp 4dp 2dp - 2dp + 4dp 8dp diff --git a/src/com/android/launcher3/BaseRecyclerView.java b/src/com/android/launcher3/BaseRecyclerView.java index c056336158..1e6d894850 100644 --- a/src/com/android/launcher3/BaseRecyclerView.java +++ b/src/com/android/launcher3/BaseRecyclerView.java @@ -113,6 +113,7 @@ public abstract class BaseRecyclerView extends RecyclerView * it is already showing). */ private boolean handleTouchEvent(MotionEvent ev) { + ev.offsetLocation(0, -getPaddingTop()); int action = ev.getAction(); int x = (int) ev.getX(); int y = (int) ev.getY(); @@ -136,6 +137,7 @@ public abstract class BaseRecyclerView extends RecyclerView mScrollbar.handleTouchEvent(ev, mDownX, mDownY, mLastY); break; } + ev.offsetLocation(0, getPaddingTop()); return mScrollbar.isDraggingThumb(); } @@ -162,7 +164,7 @@ public abstract class BaseRecyclerView extends RecyclerView * Returns the height of the fast scroll bar */ protected int getScrollbarTrackHeight() { - return getHeight(); + return getHeight() - getPaddingTop() - getPaddingBottom(); } /** diff --git a/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java b/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java index 5feb42ea8b..3039744648 100644 --- a/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java +++ b/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java @@ -136,6 +136,7 @@ public class BaseRecyclerViewFastScrollBar { mTmpRect.set(drawLeft, mThumbOffsetY, drawLeft + mMaxWidth, mThumbOffsetY + mThumbHeight); mThumbOffsetY = y; mTmpRect.union(drawLeft, mThumbOffsetY, drawLeft + mMaxWidth, mThumbOffsetY + mThumbHeight); + mTmpRect.offset(0, mRv.getPaddingTop()); mRv.invalidate(mTmpRect); } @@ -148,8 +149,9 @@ public class BaseRecyclerViewFastScrollBar { return; } int left = getDrawLeft(); + int top = mRv.getPaddingTop(); // Invalidate the whole scroll bar area. - mRv.invalidate(left, 0, left + mMaxWidth, mRv.getScrollbarTrackHeight()); + mRv.invalidate(left, top, left + mMaxWidth, top + mRv.getScrollbarTrackHeight()); mWidth = width; updateThumbPath(); @@ -265,6 +267,7 @@ public class BaseRecyclerViewFastScrollBar { if (!mIsRtl) { canvas.translate(mRv.getWidth(), 0); } + canvas.translate(0, mRv.getPaddingTop()); // Draw the track int thumbWidth = mIsRtl ? mWidth : -mWidth; canvas.drawRect(0, 0, thumbWidth, mRv.getScrollbarTrackHeight(), mTrackPaint); diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 0ea61f4308..d9ee2c55af 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -245,6 +245,10 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc } } + public SearchUiManager getSearchUiManager() { + return mSearchUiManager; + } + @Override public View getTouchDelegateTargetView() { return mAppsRecyclerView; @@ -366,6 +370,10 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc @Override public void setInsets(Rect insets) { DeviceProfile grid = mLauncher.getDeviceProfile(); + mAppsRecyclerView.setPadding( + mAppsRecyclerView.getPaddingLeft(), mAppsRecyclerView.getPaddingTop(), + mAppsRecyclerView.getPaddingRight(), insets.bottom); + if (grid.isVerticalBarLayout()) { ViewGroup.MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams(); mlp.leftMargin = insets.left; diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java index e126102579..cfd04e2e02 100644 --- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java +++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java @@ -161,11 +161,6 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter Date: Fri, 31 Mar 2017 13:48:39 -0700 Subject: [PATCH 080/446] Add missing 'leave behind' view for new Folder animation. Bug: 35064148 Bug: 38338552 Change-Id: Iac1a795acf0ab21cf319e50d8b504cf42fbbb976 (cherry picked from commit 9544c8e49803742823a271cede8c29e0ec249ada) --- src/com/android/launcher3/folder/Folder.java | 10 +++++-- .../android/launcher3/folder/FolderIcon.java | 29 +++++++++++-------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 1601edb44e..c6bf3a1c13 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -34,7 +34,6 @@ import android.view.FocusFinder; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; -import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; import android.view.accessibility.AccessibilityEvent; @@ -633,6 +632,7 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC @Override public void onAnimationStart(Animator animation) { if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) { + mFolderIcon.drawLeaveBehindIfExists(); mFolderIcon.setVisibility(INVISIBLE); } @@ -723,8 +723,12 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC mFolderName.dispatchBackKey(); } - if (mFolderIcon != null && !FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) { - mFolderIcon.shrinkAndFadeIn(animate); + if (mFolderIcon != null) { + if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) { + mFolderIcon.clearLeaveBehindIfExists(); + } else { + mFolderIcon.shrinkAndFadeIn(animate); + } } if (!(getParent() instanceof DragLayer)) return; diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 1680f0bd7e..6e3db0b2d6 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -1174,28 +1174,21 @@ public class FolderIcon extends FrameLayout implements FolderListener { } public void shrinkAndFadeIn(boolean animate) { - final CellLayout cl = (CellLayout) getParent().getParent(); - ((CellLayout.LayoutParams) getLayoutParams()).canReorder = true; - // We remove and re-draw the FolderIcon in-case it has changed final PreviewImageView previewImage = PreviewImageView.get(getContext()); previewImage.removeFromParent(); copyToPreview(previewImage); - if (cl != null) { - cl.clearFolderLeaveBehind(); - } + clearLeaveBehindIfExists(); ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale(previewImage, 1, 1, 1); oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration)); oa.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - if (cl != null) { - // Remove the ImageView copy of the FolderIcon and make the original visible. - previewImage.removeFromParent(); - setVisibility(View.VISIBLE); - } + // Remove the ImageView copy of the FolderIcon and make the original visible. + previewImage.removeFromParent(); + setVisibility(View.VISIBLE); } }); oa.start(); @@ -1204,7 +1197,15 @@ public class FolderIcon extends FrameLayout implements FolderListener { } } - public void growAndFadeOut() { + public void clearLeaveBehindIfExists() { + ((CellLayout.LayoutParams) getLayoutParams()).canReorder = true; + if (mInfo.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + CellLayout cl = (CellLayout) getParent().getParent(); + cl.clearFolderLeaveBehind(); + } + } + + public void drawLeaveBehindIfExists() { CellLayout.LayoutParams lp = (CellLayout.LayoutParams) getLayoutParams(); // While the folder is open, the position of the icon cannot change. lp.canReorder = false; @@ -1212,6 +1213,10 @@ public class FolderIcon extends FrameLayout implements FolderListener { CellLayout cl = (CellLayout) getParent().getParent(); cl.setFolderLeaveBehindCell(lp.cellX, lp.cellY); } + } + + public void growAndFadeOut() { + drawLeaveBehindIfExists(); // Push an ImageView copy of the FolderIcon into the DragLayer and hide the original PreviewImageView previewImage = PreviewImageView.get(getContext()); From 8acf8b506d8c5db2ddcac825a24d0a3bda9fe100 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Thu, 11 May 2017 10:45:20 -0700 Subject: [PATCH 081/446] Design adjustments for transition from workspace to All apps. Change-Id: I0aeb8da7f0eebdf677ca7bda06fb538f08a6ee51 --- res/layout-land/launcher.xml | 4 +- res/layout-port/launcher.xml | 4 +- res/layout-sw720dp/launcher.xml | 4 +- res/layout/gradient_scrim.xml | 2 +- .../allapps/AllAppsTransitionController.java | 18 +++-- ...ialGradientView.java => GradientView.java} | 76 +++++++++---------- .../android/launcher3/graphics/ScrimView.java | 33 ++++++-- 7 files changed, 77 insertions(+), 64 deletions(-) rename src/com/android/launcher3/graphics/{RadialGradientView.java => GradientView.java} (65%) diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml index 565728cdcf..1e82f22761 100644 --- a/res/layout-land/launcher.xml +++ b/res/layout-land/launcher.xml @@ -32,8 +32,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + + - - + + - - + + - 0) { createRadialShader(); } @@ -110,14 +98,15 @@ public class RadialGradientView extends View { // only being called when colors change private void createRadialShader() { - float radius = Math.max(mHeight, mWidth) * mConfig.gradientCenterY; + final float gradientCenterY = 1.05f; + float radius = Math.max(mHeight, mWidth) * gradientCenterY; float posScreenBottom = (radius - mHeight) / radius; // center lives below screen RadialGradient shader = new RadialGradient( - mWidth * mConfig.gradientCenterX, - mHeight * mConfig.gradientCenterY, + mWidth * 0.5f, + mHeight * gradientCenterY, radius, - new int[] {mConfig.color1, mConfig.color1, mConfig.color2}, + new int[] {mColor1, mColor1, mColor2}, new float[] {0f, posScreenBottom, 1f}, Shader.TileMode.CLAMP); mPaint.setShader(shader); @@ -130,17 +119,22 @@ public class RadialGradientView extends View { @Override protected void onDraw(Canvas canvas) { - float head = mConfig.gradientHeadStartFactor; + float head = 0.29f; float linearProgress = head + (mProgress * (1f - head)); - float adjustProgress = mConfig.useGradientAlphaDecel - ? mDecelInterpolator.getInterpolation(linearProgress) - : linearProgress; - float startMaskY = (1f - adjustProgress) * mHeight - mMaskHeight * adjustProgress; - + float startMaskY = (1f - linearProgress) * mHeight - mMaskHeight * linearProgress; + float startAlpha = 100; + float interpolatedAlpha = (255 - startAlpha) * mAccelerator.getInterpolation(mProgress); + mPaint.setAlpha((int) (startAlpha + interpolatedAlpha)); mAlphaMaskRect.set(0, startMaskY, mWidth, startMaskY + mMaskHeight); mFinalMaskRect.set(0, startMaskY + mMaskHeight, mWidth, mHeight); canvas.drawBitmap(sAlphaGradientMask, null, mAlphaMaskRect, mPaint); canvas.drawBitmap(sFinalGradientMask, null, mFinalMaskRect, mPaint); + + if (DEBUG) { + mDebugPaint.setColor(0xFF00FF00); + canvas.drawLine(0, startMaskY, mWidth, startMaskY, mDebugPaint); + canvas.drawLine(0, startMaskY + mMaskHeight, mWidth, startMaskY + mMaskHeight, mDebugPaint); + } } } \ No newline at end of file diff --git a/src/com/android/launcher3/graphics/ScrimView.java b/src/com/android/launcher3/graphics/ScrimView.java index 521fbedd6f..feb3f030f0 100644 --- a/src/com/android/launcher3/graphics/ScrimView.java +++ b/src/com/android/launcher3/graphics/ScrimView.java @@ -26,18 +26,22 @@ import android.graphics.RectF; import android.support.v4.graphics.ColorUtils; import android.util.AttributeSet; import android.view.View; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.Interpolator; import com.android.launcher3.R; import com.android.launcher3.Utilities; public class ScrimView extends View { - // Config - private static final int MASK_HEIGHT_DP = 600; - private static final float MASK_START_LENGTH_FACTOR = 0.4f; + private static final boolean DEBUG = false; + + private static final int MASK_HEIGHT_DP = 300; + private static final float MASK_START_LENGTH_FACTOR = 1f; private static final float FINAL_ALPHA = 0.87f; private static final int SCRIM_COLOR = ColorUtils.setAlphaComponent( Color.WHITE, (int) (FINAL_ALPHA * 255)); + private static final boolean APPLY_ALPHA = true; private static Bitmap sFinalScrimMask; private static Bitmap sAlphaScrimMask; @@ -50,6 +54,8 @@ public class ScrimView extends View { private final RectF mFinalMaskRect = new RectF(); private final Paint mPaint = new Paint(); private float mProgress; + private final Interpolator mAccelerator = new AccelerateInterpolator(); + private final Paint mDebugPaint = DEBUG ? new Paint() : null; public ScrimView(Context context, AttributeSet attrs) { super(context, attrs); @@ -73,17 +79,22 @@ public class ScrimView extends View { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); mVisibleHeight = MeasureSpec.getSize(heightMeasureSpec); - int fullHeight = mVisibleHeight * 2 + mMaskHeight; - setMeasuredDimension(width, fullHeight); + setMeasuredDimension(width, mVisibleHeight * 2); setProgress(mProgress); } public void setProgress(float progress) { mProgress = progress; float initialY = mVisibleHeight - mHeadStart; - float fullTranslationY = mMaskHeight + initialY + mVisibleHeight; - float translationY = initialY - progress * fullTranslationY; - setTranslationY(translationY); + float fullTranslationY = mVisibleHeight; + float linTranslationY = initialY - progress * fullTranslationY; + setTranslationY(linTranslationY); + + if (APPLY_ALPHA) { + int alpha = 55 + (int) (200f * mAccelerator.getInterpolation(progress)); + mPaint.setAlpha(alpha); + invalidate(); + } } @Override @@ -92,6 +103,12 @@ public class ScrimView extends View { mFinalMaskRect.set(0, mMaskHeight, getWidth(), getHeight()); canvas.drawBitmap(sAlphaScrimMask, null, mAlphaMaskRect, mPaint); canvas.drawBitmap(sFinalScrimMask, null, mFinalMaskRect, mPaint); + + if (DEBUG) { + mDebugPaint.setColor(0xFF0000FF); + canvas.drawLine(0, mAlphaMaskRect.top, getWidth(), mAlphaMaskRect.top, mDebugPaint); + canvas.drawLine(0, mAlphaMaskRect.bottom, getWidth(), mAlphaMaskRect.bottom, mDebugPaint); + } } } From 0dc1db4feed74e1b5ba706d473e83c426482daaf Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 17 May 2017 11:34:33 -0700 Subject: [PATCH 082/446] Aligning the search box with bottom of hotseat icons Bug: 37616877 Change-Id: I153e754db8e6c96b47ab644e19ce110f56bf852e --- src/com/android/launcher3/DeviceProfile.java | 6 +++--- .../allapps/search/AppsSearchContainerLayout.java | 13 +++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 2d1ebf1145..508fc34065 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -113,9 +113,9 @@ public class DeviceProfile { public int hotseatCellHeightPx; public int hotseatIconSizePx; public int hotseatBarHeightPx; - private int hotseatBarTopPaddingPx; - private int hotseatBarBottomPaddingPx; - private int hotseatLandGutterPx; + public int hotseatBarTopPaddingPx; + public int hotseatBarBottomPaddingPx; + public int hotseatLandGutterPx; // All apps public int allAppsNumCols; diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java index f785e4cdb5..126a02c735 100644 --- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java +++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java @@ -16,6 +16,7 @@ package com.android.launcher3.allapps.search; import android.content.Context; +import android.graphics.Rect; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.Selection; @@ -29,6 +30,7 @@ import android.view.KeyEvent; import android.view.View; import android.widget.FrameLayout; +import com.android.launcher3.DeviceProfile; import com.android.launcher3.ExtendedEditText; import com.android.launcher3.Launcher; import com.android.launcher3.R; @@ -52,6 +54,7 @@ public class AppsSearchContainerLayout extends FrameLayout private final Launcher mLauncher; private final int mMinHeight; + private final int mSearchBoxHeight; private final AllAppsSearchBarController mSearchBarController; private final SpannableStringBuilder mSearchQueryBuilder; private final HeaderElevationController mElevationController; @@ -74,6 +77,8 @@ public class AppsSearchContainerLayout extends FrameLayout mLauncher = Launcher.getLauncher(context); mMinHeight = getResources().getDimensionPixelSize(R.dimen.all_apps_search_bar_height); + mSearchBoxHeight = getResources() + .getDimensionPixelSize(R.dimen.all_apps_search_bar_field_height); mSearchBarController = new AllAppsSearchBarController(); mElevationController = new HeaderElevationController(this); @@ -200,8 +205,12 @@ public class AppsSearchContainerLayout extends FrameLayout @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { - if (!mLauncher.getDeviceProfile().isVerticalBarLayout()) { - listener.onScrollRangeChanged(top); + DeviceProfile dp = mLauncher.getDeviceProfile(); + if (!dp.isVerticalBarLayout()) { + Rect insets = mLauncher.getDragLayer().getInsets(); + int hotseatBottom = bottom - dp.hotseatBarBottomPaddingPx - insets.bottom; + int searchTopMargin = insets.top + (mMinHeight - mSearchBoxHeight); + listener.onScrollRangeChanged(hotseatBottom - searchTopMargin); } else { listener.onScrollRangeChanged(bottom); } From 8b6ac00a1bd9ba5080e1fd5d3b5021d98711db88 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 16 May 2017 16:16:25 -0700 Subject: [PATCH 083/446] Adding an option to change the shadow size Change-Id: I8ec810c5cf06852771247af5f1d717f41079c4f5 --- res/drawable-v24/ic_info_shadow.xml | 3 ++- res/drawable-v24/ic_remove_shadow.xml | 3 ++- res/drawable-v24/ic_uninstall_shadow.xml | 3 ++- res/values/attrs.xml | 1 + res/values/dimens.xml | 2 +- .../launcher3/graphics/ShadowDrawable.java | 15 +++------------ 6 files changed, 11 insertions(+), 16 deletions(-) diff --git a/res/drawable-v24/ic_info_shadow.xml b/res/drawable-v24/ic_info_shadow.xml index 9bd7e16d0b..1fe2c46b4b 100644 --- a/res/drawable-v24/ic_info_shadow.xml +++ b/res/drawable-v24/ic_info_shadow.xml @@ -15,4 +15,5 @@ --> + android:src="@drawable/ic_info_no_shadow" + android:elevation="@dimen/drop_target_shadow_elevation" /> diff --git a/res/drawable-v24/ic_remove_shadow.xml b/res/drawable-v24/ic_remove_shadow.xml index 16a630e5fa..48abc10b3b 100644 --- a/res/drawable-v24/ic_remove_shadow.xml +++ b/res/drawable-v24/ic_remove_shadow.xml @@ -15,4 +15,5 @@ --> + android:src="@drawable/ic_remove_no_shadow" + android:elevation="@dimen/drop_target_shadow_elevation" /> diff --git a/res/drawable-v24/ic_uninstall_shadow.xml b/res/drawable-v24/ic_uninstall_shadow.xml index 2532157abc..b441b0e7b6 100644 --- a/res/drawable-v24/ic_uninstall_shadow.xml +++ b/res/drawable-v24/ic_uninstall_shadow.xml @@ -15,4 +15,5 @@ --> + android:src="@drawable/ic_uninstall_no_shadow" + android:elevation="@dimen/drop_target_shadow_elevation" /> diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 18759f817c..807d08af23 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -114,5 +114,6 @@ + diff --git a/res/values/dimens.xml b/res/values/dimens.xml index b0f64a604d..958cb6bc87 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -104,6 +104,7 @@ 14dp 14sp + 2dp 30dp @@ -138,7 +139,6 @@ 2dp 4dp 2dp - 4dp 8dp diff --git a/src/com/android/launcher3/graphics/ShadowDrawable.java b/src/com/android/launcher3/graphics/ShadowDrawable.java index 5e76649ca3..5f4fc6cc71 100644 --- a/src/com/android/launcher3/graphics/ShadowDrawable.java +++ b/src/com/android/launcher3/graphics/ShadowDrawable.java @@ -46,6 +46,7 @@ public class ShadowDrawable extends Drawable { private final ShadowDrawableState mState; + @SuppressWarnings("unused") public ShadowDrawable() { this(new ShadowDrawableState()); } @@ -98,17 +99,6 @@ public class ShadowDrawable extends Drawable { return mState.mIntrinsicWidth; } - /** - * Sets the color for the generated shadow - */ - public void setShadowColor(int color) { - if (mState.mShadowColor != color) { - mState.mShadowColor = color; - mState.mLastDrawnBitmap = null; - invalidateSelf(); - } - } - private void regenerateBitmapCache() { Bitmap bitmap = Bitmap.createBitmap(mState.mIntrinsicWidth, mState.mIntrinsicHeight, Bitmap.Config.ARGB_8888); @@ -154,7 +144,8 @@ public class ShadowDrawable extends Drawable { } mState.mShadowColor = a.getColor( R.styleable.ShadowDrawable_android_shadowColor, Color.BLACK); - mState.mShadowSize = r.getDimensionPixelSize(R.dimen.drawable_shadow_size); + mState.mShadowSize = a.getDimensionPixelSize( + R.styleable.ShadowDrawable_android_elevation, 0); mState.mIntrinsicHeight = d.getIntrinsicHeight() + 2 * mState.mShadowSize; mState.mIntrinsicWidth = d.getIntrinsicWidth() + 2 * mState.mShadowSize; From 4915614962327207b7334723801df58c6a51781a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 17 May 2017 17:08:22 -0700 Subject: [PATCH 084/446] Import translations. DO NOT MERGE Change-Id: I14925e787ac1adbf5aa2e89cebc6c5b3548c7fe4 Auto-generated-cl: translation import --- res/values-af/strings.xml | 9 +++++++-- res/values-am/strings.xml | 9 +++++++-- res/values-ar/strings.xml | 8 +++++++- res/values-az-rAZ/strings.xml | 9 +++++++-- res/values-b+sr+Latn/strings.xml | 9 +++++++-- res/values-be-rBY/strings.xml | 8 +++++++- res/values-bg/strings.xml | 8 +++++++- res/values-bn-rBD/config.xml | 13 ------------- res/values-bn-rBD/strings.xml | 9 ++++++++- res/values-bs-rBA/strings.xml | 18 ++++++++++++------ res/values-ca/strings.xml | 8 +++++++- res/values-cs/strings.xml | 9 +++++++-- res/values-da/strings.xml | 8 +++++++- res/values-de/strings.xml | 8 +++++++- res/values-el/strings.xml | 8 +++++++- res/values-en-rAU/strings.xml | 9 +++++++-- res/values-en-rGB/strings.xml | 9 +++++++-- res/values-en-rIN/strings.xml | 9 +++++++-- res/values-es-rUS/strings.xml | 8 +++++++- res/values-es/strings.xml | 8 +++++++- res/values-et-rEE/strings.xml | 9 +++++++-- res/values-eu-rES/strings.xml | 8 +++++++- res/values-fa/strings.xml | 8 +++++++- res/values-fi/strings.xml | 9 +++++++-- res/values-fr-rCA/strings.xml | 8 +++++++- res/values-fr/strings.xml | 8 +++++++- res/values-gl-rES/strings.xml | 8 +++++++- res/values-gu-rIN/config.xml | 13 ------------- res/values-gu-rIN/strings.xml | 9 ++++++++- res/values-hi/strings.xml | 9 +++++++-- res/values-hr/strings.xml | 8 +++++++- res/values-hu/strings.xml | 9 +++++++-- res/values-hy-rAM/strings.xml | 8 +++++++- res/values-in/strings.xml | 11 ++++++++--- res/values-is-rIS/strings.xml | 9 +++++++-- res/values-it/strings.xml | 9 +++++++-- res/values-iw/strings.xml | 8 +++++++- res/values-ja/strings.xml | 8 +++++++- res/values-ka-rGE/strings.xml | 9 +++++++-- res/values-kk-rKZ/strings.xml | 9 +++++++-- res/values-km-rKH/strings.xml | 8 +++++++- res/values-kn-rIN/config.xml | 13 ------------- res/values-kn-rIN/strings.xml | 9 ++++++++- res/values-ko/strings.xml | 8 +++++++- res/values-ky-rKG/strings.xml | 9 +++++++-- res/values-lo-rLA/strings.xml | 9 +++++++-- res/values-lt/strings.xml | 8 +++++++- res/values-lv/strings.xml | 8 +++++++- res/values-mk-rMK/strings.xml | 9 +++++++-- res/values-ml-rIN/config.xml | 13 ------------- res/values-ml-rIN/strings.xml | 11 +++++++++-- res/values-mn-rMN/strings.xml | 8 +++++++- res/values-mr-rIN/config.xml | 13 ------------- res/values-mr-rIN/strings.xml | 9 ++++++++- res/values-ms-rMY/strings.xml | 8 +++++++- res/values-my-rMM/strings.xml | 9 +++++++-- res/values-nb/strings.xml | 8 +++++++- res/values-ne-rNP/config.xml | 13 ------------- res/values-ne-rNP/strings.xml | 9 ++++++++- res/values-nl/strings.xml | 9 +++++++-- res/values-pa-rIN/config.xml | 13 ------------- res/values-pa-rIN/strings.xml | 9 ++++++++- res/values-pl/strings.xml | 8 +++++++- res/values-pt-rPT/strings.xml | 9 +++++++-- res/values-pt/strings.xml | 8 +++++++- res/values-ro/strings.xml | 8 +++++++- res/values-ru/strings.xml | 8 +++++++- res/values-si-rLK/strings.xml | 8 +++++++- res/values-sk/strings.xml | 8 +++++++- res/values-sl/strings.xml | 8 +++++++- res/values-sq-rAL/strings.xml | 9 +++++++-- res/values-sr/strings.xml | 9 +++++++-- res/values-sv/strings.xml | 9 +++++++-- res/values-sw/strings.xml | 9 +++++++-- res/values-ta-rIN/strings.xml | 9 +++++++-- res/values-te-rIN/config.xml | 13 ------------- res/values-te-rIN/strings.xml | 9 ++++++++- res/values-th/strings.xml | 8 +++++++- res/values-tl/strings.xml | 8 +++++++- res/values-tr/strings.xml | 8 +++++++- res/values-uk/strings.xml | 9 +++++++-- res/values-ur-rPK/config.xml | 7 +++---- res/values-ur-rPK/strings.xml | 8 +++++++- res/values-uz-rUZ/strings.xml | 8 +++++++- res/values-vi/strings.xml | 8 +++++++- res/values-zh-rCN/strings.xml | 16 +++++++++++----- res/values-zh-rHK/strings.xml | 8 +++++++- res/values-zh-rTW/strings.xml | 8 +++++++- res/values-zu/strings.xml | 8 +++++++- 89 files changed, 582 insertions(+), 228 deletions(-) delete mode 100644 res/values-bn-rBD/config.xml delete mode 100644 res/values-gu-rIN/config.xml delete mode 100644 res/values-kn-rIN/config.xml delete mode 100644 res/values-ml-rIN/config.xml delete mode 100644 res/values-mr-rIN/config.xml delete mode 100644 res/values-ne-rNP/config.xml delete mode 100644 res/values-pa-rIN/config.xml delete mode 100644 res/values-te-rIN/config.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index cfc27877c7..eafc506583 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -76,12 +76,17 @@ "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" + + + + + + "Voeg ikoon by tuisskerm" "Vir nuwe programme" - - + "Gebruik stelselverstek" "Onbekend" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 3ae9666258..0482f54c3a 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -76,12 +76,17 @@ "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "ስልኩ ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" + + + + + + "አዶ ወደ የመነሻ ማያ ገጽ አክል" "ለአዲስ መተግበሪያዎች" - - + "የሥርዓቱን ነባሪ ተጠቀም" "የማይታወቅ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 9c2167abea..a2b13cda1d 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -76,11 +76,17 @@ "السماح بتدوير الشاشة الرئيسية" "عند تدوير الهاتف" "لا يسمح إعداد العرض الحالي بالتدوير" + + + + + + "إضافة رمز إلى الشاشة الرئيسية" "للتطبيقات الجديدة" - + diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 5cbe408522..e7d0b2f484 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -76,12 +76,17 @@ "Əsas ekranın firlanmağına icazə verin" "Telefon çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" + + + + + + "Əsas ekrana ikona əlavə edin" "Yeni tətbiqlər üçün" - - + "Sistem defoltu istifadə edin" "Naməlum" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 1a9ad2a075..7638a0e34f 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -76,12 +76,17 @@ "Dozvoli rotaciju početnog ekrana" "Kada se telefon rotira" "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" + + + + + + "Dodaj ikonu na početni ekran" "Za nove aplikacije" - - + "Koristi podrazumevano sistemsko podešavanje" "Nepoznato" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index b820f59fa9..3438026eb3 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -76,11 +76,17 @@ "Дазволіць паварот галоўнага экрана" "Пры павароце тэлефона" "Бягучая налада дысплэя не прадугледжвае паварот" + + + + + + "Дадаць значок на Галоўны экран" "Для новых праграм" - + diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 8dc1e10927..ba275a60d8 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -76,11 +76,17 @@ "Разрешаване на завъртането на началния екран" "При завъртане на телефона" "Текущата настройка на екрана не разрешава завъртане" + + + + + + "Добавяне на икона към началния екран" "За нови приложения" - + diff --git a/res/values-bn-rBD/config.xml b/res/values-bn-rBD/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-bn-rBD/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 065019a29f..3b233dcc97 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -76,10 +76,17 @@ "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "যখন ফোনটি ঘোরানো হয়" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" + + + + + + "হোম স্ক্রিনে আইকন যোগ করুন" "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" - "পরিবর্তন করবেন না" + + "আইকনের আকৃতি পরিবর্তন করা হচ্ছে" "অজানা" "সরান" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 63aaaba58d..ca880e7015 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -57,17 +57,17 @@ "Problem pri učitavanju dodatka" "Postavljanje" "Ovo je sistemska aplikacija i ne može se deinstalirati." - "Neimenovana fascikla" + "Neimenovani folder" "Aplikacija %1$s je onemogućena" "Strana %1$d od %2$d" "Početni ekran %1$d od %2$d" "Nova stranica početnog ekrana" - "Fascikla je otvorena, (š) %1$d (v) %2$d" + "Folder je otvoren, (š) %1$d (v) %2$d" "Dodirnite da zatvorite folder" "Dodirnite da sačuvate promjenu imena" - "Fascikla je zatvorena" - "Ime fascikle je promijenjeno u %1$s" - "Fascikla: %1$s" + "Folder je zatvoren" + "Ime foldera je promijenjeno u %1$s" + "Folder: %1$s" "Dodaci" "Pozadinske slike" "Postavke" @@ -76,11 +76,17 @@ "Dozvoli rotiranje početnog ekrana" "Kada se telefon zarotira" "Trenutne postavke ekrana ne dozvoljavaju rotiranje" + + + + + + "Dodajte ikonu na početni ekran" "Za nove aplikacije" - + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index bfbd31ebdd..a59d64555f 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -76,11 +76,17 @@ "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" + + + + + + "Afegeix la icona a la pantalla d\'inici" "Per a les aplicacions noves" - + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 7c61023060..9d9065e5d5 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -76,12 +76,17 @@ "Povolit otáčení plochy" "Při otočení telefonu" "Aktuální nastavení displeje neumožňuje otáčení" + + + + + + "Přidat ikonu na plochu" "Pro nové aplikace" - - + "Použít výchozí nastavení systému" "Neznámé" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 65e513451a..60f08fbbb4 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -76,11 +76,17 @@ "Tillad rotation af startskærmen" "Når telefonen roteres" "Den aktuelle indstilling for visning tillader ikke rotation" + + + + + + "Føj ikon til startskærmen" "For nye apps" - + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 59ce70c9c6..2a022f7887 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -76,11 +76,17 @@ "Drehung des Startbildschirms zulassen" "Bei Drehung des Smartphones" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" + + + + + + "Symbol zu Startbildschirm hinzufügen" "Für neue Apps" - + diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index d8da34b403..28ed6febda 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -76,11 +76,17 @@ "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν το τηλέφωνο περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" + + + + + + "Προσθήκη εικονιδίου στην Αρχική οθόνη" "Για νέες εφαρμογές" - + diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index ecfb0f5478..03309f23be 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -76,12 +76,17 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" + + + + + + "Add icon to Home screen" "For new apps" - - + "Use system default" "Unknown" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index ecfb0f5478..03309f23be 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -76,12 +76,17 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" + + + + + + "Add icon to Home screen" "For new apps" - - + "Use system default" "Unknown" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index ecfb0f5478..03309f23be 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -76,12 +76,17 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" + + + + + + "Add icon to Home screen" "For new apps" - - + "Use system default" "Unknown" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 4a57396168..477edb766b 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -76,11 +76,17 @@ "Permitir la rotación de la pantalla principal" "Al girar el teléfono" "La configuración actual no permite la rotación de la pantalla" + + + + + + "Agregar ícono a la pantalla principal" "Para nuevas apps" - + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 3db1aa8ffd..ae91ae8b05 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -76,11 +76,17 @@ "Permitir rotación de la pantalla de inicio" "Al girar el teléfono" "La configuración de pantalla actual no permite girar la pantalla" + + + + + + "Añadir icono a la pantalla de inicio" "Para nuevas aplicaciones" - + diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 91a7333186..2477822733 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -76,12 +76,17 @@ "Luba avaekraani pööramine" "Kui telefoni pööratakse" "Praegune kuvaseade ei luba pööramist" + + + + + + "Lisa ikoon avaekraanile" "Uute rakenduste puhul" - - + "Kasuta süsteemi vaikeseadet" "Teadmata" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 1a4d809432..2f14129399 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -76,11 +76,17 @@ "Baimendu hasierako pantaila biratzea" "Telefonoa biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" + + + + + + "Gehitu ikonoa hasierako pantailan" "Aplikazio berrietan" - + diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 3a9a85af7d..8a9c5faac2 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -76,11 +76,17 @@ "امکان دادن به چرخش صفحه اصلی" "وقتی تلفن چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" + + + + + + "افزودن نماد به صفحه اصلی" "برای برنامه‌های جدید" - + diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 6e4bc934ec..7ac250306b 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -76,12 +76,17 @@ "Salli aloitusnäytön kiertäminen" "Kun puhelinta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." + + + + + + "Lisää kuvake aloitusruutuun" "Uusille sovelluksille" - - + "Käytä järjestelmän oletusarvoa" "Tuntematon" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index a9f294726e..24e4fc0be4 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -76,11 +76,17 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le mode d\'affichage actuel ne permet pas le pivotement" + + + + + + "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" - + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 2d7a38c039..ad3110bf45 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -76,11 +76,17 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." + + + + + + "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" - + diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index e8213b51d2..5f79c808b6 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -76,11 +76,17 @@ "Permitir xirar a pantalla de inicio" "Ao xirar o teléfono" "A configuración de visualización actual non permite xirar a pantalla" + + + + + + "Engadir icona á pantalla de inicio" "Para novas aplicacións" - + diff --git a/res/values-gu-rIN/config.xml b/res/values-gu-rIN/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-gu-rIN/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index aa4992db7a..4bbebb713c 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -76,10 +76,17 @@ "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" + + + + + + "હોમ સ્ક્રીન પર આઇકન ઉમેરો" "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" - "બદલશો નહીં" + + "આઇકનના આકારમાં કરેલ ફેરફારો લાગુ કરી રહ્યા છીએ" "અજાણ્યો" "દૂર કરો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index ba03a92675..25a204bb6f 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -76,12 +76,17 @@ "होमस्क्रीन घुमाने की अनुमति दें" "फ़ोन घुुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" + + + + + + "होम स्क्रीन में आइकन जोड़ें" "नए ऐप्लिकेशन के लिए" - - + "सिस्टम डिफ़ॉल्ट का उपयोग करें" "अज्ञात" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index b6448f1e74..8f288cf547 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -76,11 +76,17 @@ "Dopusti zakretanje početnog zaslona" "Kada se telefon zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" + + + + + + "Dodaj ikonu na početni zaslon" "Za nove aplikacije" - + diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 45a50544cc..3fb2c55c04 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -76,12 +76,17 @@ "A kezdőképernyő elforgatásának engedélyezése" "A telefon elforgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" + + + + + + "Ikon hozzáadása a kezdőképernyőhöz" "Új alkalmazásoknál" - - + "Alapértelmezett érték használata" "Ismeretlen" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 7c39a3f182..7b917f7e9b 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -76,11 +76,17 @@ "Թույլ տալ հիմնական էկրանի պտտումը" "Հեռախոսը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" + + + + + + "Ավելացնել պատկերակը Հիմնական էկրանին" "Նոր հավելվածների համար" - + diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 4d26ab36b9..ae1561b0c3 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -45,7 +45,7 @@ "Daftar aplikasi" "Layar Utama" "Hapus" - "Copot pemasangan" + "Uninstal" "Info aplikasi" "memasang pintasan" "Mengizinkan aplikasi menambahkan pintasan tanpa campur tangan pengguna." @@ -76,12 +76,17 @@ "Izinkan layar Utama diputar" "Saat ponsel diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" + + + + + + "Tambahkan ikon ke layar Utama" "Untuk aplikasi baru" - - + "Gunakan default sistem" "Tidak dikenal" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 3694a10e43..6a4dd03923 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -76,12 +76,17 @@ "Leyfa snúning fyrir heimaskjá" "Þegar símanum er snúið" "Núverandi skjástilling leyfir ekki snúning" + + + + + + "Bæta tákni á heimaskjáinn" "Fyrir ný forrit" - - + "Nota sjálfgildi kerfis" "Óþekkt" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 12088740d4..bbd99e891c 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -76,12 +76,17 @@ "Consenti rotazione della schermata Home" "Con il telefono ruotato" "L\'impostazione corrente del display non consente la rotazione" + + + + + + "Aggiungi icone alla schermata Home" "Per le nuove app" - - + "Usa impostazione predefinita di sistema" "Sconosciuto" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 858abfd4f3..ccd6f0d866 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -76,11 +76,17 @@ "אפשרות סיבוב של מסך דף הבית" "כאשר הטלפון מסובב" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" + + + + + + "הוספת סמל במסך דף הבית" "לאפליקציות חדשות" - + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 846b884a6c..77c6b26f1f 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -76,11 +76,17 @@ "ホーム画面の回転を許可" "スマートフォンが回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" + + + + + + "ホーム画面にアイコンを追加" "新しいアプリをダウンロードしたときに" - + diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 197944936a..9db1b03add 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -76,12 +76,17 @@ "მთავარი ეკრანის შეტრიალების დაშვება" "ტელეფონის შეტრიალებისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" + + + + + + "ხატულას მთავარ ეკრანზე დამატება" "ახალი აპებისთვის" - - + "ნაგულისხმევი სისტემური პარამეტრების გამოყენება" "უცნობი" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 5df503a103..5df229351b 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -76,12 +76,17 @@ "Негізгі экранның бұрылуына рұқсат ету" "Телефон бұрылғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" + + + + + + "Негізгі экранға белгіше енгізу" "Жаңа қолданбаларға арналған" - - + "Жүйенің әдепкі параметрін пайдалану" "Белгісіз" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index a64b604cb1..8e1841e623 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -76,11 +76,17 @@ "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" + + + + + + "បញ្ចូល​រូបតំណាង​ទៅ​អេក្រង់​ដើម" "សម្រាប់កម្មវិធីថ្មី" - + diff --git a/res/values-kn-rIN/config.xml b/res/values-kn-rIN/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-kn-rIN/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index b22af0de8b..7ef8fb1b11 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -76,10 +76,17 @@ "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" + + + + + + "ಮುಖಪುಟದ ಪರದೆಗೆ ಐಕಾನ್ ಸೇರಿಸಿ" "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" - "ಬದಲಿಸಬೇಡಿ" + + "ಐಕಾನ್ ಆಕಾರ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತಿದೆ" "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 9e1eba4c0b..66bd05db83 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -76,11 +76,17 @@ "홈 화면 회전 허용" "휴대전화 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." + + + + + + "홈 화면에 아이콘 추가" "새로 설치한 앱에 적용" - + diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index cfdcc18847..7ea2df5cb7 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -76,12 +76,17 @@ "Башкы экранды айлантууга уруксат берүү" "Телефон айланганда" "Экранды айлантуу параметри өчүрүлгөн" + + + + + + "Башкы экранга сүрөтчө кошуу" "Жаңы колдонмолор үчүн" - - + "Тутум сушунтаган демейкисин колдонуу" "Белгисиз" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 334305afe1..3e78b0b052 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -76,12 +76,17 @@ "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນໂທລະສັບ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" + + + + + + "ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ" "ສຳລັບແອັບໃໝ່" - - + "ໃຊ້ຄ່າເລີ່ມຕົ້ນລະບົບ" "​ບໍ່​ຮູ້​ຈັກ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 558e1a9494..dd23f7aef1 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -76,11 +76,17 @@ "Leisti pasukti pagrindinį ekraną" "Kai telefonas pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" + + + + + + "Pridėti piktogr. prie pagrindinio ekrano" "Skirta naujoms programoms" - + diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 733d647605..0a1fe92373 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -76,11 +76,17 @@ "Atļaut sākuma ekrāna pagriešanu" "Pagriežot tālruni" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." + + + + + + "Pievienot ikonu sākuma ekrānā" "Jaunām lietotnēm" - + diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 267e75b98d..ccec8c69a7 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -76,12 +76,17 @@ "Дозволете ротација на Почетниот екран" "Кога телефонот се ротира" "Тековната поставка на Екранот не дозволува ротација" + + + + + + "Додајте икона на почетниот екран" "За нови апликации" - - + "Користи ја стандардната поставка на системот" "Непознато" diff --git a/res/values-ml-rIN/config.xml b/res/values-ml-rIN/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-ml-rIN/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index a92fc03568..fc4da03c4b 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -36,7 +36,7 @@ "സ്വമേധയാ സ്ഥാപിക്കുന്നതിന് സ്‌പർശിച്ചുപിടിക്കുക" "സ്വയമേവ ചേർക്കുക" "ആപ്പുകളെ തിരയുക" - "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." + "ആപ്പുകൾ ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" "കൂടുതൽ ആപ്പുകൾക്ക് തിരയുക" "അറിയിപ്പുകൾ" @@ -76,10 +76,17 @@ "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" + + + + + + "ഹോം സ്ക്രീനിലേക്ക് ഐക്കൺ ചേർക്കുക" "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" - "മാറ്റരുത്" + + "ഐക്കൺ ആകാര മാറ്റങ്ങൾ പ്രയോഗിക്കുന്നു" "അജ്ഞാതം" "നീക്കംചെയ്യുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 5b74fd2049..99bd09385c 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -76,11 +76,17 @@ "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Утсыг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" + + + + + + "Нүүр хуудаст дүрс тэмдэг нэмэх" "Шинэ аппад зориулсан" - + diff --git a/res/values-mr-rIN/config.xml b/res/values-mr-rIN/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-mr-rIN/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 1a10e4b571..77ae9d3d8b 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -76,10 +76,17 @@ "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "फोन फिरविला जातो तेव्हा" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" + + + + + + "मुख्य स्क्रीनवर चिन्ह जोडा" "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" - "बदलू नका" + + "चिन्हाचा आकार बदल लागू करत आहे" "अज्ञात" "काढा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 756a2cf2f2..d45af42370 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -76,11 +76,17 @@ "Benarkan putaran Skrin Utama" "Apabila telefon diputar" "Tetapan Paparan semasa tidak membenarkan putaran" + + + + + + "Tambahkan ikon pada Skrin Utama" "Untuk apl baharu" - + diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 449aae8e02..b5e76743f5 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -76,12 +76,17 @@ "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" "ဖုန်းကိုလှည့်ထားစဉ်" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" + + + + + + "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" "အက်ပ်အသစ်များအတွက်" - - + "စနစ်၏ မူရင်းပုံကို အသုံးပြုရန်" "မသိရ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 6c70038bb5..072cd27123 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -76,11 +76,17 @@ "Tillat rotasjon av startskjermen" "Når telefonen roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" + + + + + + "Legg til ikon på startsiden" "For nye apper" - + diff --git a/res/values-ne-rNP/config.xml b/res/values-ne-rNP/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-ne-rNP/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 46c8f9ceae..37ebc24209 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -76,10 +76,17 @@ "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "फोनलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" + + + + + + "गृह स्क्रिनमा आइकन थप्नुहोस्" "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" - "परिवर्तन नगर्नुहोस्" + + "आइकनको आकारमा गरिएका परिवर्तनहरू लागू गरिँदैछन्" "अज्ञात" "हटाउनुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e8caeb448f..4f2ba93be0 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -76,12 +76,17 @@ "Draaien van startscherm toestaan" "Wanneer de telefoon gedraaid is" "Huidige scherminstelling staat draaien niet toe" + + + + + + "Pictogram toevoegen aan startscherm" "Voor nieuwe apps" - - + "Systeemstandaard gebruiken" "Onbekend" diff --git a/res/values-pa-rIN/config.xml b/res/values-pa-rIN/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-pa-rIN/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index c4c11ce04e..4998b9243c 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -76,10 +76,17 @@ "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" + + + + + + "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" - "ਨਾ ਬਦਲੋ" + + "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index e611fcd9a8..0c3a24aea2 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -76,11 +76,17 @@ "Zezwalaj na obrót ekranu głównego" "Po obróceniu telefonu" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" + + + + + + "Dodaj ikonę do ekranu głównego" "W przypadku nowych aplikacji" - + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 0aa987bdac..d06cea653b 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -76,12 +76,17 @@ "Permitir rotação do ecrã principal" "Quando o telemóvel é rodado" "A definição de visualização atual não permite a rotação" + + + + + + "Adicionar ícone ao ecrã principal" "Para novas aplicações" - - + "Utilizar a predefinição do sistema" "Desconhecido" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 39a16515f1..bdc2e83e6c 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -76,11 +76,17 @@ "Permitir rotação da tela inicial" "Quando o smartphone for girado" "A configuração atual de exibição não permite rotação" + + + + + + "Adicionar ícone à tela inicial" "Para novos apps" - + diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index c7c0994a36..e2409f9c9c 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -76,11 +76,17 @@ "Permiteți rotirea ecranului de pornire" "Când telefonul este rotit" "Setarea actuală a afișajului nu permite rotirea" + + + + + + "Adaugă pictograme în ecranul de pornire" "Pentru aplicații noi" - + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index acb49d5987..0fb44c1c88 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -76,11 +76,17 @@ "Разрешить поворачивать главный экран" "Когда телефон повернут" "В настройках отключен поворот экрана" + + + + + + "Добавлять значки" "Добавлять значки установленных приложений на главный экран." - + diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 569a77f003..1c74f7c6c6 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -76,11 +76,17 @@ "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "දුරකථනය කරකවන විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" + + + + + + "මුල් පිටු තිරය වෙත අයිකනය එක් කරන්න" "නව යෙදුම් සඳහා" - + diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index dd03fd6f3c..1b66f0cda4 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -76,11 +76,17 @@ "Povoliť otáčanie plochy" "Pri otočení telefónu" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" + + + + + + "Pridať ikonu na plochu" "Pri inštalácii novej aplikácie" - + diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index f8761d2af7..6717b31995 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -76,11 +76,17 @@ "Omogočanje sukanja začetnega zaslona" "Ko se telefon zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" + + + + + + "Dodaj ikono na začetni zaslon" "Za nove aplikacije" - + diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 2b656840d7..dc7bff638f 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -76,12 +76,17 @@ "Lejo rrotullimin e ekranit kryesor" "Kur telefoni rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" + + + + + + "Shto ikonë në ekranin bazë" "Për aplikacionet e reja" - - + "Përdor parazgjedhjen e sisteit" "I panjohur" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index ac2114266f..49ea52234d 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -76,12 +76,17 @@ "Дозволи ротацију почетног екрана" "Када се телефон ротира" "Актуелно подешавање приказа не дозвољава ротацију" + + + + + + "Додај икону на почетни екран" "За нове апликације" - - + "Користи подразумевано системско подешавање" "Непознато" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 7d6e053690..b74abd731d 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -76,12 +76,17 @@ "Tillåt rotering av startskärmen" "När mobilen vrids" "Rotering tillåts inte i de nuvarande skärminställningarna" + + + + + + "Lägg till ikonen på startskärmen" "För nya appar" - - + "Använd systemstandard" "Okänt" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 62e3385342..375e843d84 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -78,12 +78,17 @@ "Ruhusu kuzungusha skrini ya Kwanza" "Simu inapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" + + + + + + "Ongeza aikoni kwenye Skrini ya kwanza" "Kwa ajili ya programu mpya" - - + "Tumia umbo chaguo-msingi la mfumo" "Yasiyojulikana" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index a1e00a11dc..af052cbc52 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -76,12 +76,17 @@ "முகப்புத் திரை சுழற்சியை அனுமதி" "மொபைலைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" + + + + + + "முகப்புத் திரையில் ஐகானைச் சேர்" "புதிய பயன்பாடுகளுக்கு" - - + "அமைப்பின் இயல்புநிலையைப் பயன்படுத்து" "தெரியாதது" diff --git a/res/values-te-rIN/config.xml b/res/values-te-rIN/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-te-rIN/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 65ca927753..ded39cc601 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -76,10 +76,17 @@ "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "ఫోన్‌‌ను తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" + + + + + + "హోమ్ స్క్రీన్‌కి చిహ్నాన్ని జోడించు" "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" - "మార్చవద్దు" + + "చిహ్న ఆకార మార్పులను వర్తింపజేస్తోంది" "తెలియదు" "తీసివేయి" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index fb7b587152..0c5f72b20d 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -76,11 +76,17 @@ "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนโทรศัพท์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" + + + + + + "เพิ่มไอคอนในหน้าจอหลัก" "สำหรับแอปใหม่" - + diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index d18bd1e974..e946dfd9a4 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -76,11 +76,17 @@ "Payagan ang pag-rotate ng Home screen" "Kailan maro-rotate ang telepono" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" + + + + + + "Idagdag ang icon sa Home screen" "Para sa mga bagong app" - + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 0c655fd7cd..47d083f9a1 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -76,11 +76,17 @@ "Ana ekranı döndürmeye izin ver" "Telefon döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" + + + + + + "Ana ekrana simge ekle" "Yeni uygulamalar için" - + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 8679628c29..7c954daf19 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -76,12 +76,17 @@ "Дозволити обертання головного екрана" "Коли телефон обертається" "Поточні налаштування дисплея не підтримують обертання" + + + + + + "Додати значок на головний екран" "Для нових додатків" - - + "Використовувати налаштування системи за умовчанням" "Невідомо" diff --git a/res/values-ur-rPK/config.xml b/res/values-ur-rPK/config.xml index 56f98c3563..7ee78d01b5 100644 --- a/res/values-ur-rPK/config.xml +++ b/res/values-ur-rPK/config.xml @@ -4,10 +4,9 @@ "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 29d1cd53cd..c84f5c92fd 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -76,10 +76,16 @@ "ہوم اسکرین گھمانے کی اجازت دیں" "جب فون گھمایا جاتا ہے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" + + + + + + "آئیکن کو ہوم اسکرین میں شامل کریں" "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" - "تبدیل نہ کریں" + "سسٹم ڈیفالٹ کا استعمال کریں" "آئيکن کی شکل کی تبدیلیاں لاگو ہو رہی ہیں" "نامعلوم" "ہٹائیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 81be979cc6..4fa0645371 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -76,11 +76,17 @@ "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" + + + + + + "Bosh ekranga ikonka qo‘shish" "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" - + diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 5fc9542d1e..dea2788b95 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -76,11 +76,17 @@ "Cho phép xoay Màn hình chính" "Khi xoay điện thoại" "Cài đặt Hiển thị hiện tại không cho phép xoay" + + + + + + "Thêm biểu tượng vào màn hình chính" "Cho ứng dụng mới" - + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index a6f8bf4d3b..4ddc17f818 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -29,8 +29,8 @@ "无法使用快捷方式" "主屏幕" "自定义操作" - "触摸并按住小部件即可选择。" - "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" + "触摸并按住微件即可选择。" + "点按两次并按住微件即可选择微件,您也可以使用自定义操作。" "%1$d × %2$d" "宽 %1$d,高 %2$d" "触摸并按住即可手动放置" @@ -54,7 +54,7 @@ "写入主屏幕设置和快捷方式" "允许应用更改主屏幕中的设置和快捷方式。" "不允许使用“%1$s”拨打电话" - "加载小部件时出现问题" + "加载微件时出现问题" "设置" "这是系统应用,无法卸载。" "未命名文件夹" @@ -76,11 +76,17 @@ "允许旋转主屏幕" "手机旋转时" "当前的显示设置不允许旋转设备" + + + + + + "将图标添加到主屏幕" "适用于新应用" - + @@ -115,7 +121,7 @@ "增加高度" "减小宽度" "减小高度" - "小部件尺寸已调整为:宽度 %1$s,高度 %2$s" + "微件尺寸已调整为:宽度 %1$s,高度 %2$s" "快捷方式" "%2$s%1$d 个快捷方式" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 867c350ebd..2c369850b9 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -76,11 +76,17 @@ "允許主畫面旋轉" "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" + + + + + + "將圖示加到主畫面" "適用於新安裝的應用程式" - + diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index ee92cf1675..ef48e1fb03 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -76,11 +76,17 @@ "允許旋轉主螢幕" "當手機旋轉時" "目前的顯示設定不允許旋轉畫面" + + + + + + "將圖示加到主螢幕" "適用於新安裝的應用程式" - + diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index aa918b3f2b..3330ef4eab 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -76,11 +76,17 @@ "Vumela ukuphendukiswa kwesikrini sasekhaya" "Uma ifoni iphendukiswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" + + + + + + "Engeza isithonjana eskrinini sasekhaya" "Kwezinhlelo zokusebenza ezintsha" - + From 0c098dc5a04087d0ec74cbc7210da2305f0568ff Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 17 May 2017 17:10:05 -0700 Subject: [PATCH 085/446] Import translations. DO NOT MERGE Change-Id: I5b6795f9483c54daf9d0484bc370f056263979ac Auto-generated-cl: translation import --- res/values-af/strings.xml | 9 +++++++-- res/values-am/strings.xml | 9 +++++++-- res/values-ar/strings.xml | 8 +++++++- res/values-az/strings.xml | 9 +++++++-- res/values-b+sr+Latn/strings.xml | 9 +++++++-- res/values-be/strings.xml | 8 +++++++- res/values-bg/strings.xml | 8 +++++++- res/values-bn/config.xml | 13 ------------- res/values-bn/strings.xml | 9 ++++++++- res/values-bs/strings.xml | 18 ++++++++++++------ res/values-ca/strings.xml | 8 +++++++- res/values-cs/strings.xml | 9 +++++++-- res/values-da/strings.xml | 8 +++++++- res/values-de/strings.xml | 8 +++++++- res/values-el/strings.xml | 8 +++++++- res/values-en-rAU/strings.xml | 9 +++++++-- res/values-en-rGB/strings.xml | 9 +++++++-- res/values-en-rIN/strings.xml | 9 +++++++-- res/values-es-rUS/strings.xml | 8 +++++++- res/values-es/strings.xml | 8 +++++++- res/values-et/strings.xml | 9 +++++++-- res/values-eu/strings.xml | 8 +++++++- res/values-fa/strings.xml | 8 +++++++- res/values-fi/strings.xml | 9 +++++++-- res/values-fr-rCA/strings.xml | 8 +++++++- res/values-fr/strings.xml | 8 +++++++- res/values-gl/strings.xml | 8 +++++++- res/values-gu/config.xml | 13 ------------- res/values-gu/strings.xml | 9 ++++++++- res/values-hi/strings.xml | 9 +++++++-- res/values-hr/strings.xml | 8 +++++++- res/values-hu/strings.xml | 9 +++++++-- res/values-hy/strings.xml | 8 +++++++- res/values-in/strings.xml | 11 ++++++++--- res/values-is/strings.xml | 9 +++++++-- res/values-it/strings.xml | 9 +++++++-- res/values-iw/strings.xml | 8 +++++++- res/values-ja/strings.xml | 8 +++++++- res/values-ka/strings.xml | 9 +++++++-- res/values-kk/strings.xml | 9 +++++++-- res/values-km/strings.xml | 8 +++++++- res/values-kn/config.xml | 13 ------------- res/values-kn/strings.xml | 9 ++++++++- res/values-ko/strings.xml | 8 +++++++- res/values-ky/strings.xml | 9 +++++++-- res/values-lo/strings.xml | 9 +++++++-- res/values-lt/strings.xml | 8 +++++++- res/values-lv/strings.xml | 8 +++++++- res/values-mk/strings.xml | 9 +++++++-- res/values-ml/config.xml | 13 ------------- res/values-ml/strings.xml | 11 +++++++++-- res/values-mn/strings.xml | 8 +++++++- res/values-mr/config.xml | 13 ------------- res/values-mr/strings.xml | 9 ++++++++- res/values-ms/strings.xml | 8 +++++++- res/values-my/strings.xml | 9 +++++++-- res/values-nb/strings.xml | 8 +++++++- res/values-ne/config.xml | 13 ------------- res/values-ne/strings.xml | 9 ++++++++- res/values-nl/strings.xml | 9 +++++++-- res/values-pa/config.xml | 13 ------------- res/values-pa/strings.xml | 9 ++++++++- res/values-pl/strings.xml | 8 +++++++- res/values-pt-rPT/strings.xml | 9 +++++++-- res/values-pt/strings.xml | 8 +++++++- res/values-ro/strings.xml | 8 +++++++- res/values-ru/strings.xml | 8 +++++++- res/values-si/strings.xml | 8 +++++++- res/values-sk/strings.xml | 8 +++++++- res/values-sl/strings.xml | 8 +++++++- res/values-sq/strings.xml | 9 +++++++-- res/values-sr/strings.xml | 9 +++++++-- res/values-sv/strings.xml | 9 +++++++-- res/values-sw/strings.xml | 9 +++++++-- res/values-ta/strings.xml | 9 +++++++-- res/values-te/config.xml | 13 ------------- res/values-te/strings.xml | 9 ++++++++- res/values-th/strings.xml | 8 +++++++- res/values-tl/strings.xml | 8 +++++++- res/values-tr/strings.xml | 8 +++++++- res/values-uk/strings.xml | 9 +++++++-- res/values-ur/config.xml | 7 +++---- res/values-ur/strings.xml | 8 +++++++- res/values-uz/strings.xml | 8 +++++++- res/values-vi/strings.xml | 8 +++++++- res/values-zh-rCN/strings.xml | 16 +++++++++++----- res/values-zh-rHK/strings.xml | 8 +++++++- res/values-zh-rTW/strings.xml | 8 +++++++- res/values-zu/strings.xml | 8 +++++++- 89 files changed, 582 insertions(+), 228 deletions(-) delete mode 100644 res/values-bn/config.xml delete mode 100644 res/values-gu/config.xml delete mode 100644 res/values-kn/config.xml delete mode 100644 res/values-ml/config.xml delete mode 100644 res/values-mr/config.xml delete mode 100644 res/values-ne/config.xml delete mode 100644 res/values-pa/config.xml delete mode 100644 res/values-te/config.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index cfc27877c7..eafc506583 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -76,12 +76,17 @@ "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" + + + + + + "Voeg ikoon by tuisskerm" "Vir nuwe programme" - - + "Gebruik stelselverstek" "Onbekend" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 3ae9666258..0482f54c3a 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -76,12 +76,17 @@ "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "ስልኩ ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" + + + + + + "አዶ ወደ የመነሻ ማያ ገጽ አክል" "ለአዲስ መተግበሪያዎች" - - + "የሥርዓቱን ነባሪ ተጠቀም" "የማይታወቅ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 9c2167abea..a2b13cda1d 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -76,11 +76,17 @@ "السماح بتدوير الشاشة الرئيسية" "عند تدوير الهاتف" "لا يسمح إعداد العرض الحالي بالتدوير" + + + + + + "إضافة رمز إلى الشاشة الرئيسية" "للتطبيقات الجديدة" - + diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index 5cbe408522..e7d0b2f484 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -76,12 +76,17 @@ "Əsas ekranın firlanmağına icazə verin" "Telefon çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" + + + + + + "Əsas ekrana ikona əlavə edin" "Yeni tətbiqlər üçün" - - + "Sistem defoltu istifadə edin" "Naməlum" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 1a9ad2a075..7638a0e34f 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -76,12 +76,17 @@ "Dozvoli rotaciju početnog ekrana" "Kada se telefon rotira" "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" + + + + + + "Dodaj ikonu na početni ekran" "Za nove aplikacije" - - + "Koristi podrazumevano sistemsko podešavanje" "Nepoznato" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index b820f59fa9..3438026eb3 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -76,11 +76,17 @@ "Дазволіць паварот галоўнага экрана" "Пры павароце тэлефона" "Бягучая налада дысплэя не прадугледжвае паварот" + + + + + + "Дадаць значок на Галоўны экран" "Для новых праграм" - + diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 8dc1e10927..ba275a60d8 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -76,11 +76,17 @@ "Разрешаване на завъртането на началния екран" "При завъртане на телефона" "Текущата настройка на екрана не разрешава завъртане" + + + + + + "Добавяне на икона към началния екран" "За нови приложения" - + diff --git a/res/values-bn/config.xml b/res/values-bn/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-bn/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 065019a29f..3b233dcc97 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -76,10 +76,17 @@ "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "যখন ফোনটি ঘোরানো হয়" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" + + + + + + "হোম স্ক্রিনে আইকন যোগ করুন" "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" - "পরিবর্তন করবেন না" + + "আইকনের আকৃতি পরিবর্তন করা হচ্ছে" "অজানা" "সরান" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 63aaaba58d..ca880e7015 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -57,17 +57,17 @@ "Problem pri učitavanju dodatka" "Postavljanje" "Ovo je sistemska aplikacija i ne može se deinstalirati." - "Neimenovana fascikla" + "Neimenovani folder" "Aplikacija %1$s je onemogućena" "Strana %1$d od %2$d" "Početni ekran %1$d od %2$d" "Nova stranica početnog ekrana" - "Fascikla je otvorena, (š) %1$d (v) %2$d" + "Folder je otvoren, (š) %1$d (v) %2$d" "Dodirnite da zatvorite folder" "Dodirnite da sačuvate promjenu imena" - "Fascikla je zatvorena" - "Ime fascikle je promijenjeno u %1$s" - "Fascikla: %1$s" + "Folder je zatvoren" + "Ime foldera je promijenjeno u %1$s" + "Folder: %1$s" "Dodaci" "Pozadinske slike" "Postavke" @@ -76,11 +76,17 @@ "Dozvoli rotiranje početnog ekrana" "Kada se telefon zarotira" "Trenutne postavke ekrana ne dozvoljavaju rotiranje" + + + + + + "Dodajte ikonu na početni ekran" "Za nove aplikacije" - + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index bfbd31ebdd..a59d64555f 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -76,11 +76,17 @@ "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" + + + + + + "Afegeix la icona a la pantalla d\'inici" "Per a les aplicacions noves" - + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 7c61023060..9d9065e5d5 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -76,12 +76,17 @@ "Povolit otáčení plochy" "Při otočení telefonu" "Aktuální nastavení displeje neumožňuje otáčení" + + + + + + "Přidat ikonu na plochu" "Pro nové aplikace" - - + "Použít výchozí nastavení systému" "Neznámé" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 65e513451a..60f08fbbb4 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -76,11 +76,17 @@ "Tillad rotation af startskærmen" "Når telefonen roteres" "Den aktuelle indstilling for visning tillader ikke rotation" + + + + + + "Føj ikon til startskærmen" "For nye apps" - + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 59ce70c9c6..2a022f7887 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -76,11 +76,17 @@ "Drehung des Startbildschirms zulassen" "Bei Drehung des Smartphones" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" + + + + + + "Symbol zu Startbildschirm hinzufügen" "Für neue Apps" - + diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index d8da34b403..28ed6febda 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -76,11 +76,17 @@ "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν το τηλέφωνο περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" + + + + + + "Προσθήκη εικονιδίου στην Αρχική οθόνη" "Για νέες εφαρμογές" - + diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index ecfb0f5478..03309f23be 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -76,12 +76,17 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" + + + + + + "Add icon to Home screen" "For new apps" - - + "Use system default" "Unknown" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index ecfb0f5478..03309f23be 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -76,12 +76,17 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" + + + + + + "Add icon to Home screen" "For new apps" - - + "Use system default" "Unknown" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index ecfb0f5478..03309f23be 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -76,12 +76,17 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" + + + + + + "Add icon to Home screen" "For new apps" - - + "Use system default" "Unknown" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 4a57396168..477edb766b 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -76,11 +76,17 @@ "Permitir la rotación de la pantalla principal" "Al girar el teléfono" "La configuración actual no permite la rotación de la pantalla" + + + + + + "Agregar ícono a la pantalla principal" "Para nuevas apps" - + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 3db1aa8ffd..ae91ae8b05 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -76,11 +76,17 @@ "Permitir rotación de la pantalla de inicio" "Al girar el teléfono" "La configuración de pantalla actual no permite girar la pantalla" + + + + + + "Añadir icono a la pantalla de inicio" "Para nuevas aplicaciones" - + diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 91a7333186..2477822733 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -76,12 +76,17 @@ "Luba avaekraani pööramine" "Kui telefoni pööratakse" "Praegune kuvaseade ei luba pööramist" + + + + + + "Lisa ikoon avaekraanile" "Uute rakenduste puhul" - - + "Kasuta süsteemi vaikeseadet" "Teadmata" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 1a4d809432..2f14129399 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -76,11 +76,17 @@ "Baimendu hasierako pantaila biratzea" "Telefonoa biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" + + + + + + "Gehitu ikonoa hasierako pantailan" "Aplikazio berrietan" - + diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 3a9a85af7d..8a9c5faac2 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -76,11 +76,17 @@ "امکان دادن به چرخش صفحه اصلی" "وقتی تلفن چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" + + + + + + "افزودن نماد به صفحه اصلی" "برای برنامه‌های جدید" - + diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 6e4bc934ec..7ac250306b 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -76,12 +76,17 @@ "Salli aloitusnäytön kiertäminen" "Kun puhelinta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." + + + + + + "Lisää kuvake aloitusruutuun" "Uusille sovelluksille" - - + "Käytä järjestelmän oletusarvoa" "Tuntematon" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index a9f294726e..24e4fc0be4 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -76,11 +76,17 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le mode d\'affichage actuel ne permet pas le pivotement" + + + + + + "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" - + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 2d7a38c039..ad3110bf45 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -76,11 +76,17 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." + + + + + + "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" - + diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index e8213b51d2..5f79c808b6 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -76,11 +76,17 @@ "Permitir xirar a pantalla de inicio" "Ao xirar o teléfono" "A configuración de visualización actual non permite xirar a pantalla" + + + + + + "Engadir icona á pantalla de inicio" "Para novas aplicacións" - + diff --git a/res/values-gu/config.xml b/res/values-gu/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-gu/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index aa4992db7a..4bbebb713c 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -76,10 +76,17 @@ "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" + + + + + + "હોમ સ્ક્રીન પર આઇકન ઉમેરો" "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" - "બદલશો નહીં" + + "આઇકનના આકારમાં કરેલ ફેરફારો લાગુ કરી રહ્યા છીએ" "અજાણ્યો" "દૂર કરો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index ba03a92675..25a204bb6f 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -76,12 +76,17 @@ "होमस्क्रीन घुमाने की अनुमति दें" "फ़ोन घुुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" + + + + + + "होम स्क्रीन में आइकन जोड़ें" "नए ऐप्लिकेशन के लिए" - - + "सिस्टम डिफ़ॉल्ट का उपयोग करें" "अज्ञात" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index b6448f1e74..8f288cf547 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -76,11 +76,17 @@ "Dopusti zakretanje početnog zaslona" "Kada se telefon zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" + + + + + + "Dodaj ikonu na početni zaslon" "Za nove aplikacije" - + diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 45a50544cc..3fb2c55c04 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -76,12 +76,17 @@ "A kezdőképernyő elforgatásának engedélyezése" "A telefon elforgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" + + + + + + "Ikon hozzáadása a kezdőképernyőhöz" "Új alkalmazásoknál" - - + "Alapértelmezett érték használata" "Ismeretlen" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 7c39a3f182..7b917f7e9b 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -76,11 +76,17 @@ "Թույլ տալ հիմնական էկրանի պտտումը" "Հեռախոսը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" + + + + + + "Ավելացնել պատկերակը Հիմնական էկրանին" "Նոր հավելվածների համար" - + diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 4d26ab36b9..ae1561b0c3 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -45,7 +45,7 @@ "Daftar aplikasi" "Layar Utama" "Hapus" - "Copot pemasangan" + "Uninstal" "Info aplikasi" "memasang pintasan" "Mengizinkan aplikasi menambahkan pintasan tanpa campur tangan pengguna." @@ -76,12 +76,17 @@ "Izinkan layar Utama diputar" "Saat ponsel diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" + + + + + + "Tambahkan ikon ke layar Utama" "Untuk aplikasi baru" - - + "Gunakan default sistem" "Tidak dikenal" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 3694a10e43..6a4dd03923 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -76,12 +76,17 @@ "Leyfa snúning fyrir heimaskjá" "Þegar símanum er snúið" "Núverandi skjástilling leyfir ekki snúning" + + + + + + "Bæta tákni á heimaskjáinn" "Fyrir ný forrit" - - + "Nota sjálfgildi kerfis" "Óþekkt" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 12088740d4..bbd99e891c 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -76,12 +76,17 @@ "Consenti rotazione della schermata Home" "Con il telefono ruotato" "L\'impostazione corrente del display non consente la rotazione" + + + + + + "Aggiungi icone alla schermata Home" "Per le nuove app" - - + "Usa impostazione predefinita di sistema" "Sconosciuto" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 858abfd4f3..ccd6f0d866 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -76,11 +76,17 @@ "אפשרות סיבוב של מסך דף הבית" "כאשר הטלפון מסובב" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" + + + + + + "הוספת סמל במסך דף הבית" "לאפליקציות חדשות" - + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 846b884a6c..77c6b26f1f 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -76,11 +76,17 @@ "ホーム画面の回転を許可" "スマートフォンが回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" + + + + + + "ホーム画面にアイコンを追加" "新しいアプリをダウンロードしたときに" - + diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 197944936a..9db1b03add 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -76,12 +76,17 @@ "მთავარი ეკრანის შეტრიალების დაშვება" "ტელეფონის შეტრიალებისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" + + + + + + "ხატულას მთავარ ეკრანზე დამატება" "ახალი აპებისთვის" - - + "ნაგულისხმევი სისტემური პარამეტრების გამოყენება" "უცნობი" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 5df503a103..5df229351b 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -76,12 +76,17 @@ "Негізгі экранның бұрылуына рұқсат ету" "Телефон бұрылғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" + + + + + + "Негізгі экранға белгіше енгізу" "Жаңа қолданбаларға арналған" - - + "Жүйенің әдепкі параметрін пайдалану" "Белгісіз" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index a64b604cb1..8e1841e623 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -76,11 +76,17 @@ "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" + + + + + + "បញ្ចូល​រូបតំណាង​ទៅ​អេក្រង់​ដើម" "សម្រាប់កម្មវិធីថ្មី" - + diff --git a/res/values-kn/config.xml b/res/values-kn/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-kn/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index b22af0de8b..7ef8fb1b11 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -76,10 +76,17 @@ "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" + + + + + + "ಮುಖಪುಟದ ಪರದೆಗೆ ಐಕಾನ್ ಸೇರಿಸಿ" "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" - "ಬದಲಿಸಬೇಡಿ" + + "ಐಕಾನ್ ಆಕಾರ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತಿದೆ" "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 9e1eba4c0b..66bd05db83 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -76,11 +76,17 @@ "홈 화면 회전 허용" "휴대전화 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." + + + + + + "홈 화면에 아이콘 추가" "새로 설치한 앱에 적용" - + diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index cfdcc18847..7ea2df5cb7 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -76,12 +76,17 @@ "Башкы экранды айлантууга уруксат берүү" "Телефон айланганда" "Экранды айлантуу параметри өчүрүлгөн" + + + + + + "Башкы экранга сүрөтчө кошуу" "Жаңы колдонмолор үчүн" - - + "Тутум сушунтаган демейкисин колдонуу" "Белгисиз" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 334305afe1..3e78b0b052 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -76,12 +76,17 @@ "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນໂທລະສັບ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" + + + + + + "ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ" "ສຳລັບແອັບໃໝ່" - - + "ໃຊ້ຄ່າເລີ່ມຕົ້ນລະບົບ" "​ບໍ່​ຮູ້​ຈັກ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 558e1a9494..dd23f7aef1 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -76,11 +76,17 @@ "Leisti pasukti pagrindinį ekraną" "Kai telefonas pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" + + + + + + "Pridėti piktogr. prie pagrindinio ekrano" "Skirta naujoms programoms" - + diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 733d647605..0a1fe92373 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -76,11 +76,17 @@ "Atļaut sākuma ekrāna pagriešanu" "Pagriežot tālruni" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." + + + + + + "Pievienot ikonu sākuma ekrānā" "Jaunām lietotnēm" - + diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 267e75b98d..ccec8c69a7 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -76,12 +76,17 @@ "Дозволете ротација на Почетниот екран" "Кога телефонот се ротира" "Тековната поставка на Екранот не дозволува ротација" + + + + + + "Додајте икона на почетниот екран" "За нови апликации" - - + "Користи ја стандардната поставка на системот" "Непознато" diff --git a/res/values-ml/config.xml b/res/values-ml/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-ml/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index a92fc03568..fc4da03c4b 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -36,7 +36,7 @@ "സ്വമേധയാ സ്ഥാപിക്കുന്നതിന് സ്‌പർശിച്ചുപിടിക്കുക" "സ്വയമേവ ചേർക്കുക" "ആപ്പുകളെ തിരയുക" - "ആപ്പ്‌സ് ലോഡുചെയ്യുന്നു..." + "ആപ്പുകൾ ലോഡുചെയ്യുന്നു..." "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പ്‌സൊന്നും കണ്ടെത്തിയില്ല" "കൂടുതൽ ആപ്പുകൾക്ക് തിരയുക" "അറിയിപ്പുകൾ" @@ -76,10 +76,17 @@ "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" + + + + + + "ഹോം സ്ക്രീനിലേക്ക് ഐക്കൺ ചേർക്കുക" "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" - "മാറ്റരുത്" + + "ഐക്കൺ ആകാര മാറ്റങ്ങൾ പ്രയോഗിക്കുന്നു" "അജ്ഞാതം" "നീക്കംചെയ്യുക" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 5b74fd2049..99bd09385c 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -76,11 +76,17 @@ "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Утсыг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" + + + + + + "Нүүр хуудаст дүрс тэмдэг нэмэх" "Шинэ аппад зориулсан" - + diff --git a/res/values-mr/config.xml b/res/values-mr/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-mr/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 1a10e4b571..77ae9d3d8b 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -76,10 +76,17 @@ "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "फोन फिरविला जातो तेव्हा" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" + + + + + + "मुख्य स्क्रीनवर चिन्ह जोडा" "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" - "बदलू नका" + + "चिन्हाचा आकार बदल लागू करत आहे" "अज्ञात" "काढा" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index 756a2cf2f2..d45af42370 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -76,11 +76,17 @@ "Benarkan putaran Skrin Utama" "Apabila telefon diputar" "Tetapan Paparan semasa tidak membenarkan putaran" + + + + + + "Tambahkan ikon pada Skrin Utama" "Untuk apl baharu" - + diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 449aae8e02..b5e76743f5 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -76,12 +76,17 @@ "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" "ဖုန်းကိုလှည့်ထားစဉ်" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" + + + + + + "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" "အက်ပ်အသစ်များအတွက်" - - + "စနစ်၏ မူရင်းပုံကို အသုံးပြုရန်" "မသိရ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 6c70038bb5..072cd27123 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -76,11 +76,17 @@ "Tillat rotasjon av startskjermen" "Når telefonen roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" + + + + + + "Legg til ikon på startsiden" "For nye apper" - + diff --git a/res/values-ne/config.xml b/res/values-ne/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-ne/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 46c8f9ceae..37ebc24209 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -76,10 +76,17 @@ "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "फोनलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" + + + + + + "गृह स्क्रिनमा आइकन थप्नुहोस्" "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" - "परिवर्तन नगर्नुहोस्" + + "आइकनको आकारमा गरिएका परिवर्तनहरू लागू गरिँदैछन्" "अज्ञात" "हटाउनुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e8caeb448f..4f2ba93be0 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -76,12 +76,17 @@ "Draaien van startscherm toestaan" "Wanneer de telefoon gedraaid is" "Huidige scherminstelling staat draaien niet toe" + + + + + + "Pictogram toevoegen aan startscherm" "Voor nieuwe apps" - - + "Systeemstandaard gebruiken" "Onbekend" diff --git a/res/values-pa/config.xml b/res/values-pa/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-pa/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index c4c11ce04e..4998b9243c 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -76,10 +76,17 @@ "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" + + + + + + "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" - "ਨਾ ਬਦਲੋ" + + "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index e611fcd9a8..0c3a24aea2 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -76,11 +76,17 @@ "Zezwalaj na obrót ekranu głównego" "Po obróceniu telefonu" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" + + + + + + "Dodaj ikonę do ekranu głównego" "W przypadku nowych aplikacji" - + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 0aa987bdac..d06cea653b 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -76,12 +76,17 @@ "Permitir rotação do ecrã principal" "Quando o telemóvel é rodado" "A definição de visualização atual não permite a rotação" + + + + + + "Adicionar ícone ao ecrã principal" "Para novas aplicações" - - + "Utilizar a predefinição do sistema" "Desconhecido" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 39a16515f1..bdc2e83e6c 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -76,11 +76,17 @@ "Permitir rotação da tela inicial" "Quando o smartphone for girado" "A configuração atual de exibição não permite rotação" + + + + + + "Adicionar ícone à tela inicial" "Para novos apps" - + diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index c7c0994a36..e2409f9c9c 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -76,11 +76,17 @@ "Permiteți rotirea ecranului de pornire" "Când telefonul este rotit" "Setarea actuală a afișajului nu permite rotirea" + + + + + + "Adaugă pictograme în ecranul de pornire" "Pentru aplicații noi" - + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index acb49d5987..0fb44c1c88 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -76,11 +76,17 @@ "Разрешить поворачивать главный экран" "Когда телефон повернут" "В настройках отключен поворот экрана" + + + + + + "Добавлять значки" "Добавлять значки установленных приложений на главный экран." - + diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 569a77f003..1c74f7c6c6 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -76,11 +76,17 @@ "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "දුරකථනය කරකවන විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" + + + + + + "මුල් පිටු තිරය වෙත අයිකනය එක් කරන්න" "නව යෙදුම් සඳහා" - + diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index dd03fd6f3c..1b66f0cda4 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -76,11 +76,17 @@ "Povoliť otáčanie plochy" "Pri otočení telefónu" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" + + + + + + "Pridať ikonu na plochu" "Pri inštalácii novej aplikácie" - + diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index f8761d2af7..6717b31995 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -76,11 +76,17 @@ "Omogočanje sukanja začetnega zaslona" "Ko se telefon zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" + + + + + + "Dodaj ikono na začetni zaslon" "Za nove aplikacije" - + diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 2b656840d7..dc7bff638f 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -76,12 +76,17 @@ "Lejo rrotullimin e ekranit kryesor" "Kur telefoni rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" + + + + + + "Shto ikonë në ekranin bazë" "Për aplikacionet e reja" - - + "Përdor parazgjedhjen e sisteit" "I panjohur" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index ac2114266f..49ea52234d 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -76,12 +76,17 @@ "Дозволи ротацију почетног екрана" "Када се телефон ротира" "Актуелно подешавање приказа не дозвољава ротацију" + + + + + + "Додај икону на почетни екран" "За нове апликације" - - + "Користи подразумевано системско подешавање" "Непознато" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 7d6e053690..b74abd731d 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -76,12 +76,17 @@ "Tillåt rotering av startskärmen" "När mobilen vrids" "Rotering tillåts inte i de nuvarande skärminställningarna" + + + + + + "Lägg till ikonen på startskärmen" "För nya appar" - - + "Använd systemstandard" "Okänt" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 62e3385342..375e843d84 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -78,12 +78,17 @@ "Ruhusu kuzungusha skrini ya Kwanza" "Simu inapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" + + + + + + "Ongeza aikoni kwenye Skrini ya kwanza" "Kwa ajili ya programu mpya" - - + "Tumia umbo chaguo-msingi la mfumo" "Yasiyojulikana" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index a1e00a11dc..af052cbc52 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -76,12 +76,17 @@ "முகப்புத் திரை சுழற்சியை அனுமதி" "மொபைலைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" + + + + + + "முகப்புத் திரையில் ஐகானைச் சேர்" "புதிய பயன்பாடுகளுக்கு" - - + "அமைப்பின் இயல்புநிலையைப் பயன்படுத்து" "தெரியாதது" diff --git a/res/values-te/config.xml b/res/values-te/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-te/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 65ca927753..ded39cc601 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -76,10 +76,17 @@ "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "ఫోన్‌‌ను తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" + + + + + + "హోమ్ స్క్రీన్‌కి చిహ్నాన్ని జోడించు" "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" - "మార్చవద్దు" + + "చిహ్న ఆకార మార్పులను వర్తింపజేస్తోంది" "తెలియదు" "తీసివేయి" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index fb7b587152..0c5f72b20d 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -76,11 +76,17 @@ "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนโทรศัพท์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" + + + + + + "เพิ่มไอคอนในหน้าจอหลัก" "สำหรับแอปใหม่" - + diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index d18bd1e974..e946dfd9a4 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -76,11 +76,17 @@ "Payagan ang pag-rotate ng Home screen" "Kailan maro-rotate ang telepono" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" + + + + + + "Idagdag ang icon sa Home screen" "Para sa mga bagong app" - + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 0c655fd7cd..47d083f9a1 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -76,11 +76,17 @@ "Ana ekranı döndürmeye izin ver" "Telefon döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" + + + + + + "Ana ekrana simge ekle" "Yeni uygulamalar için" - + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 8679628c29..7c954daf19 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -76,12 +76,17 @@ "Дозволити обертання головного екрана" "Коли телефон обертається" "Поточні налаштування дисплея не підтримують обертання" + + + + + + "Додати значок на головний екран" "Для нових додатків" - - + "Використовувати налаштування системи за умовчанням" "Невідомо" diff --git a/res/values-ur/config.xml b/res/values-ur/config.xml index 56f98c3563..7ee78d01b5 100644 --- a/res/values-ur/config.xml +++ b/res/values-ur/config.xml @@ -4,10 +4,9 @@ "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 29d1cd53cd..c84f5c92fd 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -76,10 +76,16 @@ "ہوم اسکرین گھمانے کی اجازت دیں" "جب فون گھمایا جاتا ہے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" + + + + + + "آئیکن کو ہوم اسکرین میں شامل کریں" "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" - "تبدیل نہ کریں" + "سسٹم ڈیفالٹ کا استعمال کریں" "آئيکن کی شکل کی تبدیلیاں لاگو ہو رہی ہیں" "نامعلوم" "ہٹائیں" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 81be979cc6..4fa0645371 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -76,11 +76,17 @@ "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" + + + + + + "Bosh ekranga ikonka qo‘shish" "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" - + diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 5fc9542d1e..dea2788b95 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -76,11 +76,17 @@ "Cho phép xoay Màn hình chính" "Khi xoay điện thoại" "Cài đặt Hiển thị hiện tại không cho phép xoay" + + + + + + "Thêm biểu tượng vào màn hình chính" "Cho ứng dụng mới" - + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index a6f8bf4d3b..4ddc17f818 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -29,8 +29,8 @@ "无法使用快捷方式" "主屏幕" "自定义操作" - "触摸并按住小部件即可选择。" - "点按两次并按住小部件即可选择小部件,您也可以使用自定义操作。" + "触摸并按住微件即可选择。" + "点按两次并按住微件即可选择微件,您也可以使用自定义操作。" "%1$d × %2$d" "宽 %1$d,高 %2$d" "触摸并按住即可手动放置" @@ -54,7 +54,7 @@ "写入主屏幕设置和快捷方式" "允许应用更改主屏幕中的设置和快捷方式。" "不允许使用“%1$s”拨打电话" - "加载小部件时出现问题" + "加载微件时出现问题" "设置" "这是系统应用,无法卸载。" "未命名文件夹" @@ -76,11 +76,17 @@ "允许旋转主屏幕" "手机旋转时" "当前的显示设置不允许旋转设备" + + + + + + "将图标添加到主屏幕" "适用于新应用" - + @@ -115,7 +121,7 @@ "增加高度" "减小宽度" "减小高度" - "小部件尺寸已调整为:宽度 %1$s,高度 %2$s" + "微件尺寸已调整为:宽度 %1$s,高度 %2$s" "快捷方式" "%2$s%1$d 个快捷方式" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 867c350ebd..2c369850b9 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -76,11 +76,17 @@ "允許主畫面旋轉" "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" + + + + + + "將圖示加到主畫面" "適用於新安裝的應用程式" - + diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index ee92cf1675..ef48e1fb03 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -76,11 +76,17 @@ "允許旋轉主螢幕" "當手機旋轉時" "目前的顯示設定不允許旋轉畫面" + + + + + + "將圖示加到主螢幕" "適用於新安裝的應用程式" - + diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index aa918b3f2b..3330ef4eab 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -76,11 +76,17 @@ "Vumela ukuphendukiswa kwesikrini sasekhaya" "Uma ifoni iphendukiswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" + + + + + + "Engeza isithonjana eskrinini sasekhaya" "Kwezinhlelo zokusebenza ezintsha" - + From b01046f9e7a65b175c34a14a701a856a5c8ed00b Mon Sep 17 00:00:00 2001 From: Peter Schiller Date: Thu, 18 May 2017 14:12:24 -0700 Subject: [PATCH 086/446] Rounded caret Change-Id: I3889fe61a29834c3c7e3829a990b481507589f68 --- src/com/android/launcher3/pageindicators/CaretDrawable.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/pageindicators/CaretDrawable.java b/src/com/android/launcher3/pageindicators/CaretDrawable.java index 349b41cb2a..416b2f0b5c 100644 --- a/src/com/android/launcher3/pageindicators/CaretDrawable.java +++ b/src/com/android/launcher3/pageindicators/CaretDrawable.java @@ -49,8 +49,8 @@ public class CaretDrawable extends Drawable { mCaretPaint.setAntiAlias(true); mCaretPaint.setStrokeWidth(strokeWidth); mCaretPaint.setStyle(Paint.Style.STROKE); - mCaretPaint.setStrokeCap(Paint.Cap.SQUARE); - mCaretPaint.setStrokeJoin(Paint.Join.MITER); + mCaretPaint.setStrokeCap(Paint.Cap.ROUND); + mCaretPaint.setStrokeJoin(Paint.Join.ROUND); mShadowPaint.setColor(res.getColor(R.color.default_shadow_color_no_alpha)); mShadowPaint.setAlpha(Themes.getAlpha(context, android.R.attr.spotShadowAlpha)); From 30e55d0f7c4f6e83929868145ba3d4e2a4522b4c Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Thu, 18 May 2017 15:31:19 -0700 Subject: [PATCH 087/446] Don't set system shortcut text to white Bug: 38201638 Change-Id: Icacd63810306848ec1fb54e5dcc6021660ac5099 --- res/drawable/ic_widget.xml | 2 +- res/values/styles.xml | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/res/drawable/ic_widget.xml b/res/drawable/ic_widget.xml index 6c1469daad..3e7bd7b51d 100644 --- a/res/drawable/ic_widget.xml +++ b/res/drawable/ic_widget.xml @@ -19,6 +19,6 @@ Copyright (C) 2016 The Android Open Source Project android:viewportWidth="48.0" android:viewportHeight="48.0"> diff --git a/res/values/styles.xml b/res/values/styles.xml index e2d9ff486b..dd6a680c55 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -97,13 +97,9 @@ From 0e947fbdbb49d2d58b4d1719224ded4c3f18707a Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 19 May 2017 12:21:50 -0700 Subject: [PATCH 088/446] Making some methods accessible Bug: 37616877 Change-Id: I22ed43d9a39d321757d7c2fde7754b95a44780e2 --- src/com/android/launcher3/AllAppsList.java | 10 ++++------ src/com/android/launcher3/LauncherModel.java | 2 +- src/com/android/launcher3/Utilities.java | 2 +- .../allapps/search/DefaultAppSearchAlgorithm.java | 4 ++-- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index d7f0180fa2..f3202beb94 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -42,15 +42,13 @@ public class AllAppsList { public static final int DEFAULT_APPLICATIONS_NUMBER = 42; /** The list off all apps. */ - public ArrayList data = - new ArrayList(DEFAULT_APPLICATIONS_NUMBER); + public final ArrayList data = new ArrayList<>(DEFAULT_APPLICATIONS_NUMBER); /** The list of apps that have been added since the last notify() call. */ - public ArrayList added = - new ArrayList(DEFAULT_APPLICATIONS_NUMBER); + public ArrayList added = new ArrayList<>(DEFAULT_APPLICATIONS_NUMBER); /** The list of apps that have been removed since the last notify() call. */ - public ArrayList removed = new ArrayList(); + public ArrayList removed = new ArrayList<>(); /** The list of apps that have been modified since the last notify() call. */ - public ArrayList modified = new ArrayList(); + public ArrayList modified = new ArrayList<>(); private IconCache mIconCache; diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index ca9f3120d6..e2311b584c 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -1831,7 +1831,7 @@ public class LauncherModel extends BroadcastReceiver CacheDataUpdatedTask.OP_CACHE_UPDATE, user, updatedPackages)); } - void enqueueModelUpdateTask(BaseModelUpdateTask task) { + public void enqueueModelUpdateTask(BaseModelUpdateTask task) { if (!mModelLoaded && mLoaderTask == null) { if (DEBUG_LOADERS) { Log.d(TAG, "enqueueModelUpdateTask Ignoring task since loader is pending=" + task); diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 54e7dd2bcb..b006453c2e 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -259,7 +259,7 @@ public final class Utilities { return scale; } - static boolean isSystemApp(Context context, Intent intent) { + public static boolean isSystemApp(Context context, Intent intent) { PackageManager pm = context.getPackageManager(); ComponentName cn = intent.getComponent(); String packageName = null; diff --git a/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java b/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java index 457b454ef5..06097d0e64 100644 --- a/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java +++ b/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java @@ -54,7 +54,7 @@ public class DefaultAppSearchAlgorithm { }); } - protected ArrayList getTitleMatchResult(String query) { + public ArrayList getTitleMatchResult(String query) { // Do an intersection of the words in the query and each title, and filter out all the // apps that don't match all of the words in the query. final String queryTextLower = query.toLowerCase(); @@ -67,7 +67,7 @@ public class DefaultAppSearchAlgorithm { return result; } - protected boolean matches(AppInfo info, String query) { + public boolean matches(AppInfo info, String query) { int queryLength = query.length(); String title = info.title.toString(); From cbe6c2849e9c750f428e6194048062dbb4383897 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 19 May 2017 19:30:31 -0700 Subject: [PATCH 089/446] Rename "Settings" to "Home settings" Bug: 37903251 Change-Id: Ia6a8b329135100af9b54900e275c5362695bfd74 --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index f7c482567e..54eb90650b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -159,7 +159,7 @@ Wallpapers - Settings + Home settings Disabled by your admin From 22ca9ec137ec8eb70026f90591ae01af7669a3b7 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 18 May 2017 15:03:13 -0700 Subject: [PATCH 090/446] Removing various reflection calls with final APIs Change-Id: Ibf48d6015d808f86bc79ccf64e3077eb5b6ccaff --- src/com/android/launcher3/Launcher.java | 6 +- .../launcher3/LauncherAppWidgetHostView.java | 13 +- .../android/launcher3/LauncherProvider.java | 12 +- .../launcher3/compat/LauncherAppsCompat.java | 61 --------- .../compat/LauncherAppsCompatVO.java | 119 ++++++++++++----- .../compat/PinItemRequestCompat.java | 126 ------------------ .../compat/ShortcutConfigActivityInfo.java | 12 +- .../launcher3/dragndrop/AddItemActivity.java | 15 ++- .../dragndrop/PinItemDragListener.java | 21 ++- .../PinShortcutRequestActivityInfo.java | 12 +- .../dragndrop/PinWidgetFlowHandler.java | 11 +- 11 files changed, 138 insertions(+), 270 deletions(-) delete mode 100644 src/com/android/launcher3/compat/PinItemRequestCompat.java diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index f4342a29a8..b63bbd5480 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -90,7 +90,7 @@ import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.AnimationLayerSet; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.PinItemRequestCompat; +import com.android.launcher3.compat.LauncherAppsCompatVO; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; @@ -1423,8 +1423,8 @@ public class Launcher extends BaseActivity ShortcutInfo info = null; if (Utilities.isAtLeastO()) { - info = LauncherAppsCompat.createShortcutInfoFromPinItemRequest( - this, PinItemRequestCompat.getPinItemRequest(data), 0); + info = LauncherAppsCompatVO.createShortcutInfoFromPinItemRequest( + this, LauncherAppsCompatVO.getPinItemRequest(data), 0); } if (info == null) { diff --git a/src/com/android/launcher3/LauncherAppWidgetHostView.java b/src/com/android/launcher3/LauncherAppWidgetHostView.java index 13cc7ba077..c7b778252a 100644 --- a/src/com/android/launcher3/LauncherAppWidgetHostView.java +++ b/src/com/android/launcher3/LauncherAppWidgetHostView.java @@ -23,7 +23,6 @@ import android.graphics.PointF; import android.graphics.Rect; import android.os.Handler; import android.os.SystemClock; -import android.util.Log; import android.util.SparseBooleanArray; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -40,9 +39,7 @@ import android.widget.RemoteViews; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragLayer.TouchCompleteListener; -import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.concurrent.Executor; /** * {@inheritDoc} @@ -50,8 +47,6 @@ import java.util.concurrent.Executor; public class LauncherAppWidgetHostView extends AppWidgetHostView implements TouchCompleteListener, View.OnLongClickListener { - private static final String TAG = "LauncherWidgetHostView"; - // Related to the auto-advancing of widgets private static final long ADVANCE_INTERVAL = 20000; private static final long ADVANCE_STAGGER = 250; @@ -98,13 +93,7 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView setBackgroundResource(R.drawable.widget_internal_focus_bg); if (Utilities.isAtLeastO()) { - try { - Method asyncMethod = AppWidgetHostView.class - .getMethod("setExecutor", Executor.class); - asyncMethod.invoke(this, Utilities.THREAD_POOL_EXECUTOR); - } catch (Exception e) { - Log.e(TAG, "Unable to set async executor", e); - } + setExecutor(Utilities.THREAD_POOL_EXECUTOR); } } diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index c84a4312df..4813571f54 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -16,6 +16,7 @@ package com.android.launcher3; +import android.annotation.TargetApi; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.content.ComponentName; @@ -38,6 +39,7 @@ import android.database.sqlite.SQLiteQueryBuilder; import android.database.sqlite.SQLiteStatement; import android.net.Uri; import android.os.Binder; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -68,7 +70,6 @@ import com.android.launcher3.util.Thunk; import java.io.File; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.lang.reflect.Method; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; @@ -855,15 +856,16 @@ public class LauncherProvider extends ContentProvider { * Removes widgets which are registered to the Launcher's host, but are not present * in our model. */ + @TargetApi(Build.VERSION_CODES.O) public void removeGhostWidgets(SQLiteDatabase db) { // Get all existing widget ids. final AppWidgetHost host = newLauncherWidgetHost(); final int[] allWidgets; try { - Method getter = AppWidgetHost.class.getDeclaredMethod("getAppWidgetIds"); - getter.setAccessible(true); - allWidgets = (int[]) getter.invoke(host); - } catch (Exception e) { + // Although the method was defined in O, it has existed since the beginning of time, + // so it might work on older platforms as well. + allWidgets = host.getAppWidgetIds(); + } catch (IncompatibleClassChangeError e) { Log.e(TAG, "getAppWidgetIds not supported", e); return; } diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index 472cfc9ec5..26f4ae7216 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -26,13 +26,8 @@ import android.os.Bundle; import android.os.UserHandle; import android.support.annotation.Nullable; -import com.android.launcher3.LauncherAppState; -import com.android.launcher3.LauncherModel; -import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; -import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.ShortcutInfoCompat; -import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.PackageUserKey; import java.util.List; @@ -88,62 +83,6 @@ public abstract class LauncherAppsCompat { public abstract List getCustomShortcutActivityList( @Nullable PackageUserKey packageUser); - /** - * request.accept() will initiate the following flow: - * -> go-to-system-process for actual processing (a) - * -> callback-to-launcher on UI thread (b) - * -> post callback on the worker thread (c) - * -> Update model and unpin (in system) any shortcut not in out model. (d) - * - * Note that (b) will take at-least one frame as it involves posting callback from binder - * thread to UI thread. - * If (d) happens before we add this shortcut to our model, we will end up unpinning - * the shortcut in the system. - * Here its the caller's responsibility to add the newly created ShortcutInfo immediately - * to the model (which may involves a single post-to-worker-thread). That will guarantee - * that (d) happens after model is updated. - */ - @Nullable - public static ShortcutInfo createShortcutInfoFromPinItemRequest( - Context context, final PinItemRequestCompat request, final long acceptDelay) { - if (request != null && - request.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_SHORTCUT && - request.isValid()) { - - if (acceptDelay <= 0) { - if (!request.accept()) { - return null; - } - } else { - // Block the worker thread until the accept() is called. - new LooperExecutor(LauncherModel.getWorkerLooper()).execute(new Runnable() { - @Override - public void run() { - try { - Thread.sleep(acceptDelay); - } catch (InterruptedException e) { - // Ignore - } - if (request.isValid()) { - request.accept(); - } - } - }); - } - - ShortcutInfoCompat compat = new ShortcutInfoCompat(request.getShortcutInfo()); - ShortcutInfo info = new ShortcutInfo(compat, context); - // Apply the unbadged icon and fetch the actual icon asynchronously. - info.iconBitmap = LauncherIcons - .createShortcutIcon(compat, context, false /* badged */); - LauncherAppState.getInstance(context).getModel() - .updateAndBindShortcutInfo(info, compat); - return info; - } else { - return null; - } - } - public void showAppDetailsForProfile(ComponentName component, UserHandle user) { showAppDetailsForProfile(component, user, null, null); } diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java index d145539c7a..3214b4672c 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java @@ -18,20 +18,27 @@ package com.android.launcher3.compat; import android.annotation.TargetApi; import android.content.Context; +import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; +import android.content.pm.LauncherApps.PinItemRequest; import android.content.pm.PackageManager; import android.os.Build; +import android.os.Parcelable; import android.os.Process; import android.os.UserHandle; import android.support.annotation.Nullable; -import android.util.Log; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherModel; +import com.android.launcher3.ShortcutInfo; import com.android.launcher3.compat.ShortcutConfigActivityInfo.ShortcutConfigActivityInfoVO; +import com.android.launcher3.graphics.LauncherIcons; +import com.android.launcher3.shortcuts.ShortcutInfoCompat; +import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.PackageUserKey; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -45,11 +52,6 @@ public class LauncherAppsCompatVO extends LauncherAppsCompatVL { @Override public ApplicationInfo getApplicationInfo(String packageName, int flags, UserHandle user) { try { - // TODO: Temporary workaround until the API signature is updated - if (false) { - throw new PackageManager.NameNotFoundException(); - } - ApplicationInfo info = mLauncherApps.getApplicationInfo(packageName, flags, user); return (info.flags & ApplicationInfo.FLAG_INSTALLED) == 0 || !info.enabled ? null : info; @@ -64,34 +66,89 @@ public class LauncherAppsCompatVO extends LauncherAppsCompatVL { List result = new ArrayList<>(); UserHandle myUser = Process.myUserHandle(); - try { - Method m = LauncherApps.class.getDeclaredMethod("getShortcutConfigActivityList", - String.class, UserHandle.class); - final List users; - final String packageName; - if (packageUser == null) { - users = UserManagerCompat.getInstance(mContext).getUserProfiles(); - packageName = null; - } else { - users = new ArrayList<>(1); - users.add(packageUser.mUser); - packageName = packageUser.mPackageName; - } - for (UserHandle user : users) { - boolean ignoreTargetSdk = myUser.equals(user); - List activities = - (List) m.invoke(mLauncherApps, packageName, user); - for (LauncherActivityInfo activityInfo : activities) { - if (ignoreTargetSdk || activityInfo.getApplicationInfo().targetSdkVersion >= - Build.VERSION_CODES.O) { - result.add(new ShortcutConfigActivityInfoVO(activityInfo)); - } + final List users; + final String packageName; + if (packageUser == null) { + users = UserManagerCompat.getInstance(mContext).getUserProfiles(); + packageName = null; + } else { + users = new ArrayList<>(1); + users.add(packageUser.mUser); + packageName = packageUser.mPackageName; + } + for (UserHandle user : users) { + boolean ignoreTargetSdk = myUser.equals(user); + List activities = + mLauncherApps.getShortcutConfigActivityList(packageName, user); + for (LauncherActivityInfo activityInfo : activities) { + if (ignoreTargetSdk || activityInfo.getApplicationInfo().targetSdkVersion >= + Build.VERSION_CODES.O) { + result.add(new ShortcutConfigActivityInfoVO(activityInfo)); } } - } catch (Exception e) { - Log.e("LauncherAppsCompatVO", "Error calling new API", e); } return result; } + + /** + * request.accept() will initiate the following flow: + * -> go-to-system-process for actual processing (a) + * -> callback-to-launcher on UI thread (b) + * -> post callback on the worker thread (c) + * -> Update model and unpin (in system) any shortcut not in out model. (d) + * + * Note that (b) will take at-least one frame as it involves posting callback from binder + * thread to UI thread. + * If (d) happens before we add this shortcut to our model, we will end up unpinning + * the shortcut in the system. + * Here its the caller's responsibility to add the newly created ShortcutInfo immediately + * to the model (which may involves a single post-to-worker-thread). That will guarantee + * that (d) happens after model is updated. + */ + @Nullable + public static ShortcutInfo createShortcutInfoFromPinItemRequest( + Context context, final PinItemRequest request, final long acceptDelay) { + if (request != null && + request.getRequestType() == PinItemRequest.REQUEST_TYPE_SHORTCUT && + request.isValid()) { + + if (acceptDelay <= 0) { + if (!request.accept()) { + return null; + } + } else { + // Block the worker thread until the accept() is called. + new LooperExecutor(LauncherModel.getWorkerLooper()).execute(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(acceptDelay); + } catch (InterruptedException e) { + // Ignore + } + if (request.isValid()) { + request.accept(); + } + } + }); + } + + ShortcutInfoCompat compat = new ShortcutInfoCompat(request.getShortcutInfo()); + ShortcutInfo info = new ShortcutInfo(compat, context); + // Apply the unbadged icon and fetch the actual icon asynchronously. + info.iconBitmap = LauncherIcons + .createShortcutIcon(compat, context, false /* badged */); + LauncherAppState.getInstance(context).getModel() + .updateAndBindShortcutInfo(info, compat); + return info; + } else { + return null; + } + } + + public static PinItemRequest getPinItemRequest(Intent intent) { + Parcelable extra = intent.getParcelableExtra(LauncherApps.EXTRA_PIN_ITEM_REQUEST); + return extra instanceof PinItemRequest ? (PinItemRequest) extra : null; + } } diff --git a/src/com/android/launcher3/compat/PinItemRequestCompat.java b/src/com/android/launcher3/compat/PinItemRequestCompat.java deleted file mode 100644 index 1308cba978..0000000000 --- a/src/com/android/launcher3/compat/PinItemRequestCompat.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * 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. - */ - -package com.android.launcher3.compat; - -import android.appwidget.AppWidgetProviderInfo; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ShortcutInfo; -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; - -import com.android.launcher3.Utilities; - -/** - * A wrapper around platform implementation of PinItemRequestCompat until the - * updated SDK is available. - */ -public class PinItemRequestCompat implements Parcelable { - - public static final String EXTRA_PIN_ITEM_REQUEST = "android.content.pm.extra.PIN_ITEM_REQUEST"; - - public static final int REQUEST_TYPE_SHORTCUT = 1; - public static final int REQUEST_TYPE_APPWIDGET = 2; - - private final Parcelable mObject; - - private PinItemRequestCompat(Parcelable object) { - mObject = object; - } - - public int getRequestType() { - return (Integer) invokeMethod("getRequestType"); - } - - public ShortcutInfo getShortcutInfo() { - return (ShortcutInfo) invokeMethod("getShortcutInfo"); - } - - public AppWidgetProviderInfo getAppWidgetProviderInfo(Context context) { - try { - return (AppWidgetProviderInfo) mObject.getClass() - .getDeclaredMethod("getAppWidgetProviderInfo", Context.class) - .invoke(mObject, context); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public boolean isValid() { - return (Boolean) invokeMethod("isValid"); - } - - public boolean accept() { - return (Boolean) invokeMethod("accept"); - } - - public boolean accept(Bundle options) { - try { - return (Boolean) mObject.getClass().getDeclaredMethod("accept", Bundle.class) - .invoke(mObject, options); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public Bundle getExtras() { - try { - return (Bundle) mObject.getClass().getDeclaredMethod("getExtras").invoke(mObject); - } catch (Exception e) { - return null; - } - } - - private Object invokeMethod(String methodName) { - try { - return mObject.getClass().getDeclaredMethod(methodName).invoke(mObject); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel parcel, int i) { - parcel.writeParcelable(mObject, i); - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - public PinItemRequestCompat createFromParcel(Parcel source) { - Parcelable object = source.readParcelable(null); - return new PinItemRequestCompat(object); - } - - public PinItemRequestCompat[] newArray(int size) { - return new PinItemRequestCompat[size]; - } - }; - - public static PinItemRequestCompat getPinItemRequest(Intent intent) { - if (!Utilities.isAtLeastO()) { - return null; - } - Parcelable extra = intent.getParcelableExtra(EXTRA_PIN_ITEM_REQUEST); - return extra == null ? null : new PinItemRequestCompat(extra); - } -} diff --git a/src/com/android/launcher3/compat/ShortcutConfigActivityInfo.java b/src/com/android/launcher3/compat/ShortcutConfigActivityInfo.java index 4a55e8ca04..6bdc62743d 100644 --- a/src/com/android/launcher3/compat/ShortcutConfigActivityInfo.java +++ b/src/com/android/launcher3/compat/ShortcutConfigActivityInfo.java @@ -37,8 +37,6 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; -import java.lang.reflect.Method; - /** * Wrapper class for representing a shortcut configure activity. */ @@ -151,15 +149,13 @@ public abstract class ShortcutConfigActivityInfo { if (getUser().equals(Process.myUserHandle())) { return super.startConfigActivity(activity, requestCode); } + IntentSender is = activity.getSystemService(LauncherApps.class) + .getShortcutConfigActivityIntent(mInfo); try { - Method m = LauncherApps.class.getDeclaredMethod( - "getShortcutConfigActivityIntent", LauncherActivityInfo.class); - IntentSender is = (IntentSender) m.invoke( - activity.getSystemService(LauncherApps.class), mInfo); activity.startIntentSenderForResult(is, requestCode, null, 0, 0, 0); return true; - } catch (Exception e) { - Log.e(TAG, "Error calling new API", e); + } catch (IntentSender.SendIntentException e) { + Toast.makeText(activity, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); return false; } } diff --git a/src/com/android/launcher3/dragndrop/AddItemActivity.java b/src/com/android/launcher3/dragndrop/AddItemActivity.java index 09592a8461..29789c82c4 100644 --- a/src/com/android/launcher3/dragndrop/AddItemActivity.java +++ b/src/com/android/launcher3/dragndrop/AddItemActivity.java @@ -28,6 +28,7 @@ import android.appwidget.AppWidgetManager; import android.content.ClipData; import android.content.ClipDescription; import android.content.Intent; +import android.content.pm.LauncherApps.PinItemRequest; import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Point; @@ -50,7 +51,7 @@ import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.compat.AppWidgetManagerCompat; -import com.android.launcher3.compat.PinItemRequestCompat; +import com.android.launcher3.compat.LauncherAppsCompatVO; import com.android.launcher3.model.WidgetItem; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; @@ -60,7 +61,7 @@ import com.android.launcher3.widget.PendingAddWidgetInfo; import com.android.launcher3.widget.WidgetHostViewLoader; import com.android.launcher3.widget.WidgetImageView; -@TargetApi(Build.VERSION_CODES.N_MR1) +@TargetApi(Build.VERSION_CODES.O) public class AddItemActivity extends BaseActivity implements OnLongClickListener, OnTouchListener { private static final int SHADOW_SIZE = 10; @@ -70,7 +71,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener private final PointF mLastTouchPos = new PointF(); - private PinItemRequestCompat mRequest; + private PinItemRequest mRequest; private LauncherAppState mApp; private InvariantDeviceProfile mIdp; @@ -87,7 +88,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mRequest = PinItemRequestCompat.getPinItemRequest(getIntent()); + mRequest = LauncherAppsCompatVO.getPinItemRequest(getIntent()); if (mRequest == null) { finish(); return; @@ -101,9 +102,9 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener mDeviceProfile = mIdp.getDeviceProfile(getApplicationContext()); setContentView(R.layout.add_item_confirmation_activity); - mWidgetCell = (LivePreviewWidgetCell) findViewById(R.id.widget_cell); + mWidgetCell = findViewById(R.id.widget_cell); - if (mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_SHORTCUT) { + if (mRequest.getRequestType() == PinItemRequest.REQUEST_TYPE_SHORTCUT) { setupShortcut(); } else { if (!setupWidget()) { @@ -226,7 +227,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener * Called when place-automatically button is clicked. */ public void onPlaceAutomaticallyClick(View v) { - if (mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_SHORTCUT) { + if (mRequest.getRequestType() == PinItemRequest.REQUEST_TYPE_SHORTCUT) { InstallShortcutReceiver.queueShortcut( new ShortcutInfoCompat(mRequest.getShortcutInfo()), this); logCommand(Action.Command.CONFIRM); diff --git a/src/com/android/launcher3/dragndrop/PinItemDragListener.java b/src/com/android/launcher3/dragndrop/PinItemDragListener.java index df0c47cc42..f9f4e50f73 100644 --- a/src/com/android/launcher3/dragndrop/PinItemDragListener.java +++ b/src/com/android/launcher3/dragndrop/PinItemDragListener.java @@ -16,11 +16,14 @@ package com.android.launcher3.dragndrop; +import android.annotation.TargetApi; import android.appwidget.AppWidgetManager; import android.content.ClipDescription; import android.content.Intent; +import android.content.pm.LauncherApps.PinItemRequest; import android.graphics.Point; import android.graphics.Rect; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -40,7 +43,7 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.PendingAddItemInfo; import com.android.launcher3.R; -import com.android.launcher3.compat.PinItemRequestCompat; +import com.android.launcher3.Utilities; import com.android.launcher3.folder.Folder; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; @@ -55,6 +58,7 @@ import java.util.UUID; * {@link DragSource} for handling drop from a different window. This object is initialized * in the source window and is passed on to the Launcher activity as an Intent extra. */ +@TargetApi(Build.VERSION_CODES.O) public class PinItemDragListener implements Parcelable, View.OnDragListener, DragSource, DragOptions.PreDragCondition { @@ -63,7 +67,7 @@ public class PinItemDragListener private static final String MIME_TYPE_PREFIX = "com.android.launcher3.drag_and_drop/"; public static final String EXTRA_PIN_ITEM_DRAG_LISTENER = "pin_item_drag_listener"; - private final PinItemRequestCompat mRequest; + private final PinItemRequest mRequest; // Position of preview relative to the touch location private final Rect mPreviewRect; @@ -78,7 +82,7 @@ public class PinItemDragListener private DragController mDragController; private long mDragStartTime; - public PinItemDragListener(PinItemRequestCompat request, Rect previewRect, + public PinItemDragListener(PinItemRequest request, Rect previewRect, int previewBitmapWidth, int previewViewWidth) { mRequest = request; mPreviewRect = previewRect; @@ -88,7 +92,7 @@ public class PinItemDragListener } private PinItemDragListener(Parcel parcel) { - mRequest = PinItemRequestCompat.CREATOR.createFromParcel(parcel); + mRequest = PinItemRequest.CREATOR.createFromParcel(parcel); mPreviewRect = Rect.CREATOR.createFromParcel(parcel); mPreviewBitmapWidth = parcel.readInt(); mPreviewViewWidth = parcel.readInt(); @@ -146,7 +150,7 @@ public class PinItemDragListener } final PendingAddItemInfo item; - if (mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_SHORTCUT) { + if (mRequest.getRequestType() == PinItemRequest.REQUEST_TYPE_SHORTCUT) { item = new PendingAddShortcutInfo( new PinShortcutRequestActivityInfo(mRequest, mLauncher)); } else { @@ -177,7 +181,7 @@ public class PinItemDragListener // across windows, using drag position here give a good estimate for relative position // to source window. PendingItemDragHelper dragHelper = new PendingItemDragHelper(view); - if (mRequest.getRequestType() == PinItemRequestCompat.REQUEST_TYPE_APPWIDGET) { + if (mRequest.getRequestType() == PinItemRequest.REQUEST_TYPE_APPWIDGET) { dragHelper.setPreview(getPreview(mRequest)); } @@ -271,7 +275,7 @@ public class PinItemDragListener } } - public static RemoteViews getPreview(PinItemRequestCompat request) { + public static RemoteViews getPreview(PinItemRequest request) { Bundle extras = request.getExtras(); if (extras != null && extras.get(AppWidgetManager.EXTRA_APPWIDGET_PREVIEW) instanceof RemoteViews) { @@ -281,6 +285,9 @@ public class PinItemDragListener } public static boolean handleDragRequest(Launcher launcher, Intent intent) { + if (!Utilities.isAtLeastO()) { + return false; + } if (intent == null || !Intent.ACTION_MAIN.equals(intent.getAction())) { return false; } diff --git a/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java b/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java index bb5ac5b022..52abbc7667 100644 --- a/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java +++ b/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java @@ -21,6 +21,7 @@ import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.pm.LauncherApps; +import android.content.pm.LauncherApps.PinItemRequest; import android.content.pm.ShortcutInfo; import android.graphics.drawable.Drawable; import android.os.Build; @@ -30,26 +31,25 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; -import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.PinItemRequestCompat; +import com.android.launcher3.compat.LauncherAppsCompatVO; import com.android.launcher3.compat.ShortcutConfigActivityInfo; /** * Extension of ShortcutConfigActivityInfo to be used in the confirmation prompt for pin item * request. */ -@TargetApi(Build.VERSION_CODES.N_MR1) +@TargetApi(Build.VERSION_CODES.O) class PinShortcutRequestActivityInfo extends ShortcutConfigActivityInfo { // Class name used in the target component, such that it will never represent an // actual existing class. private static final String DUMMY_COMPONENT_CLASS = "pinned-shortcut"; - private final PinItemRequestCompat mRequest; + private final PinItemRequest mRequest; private final ShortcutInfo mInfo; private final Context mContext; - public PinShortcutRequestActivityInfo(PinItemRequestCompat request, Context context) { + public PinShortcutRequestActivityInfo(PinItemRequest request, Context context) { super(new ComponentName(request.getShortcutInfo().getPackage(), DUMMY_COMPONENT_CLASS), request.getShortcutInfo().getUserHandle()); mRequest = request; @@ -80,7 +80,7 @@ class PinShortcutRequestActivityInfo extends ShortcutConfigActivityInfo { Launcher.EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT + mContext.getResources().getInteger(R.integer.config_overlayTransitionTime) / 2; // Delay the actual accept() call until the drop animation is complete. - return LauncherAppsCompat.createShortcutInfoFromPinItemRequest( + return LauncherAppsCompatVO.createShortcutInfoFromPinItemRequest( mContext, mRequest, duration); } diff --git a/src/com/android/launcher3/dragndrop/PinWidgetFlowHandler.java b/src/com/android/launcher3/dragndrop/PinWidgetFlowHandler.java index b6da6ad339..9f617e4f61 100644 --- a/src/com/android/launcher3/dragndrop/PinWidgetFlowHandler.java +++ b/src/com/android/launcher3/dragndrop/PinWidgetFlowHandler.java @@ -16,15 +16,17 @@ package com.android.launcher3.dragndrop; +import android.annotation.TargetApi; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; +import android.content.pm.LauncherApps.PinItemRequest; +import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; -import com.android.launcher3.compat.PinItemRequestCompat; import com.android.launcher3.widget.WidgetAddFlowHandler; /** @@ -33,18 +35,19 @@ import com.android.launcher3.widget.WidgetAddFlowHandler; * No config activity is shown even if it is defined in widget config. And a callback is sent when * the widget is bound. */ +@TargetApi(Build.VERSION_CODES.O) public class PinWidgetFlowHandler extends WidgetAddFlowHandler implements Parcelable { - private final PinItemRequestCompat mRequest; + private final PinItemRequest mRequest; - public PinWidgetFlowHandler(AppWidgetProviderInfo providerInfo, PinItemRequestCompat request) { + public PinWidgetFlowHandler(AppWidgetProviderInfo providerInfo, PinItemRequest request) { super(providerInfo); mRequest = request; } protected PinWidgetFlowHandler(Parcel parcel) { super(parcel); - mRequest = PinItemRequestCompat.CREATOR.createFromParcel(parcel); + mRequest = PinItemRequest.CREATOR.createFromParcel(parcel); } @Override From a474a9bcf5d533ac942c58409e45e5ec6d8b4893 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 4 May 2017 16:47:11 -0700 Subject: [PATCH 091/446] Simplifying logic for managed for icon addition > Checking for duplicate icons before adding new icons For O and above, icon addition is controlled using SessionCommitReceiver. As long as the Launcher is the default app, it will keep adding icons on the homescreen. Apps installed while launcher was not the default homescreen, no icons will be added. For below O, icons are added based on package event. As long as the Launcher process is running, it will keep adding icons on the homescreen. Apps installed while the launcher app was dead, no icons will be added. Bug: 37528649 Bug: 37082950 Bug: 34112546 Change-Id: Ic99501fa476c00474a479f2a36c24614bfa3f4bf --- .../launcher3/InstallShortcutReceiver.java | 57 ++-- src/com/android/launcher3/Launcher.java | 16 +- src/com/android/launcher3/LauncherModel.java | 61 +--- .../launcher3/SessionCommitReceiver.java | 17 +- src/com/android/launcher3/Workspace.java | 5 +- .../launcher3/compat/UserManagerCompatVL.java | 4 +- .../model/AddWorkspaceItemsTask.java | 47 ++- .../launcher3/model/PackageUpdatedTask.java | 14 +- .../launcher3/util/CachedPackageTracker.java | 188 ----------- .../util/ManagedProfileHeuristic.java | 291 ++++++++---------- .../model/AddWorkspaceItemsTaskTest.java | 7 +- 11 files changed, 248 insertions(+), 459 deletions(-) delete mode 100644 src/com/android/launcher3/util/CachedPackageTracker.java diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index ce8557065e..b136e7d816 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -34,6 +34,7 @@ import android.os.UserHandle; import android.text.TextUtils; import android.util.Base64; import android.util.Log; +import android.util.Pair; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; @@ -59,6 +60,16 @@ import java.util.List; import java.util.Set; public class InstallShortcutReceiver extends BroadcastReceiver { + + public static final int FLAG_ACTIVITY_PAUSED = 1; + public static final int FLAG_LOADER_RUNNING = 2; + public static final int FLAG_DRAG_AND_DROP = 4; + public static final int FLAG_BULK_ADD = 4; + + // Determines whether to defer installing shortcuts immediately until + // processAllPendingInstalls() is called. + private static int sInstallQueueDisabledFlags = 0; + private static final String TAG = "InstallShortcutReceiver"; private static final boolean DBG = false; @@ -151,10 +162,6 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } } - // Determines whether to defer installing shortcuts immediately until - // processAllPendingInstalls() is called. - private static boolean mUseInstallQueue = false; - public void onReceive(Context context, Intent data) { if (!ACTION_INSTALL_SHORTCUT.equals(data.getAction())) { return; @@ -207,7 +214,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { public static ShortcutInfo fromShortcutIntent(Context context, Intent data) { PendingInstallShortcutInfo info = createPendingInfo(context, data); - return info == null ? null : (ShortcutInfo) info.getItemInfo(); + return info == null ? null : (ShortcutInfo) info.getItemInfo().first; } public static void queueShortcut(ShortcutInfoCompat info, Context context) { @@ -245,27 +252,28 @@ public class InstallShortcutReceiver extends BroadcastReceiver { private static void queuePendingShortcutInfo(PendingInstallShortcutInfo info, Context context) { // Queue the item up for adding if launcher has not loaded properly yet - LauncherAppState app = LauncherAppState.getInstance(context); - boolean launcherNotLoaded = app.getModel().getCallback() == null; - addToInstallQueue(Utilities.getPrefs(context), info); - if (!mUseInstallQueue && !launcherNotLoaded) { - flushInstallQueue(context); - } + flushInstallQueue(context); } - static void enableInstallQueue() { - mUseInstallQueue = true; + public static void enableInstallQueue(int flag) { + sInstallQueueDisabledFlags |= flag; } - static void disableAndFlushInstallQueue(Context context) { - mUseInstallQueue = false; + public static void disableAndFlushInstallQueue(int flag, Context context) { + sInstallQueueDisabledFlags &= ~flag; flushInstallQueue(context); } static void flushInstallQueue(Context context) { + LauncherModel model = LauncherAppState.getInstance(context).getModel(); + boolean launcherNotLoaded = model.getCallback() == null; + if (sInstallQueueDisabledFlags != 0 || launcherNotLoaded) { + return; + } + ArrayList items = getAndClearInstallQueue(context); if (!items.isEmpty()) { - LauncherAppState.getInstance(context).getModel().addAndBindAddedWorkspaceItems( + model.addAndBindAddedWorkspaceItems( new LazyShortcutsProvider(context.getApplicationContext(), items)); } } @@ -439,7 +447,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } } - public ItemInfo getItemInfo() { + public Pair getItemInfo() { if (activityInfo != null) { AppInfo appInfo = new AppInfo(mContext, activityInfo, user); final LauncherAppState app = LauncherAppState.getInstance(mContext); @@ -459,11 +467,11 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } }); } - return si; + return Pair.create((ItemInfo) si, (Object) activityInfo); } else if (shortcutInfo != null) { ShortcutInfo si = new ShortcutInfo(shortcutInfo, mContext); si.iconBitmap = LauncherIcons.createShortcutIcon(shortcutInfo, mContext); - return si; + return Pair.create((ItemInfo) si, (Object) shortcutInfo); } else if (providerInfo != null) { LauncherAppWidgetProviderInfo info = LauncherAppWidgetProviderInfo .fromProviderInfo(mContext, providerInfo); @@ -475,9 +483,10 @@ public class InstallShortcutReceiver extends BroadcastReceiver { widgetInfo.minSpanY = info.minSpanY; widgetInfo.spanX = Math.min(info.spanX, idp.numColumns); widgetInfo.spanY = Math.min(info.spanY, idp.numRows); - return widgetInfo; + return Pair.create((ItemInfo) widgetInfo, (Object) providerInfo); } else { - return createShortcutInfo(data, LauncherAppState.getInstance(mContext)); + ShortcutInfo si = createShortcutInfo(data, LauncherAppState.getInstance(mContext)); + return Pair.create((ItemInfo) si, null); } } @@ -588,7 +597,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { return new PendingInstallShortcutInfo(info, original.mContext); } - private static class LazyShortcutsProvider extends Provider> { + private static class LazyShortcutsProvider extends Provider>> { private final Context mContext; private final ArrayList mPendingItems; @@ -603,9 +612,9 @@ public class InstallShortcutReceiver extends BroadcastReceiver { * packageManager and icon cache. */ @Override - public ArrayList get() { + public ArrayList> get() { Preconditions.assertNonUiThread(); - ArrayList installQueue = new ArrayList<>(); + ArrayList> installQueue = new ArrayList<>(); LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(mContext); for (PendingInstallShortcutInfo pendingInfo : mPendingItems) { // If the intent specifies a package, make sure the package exists diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index b63bbd5480..b9b561020c 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1036,13 +1036,12 @@ public class Launcher extends BaseActivity updateInteraction(Workspace.State.NORMAL, mWorkspace.getState()); mWorkspace.onResume(); - if (!isWorkspaceLoading()) { - // Process any items that were added while Launcher was away. - InstallShortcutReceiver.disableAndFlushInstallQueue(this); + // Process any items that were added while Launcher was away. + InstallShortcutReceiver.disableAndFlushInstallQueue( + InstallShortcutReceiver.FLAG_ACTIVITY_PAUSED, this); - // Refresh shortcuts if the permission changed. - mModel.refreshShortcutsIfRequired(); - } + // Refresh shortcuts if the permission changed. + mModel.refreshShortcutsIfRequired(); if (shouldShowDiscoveryBounce()) { mAllAppsController.showDiscoveryBounce(); @@ -1057,7 +1056,7 @@ public class Launcher extends BaseActivity @Override protected void onPause() { // Ensure that items added to Launcher are queued until Launcher returns - InstallShortcutReceiver.enableInstallQueue(); + InstallShortcutReceiver.enableInstallQueue(InstallShortcutReceiver.FLAG_ACTIVITY_PAUSED); super.onPause(); mPaused = true; @@ -3655,7 +3654,8 @@ public class Launcher extends BaseActivity mPendingActivityResult = null; } - InstallShortcutReceiver.disableAndFlushInstallQueue(this); + InstallShortcutReceiver.disableAndFlushInstallQueue( + InstallShortcutReceiver.FLAG_LOADER_RUNNING, this); NotificationListener.setNotificationsChangedListener(mPopupDataProvider); diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 12789c55a5..b5ca301d0c 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -40,6 +40,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.LongSparseArray; import android.util.MutableInt; +import android.util.Pair; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.LauncherAppsCompat; @@ -138,12 +139,6 @@ public class LauncherModel extends BroadcastReceiver } } - /** - * Set of runnables to be called on the background thread after the workspace binding - * is complete. - */ - static final ArrayList mBindCompleteRunnables = new ArrayList(); - @Thunk WeakReference mCallbacks; // < only access in worker thread > @@ -248,18 +243,11 @@ public class LauncherModel extends BroadcastReceiver CacheDataUpdatedTask.OP_SESSION_UPDATE, Process.myUserHandle(), packages)); } - /** - * Adds the provided items to the workspace. - */ - public void addAndBindAddedWorkspaceItems(List workspaceApps) { - addAndBindAddedWorkspaceItems(Provider.of(workspaceApps)); - } - /** * Adds the provided items to the workspace. */ public void addAndBindAddedWorkspaceItems( - Provider> appsProvider) { + Provider>> appsProvider) { enqueueModelUpdateTask(new AddWorkspaceItemsTask(appsProvider)); } @@ -529,7 +517,7 @@ public class LauncherModel extends BroadcastReceiver */ public boolean startLoader(int synchronousBindPage) { // Enable queue before starting loader. It will get disabled in Launcher#finishBindingItems - InstallShortcutReceiver.enableInstallQueue(); + InstallShortcutReceiver.enableInstallQueue(InstallShortcutReceiver.FLAG_LOADER_RUNNING); synchronized (mLock) { // Don't bother to start the thread if we know it's not going to do anything if (mCallbacks != null && mCallbacks.get() != null) { @@ -607,7 +595,6 @@ public class LauncherModel extends BroadcastReceiver private Context mContext; private int mPageToBindFirst; - @Thunk boolean mIsLoadingAndBindingWorkspace; private boolean mStopped; LoaderTask(Context context, int pageToBindFirst) { @@ -675,8 +662,6 @@ public class LauncherModel extends BroadcastReceiver try { long now = 0; if (DEBUG_LOADERS) Log.d(TAG, "step 1.1: loading workspace"); - // Set to false in bindWorkspace() - mIsLoadingAndBindingWorkspace = true; loadWorkspace(); verifyNotStopped(); @@ -1584,18 +1569,6 @@ public class LauncherModel extends BroadcastReceiver callbacks.finishBindingItems(); } - mIsLoadingAndBindingWorkspace = false; - - // Run all the bind complete runnables after workspace is bound. - if (!mBindCompleteRunnables.isEmpty()) { - synchronized (mBindCompleteRunnables) { - for (final Runnable r : mBindCompleteRunnables) { - runOnWorkerThread(r); - } - mBindCompleteRunnables.clear(); - } - } - // If we're profiling, ensure this is the last thing in the queue. if (DEBUG_LOADERS) { Log.d(TAG, "bound workspace in " @@ -1710,31 +1683,7 @@ public class LauncherModel extends BroadcastReceiver mBgAllAppsList.add(new AppInfo(app, user, quietMode), app); } - final ManagedProfileHeuristic heuristic = ManagedProfileHeuristic.get(mContext, user); - if (heuristic != null) { - final Runnable r = new Runnable() { - - @Override - public void run() { - heuristic.processUserApps(apps); - } - }; - mUiExecutor.execute(new Runnable() { - - @Override - public void run() { - // Check isLoadingWorkspace on the UI thread, as it is updated on - // the UI thread. - if (mIsLoadingAndBindingWorkspace) { - synchronized (mBindCompleteRunnables) { - mBindCompleteRunnables.add(r); - } - } else { - runOnWorkerThread(r); - } - } - }); - } + ManagedProfileHeuristic.onAllAppsLoaded(mContext, apps, user); } if (FeatureFlags.LAUNCHER3_PROMISE_APPS_IN_ALL_APPS) { @@ -1768,8 +1717,6 @@ public class LauncherModel extends BroadcastReceiver } } }); - // Cleanup any data stored for a deleted user. - ManagedProfileHeuristic.processAllUsers(profiles, mContext); if (DEBUG_LOADERS) { Log.d(TAG, "Icons processed in " + (SystemClock.uptimeMillis() - loadTime) + "ms"); diff --git a/src/com/android/launcher3/SessionCommitReceiver.java b/src/com/android/launcher3/SessionCommitReceiver.java index 61bcc178cf..8caba75cd5 100644 --- a/src/com/android/launcher3/SessionCommitReceiver.java +++ b/src/com/android/launcher3/SessionCommitReceiver.java @@ -67,18 +67,19 @@ public class SessionCommitReceiver extends BroadcastReceiver { SessionInfo info = intent.getParcelableExtra(PackageInstaller.EXTRA_SESSION); UserHandle user = intent.getParcelableExtra(Intent.EXTRA_USER); - if (TextUtils.isEmpty(info.getAppPackageName()) || - info.getInstallReason() != PackageManager.INSTALL_REASON_USER) { - return; + if (Process.myUserHandle().equals(user)) { + if (TextUtils.isEmpty(info.getAppPackageName()) || + info.getInstallReason() != PackageManager.INSTALL_REASON_USER) { + return; + } } - if (!Process.myUserHandle().equals(user)) { - // Managed profile is handled using ManagedProfileHeuristic - return; - } + queueAppIconAddition(context, info.getAppPackageName(), user); + } + public static void queueAppIconAddition(Context context, String packageName, UserHandle user) { List activities = LauncherAppsCompat.getInstance(context) - .getActivityList(info.getAppPackageName(), user); + .getActivityList(packageName, user); if (activities == null || activities.isEmpty()) { // no activity found return; diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index b3dd7ac60e..672203cc50 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -451,7 +451,7 @@ public class Workspace extends PagedView mLauncher.lockScreenOrientation(); mLauncher.onInteractionBegin(); // Prevent any Un/InstallShortcutReceivers from updating the db while we are dragging - InstallShortcutReceiver.enableInstallQueue(); + InstallShortcutReceiver.enableInstallQueue(InstallShortcutReceiver.FLAG_DRAG_AND_DROP); // Do not add a new page if it is a accessible drag which was not started by the workspace. // We do not support accessibility drag from other sources and instead provide a direct @@ -504,7 +504,8 @@ public class Workspace extends PagedView mLauncher.unlockScreenOrientation(false); // Re-enable any Un/InstallShortcutReceiver and now process any queued items - InstallShortcutReceiver.disableAndFlushInstallQueue(getContext()); + InstallShortcutReceiver.disableAndFlushInstallQueue( + InstallShortcutReceiver.FLAG_DRAG_AND_DROP, getContext()); mOutlineProvider = null; mDragInfo = null; diff --git a/src/com/android/launcher3/compat/UserManagerCompatVL.java b/src/com/android/launcher3/compat/UserManagerCompatVL.java index 45525f5214..c7f88f63d1 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVL.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java @@ -22,8 +22,8 @@ import android.content.pm.PackageManager; import android.os.UserHandle; import android.os.UserManager; -import com.android.launcher3.Utilities; import com.android.launcher3.util.LongArrayMap; +import com.android.launcher3.util.ManagedProfileHeuristic; import java.util.ArrayList; import java.util.Collections; @@ -122,7 +122,7 @@ public class UserManagerCompatVL extends UserManagerCompat { @Override public long getUserCreationTime(UserHandle user) { - SharedPreferences prefs = Utilities.getPrefs(mContext); + SharedPreferences prefs = ManagedProfileHeuristic.prefs(mContext); String key = USER_CREATION_TIME_KEY + getSerialNumberForUser(user); if (!prefs.contains(key)) { prefs.edit().putLong(key, System.currentTimeMillis()).apply(); diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index 10fb5828cb..2e8e15bf7b 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -17,6 +17,8 @@ package com.android.launcher3.model; import android.content.Context; import android.content.Intent; +import android.content.pm.LauncherActivityInfo; +import android.os.Process; import android.os.UserHandle; import android.util.LongSparseArray; import android.util.Pair; @@ -35,9 +37,11 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.util.GridOccupancy; +import com.android.launcher3.util.ManagedProfileHeuristic.UserFolderInfo; import com.android.launcher3.util.Provider; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; /** @@ -45,18 +49,18 @@ import java.util.List; */ public class AddWorkspaceItemsTask extends ExtendedModelTask { - private final Provider> mAppsProvider; + private final Provider>> mAppsProvider; /** * @param appsProvider items to add on the workspace */ - public AddWorkspaceItemsTask(Provider> appsProvider) { + public AddWorkspaceItemsTask(Provider>> appsProvider) { mAppsProvider = appsProvider; } @Override public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { - List workspaceApps = mAppsProvider.get(); + List> workspaceApps = mAppsProvider.get(); if (workspaceApps.isEmpty()) { return; } @@ -64,13 +68,17 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { final ArrayList addedItemsFinal = new ArrayList<>(); final ArrayList addedWorkspaceScreensFinal = new ArrayList<>(); + HashMap userFolderMap = new HashMap<>(); // Get the list of workspace screens. We need to append to this list and // can not use sBgWorkspaceScreens because loadWorkspace() may not have been // called. ArrayList workspaceScreens = LauncherModel.loadWorkspaceScreensDb(context); synchronized(dataModel) { - for (ItemInfo item : workspaceApps) { + + List filteredItems = new ArrayList<>(); + for (Pair entry : workspaceApps) { + ItemInfo item = entry.first; if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) { // Short-circuit this logic if the icon exists somewhere on the workspace @@ -79,6 +87,32 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { } } + if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { + if (item instanceof AppInfo) { + item = ((AppInfo) item).makeShortcut(); + } + + if (!Process.myUserHandle().equals(item.user)) { + // Check if this belongs to a work folder. + if (!(entry.second instanceof LauncherActivityInfo)) { + continue; + } + + UserFolderInfo userFolderInfo = userFolderMap.get(item.user); + if (userFolderInfo == null) { + userFolderInfo = new UserFolderInfo(context, item.user, dataModel); + userFolderMap.put(item.user, userFolderInfo); + } + item = userFolderInfo.convertToWorkspaceItem( + (ShortcutInfo) item, (LauncherActivityInfo) entry.second); + } + } + if (item != null) { + filteredItems.add(item); + } + } + + for (ItemInfo item : filteredItems) { // Find appropriate space for the item. Pair coords = findSpaceForItem(app, dataModel, workspaceScreens, addedWorkspaceScreensFinal, item.spanX, item.spanY); @@ -130,6 +164,10 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { } }); } + + for (UserFolderInfo userFolderInfo : userFolderMap.values()) { + userFolderInfo.applyPendingState(getModelWriter()); + } } protected void updateScreens(Context context, ArrayList workspaceScreens) { @@ -276,4 +314,5 @@ public class AddWorkspaceItemsTask extends ExtendedModelTask { } return occupied.findVacantCell(xy, spanX, spanY); } + } diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index b58efb6478..8380f01361 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -35,6 +35,7 @@ import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings.Favorites; +import com.android.launcher3.SessionCommitReceiver; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherAppsCompat; @@ -43,7 +44,6 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.ItemInfoMatcher; -import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; @@ -100,11 +100,11 @@ public class PackageUpdatedTask extends ExtendedModelTask { appsList.removePackage(packages[i], Process.myUserHandle()); } appsList.addPackage(context, packages[i], mUser); - } - ManagedProfileHeuristic heuristic = ManagedProfileHeuristic.get(context, mUser); - if (heuristic != null) { - heuristic.processPackageAdd(mPackages); + // Automatically add homescreen icon for work profile apps for below O device. + if (!Utilities.isAtLeastO() && !Process.myUserHandle().equals(mUser)) { + SessionCommitReceiver.queueAppIconAddition(context, packages[i], mUser); + } } break; } @@ -119,10 +119,6 @@ public class PackageUpdatedTask extends ExtendedModelTask { flagOp = FlagOp.removeFlag(ShortcutInfo.FLAG_DISABLED_NOT_AVAILABLE); break; case OP_REMOVE: { - ManagedProfileHeuristic heuristic = ManagedProfileHeuristic.get(context, mUser); - if (heuristic != null) { - heuristic.processPackageRemoved(mPackages); - } for (int i = 0; i < N; i++) { iconCache.removeIconsForPkg(packages[i], mUser); } diff --git a/src/com/android/launcher3/util/CachedPackageTracker.java b/src/com/android/launcher3/util/CachedPackageTracker.java deleted file mode 100644 index 314b4c0edb..0000000000 --- a/src/com/android/launcher3/util/CachedPackageTracker.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.launcher3.util; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.pm.LauncherActivityInfo; -import android.os.UserHandle; - -import com.android.launcher3.Utilities; -import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.LauncherAppsCompat.OnAppsChangedCallbackCompat; -import com.android.launcher3.compat.UserManagerCompat; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Utility class to track list of installed packages. It persists the list so that apps - * installed/uninstalled while Launcher was dead can also be handled properly. - */ -public abstract class CachedPackageTracker implements OnAppsChangedCallbackCompat { - - protected static final String INSTALLED_PACKAGES_PREFIX = "installed_packages_for_user_"; - - protected final SharedPreferences mPrefs; - protected final UserManagerCompat mUserManager; - protected final LauncherAppsCompat mLauncherApps; - - public CachedPackageTracker(Context context, String preferenceFileName) { - mPrefs = context.getSharedPreferences(preferenceFileName, Context.MODE_PRIVATE); - mUserManager = UserManagerCompat.getInstance(context); - mLauncherApps = LauncherAppsCompat.getInstance(context); - } - - /** - * Checks the list of user apps, and generates package event accordingly. - * {@see #onLauncherAppsAdded}, {@see #onLauncherPackageRemoved} - */ - public void processUserApps(List apps, UserHandle user) { - String prefKey = INSTALLED_PACKAGES_PREFIX + mUserManager.getSerialNumberForUser(user); - HashSet oldPackageSet = new HashSet<>(); - final boolean userAppsExisted = getUserApps(oldPackageSet, prefKey); - - HashSet packagesRemoved = new HashSet<>(oldPackageSet); - HashSet newPackageSet = new HashSet<>(); - ArrayList packagesAdded = new ArrayList<>(); - - for (LauncherActivityInfo info : apps) { - String packageName = info.getComponentName().getPackageName(); - newPackageSet.add(packageName); - packagesRemoved.remove(packageName); - - if (!oldPackageSet.contains(packageName)) { - oldPackageSet.add(packageName); - packagesAdded.add(new LauncherActivityInstallInfo( - info, info.getFirstInstallTime())); - } - } - - if (!packagesAdded.isEmpty() || !packagesRemoved.isEmpty()) { - mPrefs.edit().putStringSet(prefKey, newPackageSet).apply(); - - if (!packagesAdded.isEmpty()) { - Collections.sort(packagesAdded); - onLauncherAppsAdded(packagesAdded, user, userAppsExisted); - } - - if (!packagesRemoved.isEmpty()) { - for (String pkg : packagesRemoved) { - onLauncherPackageRemoved(pkg, user); - } - } - } - } - - /** - * Reads the list of user apps which have already been processed. - * @return false if the list didn't exist, true otherwise - */ - private boolean getUserApps(HashSet outExistingApps, String prefKey) { - Set userApps = mPrefs.getStringSet(prefKey, null); - if (userApps == null) { - return false; - } else { - outExistingApps.addAll(userApps); - return true; - } - } - - @Override - public void onPackageRemoved(String packageName, UserHandle user) { - String prefKey = INSTALLED_PACKAGES_PREFIX + mUserManager.getSerialNumberForUser(user); - HashSet packageSet = new HashSet<>(); - if (getUserApps(packageSet, prefKey) && packageSet.remove(packageName)) { - mPrefs.edit().putStringSet(prefKey, packageSet).apply(); - } - - onLauncherPackageRemoved(packageName, user); - } - - @Override - public void onPackageAdded(String packageName, UserHandle user) { - String prefKey = INSTALLED_PACKAGES_PREFIX + mUserManager.getSerialNumberForUser(user); - HashSet packageSet = new HashSet<>(); - final boolean userAppsExisted = getUserApps(packageSet, prefKey); - if (!packageSet.contains(packageName)) { - List activities = - mLauncherApps.getActivityList(packageName, user); - if (!activities.isEmpty()) { - LauncherActivityInfo activityInfo = activities.get(0); - - packageSet.add(packageName); - mPrefs.edit().putStringSet(prefKey, packageSet).apply(); - onLauncherAppsAdded(Arrays.asList( - new LauncherActivityInstallInfo(activityInfo, System.currentTimeMillis())), - user, userAppsExisted); - } - } - } - - @Override - public void onPackageChanged(String packageName, UserHandle user) { } - - @Override - public void onPackagesAvailable( - String[] packageNames, UserHandle user, boolean replacing) { } - - @Override - public void onPackagesUnavailable( - String[] packageNames, UserHandle user, boolean replacing) { } - - @Override - public void onPackagesSuspended(String[] packageNames, UserHandle user) { } - - @Override - public void onPackagesUnsuspended(String[] packageNames, UserHandle user) { } - - /** - * Called when new launcher apps are added. - * @param apps list of newly added activities. Only one entry per package is sent. - * @param user the user for this event. All activities in {@param apps} will belong to - * the same user. - * @param userAppsExisted false if the list was processed for the first time, like in case - * when Launcher was newly installed or a new user was added. - */ - protected abstract void onLauncherAppsAdded(List apps, - UserHandle user, boolean userAppsExisted); - - /** - * Called when apps are removed from the system. - */ - protected abstract void onLauncherPackageRemoved(String packageName, UserHandle user); - - public static class LauncherActivityInstallInfo - implements Comparable { - public final LauncherActivityInfo info; - public final long installTime; - - public LauncherActivityInstallInfo(LauncherActivityInfo info, long installTime) { - this.info = info; - this.installTime = installTime; - } - - @Override - public int compareTo(LauncherActivityInstallInfo another) { - return Utilities.longCompare(installTime, another.installTime); - } - } -} diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java index ce603c4c2d..091dd84bc1 100644 --- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java +++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java @@ -19,23 +19,23 @@ package com.android.launcher3.util; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.LauncherActivityInfo; +import android.os.Handler; import android.os.Process; import android.os.UserHandle; -import android.support.v4.os.BuildCompat; -import com.android.launcher3.AppInfo; import com.android.launcher3.FolderInfo; -import com.android.launcher3.IconCache; +import com.android.launcher3.InstallShortcutReceiver; import com.android.launcher3.ItemInfo; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherFiles; import com.android.launcher3.LauncherModel; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.R; import com.android.launcher3.SessionCommitReceiver; import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.Utilities; import com.android.launcher3.compat.UserManagerCompat; -import com.android.launcher3.shortcuts.ShortcutInfoCompat; +import com.android.launcher3.model.BgDataModel; +import com.android.launcher3.model.ModelWriter; import java.util.ArrayList; import java.util.HashSet; @@ -47,11 +47,6 @@ import java.util.List; */ public class ManagedProfileHeuristic { - /** - * Maintain a set of packages installed per user. - */ - private static final String INSTALLED_PACKAGES_PREFIX = "installed_packages_for_user_"; - private static final String USER_FOLDER_ID_PREFIX = "user_folder_"; /** @@ -59,165 +54,154 @@ public class ManagedProfileHeuristic { */ private static final long AUTO_ADD_TO_FOLDER_DURATION = 8 * 60 * 60 * 1000; - public static ManagedProfileHeuristic get(Context context, UserHandle user) { - if (!Process.myUserHandle().equals(user)) { - return new ManagedProfileHeuristic(context, user); - } - return null; - } - - private final Context mContext; - private final LauncherModel mModel; - private final UserHandle mUser; - private final IconCache mIconCache; - private final boolean mAddIconsToHomescreen; - - private ManagedProfileHeuristic(Context context, UserHandle user) { - mContext = context; - mUser = user; - mModel = LauncherAppState.getInstance(context).getModel(); - mIconCache = LauncherAppState.getInstance(context).getIconCache(); - mAddIconsToHomescreen = - !BuildCompat.isAtLeastO() || SessionCommitReceiver.isEnabled(context); - } - - public void processPackageRemoved(String[] packages) { - Preconditions.assertWorkerThread(); - ManagedProfilePackageHandler handler = new ManagedProfilePackageHandler(); - for (String pkg : packages) { - handler.onPackageRemoved(pkg, mUser); - } - } - - public void processPackageAdd(String[] packages) { - Preconditions.assertWorkerThread(); - ManagedProfilePackageHandler handler = new ManagedProfilePackageHandler(); - for (String pkg : packages) { - handler.onPackageAdded(pkg, mUser); - } - } - - public void processUserApps(List apps) { - Preconditions.assertWorkerThread(); - new ManagedProfilePackageHandler().processUserApps(apps, mUser); - } - - private class ManagedProfilePackageHandler extends CachedPackageTracker { - - private ManagedProfilePackageHandler() { - super(mContext, LauncherFiles.MANAGED_USER_PREFERENCES_KEY); + public static void onAllAppsLoaded(final Context context, + List apps, UserHandle user) { + if (Process.myUserHandle().equals(user)) { + return; } - protected void onLauncherAppsAdded( - List apps, UserHandle user, boolean userAppsExisted) { - ArrayList workFolderApps = new ArrayList<>(); - ArrayList homescreenApps = new ArrayList<>(); + UserFolderInfo ufi = new UserFolderInfo(context, user, null); + // We only handle folder creation once. Later icon additions are handled using package + // or session events. + if (ufi.folderAlreadyCreated) { + return; + } - int count = apps.size(); - long folderCreationTime = - mUserManager.getUserCreationTime(user) + AUTO_ADD_TO_FOLDER_DURATION; + if (Utilities.isAtLeastO() && !SessionCommitReceiver.isEnabled(context)) { + // Just mark the folder id preference to avoid new folder creation later. + ufi.prefs.edit().putLong(ufi.folderIdKey, ItemInfo.NO_ID).apply(); + return; + } - boolean quietModeEnabled = UserManagerCompat.getInstance(mContext) - .isQuietModeEnabled(user); - for (int i = 0; i < count; i++) { - LauncherActivityInstallInfo info = apps.get(i); - AppInfo appInfo = new AppInfo(info.info, user, quietModeEnabled); - mIconCache.getTitleAndIcon(appInfo, info.info, false /* useLowResIcon */); - ShortcutInfo si = appInfo.makeShortcut(); - ((info.installTime <= folderCreationTime) ? workFolderApps : homescreenApps).add(si); - } - - finalizeWorkFolder(user, workFolderApps, homescreenApps); - - // Do not add shortcuts on the homescreen for the first time. This prevents the launcher - // getting filled with the managed user apps, when it start with a fresh DB (or after - // a very long time). - if (userAppsExisted && !homescreenApps.isEmpty() && mAddIconsToHomescreen) { - mModel.addAndBindAddedWorkspaceItems(new ArrayList(homescreenApps)); + InstallShortcutReceiver.enableInstallQueue(InstallShortcutReceiver.FLAG_BULK_ADD); + for (LauncherActivityInfo app : apps) { + // Queue all items which should go in the work folder. + if (app.getFirstInstallTime() < ufi.addIconToFolderTime) { + InstallShortcutReceiver.queueActivityInfo(app, context); } } + // Post the queue update on next frame, so that the loader gets finished. + new Handler(LauncherModel.getWorkerLooper()).post(new Runnable() { + @Override + public void run() { + InstallShortcutReceiver.disableAndFlushInstallQueue( + InstallShortcutReceiver.FLAG_BULK_ADD, context); + } + }); + } - @Override - protected void onLauncherPackageRemoved(String packageName, UserHandle user) { + + /** + * Utility class to help workspace icon addition. + */ + public static class UserFolderInfo { + + final ArrayList pendingShortcuts = new ArrayList<>(); + + final UserHandle user; + + final long userSerial; + // Time until which icons will be added to folder instead. + final long addIconToFolderTime; + + final String folderIdKey; + final SharedPreferences prefs; + + final boolean folderAlreadyCreated; + final FolderInfo folderInfo; + + boolean folderPendingAddition; + + public UserFolderInfo(Context context, UserHandle user, BgDataModel dataModel) { + this.user = user; + + UserManagerCompat um = UserManagerCompat.getInstance(context); + userSerial = um.getSerialNumberForUser(user); + addIconToFolderTime = um.getUserCreationTime(user) + AUTO_ADD_TO_FOLDER_DURATION; + + folderIdKey = USER_FOLDER_ID_PREFIX + userSerial; + prefs = prefs(context); + + folderAlreadyCreated = prefs.contains(folderIdKey); + if (dataModel != null) { + if (folderAlreadyCreated) { + long folderId = prefs.getLong(folderIdKey, ItemInfo.NO_ID); + folderInfo = dataModel.folders.get(folderId); + } else { + folderInfo = new FolderInfo(); + folderInfo.title = context.getText(R.string.work_folder_name); + folderInfo.setOption(FolderInfo.FLAG_WORK_FOLDER, true, null); + folderPendingAddition = true; + } + } else { + folderInfo = null; + } } /** - * Adds and binds shortcuts marked to be added to the work folder. + * Returns the ItemInfo which should be added to the workspace. In case the the provided + * {@link ShortcutInfo} or a wrapped {@link FolderInfo} or null. */ - private void finalizeWorkFolder( - UserHandle user, final ArrayList workFolderApps, - ArrayList homescreenApps) { - if (workFolderApps.isEmpty()) { + public ItemInfo convertToWorkspaceItem( + ShortcutInfo shortcut, LauncherActivityInfo activityInfo) { + if (activityInfo.getFirstInstallTime() >= addIconToFolderTime) { + return shortcut; + } + + if (folderAlreadyCreated) { + if (folderInfo == null) { + // Work folder was deleted by user, add icon to home screen. + return shortcut; + } else { + // Add item to work folder instead. Nothing needs to be added + // on the homescreen. + pendingShortcuts.add(shortcut); + return null; + } + } + + pendingShortcuts.add(shortcut); + folderInfo.add(shortcut, false); + if (folderPendingAddition) { + folderPendingAddition = false; + return folderInfo; + } else { + // WorkFolder already requested to be added. Nothing new needs to be added. + return null; + } + } + + public void applyPendingState(ModelWriter writer) { + if (folderInfo == null) { return; } - // Try to get a work folder. - String folderIdKey = USER_FOLDER_ID_PREFIX + mUserManager.getSerialNumberForUser(user); - if (!mAddIconsToHomescreen) { - if (!mPrefs.contains(folderIdKey)) { - // Just mark the folder id preference to avoid new folder creation later. - mPrefs.edit().putLong(folderIdKey, -1).apply(); - } - return; + + int startingRank = 0; + if (folderAlreadyCreated) { + startingRank = folderInfo.contents.size(); } - if (mPrefs.contains(folderIdKey)) { - long folderId = mPrefs.getLong(folderIdKey, 0); - final FolderInfo workFolder = mModel.findFolderById(folderId); - if (workFolder == null || !workFolder.hasOption(FolderInfo.FLAG_WORK_FOLDER)) { - // Could not get a work folder. Add all the icons to homescreen. - homescreenApps.addAll(0, workFolderApps); - return; - } - saveWorkFolderShortcuts(folderId, workFolder.contents.size(), workFolderApps); + for (ShortcutInfo info : pendingShortcuts) { + info.rank = startingRank++; + writer.addItemToDatabase(info, folderInfo.id, 0, 0, 0); + } + if (folderAlreadyCreated) { // FolderInfo could already be bound. We need to add shortcuts on the UI thread. new MainThreadExecutor().execute(new Runnable() { @Override public void run() { - workFolder.prepareAutoUpdate(); - for (ShortcutInfo info : workFolderApps) { - workFolder.add(info, false); + folderInfo.prepareAutoUpdate(); + for (ShortcutInfo info : pendingShortcuts) { + folderInfo.add(info, false); } } }); } else { - // Create a new folder. - final FolderInfo workFolder = new FolderInfo(); - workFolder.title = mContext.getText(R.string.work_folder_name); - workFolder.setOption(FolderInfo.FLAG_WORK_FOLDER, true, null); - - // Add all shortcuts before adding it to the UI, as an empty folder might get deleted. - for (ShortcutInfo info : workFolderApps) { - workFolder.add(info, false); - } - - // Add the item to home screen and DB. This also generates an item id synchronously. - ArrayList itemList = new ArrayList<>(1); - itemList.add(workFolder); - mModel.addAndBindAddedWorkspaceItems(itemList); - mPrefs.edit().putLong(folderIdKey, workFolder.id).apply(); - - saveWorkFolderShortcuts(workFolder.id, 0, workFolderApps); + prefs.edit().putLong(folderIdKey, folderInfo.id).apply(); } } - - @Override - public void onShortcutsChanged(String packageName, List shortcuts, - UserHandle user) { - // Do nothing - } - } - - /** - * Add work folder shortcuts to the DB. - */ - private void saveWorkFolderShortcuts( - long workFolderId, int startingRank, ArrayList workFolderApps) { - for (ItemInfo info : workFolderApps) { - info.rank = startingRank++; - mModel.getWriter(false).addItemToDatabase(info, workFolderId, 0, 0, 0); - } } /** @@ -225,14 +209,12 @@ public class ManagedProfileHeuristic { */ public static void processAllUsers(List users, Context context) { UserManagerCompat userManager = UserManagerCompat.getInstance(context); - HashSet validKeys = new HashSet(); + HashSet validKeys = new HashSet<>(); for (UserHandle user : users) { - addAllUserKeys(userManager.getSerialNumberForUser(user), validKeys); + validKeys.add(USER_FOLDER_ID_PREFIX + userManager.getSerialNumberForUser(user)); } - SharedPreferences prefs = context.getSharedPreferences( - LauncherFiles.MANAGED_USER_PREFERENCES_KEY, - Context.MODE_PRIVATE); + SharedPreferences prefs = prefs(context); SharedPreferences.Editor editor = prefs.edit(); for (String key : prefs.getAll().keySet()) { if (!validKeys.contains(key)) { @@ -242,11 +224,6 @@ public class ManagedProfileHeuristic { editor.apply(); } - private static void addAllUserKeys(long userSerial, HashSet keysOut) { - keysOut.add(INSTALLED_PACKAGES_PREFIX + userSerial); - keysOut.add(USER_FOLDER_ID_PREFIX + userSerial); - } - /** * For each user, if a work folder has not been created, mark it such that the folder will * never get created. @@ -260,11 +237,8 @@ public class ManagedProfileHeuristic { if (myUser.equals(user)) { continue; } - if (prefs == null) { - prefs = context.getSharedPreferences( - LauncherFiles.MANAGED_USER_PREFERENCES_KEY, - Context.MODE_PRIVATE); + prefs = prefs(context); } String folderIdKey = USER_FOLDER_ID_PREFIX + userManager.getSerialNumberForUser(user); if (!prefs.contains(folderIdKey)) { @@ -272,4 +246,9 @@ public class ManagedProfileHeuristic { } } } + + public static SharedPreferences prefs(Context context) { + return context.getSharedPreferences( + LauncherFiles.MANAGED_USER_PREFERENCES_KEY, Context.MODE_PRIVATE); + } } diff --git a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java index 883be5aa3d..4c80902f00 100644 --- a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java +++ b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java @@ -21,6 +21,7 @@ import org.mockito.ArgumentCaptor; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static org.mockito.Mockito.any; import static org.mockito.Mockito.verify; @@ -50,7 +51,11 @@ public class AddWorkspaceItemsTaskTest extends BaseModelUpdateTaskTestCase { } private AddWorkspaceItemsTask newTask(ItemInfo... items) { - return new AddWorkspaceItemsTask(Provider.of(Arrays.asList(items))) { + List> list = new ArrayList<>(); + for (ItemInfo item : items) { + list.add(Pair.create(item, null)); + } + return new AddWorkspaceItemsTask(Provider.of(list)) { @Override protected void updateScreens(Context context, ArrayList workspaceScreens) { } From c476d6e192494b14b91e76cbce5c9cec01588059 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 4 May 2017 16:30:01 -0700 Subject: [PATCH 092/446] Allow user to place PendingAddShortcutInfo in opened Folder. Current implementation only allowed dropping PendingAddShortcutInfo on a FolderIcon. Bug: 37814579 Change-Id: Ice42421c34665b0ebf199945761c5c86614573a4 --- src/com/android/launcher3/FolderInfo.java | 14 ++- src/com/android/launcher3/Launcher.java | 87 ++++++++----- src/com/android/launcher3/folder/Folder.java | 115 ++++++++++-------- .../android/launcher3/folder/FolderIcon.java | 11 +- .../launcher3/folder/FolderPagedView.java | 11 +- 5 files changed, 144 insertions(+), 94 deletions(-) diff --git a/src/com/android/launcher3/FolderInfo.java b/src/com/android/launcher3/FolderInfo.java index 0041bb4d63..21254ab292 100644 --- a/src/com/android/launcher3/FolderInfo.java +++ b/src/com/android/launcher3/FolderInfo.java @@ -65,9 +65,17 @@ public class FolderInfo extends ItemInfo { * @param item */ public void add(ShortcutInfo item, boolean animate) { - contents.add(item); + add(item, contents.size(), animate); + } + + /** + * Add an app or shortcut for a specified rank. + */ + public void add(ShortcutInfo item, int rank, boolean animate) { + rank = Utilities.boundToRange(rank, 0, contents.size()); + contents.add(rank, item); for (int i = 0; i < listeners.size(); i++) { - listeners.get(i).onAdd(item); + listeners.get(i).onAdd(item, rank); } itemsChanged(animate); } @@ -121,7 +129,7 @@ public class FolderInfo extends ItemInfo { } public interface FolderListener { - public void onAdd(ShortcutInfo item); + public void onAdd(ShortcutInfo item, int rank); public void onRemove(ShortcutInfo item); public void onTitleChanged(CharSequence title); public void onItemsChanged(boolean animate); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 4be25bb17e..c5241d5c9b 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -84,6 +84,7 @@ import android.widget.Toast; import com.android.launcher3.DropTarget.DragObject; import com.android.launcher3.LauncherSettings.Favorites; +import com.android.launcher3.Workspace.ItemOperator; import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsTransitionController; @@ -158,14 +159,15 @@ public class Launcher extends BaseActivity private static final int REQUEST_CREATE_SHORTCUT = 1; private static final int REQUEST_CREATE_APPWIDGET = 5; + private static final int REQUEST_PICK_APPWIDGET = 9; private static final int REQUEST_PICK_WALLPAPER = 10; private static final int REQUEST_BIND_APPWIDGET = 11; - private static final int REQUEST_BIND_PENDING_APPWIDGET = 14; - private static final int REQUEST_RECONFIGURE_APPWIDGET = 12; + private static final int REQUEST_BIND_PENDING_APPWIDGET = 12; + private static final int REQUEST_RECONFIGURE_APPWIDGET = 13; - private static final int REQUEST_PERMISSION_CALL_PHONE = 13; + private static final int REQUEST_PERMISSION_CALL_PHONE = 14; private static final float BOUNCE_ANIMATION_TENSION = 1.3f; @@ -1407,20 +1409,20 @@ public class Launcher extends BaseActivity } /** - * Add a shortcut to the workspace. + * Add a shortcut to the workspace or to a Folder. * * @param data The intent describing the shortcut. */ private void completeAddShortcut(Intent data, long container, long screenId, int cellX, int cellY, PendingRequestArgs args) { - int[] cellXY = mTmpAddItemCellCoordinates; - CellLayout layout = getCellLayout(container, screenId); - - if (args.getRequestCode() != REQUEST_CREATE_SHORTCUT || - args.getPendingIntent().getComponent() == null) { + if (args.getRequestCode() != REQUEST_CREATE_SHORTCUT + || args.getPendingIntent().getComponent() == null) { return; } + int[] cellXY = mTmpAddItemCellCoordinates; + CellLayout layout = getCellLayout(container, screenId); + ShortcutInfo info = null; if (Utilities.isAtLeastO()) { info = LauncherAppsCompat.createShortcutInfoFromPinItemRequest( @@ -1443,36 +1445,55 @@ public class Launcher extends BaseActivity } } - final View view = createShortcut(info); - boolean foundCellSpan = false; - // First we check if we already know the exact location where we want to add this item. - if (cellX >= 0 && cellY >= 0) { - cellXY[0] = cellX; - cellXY[1] = cellY; - foundCellSpan = true; + if (container < 0) { + // Adding a shortcut to the Workspace. + final View view = createShortcut(info); + boolean foundCellSpan = false; + // First we check if we already know the exact location where we want to add this item. + if (cellX >= 0 && cellY >= 0) { + cellXY[0] = cellX; + cellXY[1] = cellY; + foundCellSpan = true; - // If appropriate, either create a folder or add to an existing folder - if (mWorkspace.createUserFolderIfNecessary(view, container, layout, cellXY, 0, - true, null,null)) { - return; - } - DragObject dragObject = new DragObject(); - dragObject.dragInfo = info; - if (mWorkspace.addToExistingFolderIfNecessary(view, layout, cellXY, 0, dragObject, - true)) { + // If appropriate, either create a folder or add to an existing folder + if (mWorkspace.createUserFolderIfNecessary(view, container, layout, cellXY, 0, + true, null, null)) { + return; + } + DragObject dragObject = new DragObject(); + dragObject.dragInfo = info; + if (mWorkspace.addToExistingFolderIfNecessary(view, layout, cellXY, 0, dragObject, + true)) { + return; + } + } else { + foundCellSpan = layout.findCellForSpan(cellXY, 1, 1); + } + + if (!foundCellSpan) { + mWorkspace.onNoCellFound(layout); return; } + + getModelWriter().addItemToDatabase(info, container, screenId, cellXY[0], cellXY[1]); + mWorkspace.addInScreen(view, info); } else { - foundCellSpan = layout.findCellForSpan(cellXY, 1, 1); - } + // Adding a shortcut to a Folder. + final long folderIconId = container; + FolderIcon folderIcon = (FolderIcon) mWorkspace.getFirstMatch(new ItemOperator() { + @Override + public boolean evaluate(ItemInfo info, View view) { + return info != null && info.id == folderIconId; + } + }); - if (!foundCellSpan) { - mWorkspace.onNoCellFound(layout); - return; + if (folderIcon != null) { + FolderInfo folderInfo = (FolderInfo) folderIcon.getTag(); + folderInfo.add(info, args.rank, false); + } else { + Log.e(TAG, "Could not find folder with id " + folderIconId + " to add shortcut."); + } } - - getModelWriter().addItemToDatabase(info, container, screenId, cellXY[0], cellXY[1]); - mWorkspace.addInScreen(view, info); } /** diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index c6bf3a1c13..8dcf5c914e 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -60,6 +60,7 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.LogDecelerateInterpolator; import com.android.launcher3.OnAlarmListener; import com.android.launcher3.PagedView; +import com.android.launcher3.PendingAddItemInfo; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.UninstallDropTarget.DropTargetSource; @@ -77,6 +78,7 @@ import com.android.launcher3.pageindicators.PageIndicatorDots; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.Thunk; +import com.android.launcher3.widget.PendingAddShortcutInfo; import java.util.ArrayList; import java.util.Collections; @@ -792,7 +794,6 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } } - if (mRearrangeOnClose) { rearrangeChildren(); mRearrangeOnClose = false; @@ -1344,53 +1345,68 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } mContent.completePendingPageChanges(); - View currentDragView; - final ShortcutInfo si; - if (d.dragInfo instanceof AppInfo) { - // Came from all apps -- make a copy. - si = ((AppInfo) d.dragInfo).makeShortcut(); - } else { - // ShortcutInfo - si = (ShortcutInfo) d.dragInfo; - } - if (mIsExternalDrag) { - currentDragView = mContent.createAndAddViewForRank(si, mEmptyCellRank); - // Actually move the item in the database if it was an external drag. Call this - // before creating the view, so that ShortcutInfo is updated appropriately. - mLauncher.getModelWriter().addOrMoveItemInDatabase( - si, mInfo.id, 0, si.cellX, si.cellY); + if (d.dragInfo instanceof PendingAddShortcutInfo) { + PendingAddShortcutInfo pasi = (PendingAddShortcutInfo) d.dragInfo; + pasi.container = mInfo.id; + pasi.rank = mEmptyCellRank; - // We only need to update the locations if it doesn't get handled in #onDropCompleted. - if (d.dragSource != this) { - updateItemLocationsInDatabaseBatch(); - } - mIsExternalDrag = false; - } else { - currentDragView = mCurrentDragView; - mContent.addViewForRank(currentDragView, si, mEmptyCellRank); - } - - if (d.dragView.hasDrawn()) { - - // Temporarily reset the scale such that the animation target gets calculated correctly. - float scaleX = getScaleX(); - float scaleY = getScaleY(); - setScaleX(1.0f); - setScaleY(1.0f); - mLauncher.getDragLayer().animateViewIntoPosition(d.dragView, currentDragView, - cleanUpRunnable, null); - setScaleX(scaleX); - setScaleY(scaleY); - } else { + mLauncher.addPendingItem(pasi, pasi.container, pasi.screenId, null, pasi.spanX, + pasi.spanY); d.deferDragViewCleanupPostAnimation = false; - currentDragView.setVisibility(VISIBLE); - } - mItemsInvalidated = true; - rearrangeChildren(); + mRearrangeOnClose = true; + } else { + final ShortcutInfo si; + if (d.dragInfo instanceof AppInfo) { + // Came from all apps -- make a copy. + si = ((AppInfo) d.dragInfo).makeShortcut(); + } else { + // ShortcutInfo + si = (ShortcutInfo) d.dragInfo; + } - // Temporarily suppress the listener, as we did all the work already here. - try (SuppressInfoChanges s = new SuppressInfoChanges()) { - mInfo.add(si, false); + View currentDragView; + if (mIsExternalDrag) { + currentDragView = mContent.createAndAddViewForRank(si, mEmptyCellRank); + + // Actually move the item in the database if it was an external drag. Call this + // before creating the view, so that ShortcutInfo is updated appropriately. + mLauncher.getModelWriter().addOrMoveItemInDatabase( + si, mInfo.id, 0, si.cellX, si.cellY); + + // We only need to update the locations if it doesn't get handled in + // #onDropCompleted. + if (d.dragSource != this) { + updateItemLocationsInDatabaseBatch(); + } + mIsExternalDrag = false; + } else { + currentDragView = mCurrentDragView; + mContent.addViewForRank(currentDragView, si, mEmptyCellRank); + } + + if (d.dragView.hasDrawn()) { + // Temporarily reset the scale such that the animation target gets calculated + // correctly. + float scaleX = getScaleX(); + float scaleY = getScaleY(); + setScaleX(1.0f); + setScaleY(1.0f); + mLauncher.getDragLayer().animateViewIntoPosition(d.dragView, currentDragView, + cleanUpRunnable, null); + setScaleX(scaleX); + setScaleY(scaleY); + } else { + d.deferDragViewCleanupPostAnimation = false; + currentDragView.setVisibility(VISIBLE); + } + + mItemsInvalidated = true; + rearrangeChildren(); + + // Temporarily suppress the listener, as we did all the work already here. + try (SuppressInfoChanges s = new SuppressInfoChanges()) { + mInfo.add(si, false); + } } // Clear the drag info, as it is no longer being dragged. @@ -1419,11 +1435,12 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC } @Override - public void onAdd(ShortcutInfo item) { - mContent.createAndAddViewForRank(item, mContent.allocateRankForNewItem()); + public void onAdd(ShortcutInfo item, int rank) { + View view = mContent.createAndAddViewForRank(item, rank); + ArrayList items = new ArrayList<>(getItemsInReadingOrder()); + items.add(rank, view); + mContent.arrangeChildren(items, items.size()); mItemsInvalidated = true; - mLauncher.getModelWriter().addOrMoveItemInDatabase( - item, mInfo.id, 0, item.cellX, item.cellY); } public void onRemove(ShortcutInfo item) { diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 45487922a1..d795c5628e 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -76,6 +76,7 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.util.Thunk; +import com.android.launcher3.widget.PendingAddShortcutInfo; import java.util.ArrayList; import java.util.List; @@ -251,11 +252,9 @@ public class FolderIcon extends FrameLayout implements FolderListener { mBackground.animateToAccept(cl, lp.cellX, lp.cellY); mOpenAlarm.setOnAlarmListener(mOnOpenListener); if (SPRING_LOADING_ENABLED && - ((dragInfo instanceof AppInfo) || (dragInfo instanceof ShortcutInfo))) { - // TODO: we currently don't support spring-loading for PendingAddShortcutInfos even - // though widget-style shortcuts can be added to folders. The issue is that we need - // to deal with configuration activities which are currently handled in - // Workspace#onDropExternal. + ((dragInfo instanceof AppInfo) + || (dragInfo instanceof ShortcutInfo) + || (dragInfo instanceof PendingAddShortcutInfo))) { mOpenAlarm.setAlarm(ON_OPEN_DELAY); } } @@ -1107,7 +1106,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { } @Override - public void onAdd(ShortcutInfo item) { + public void onAdd(ShortcutInfo item, int rank) { boolean wasBadged = mBadgeInfo.hasBadge(); mBadgeInfo.addBadgeInfo(mLauncher.getPopupDataProvider().getBadgeInfoForItem(item)); boolean isBadged = mBadgeInfo.hasBadge(); diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index 2a6007a4e3..19a16b18ae 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -199,21 +199,26 @@ public class FolderPagedView extends PagedView { return extra; } + public void allocateSpaceForRank(int rank) { + ArrayList views = new ArrayList<>(mFolder.getItemsInReadingOrder()); + views.add(rank, null); + arrangeChildren(views, views.size(), false); + } + /** * Create space for a new item at the end, and returns the rank for that item. * Also sets the current page to the last page. */ public int allocateRankForNewItem() { int rank = getItemCount(); - ArrayList views = new ArrayList<>(mFolder.getItemsInReadingOrder()); - views.add(rank, null); - arrangeChildren(views, views.size(), false); + allocateSpaceForRank(rank); setCurrentPage(rank / mMaxItemsPerPage); return rank; } public View createAndAddViewForRank(ShortcutInfo item, int rank) { View icon = createNewView(item); + allocateSpaceForRank(rank); addViewForRank(icon, item, rank); return icon; } From e13d4645397fa6d23e86e22d4849eb3e51fd0766 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 22 May 2017 15:58:42 -0700 Subject: [PATCH 093/446] Calling recreate() instead of finish() so that the activity life cycle is handled properly Change-Id: I6ee022ee3e81a0660f4798ab4b62ddcb163c7067 --- src/com/android/launcher3/Launcher.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index d3b4c949a9..5fe6c14285 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -4140,9 +4140,8 @@ public class Launcher extends BaseActivity public void onSharedPreferenceChanged( SharedPreferences sharedPreferences, String key) { if (Utilities.ALLOW_ROTATION_PREFERENCE_KEY.equals(key)) { - // Finish this instance of the activity. When the activity is recreated, - // it will initialize the rotation preference again. - finish(); + // Recreate the activity so that it initializes the rotation preference again. + recreate(); } } } From f6f526d7ec8657fc5e76dbe5ee08c4c2717376d8 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 May 2017 19:12:44 -0700 Subject: [PATCH 094/446] Import translations. DO NOT MERGE Change-Id: Ic054fdce631204ca6f134343d8bd40237024845b Auto-generated-cl: translation import --- res/values-af/strings.xml | 18 +++++++++++------- res/values-am/strings.xml | 18 +++++++++++------- res/values-ar/strings.xml | 21 ++++++++++++--------- res/values-az-rAZ/strings.xml | 18 +++++++++++------- res/values-b+sr+Latn/strings.xml | 18 +++++++++++------- res/values-be-rBY/strings.xml | 21 ++++++++++++--------- res/values-bg/strings.xml | 21 ++++++++++++--------- res/values-bn-rBD/config.xml | 12 ++++++++++++ res/values-bn-rBD/strings.xml | 21 ++++++++++++--------- res/values-bs-rBA/strings.xml | 21 ++++++++++++--------- res/values-ca/strings.xml | 21 ++++++++++++--------- res/values-cs/strings.xml | 18 +++++++++++------- res/values-da/strings.xml | 21 ++++++++++++--------- res/values-de/strings.xml | 21 ++++++++++++--------- res/values-el/strings.xml | 21 ++++++++++++--------- res/values-en-rAU/strings.xml | 18 +++++++++++------- res/values-en-rGB/strings.xml | 18 +++++++++++------- res/values-en-rIN/strings.xml | 18 +++++++++++------- res/values-es-rUS/strings.xml | 21 ++++++++++++--------- res/values-es/strings.xml | 21 ++++++++++++--------- res/values-et-rEE/strings.xml | 18 +++++++++++------- res/values-eu-rES/strings.xml | 21 ++++++++++++--------- res/values-fa/strings.xml | 21 ++++++++++++--------- res/values-fi/strings.xml | 18 +++++++++++------- res/values-fr-rCA/strings.xml | 21 ++++++++++++--------- res/values-fr/strings.xml | 21 ++++++++++++--------- res/values-gl-rES/strings.xml | 21 ++++++++++++--------- res/values-gu-rIN/config.xml | 12 ++++++++++++ res/values-gu-rIN/strings.xml | 21 ++++++++++++--------- res/values-hi/strings.xml | 18 +++++++++++------- res/values-hr/strings.xml | 21 ++++++++++++--------- res/values-hu/strings.xml | 18 +++++++++++------- res/values-hy-rAM/strings.xml | 21 ++++++++++++--------- res/values-in/strings.xml | 18 +++++++++++------- res/values-is-rIS/strings.xml | 18 +++++++++++------- res/values-it/strings.xml | 18 +++++++++++------- res/values-iw/strings.xml | 21 ++++++++++++--------- res/values-ja/strings.xml | 21 ++++++++++++--------- res/values-ka-rGE/strings.xml | 18 +++++++++++------- res/values-kk-rKZ/strings.xml | 18 +++++++++++------- res/values-km-rKH/strings.xml | 21 ++++++++++++--------- res/values-kn-rIN/config.xml | 12 ++++++++++++ res/values-kn-rIN/strings.xml | 21 ++++++++++++--------- res/values-ko/strings.xml | 21 ++++++++++++--------- res/values-ky-rKG/strings.xml | 18 +++++++++++------- res/values-lo-rLA/strings.xml | 18 +++++++++++------- res/values-lt/strings.xml | 21 ++++++++++++--------- res/values-lv/strings.xml | 21 ++++++++++++--------- res/values-mk-rMK/strings.xml | 18 +++++++++++------- res/values-ml-rIN/config.xml | 12 ++++++++++++ res/values-ml-rIN/strings.xml | 21 ++++++++++++--------- res/values-mn-rMN/strings.xml | 21 ++++++++++++--------- res/values-mr-rIN/config.xml | 12 ++++++++++++ res/values-mr-rIN/strings.xml | 21 ++++++++++++--------- res/values-ms-rMY/strings.xml | 21 ++++++++++++--------- res/values-my-rMM/strings.xml | 18 +++++++++++------- res/values-nb/strings.xml | 21 ++++++++++++--------- res/values-ne-rNP/config.xml | 12 ++++++++++++ res/values-ne-rNP/strings.xml | 21 ++++++++++++--------- res/values-nl/strings.xml | 18 +++++++++++------- res/values-pa-rIN/config.xml | 12 ++++++++++++ res/values-pa-rIN/strings.xml | 21 ++++++++++++--------- res/values-pl/strings.xml | 21 ++++++++++++--------- res/values-pt-rPT/strings.xml | 18 +++++++++++------- res/values-pt/strings.xml | 21 ++++++++++++--------- res/values-ro/strings.xml | 21 ++++++++++++--------- res/values-ru/strings.xml | 21 ++++++++++++--------- res/values-si-rLK/strings.xml | 21 ++++++++++++--------- res/values-sk/strings.xml | 21 ++++++++++++--------- res/values-sl/strings.xml | 21 ++++++++++++--------- res/values-sq-rAL/strings.xml | 18 +++++++++++------- res/values-sr/strings.xml | 18 +++++++++++------- res/values-sv/strings.xml | 18 +++++++++++------- res/values-sw/strings.xml | 18 +++++++++++------- res/values-ta-rIN/strings.xml | 18 +++++++++++------- res/values-te-rIN/config.xml | 12 ++++++++++++ res/values-te-rIN/strings.xml | 21 ++++++++++++--------- res/values-th/strings.xml | 21 ++++++++++++--------- res/values-tl/strings.xml | 21 ++++++++++++--------- res/values-tr/strings.xml | 21 ++++++++++++--------- res/values-uk/strings.xml | 18 +++++++++++------- res/values-ur-rPK/strings.xml | 18 +++++++++++------- res/values-uz-rUZ/strings.xml | 21 ++++++++++++--------- res/values-vi/strings.xml | 21 ++++++++++++--------- res/values-zh-rCN/strings.xml | 21 ++++++++++++--------- res/values-zh-rHK/strings.xml | 21 ++++++++++++--------- res/values-zh-rTW/strings.xml | 21 ++++++++++++--------- res/values-zu/strings.xml | 21 ++++++++++++--------- 88 files changed, 1026 insertions(+), 660 deletions(-) create mode 100644 res/values-bn-rBD/config.xml create mode 100644 res/values-gu-rIN/config.xml create mode 100644 res/values-kn-rIN/config.xml create mode 100644 res/values-ml-rIN/config.xml create mode 100644 res/values-mr-rIN/config.xml create mode 100644 res/values-ne-rNP/config.xml create mode 100644 res/values-pa-rIN/config.xml create mode 100644 res/values-te-rIN/config.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index eafc506583..31167e9daf 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -70,18 +70,16 @@ "Vouer: %1$s" "Legstukke" "Muurpapiere" - "Instellings" + + "Gedeaktiveer deur jou administrateur" "Oorsig" "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" - - - - - - + "Ikoon-kentekengewing" + "Aan vir alle programme" + "Af vir alle programme" "Voeg ikoon by tuisskerm" "Vir nuwe programme" @@ -123,4 +121,10 @@ "Legstukgrootte is verander na breedte %1$s hoogte %2$s" "Kortpaaie" "%1$d kortpaaie vir %2$s" + + + + + + diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 0482f54c3a..dee2910619 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -70,18 +70,16 @@ "አቃፊ፦ %1$s" "ፍርግሞች" "የግድግዳ ወረቀቶች" - "ቅንብሮች" + + "በእርስዎ አስተዳዳሪ የተሰናከለ" "አጠቃላይ ዕይታ" "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "ስልኩ ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" - - - - - - + "የአዶ ባጅ" + "ለሁሉም መተግበሪያዎች በርቷል" + "ለሁሉም መተግበሪያዎች ጠፍጧል" "አዶ ወደ የመነሻ ማያ ገጽ አክል" "ለአዲስ መተግበሪያዎች" @@ -123,4 +121,10 @@ "የመግብር መጠን ወደ ስፋት %1$s ቁመት %2$s ተለውጧል" "አቋራጮች" "%1$d%2$s አቋራጮች" + + + + + + diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index a2b13cda1d..94a5aead47 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -70,24 +70,21 @@ "المجلد: %1$s" "الأدوات" "الخلفيات" - "الإعدادات" + + "عطَّل المشرف هذه الميزة" "نظرة عامة" "السماح بتدوير الشاشة الرئيسية" "عند تدوير الهاتف" "لا يسمح إعداد العرض الحالي بالتدوير" - - - - - - + "وضع شارات على رموز التطبيقات" + "تشغيل لجميع التطبيقات" + "إيقاف لجميع التطبيقات" "إضافة رمز إلى الشاشة الرئيسية" "للتطبيقات الجديدة" - - + "استخدام الإعداد الافتراضي للنظام" "غير معروفة" @@ -124,4 +121,10 @@ "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" "الاختصارات" "%1$d اختصار لتطبيق %2$s" + + + + + + diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index e7d0b2f484..853520ae13 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -70,18 +70,16 @@ "Qovluq: %1$s" "Vidcet" "Divar kağızları" - "Ayarlar" + + "Admininiz tərəfindən deaktiv edilib" "İcmal" "Əsas ekranın firlanmağına icazə verin" "Telefon çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" - - - - - - + "İkona nişanı" + "Bütün tətbiqlər üçün aktivdir" + "Bütün tətbiqlər üçün deaktivdir" "Əsas ekrana ikona əlavə edin" "Yeni tətbiqlər üçün" @@ -123,4 +121,10 @@ "Vidcetin eni %1$s hündürlüyü %2$s kimi ölçüləndirildi" "Qısa yollar" "%1$d üçün %2$s qısa yolu" + + + + + + diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 7638a0e34f..03a93aae43 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -70,18 +70,16 @@ "Direktorijum: %1$s" "Vidžeti" "Pozadine" - "Podešavanja" + + "Administrator je onemogućio" "Pregled" "Dozvoli rotaciju početnog ekrana" "Kada se telefon rotira" "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" - - - - - - + "Dodavanje znački na ikone" + "Uključeno za sve aplikacije" + "Isključeno za sve aplikacije" "Dodaj ikonu na početni ekran" "Za nove aplikacije" @@ -123,4 +121,10 @@ "Veličina vidžeta je promenjena na širinu %1$s i visinu %2$s" "Prečice" "%1$d prečice(a) za %2$s" + + + + + + diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index 3438026eb3..85953c4d63 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -70,24 +70,21 @@ "Папка: %1$s" "Віджэты" "Шпалеры" - "Налады" + + "Адключаная адміністратарам" "Агляд" "Дазволіць паварот галоўнага экрана" "Пры павароце тэлефона" "Бягучая налада дысплэя не прадугледжвае паварот" - - - - - - + "Паметкі на значку" + "Уключана для ўсіх праграм" + "Адключана для ўсіх праграм" "Дадаць значок на Галоўны экран" "Для новых праграм" - - + "Выкарыстоўваць стандартныя формы" "Невядома" @@ -124,4 +121,10 @@ "Памеры віджэта зменены на: шырыня %1$s, вышыня %2$s" "Ярлыкі" "Ярлыкі (%1$d) для %2$s" + + + + + + diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index ba275a60d8..93e484a3b8 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -70,24 +70,21 @@ "Папка: „%1$s“" "Приспособления" "Тапети" - "Настройки" + + "Деактивирано от администратора ви" "Общ преглед" "Разрешаване на завъртането на началния екран" "При завъртане на телефона" "Текущата настройка на екрана не разрешава завъртане" - - - - - - + "Означаване със значка на иконите" + "Включено за всички приложения" + "Изключено за всички приложения" "Добавяне на икона към началния екран" "За нови приложения" - - + "Използване на стандартната системна настройка" "Няма информация" @@ -124,4 +121,10 @@ "Приспособлението е преоразмерено към ширина %1$s и височина %2$s" "Преки пътища" "%1$d преки пътища за %2$s" + + + + + + diff --git a/res/values-bn-rBD/config.xml b/res/values-bn-rBD/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-bn-rBD/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 3b233dcc97..b498f50ca4 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -70,23 +70,20 @@ "ফোল্ডার: %1$s" "উইজেটগুলি" "ওয়ালপেপারগুলি" - "সেটিংস" + + "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" "এক নজরে" "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "যখন ফোনটি ঘোরানো হয়" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" - - - - - - + "আইকনে ব্যাজ দেওয়া" + "সমস্ত অ্যাপের জন্য চালু আছে" + "সমস্ত অ্যাপের জন্য বন্ধ আছে" "হোম স্ক্রিনে আইকন যোগ করুন" "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" - - + "সিস্টেমের ডিফল্ট মান ব্যবহার করুন" "আইকনের আকৃতি পরিবর্তন করা হচ্ছে" "অজানা" "সরান" @@ -122,4 +119,10 @@ "উইজেটের আকার প্রস্থ %1$s উচ্চতা %2$s তে পরিবর্তন করা হয়েছে" "শর্টকাট" "%2$s এর %1$dটি শর্টকার্ট" + + + + + + diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index ca880e7015..fc2ad74702 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -70,24 +70,21 @@ "Folder: %1$s" "Dodaci" "Pozadinske slike" - "Postavke" + + "Onemogućio vaš administrator" "Pregled" "Dozvoli rotiranje početnog ekrana" "Kada se telefon zarotira" "Trenutne postavke ekrana ne dozvoljavaju rotiranje" - - - - - - + "Označavanje ikona" + "Uključeno za sve aplikacije" + "Isključeno za sve aplikacije" "Dodajte ikonu na početni ekran" "Za nove aplikacije" - - + "Koristite sistemski zadano" "Nepoznato" @@ -124,4 +121,10 @@ "Veličina vidžeta je promijenjena na širinu %1$s visinu %2$s" "Prečice" "%1$d prečica za aplikaciju %2$s" + + + + + + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index a59d64555f..52a5df43e3 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -70,24 +70,21 @@ "Carpeta: %1$s" "Widgets" "Fons de pantalla" - "Configuració" + + "Desactivada per l\'administrador" "Visió general" "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" - - - - - - + "Símbols d\'icona" + "Activats per a totes les aplicacions" + "Desactivats per a totes les aplicacions" "Afegeix la icona a la pantalla d\'inici" "Per a les aplicacions noves" - - + "Utilitza l\'opció predeterminada del sistema" "Desconegut" @@ -124,4 +121,10 @@ "S\'ha canviat la mida del widget a l\'amplada %1$s i l\'alçada %2$s" "Dreceres" "%1$d dreceres per a l\'aplicació %2$s" + + + + + + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 9d9065e5d5..073ad04583 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -70,18 +70,16 @@ "Složka: %1$s" "Widgety" "Tapety" - "Nastavení" + + "Zakázáno administrátorem" "Přehled" "Povolit otáčení plochy" "Při otočení telefonu" "Aktuální nastavení displeje neumožňuje otáčení" - - - - - - + "Odznaky na ikonách" + "Zapnuto pro všechny aplikace" + "Vypnuto pro všechny aplikace" "Přidat ikonu na plochu" "Pro nové aplikace" @@ -123,4 +121,10 @@ "Velikost widgetu upravena: šířka %1$s, výška %2$s" "Zkratky" "Počet zkratek pro aplikaci %2$s: %1$d" + + + + + + diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 60f08fbbb4..922e891502 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -70,24 +70,21 @@ "Mappe: %1$s" "Widgets" "Baggrunde" - "Indstillinger" + + "Deaktiveret af din administrator" "Oversigt" "Tillad rotation af startskærmen" "Når telefonen roteres" "Den aktuelle indstilling for visning tillader ikke rotation" - - - - - - + "Ikonbadges" + "Slået til for alle apps" + "Slået fra for alle apps" "Føj ikon til startskærmen" "For nye apps" - - + "Brug systemstandarden" "Ukendt" @@ -124,4 +121,10 @@ "Størrelsen for widgetten er ændret til bredde %1$s og højde %2$s" "Genveje" "%1$d genveje til %2$s" + + + + + + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 2a022f7887..b7e385e6dd 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -70,24 +70,21 @@ "Ordner: %1$s" "Widgets" "Hintergründe" - "Einstellungen" + + "Von deinem Administrator deaktiviert" "Übersicht" "Drehung des Startbildschirms zulassen" "Bei Drehung des Smartphones" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" - - - - - - + "Logosymbole" + "Für alle Apps aktiviert" + "Für alle Apps deaktiviert" "Symbol zu Startbildschirm hinzufügen" "Für neue Apps" - - + "Systemstandardeinstellung verwenden" "Unbekannt" @@ -124,4 +121,10 @@ "Größe des Widgets zu Breite %1$s und Höhe %2$s geändert" "Verknüpfungen" "%1$d Verknüpfungen für %2$s" + + + + + + diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 28ed6febda..4c589063ee 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -70,24 +70,21 @@ "Φάκελος: %1$s" "Γραφικά στοιχεία" "Ταπετσαρίες" - "Ρυθμίσεις" + + "Απενεργοποιήθηκε από τον διαχειριστή σας" "Επισκόπηση" "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν το τηλέφωνο περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" - - - - - - + "Σήματα εικονιδίων" + "Ενεργοποιημένα για όλες τις εφαρμογές" + "Απενεργοποιημένα για όλες τις εφαρμογές" "Προσθήκη εικονιδίου στην Αρχική οθόνη" "Για νέες εφαρμογές" - - + "Χρήση προεπιλογής συστήματος" "Άγνωστο" @@ -124,4 +121,10 @@ "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" "Συντομεύσεις" "%1$d συντομεύσεις για %2$s" + + + + + + diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 03309f23be..a718971217 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -70,18 +70,16 @@ "Folder: %1$s" "Widgets" "Wallpapers" - "Settings" + + "Disabled by your admin" "Overview" "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - - - - - - + "Icon badging" + "On for all apps" + "Off for all apps" "Add icon to Home screen" "For new apps" @@ -123,4 +121,10 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" + + + + + + diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 03309f23be..a718971217 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -70,18 +70,16 @@ "Folder: %1$s" "Widgets" "Wallpapers" - "Settings" + + "Disabled by your admin" "Overview" "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - - - - - - + "Icon badging" + "On for all apps" + "Off for all apps" "Add icon to Home screen" "For new apps" @@ -123,4 +121,10 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" + + + + + + diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 03309f23be..a718971217 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -70,18 +70,16 @@ "Folder: %1$s" "Widgets" "Wallpapers" - "Settings" + + "Disabled by your admin" "Overview" "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - - - - - - + "Icon badging" + "On for all apps" + "Off for all apps" "Add icon to Home screen" "For new apps" @@ -123,4 +121,10 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" + + + + + + diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 477edb766b..cafea4c8f7 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -70,24 +70,21 @@ "Carpeta: %1$s" "Widgets" "Fondos de pantalla" - "Configuración" + + "El administrador inhabilitó esta función" "Recientes" "Permitir la rotación de la pantalla principal" "Al girar el teléfono" "La configuración actual no permite la rotación de la pantalla" - - - - - - + "Insignias de íconos" + "Activada para todas las apps" + "Desactivada para todas las apps" "Agregar ícono a la pantalla principal" "Para nuevas apps" - - + "Usar el sistema predeterminado" "Desconocido" @@ -124,4 +121,10 @@ "Se cambió la dimensión del widget a %1$s de ancho y %2$s de alto." "Accesos directos" "%1$d accesos directos para %2$s" + + + + + + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index ae91ae8b05..6b3bb34eb6 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -70,24 +70,21 @@ "Carpeta: %1$s" "Widgets" "Fondos de pantalla" - "Ajustes" + + "Inhabilitada por el administrador" "Visión general" "Permitir rotación de la pantalla de inicio" "Al girar el teléfono" "La configuración de pantalla actual no permite girar la pantalla" - - - - - - + "Insignias de los iconos" + "Activadas para todas las aplicaciones" + "Desactivadas para todas las aplicaciones" "Añadir icono a la pantalla de inicio" "Para nuevas aplicaciones" - - + "Usar opción predeterminada del sistema" "Desconocido" @@ -124,4 +121,10 @@ "Se ha modificado el tamaño del widget a %1$s de ancho y %2$s de alto" "Accesos directos" "%1$d accesos directos de %2$s" + + + + + + diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 2477822733..5d57ef1182 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -70,18 +70,16 @@ "Kaust: %1$s" "Vidinad" "Taustapildid" - "Seaded" + + "Keelas administraator" "Ülevaade" "Luba avaekraani pööramine" "Kui telefoni pööratakse" "Praegune kuvaseade ei luba pööramist" - - - - - - + "Ikoonimärgi lisamine" + "Sisse lülitatud kõigi rakenduste jaoks" + "Välja lülitatud kõigi rakenduste jaoks" "Lisa ikoon avaekraanile" "Uute rakenduste puhul" @@ -123,4 +121,10 @@ "Vidina suurust muudeti. Laius: %1$s. Kõrgus: %2$s" "Otseteed" "%1$d otseteed rakenduse %2$s jaoks" + + + + + + diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 2f14129399..ee6cf0caa1 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -70,24 +70,21 @@ "Karpeta: %1$s" "Widgetak" "Horma-paperak" - "Ezarpenak" + + "Administratzaileak desgaitu du" "Ikuspegi orokorra" "Baimendu hasierako pantaila biratzea" "Telefonoa biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" - - - - - - + "Ikonoen bereizgarriak" + "Aktibatuta aplikazio guztietan" + "Desaktibatuta aplikazio guztietan" "Gehitu ikonoa hasierako pantailan" "Aplikazio berrietan" - - + "Erabili sistemaren balio lehenetsiak" "Ezezaguna" @@ -124,4 +121,10 @@ "Aldatu da widgetaren tamaina. Zabalera: %1$s. Altuera: %2$s." "Lasterbideak" "%2$s aplikazioaren %1$d lasterbide" + + + + + + diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 8a9c5faac2..059a484bd5 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -70,24 +70,21 @@ "پوشه: %1$s" "ابزارک‌ها" "کاغذدیواری‌ها" - "تنظیمات" + + "توسط سرپرست سیستم غیرفعال شده است" "نمای کلی" "امکان دادن به چرخش صفحه اصلی" "وقتی تلفن چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" - - - - - - + "برچسب‌گذاری نماد" + "برای همه برنامه‌ها روشن‌ است" + "برای همه برنامه‌ها خاموش است" "افزودن نماد به صفحه اصلی" "برای برنامه‌های جدید" - - + "استفاده از پیش‌فرض سیستم" "نامشخص" @@ -124,4 +121,10 @@ "اندازه ابزارک به عرض %1$s ارتفاع %2$s تغییر کرد" "میان‌برها" "%1$d میانبر برای %2$s" + + + + + + diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 7ac250306b..6223f63b30 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -70,18 +70,16 @@ "Kansio: %1$s" "Widgetit" "Taustakuvat" - "Asetukset" + + "Järjestelmänvalvoja on poistanut toiminnon käytöstä." "Yleiskatsaus" "Salli aloitusnäytön kiertäminen" "Kun puhelinta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." - - - - - - + "Kuvakemerkit" + "Käytössä kaikissa sovelluksissa" + "Pois käytöstä kaikissa sovelluksissa" "Lisää kuvake aloitusruutuun" "Uusille sovelluksille" @@ -123,4 +121,10 @@ "Widgetin kokoa muutettiin. Sen leveys on nyt %1$s ja korkeus %2$s." "Pikakuvakkeet" "Sovelluksella %2$s on %1$d pikakuvaketta." + + + + + + diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 24e4fc0be4..1b2d6107af 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -70,24 +70,21 @@ "Dossier : %1$s" "Widgets" "Fonds d\'écran" - "Paramètres" + + "Cette fonction est désactivée par votre administrateur" "Présentation" "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le mode d\'affichage actuel ne permet pas le pivotement" - - - - - - + "Insignes d\'icône" + "Activé pour toutes les applications" + "Désactivé pour toutes les applications" "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" - - + "Utiliser les valeurs système par défaut" "Inconnu" @@ -124,4 +121,10 @@ "Le widget a été redimensionné (largeur : %1$s, hauteur : %2$s)" "Raccourcis" "%1$d raccourcis pour %2$s" + + + + + + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index ad3110bf45..9823764de8 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -70,24 +70,21 @@ "Dossier \"%1$s\"" "Widgets" "Fonds d\'écran" - "Paramètres" + + "Désactivé par votre administrateur" "Vue d\'ensemble" "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." - - - - - - + "Identification des icônes" + "Activée pour toutes les applications" + "Désactivée pour toutes les applications" "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" - - + "Utiliser la valeur système par défaut" "Inconnu" @@ -124,4 +121,10 @@ "Le widget a bien été redimensionné (largeur : %1$s, hauteur : %2$s)." "Raccourcis" "%1$d raccourcis pour %2$s" + + + + + + diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 5f79c808b6..e1c7e2a9f5 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -70,24 +70,21 @@ "Cartafol: %1$s" "Widgets" "Fondos de pantalla" - "Configuración" + + "Función desactivada polo administrador" "Visión xeral" "Permitir xirar a pantalla de inicio" "Ao xirar o teléfono" "A configuración de visualización actual non permite xirar a pantalla" - - - - - - + "Insignias de iconas" + "Activado para todas as aplicacións" + "Desactivado para todas as aplicacións" "Engadir icona á pantalla de inicio" "Para novas aplicacións" - - + "Usar valores predeterminados do sistema" "Descoñecido" @@ -124,4 +121,10 @@ "Cambiouse o tamaño do widget polo ancho %1$s e a altura %2$s" "Atallos" "%1$d atallos para %2$s" + + + + + + diff --git a/res/values-gu-rIN/config.xml b/res/values-gu-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-gu-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 4bbebb713c..1dfbfd0564 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -70,23 +70,20 @@ "ફોલ્ડર: %1$s" "વિજેટ્સ" "વૉલપેપર્સ" - "સેટિંગ્સ" + + "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" "વિહંગાવલોકન" "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" - - - - - - + "આઇકનને બૅજ કરવું" + "બધી ઍપ્લિકેશનો માટે ચાલુ છે" + "બધી ઍપ્લિકેશનો માટે બંધ છે" "હોમ સ્ક્રીન પર આઇકન ઉમેરો" "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" - - + "સિસ્ટમ ડિફૉલ્ટનો ઉપયોગ કરો" "આઇકનના આકારમાં કરેલ ફેરફારો લાગુ કરી રહ્યા છીએ" "અજાણ્યો" "દૂર કરો" @@ -122,4 +119,10 @@ "વિજેટનો આકાર બદલીને %1$s પહોળાઈ %2$s ઊંચાઈ કર્યો" "શૉર્ટકટ્સ" "%2$s માટે %1$d શૉર્ટકટ" + + + + + + diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 25a204bb6f..975a650b26 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -70,18 +70,16 @@ "फ़ोल्डर: %1$s" "शॉर्टकट" "वॉलपेपर" - "सेटिंग" + + "आपके व्यवस्थापक द्वारा अक्षम" "अवलोकन" "होमस्क्रीन घुमाने की अनुमति दें" "फ़ोन घुुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" - - - - - - + "आइकन बैजिंग" + "सभी ऐप्लिकेशन के लिए चालू है" + "सभी ऐप्लिकेशन के लिए बंद है" "होम स्क्रीन में आइकन जोड़ें" "नए ऐप्लिकेशन के लिए" @@ -123,4 +121,10 @@ "विजेट का आकार बदलकर उसकी चौड़ाई %1$s और ऊंचाई %2$s कर दी गई" "शॉर्टकट" "%2$s के लिए %1$d शॉर्टकट" + + + + + + diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 8f288cf547..f53cf5cfb7 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -70,24 +70,21 @@ "Mapa: %1$s" "Widgeti" "Pozadine" - "Postavke" + + "Onemogućio administrator" "Pregled" "Dopusti zakretanje početnog zaslona" "Kada se telefon zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" - - - - - - + "Dodavanje oznake na ikonu" + "Uključeno za sve aplikacije" + "Isključeno za sve aplikacije" "Dodaj ikonu na početni zaslon" "Za nove aplikacije" - - + "Upotrijebi zadane postavke sustava" "Nepoznato" @@ -124,4 +121,10 @@ "Širina widgeta promijenjena je na %1$s, a visina na %2$s" "Prečaci" "Prečaca za aplikaciju %2$s: %1$d" + + + + + + diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 3fb2c55c04..461730229a 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -70,18 +70,16 @@ "Mappa: %1$s" "Modulok" "Háttérképek" - "Beállítások" + + "A rendszergazda letiltotta" "Áttekintés" "A kezdőképernyő elforgatásának engedélyezése" "A telefon elforgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" - - - - - - + "Ikonjelvények" + "Bekapcsolva az összes alkalmazásnál" + "Kikapcsolva az összes alkalmazásnál" "Ikon hozzáadása a kezdőképernyőhöz" "Új alkalmazásoknál" @@ -123,4 +121,10 @@ "Modul átméretezve %1$s szélességre és %2$s magasságra" "Gyorsparancsok" "%1$d gyorsparancs a(z) %2$s számára" + + + + + + diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 7b917f7e9b..c946290a19 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -70,24 +70,21 @@ "Պանակ՝ %1$s" "Վիջեթներ" "Պաստառներ" - "Կարգավորումներ" + + "Անջատվել է ձեր ադմինիստրատորի կողմից" "Համատեսք" "Թույլ տալ հիմնական էկրանի պտտումը" "Հեռախոսը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" - - - - - - + "Պատկերակի նշանակ" + "Միացված է բոլոր հավելվածների համար" + "Անջատված է բոլոր հավելվածների համար" "Ավելացնել պատկերակը Հիմնական էկրանին" "Նոր հավելվածների համար" - - + "Օգտագործել համակարգի կանխադրված կարգավորումը" "Անհայտ է" @@ -124,4 +121,10 @@ "Վիջեթի լայնությունը փոխվել է %1$s-ի, իսկ բարձրությունը՝ %2$s-ի" "Դյուրանցումներ" "%1$d դյուրանցումներ %2$s հավելվածի համար" + + + + + + diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index ae1561b0c3..31d3db172e 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -70,18 +70,16 @@ "Folder: %1$s" "Widget" "Wallpaper" - "Setelan" + + "Dinonaktifkan oleh admin" "Ringkasan" "Izinkan layar Utama diputar" "Saat ponsel diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" - - - - - - + "Badge ikon" + "Aktif untuk semua aplikasi" + "Nonaktif untuk semua aplikasi" "Tambahkan ikon ke layar Utama" "Untuk aplikasi baru" @@ -123,4 +121,10 @@ "Widget diubah ukurannya menjadi lebar %1$s tinggi %2$s" "Pintasan" "%1$d pintasan untuk %2$s" + + + + + + diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 6a4dd03923..beb45df0bd 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -70,18 +70,16 @@ "Mappa: %1$s" "Græjur" "Veggfóður" - "Stillingar" + + "Gert óvirkt af kerfisstjóra" "Yfirlit" "Leyfa snúning fyrir heimaskjá" "Þegar símanum er snúið" "Núverandi skjástilling leyfir ekki snúning" - - - - - - + "Merking á skjöldum" + "Virkt fyrir öll forrit" + "Slökkt fyrir öll forrit" "Bæta tákni á heimaskjáinn" "Fyrir ný forrit" @@ -123,4 +121,10 @@ "Stærð græju breytt í %1$s á breidd og %2$s á hæð" "Flýtileiðir" "%1$d flýtileiðir fyrir %2$s" + + + + + + diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index bbd99e891c..b3fef36892 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -70,18 +70,16 @@ "Cartella: %1$s" "Widget" "Sfondi" - "Impostazioni" + + "Disattivata dall\'amministratore" "Panoramica" "Consenti rotazione della schermata Home" "Con il telefono ruotato" "L\'impostazione corrente del display non consente la rotazione" - - - - - - + "Badge per le icone" + "Impostazione attiva per tutte le app" + "Impostazione non attiva per tutte le app" "Aggiungi icone alla schermata Home" "Per le nuove app" @@ -123,4 +121,10 @@ "Widget ridimensionato a larghezza %1$s, altezza %2$s" "Scorciatoie" "%1$d scorciatoie per %2$s" + + + + + + diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index ccd6f0d866..cbc1ac3f8a 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -70,24 +70,21 @@ "תיקיה: %1$s" "רכיבי ווידג\'ט" "טפטים" - "הגדרות" + + "הושבת על ידי מנהל המערכת שלך" "סקירה" "אפשרות סיבוב של מסך דף הבית" "כאשר הטלפון מסובב" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" - - - - - - + "הצגת תגים על גבי סמלים" + "מופעלת לכל האפליקציות" + "כבויה לכל האפליקציות" "הוספת סמל במסך דף הבית" "לאפליקציות חדשות" - - + "השתמש בברירת המחדל של המערכת" "לא ידוע" @@ -124,4 +121,10 @@ "גודל הווידג\'ט שונה - רוחב %1$s גובה %2$s" "קיצורי דרך" "%1$d קיצורי דרך עבור %2$s" + + + + + + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 77c6b26f1f..a0d36ca54d 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -70,24 +70,21 @@ "フォルダ: %1$s" "ウィジェット" "壁紙" - "設定" + + "管理者により無効にされています" "概要" "ホーム画面の回転を許可" "スマートフォンが回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" - - - - - - + "アイコンバッジ" + "すべてのアプリで ON" + "すべてのアプリで OFF" "ホーム画面にアイコンを追加" "新しいアプリをダウンロードしたときに" - - + "システムのデフォルトを使用" "不明" @@ -124,4 +121,10 @@ "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" "ショートカット" "%2$s用の %1$d 件のショートカット" + + + + + + diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 9db1b03add..c9048e4fc6 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -70,18 +70,16 @@ "საქაღალდე: %1$s" "ვიჯეტები" "ფონები" - "პარამეტრები" + + "გათიშულია თქვენი ადმინისტრატორის მიერ" "მიმოხილვა" "მთავარი ეკრანის შეტრიალების დაშვება" "ტელეფონის შეტრიალებისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" - - - - - - + "ხატულას ბეჯები" + "ჩართულია ყველა აპისთვის" + "გამორთულია ყველა აპისთვის" "ხატულას მთავარ ეკრანზე დამატება" "ახალი აპებისთვის" @@ -123,4 +121,10 @@ "ვიჯეტის ზომები შეიცვალა: სიგანე %1$s სიმაღლე %2$s" "მალსახმობები" "%2$s-ს აქვს %1$d მალსახმობი" + + + + + + diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 5df229351b..9a75c36f32 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -70,18 +70,16 @@ "Қалта: %1$s" "Виджеттер" "Тұсқағаздар" - "Параметрлер" + + "Әкімші өшірді" "Шолу" "Негізгі экранның бұрылуына рұқсат ету" "Телефон бұрылғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" - - - - - - + "Белгілеу" + "Барлық қолданбалар үшін қосулы" + "Барлық қолданбалар үшін өшірулі" "Негізгі экранға белгіше енгізу" "Жаңа қолданбаларға арналған" @@ -123,4 +121,10 @@ "Виджет өлшемінің ені %1$s, биіктігі %2$s болып өзгертілді" "Таңбашалар" "%2$s қолданбасына арналған %1$d таңбаша" + + + + + + diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 8e1841e623..4f0c0ee59e 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -70,24 +70,21 @@ "ថត៖ %1$s" "ធាតុ​ក្រាហ្វិក" "ផ្ទាំង​រូបភាព" - "ការកំណត់" + + "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" "សង្ខេប" "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" - - - - - - + "ការដាក់ស្លាក​សញ្ញារូបតំណាង" + "បើក​សម្រាប់​កម្មវិធីទាំងអស់" + "បិទសម្រាប់កម្មវិធីទាំងអស់" "បញ្ចូល​រូបតំណាង​ទៅ​អេក្រង់​ដើម" "សម្រាប់កម្មវិធីថ្មី" - - + "ប្រើលំនាំដើមរបស់ប្រព័ន្ធ" "មិន​ស្គាល់" @@ -124,4 +121,10 @@ "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %1$s កម្ពស់ប្រវែង %2$s" "ផ្លូវកាត់" "%1$d ផ្លូវកាត់សម្រាប់ %2$s" + + + + + + diff --git a/res/values-kn-rIN/config.xml b/res/values-kn-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-kn-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 7ef8fb1b11..626fbcdafe 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -70,23 +70,20 @@ "ಫೋಲ್ಡರ್: %1$s" "ವಿಜೆಟ್‌ಗಳು" "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" - "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" + + "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" "ಅವಲೋಕನ" "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" - - - - - - + "ಐಕಾನ್ ಬ್ಯಾಡ್ಜ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ" + "ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಆನ್ ಮಾಡಲಾಗಿದೆ" + "ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಆಫ್ ಆಗಿದೆ" "ಮುಖಪುಟದ ಪರದೆಗೆ ಐಕಾನ್ ಸೇರಿಸಿ" "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" - - + "ಸಿಸ್ಟಂ ಡಿಫಾಲ್ಟ್ ಬಳಸಿ" "ಐಕಾನ್ ಆಕಾರ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತಿದೆ" "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" @@ -122,4 +119,10 @@ "ವಿಜೆಟ್ ಅನ್ನು %1$s ಅಗಲ %2$s ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ" "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" "%2$s ಗೆ %1$d ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" + + + + + + diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 66bd05db83..1a2dc7e181 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -70,24 +70,21 @@ "폴더: %1$s" "위젯" "배경화면" - "설정" + + "관리자가 사용 중지함" "개요" "홈 화면 회전 허용" "휴대전화 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." - - - - - - + "아이콘 배지" + "모든 앱에서 사용 설정됨" + "모든 앱에서 사용 중지됨" "홈 화면에 아이콘 추가" "새로 설치한 앱에 적용" - - + "시스템 기본값 사용" "알 수 없음" @@ -124,4 +121,10 @@ "폭 %1$s, 높이 %2$s로 위젯 크기 조정됨" "바로가기" "%2$s에 사용 가능한 단축키 %1$d개" + + + + + + diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 7ea2df5cb7..ac51c6f8d8 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -70,18 +70,16 @@ "Фолдер: %1$s" "Виджеттер" "Тушкагаздар" - "Жөндөөлөр" + + "Администраторуңуз өчүрүп койгон" "Көз жүгүртүү" "Башкы экранды айлантууга уруксат берүү" "Телефон айланганда" "Экранды айлантуу параметри өчүрүлгөн" - - - - - - + "Бейджик тагуу сүрөтчөсү" + "Бардык колдонмолор үчүн күйүк" + "Бардык колдонмолор үчүн өчүк" "Башкы экранга сүрөтчө кошуу" "Жаңы колдонмолор үчүн" @@ -123,4 +121,10 @@ "Виджеттин кеңдиги %1$s бийиктиги %2$s болду" "Кыска жолдор" "%2$s колдонмосуна %1$d кыска жол бар" + + + + + + diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 3e78b0b052..98928fffd2 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -70,18 +70,16 @@ "ໂຟນເດີ: %1$s" "ວິດເຈັດ" "ພາບພື້ນຫຼັງ" - "ການຕັ້ງຄ່າ" + + "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" "ພາບຮວມ" "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນໂທລະສັບ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" - - - - - - + "ປ້າຍໄອຄອນ" + "ເປີດສຳລັບທຸກແອັບ" + "ປິດສຳລັບທຸກແອັບ" "ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ" "ສຳລັບແອັບໃໝ່" @@ -123,4 +121,10 @@ "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %1$s ລວງ​ສູງ %2$s ແລ້ວ" "ທາງລັດ" "%1$d ທາງລັດສຳລັບ %2$s" + + + + + + diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index dd23f7aef1..faf16bbd87 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -70,24 +70,21 @@ "Aplankas: „%1$s“" "Valdikliai" "Ekrano fonai" - "Nustatymai" + + "Išjungė administratorius" "Apžvalga" "Leisti pasukti pagrindinį ekraną" "Kai telefonas pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" - - - - - - + "Piktogramos ženklelių informacija" + "Įjungta visoms programoms" + "Išjungta visoms programoms" "Pridėti piktogr. prie pagrindinio ekrano" "Skirta naujoms programoms" - - + "Naudoti numatytuosius sistemos nustatymus" "Nežinoma" @@ -124,4 +121,10 @@ "Valdiklio dydis pakeistas: plotis – %1$s, aukštis – %2$s" "Spartieji klavišai" "Programos „%2$s“ spartieji klavišai (%1$d)" + + + + + + diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 0a1fe92373..6228387796 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -70,24 +70,21 @@ "Mape: %1$s" "Logrīki" "Fona tapetes" - "Iestatījumi" + + "Atspējojis administrators" "Kopsavilkums" "Atļaut sākuma ekrāna pagriešanu" "Pagriežot tālruni" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." - - - - - - + "Ikonu emblēmas" + "Ieslēgts visām lietotnēm" + "Izslēgts visām lietotnēm" "Pievienot ikonu sākuma ekrānā" "Jaunām lietotnēm" - - + "Izmantot sistēmas noklusējumu" "Nezināma" @@ -124,4 +121,10 @@ "Logrīka lielums mainīts — platums: %1$s, augstums: %2$s." "Saīsnes" "%1$d saīsnes lietotnei %2$s" + + + + + + diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index ccec8c69a7..73f8cfa7b8 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -70,18 +70,16 @@ "Папка: %1$s" "Додатоци" "Позадини" - "Поставки" + + "Оневозможено од администраторот" "Краток преглед" "Дозволете ротација на Почетниот екран" "Кога телефонот се ротира" "Тековната поставка на Екранот не дозволува ротација" - - - - - - + "Ставање значки на икони" + "Вклучено за сите апликации" + "Исклучено за сите апликации" "Додајте икона на почетниот екран" "За нови апликации" @@ -123,4 +121,10 @@ "Големината на виџетот е променета на ширина %1$s висина %2$s" "Кратенки" "%1$d кратенки за %2$s" + + + + + + diff --git a/res/values-ml-rIN/config.xml b/res/values-ml-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-ml-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index fc4da03c4b..de90aca5a9 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -70,23 +70,20 @@ "ഫോൾഡർ: %1$s" "വിജറ്റുകൾ" "വാൾപേപ്പർ" - "ക്രമീകരണം" + + "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" "കാഴ്ച" "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" - - - - - - + "ഐക്കൺ ബാഡ്‌ജിംഗ്" + "എല്ലാ ആപ്പുകൾക്കും ഓണാണ്" + "എല്ലാ ആപ്പുകൾക്കും ഓഫാണ്" "ഹോം സ്ക്രീനിലേക്ക് ഐക്കൺ ചേർക്കുക" "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" - - + "സിസ്‌റ്റം ഡിഫോൾട്ട് ഉപയോഗിക്കുക" "ഐക്കൺ ആകാര മാറ്റങ്ങൾ പ്രയോഗിക്കുന്നു" "അജ്ഞാതം" "നീക്കംചെയ്യുക" @@ -122,4 +119,10 @@ "വീതി %1$s ഉയരം %2$s-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി" "കുറുക്കുവഴികൾ" "%2$s ആപ്പിനുള്ള %1$d കുറുക്കുവഴികൾ" + + + + + + diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 99bd09385c..09cef82901 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -70,24 +70,21 @@ "Фолдер: %1$s" "Виджет" "Ханын зураг" - "Тохиргоо" + + "Таны админ идэвхгүй болгосон" "Тойм" "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Утсыг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" - - - - - - + "Дүрс тэмдэг" + "Бүх аппад асаасан" + "Бүх аппад унтраасан" "Нүүр хуудаст дүрс тэмдэг нэмэх" "Шинэ аппад зориулсан" - - + "Системийн өгөгдмөл тохиргоог ашиглах" "Тодорхойгүй" @@ -124,4 +121,10 @@ "Виджэтийн өргөн %1$s, өндөр %2$s болсон" "Товчлол" "%2$s%1$d товчлол" + + + + + + diff --git a/res/values-mr-rIN/config.xml b/res/values-mr-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-mr-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 77ae9d3d8b..9a479389b9 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -70,23 +70,20 @@ "फोल्डर: %1$s" "विजेट" "वॉलपेपर" - "सेटिंग्ज" + + "आपल्या प्रशासकाने अक्षम केले" "विहंगावलोकन" "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "फोन फिरविला जातो तेव्हा" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" - - - - - - + "चिन्ह बॅज करणे" + "सर्व अॅपसाठी चालू आहे" + "सर्व अॅपसाठी बंद आहे" "मुख्य स्क्रीनवर चिन्ह जोडा" "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" - - + "सिस्‍टमचे डीफॉल्‍ट वापरा" "चिन्हाचा आकार बदल लागू करत आहे" "अज्ञात" "काढा" @@ -122,4 +119,10 @@ "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" "शॉर्टकट" "%2$s साठी %1$d शॉर्टकट" + + + + + + diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index d45af42370..be95e32b64 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -70,24 +70,21 @@ "Folder: %1$s" "Widget" "Kertas dinding" - "Tetapan" + + "Dilumpuhkan oleh pentadbir anda" "Ikhtisar" "Benarkan putaran Skrin Utama" "Apabila telefon diputar" "Tetapan Paparan semasa tidak membenarkan putaran" - - - - - - + "Pelencanaan ikon" + "Dihidupkan untuk semua apl" + "Dimatikan untuk semua apl" "Tambahkan ikon pada Skrin Utama" "Untuk apl baharu" - - + "Gunakan lalai sistem" "Tidak diketahui" @@ -124,4 +121,10 @@ "Saiz widget diubah menjadi %1$s lebar %2$s tinggi" "Pintasan" "%1$d pintasan untuk %2$s" + + + + + + diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index b5e76743f5..bcb7207f9f 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -70,18 +70,16 @@ "အကန့်အမည်: %1$s" "ဝိဂျက်များ" "နောက်ခံများ" - "ဆက်တင်များ" + + "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" "ခြုံငုံသုံးသပ်ချက်" "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" "ဖုန်းကိုလှည့်ထားစဉ်" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" - - - - - - + "သင်္ကေတ တံဆိပ်" + "အက်ပ်များအားလုံးအတွက် ဖွင့်ထားသည်" + "အက်ပ်များအားလုံးအတွက် ပိတ်ထားသည်" "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" "အက်ပ်အသစ်များအတွက်" @@ -123,4 +121,10 @@ "Widget အား အကျယ် %1$s အမြင့် %2$s အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏" "ဖြတ်လမ်းများ" "%2$s အတွက် အမြန်နည်း %1$d ခု" + + + + + + diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 072cd27123..4bcee516ff 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -70,24 +70,21 @@ "Mappe: %1$s" "Moduler" "Bakgrunner" - "Innstillinger" + + "Administratoren har slått av funksjonen" "Oversikt" "Tillat rotasjon av startskjermen" "Når telefonen roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" - - - - - - + "Ikonmerking" + "På for alle apper" + "Av for alle apper" "Legg til ikon på startsiden" "For nye apper" - - + "Bruk systemstandard" "Ukjent" @@ -124,4 +121,10 @@ "Størrelsen på modulen er endret til bredde %1$s og høyde %2$s" "Snarveier" "%1$d snarveier for %2$s" + + + + + + diff --git a/res/values-ne-rNP/config.xml b/res/values-ne-rNP/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-ne-rNP/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 37ebc24209..4d1658fb4c 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -70,23 +70,20 @@ "फोल्डर: %1$s" "विजेटहरू" "वालपेपरहरु" - "सेटिंङहरू" + + "तपाईँको प्रशासकद्वारा असक्षम गरिएको" "परिदृश्य" "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "फोनलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" - - - - - - + "आइकनलाई पदक दिने कार्य" + "सबै अनुप्रयोगहरूमा सक्रिय छ" + "सबै अनुप्रयोगहरूमा निष्क्रिय छ" "गृह स्क्रिनमा आइकन थप्नुहोस्" "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" - - + "प्रणालीको पूर्वनिर्धारित सेटिङ प्रयोग गर्नुहोस्" "आइकनको आकारमा गरिएका परिवर्तनहरू लागू गरिँदैछन्" "अज्ञात" "हटाउनुहोस्" @@ -122,4 +119,10 @@ "विजेट चौडाइ %1$s उचाइ %2$s मा पुनः आकार मिलाइयो" "सर्टकटहरू" "%2$s का %1$d सर्टकटहरू" + + + + + + diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 4f2ba93be0..2653a22ee3 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -70,18 +70,16 @@ "Map: %1$s" "Widgets" "Achtergrond" - "Instellingen" + + "Uitgeschakeld door je beheerder" "Overzicht" "Draaien van startscherm toestaan" "Wanneer de telefoon gedraaid is" "Huidige scherminstelling staat draaien niet toe" - - - - - - + "Pictogrambadges" + "Ingeschakeld voor alle apps" + "Uitgeschakeld voor alle apps" "Pictogram toevoegen aan startscherm" "Voor nieuwe apps" @@ -123,4 +121,10 @@ "Formaat van widget gewijzigd in breedte %1$s en hoogte %2$s" "Snelkoppelingen" "%1$d snelkoppelingen voor %2$s" + + + + + + diff --git a/res/values-pa-rIN/config.xml b/res/values-pa-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-pa-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 4998b9243c..5e3b64b05a 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -70,23 +70,20 @@ "ਫੋਲਡਰ: %1$s" "ਵਿਜਿਟ" "ਵਾਲਪੇਪਰ" - "ਸੈਟਿੰਗਾਂ" + + "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" "ਰੂਪ-ਰੇਖਾ" "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" - - - - - - + "ਪ੍ਰਤੀਕ ਨੂੰ ਬੈਜ ਕਰਨਾ" + "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਚਾਲੂ ਹੈ" + "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਬੰਦ ਹੈ" "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" - - + "ਸਿਸਟਮ ਦੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" @@ -122,4 +119,10 @@ "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %1$s ਉਂਚਾਈ %2$s ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ" "ਸ਼ਾਰਟਕੱਟ" "%2$s ਲਈ %1$d ਸ਼ਾਰਟਕੱਟ" + + + + + + diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 0c3a24aea2..09f0fcafcf 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -70,24 +70,21 @@ "Folder: %1$s" "Widżety" "Tapety" - "Ustawienia" + + "Funkcja wyłączona przez administratora" "Przegląd" "Zezwalaj na obrót ekranu głównego" "Po obróceniu telefonu" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" - - - - - - + "Plakietki na ikonach" + "Włączone dla wszystkich aplikacji" + "Wyłączone dla wszystkich aplikacji" "Dodaj ikonę do ekranu głównego" "W przypadku nowych aplikacji" - - + "Użyj ustawienia domyślnego" "Brak informacji" @@ -124,4 +121,10 @@ "Szerokość i wysokość widżetu zmieniła się na %1$s x %2$s" "Skróty" "Skróty aplikacji %2$s: %1$d" + + + + + + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index d06cea653b..bf9d0e8162 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -70,18 +70,16 @@ "Pasta: %1$s" "Widgets" "Imagens de fundo" - "Definições" + + "Desativada pelo administrador" "Vista geral" "Permitir rotação do ecrã principal" "Quando o telemóvel é rodado" "A definição de visualização atual não permite a rotação" - - - - - - + "Emblemas dos ícones" + "Ativada para todas as aplicações" + "Desativada para todas as aplicações" "Adicionar ícone ao ecrã principal" "Para novas aplicações" @@ -123,4 +121,10 @@ "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" "%1$d atalhos para a aplicação %2$s" + + + + + + diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index bdc2e83e6c..dfa88c6626 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -70,24 +70,21 @@ "Pasta: %1$s" "Widgets" "Planos de fundo" - "Configurações" + + "Desativado pelo administrador" "Visão geral" "Permitir rotação da tela inicial" "Quando o smartphone for girado" "A configuração atual de exibição não permite rotação" - - - - - - + "Uso de selo de ícone" + "Ativado para todos os apps" + "Desativado para todos os apps" "Adicionar ícone à tela inicial" "Para novos apps" - - + "Usar padrão do sistema" "Desconhecido" @@ -124,4 +121,10 @@ "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" "%1$d atalhos para %2$s" + + + + + + diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index e2409f9c9c..21795062ea 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -70,24 +70,21 @@ "Dosar: %1$s" "Widgeturi" "Imagini de fundal" - "Setări" + + "Dezactivată de administrator" "Prezentare generală" "Permiteți rotirea ecranului de pornire" "Când telefonul este rotit" "Setarea actuală a afișajului nu permite rotirea" - - - - - - + "Aplicarea insignelor pentru pictograme" + "Activată pentru toate aplicațiile" + "Dezactivată pentru toate aplicațiile" "Adaugă pictograme în ecranul de pornire" "Pentru aplicații noi" - - + "Folosiți setarea prestabilită a sistemului" "Necunoscut" @@ -124,4 +121,10 @@ "Widgetul a fost redimensionat la lățimea %1$s și înălțimea %2$s" "Comenzi rapide" "%1$d comenzi rapide pentru %2$s" + + + + + + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 0fb44c1c88..faae2b4c0c 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -70,24 +70,21 @@ "Папка: %1$s" "Виджеты" "Обои" - "Настройки" + + "Функция отключена администратором" "Обзор" "Разрешить поворачивать главный экран" "Когда телефон повернут" "В настройках отключен поворот экрана" - - - - - - + "Уведомления на значке приложения" + "Включено для всех приложений" + "Отключено для всех приложений" "Добавлять значки" "Добавлять значки установленных приложений на главный экран." - - + "Использовать системные настройки по умолчанию" "Неизвестно" @@ -124,4 +121,10 @@ "Изменен размер виджета: до %1$s в ширину и %2$s в высоту" "Ярлыки" "Количество ярлыков для приложения \"%2$s\": %1$d" + + + + + + diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 1c74f7c6c6..9f6cf5bb73 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -70,24 +70,21 @@ "ෆෝල්ඩරය: %1$s" "විජට්" "වෝල්පේපර" - "සැකසීම්" + + "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" "දළ විශ්ලේෂණය" "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "දුරකථනය කරකවන විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" - - - - - - + "නිරූපක ලාංඡනය" + "සියලු යෙදුම් සඳහා ක්‍රියාත්මකයි" + "සියලු යෙදුම් සඳහා ක්‍රියාවිරහිතයි" "මුල් පිටු තිරය වෙත අයිකනය එක් කරන්න" "නව යෙදුම් සඳහා" - - + "පද්ධති පෙරනිමි භාවිත කරන්න" "නොදනී" @@ -124,4 +121,10 @@ "විජට් පළල %1$s උස %2$s වෙත ප්‍රමාණකරණය කරන ලදි" "කෙටිමං" "%2$s සඳහා කෙටි මං %1$d" + + + + + + diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 1b66f0cda4..e920fab1d6 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -70,24 +70,21 @@ "Priečinok: %1$s" "Miniaplikácie" "Tapety" - "Nastavenia" + + "Zakázané vaším správcom" "Prehľad" "Povoliť otáčanie plochy" "Pri otočení telefónu" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" - - - - - - + "Označovanie ikon" + "Zapnuté pre všetky aplikácie" + "Vypnuté pre všetky aplikácie" "Pridať ikonu na plochu" "Pri inštalácii novej aplikácie" - - + "Použiť predvolené nastavenie systému" "Neznáme" @@ -124,4 +121,10 @@ "Veľkosť miniaplikácie bola zmenená na %1$s x %2$s (šírka x výška)" "Skratky" "Počet skratiek aplikácie %2$s: %1$d" + + + + + + diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 6717b31995..fb5df08ced 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -70,24 +70,21 @@ "Mapa: %1$s" "Pripomočki" "Ozadja" - "Nastavitve" + + "Onemogočil skrbnik." "Pregled" "Omogočanje sukanja začetnega zaslona" "Ko se telefon zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" - - - - - - + "Označevanje z ikonami" + "Vklopljeno za vse aplikacije" + "Izklopljeno za vse aplikacije" "Dodaj ikono na začetni zaslon" "Za nove aplikacije" - - + "Uporabi privzeto nastavitev sistema" "Neznano" @@ -124,4 +121,10 @@ "Velikost pripomočka je bila spremenjena na %1$s širine in %2$s višine" "Bližnjice" "Št. bližnjic za aplikacijo %2$s: %1$d" + + + + + + diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index dc7bff638f..039fae4327 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -70,18 +70,16 @@ "Dosja: %1$s" "Miniaplikacionet" "Imazhet e sfondit" - "Cilësimet" + + "Çaktivizuar nga administratori" "Përmbledhje" "Lejo rrotullimin e ekranit kryesor" "Kur telefoni rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" - - - - - - + "Caktimi i simbolit të ikonës" + "Aktiv për të gjitha aplikacionet" + "Joaktiv për të gjitha aplikacionet" "Shto ikonë në ekranin bazë" "Për aplikacionet e reja" @@ -123,4 +121,10 @@ "Madhësia e miniaplikacionit u ndryshua me gjerësinë %1$s dhe lartësinë %2$s" "Shkurtoret" "%1$d shkurtesa për %2$s" + + + + + + diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 49ea52234d..16ef6cc3a7 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -70,18 +70,16 @@ "Директоријум: %1$s" "Виџети" "Позадине" - "Подешавања" + + "Администратор је онемогућио" "Преглед" "Дозволи ротацију почетног екрана" "Када се телефон ротира" "Актуелно подешавање приказа не дозвољава ротацију" - - - - - - + "Додавање значки на иконе" + "Укључено за све апликације" + "Искључено за све апликације" "Додај икону на почетни екран" "За нове апликације" @@ -123,4 +121,10 @@ "Величина виџета је промењена на ширину %1$s и висину %2$s" "Пречице" "%1$d пречице(а) за %2$s" + + + + + + diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index b74abd731d..ef5b6ac4c9 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -70,18 +70,16 @@ "Mapp: %1$s" "Widgetar" "Bakgrunder" - "Inställningar" + + "Inaktiverat av administratören" "Översikt" "Tillåt rotering av startskärmen" "När mobilen vrids" "Rotering tillåts inte i de nuvarande skärminställningarna" - - - - - - + "Ikonmärken" + "Aktiverat för alla appar" + "Inaktiverat för alla appar" "Lägg till ikonen på startskärmen" "För nya appar" @@ -123,4 +121,10 @@ "Widgetens storlek har ändrats till: bredd %1$s, höjd %2$s" "Genvägar" "%1$d genvägar för %2$s" + + + + + + diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 375e843d84..73b4a8c55f 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -72,18 +72,16 @@ "Folda: %1$s" "Wijeti" "Mandhari" - "Mipangilio" + + "Imezimwa na msimamizi wako" "Muhtasari" "Ruhusu kuzungusha skrini ya Kwanza" "Simu inapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" - - - - - - + "Kuweka beji kwenye aikoni" + "Imewashwa katika programu zote" + "Imezimwa katika programu zote" "Ongeza aikoni kwenye Skrini ya kwanza" "Kwa ajili ya programu mpya" @@ -125,4 +123,10 @@ "Wijeti imepunguzwa hadi upana %1$s urefu %2$s" "Njia za mkato" "Njia %1$d za mkato za %2$s" + + + + + + diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index af052cbc52..4b94a5997a 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -70,18 +70,16 @@ "கோப்புறை: %1$s" "ஷார்ட்கட்ஸ்" "வால்பேப்பர்கள்" - "அமைப்பு" + + "உங்கள் நிர்வாகி முடக்கியுள்ளார்" "மேலோட்டப் பார்வை" "முகப்புத் திரை சுழற்சியை அனுமதி" "மொபைலைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" - - - - - - + "ஐகான் பேட்ஜிங்" + "எல்லாப் பயன்பாடுகளுக்கும் இயக்கப்பட்டது" + "எல்லாப் பயன்பாடுகளுக்கும் முடக்கப்பட்டது" "முகப்புத் திரையில் ஐகானைச் சேர்" "புதிய பயன்பாடுகளுக்கு" @@ -123,4 +121,10 @@ "அகலம் %1$s மற்றும் உயரம் %2$sக்கு விட்ஜெட் அளவு மாற்றப்பட்டது" "குறுக்குவழிகள்" "%2$sக்கான %1$d குறுக்குவழிகள்" + + + + + + diff --git a/res/values-te-rIN/config.xml b/res/values-te-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-te-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index ded39cc601..9003b8bfb1 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -70,23 +70,20 @@ "ఫోల్డర్: %1$s" "విడ్జెట్‌లు" "వాల్‌పేపర్‌లు" - "సెట్టింగ్‌లు" + + "మీ నిర్వాహకులు నిలిపివేసారు" "స్థూలదృష్టి" "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "ఫోన్‌‌ను తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" - - - - - - + "చిహ్నం బ్యాడ్జ్" + "అన్ని అనువర్తనాలలో ఆన్ చేయబడ్డాయి" + "అన్ని అనువర్తనాలలో ఆఫ్‌ చేయబడ్డాయి" "హోమ్ స్క్రీన్‌కి చిహ్నాన్ని జోడించు" "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" - - + "సిస్టమ్ డిఫాల్ట్‌ను ఉపయోగించండి" "చిహ్న ఆకార మార్పులను వర్తింపజేస్తోంది" "తెలియదు" "తీసివేయి" @@ -122,4 +119,10 @@ "విడ్జెట్ పరిమాణం వెడల్పు %1$sకి, ఎత్తు %2$sకి మార్చబడింది" "సత్వరమార్గాలు" "%2$s కోసం %1$d సత్వరమార్గాలు" + + + + + + diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 0c5f72b20d..78e193c072 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -70,24 +70,21 @@ "โฟลเดอร์: %1$s" "วิดเจ็ต" "วอลเปเปอร์" - "การตั้งค่า" + + "ปิดใช้โดยผู้ดูแลระบบ" "ภาพรวม" "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนโทรศัพท์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" - - - - - - + "การติดป้ายไอคอน" + "เปิดสำหรับแอปทั้งหมด" + "ปิดสำหรับแอปทั้งหมด" "เพิ่มไอคอนในหน้าจอหลัก" "สำหรับแอปใหม่" - - + "ใช้ค่าเริ่มต้นของระบบ" "ไม่รู้จัก" @@ -124,4 +121,10 @@ "ปรับขนาดของวิดเจ็ตเป็นกว้าง %1$s สูง %2$s แล้ว" "ทางลัด" "%1$d ทางลัดสำหรับ %2$s" + + + + + + diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index e946dfd9a4..829360c185 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -70,24 +70,21 @@ "Folder: %1$s" "Mga Widget" "Mga Wallpaper" - "Mga Setting" + + "Na-disable ng iyong admin" "Pangkalahatang-ideya" "Payagan ang pag-rotate ng Home screen" "Kailan maro-rotate ang telepono" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" - - - - - - + "Pag-badge ng icon" + "Naka-on para sa lahat ng app" + "Naka-off para sa lahat ng app" "Idagdag ang icon sa Home screen" "Para sa mga bagong app" - - + "Gamitin ang default ng system" "Hindi kilala" @@ -124,4 +121,10 @@ "Na-resize ang widget sa lapad %1$s taas %2$s" "Mga Shortcut" "%1$d (na) shortcut para sa %2$s" + + + + + + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 47d083f9a1..b41b15de99 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -70,24 +70,21 @@ "Klasör: %1$s" "Widget\'lar" "Duvar Kağıtları" - "Ayarlar" + + "Yöneticiniz tarafından devre dışı bırakıldı" "Genel bakış" "Ana ekranı döndürmeye izin ver" "Telefon döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" - - - - - - + "Simge rozeti ekleme" + "Tüm uygulamalar için açık" + "Tüm uygulamalar için kapalı" "Ana ekrana simge ekle" "Yeni uygulamalar için" - - + "Sistem varsayılanını kullan" "Bilinmiyor" @@ -124,4 +121,10 @@ "Widget, %1$s genişlik ve %2$s yükseklik değerine yeniden boyutlandırıldı" "Kısayollar" "%2$s için %1$d kısayol" + + + + + + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 7c954daf19..aadd595294 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -70,18 +70,16 @@ "Папка %1$s" "Віджети" "Фонові малюнки" - "Налаштування" + + "Вимкнув адміністратор" "Огляд" "Дозволити обертання головного екрана" "Коли телефон обертається" "Поточні налаштування дисплея не підтримують обертання" - - - - - - + "Позначення значків" + "Увімкнено для всіх додатків" + "Вимкнено для всіх додатків" "Додати значок на головний екран" "Для нових додатків" @@ -123,4 +121,10 @@ "Розміри віджета змінено на %1$s завширшки та %2$s заввишки" "Ярлики" "Ярликів для додатка %2$s: %1$d" + + + + + + diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index c84f5c92fd..24f4dd78df 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -70,18 +70,16 @@ "فولڈر: %1$s" "ویجیٹس" "وال پیپرز" - "ترتیبات" + + "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" "مجموعی جائزہ" "ہوم اسکرین گھمانے کی اجازت دیں" "جب فون گھمایا جاتا ہے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" - - - - - - + "آئیکن کی بیج سازی" + "سبھی ایپس کیلئے آن ہے" + "تمام ایپس کے لئے بند ہے" "آئیکن کو ہوم اسکرین میں شامل کریں" "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" @@ -121,4 +119,10 @@ "ویجیٹ کے سائز کو چوڑائی %1$s اونچائی %2$s میں تبدیل کر دیا گیا" "شارٹ کٹس" "%2$s کیلئے %1$d شارٹ کٹس" + + + + + + diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 4fa0645371..506f433332 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -70,24 +70,21 @@ "Jild: %1$s" "Vidjetlar" "Fon rasmlari" - "Sozlamalar" + + "Administrator tomonidan o‘chirilgan" "Umumiy ko‘rinish" "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" - - - - - - + "Nishonchalar" + "Barcha ilovalar uchun yoniq" + "Barcha ilovalar uchun o‘chiq" "Bosh ekranga ikonka qo‘shish" "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" - - + "Standart tizim parametrlaridan foydalanish" "Noma’lum" @@ -124,4 +121,10 @@ "Vidjetning eni %1$s, bo‘yi %2$s qilib o‘zgartirildi" "Tezkor tugmalar" "%2$s ilovasi uchun %1$d ta tezkor tugma" + + + + + + diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index dea2788b95..f24a169a56 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -70,24 +70,21 @@ "Thư mục: %1$s" "Tiện ích con" "Hình nền" - "Cài đặt" + + "Bị tắt bởi quản trị viên của bạn" "Tổng quan" "Cho phép xoay Màn hình chính" "Khi xoay điện thoại" "Cài đặt Hiển thị hiện tại không cho phép xoay" - - - - - - + "Gắn huy hiệu biểu tượng" + "Bật cho tất cả ứng dụng" + "Tắt cho tất cả ứng dụng" "Thêm biểu tượng vào màn hình chính" "Cho ứng dụng mới" - - + "Sử dụng mặc định của hệ thống" "Không xác định" @@ -124,4 +121,10 @@ "Đã đổi kích thước tiện ích thành chiều rộng %1$s chiều cao %2$s" "Lối tắt" "%1$d phím tắt cho %2$s" + + + + + + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 4ddc17f818..8231d93a35 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -70,24 +70,21 @@ "文件夹:%1$s" "微件" "壁纸" - "设置" + + "已被您的管理员停用" "概览" "允许旋转主屏幕" "手机旋转时" "当前的显示设置不允许旋转设备" - - - - - - + "在图标上显示标记" + "已针对所有应用开启" + "已针对所有应用关闭" "将图标添加到主屏幕" "适用于新应用" - - + "使用系统默认设置" "未知" @@ -124,4 +121,10 @@ "微件尺寸已调整为:宽度 %1$s,高度 %2$s" "快捷方式" "%2$s%1$d 个快捷方式" + + + + + + diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 2c369850b9..c91cfd62cb 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -70,24 +70,21 @@ "資料夾:%1$s" "小工具" "桌布" - "設定" + + "已由您的管理員停用" "概覽" "允許主畫面旋轉" "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" - - - - - - + "在圖示上顯示標誌" + "為所有應用程式開啟此設定" + "為所有應用程式關閉此設定" "將圖示加到主畫面" "適用於新安裝的應用程式" - - + "使用系統預設設定" "不明" @@ -124,4 +121,10 @@ "已調整小工具的大小至闊 %1$s%2$s" "捷徑" "「%2$s」嘅 %1$d 個捷徑" + + + + + + diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index ef48e1fb03..b0cbf6c417 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -70,24 +70,21 @@ "資料夾:%1$s" "小工具" "桌布" - "設定" + + "已由你的管理員停用" "總覽" "允許旋轉主螢幕" "當手機旋轉時" "目前的顯示設定不允許旋轉畫面" - - - - - - + "在圖示上顯示標記" + "為所有應用程式開啟這項設定" + "為所有應用程式關閉這項設定" "將圖示加到主螢幕" "適用於新安裝的應用程式" - - + "使用系統預設值" "不明" @@ -124,4 +121,10 @@ "已將小工具的寬度和高度分別調整為 %1$s%2$s" "捷徑" "「%2$s」有 %1$d 個捷徑" + + + + + + diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 3330ef4eab..9226248bd1 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -70,24 +70,21 @@ "Ifolda: %1$s" "Amawijethi" "Izithombe zangemuva" - "Izilungiselelo" + + "Kukhutshazwe umlawuli wakho" "Ukubuka konke" "Vumela ukuphendukiswa kwesikrini sasekhaya" "Uma ifoni iphendukiswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" - - - - - - + "Ibheji yesithonjana" + "Kuvuliwe kuzo zonke izinhlelo zokusebenza" + "Kuvaliwe kuzo zonke izinhlelo zokusebenza" "Engeza isithonjana eskrinini sasekhaya" "Kwezinhlelo zokusebenza ezintsha" - - + "Sebenzisa okuzenzakalelayo kwesistimu" "Akwaziwa" @@ -124,4 +121,10 @@ "Iwijethi inikezwe usayizi omusha ngobubanzi obungu-%1$s ubude obungu-%2$s" "Izinqamuleli" "%1$d izinqamuleli ze-%2$s" + + + + + + From a139810632cd3dca6cf260c144b097869ba72938 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 May 2017 19:13:37 -0700 Subject: [PATCH 095/446] Import translations. DO NOT MERGE Change-Id: Ia08a537f6ef1e555cd381b69224124fbcad34d68 Auto-generated-cl: translation import --- res/values-af/strings.xml | 18 +++++++++++------- res/values-am/strings.xml | 18 +++++++++++------- res/values-ar/strings.xml | 21 ++++++++++++--------- res/values-az/strings.xml | 18 +++++++++++------- res/values-b+sr+Latn/strings.xml | 18 +++++++++++------- res/values-be/strings.xml | 21 ++++++++++++--------- res/values-bg/strings.xml | 21 ++++++++++++--------- res/values-bn/config.xml | 12 ++++++++++++ res/values-bn/strings.xml | 21 ++++++++++++--------- res/values-bs/strings.xml | 21 ++++++++++++--------- res/values-ca/strings.xml | 21 ++++++++++++--------- res/values-cs/strings.xml | 18 +++++++++++------- res/values-da/strings.xml | 21 ++++++++++++--------- res/values-de/strings.xml | 21 ++++++++++++--------- res/values-el/strings.xml | 21 ++++++++++++--------- res/values-en-rAU/strings.xml | 18 +++++++++++------- res/values-en-rGB/strings.xml | 18 +++++++++++------- res/values-en-rIN/strings.xml | 18 +++++++++++------- res/values-es-rUS/strings.xml | 21 ++++++++++++--------- res/values-es/strings.xml | 21 ++++++++++++--------- res/values-et/strings.xml | 18 +++++++++++------- res/values-eu/strings.xml | 21 ++++++++++++--------- res/values-fa/strings.xml | 21 ++++++++++++--------- res/values-fi/strings.xml | 18 +++++++++++------- res/values-fr-rCA/strings.xml | 21 ++++++++++++--------- res/values-fr/strings.xml | 21 ++++++++++++--------- res/values-gl/strings.xml | 21 ++++++++++++--------- res/values-gu/config.xml | 12 ++++++++++++ res/values-gu/strings.xml | 21 ++++++++++++--------- res/values-hi/strings.xml | 18 +++++++++++------- res/values-hr/strings.xml | 21 ++++++++++++--------- res/values-hu/strings.xml | 18 +++++++++++------- res/values-hy/strings.xml | 21 ++++++++++++--------- res/values-in/strings.xml | 18 +++++++++++------- res/values-is/strings.xml | 18 +++++++++++------- res/values-it/strings.xml | 18 +++++++++++------- res/values-iw/strings.xml | 21 ++++++++++++--------- res/values-ja/strings.xml | 21 ++++++++++++--------- res/values-ka/strings.xml | 18 +++++++++++------- res/values-kk/strings.xml | 18 +++++++++++------- res/values-km/strings.xml | 21 ++++++++++++--------- res/values-kn/config.xml | 12 ++++++++++++ res/values-kn/strings.xml | 21 ++++++++++++--------- res/values-ko/strings.xml | 21 ++++++++++++--------- res/values-ky/strings.xml | 18 +++++++++++------- res/values-lo/strings.xml | 18 +++++++++++------- res/values-lt/strings.xml | 21 ++++++++++++--------- res/values-lv/strings.xml | 21 ++++++++++++--------- res/values-mk/strings.xml | 18 +++++++++++------- res/values-ml/config.xml | 12 ++++++++++++ res/values-ml/strings.xml | 21 ++++++++++++--------- res/values-mn/strings.xml | 21 ++++++++++++--------- res/values-mr/config.xml | 12 ++++++++++++ res/values-mr/strings.xml | 21 ++++++++++++--------- res/values-ms/strings.xml | 21 ++++++++++++--------- res/values-my/strings.xml | 18 +++++++++++------- res/values-nb/strings.xml | 21 ++++++++++++--------- res/values-ne/config.xml | 12 ++++++++++++ res/values-ne/strings.xml | 21 ++++++++++++--------- res/values-nl/strings.xml | 18 +++++++++++------- res/values-pa/config.xml | 12 ++++++++++++ res/values-pa/strings.xml | 21 ++++++++++++--------- res/values-pl/strings.xml | 21 ++++++++++++--------- res/values-pt-rPT/strings.xml | 18 +++++++++++------- res/values-pt/strings.xml | 21 ++++++++++++--------- res/values-ro/strings.xml | 21 ++++++++++++--------- res/values-ru/strings.xml | 21 ++++++++++++--------- res/values-si/strings.xml | 21 ++++++++++++--------- res/values-sk/strings.xml | 21 ++++++++++++--------- res/values-sl/strings.xml | 21 ++++++++++++--------- res/values-sq/strings.xml | 18 +++++++++++------- res/values-sr/strings.xml | 18 +++++++++++------- res/values-sv/strings.xml | 18 +++++++++++------- res/values-sw/strings.xml | 18 +++++++++++------- res/values-ta/strings.xml | 18 +++++++++++------- res/values-te/config.xml | 12 ++++++++++++ res/values-te/strings.xml | 21 ++++++++++++--------- res/values-th/strings.xml | 21 ++++++++++++--------- res/values-tl/strings.xml | 21 ++++++++++++--------- res/values-tr/strings.xml | 21 ++++++++++++--------- res/values-uk/strings.xml | 18 +++++++++++------- res/values-ur/strings.xml | 18 +++++++++++------- res/values-uz/strings.xml | 21 ++++++++++++--------- res/values-vi/strings.xml | 21 ++++++++++++--------- res/values-zh-rCN/strings.xml | 21 ++++++++++++--------- res/values-zh-rHK/strings.xml | 21 ++++++++++++--------- res/values-zh-rTW/strings.xml | 21 ++++++++++++--------- res/values-zu/strings.xml | 21 ++++++++++++--------- 88 files changed, 1026 insertions(+), 660 deletions(-) create mode 100644 res/values-bn/config.xml create mode 100644 res/values-gu/config.xml create mode 100644 res/values-kn/config.xml create mode 100644 res/values-ml/config.xml create mode 100644 res/values-mr/config.xml create mode 100644 res/values-ne/config.xml create mode 100644 res/values-pa/config.xml create mode 100644 res/values-te/config.xml diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index eafc506583..31167e9daf 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -70,18 +70,16 @@ "Vouer: %1$s" "Legstukke" "Muurpapiere" - "Instellings" + + "Gedeaktiveer deur jou administrateur" "Oorsig" "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" - - - - - - + "Ikoon-kentekengewing" + "Aan vir alle programme" + "Af vir alle programme" "Voeg ikoon by tuisskerm" "Vir nuwe programme" @@ -123,4 +121,10 @@ "Legstukgrootte is verander na breedte %1$s hoogte %2$s" "Kortpaaie" "%1$d kortpaaie vir %2$s" + + + + + + diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 0482f54c3a..dee2910619 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -70,18 +70,16 @@ "አቃፊ፦ %1$s" "ፍርግሞች" "የግድግዳ ወረቀቶች" - "ቅንብሮች" + + "በእርስዎ አስተዳዳሪ የተሰናከለ" "አጠቃላይ ዕይታ" "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "ስልኩ ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" - - - - - - + "የአዶ ባጅ" + "ለሁሉም መተግበሪያዎች በርቷል" + "ለሁሉም መተግበሪያዎች ጠፍጧል" "አዶ ወደ የመነሻ ማያ ገጽ አክል" "ለአዲስ መተግበሪያዎች" @@ -123,4 +121,10 @@ "የመግብር መጠን ወደ ስፋት %1$s ቁመት %2$s ተለውጧል" "አቋራጮች" "%1$d%2$s አቋራጮች" + + + + + + diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index a2b13cda1d..94a5aead47 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -70,24 +70,21 @@ "المجلد: %1$s" "الأدوات" "الخلفيات" - "الإعدادات" + + "عطَّل المشرف هذه الميزة" "نظرة عامة" "السماح بتدوير الشاشة الرئيسية" "عند تدوير الهاتف" "لا يسمح إعداد العرض الحالي بالتدوير" - - - - - - + "وضع شارات على رموز التطبيقات" + "تشغيل لجميع التطبيقات" + "إيقاف لجميع التطبيقات" "إضافة رمز إلى الشاشة الرئيسية" "للتطبيقات الجديدة" - - + "استخدام الإعداد الافتراضي للنظام" "غير معروفة" @@ -124,4 +121,10 @@ "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" "الاختصارات" "%1$d اختصار لتطبيق %2$s" + + + + + + diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index e7d0b2f484..853520ae13 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -70,18 +70,16 @@ "Qovluq: %1$s" "Vidcet" "Divar kağızları" - "Ayarlar" + + "Admininiz tərəfindən deaktiv edilib" "İcmal" "Əsas ekranın firlanmağına icazə verin" "Telefon çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" - - - - - - + "İkona nişanı" + "Bütün tətbiqlər üçün aktivdir" + "Bütün tətbiqlər üçün deaktivdir" "Əsas ekrana ikona əlavə edin" "Yeni tətbiqlər üçün" @@ -123,4 +121,10 @@ "Vidcetin eni %1$s hündürlüyü %2$s kimi ölçüləndirildi" "Qısa yollar" "%1$d üçün %2$s qısa yolu" + + + + + + diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 7638a0e34f..03a93aae43 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -70,18 +70,16 @@ "Direktorijum: %1$s" "Vidžeti" "Pozadine" - "Podešavanja" + + "Administrator je onemogućio" "Pregled" "Dozvoli rotaciju početnog ekrana" "Kada se telefon rotira" "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" - - - - - - + "Dodavanje znački na ikone" + "Uključeno za sve aplikacije" + "Isključeno za sve aplikacije" "Dodaj ikonu na početni ekran" "Za nove aplikacije" @@ -123,4 +121,10 @@ "Veličina vidžeta je promenjena na širinu %1$s i visinu %2$s" "Prečice" "%1$d prečice(a) za %2$s" + + + + + + diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 3438026eb3..85953c4d63 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -70,24 +70,21 @@ "Папка: %1$s" "Віджэты" "Шпалеры" - "Налады" + + "Адключаная адміністратарам" "Агляд" "Дазволіць паварот галоўнага экрана" "Пры павароце тэлефона" "Бягучая налада дысплэя не прадугледжвае паварот" - - - - - - + "Паметкі на значку" + "Уключана для ўсіх праграм" + "Адключана для ўсіх праграм" "Дадаць значок на Галоўны экран" "Для новых праграм" - - + "Выкарыстоўваць стандартныя формы" "Невядома" @@ -124,4 +121,10 @@ "Памеры віджэта зменены на: шырыня %1$s, вышыня %2$s" "Ярлыкі" "Ярлыкі (%1$d) для %2$s" + + + + + + diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index ba275a60d8..93e484a3b8 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -70,24 +70,21 @@ "Папка: „%1$s“" "Приспособления" "Тапети" - "Настройки" + + "Деактивирано от администратора ви" "Общ преглед" "Разрешаване на завъртането на началния екран" "При завъртане на телефона" "Текущата настройка на екрана не разрешава завъртане" - - - - - - + "Означаване със значка на иконите" + "Включено за всички приложения" + "Изключено за всички приложения" "Добавяне на икона към началния екран" "За нови приложения" - - + "Използване на стандартната системна настройка" "Няма информация" @@ -124,4 +121,10 @@ "Приспособлението е преоразмерено към ширина %1$s и височина %2$s" "Преки пътища" "%1$d преки пътища за %2$s" + + + + + + diff --git a/res/values-bn/config.xml b/res/values-bn/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-bn/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 3b233dcc97..b498f50ca4 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -70,23 +70,20 @@ "ফোল্ডার: %1$s" "উইজেটগুলি" "ওয়ালপেপারগুলি" - "সেটিংস" + + "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" "এক নজরে" "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "যখন ফোনটি ঘোরানো হয়" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" - - - - - - + "আইকনে ব্যাজ দেওয়া" + "সমস্ত অ্যাপের জন্য চালু আছে" + "সমস্ত অ্যাপের জন্য বন্ধ আছে" "হোম স্ক্রিনে আইকন যোগ করুন" "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" - - + "সিস্টেমের ডিফল্ট মান ব্যবহার করুন" "আইকনের আকৃতি পরিবর্তন করা হচ্ছে" "অজানা" "সরান" @@ -122,4 +119,10 @@ "উইজেটের আকার প্রস্থ %1$s উচ্চতা %2$s তে পরিবর্তন করা হয়েছে" "শর্টকাট" "%2$s এর %1$dটি শর্টকার্ট" + + + + + + diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index ca880e7015..fc2ad74702 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -70,24 +70,21 @@ "Folder: %1$s" "Dodaci" "Pozadinske slike" - "Postavke" + + "Onemogućio vaš administrator" "Pregled" "Dozvoli rotiranje početnog ekrana" "Kada se telefon zarotira" "Trenutne postavke ekrana ne dozvoljavaju rotiranje" - - - - - - + "Označavanje ikona" + "Uključeno za sve aplikacije" + "Isključeno za sve aplikacije" "Dodajte ikonu na početni ekran" "Za nove aplikacije" - - + "Koristite sistemski zadano" "Nepoznato" @@ -124,4 +121,10 @@ "Veličina vidžeta je promijenjena na širinu %1$s visinu %2$s" "Prečice" "%1$d prečica za aplikaciju %2$s" + + + + + + diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index a59d64555f..52a5df43e3 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -70,24 +70,21 @@ "Carpeta: %1$s" "Widgets" "Fons de pantalla" - "Configuració" + + "Desactivada per l\'administrador" "Visió general" "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" - - - - - - + "Símbols d\'icona" + "Activats per a totes les aplicacions" + "Desactivats per a totes les aplicacions" "Afegeix la icona a la pantalla d\'inici" "Per a les aplicacions noves" - - + "Utilitza l\'opció predeterminada del sistema" "Desconegut" @@ -124,4 +121,10 @@ "S\'ha canviat la mida del widget a l\'amplada %1$s i l\'alçada %2$s" "Dreceres" "%1$d dreceres per a l\'aplicació %2$s" + + + + + + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 9d9065e5d5..073ad04583 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -70,18 +70,16 @@ "Složka: %1$s" "Widgety" "Tapety" - "Nastavení" + + "Zakázáno administrátorem" "Přehled" "Povolit otáčení plochy" "Při otočení telefonu" "Aktuální nastavení displeje neumožňuje otáčení" - - - - - - + "Odznaky na ikonách" + "Zapnuto pro všechny aplikace" + "Vypnuto pro všechny aplikace" "Přidat ikonu na plochu" "Pro nové aplikace" @@ -123,4 +121,10 @@ "Velikost widgetu upravena: šířka %1$s, výška %2$s" "Zkratky" "Počet zkratek pro aplikaci %2$s: %1$d" + + + + + + diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 60f08fbbb4..922e891502 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -70,24 +70,21 @@ "Mappe: %1$s" "Widgets" "Baggrunde" - "Indstillinger" + + "Deaktiveret af din administrator" "Oversigt" "Tillad rotation af startskærmen" "Når telefonen roteres" "Den aktuelle indstilling for visning tillader ikke rotation" - - - - - - + "Ikonbadges" + "Slået til for alle apps" + "Slået fra for alle apps" "Føj ikon til startskærmen" "For nye apps" - - + "Brug systemstandarden" "Ukendt" @@ -124,4 +121,10 @@ "Størrelsen for widgetten er ændret til bredde %1$s og højde %2$s" "Genveje" "%1$d genveje til %2$s" + + + + + + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 2a022f7887..b7e385e6dd 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -70,24 +70,21 @@ "Ordner: %1$s" "Widgets" "Hintergründe" - "Einstellungen" + + "Von deinem Administrator deaktiviert" "Übersicht" "Drehung des Startbildschirms zulassen" "Bei Drehung des Smartphones" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" - - - - - - + "Logosymbole" + "Für alle Apps aktiviert" + "Für alle Apps deaktiviert" "Symbol zu Startbildschirm hinzufügen" "Für neue Apps" - - + "Systemstandardeinstellung verwenden" "Unbekannt" @@ -124,4 +121,10 @@ "Größe des Widgets zu Breite %1$s und Höhe %2$s geändert" "Verknüpfungen" "%1$d Verknüpfungen für %2$s" + + + + + + diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 28ed6febda..4c589063ee 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -70,24 +70,21 @@ "Φάκελος: %1$s" "Γραφικά στοιχεία" "Ταπετσαρίες" - "Ρυθμίσεις" + + "Απενεργοποιήθηκε από τον διαχειριστή σας" "Επισκόπηση" "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν το τηλέφωνο περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" - - - - - - + "Σήματα εικονιδίων" + "Ενεργοποιημένα για όλες τις εφαρμογές" + "Απενεργοποιημένα για όλες τις εφαρμογές" "Προσθήκη εικονιδίου στην Αρχική οθόνη" "Για νέες εφαρμογές" - - + "Χρήση προεπιλογής συστήματος" "Άγνωστο" @@ -124,4 +121,10 @@ "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" "Συντομεύσεις" "%1$d συντομεύσεις για %2$s" + + + + + + diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 03309f23be..a718971217 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -70,18 +70,16 @@ "Folder: %1$s" "Widgets" "Wallpapers" - "Settings" + + "Disabled by your admin" "Overview" "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - - - - - - + "Icon badging" + "On for all apps" + "Off for all apps" "Add icon to Home screen" "For new apps" @@ -123,4 +121,10 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" + + + + + + diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 03309f23be..a718971217 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -70,18 +70,16 @@ "Folder: %1$s" "Widgets" "Wallpapers" - "Settings" + + "Disabled by your admin" "Overview" "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - - - - - - + "Icon badging" + "On for all apps" + "Off for all apps" "Add icon to Home screen" "For new apps" @@ -123,4 +121,10 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" + + + + + + diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 03309f23be..a718971217 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -70,18 +70,16 @@ "Folder: %1$s" "Widgets" "Wallpapers" - "Settings" + + "Disabled by your admin" "Overview" "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - - - - - - + "Icon badging" + "On for all apps" + "Off for all apps" "Add icon to Home screen" "For new apps" @@ -123,4 +121,10 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" + + + + + + diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 477edb766b..cafea4c8f7 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -70,24 +70,21 @@ "Carpeta: %1$s" "Widgets" "Fondos de pantalla" - "Configuración" + + "El administrador inhabilitó esta función" "Recientes" "Permitir la rotación de la pantalla principal" "Al girar el teléfono" "La configuración actual no permite la rotación de la pantalla" - - - - - - + "Insignias de íconos" + "Activada para todas las apps" + "Desactivada para todas las apps" "Agregar ícono a la pantalla principal" "Para nuevas apps" - - + "Usar el sistema predeterminado" "Desconocido" @@ -124,4 +121,10 @@ "Se cambió la dimensión del widget a %1$s de ancho y %2$s de alto." "Accesos directos" "%1$d accesos directos para %2$s" + + + + + + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index ae91ae8b05..6b3bb34eb6 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -70,24 +70,21 @@ "Carpeta: %1$s" "Widgets" "Fondos de pantalla" - "Ajustes" + + "Inhabilitada por el administrador" "Visión general" "Permitir rotación de la pantalla de inicio" "Al girar el teléfono" "La configuración de pantalla actual no permite girar la pantalla" - - - - - - + "Insignias de los iconos" + "Activadas para todas las aplicaciones" + "Desactivadas para todas las aplicaciones" "Añadir icono a la pantalla de inicio" "Para nuevas aplicaciones" - - + "Usar opción predeterminada del sistema" "Desconocido" @@ -124,4 +121,10 @@ "Se ha modificado el tamaño del widget a %1$s de ancho y %2$s de alto" "Accesos directos" "%1$d accesos directos de %2$s" + + + + + + diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 2477822733..5d57ef1182 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -70,18 +70,16 @@ "Kaust: %1$s" "Vidinad" "Taustapildid" - "Seaded" + + "Keelas administraator" "Ülevaade" "Luba avaekraani pööramine" "Kui telefoni pööratakse" "Praegune kuvaseade ei luba pööramist" - - - - - - + "Ikoonimärgi lisamine" + "Sisse lülitatud kõigi rakenduste jaoks" + "Välja lülitatud kõigi rakenduste jaoks" "Lisa ikoon avaekraanile" "Uute rakenduste puhul" @@ -123,4 +121,10 @@ "Vidina suurust muudeti. Laius: %1$s. Kõrgus: %2$s" "Otseteed" "%1$d otseteed rakenduse %2$s jaoks" + + + + + + diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 2f14129399..ee6cf0caa1 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -70,24 +70,21 @@ "Karpeta: %1$s" "Widgetak" "Horma-paperak" - "Ezarpenak" + + "Administratzaileak desgaitu du" "Ikuspegi orokorra" "Baimendu hasierako pantaila biratzea" "Telefonoa biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" - - - - - - + "Ikonoen bereizgarriak" + "Aktibatuta aplikazio guztietan" + "Desaktibatuta aplikazio guztietan" "Gehitu ikonoa hasierako pantailan" "Aplikazio berrietan" - - + "Erabili sistemaren balio lehenetsiak" "Ezezaguna" @@ -124,4 +121,10 @@ "Aldatu da widgetaren tamaina. Zabalera: %1$s. Altuera: %2$s." "Lasterbideak" "%2$s aplikazioaren %1$d lasterbide" + + + + + + diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 8a9c5faac2..059a484bd5 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -70,24 +70,21 @@ "پوشه: %1$s" "ابزارک‌ها" "کاغذدیواری‌ها" - "تنظیمات" + + "توسط سرپرست سیستم غیرفعال شده است" "نمای کلی" "امکان دادن به چرخش صفحه اصلی" "وقتی تلفن چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" - - - - - - + "برچسب‌گذاری نماد" + "برای همه برنامه‌ها روشن‌ است" + "برای همه برنامه‌ها خاموش است" "افزودن نماد به صفحه اصلی" "برای برنامه‌های جدید" - - + "استفاده از پیش‌فرض سیستم" "نامشخص" @@ -124,4 +121,10 @@ "اندازه ابزارک به عرض %1$s ارتفاع %2$s تغییر کرد" "میان‌برها" "%1$d میانبر برای %2$s" + + + + + + diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 7ac250306b..6223f63b30 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -70,18 +70,16 @@ "Kansio: %1$s" "Widgetit" "Taustakuvat" - "Asetukset" + + "Järjestelmänvalvoja on poistanut toiminnon käytöstä." "Yleiskatsaus" "Salli aloitusnäytön kiertäminen" "Kun puhelinta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." - - - - - - + "Kuvakemerkit" + "Käytössä kaikissa sovelluksissa" + "Pois käytöstä kaikissa sovelluksissa" "Lisää kuvake aloitusruutuun" "Uusille sovelluksille" @@ -123,4 +121,10 @@ "Widgetin kokoa muutettiin. Sen leveys on nyt %1$s ja korkeus %2$s." "Pikakuvakkeet" "Sovelluksella %2$s on %1$d pikakuvaketta." + + + + + + diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 24e4fc0be4..1b2d6107af 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -70,24 +70,21 @@ "Dossier : %1$s" "Widgets" "Fonds d\'écran" - "Paramètres" + + "Cette fonction est désactivée par votre administrateur" "Présentation" "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le mode d\'affichage actuel ne permet pas le pivotement" - - - - - - + "Insignes d\'icône" + "Activé pour toutes les applications" + "Désactivé pour toutes les applications" "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" - - + "Utiliser les valeurs système par défaut" "Inconnu" @@ -124,4 +121,10 @@ "Le widget a été redimensionné (largeur : %1$s, hauteur : %2$s)" "Raccourcis" "%1$d raccourcis pour %2$s" + + + + + + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index ad3110bf45..9823764de8 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -70,24 +70,21 @@ "Dossier \"%1$s\"" "Widgets" "Fonds d\'écran" - "Paramètres" + + "Désactivé par votre administrateur" "Vue d\'ensemble" "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." - - - - - - + "Identification des icônes" + "Activée pour toutes les applications" + "Désactivée pour toutes les applications" "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" - - + "Utiliser la valeur système par défaut" "Inconnu" @@ -124,4 +121,10 @@ "Le widget a bien été redimensionné (largeur : %1$s, hauteur : %2$s)." "Raccourcis" "%1$d raccourcis pour %2$s" + + + + + + diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 5f79c808b6..e1c7e2a9f5 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -70,24 +70,21 @@ "Cartafol: %1$s" "Widgets" "Fondos de pantalla" - "Configuración" + + "Función desactivada polo administrador" "Visión xeral" "Permitir xirar a pantalla de inicio" "Ao xirar o teléfono" "A configuración de visualización actual non permite xirar a pantalla" - - - - - - + "Insignias de iconas" + "Activado para todas as aplicacións" + "Desactivado para todas as aplicacións" "Engadir icona á pantalla de inicio" "Para novas aplicacións" - - + "Usar valores predeterminados do sistema" "Descoñecido" @@ -124,4 +121,10 @@ "Cambiouse o tamaño do widget polo ancho %1$s e a altura %2$s" "Atallos" "%1$d atallos para %2$s" + + + + + + diff --git a/res/values-gu/config.xml b/res/values-gu/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-gu/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index 4bbebb713c..1dfbfd0564 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -70,23 +70,20 @@ "ફોલ્ડર: %1$s" "વિજેટ્સ" "વૉલપેપર્સ" - "સેટિંગ્સ" + + "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" "વિહંગાવલોકન" "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" - - - - - - + "આઇકનને બૅજ કરવું" + "બધી ઍપ્લિકેશનો માટે ચાલુ છે" + "બધી ઍપ્લિકેશનો માટે બંધ છે" "હોમ સ્ક્રીન પર આઇકન ઉમેરો" "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" - - + "સિસ્ટમ ડિફૉલ્ટનો ઉપયોગ કરો" "આઇકનના આકારમાં કરેલ ફેરફારો લાગુ કરી રહ્યા છીએ" "અજાણ્યો" "દૂર કરો" @@ -122,4 +119,10 @@ "વિજેટનો આકાર બદલીને %1$s પહોળાઈ %2$s ઊંચાઈ કર્યો" "શૉર્ટકટ્સ" "%2$s માટે %1$d શૉર્ટકટ" + + + + + + diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 25a204bb6f..975a650b26 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -70,18 +70,16 @@ "फ़ोल्डर: %1$s" "शॉर्टकट" "वॉलपेपर" - "सेटिंग" + + "आपके व्यवस्थापक द्वारा अक्षम" "अवलोकन" "होमस्क्रीन घुमाने की अनुमति दें" "फ़ोन घुुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" - - - - - - + "आइकन बैजिंग" + "सभी ऐप्लिकेशन के लिए चालू है" + "सभी ऐप्लिकेशन के लिए बंद है" "होम स्क्रीन में आइकन जोड़ें" "नए ऐप्लिकेशन के लिए" @@ -123,4 +121,10 @@ "विजेट का आकार बदलकर उसकी चौड़ाई %1$s और ऊंचाई %2$s कर दी गई" "शॉर्टकट" "%2$s के लिए %1$d शॉर्टकट" + + + + + + diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 8f288cf547..f53cf5cfb7 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -70,24 +70,21 @@ "Mapa: %1$s" "Widgeti" "Pozadine" - "Postavke" + + "Onemogućio administrator" "Pregled" "Dopusti zakretanje početnog zaslona" "Kada se telefon zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" - - - - - - + "Dodavanje oznake na ikonu" + "Uključeno za sve aplikacije" + "Isključeno za sve aplikacije" "Dodaj ikonu na početni zaslon" "Za nove aplikacije" - - + "Upotrijebi zadane postavke sustava" "Nepoznato" @@ -124,4 +121,10 @@ "Širina widgeta promijenjena je na %1$s, a visina na %2$s" "Prečaci" "Prečaca za aplikaciju %2$s: %1$d" + + + + + + diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 3fb2c55c04..461730229a 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -70,18 +70,16 @@ "Mappa: %1$s" "Modulok" "Háttérképek" - "Beállítások" + + "A rendszergazda letiltotta" "Áttekintés" "A kezdőképernyő elforgatásának engedélyezése" "A telefon elforgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" - - - - - - + "Ikonjelvények" + "Bekapcsolva az összes alkalmazásnál" + "Kikapcsolva az összes alkalmazásnál" "Ikon hozzáadása a kezdőképernyőhöz" "Új alkalmazásoknál" @@ -123,4 +121,10 @@ "Modul átméretezve %1$s szélességre és %2$s magasságra" "Gyorsparancsok" "%1$d gyorsparancs a(z) %2$s számára" + + + + + + diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 7b917f7e9b..c946290a19 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -70,24 +70,21 @@ "Պանակ՝ %1$s" "Վիջեթներ" "Պաստառներ" - "Կարգավորումներ" + + "Անջատվել է ձեր ադմինիստրատորի կողմից" "Համատեսք" "Թույլ տալ հիմնական էկրանի պտտումը" "Հեռախոսը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" - - - - - - + "Պատկերակի նշանակ" + "Միացված է բոլոր հավելվածների համար" + "Անջատված է բոլոր հավելվածների համար" "Ավելացնել պատկերակը Հիմնական էկրանին" "Նոր հավելվածների համար" - - + "Օգտագործել համակարգի կանխադրված կարգավորումը" "Անհայտ է" @@ -124,4 +121,10 @@ "Վիջեթի լայնությունը փոխվել է %1$s-ի, իսկ բարձրությունը՝ %2$s-ի" "Դյուրանցումներ" "%1$d դյուրանցումներ %2$s հավելվածի համար" + + + + + + diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index ae1561b0c3..31d3db172e 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -70,18 +70,16 @@ "Folder: %1$s" "Widget" "Wallpaper" - "Setelan" + + "Dinonaktifkan oleh admin" "Ringkasan" "Izinkan layar Utama diputar" "Saat ponsel diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" - - - - - - + "Badge ikon" + "Aktif untuk semua aplikasi" + "Nonaktif untuk semua aplikasi" "Tambahkan ikon ke layar Utama" "Untuk aplikasi baru" @@ -123,4 +121,10 @@ "Widget diubah ukurannya menjadi lebar %1$s tinggi %2$s" "Pintasan" "%1$d pintasan untuk %2$s" + + + + + + diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 6a4dd03923..beb45df0bd 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -70,18 +70,16 @@ "Mappa: %1$s" "Græjur" "Veggfóður" - "Stillingar" + + "Gert óvirkt af kerfisstjóra" "Yfirlit" "Leyfa snúning fyrir heimaskjá" "Þegar símanum er snúið" "Núverandi skjástilling leyfir ekki snúning" - - - - - - + "Merking á skjöldum" + "Virkt fyrir öll forrit" + "Slökkt fyrir öll forrit" "Bæta tákni á heimaskjáinn" "Fyrir ný forrit" @@ -123,4 +121,10 @@ "Stærð græju breytt í %1$s á breidd og %2$s á hæð" "Flýtileiðir" "%1$d flýtileiðir fyrir %2$s" + + + + + + diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index bbd99e891c..b3fef36892 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -70,18 +70,16 @@ "Cartella: %1$s" "Widget" "Sfondi" - "Impostazioni" + + "Disattivata dall\'amministratore" "Panoramica" "Consenti rotazione della schermata Home" "Con il telefono ruotato" "L\'impostazione corrente del display non consente la rotazione" - - - - - - + "Badge per le icone" + "Impostazione attiva per tutte le app" + "Impostazione non attiva per tutte le app" "Aggiungi icone alla schermata Home" "Per le nuove app" @@ -123,4 +121,10 @@ "Widget ridimensionato a larghezza %1$s, altezza %2$s" "Scorciatoie" "%1$d scorciatoie per %2$s" + + + + + + diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index ccd6f0d866..cbc1ac3f8a 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -70,24 +70,21 @@ "תיקיה: %1$s" "רכיבי ווידג\'ט" "טפטים" - "הגדרות" + + "הושבת על ידי מנהל המערכת שלך" "סקירה" "אפשרות סיבוב של מסך דף הבית" "כאשר הטלפון מסובב" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" - - - - - - + "הצגת תגים על גבי סמלים" + "מופעלת לכל האפליקציות" + "כבויה לכל האפליקציות" "הוספת סמל במסך דף הבית" "לאפליקציות חדשות" - - + "השתמש בברירת המחדל של המערכת" "לא ידוע" @@ -124,4 +121,10 @@ "גודל הווידג\'ט שונה - רוחב %1$s גובה %2$s" "קיצורי דרך" "%1$d קיצורי דרך עבור %2$s" + + + + + + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 77c6b26f1f..a0d36ca54d 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -70,24 +70,21 @@ "フォルダ: %1$s" "ウィジェット" "壁紙" - "設定" + + "管理者により無効にされています" "概要" "ホーム画面の回転を許可" "スマートフォンが回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" - - - - - - + "アイコンバッジ" + "すべてのアプリで ON" + "すべてのアプリで OFF" "ホーム画面にアイコンを追加" "新しいアプリをダウンロードしたときに" - - + "システムのデフォルトを使用" "不明" @@ -124,4 +121,10 @@ "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" "ショートカット" "%2$s用の %1$d 件のショートカット" + + + + + + diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 9db1b03add..c9048e4fc6 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -70,18 +70,16 @@ "საქაღალდე: %1$s" "ვიჯეტები" "ფონები" - "პარამეტრები" + + "გათიშულია თქვენი ადმინისტრატორის მიერ" "მიმოხილვა" "მთავარი ეკრანის შეტრიალების დაშვება" "ტელეფონის შეტრიალებისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" - - - - - - + "ხატულას ბეჯები" + "ჩართულია ყველა აპისთვის" + "გამორთულია ყველა აპისთვის" "ხატულას მთავარ ეკრანზე დამატება" "ახალი აპებისთვის" @@ -123,4 +121,10 @@ "ვიჯეტის ზომები შეიცვალა: სიგანე %1$s სიმაღლე %2$s" "მალსახმობები" "%2$s-ს აქვს %1$d მალსახმობი" + + + + + + diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 5df229351b..9a75c36f32 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -70,18 +70,16 @@ "Қалта: %1$s" "Виджеттер" "Тұсқағаздар" - "Параметрлер" + + "Әкімші өшірді" "Шолу" "Негізгі экранның бұрылуына рұқсат ету" "Телефон бұрылғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" - - - - - - + "Белгілеу" + "Барлық қолданбалар үшін қосулы" + "Барлық қолданбалар үшін өшірулі" "Негізгі экранға белгіше енгізу" "Жаңа қолданбаларға арналған" @@ -123,4 +121,10 @@ "Виджет өлшемінің ені %1$s, биіктігі %2$s болып өзгертілді" "Таңбашалар" "%2$s қолданбасына арналған %1$d таңбаша" + + + + + + diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 8e1841e623..4f0c0ee59e 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -70,24 +70,21 @@ "ថត៖ %1$s" "ធាតុ​ក្រាហ្វិក" "ផ្ទាំង​រូបភាព" - "ការកំណត់" + + "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" "សង្ខេប" "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" - - - - - - + "ការដាក់ស្លាក​សញ្ញារូបតំណាង" + "បើក​សម្រាប់​កម្មវិធីទាំងអស់" + "បិទសម្រាប់កម្មវិធីទាំងអស់" "បញ្ចូល​រូបតំណាង​ទៅ​អេក្រង់​ដើម" "សម្រាប់កម្មវិធីថ្មី" - - + "ប្រើលំនាំដើមរបស់ប្រព័ន្ធ" "មិន​ស្គាល់" @@ -124,4 +121,10 @@ "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %1$s កម្ពស់ប្រវែង %2$s" "ផ្លូវកាត់" "%1$d ផ្លូវកាត់សម្រាប់ %2$s" + + + + + + diff --git a/res/values-kn/config.xml b/res/values-kn/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-kn/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 7ef8fb1b11..626fbcdafe 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -70,23 +70,20 @@ "ಫೋಲ್ಡರ್: %1$s" "ವಿಜೆಟ್‌ಗಳು" "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" - "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" + + "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" "ಅವಲೋಕನ" "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" - - - - - - + "ಐಕಾನ್ ಬ್ಯಾಡ್ಜ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ" + "ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಆನ್ ಮಾಡಲಾಗಿದೆ" + "ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಆಫ್ ಆಗಿದೆ" "ಮುಖಪುಟದ ಪರದೆಗೆ ಐಕಾನ್ ಸೇರಿಸಿ" "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" - - + "ಸಿಸ್ಟಂ ಡಿಫಾಲ್ಟ್ ಬಳಸಿ" "ಐಕಾನ್ ಆಕಾರ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತಿದೆ" "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" @@ -122,4 +119,10 @@ "ವಿಜೆಟ್ ಅನ್ನು %1$s ಅಗಲ %2$s ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ" "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" "%2$s ಗೆ %1$d ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" + + + + + + diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 66bd05db83..1a2dc7e181 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -70,24 +70,21 @@ "폴더: %1$s" "위젯" "배경화면" - "설정" + + "관리자가 사용 중지함" "개요" "홈 화면 회전 허용" "휴대전화 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." - - - - - - + "아이콘 배지" + "모든 앱에서 사용 설정됨" + "모든 앱에서 사용 중지됨" "홈 화면에 아이콘 추가" "새로 설치한 앱에 적용" - - + "시스템 기본값 사용" "알 수 없음" @@ -124,4 +121,10 @@ "폭 %1$s, 높이 %2$s로 위젯 크기 조정됨" "바로가기" "%2$s에 사용 가능한 단축키 %1$d개" + + + + + + diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index 7ea2df5cb7..ac51c6f8d8 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -70,18 +70,16 @@ "Фолдер: %1$s" "Виджеттер" "Тушкагаздар" - "Жөндөөлөр" + + "Администраторуңуз өчүрүп койгон" "Көз жүгүртүү" "Башкы экранды айлантууга уруксат берүү" "Телефон айланганда" "Экранды айлантуу параметри өчүрүлгөн" - - - - - - + "Бейджик тагуу сүрөтчөсү" + "Бардык колдонмолор үчүн күйүк" + "Бардык колдонмолор үчүн өчүк" "Башкы экранга сүрөтчө кошуу" "Жаңы колдонмолор үчүн" @@ -123,4 +121,10 @@ "Виджеттин кеңдиги %1$s бийиктиги %2$s болду" "Кыска жолдор" "%2$s колдонмосуна %1$d кыска жол бар" + + + + + + diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 3e78b0b052..98928fffd2 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -70,18 +70,16 @@ "ໂຟນເດີ: %1$s" "ວິດເຈັດ" "ພາບພື້ນຫຼັງ" - "ການຕັ້ງຄ່າ" + + "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" "ພາບຮວມ" "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນໂທລະສັບ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" - - - - - - + "ປ້າຍໄອຄອນ" + "ເປີດສຳລັບທຸກແອັບ" + "ປິດສຳລັບທຸກແອັບ" "ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ" "ສຳລັບແອັບໃໝ່" @@ -123,4 +121,10 @@ "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %1$s ລວງ​ສູງ %2$s ແລ້ວ" "ທາງລັດ" "%1$d ທາງລັດສຳລັບ %2$s" + + + + + + diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index dd23f7aef1..faf16bbd87 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -70,24 +70,21 @@ "Aplankas: „%1$s“" "Valdikliai" "Ekrano fonai" - "Nustatymai" + + "Išjungė administratorius" "Apžvalga" "Leisti pasukti pagrindinį ekraną" "Kai telefonas pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" - - - - - - + "Piktogramos ženklelių informacija" + "Įjungta visoms programoms" + "Išjungta visoms programoms" "Pridėti piktogr. prie pagrindinio ekrano" "Skirta naujoms programoms" - - + "Naudoti numatytuosius sistemos nustatymus" "Nežinoma" @@ -124,4 +121,10 @@ "Valdiklio dydis pakeistas: plotis – %1$s, aukštis – %2$s" "Spartieji klavišai" "Programos „%2$s“ spartieji klavišai (%1$d)" + + + + + + diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 0a1fe92373..6228387796 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -70,24 +70,21 @@ "Mape: %1$s" "Logrīki" "Fona tapetes" - "Iestatījumi" + + "Atspējojis administrators" "Kopsavilkums" "Atļaut sākuma ekrāna pagriešanu" "Pagriežot tālruni" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." - - - - - - + "Ikonu emblēmas" + "Ieslēgts visām lietotnēm" + "Izslēgts visām lietotnēm" "Pievienot ikonu sākuma ekrānā" "Jaunām lietotnēm" - - + "Izmantot sistēmas noklusējumu" "Nezināma" @@ -124,4 +121,10 @@ "Logrīka lielums mainīts — platums: %1$s, augstums: %2$s." "Saīsnes" "%1$d saīsnes lietotnei %2$s" + + + + + + diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index ccec8c69a7..73f8cfa7b8 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -70,18 +70,16 @@ "Папка: %1$s" "Додатоци" "Позадини" - "Поставки" + + "Оневозможено од администраторот" "Краток преглед" "Дозволете ротација на Почетниот екран" "Кога телефонот се ротира" "Тековната поставка на Екранот не дозволува ротација" - - - - - - + "Ставање значки на икони" + "Вклучено за сите апликации" + "Исклучено за сите апликации" "Додајте икона на почетниот екран" "За нови апликации" @@ -123,4 +121,10 @@ "Големината на виџетот е променета на ширина %1$s висина %2$s" "Кратенки" "%1$d кратенки за %2$s" + + + + + + diff --git a/res/values-ml/config.xml b/res/values-ml/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-ml/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index fc4da03c4b..de90aca5a9 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -70,23 +70,20 @@ "ഫോൾഡർ: %1$s" "വിജറ്റുകൾ" "വാൾപേപ്പർ" - "ക്രമീകരണം" + + "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" "കാഴ്ച" "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" - - - - - - + "ഐക്കൺ ബാഡ്‌ജിംഗ്" + "എല്ലാ ആപ്പുകൾക്കും ഓണാണ്" + "എല്ലാ ആപ്പുകൾക്കും ഓഫാണ്" "ഹോം സ്ക്രീനിലേക്ക് ഐക്കൺ ചേർക്കുക" "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" - - + "സിസ്‌റ്റം ഡിഫോൾട്ട് ഉപയോഗിക്കുക" "ഐക്കൺ ആകാര മാറ്റങ്ങൾ പ്രയോഗിക്കുന്നു" "അജ്ഞാതം" "നീക്കംചെയ്യുക" @@ -122,4 +119,10 @@ "വീതി %1$s ഉയരം %2$s-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി" "കുറുക്കുവഴികൾ" "%2$s ആപ്പിനുള്ള %1$d കുറുക്കുവഴികൾ" + + + + + + diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 99bd09385c..09cef82901 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -70,24 +70,21 @@ "Фолдер: %1$s" "Виджет" "Ханын зураг" - "Тохиргоо" + + "Таны админ идэвхгүй болгосон" "Тойм" "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Утсыг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" - - - - - - + "Дүрс тэмдэг" + "Бүх аппад асаасан" + "Бүх аппад унтраасан" "Нүүр хуудаст дүрс тэмдэг нэмэх" "Шинэ аппад зориулсан" - - + "Системийн өгөгдмөл тохиргоог ашиглах" "Тодорхойгүй" @@ -124,4 +121,10 @@ "Виджэтийн өргөн %1$s, өндөр %2$s болсон" "Товчлол" "%2$s%1$d товчлол" + + + + + + diff --git a/res/values-mr/config.xml b/res/values-mr/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-mr/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 77ae9d3d8b..9a479389b9 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -70,23 +70,20 @@ "फोल्डर: %1$s" "विजेट" "वॉलपेपर" - "सेटिंग्ज" + + "आपल्या प्रशासकाने अक्षम केले" "विहंगावलोकन" "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "फोन फिरविला जातो तेव्हा" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" - - - - - - + "चिन्ह बॅज करणे" + "सर्व अॅपसाठी चालू आहे" + "सर्व अॅपसाठी बंद आहे" "मुख्य स्क्रीनवर चिन्ह जोडा" "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" - - + "सिस्‍टमचे डीफॉल्‍ट वापरा" "चिन्हाचा आकार बदल लागू करत आहे" "अज्ञात" "काढा" @@ -122,4 +119,10 @@ "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" "शॉर्टकट" "%2$s साठी %1$d शॉर्टकट" + + + + + + diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index d45af42370..be95e32b64 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -70,24 +70,21 @@ "Folder: %1$s" "Widget" "Kertas dinding" - "Tetapan" + + "Dilumpuhkan oleh pentadbir anda" "Ikhtisar" "Benarkan putaran Skrin Utama" "Apabila telefon diputar" "Tetapan Paparan semasa tidak membenarkan putaran" - - - - - - + "Pelencanaan ikon" + "Dihidupkan untuk semua apl" + "Dimatikan untuk semua apl" "Tambahkan ikon pada Skrin Utama" "Untuk apl baharu" - - + "Gunakan lalai sistem" "Tidak diketahui" @@ -124,4 +121,10 @@ "Saiz widget diubah menjadi %1$s lebar %2$s tinggi" "Pintasan" "%1$d pintasan untuk %2$s" + + + + + + diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index b5e76743f5..bcb7207f9f 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -70,18 +70,16 @@ "အကန့်အမည်: %1$s" "ဝိဂျက်များ" "နောက်ခံများ" - "ဆက်တင်များ" + + "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" "ခြုံငုံသုံးသပ်ချက်" "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" "ဖုန်းကိုလှည့်ထားစဉ်" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" - - - - - - + "သင်္ကေတ တံဆိပ်" + "အက်ပ်များအားလုံးအတွက် ဖွင့်ထားသည်" + "အက်ပ်များအားလုံးအတွက် ပိတ်ထားသည်" "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" "အက်ပ်အသစ်များအတွက်" @@ -123,4 +121,10 @@ "Widget အား အကျယ် %1$s အမြင့် %2$s အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏" "ဖြတ်လမ်းများ" "%2$s အတွက် အမြန်နည်း %1$d ခု" + + + + + + diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 072cd27123..4bcee516ff 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -70,24 +70,21 @@ "Mappe: %1$s" "Moduler" "Bakgrunner" - "Innstillinger" + + "Administratoren har slått av funksjonen" "Oversikt" "Tillat rotasjon av startskjermen" "Når telefonen roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" - - - - - - + "Ikonmerking" + "På for alle apper" + "Av for alle apper" "Legg til ikon på startsiden" "For nye apper" - - + "Bruk systemstandard" "Ukjent" @@ -124,4 +121,10 @@ "Størrelsen på modulen er endret til bredde %1$s og høyde %2$s" "Snarveier" "%1$d snarveier for %2$s" + + + + + + diff --git a/res/values-ne/config.xml b/res/values-ne/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-ne/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 37ebc24209..4d1658fb4c 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -70,23 +70,20 @@ "फोल्डर: %1$s" "विजेटहरू" "वालपेपरहरु" - "सेटिंङहरू" + + "तपाईँको प्रशासकद्वारा असक्षम गरिएको" "परिदृश्य" "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "फोनलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" - - - - - - + "आइकनलाई पदक दिने कार्य" + "सबै अनुप्रयोगहरूमा सक्रिय छ" + "सबै अनुप्रयोगहरूमा निष्क्रिय छ" "गृह स्क्रिनमा आइकन थप्नुहोस्" "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" - - + "प्रणालीको पूर्वनिर्धारित सेटिङ प्रयोग गर्नुहोस्" "आइकनको आकारमा गरिएका परिवर्तनहरू लागू गरिँदैछन्" "अज्ञात" "हटाउनुहोस्" @@ -122,4 +119,10 @@ "विजेट चौडाइ %1$s उचाइ %2$s मा पुनः आकार मिलाइयो" "सर्टकटहरू" "%2$s का %1$d सर्टकटहरू" + + + + + + diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 4f2ba93be0..2653a22ee3 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -70,18 +70,16 @@ "Map: %1$s" "Widgets" "Achtergrond" - "Instellingen" + + "Uitgeschakeld door je beheerder" "Overzicht" "Draaien van startscherm toestaan" "Wanneer de telefoon gedraaid is" "Huidige scherminstelling staat draaien niet toe" - - - - - - + "Pictogrambadges" + "Ingeschakeld voor alle apps" + "Uitgeschakeld voor alle apps" "Pictogram toevoegen aan startscherm" "Voor nieuwe apps" @@ -123,4 +121,10 @@ "Formaat van widget gewijzigd in breedte %1$s en hoogte %2$s" "Snelkoppelingen" "%1$d snelkoppelingen voor %2$s" + + + + + + diff --git a/res/values-pa/config.xml b/res/values-pa/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-pa/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 4998b9243c..5e3b64b05a 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -70,23 +70,20 @@ "ਫੋਲਡਰ: %1$s" "ਵਿਜਿਟ" "ਵਾਲਪੇਪਰ" - "ਸੈਟਿੰਗਾਂ" + + "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" "ਰੂਪ-ਰੇਖਾ" "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" - - - - - - + "ਪ੍ਰਤੀਕ ਨੂੰ ਬੈਜ ਕਰਨਾ" + "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਚਾਲੂ ਹੈ" + "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਬੰਦ ਹੈ" "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" - - + "ਸਿਸਟਮ ਦੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" @@ -122,4 +119,10 @@ "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %1$s ਉਂਚਾਈ %2$s ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ" "ਸ਼ਾਰਟਕੱਟ" "%2$s ਲਈ %1$d ਸ਼ਾਰਟਕੱਟ" + + + + + + diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 0c3a24aea2..09f0fcafcf 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -70,24 +70,21 @@ "Folder: %1$s" "Widżety" "Tapety" - "Ustawienia" + + "Funkcja wyłączona przez administratora" "Przegląd" "Zezwalaj na obrót ekranu głównego" "Po obróceniu telefonu" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" - - - - - - + "Plakietki na ikonach" + "Włączone dla wszystkich aplikacji" + "Wyłączone dla wszystkich aplikacji" "Dodaj ikonę do ekranu głównego" "W przypadku nowych aplikacji" - - + "Użyj ustawienia domyślnego" "Brak informacji" @@ -124,4 +121,10 @@ "Szerokość i wysokość widżetu zmieniła się na %1$s x %2$s" "Skróty" "Skróty aplikacji %2$s: %1$d" + + + + + + diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index d06cea653b..bf9d0e8162 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -70,18 +70,16 @@ "Pasta: %1$s" "Widgets" "Imagens de fundo" - "Definições" + + "Desativada pelo administrador" "Vista geral" "Permitir rotação do ecrã principal" "Quando o telemóvel é rodado" "A definição de visualização atual não permite a rotação" - - - - - - + "Emblemas dos ícones" + "Ativada para todas as aplicações" + "Desativada para todas as aplicações" "Adicionar ícone ao ecrã principal" "Para novas aplicações" @@ -123,4 +121,10 @@ "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" "%1$d atalhos para a aplicação %2$s" + + + + + + diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index bdc2e83e6c..dfa88c6626 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -70,24 +70,21 @@ "Pasta: %1$s" "Widgets" "Planos de fundo" - "Configurações" + + "Desativado pelo administrador" "Visão geral" "Permitir rotação da tela inicial" "Quando o smartphone for girado" "A configuração atual de exibição não permite rotação" - - - - - - + "Uso de selo de ícone" + "Ativado para todos os apps" + "Desativado para todos os apps" "Adicionar ícone à tela inicial" "Para novos apps" - - + "Usar padrão do sistema" "Desconhecido" @@ -124,4 +121,10 @@ "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" "%1$d atalhos para %2$s" + + + + + + diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index e2409f9c9c..21795062ea 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -70,24 +70,21 @@ "Dosar: %1$s" "Widgeturi" "Imagini de fundal" - "Setări" + + "Dezactivată de administrator" "Prezentare generală" "Permiteți rotirea ecranului de pornire" "Când telefonul este rotit" "Setarea actuală a afișajului nu permite rotirea" - - - - - - + "Aplicarea insignelor pentru pictograme" + "Activată pentru toate aplicațiile" + "Dezactivată pentru toate aplicațiile" "Adaugă pictograme în ecranul de pornire" "Pentru aplicații noi" - - + "Folosiți setarea prestabilită a sistemului" "Necunoscut" @@ -124,4 +121,10 @@ "Widgetul a fost redimensionat la lățimea %1$s și înălțimea %2$s" "Comenzi rapide" "%1$d comenzi rapide pentru %2$s" + + + + + + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 0fb44c1c88..faae2b4c0c 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -70,24 +70,21 @@ "Папка: %1$s" "Виджеты" "Обои" - "Настройки" + + "Функция отключена администратором" "Обзор" "Разрешить поворачивать главный экран" "Когда телефон повернут" "В настройках отключен поворот экрана" - - - - - - + "Уведомления на значке приложения" + "Включено для всех приложений" + "Отключено для всех приложений" "Добавлять значки" "Добавлять значки установленных приложений на главный экран." - - + "Использовать системные настройки по умолчанию" "Неизвестно" @@ -124,4 +121,10 @@ "Изменен размер виджета: до %1$s в ширину и %2$s в высоту" "Ярлыки" "Количество ярлыков для приложения \"%2$s\": %1$d" + + + + + + diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 1c74f7c6c6..9f6cf5bb73 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -70,24 +70,21 @@ "ෆෝල්ඩරය: %1$s" "විජට්" "වෝල්පේපර" - "සැකසීම්" + + "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" "දළ විශ්ලේෂණය" "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "දුරකථනය කරකවන විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" - - - - - - + "නිරූපක ලාංඡනය" + "සියලු යෙදුම් සඳහා ක්‍රියාත්මකයි" + "සියලු යෙදුම් සඳහා ක්‍රියාවිරහිතයි" "මුල් පිටු තිරය වෙත අයිකනය එක් කරන්න" "නව යෙදුම් සඳහා" - - + "පද්ධති පෙරනිමි භාවිත කරන්න" "නොදනී" @@ -124,4 +121,10 @@ "විජට් පළල %1$s උස %2$s වෙත ප්‍රමාණකරණය කරන ලදි" "කෙටිමං" "%2$s සඳහා කෙටි මං %1$d" + + + + + + diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 1b66f0cda4..e920fab1d6 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -70,24 +70,21 @@ "Priečinok: %1$s" "Miniaplikácie" "Tapety" - "Nastavenia" + + "Zakázané vaším správcom" "Prehľad" "Povoliť otáčanie plochy" "Pri otočení telefónu" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" - - - - - - + "Označovanie ikon" + "Zapnuté pre všetky aplikácie" + "Vypnuté pre všetky aplikácie" "Pridať ikonu na plochu" "Pri inštalácii novej aplikácie" - - + "Použiť predvolené nastavenie systému" "Neznáme" @@ -124,4 +121,10 @@ "Veľkosť miniaplikácie bola zmenená na %1$s x %2$s (šírka x výška)" "Skratky" "Počet skratiek aplikácie %2$s: %1$d" + + + + + + diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 6717b31995..fb5df08ced 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -70,24 +70,21 @@ "Mapa: %1$s" "Pripomočki" "Ozadja" - "Nastavitve" + + "Onemogočil skrbnik." "Pregled" "Omogočanje sukanja začetnega zaslona" "Ko se telefon zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" - - - - - - + "Označevanje z ikonami" + "Vklopljeno za vse aplikacije" + "Izklopljeno za vse aplikacije" "Dodaj ikono na začetni zaslon" "Za nove aplikacije" - - + "Uporabi privzeto nastavitev sistema" "Neznano" @@ -124,4 +121,10 @@ "Velikost pripomočka je bila spremenjena na %1$s širine in %2$s višine" "Bližnjice" "Št. bližnjic za aplikacijo %2$s: %1$d" + + + + + + diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index dc7bff638f..039fae4327 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -70,18 +70,16 @@ "Dosja: %1$s" "Miniaplikacionet" "Imazhet e sfondit" - "Cilësimet" + + "Çaktivizuar nga administratori" "Përmbledhje" "Lejo rrotullimin e ekranit kryesor" "Kur telefoni rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" - - - - - - + "Caktimi i simbolit të ikonës" + "Aktiv për të gjitha aplikacionet" + "Joaktiv për të gjitha aplikacionet" "Shto ikonë në ekranin bazë" "Për aplikacionet e reja" @@ -123,4 +121,10 @@ "Madhësia e miniaplikacionit u ndryshua me gjerësinë %1$s dhe lartësinë %2$s" "Shkurtoret" "%1$d shkurtesa për %2$s" + + + + + + diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 49ea52234d..16ef6cc3a7 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -70,18 +70,16 @@ "Директоријум: %1$s" "Виџети" "Позадине" - "Подешавања" + + "Администратор је онемогућио" "Преглед" "Дозволи ротацију почетног екрана" "Када се телефон ротира" "Актуелно подешавање приказа не дозвољава ротацију" - - - - - - + "Додавање значки на иконе" + "Укључено за све апликације" + "Искључено за све апликације" "Додај икону на почетни екран" "За нове апликације" @@ -123,4 +121,10 @@ "Величина виџета је промењена на ширину %1$s и висину %2$s" "Пречице" "%1$d пречице(а) за %2$s" + + + + + + diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index b74abd731d..ef5b6ac4c9 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -70,18 +70,16 @@ "Mapp: %1$s" "Widgetar" "Bakgrunder" - "Inställningar" + + "Inaktiverat av administratören" "Översikt" "Tillåt rotering av startskärmen" "När mobilen vrids" "Rotering tillåts inte i de nuvarande skärminställningarna" - - - - - - + "Ikonmärken" + "Aktiverat för alla appar" + "Inaktiverat för alla appar" "Lägg till ikonen på startskärmen" "För nya appar" @@ -123,4 +121,10 @@ "Widgetens storlek har ändrats till: bredd %1$s, höjd %2$s" "Genvägar" "%1$d genvägar för %2$s" + + + + + + diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 375e843d84..73b4a8c55f 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -72,18 +72,16 @@ "Folda: %1$s" "Wijeti" "Mandhari" - "Mipangilio" + + "Imezimwa na msimamizi wako" "Muhtasari" "Ruhusu kuzungusha skrini ya Kwanza" "Simu inapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" - - - - - - + "Kuweka beji kwenye aikoni" + "Imewashwa katika programu zote" + "Imezimwa katika programu zote" "Ongeza aikoni kwenye Skrini ya kwanza" "Kwa ajili ya programu mpya" @@ -125,4 +123,10 @@ "Wijeti imepunguzwa hadi upana %1$s urefu %2$s" "Njia za mkato" "Njia %1$d za mkato za %2$s" + + + + + + diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index af052cbc52..4b94a5997a 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -70,18 +70,16 @@ "கோப்புறை: %1$s" "ஷார்ட்கட்ஸ்" "வால்பேப்பர்கள்" - "அமைப்பு" + + "உங்கள் நிர்வாகி முடக்கியுள்ளார்" "மேலோட்டப் பார்வை" "முகப்புத் திரை சுழற்சியை அனுமதி" "மொபைலைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" - - - - - - + "ஐகான் பேட்ஜிங்" + "எல்லாப் பயன்பாடுகளுக்கும் இயக்கப்பட்டது" + "எல்லாப் பயன்பாடுகளுக்கும் முடக்கப்பட்டது" "முகப்புத் திரையில் ஐகானைச் சேர்" "புதிய பயன்பாடுகளுக்கு" @@ -123,4 +121,10 @@ "அகலம் %1$s மற்றும் உயரம் %2$sக்கு விட்ஜெட் அளவு மாற்றப்பட்டது" "குறுக்குவழிகள்" "%2$sக்கான %1$d குறுக்குவழிகள்" + + + + + + diff --git a/res/values-te/config.xml b/res/values-te/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-te/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index ded39cc601..9003b8bfb1 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -70,23 +70,20 @@ "ఫోల్డర్: %1$s" "విడ్జెట్‌లు" "వాల్‌పేపర్‌లు" - "సెట్టింగ్‌లు" + + "మీ నిర్వాహకులు నిలిపివేసారు" "స్థూలదృష్టి" "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "ఫోన్‌‌ను తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" - - - - - - + "చిహ్నం బ్యాడ్జ్" + "అన్ని అనువర్తనాలలో ఆన్ చేయబడ్డాయి" + "అన్ని అనువర్తనాలలో ఆఫ్‌ చేయబడ్డాయి" "హోమ్ స్క్రీన్‌కి చిహ్నాన్ని జోడించు" "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" - - + "సిస్టమ్ డిఫాల్ట్‌ను ఉపయోగించండి" "చిహ్న ఆకార మార్పులను వర్తింపజేస్తోంది" "తెలియదు" "తీసివేయి" @@ -122,4 +119,10 @@ "విడ్జెట్ పరిమాణం వెడల్పు %1$sకి, ఎత్తు %2$sకి మార్చబడింది" "సత్వరమార్గాలు" "%2$s కోసం %1$d సత్వరమార్గాలు" + + + + + + diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 0c5f72b20d..78e193c072 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -70,24 +70,21 @@ "โฟลเดอร์: %1$s" "วิดเจ็ต" "วอลเปเปอร์" - "การตั้งค่า" + + "ปิดใช้โดยผู้ดูแลระบบ" "ภาพรวม" "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนโทรศัพท์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" - - - - - - + "การติดป้ายไอคอน" + "เปิดสำหรับแอปทั้งหมด" + "ปิดสำหรับแอปทั้งหมด" "เพิ่มไอคอนในหน้าจอหลัก" "สำหรับแอปใหม่" - - + "ใช้ค่าเริ่มต้นของระบบ" "ไม่รู้จัก" @@ -124,4 +121,10 @@ "ปรับขนาดของวิดเจ็ตเป็นกว้าง %1$s สูง %2$s แล้ว" "ทางลัด" "%1$d ทางลัดสำหรับ %2$s" + + + + + + diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index e946dfd9a4..829360c185 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -70,24 +70,21 @@ "Folder: %1$s" "Mga Widget" "Mga Wallpaper" - "Mga Setting" + + "Na-disable ng iyong admin" "Pangkalahatang-ideya" "Payagan ang pag-rotate ng Home screen" "Kailan maro-rotate ang telepono" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" - - - - - - + "Pag-badge ng icon" + "Naka-on para sa lahat ng app" + "Naka-off para sa lahat ng app" "Idagdag ang icon sa Home screen" "Para sa mga bagong app" - - + "Gamitin ang default ng system" "Hindi kilala" @@ -124,4 +121,10 @@ "Na-resize ang widget sa lapad %1$s taas %2$s" "Mga Shortcut" "%1$d (na) shortcut para sa %2$s" + + + + + + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 47d083f9a1..b41b15de99 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -70,24 +70,21 @@ "Klasör: %1$s" "Widget\'lar" "Duvar Kağıtları" - "Ayarlar" + + "Yöneticiniz tarafından devre dışı bırakıldı" "Genel bakış" "Ana ekranı döndürmeye izin ver" "Telefon döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" - - - - - - + "Simge rozeti ekleme" + "Tüm uygulamalar için açık" + "Tüm uygulamalar için kapalı" "Ana ekrana simge ekle" "Yeni uygulamalar için" - - + "Sistem varsayılanını kullan" "Bilinmiyor" @@ -124,4 +121,10 @@ "Widget, %1$s genişlik ve %2$s yükseklik değerine yeniden boyutlandırıldı" "Kısayollar" "%2$s için %1$d kısayol" + + + + + + diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 7c954daf19..aadd595294 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -70,18 +70,16 @@ "Папка %1$s" "Віджети" "Фонові малюнки" - "Налаштування" + + "Вимкнув адміністратор" "Огляд" "Дозволити обертання головного екрана" "Коли телефон обертається" "Поточні налаштування дисплея не підтримують обертання" - - - - - - + "Позначення значків" + "Увімкнено для всіх додатків" + "Вимкнено для всіх додатків" "Додати значок на головний екран" "Для нових додатків" @@ -123,4 +121,10 @@ "Розміри віджета змінено на %1$s завширшки та %2$s заввишки" "Ярлики" "Ярликів для додатка %2$s: %1$d" + + + + + + diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index c84f5c92fd..24f4dd78df 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -70,18 +70,16 @@ "فولڈر: %1$s" "ویجیٹس" "وال پیپرز" - "ترتیبات" + + "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" "مجموعی جائزہ" "ہوم اسکرین گھمانے کی اجازت دیں" "جب فون گھمایا جاتا ہے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" - - - - - - + "آئیکن کی بیج سازی" + "سبھی ایپس کیلئے آن ہے" + "تمام ایپس کے لئے بند ہے" "آئیکن کو ہوم اسکرین میں شامل کریں" "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" @@ -121,4 +119,10 @@ "ویجیٹ کے سائز کو چوڑائی %1$s اونچائی %2$s میں تبدیل کر دیا گیا" "شارٹ کٹس" "%2$s کیلئے %1$d شارٹ کٹس" + + + + + + diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 4fa0645371..506f433332 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -70,24 +70,21 @@ "Jild: %1$s" "Vidjetlar" "Fon rasmlari" - "Sozlamalar" + + "Administrator tomonidan o‘chirilgan" "Umumiy ko‘rinish" "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" - - - - - - + "Nishonchalar" + "Barcha ilovalar uchun yoniq" + "Barcha ilovalar uchun o‘chiq" "Bosh ekranga ikonka qo‘shish" "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" - - + "Standart tizim parametrlaridan foydalanish" "Noma’lum" @@ -124,4 +121,10 @@ "Vidjetning eni %1$s, bo‘yi %2$s qilib o‘zgartirildi" "Tezkor tugmalar" "%2$s ilovasi uchun %1$d ta tezkor tugma" + + + + + + diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index dea2788b95..f24a169a56 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -70,24 +70,21 @@ "Thư mục: %1$s" "Tiện ích con" "Hình nền" - "Cài đặt" + + "Bị tắt bởi quản trị viên của bạn" "Tổng quan" "Cho phép xoay Màn hình chính" "Khi xoay điện thoại" "Cài đặt Hiển thị hiện tại không cho phép xoay" - - - - - - + "Gắn huy hiệu biểu tượng" + "Bật cho tất cả ứng dụng" + "Tắt cho tất cả ứng dụng" "Thêm biểu tượng vào màn hình chính" "Cho ứng dụng mới" - - + "Sử dụng mặc định của hệ thống" "Không xác định" @@ -124,4 +121,10 @@ "Đã đổi kích thước tiện ích thành chiều rộng %1$s chiều cao %2$s" "Lối tắt" "%1$d phím tắt cho %2$s" + + + + + + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 4ddc17f818..8231d93a35 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -70,24 +70,21 @@ "文件夹:%1$s" "微件" "壁纸" - "设置" + + "已被您的管理员停用" "概览" "允许旋转主屏幕" "手机旋转时" "当前的显示设置不允许旋转设备" - - - - - - + "在图标上显示标记" + "已针对所有应用开启" + "已针对所有应用关闭" "将图标添加到主屏幕" "适用于新应用" - - + "使用系统默认设置" "未知" @@ -124,4 +121,10 @@ "微件尺寸已调整为:宽度 %1$s,高度 %2$s" "快捷方式" "%2$s%1$d 个快捷方式" + + + + + + diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 2c369850b9..c91cfd62cb 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -70,24 +70,21 @@ "資料夾:%1$s" "小工具" "桌布" - "設定" + + "已由您的管理員停用" "概覽" "允許主畫面旋轉" "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" - - - - - - + "在圖示上顯示標誌" + "為所有應用程式開啟此設定" + "為所有應用程式關閉此設定" "將圖示加到主畫面" "適用於新安裝的應用程式" - - + "使用系統預設設定" "不明" @@ -124,4 +121,10 @@ "已調整小工具的大小至闊 %1$s%2$s" "捷徑" "「%2$s」嘅 %1$d 個捷徑" + + + + + + diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index ef48e1fb03..b0cbf6c417 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -70,24 +70,21 @@ "資料夾:%1$s" "小工具" "桌布" - "設定" + + "已由你的管理員停用" "總覽" "允許旋轉主螢幕" "當手機旋轉時" "目前的顯示設定不允許旋轉畫面" - - - - - - + "在圖示上顯示標記" + "為所有應用程式開啟這項設定" + "為所有應用程式關閉這項設定" "將圖示加到主螢幕" "適用於新安裝的應用程式" - - + "使用系統預設值" "不明" @@ -124,4 +121,10 @@ "已將小工具的寬度和高度分別調整為 %1$s%2$s" "捷徑" "「%2$s」有 %1$d 個捷徑" + + + + + + diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 3330ef4eab..9226248bd1 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -70,24 +70,21 @@ "Ifolda: %1$s" "Amawijethi" "Izithombe zangemuva" - "Izilungiselelo" + + "Kukhutshazwe umlawuli wakho" "Ukubuka konke" "Vumela ukuphendukiswa kwesikrini sasekhaya" "Uma ifoni iphendukiswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" - - - - - - + "Ibheji yesithonjana" + "Kuvuliwe kuzo zonke izinhlelo zokusebenza" + "Kuvaliwe kuzo zonke izinhlelo zokusebenza" "Engeza isithonjana eskrinini sasekhaya" "Kwezinhlelo zokusebenza ezintsha" - - + "Sebenzisa okuzenzakalelayo kwesistimu" "Akwaziwa" @@ -124,4 +121,10 @@ "Iwijethi inikezwe usayizi omusha ngobubanzi obungu-%1$s ubude obungu-%2$s" "Izinqamuleli" "%1$d izinqamuleli ze-%2$s" + + + + + + From 4e11c2738a346fe2859c2d03e3133671e5da49ec Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 20 Apr 2017 12:07:38 -0700 Subject: [PATCH 096/446] Add physics motion to items in all apps. Motion applied to: - Icons - Prediction icons - Prediction divider Bug: 38349031 Change-Id: I376e6e39080c8c80463a0ce8b104b05e4d576f17 --- Android.mk | 3 +- res/layout/all_apps.xml | 1 + .../allapps/AllAppsContainerView.java | 47 +++- .../launcher3/allapps/AllAppsGridAdapter.java | 39 ++- .../allapps/AllAppsRecyclerView.java | 16 +- .../allapps/AllAppsTransitionController.java | 23 ++ .../allapps/AlphabeticalAppsList.java | 7 + .../anim/SpringAnimationHandler.java | 247 ++++++++++++++++++ .../launcher3/config/FeatureFlags.java | 2 + 9 files changed, 379 insertions(+), 6 deletions(-) create mode 100644 src/com/android/launcher3/anim/SpringAnimationHandler.java diff --git a/Android.mk b/Android.mk index 6cb40c51ae..c8a53d23d1 100644 --- a/Android.mk +++ b/Android.mk @@ -26,7 +26,8 @@ LOCAL_MODULE_TAGS := optional LOCAL_STATIC_JAVA_LIBRARIES := \ android-support-v4 \ android-support-v7-recyclerview \ - android-support-v7-palette + android-support-v7-palette \ + android-support-dynamic-animation LOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index f3539dcfa0..09b965544b 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -51,6 +51,7 @@ android:layout_height="match_parent" android:layout_gravity="center_horizontal|top" android:clipToPadding="false" + android:overScrollMode="never" android:descendantFocusability="afterDescendants" android:focusable="true" android:paddingStart="@dimen/container_fastscroll_thumb_max_width" diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index d9ee2c55af..a399d748a9 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -20,6 +20,8 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.InsetDrawable; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Selection; import android.text.SpannableStringBuilder; @@ -42,6 +44,7 @@ import com.android.launcher3.Launcher; import com.android.launcher3.PromiseAppInfo; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.anim.SpringAnimationHandler; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragOptions; @@ -63,7 +66,7 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc private final Launcher mLauncher; private final AlphabeticalAppsList mApps; private final AllAppsGridAdapter mAdapter; - private final RecyclerView.LayoutManager mLayoutManager; + private final LinearLayoutManager mLayoutManager; private AllAppsRecyclerView mAppsRecyclerView; private SearchUiManager mSearchUiManager; @@ -74,6 +77,8 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc private int mNumAppsPerRow; private int mNumPredictedAppsPerRow; + private SpringAnimationHandler mSpringAnimationHandler; + public AllAppsContainerView(Context context) { this(context, null); } @@ -87,7 +92,9 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mLauncher = Launcher.getLauncher(context); mApps = new AlphabeticalAppsList(context); - mAdapter = new AllAppsGridAdapter(mLauncher, mApps, mLauncher, this); + mSpringAnimationHandler = new SpringAnimationHandler(SpringAnimationHandler.Y_DIRECTION); + mAdapter = new AllAppsGridAdapter(mLauncher, mApps, mLauncher, this, + mSpringAnimationHandler); mApps.setAdapter(mAdapter); mLayoutManager = mAdapter.getLayoutManager(); mSearchQueryBuilder = new SpannableStringBuilder(); @@ -227,6 +234,10 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mAppsRecyclerView.setLayoutManager(mLayoutManager); mAppsRecyclerView.setAdapter(mAdapter); mAppsRecyclerView.setHasFixedSize(true); + if (FeatureFlags.LAUNCHER3_PHYSICS) { + mAppsRecyclerView.setSpringAnimationHandler(mSpringAnimationHandler); + mAppsRecyclerView.addOnScrollListener(new SpringMotionOnScrollListener()); + } mSearchContainer = findViewById(R.id.search_container); mSearchUiManager = (SearchUiManager) mSearchContainer; @@ -404,4 +415,36 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc } } } + + public SpringAnimationHandler getSpringAnimationHandler() { + return mSpringAnimationHandler; + } + + public class SpringMotionOnScrollListener extends RecyclerView.OnScrollListener { + + private int mScrollState = RecyclerView.SCROLL_STATE_IDLE; + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + if (mScrollState == RecyclerView.SCROLL_STATE_DRAGGING) { + mSpringAnimationHandler.skipToEnd(); + return; + } + + int first = mLayoutManager.findFirstVisibleItemPosition(); + int last = mLayoutManager.findLastVisibleItemPosition(); + + // We only show the spring animation when at the top or bottom, so we wait until the + // first or last row is visible to ensure that all animations run in sync. + if (first == 0 || last >= mAdapter.getItemCount() - mAdapter.getNumAppsPerRow()) { + mSpringAnimationHandler.animateToFinalPosition(0); + } + } + + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + mScrollState = newState; + } + } } diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java index cfd04e2e02..d3d23ca249 100644 --- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java +++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java @@ -19,6 +19,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Point; +import android.support.animation.SpringAnimation; import android.support.v4.view.accessibility.AccessibilityEventCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.support.v4.view.accessibility.AccessibilityRecordCompat; @@ -38,6 +39,8 @@ import com.android.launcher3.BubbleTextView; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.allapps.AlphabeticalAppsList.AdapterItem; +import com.android.launcher3.anim.SpringAnimationHandler; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.discovery.AppDiscoveryAppInfo; import com.android.launcher3.discovery.AppDiscoveryItemView; import com.android.launcher3.util.PackageManagerHelper; @@ -80,6 +83,8 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter getPredictedApps() { + return mPredictedApps; + } + /** * Returns fast scroller sections of all the current filtered applications. */ diff --git a/src/com/android/launcher3/anim/SpringAnimationHandler.java b/src/com/android/launcher3/anim/SpringAnimationHandler.java new file mode 100644 index 0000000000..5792127d07 --- /dev/null +++ b/src/com/android/launcher3/anim/SpringAnimationHandler.java @@ -0,0 +1,247 @@ +/* + * 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. + */ +package com.android.launcher3.anim; + +import android.support.animation.DynamicAnimation; +import android.support.animation.SpringAnimation; +import android.support.animation.SpringForce; +import android.support.annotation.IntDef; +import android.util.Log; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.View; + +import com.android.launcher3.Utilities; +import com.android.launcher3.allapps.AlphabeticalAppsList; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; + +/** + * Handler class that manages springs for a set of views that should all move based on the same + * {@link MotionEvent}s. + * + * Supports using physics for X or Y translations. + */ +public class SpringAnimationHandler { + + private static final String TAG = "SpringAnimationHandler"; + private static final boolean DEBUG = false; + + private static final float DEFAULT_MAX_VALUE = 100; + private static final float DEFAULT_MIN_VALUE = -DEFAULT_MAX_VALUE; + + private static final float SPRING_DAMPING_RATIO = 0.55f; + private static final float MIN_SPRING_STIFFNESS = 580f; + private static final float MAX_SPRING_STIFFNESS = 900f; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({Y_DIRECTION, X_DIRECTION}) + public @interface Direction {} + public static final int Y_DIRECTION = 0; + public static final int X_DIRECTION = 1; + private int mDirection; + + private VelocityTracker mVelocityTracker; + private float mCurrentVelocity = 0; + private boolean mShouldComputeVelocity = false; + + private ArrayList mAnimations = new ArrayList<>(); + + public SpringAnimationHandler(@Direction int direction) { + mDirection = direction; + mVelocityTracker = VelocityTracker.obtain(); + } + + public SpringAnimation add(View view, int position, AlphabeticalAppsList apps, int appsPerRow, + SpringAnimation recycle) { + int numPredictedApps = Math.min(appsPerRow, apps.getPredictedApps().size()); + int appPosition = getAppPosition(position, numPredictedApps, appsPerRow); + + int col = appPosition % appsPerRow; + int row = appPosition / appsPerRow; + + int numTotalRows = apps.getNumAppRows() - 1; // zero offset + if (row > (numTotalRows / 2)) { + // Mirror the rows so that the top row acts the same as the bottom row. + row = Math.abs(numTotalRows - row); + } + + // We manipulate the stiffness, min, and max values based on the items distance to the first + // row and the items distance to the center column to create the ^-shaped motion effect. + float rowFactor = (1 + row) * 0.5f; + float colFactor = getColumnFactor(col, appsPerRow); + + float minValue = DEFAULT_MIN_VALUE * (rowFactor + colFactor); + float maxValue = DEFAULT_MAX_VALUE * (rowFactor + colFactor); + + float stiffness = Utilities.boundToRange(MAX_SPRING_STIFFNESS - (row * 50f), + MIN_SPRING_STIFFNESS, MAX_SPRING_STIFFNESS); + + SpringAnimation animation = (recycle != null ? recycle : createSpringAnimation(view)) + .setStartVelocity(mCurrentVelocity) + .setMinValue(minValue) + .setMaxValue(maxValue); + animation.getSpring().setStiffness(stiffness); + + mAnimations.add(animation); + return animation; + } + + public SpringAnimation remove(SpringAnimation animation) { + animation.skipToEnd(); + mAnimations.remove(animation); + return animation; + } + + public void addMovement(MotionEvent event) { + int action = event.getActionMasked(); + if (DEBUG) Log.d(TAG, "addMovement#action=" + action); + switch (action) { + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_DOWN: + reset(); + break; + } + + getVelocityTracker().addMovement(event); + mShouldComputeVelocity = true; + } + + public void animateToFinalPosition(float position) { + if (DEBUG) Log.d(TAG, "animateToFinalPosition#computeVelocity=" + mShouldComputeVelocity); + + if (mShouldComputeVelocity) { + computeVelocity(); + setStartVelocity(mCurrentVelocity); + } + + int size = mAnimations.size(); + for (int i = 0; i < size; ++i) { + mAnimations.get(i).animateToFinalPosition(position); + } + + reset(); + } + + public void skipToEnd() { + if (DEBUG) Log.d(TAG, "setStartVelocity#skipToEnd"); + if (DEBUG) Log.v(TAG, "setStartVelocity#skipToEnd", new Exception()); + + int size = mAnimations.size(); + for (int i = 0; i < size; ++i) { + mAnimations.get(i).skipToEnd(); + } + } + + public void reset() { + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } + mCurrentVelocity = 0; + } + + private void setStartVelocity(float velocity) { + int size = mAnimations.size(); + for (int i = 0; i < size; ++i) { + mAnimations.get(i).setStartVelocity(velocity); + } + } + + private void computeVelocity() { + getVelocityTracker().computeCurrentVelocity(300); + + mCurrentVelocity = isVerticalDirection() + ? getVelocityTracker().getYVelocity() + : getVelocityTracker().getXVelocity(); + mShouldComputeVelocity = false; + + if (DEBUG) Log.d(TAG, "computeVelocity=" + mCurrentVelocity); + } + + private boolean isVerticalDirection() { + return mDirection == Y_DIRECTION; + } + + private SpringAnimation createSpringAnimation(View view) { + DynamicAnimation.ViewProperty property = isVerticalDirection() + ? DynamicAnimation.TRANSLATION_Y + : DynamicAnimation.TRANSLATION_X; + + return new SpringAnimation(view, property, 0) + .setStartValue(1f) + .setSpring(new SpringForce(0) + .setDampingRatio(SPRING_DAMPING_RATIO)); + } + + /** + * @return The app position is the position of the app in the Adapter if we ignored all other + * view types. + * + * ie. The first predicted app is at position 0, and the first app of all apps is + * at {@param appsPerRow}. + */ + private int getAppPosition(int position, int numPredictedApps, int appsPerRow) { + int appPosition = position; + int numDividerViews = 1 + (numPredictedApps == 0 ? 0 : 1); + + int allAppsStartAt = numDividerViews + numPredictedApps; + if (numDividerViews == 1 || position < allAppsStartAt) { + appPosition -= 1; + } else { + // We cannot assume that the predicted row will always be full. + int numPredictedAppsOffset = appsPerRow - numPredictedApps; + appPosition = position + numPredictedAppsOffset - numDividerViews; + } + + return appPosition; + } + + /** + * Increase the column factor as the distance increases between the column and the center + * column(s). + */ + private float getColumnFactor(int col, int numCols) { + float centerColumn = numCols / 2; + int distanceToCenter = (int) Math.abs(col - centerColumn); + + boolean evenNumberOfColumns = numCols % 2 == 0; + if (evenNumberOfColumns && col < centerColumn) { + distanceToCenter -= 1; + } + + float factor = 0; + while (distanceToCenter > 0) { + if (distanceToCenter == 1) { + factor += 0.2f; + } else { + factor += 0.1f; + } + --distanceToCenter; + } + + return factor; + } + + private VelocityTracker getVelocityTracker() { + if (mVelocityTracker == null) { + mVelocityTracker = VelocityTracker.obtain(); + } + return mVelocityTracker; + } +} diff --git a/src_flags/com/android/launcher3/config/FeatureFlags.java b/src_flags/com/android/launcher3/config/FeatureFlags.java index c0184fa91e..2f97a2ba9c 100644 --- a/src_flags/com/android/launcher3/config/FeatureFlags.java +++ b/src_flags/com/android/launcher3/config/FeatureFlags.java @@ -40,6 +40,8 @@ public final class FeatureFlags { public static boolean LAUNCHER3_PROMISE_APPS_IN_ALL_APPS = true; // When enabled uses the AllAppsRadialGradientAndScrimDrawable for all apps public static boolean LAUNCHER3_GRADIENT_ALL_APPS = false; + // When enabled allows use of physics based motions in the Launcher. + public static boolean LAUNCHER3_PHYSICS = false; // Feature flag to enable moving the QSB on the 0th screen of the workspace. public static final boolean QSB_ON_FIRST_SCREEN = true; From 4e54a4cfa50838ea0a970fea2632851bcb16e2c0 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 23 May 2017 11:45:17 -0700 Subject: [PATCH 097/446] Fix bug where item was not moved in database when added to a Folder. I thought calling arrangeChildren(saveChanges=true) would handle this case, but because we set the position and rank in addViewForRank, arrangeChildren does not see any changes to save. Change-Id: Iab0fefe6da7711857ea05955a3243459f4e8527b --- src/com/android/launcher3/folder/Folder.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 8dcf5c914e..80338ca721 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -1437,6 +1437,9 @@ public class Folder extends AbstractFloatingView implements DragSource, View.OnC @Override public void onAdd(ShortcutInfo item, int rank) { View view = mContent.createAndAddViewForRank(item, rank); + mLauncher.getModelWriter().addOrMoveItemInDatabase(item, mInfo.id, 0, item.cellX, + item.cellY); + ArrayList items = new ArrayList<>(getItemsInReadingOrder()); items.add(rank, view); mContent.arrangeChildren(items, items.size()); From c152748e46a64fba082a22235d6b99fa0b7727af Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 23 May 2017 13:14:33 -0700 Subject: [PATCH 098/446] Import translations. DO NOT MERGE Change-Id: I94345589894b7d404865e34abaf6fb6c37b85f70 Auto-generated-cl: translation import --- res/values-af/strings.xml | 2 +- res/values-ca/strings.xml | 6 +++--- res/values-uz-rUZ/strings.xml | 2 +- res/values-zh-rHK/strings.xml | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 31167e9daf..bd966c732b 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -77,7 +77,7 @@ "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" - "Ikoon-kentekengewing" + "Ikoon-kentekentoekenning" "Aan vir alle programme" "Af vir alle programme" "Voeg ikoon by tuisskerm" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 52a5df43e3..7af2ef923b 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -77,9 +77,9 @@ "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" - "Símbols d\'icona" - "Activats per a totes les aplicacions" - "Desactivats per a totes les aplicacions" + "Icones encerclades" + "Activades per a totes les aplicacions" + "Desactivades per a totes les aplicacions" "Afegeix la icona a la pantalla d\'inici" "Per a les aplicacions noves" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 506f433332..eef716e5f2 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -77,7 +77,7 @@ "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" - "Nishonchalar" + "Ikonka ustida nishoncha" "Barcha ilovalar uchun yoniq" "Barcha ilovalar uchun o‘chiq" "Bosh ekranga ikonka qo‘shish" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index c91cfd62cb..1a42ad86ad 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -78,8 +78,8 @@ "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" "在圖示上顯示標誌" - "為所有應用程式開啟此設定" - "為所有應用程式關閉此設定" + "已為所有應用程式開啟" + "已為所有應用程式關閉" "將圖示加到主畫面" "適用於新安裝的應用程式" From 91ee8fe94eef5a0bc083f18308287fea665670a5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 23 May 2017 13:15:18 -0700 Subject: [PATCH 099/446] Import translations. DO NOT MERGE Change-Id: I4e178f81de257e11834dd3ac141eded81d16bf0d Auto-generated-cl: translation import --- res/values-af/strings.xml | 2 +- res/values-ca/strings.xml | 6 +++--- res/values-uz/strings.xml | 2 +- res/values-zh-rHK/strings.xml | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 31167e9daf..bd966c732b 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -77,7 +77,7 @@ "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" - "Ikoon-kentekengewing" + "Ikoon-kentekentoekenning" "Aan vir alle programme" "Af vir alle programme" "Voeg ikoon by tuisskerm" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 52a5df43e3..7af2ef923b 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -77,9 +77,9 @@ "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" - "Símbols d\'icona" - "Activats per a totes les aplicacions" - "Desactivats per a totes les aplicacions" + "Icones encerclades" + "Activades per a totes les aplicacions" + "Desactivades per a totes les aplicacions" "Afegeix la icona a la pantalla d\'inici" "Per a les aplicacions noves" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 506f433332..eef716e5f2 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -77,7 +77,7 @@ "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" - "Nishonchalar" + "Ikonka ustida nishoncha" "Barcha ilovalar uchun yoniq" "Barcha ilovalar uchun o‘chiq" "Bosh ekranga ikonka qo‘shish" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index c91cfd62cb..1a42ad86ad 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -78,8 +78,8 @@ "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" "在圖示上顯示標誌" - "為所有應用程式開啟此設定" - "為所有應用程式關閉此設定" + "已為所有應用程式開啟" + "已為所有應用程式關閉" "將圖示加到主畫面" "適用於新安裝的應用程式" From 3e93ec558a3a8d80c3375a994bb2f63301558144 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 23 May 2017 14:00:32 -0700 Subject: [PATCH 100/446] Adding compat implementation for the new WallpaperManager APIs for color extraction Change-Id: Ie06c9ac3a77cd33d22ce298a55e234078895c3a0 --- AndroidManifest-common.xml | 5 + .../compat/WallpaperColorsCompat.java | 43 ++++ .../compat/WallpaperManagerCompat.java | 61 +++++ .../compat/WallpaperManagerCompatVL.java | 236 ++++++++++++++++++ .../compat/WallpaperManagerCompatVOMR1.java | 109 ++++++++ .../launcher3/dynamicui/ExtractedColors.java | 2 +- .../colorextraction/ColorExtractor.java | 50 +--- .../WallpaperColorsCompat.java | 69 ----- .../colorextraction/types/ExtractionType.java | 2 +- .../colorextraction/types/Tonal.java | 39 +-- 10 files changed, 492 insertions(+), 124 deletions(-) create mode 100644 src/com/android/launcher3/compat/WallpaperColorsCompat.java create mode 100644 src/com/android/launcher3/compat/WallpaperManagerCompat.java create mode 100644 src/com/android/launcher3/compat/WallpaperManagerCompatVL.java create mode 100644 src/com/android/launcher3/compat/WallpaperManagerCompatVOMR1.java delete mode 100644 src/com/android/launcher3/dynamicui/colorextraction/WallpaperColorsCompat.java diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml index 3a60a9878f..dd1446635d 100644 --- a/AndroidManifest-common.xml +++ b/AndroidManifest-common.xml @@ -85,6 +85,11 @@ android:process=":wallpaper_chooser"> + + diff --git a/src/com/android/launcher3/compat/WallpaperColorsCompat.java b/src/com/android/launcher3/compat/WallpaperColorsCompat.java new file mode 100644 index 0000000000..fd08f947ed --- /dev/null +++ b/src/com/android/launcher3/compat/WallpaperColorsCompat.java @@ -0,0 +1,43 @@ +/* + * 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. + */ +package com.android.launcher3.compat; + +import android.util.SparseIntArray; + +/** + * A compatibility layer around platform implementation of WallpaperColors + */ +public class WallpaperColorsCompat { + + private final SparseIntArray mColors; + private final boolean mSupportsDarkText; + + public WallpaperColorsCompat(SparseIntArray colors, boolean supportsDarkText) { + mColors = colors; + mSupportsDarkText = supportsDarkText; + } + + /** + * A map of color code to their occurrences. The bigger the int, the more relevant the color. + */ + public SparseIntArray getColors() { + return mColors; + } + + public boolean supportsDarkText() { + return mSupportsDarkText; + } +} diff --git a/src/com/android/launcher3/compat/WallpaperManagerCompat.java b/src/com/android/launcher3/compat/WallpaperManagerCompat.java new file mode 100644 index 0000000000..cbcabdf9b1 --- /dev/null +++ b/src/com/android/launcher3/compat/WallpaperManagerCompat.java @@ -0,0 +1,61 @@ +/* + * 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. + */ + +package com.android.launcher3.compat; + +import android.content.Context; +import android.support.annotation.Nullable; + +import com.android.launcher3.Utilities; + +public abstract class WallpaperManagerCompat { + + private static final Object sInstanceLock = new Object(); + private static WallpaperManagerCompat sInstance; + + public static WallpaperManagerCompat getInstance(Context context) { + synchronized (sInstanceLock) { + if (sInstance == null) { + context = context.getApplicationContext(); + + if (Utilities.isAtLeastO()) { + try { + sInstance = new WallpaperManagerCompatVOMR1(context); + } catch (Exception e) { + // The wallpaper APIs do not yet exist + } + } + if (sInstance == null) { + sInstance = new WallpaperManagerCompatVL(context); + } + } + return sInstance; + } + } + + + public abstract @Nullable WallpaperColorsCompat getWallpaperColors(int which); + + public abstract void addOnColorsChangedListener(OnColorsChangedListenerCompat listener); + + /** + * Interface definition for a callback to be invoked when colors change on a wallpaper. + */ + public interface OnColorsChangedListenerCompat { + + void onColorsChanged(WallpaperColorsCompat colors, int which); + } +} diff --git a/src/com/android/launcher3/compat/WallpaperManagerCompatVL.java b/src/com/android/launcher3/compat/WallpaperManagerCompatVL.java new file mode 100644 index 0000000000..b175f21136 --- /dev/null +++ b/src/com/android/launcher3/compat/WallpaperManagerCompatVL.java @@ -0,0 +1,236 @@ +/* + * 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. + */ +package com.android.launcher3.compat; + +import static android.app.WallpaperManager.FLAG_SYSTEM; + +import android.app.IntentService; +import android.app.WallpaperInfo; +import android.app.WallpaperManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.BitmapRegionDecoder; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.ParcelFileDescriptor; +import android.os.ResultReceiver; +import android.support.annotation.Nullable; +import android.support.v7.graphics.Palette; +import android.util.Log; +import android.util.Pair; +import android.util.SparseIntArray; + +import com.android.launcher3.LauncherFiles; +import com.android.launcher3.Utilities; + +import java.io.IOException; +import java.util.ArrayList; + +public class WallpaperManagerCompatVL extends WallpaperManagerCompat { + + private static final String TAG = "WMCompatVL"; + + private static final String VERSION_PREFIX = "1,"; + private static final String KEY_COLORS = "wallpaper_parsed_colors"; + private static final String EXTRA_RECEIVER = "receiver"; + + private final ArrayList mListeners = new ArrayList<>(); + + private final Context mContext; + private WallpaperColorsCompat mColorsCompat; + + WallpaperManagerCompatVL(Context context) { + mContext = context; + + String colors = prefs(mContext).getString(KEY_COLORS, ""); + int wallpaperId = -1; + if (colors.startsWith(VERSION_PREFIX)) { + Pair storedValue = parseValue(colors); + wallpaperId = storedValue.first; + mColorsCompat = storedValue.second; + } + + if (wallpaperId == -1 || wallpaperId != getWallpaperId(context)) { + reloadColors(); + } + context.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + reloadColors(); + } + }, new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED)); + } + + @Nullable + @Override + public WallpaperColorsCompat getWallpaperColors(int which) { + return which == FLAG_SYSTEM ? mColorsCompat : null; + } + + @Override + public void addOnColorsChangedListener(OnColorsChangedListenerCompat listener) { + mListeners.add(listener); + } + + private void reloadColors() { + ResultReceiver receiver = new ResultReceiver(new Handler()) { + + @Override + protected void onReceiveResult(int resultCode, Bundle resultData) { + handleResult(resultData.getString(KEY_COLORS)); + } + }; + mContext.startService(new Intent(mContext, ColorExtractionService.class) + .putExtra(EXTRA_RECEIVER, receiver)); + } + + private void handleResult(String result) { + prefs(mContext).edit().putString(KEY_COLORS, result).apply(); + mColorsCompat = parseValue(result).second; + for (OnColorsChangedListenerCompat listener : mListeners) { + listener.onColorsChanged(mColorsCompat, FLAG_SYSTEM); + } + } + + private static SharedPreferences prefs(Context context) { + return context.getSharedPreferences( + LauncherFiles.DEVICE_PREFERENCES_KEY, Context.MODE_PRIVATE); + } + + private static final int getWallpaperId(Context context) { + if (!Utilities.ATLEAST_NOUGAT) { + return -1; + } + return context.getSystemService(WallpaperManager.class).getWallpaperId(FLAG_SYSTEM); + } + + /** + * Parses the stored value and returns the wallpaper id and wallpaper colors. + */ + private static Pair parseValue(String value) { + String[] parts = value.split(","); + Integer wallpaperId = Integer.parseInt(parts[1]); + if (parts.length == 2) { + return Pair.create(wallpaperId, null); + } + + SparseIntArray colors = new SparseIntArray((parts.length - 2) / 2); + for (int i = 2; i < parts.length; i += 2) { + colors.put(Integer.parseInt(parts[i]), Integer.parseInt(parts[i + 1])); + } + return Pair.create(wallpaperId, new WallpaperColorsCompat(colors, false)); + } + + /** + * Intent service to handle color extraction + */ + public static class ColorExtractionService extends IntentService { + private static final int MAX_WALLPAPER_EXTRACTION_AREA = 112 * 112; + + public ColorExtractionService() { + super("ColorExtractionService"); + } + + /** + * Extracts the wallpaper colors and sends the result back through the receiver. + */ + @Override + protected void onHandleIntent(@Nullable Intent intent) { + int wallpaperId = getWallpaperId(this); + + Bitmap bitmap = null; + Drawable drawable = null; + + WallpaperManager wm = WallpaperManager.getInstance(this); + WallpaperInfo info = wm.getWallpaperInfo(); + if (info != null) { + // For live wallpaper, extract colors from thumbnail + drawable = info.loadThumbnail(getPackageManager()); + } else { + if (Utilities.ATLEAST_NOUGAT) { + try (ParcelFileDescriptor fd = wm.getWallpaperFile(FLAG_SYSTEM)) { + BitmapRegionDecoder decoder = BitmapRegionDecoder + .newInstance(fd.getFileDescriptor(), false); + + int requestedArea = decoder.getWidth() * decoder.getHeight(); + BitmapFactory.Options options = new BitmapFactory.Options(); + + if (requestedArea > MAX_WALLPAPER_EXTRACTION_AREA) { + double areaRatio = + MAX_WALLPAPER_EXTRACTION_AREA / (double) requestedArea; + double nearestPowOf2 = + Math.floor(Math.log(areaRatio) / (2 * Math.log(2))); + options.inSampleSize = (int) Math.pow(2, nearestPowOf2); + } + Rect region = new Rect(0, 0, decoder.getWidth(), decoder.getHeight()); + bitmap = decoder.decodeRegion(region, options); + decoder.recycle(); + } catch (IOException | NullPointerException e) { + Log.e(TAG, "Fetching partial bitmap failed, trying old method", e); + } + } + if (bitmap == null) { + drawable = wm.getDrawable(); + } + } + + if (drawable != null) { + // Calculate how big the bitmap needs to be. + // This avoids unnecessary processing and allocation inside Palette. + final int requestedArea = drawable.getIntrinsicWidth() * + drawable.getIntrinsicHeight(); + double scale = 1; + if (requestedArea > MAX_WALLPAPER_EXTRACTION_AREA) { + scale = Math.sqrt(MAX_WALLPAPER_EXTRACTION_AREA / (double) requestedArea); + } + bitmap = Bitmap.createBitmap((int) (drawable.getIntrinsicWidth() * scale), + (int) (drawable.getIntrinsicHeight() * scale), Bitmap.Config.ARGB_8888); + final Canvas bmpCanvas = new Canvas(bitmap); + drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); + drawable.draw(bmpCanvas); + } + + String value = VERSION_PREFIX + wallpaperId; + + if (bitmap != null) { + Palette palette = Palette.from(bitmap).generate(); + bitmap.recycle(); + + StringBuilder builder = new StringBuilder(value); + for (Palette.Swatch swatch : palette.getSwatches()) { + builder.append(',') + .append(swatch.getRgb()) + .append(',') + .append(swatch.getPopulation()); + } + value = builder.toString(); + } + + ResultReceiver receiver = intent.getParcelableExtra(EXTRA_RECEIVER); + Bundle result = new Bundle(); + result.putString(KEY_COLORS, value); + receiver.send(0, result); + } + } +} diff --git a/src/com/android/launcher3/compat/WallpaperManagerCompatVOMR1.java b/src/com/android/launcher3/compat/WallpaperManagerCompatVOMR1.java new file mode 100644 index 0000000000..c74ccc0ccf --- /dev/null +++ b/src/com/android/launcher3/compat/WallpaperManagerCompatVOMR1.java @@ -0,0 +1,109 @@ +/* + * 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. + */ +package com.android.launcher3.compat; + +import android.annotation.TargetApi; +import android.app.WallpaperManager; +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.support.annotation.Nullable; +import android.util.Log; +import android.util.Pair; +import android.util.SparseIntArray; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.List; + +@TargetApi(Build.VERSION_CODES.O) +public class WallpaperManagerCompatVOMR1 extends WallpaperManagerCompat { + + private static final String TAG = "WMCompatVOMR1"; + + private final WallpaperManager mWm; + + private final Class mOCLClass; + private final Method mAddOCLMethod; + + private final Method mWCGetMethod; + private final Method mWCGetColorsMethod; + private final Method mWCSupportsDarkTextMethod; + + WallpaperManagerCompatVOMR1(Context context) throws Exception { + mWm = context.getSystemService(WallpaperManager.class); + + mOCLClass = Class.forName("android.app.WallpaperManager$OnColorsChangedListener"); + mAddOCLMethod = WallpaperManager.class.getDeclaredMethod( + "addOnColorsChangedListener", mOCLClass); + + mWCGetMethod = WallpaperManager.class.getDeclaredMethod("getWallpaperColors", int.class); + Class wallpaperColorsClass = mWCGetMethod.getReturnType(); + mWCGetColorsMethod = wallpaperColorsClass.getDeclaredMethod("getColors"); + mWCSupportsDarkTextMethod = wallpaperColorsClass.getDeclaredMethod("supportsDarkText"); + } + + @Nullable + @Override + public WallpaperColorsCompat getWallpaperColors(int which) { + try { + return convertColorsObject(mWCGetMethod.invoke(mWm, which)); + } catch (Exception e) { + Log.e(TAG, "Error calling wallpaper API", e); + return null; + } + } + + @Override + public void addOnColorsChangedListener(final OnColorsChangedListenerCompat listener) { + Object onChangeListener = Proxy.newProxyInstance( + WallpaperManager.class.getClassLoader(), + new Class[]{mOCLClass}, + new InvocationHandler() { + @Override + public Object invoke(Object o, Method method, Object[] objects) + throws Throwable { + String methodName = method.getName(); + if ("onColorsChanged".equals(methodName)) { + listener.onColorsChanged( + convertColorsObject(objects[0]), (Integer) objects[1]); + } else if ("toString".equals(methodName)) { + return listener.toString(); + } + return null; + } + }); + try { + mAddOCLMethod.invoke(mWm, onChangeListener); + } catch (Exception e) { + Log.e(TAG, "Error calling wallpaper API", e); + } + } + + private WallpaperColorsCompat convertColorsObject(Object colors) throws Exception { + if (colors == null) { + return null; + } + List> list = (List) mWCGetColorsMethod.invoke(colors); + boolean supportsDarkText = (Boolean) mWCSupportsDarkTextMethod.invoke(colors); + SparseIntArray colorMap = new SparseIntArray(list.size()); + for (Pair color : list) { + colorMap.put(color.first.toArgb(), color.second); + } + return new WallpaperColorsCompat(colorMap, supportsDarkText); + } +} diff --git a/src/com/android/launcher3/dynamicui/ExtractedColors.java b/src/com/android/launcher3/dynamicui/ExtractedColors.java index e60a1bd7d0..96fe31a734 100644 --- a/src/com/android/launcher3/dynamicui/ExtractedColors.java +++ b/src/com/android/launcher3/dynamicui/ExtractedColors.java @@ -170,7 +170,7 @@ public class ExtractedColors { try { WallpaperManager.class.getDeclaredMethod("getWallpaperColors", int.class); ColorExtractor extractor = new ColorExtractor(context); - ColorExtractor.GradientColors colors = extractor.getColors(WallpaperManager.FLAG_SYSTEM); + ColorExtractor.GradientColors colors = extractor.getColors(); setColorAtIndex(ALLAPPS_GRADIENT_MAIN_INDEX, colors.getMainColor()); setColorAtIndex(ALLAPPS_GRADIENT_SECONDARY_INDEX, colors.getSecondaryColor()); } catch (NoSuchMethodException e) { diff --git a/src/com/android/launcher3/dynamicui/colorextraction/ColorExtractor.java b/src/com/android/launcher3/dynamicui/colorextraction/ColorExtractor.java index 153b529140..98558677ae 100644 --- a/src/com/android/launcher3/dynamicui/colorextraction/ColorExtractor.java +++ b/src/com/android/launcher3/dynamicui/colorextraction/ColorExtractor.java @@ -1,16 +1,15 @@ package com.android.launcher3.dynamicui.colorextraction; -import android.app.WallpaperManager; +import static android.app.WallpaperManager.FLAG_SYSTEM; + import android.content.Context; import android.graphics.Color; -import android.os.Parcelable; -import android.util.Log; +import com.android.launcher3.compat.WallpaperColorsCompat; +import com.android.launcher3.compat.WallpaperManagerCompat; import com.android.launcher3.dynamicui.colorextraction.types.ExtractionType; import com.android.launcher3.dynamicui.colorextraction.types.Tonal; -import java.lang.reflect.Method; - /** * Class to process wallpaper colors and generate a tonal palette based on them. @@ -18,59 +17,32 @@ import java.lang.reflect.Method; * TODO remove this class if available by platform */ public class ColorExtractor { - private static final String TAG = "ColorExtractor"; private static final int FALLBACK_COLOR = Color.WHITE; + private final Context mContext; private int mMainFallbackColor = FALLBACK_COLOR; private int mSecondaryFallbackColor = FALLBACK_COLOR; private final GradientColors mSystemColors; - private final GradientColors mLockColors; - private final Context mContext; private final ExtractionType mExtractionType; public ColorExtractor(Context context) { mContext = context; mSystemColors = new GradientColors(); - mLockColors = new GradientColors(); mExtractionType = new Tonal(); - WallpaperManager wallpaperManager = mContext.getSystemService(WallpaperManager.class); - if (wallpaperManager == null) { - Log.w(TAG, "Can't listen to color changes!"); - } else { - Parcelable wallpaperColorsObj; - try { - Method method = WallpaperManager.class - .getDeclaredMethod("getWallpaperColors", int.class); - - wallpaperColorsObj = (Parcelable) method.invoke(wallpaperManager, - WallpaperManager.FLAG_SYSTEM); - extractInto(new WallpaperColorsCompat(wallpaperColorsObj), mSystemColors); - wallpaperColorsObj = (Parcelable) method.invoke(wallpaperManager, - WallpaperManager.FLAG_LOCK); - extractInto(new WallpaperColorsCompat(wallpaperColorsObj), mLockColors); - } catch (Exception e) { - Log.e(TAG, "reflection failed", e); - } - } + extractFrom(WallpaperManagerCompat.getInstance(context).getWallpaperColors(FLAG_SYSTEM)); } - public GradientColors getColors(int which) { - if (which == WallpaperManager.FLAG_LOCK) { - return mLockColors; - } else if (which == WallpaperManager.FLAG_SYSTEM) { - return mSystemColors; - } else { - throw new IllegalArgumentException("which should be either FLAG_SYSTEM or FLAG_LOCK"); - } + public GradientColors getColors() { + return mSystemColors; } - private void extractInto(WallpaperColorsCompat inWallpaperColors, GradientColors outGradientColors) { - applyFallback(outGradientColors); + private void extractFrom(WallpaperColorsCompat inWallpaperColors) { + applyFallback(mSystemColors); if (inWallpaperColors == null) { return; } - mExtractionType.extractInto(inWallpaperColors, outGradientColors); + mExtractionType.extractInto(inWallpaperColors, mSystemColors); } private void applyFallback(GradientColors outGradientColors) { diff --git a/src/com/android/launcher3/dynamicui/colorextraction/WallpaperColorsCompat.java b/src/com/android/launcher3/dynamicui/colorextraction/WallpaperColorsCompat.java deleted file mode 100644 index f80a675cbd..0000000000 --- a/src/com/android/launcher3/dynamicui/colorextraction/WallpaperColorsCompat.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.android.launcher3.dynamicui.colorextraction; - -import android.graphics.Color; -import android.os.Parcel; -import android.os.Parcelable; -import android.util.Pair; - -import java.util.List; - -/** - * A wrapper around platform implementation of WallpaperColors until the - * updated SDK is available. - * - * TODO remove this class if available by platform - */ -public class WallpaperColorsCompat implements Parcelable { - - private final Parcelable mObject; - - public WallpaperColorsCompat(Parcelable object) { - mObject = object; - } - - private Object invokeMethod(String methodName) { - try { - return mObject.getClass().getDeclaredMethod(methodName).invoke(mObject); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel parcel, int i) { - parcel.writeParcelable(mObject, i); - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - public WallpaperColorsCompat createFromParcel(Parcel source) { - Parcelable object = source.readParcelable(null); - return new WallpaperColorsCompat(object); - } - - public WallpaperColorsCompat[] newArray(int size) { - return new WallpaperColorsCompat[size]; - } - }; - - public List> getColors() { - try { - return (List>) invokeMethod("getColors"); - } catch (Exception e) { - return null; - } - } - - public boolean supportsDarkText() { - try { - return (Boolean) invokeMethod("supportsDarkText"); - } catch (Exception e) { - return false; - } - } -} diff --git a/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java b/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java index 166c7c6f40..88958a480b 100644 --- a/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java +++ b/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java @@ -1,7 +1,7 @@ package com.android.launcher3.dynamicui.colorextraction.types; +import com.android.launcher3.compat.WallpaperColorsCompat; import com.android.launcher3.dynamicui.colorextraction.ColorExtractor; -import com.android.launcher3.dynamicui.colorextraction.WallpaperColorsCompat; /** diff --git a/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java b/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java index 1e165a382a..800dcd2039 100644 --- a/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java +++ b/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java @@ -6,11 +6,15 @@ import android.support.annotation.Nullable; import android.support.v4.graphics.ColorUtils; import android.util.Log; import android.util.Pair; +import android.util.SparseIntArray; +import com.android.launcher3.compat.WallpaperColorsCompat; import com.android.launcher3.dynamicui.colorextraction.ColorExtractor; -import com.android.launcher3.dynamicui.colorextraction.WallpaperColorsCompat; +import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; +import java.util.List; /** @@ -29,9 +33,10 @@ public class Tonal implements ExtractionType { private static final float MIN_COLOR_OCCURRENCE = 0.1f; private static final float MIN_LUMINOSITY = 0.5f; - public void extractInto(WallpaperColorsCompat wallpaperColors, - ColorExtractor.GradientColors gradientColors) { - if (wallpaperColors.getColors().size() == 0) { + public void extractInto( + WallpaperColorsCompat wallpaperColors, ColorExtractor.GradientColors gradientColors) { + SparseIntArray colorsArray = wallpaperColors.getColors(); + if (colorsArray.size() == 0) { return; } // Tonal is not really a sort, it takes a color from the extracted @@ -39,24 +44,30 @@ public class Tonal implements ExtractionType { // palettes. The best fit is tweaked to be closer to the source color // and replaces the original palette + List> colors = new ArrayList<>(colorsArray.size()); + for (int i = colorsArray.size() - 1; i >= 0; i --) { + colors.add(Pair.create(colorsArray.keyAt(i), colorsArray.valueAt(i))); + } + // First find the most representative color in the image - populationSort(wallpaperColors); + populationSort(colors); + // Calculate total int total = 0; - for (Pair weightedColor : wallpaperColors.getColors()) { + for (Pair weightedColor : colors) { total += weightedColor.second; } // Get bright colors that occur often enough in this image - Pair bestColor = null; + Pair bestColor = null; float[] hsl = new float[3]; - for (Pair weightedColor : wallpaperColors.getColors()) { + for (Pair weightedColor : colors) { float colorOccurrence = weightedColor.second / (float) total; if (colorOccurrence < MIN_COLOR_OCCURRENCE) { break; } - int colorValue = weightedColor.first.toArgb(); + int colorValue = weightedColor.first; ColorUtils.RGBToHSL(Color.red(colorValue), Color.green(colorValue), Color.blue(colorValue), hsl); if (hsl[2] > MIN_LUMINOSITY) { @@ -66,10 +77,10 @@ public class Tonal implements ExtractionType { // Fallback to first color if (bestColor == null) { - bestColor = wallpaperColors.getColors().get(0); + bestColor = colors.get(0); } - int colorValue = bestColor.first.toArgb(); + int colorValue = bestColor.first; ColorUtils.RGBToHSL(Color.red(colorValue), Color.green(colorValue), Color.blue(colorValue), hsl); hsl[0] /= 360.0f; // normalize @@ -105,10 +116,10 @@ public class Tonal implements ExtractionType { gradientColors.setSecondaryColor(ColorUtils.HSLToColor(hsl)); } - private static void populationSort(@NonNull WallpaperColorsCompat wallpaperColors) { - wallpaperColors.getColors().sort(new Comparator>() { + private static void populationSort(@NonNull List> wallpaperColors) { + Collections.sort(wallpaperColors, new Comparator>() { @Override - public int compare(Pair a, Pair b) { + public int compare(Pair a, Pair b) { return b.second - a.second; } }); From 0140a9d3ac75324299e996d0aba222567b47234d Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 23 May 2017 14:39:31 -0700 Subject: [PATCH 101/446] Turn flag on for LAUNCHER3_PHYSICS. Change-Id: Ibd89a1a422dda9d24b64f4e2968c4edb1342db22 --- src_flags/com/android/launcher3/config/FeatureFlags.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_flags/com/android/launcher3/config/FeatureFlags.java b/src_flags/com/android/launcher3/config/FeatureFlags.java index 2f97a2ba9c..656246667a 100644 --- a/src_flags/com/android/launcher3/config/FeatureFlags.java +++ b/src_flags/com/android/launcher3/config/FeatureFlags.java @@ -41,7 +41,7 @@ public final class FeatureFlags { // When enabled uses the AllAppsRadialGradientAndScrimDrawable for all apps public static boolean LAUNCHER3_GRADIENT_ALL_APPS = false; // When enabled allows use of physics based motions in the Launcher. - public static boolean LAUNCHER3_PHYSICS = false; + public static boolean LAUNCHER3_PHYSICS = true; // Feature flag to enable moving the QSB on the 0th screen of the workspace. public static final boolean QSB_ON_FIRST_SCREEN = true; From 9d1aa13a9738eaa47c419ec58ce793bf6d867bb3 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 23 May 2017 16:25:54 -0700 Subject: [PATCH 102/446] Some fixes in the compat implementation of wallpaper manager Change-Id: I781fd520e812aaeaab42b8b765d7e7f2e64a96a1 --- .../launcher3/compat/WallpaperManagerCompatVL.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/compat/WallpaperManagerCompatVL.java b/src/com/android/launcher3/compat/WallpaperManagerCompatVL.java index b175f21136..34316644a5 100644 --- a/src/com/android/launcher3/compat/WallpaperManagerCompatVL.java +++ b/src/com/android/launcher3/compat/WallpaperManagerCompatVL.java @@ -132,14 +132,15 @@ public class WallpaperManagerCompatVL extends WallpaperManagerCompat { String[] parts = value.split(","); Integer wallpaperId = Integer.parseInt(parts[1]); if (parts.length == 2) { + // There is no wallpaper color info present, eg when live wallpaper has no preview. return Pair.create(wallpaperId, null); } - SparseIntArray colors = new SparseIntArray((parts.length - 2) / 2); + SparseIntArray colorsToOccurrences = new SparseIntArray((parts.length - 2) / 2); for (int i = 2; i < parts.length; i += 2) { - colors.put(Integer.parseInt(parts[i]), Integer.parseInt(parts[i + 1])); + colorsToOccurrences.put(Integer.parseInt(parts[i]), Integer.parseInt(parts[i + 1])); } - return Pair.create(wallpaperId, new WallpaperColorsCompat(colors, false)); + return Pair.create(wallpaperId, new WallpaperColorsCompat(colorsToOccurrences, false)); } /** @@ -178,7 +179,7 @@ public class WallpaperManagerCompatVL extends WallpaperManagerCompat { if (requestedArea > MAX_WALLPAPER_EXTRACTION_AREA) { double areaRatio = - MAX_WALLPAPER_EXTRACTION_AREA / (double) requestedArea; + (double) requestedArea / MAX_WALLPAPER_EXTRACTION_AREA; double nearestPowOf2 = Math.floor(Math.log(areaRatio) / (2 * Math.log(2))); options.inSampleSize = (int) Math.pow(2, nearestPowOf2); From 66714d3cb7f2ed3eb0c0472d75b541c0e13ace76 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 23 May 2017 20:31:10 -0700 Subject: [PATCH 103/446] Update physics VelocityTracker units to 175 pixels per second. This makes it a bit more subtle. Bug: 38349031 Change-Id: I2a6f5edf2d662ca1e742665e437ff59268f00c07 --- src/com/android/launcher3/anim/SpringAnimationHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/anim/SpringAnimationHandler.java b/src/com/android/launcher3/anim/SpringAnimationHandler.java index 5792127d07..488657c36d 100644 --- a/src/com/android/launcher3/anim/SpringAnimationHandler.java +++ b/src/com/android/launcher3/anim/SpringAnimationHandler.java @@ -164,7 +164,7 @@ public class SpringAnimationHandler { } private void computeVelocity() { - getVelocityTracker().computeCurrentVelocity(300); + getVelocityTracker().computeCurrentVelocity(175); mCurrentVelocity = isVerticalDirection() ? getVelocityTracker().getYVelocity() From d15dccf10eec367e38b8723c409909a29307057a Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Wed, 24 May 2017 10:30:13 -0700 Subject: [PATCH 104/446] Allapps motion changes for landscape Bug: 38230696 Change-Id: I82e36c240c934ff6b86b55e0a0f07391fd11ec82 --- res/layout/gradient_scrim.xml | 3 +- .../android/launcher3/graphics/ScrimView.java | 49 +++++++++++++++++-- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/res/layout/gradient_scrim.xml b/res/layout/gradient_scrim.xml index c40c5fc0c8..15516b0284 100644 --- a/res/layout/gradient_scrim.xml +++ b/res/layout/gradient_scrim.xml @@ -26,6 +26,5 @@ android:id="@+id/scrim_bg" android:layout_width="match_parent" android:layout_height="match_parent" - android:visibility="gone" - app:layout_ignoreInsets="true"/> + android:visibility="gone"/> \ No newline at end of file diff --git a/src/com/android/launcher3/graphics/ScrimView.java b/src/com/android/launcher3/graphics/ScrimView.java index feb3f030f0..c102cabb12 100644 --- a/src/com/android/launcher3/graphics/ScrimView.java +++ b/src/com/android/launcher3/graphics/ScrimView.java @@ -29,10 +29,12 @@ import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.Interpolator; +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; -public class ScrimView extends View { +public class ScrimView extends View implements DeviceProfile.LauncherLayoutChangeListener { private static final boolean DEBUG = false; @@ -57,6 +59,10 @@ public class ScrimView extends View { private final Interpolator mAccelerator = new AccelerateInterpolator(); private final Paint mDebugPaint = DEBUG ? new Paint() : null; + private int mPaddingLeft; + private int mPaddingRight; + private int mAlphaStart; + public ScrimView(Context context, AttributeSet attrs) { super(context, attrs); mMaskHeight = Utilities.pxFromDp(MASK_HEIGHT_DP, getResources().getDisplayMetrics()); @@ -74,6 +80,21 @@ public class ScrimView extends View { } } + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + updatePaddingAndAlphaStart(); + Launcher.getLauncher(getContext()).getDeviceProfile() + .addLauncherLayoutChangedListener(this); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + Launcher.getLauncher(getContext()).getDeviceProfile() + .removeLauncherLayoutChangedListener(this); + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); @@ -91,7 +112,8 @@ public class ScrimView extends View { setTranslationY(linTranslationY); if (APPLY_ALPHA) { - int alpha = 55 + (int) (200f * mAccelerator.getInterpolation(progress)); + int alpha = mAlphaStart + (int) ((255f - mAlphaStart) + * mAccelerator.getInterpolation(progress)); mPaint.setAlpha(alpha); invalidate(); } @@ -99,8 +121,8 @@ public class ScrimView extends View { @Override protected void onDraw(Canvas canvas) { - mAlphaMaskRect.set(0, 0, getWidth(), mMaskHeight); - mFinalMaskRect.set(0, mMaskHeight, getWidth(), getHeight()); + mAlphaMaskRect.set(mPaddingLeft, 0, getWidth() - mPaddingRight, mMaskHeight); + mFinalMaskRect.set(mPaddingLeft, mMaskHeight, getWidth() - mPaddingRight, getHeight()); canvas.drawBitmap(sAlphaScrimMask, null, mAlphaMaskRect, mPaint); canvas.drawBitmap(sFinalScrimMask, null, mFinalMaskRect, mPaint); @@ -111,4 +133,23 @@ public class ScrimView extends View { } } + @Override + public void onLauncherLayoutChanged() { + updatePaddingAndAlphaStart(); + invalidate(); + } + + private void updatePaddingAndAlphaStart() { + DeviceProfile grid = Launcher.getLauncher(getContext()).getDeviceProfile(); + if (grid.isVerticalBarLayout()) { + int[] padding = grid.getContainerPadding(); + mPaddingLeft = padding[0] + grid.edgeMarginPx; + mPaddingRight = padding[1] + grid.edgeMarginPx; + mAlphaStart = 0; + } else { + mPaddingLeft = 0; + mPaddingRight = 0; + mAlphaStart = 55; + } + } } From 17b7f9bdf40b015db9f262b3221c4e46ae1b430b Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 23 May 2017 12:19:09 -0700 Subject: [PATCH 105/446] Don't hide text in pre-drag when opening popup above icon Bug: 38468930 Change-Id: Id03162af829a00442d1db0a93f7e9d8bcb998b1a --- src/com/android/launcher3/BubbleTextView.java | 19 ++++++++++++++++++- .../popup/PopupContainerWithArrow.java | 19 ++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index e49ead0f75..1f7eba812e 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -23,10 +23,12 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Property; @@ -93,6 +95,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { private final int mIconSize; @ViewDebug.ExportedProperty(category = "launcher") private int mTextColor; + private boolean mIsIconVisible = true; private BadgeInfo mBadgeInfo; private BadgeRenderer mBadgeRenderer; @@ -609,7 +612,21 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { private void setIcon(Drawable icon) { mIcon = icon; mIcon.setBounds(0, 0, mIconSize, mIconSize); - applyCompoundDrawables(mIcon); + if (mIsIconVisible) { + applyCompoundDrawables(mIcon); + } + } + + public void setIconVisible(boolean visible) { + mIsIconVisible = visible; + mDisableRelayout = true; + Drawable icon = mIcon; + if (!visible) { + icon = new ColorDrawable(Color.TRANSPARENT); + icon.setBounds(0, 0, mIconSize, mIconSize); + } + applyCompoundDrawables(icon); + mDisableRelayout = false; } protected void applyCompoundDrawables(Drawable icon) { diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index ccead37dc8..b373a17669 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -530,6 +530,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra */ public DragOptions.PreDragCondition createPreDragCondition() { return new DragOptions.PreDragCondition() { + @Override public boolean shouldStartDrag(double distanceDragged) { return distanceDragged > mStartDragThreshold; @@ -537,15 +538,27 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra @Override public void onPreDragStart(DropTarget.DragObject dragObject) { - mOriginalIcon.setVisibility(INVISIBLE); + if (mIsAboveIcon) { + // Hide only the icon, keep the text visible. + mOriginalIcon.setIconVisible(false); + mOriginalIcon.setVisibility(VISIBLE); + } else { + // Hide both the icon and text. + mOriginalIcon.setVisibility(INVISIBLE); + } } @Override public void onPreDragEnd(DropTarget.DragObject dragObject, boolean dragStarted) { - if (!dragStarted) { - mOriginalIcon.setVisibility(VISIBLE); + mOriginalIcon.setIconVisible(true); + if (dragStarted) { + // Make sure we keep the original icon hidden while it is being dragged. + mOriginalIcon.setVisibility(INVISIBLE); + } else { mLauncher.getUserEventDispatcher().logDeepShortcutsOpen(mOriginalIcon); if (!mIsAboveIcon) { + // Show the icon but keep the text hidden. + mOriginalIcon.setVisibility(VISIBLE); mOriginalIcon.setTextVisibility(false); } } From 418d443d2fdf4bade836eef35ec6732ae07a73fe Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Wed, 24 May 2017 17:56:56 +0000 Subject: [PATCH 106/446] Revert "Allapps motion changes for landscape" This reverts commit d15dccf10eec367e38b8723c409909a29307057a. Change-Id: I04c06d419bc636929259bc5f4fdce982d97ef33f --- res/layout/gradient_scrim.xml | 3 +- .../android/launcher3/graphics/ScrimView.java | 49 ++----------------- 2 files changed, 6 insertions(+), 46 deletions(-) diff --git a/res/layout/gradient_scrim.xml b/res/layout/gradient_scrim.xml index 15516b0284..c40c5fc0c8 100644 --- a/res/layout/gradient_scrim.xml +++ b/res/layout/gradient_scrim.xml @@ -26,5 +26,6 @@ android:id="@+id/scrim_bg" android:layout_width="match_parent" android:layout_height="match_parent" - android:visibility="gone"/> + android:visibility="gone" + app:layout_ignoreInsets="true"/> \ No newline at end of file diff --git a/src/com/android/launcher3/graphics/ScrimView.java b/src/com/android/launcher3/graphics/ScrimView.java index c102cabb12..feb3f030f0 100644 --- a/src/com/android/launcher3/graphics/ScrimView.java +++ b/src/com/android/launcher3/graphics/ScrimView.java @@ -29,12 +29,10 @@ import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.Interpolator; -import com.android.launcher3.DeviceProfile; -import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; -public class ScrimView extends View implements DeviceProfile.LauncherLayoutChangeListener { +public class ScrimView extends View { private static final boolean DEBUG = false; @@ -59,10 +57,6 @@ public class ScrimView extends View implements DeviceProfile.LauncherLayoutChang private final Interpolator mAccelerator = new AccelerateInterpolator(); private final Paint mDebugPaint = DEBUG ? new Paint() : null; - private int mPaddingLeft; - private int mPaddingRight; - private int mAlphaStart; - public ScrimView(Context context, AttributeSet attrs) { super(context, attrs); mMaskHeight = Utilities.pxFromDp(MASK_HEIGHT_DP, getResources().getDisplayMetrics()); @@ -80,21 +74,6 @@ public class ScrimView extends View implements DeviceProfile.LauncherLayoutChang } } - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - updatePaddingAndAlphaStart(); - Launcher.getLauncher(getContext()).getDeviceProfile() - .addLauncherLayoutChangedListener(this); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - Launcher.getLauncher(getContext()).getDeviceProfile() - .removeLauncherLayoutChangedListener(this); - } - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); @@ -112,8 +91,7 @@ public class ScrimView extends View implements DeviceProfile.LauncherLayoutChang setTranslationY(linTranslationY); if (APPLY_ALPHA) { - int alpha = mAlphaStart + (int) ((255f - mAlphaStart) - * mAccelerator.getInterpolation(progress)); + int alpha = 55 + (int) (200f * mAccelerator.getInterpolation(progress)); mPaint.setAlpha(alpha); invalidate(); } @@ -121,8 +99,8 @@ public class ScrimView extends View implements DeviceProfile.LauncherLayoutChang @Override protected void onDraw(Canvas canvas) { - mAlphaMaskRect.set(mPaddingLeft, 0, getWidth() - mPaddingRight, mMaskHeight); - mFinalMaskRect.set(mPaddingLeft, mMaskHeight, getWidth() - mPaddingRight, getHeight()); + mAlphaMaskRect.set(0, 0, getWidth(), mMaskHeight); + mFinalMaskRect.set(0, mMaskHeight, getWidth(), getHeight()); canvas.drawBitmap(sAlphaScrimMask, null, mAlphaMaskRect, mPaint); canvas.drawBitmap(sFinalScrimMask, null, mFinalMaskRect, mPaint); @@ -133,23 +111,4 @@ public class ScrimView extends View implements DeviceProfile.LauncherLayoutChang } } - @Override - public void onLauncherLayoutChanged() { - updatePaddingAndAlphaStart(); - invalidate(); - } - - private void updatePaddingAndAlphaStart() { - DeviceProfile grid = Launcher.getLauncher(getContext()).getDeviceProfile(); - if (grid.isVerticalBarLayout()) { - int[] padding = grid.getContainerPadding(); - mPaddingLeft = padding[0] + grid.edgeMarginPx; - mPaddingRight = padding[1] + grid.edgeMarginPx; - mAlphaStart = 0; - } else { - mPaddingLeft = 0; - mPaddingRight = 0; - mAlphaStart = 55; - } - } } From 896e71a8592bc640c2a20331933fbba6504eeca4 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 24 May 2017 12:15:24 -0700 Subject: [PATCH 107/446] Update FolderIcon preview to be 1dp bigger (stroke) than other shortcuts. Bug: 38338424 Change-Id: I2e9cdb2285e97e9d899eda13947bedb40d6fbcb2 --- res/values/dimens.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 958cb6bc87..110e79042d 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -119,7 +119,7 @@ - 6dp + 10dp 8dp 9dp From 1a83af2b81a0dd6c3232dfbc55fa4a1076205b85 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Wed, 24 May 2017 10:30:13 -0700 Subject: [PATCH 108/446] Allapps motion changes for landscape Scrim and Gradient alpha starting from 0 Change-Id: If200539f3915ff32885712cff868d74d014c340f --- .../launcher3/allapps/AllAppsTransitionController.java | 3 ++- src/com/android/launcher3/graphics/GradientView.java | 9 ++++++--- src/com/android/launcher3/graphics/ScrimView.java | 7 ++++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index dd0d23810c..5182a5b432 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -276,7 +276,8 @@ public class AllAppsTransitionController implements TouchController, VerticalPul private void updateLightStatusBar(float shift) { // Do not modify status bar on landscape as all apps is not full bleed. - if (mLauncher.getDeviceProfile().isVerticalBarLayout()) { + if (!FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS + && mLauncher.getDeviceProfile().isVerticalBarLayout()) { return; } // Use a light status bar (dark icons) if all apps is behind at least half of the status diff --git a/src/com/android/launcher3/graphics/GradientView.java b/src/com/android/launcher3/graphics/GradientView.java index c5b769366d..8f16e9366a 100644 --- a/src/com/android/launcher3/graphics/GradientView.java +++ b/src/com/android/launcher3/graphics/GradientView.java @@ -30,6 +30,7 @@ import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.Interpolator; +import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; @@ -59,12 +60,15 @@ public class GradientView extends View { private final Context mAppContext; private final Paint mDebugPaint = DEBUG ? new Paint() : null; private final Interpolator mAccelerator = new AccelerateInterpolator(); + private final float mAlphaStart; public GradientView(Context context, AttributeSet attrs) { super(context, attrs); this.mAppContext = context.getApplicationContext(); this.mMaskHeight = Utilities.pxFromDp(GRADIENT_ALPHA_MASK_LENGTH_DP, mAppContext.getResources().getDisplayMetrics()); + this.mAlphaStart = Launcher.getLauncher(context) + .getDeviceProfile().isVerticalBarLayout() ? 0 : 100; if (sFinalGradientMask == null) { sFinalGradientMask = Utilities.convertToAlphaMask( @@ -122,9 +126,8 @@ public class GradientView extends View { float head = 0.29f; float linearProgress = head + (mProgress * (1f - head)); float startMaskY = (1f - linearProgress) * mHeight - mMaskHeight * linearProgress; - float startAlpha = 100; - float interpolatedAlpha = (255 - startAlpha) * mAccelerator.getInterpolation(mProgress); - mPaint.setAlpha((int) (startAlpha + interpolatedAlpha)); + float interpolatedAlpha = (255 - mAlphaStart) * mAccelerator.getInterpolation(mProgress); + mPaint.setAlpha((int) (mAlphaStart + interpolatedAlpha)); mAlphaMaskRect.set(0, startMaskY, mWidth, startMaskY + mMaskHeight); mFinalMaskRect.set(0, startMaskY + mMaskHeight, mWidth, mHeight); canvas.drawBitmap(sAlphaGradientMask, null, mAlphaMaskRect, mPaint); diff --git a/src/com/android/launcher3/graphics/ScrimView.java b/src/com/android/launcher3/graphics/ScrimView.java index feb3f030f0..5c739ac99c 100644 --- a/src/com/android/launcher3/graphics/ScrimView.java +++ b/src/com/android/launcher3/graphics/ScrimView.java @@ -29,6 +29,7 @@ import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.Interpolator; +import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; @@ -56,12 +57,15 @@ public class ScrimView extends View { private float mProgress; private final Interpolator mAccelerator = new AccelerateInterpolator(); private final Paint mDebugPaint = DEBUG ? new Paint() : null; + private final int mAlphaStart; public ScrimView(Context context, AttributeSet attrs) { super(context, attrs); mMaskHeight = Utilities.pxFromDp(MASK_HEIGHT_DP, getResources().getDisplayMetrics()); mHeadStart = (int) (mMaskHeight * MASK_START_LENGTH_FACTOR); mPaint.setColor(SCRIM_COLOR); + mAlphaStart = Launcher.getLauncher(context) + .getDeviceProfile().isVerticalBarLayout() ? 0 : 55; if (sFinalScrimMask == null) { sFinalScrimMask = Utilities.convertToAlphaMask( @@ -91,7 +95,8 @@ public class ScrimView extends View { setTranslationY(linTranslationY); if (APPLY_ALPHA) { - int alpha = 55 + (int) (200f * mAccelerator.getInterpolation(progress)); + int alpha = mAlphaStart + (int) ((255f - mAlphaStart) + * mAccelerator.getInterpolation(progress)); mPaint.setAlpha(alpha); invalidate(); } From 368ae772018c12349d7bf1b27d8817e7644b08c2 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 24 May 2017 13:19:15 -0700 Subject: [PATCH 109/446] Defining a dark theme for launcher > Removing the code for LIGHT_STATUS_BAR as that will be controlled by the theme > Updating icon cache to always use transparent background for low-res, as the theme can change the bg color Change-Id: Iab64ec29cab629ee515af22ec15b95d3f40a9df5 --- res/values/attrs.xml | 4 ++ res/values/styles.xml | 21 ++++++-- src/com/android/launcher3/CellLayout.java | 5 +- src/com/android/launcher3/IconCache.java | 50 +++---------------- src/com/android/launcher3/Launcher.java | 7 --- src/com/android/launcher3/Utilities.java | 4 +- src/com/android/launcher3/Workspace.java | 5 +- .../allapps/AllAppsTransitionController.java | 8 +-- .../android/launcher3/folder/FolderIcon.java | 22 ++++---- .../launcher3/graphics/GradientView.java | 2 +- .../android/launcher3/graphics/ScrimView.java | 12 ++--- src/com/android/launcher3/util/Themes.java | 12 +++-- 12 files changed, 63 insertions(+), 89 deletions(-) diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 807d08af23..eaadd475a4 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -18,6 +18,10 @@ + + + + diff --git a/res/values/styles.xml b/res/values/styles.xml index dd6a680c55..f75ca4eeb1 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -26,10 +26,23 @@ true #FF757575 @layout/all_apps_search_container + #DDFFFFFF + false + + - - - diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index c0946a0e38..78030ce2a5 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -542,11 +542,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } public void setFolderLeaveBehindCell(int x, int y) { - - DeviceProfile grid = mLauncher.getDeviceProfile(); View child = getChildAt(x, y); - - mFolderLeaveBehind.setup(getResources().getDisplayMetrics(), grid, null, + mFolderLeaveBehind.setup(mLauncher, null, child.getMeasuredWidth(), child.getPaddingTop()); mFolderLeaveBehind.delegateCellX = x; diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 12170309b9..ad816afbc7 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -32,10 +32,6 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; @@ -55,7 +51,6 @@ import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Provider; import com.android.launcher3.util.SQLiteCacheHelper; -import com.android.launcher3.util.Themes; import com.android.launcher3.util.Thunk; import java.util.Collections; @@ -100,24 +95,14 @@ public class IconCache { @Thunk final UserManagerCompat mUserManager; private final LauncherAppsCompat mLauncherApps; private final HashMap mCache = - new HashMap(INITIAL_ICON_CACHE_CAPACITY); + new HashMap<>(INITIAL_ICON_CACHE_CAPACITY); private final int mIconDpi; @Thunk final IconDB mIconDb; @Thunk final Handler mWorkerHandler; - // The background color used for activity icons. Since these icons are displayed in all-apps - // and folders, this would be same as the light quantum panel background. This color - // is used to convert icons to RGB_565. - private final int mActivityBgColor; - // The background color used for package icons. These are displayed in widget tray, which - // has a dark quantum panel background. - private final int mPackageBgColor; private final BitmapFactory.Options mLowResOptions; - private Canvas mLowResCanvas; - private Paint mLowResPaint; - public IconCache(Context context, InvariantDeviceProfile inv) { mContext = context; mPackageManager = context.getPackageManager(); @@ -125,16 +110,11 @@ public class IconCache { mLauncherApps = LauncherAppsCompat.getInstance(mContext); mIconDpi = inv.fillResIconDpi; mIconDb = new IconDB(context, inv.iconBitmapSize); - mLowResCanvas = new Canvas(); - mLowResPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG); mIconProvider = Utilities.getOverrideObject( IconProvider.class, context, R.string.icon_provider_class); mWorkerHandler = new Handler(LauncherModel.getWorkerLooper()); - mActivityBgColor = Themes.getColorPrimary(context, R.style.LauncherTheme); - mPackageBgColor = Themes.getColorPrimary(context, R.style.WidgetContainerTheme); - mLowResOptions = new BitmapFactory.Options(); // Always prefer RGB_565 config for low res. If the bitmap has transparency, it will // automatically be loaded as ALPHA_8888. @@ -387,7 +367,7 @@ public class IconCache { entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, app.getUser()); mCache.put(key, entry); - Bitmap lowResIcon = generateLowResIcon(entry.icon, mActivityBgColor); + Bitmap lowResIcon = generateLowResIcon(entry.icon); ContentValues values = newContentValues(entry.icon, lowResIcon, entry.title.toString(), app.getApplicationInfo().packageName); addIconToDB(values, app.getComponentName(), info, userSerial); @@ -637,7 +617,7 @@ public class IconCache { // only keep the low resolution icon instead of the larger full-sized icon Bitmap icon = LauncherIcons.createBadgedIconBitmap( appInfo.loadIcon(mPackageManager), user, mContext, appInfo.targetSdkVersion); - Bitmap lowResIcon = generateLowResIcon(icon, mPackageBgColor); + Bitmap lowResIcon = generateLowResIcon(icon); entry.title = appInfo.loadLabel(mPackageManager); entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); entry.icon = useLowResIcon ? lowResIcon : icon; @@ -769,7 +749,7 @@ public class IconCache { } private static final class IconDB extends SQLiteCacheHelper { - private final static int DB_VERSION = 13; + private final static int DB_VERSION = 14; private final static int RELEASE_VERSION = DB_VERSION + (FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? 0 : 1); @@ -822,24 +802,10 @@ public class IconCache { /** * Generates a new low-res icon given a high-res icon. */ - private Bitmap generateLowResIcon(Bitmap icon, int lowResBackgroundColor) { - if (lowResBackgroundColor == Color.TRANSPARENT) { - return Bitmap.createScaledBitmap(icon, - icon.getWidth() / LOW_RES_SCALE_FACTOR, - icon.getHeight() / LOW_RES_SCALE_FACTOR, true); - } else { - Bitmap lowResIcon = Bitmap.createBitmap(icon.getWidth() / LOW_RES_SCALE_FACTOR, - icon.getHeight() / LOW_RES_SCALE_FACTOR, Bitmap.Config.RGB_565); - synchronized (this) { - mLowResCanvas.setBitmap(lowResIcon); - mLowResCanvas.drawColor(lowResBackgroundColor); - mLowResCanvas.drawBitmap(icon, new Rect(0, 0, icon.getWidth(), icon.getHeight()), - new Rect(0, 0, lowResIcon.getWidth(), lowResIcon.getHeight()), - mLowResPaint); - mLowResCanvas.setBitmap(null); - } - return lowResIcon; - } + private Bitmap generateLowResIcon(Bitmap icon) { + return Bitmap.createScaledBitmap(icon, + icon.getWidth() / LOW_RES_SCALE_FACTOR, + icon.getHeight() / LOW_RES_SCALE_FACTOR, true); } private static Bitmap loadIconNoResize(Cursor c, int iconIndex, BitmapFactory.Options options) { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 5fe6c14285..22aff64ac1 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -491,13 +491,6 @@ public class Launcher extends BaseActivity mExtractedColors.load(this); mHotseat.updateColor(mExtractedColors, !mPaused); mWorkspace.getPageIndicator().updateColor(mExtractedColors); - boolean lightStatusBar = (FeatureFlags.LIGHT_STATUS_BAR && - mExtractedColors.getColor(ExtractedColors.STATUS_BAR_INDEX) == - ExtractedColors.DEFAULT_LIGHT); - // It's possible that All Apps is visible when this is run, - // so always use light status bar in that case. Only change nav bar color to status bar - // color when All Apps is visible. - activateLightSystemBars(lightStatusBar || isAllAppsVisible(), true, isAllAppsVisible()); } } diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index b006453c2e..61c970789d 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -650,11 +650,11 @@ public final class Utilities { /** * @return creates a new alpha mask bitmap out of an existing bitmap */ - public static Bitmap convertToAlphaMask(Bitmap b, float applyAlpha) { + public static Bitmap convertToAlphaMask(Bitmap b, int applyAlpha) { Bitmap a = Bitmap.createBitmap(b.getWidth(), b.getHeight(), Bitmap.Config.ALPHA_8); Canvas c = new Canvas(a); Paint paint = new Paint(); - paint.setAlpha((int) (255f * applyAlpha)); + paint.setAlpha(applyAlpha); c.drawBitmap(b, 0f, 0f, paint); return a; } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 672203cc50..ea4a662d38 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -3166,11 +3166,8 @@ public class Workspace extends PagedView this.cellX = cellX; this.cellY = cellY; - DeviceProfile grid = mLauncher.getDeviceProfile(); BubbleTextView cell = (BubbleTextView) layout.getChildAt(cellX, cellY); - - bg.setup(getResources().getDisplayMetrics(), grid, null, - cell.getMeasuredWidth(), cell.getPaddingTop()); + bg.setup(mLauncher, null, cell.getMeasuredWidth(), cell.getPaddingTop()); // The full preview background should appear behind the icon bg.isClipping = false; diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 5182a5b432..4f2e3d73e0 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -71,6 +71,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul private final Launcher mLauncher; private final VerticalPullDetector mDetector; private final ArgbEvaluator mEvaluator; + private final boolean mIsDarkTheme; // Animation in this class is controlled by a single variable {@link mProgress}. // Visually, it represents top y coordinate of the all apps container if multiplied with @@ -112,6 +113,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul mEvaluator = new ArgbEvaluator(); mAllAppsBackgroundColor = Themes.getAttrColor(l, android.R.attr.colorPrimary); mLauncher.getExtractedColors().addOnChangeListener(this); + mIsDarkTheme = Themes.getAttrBoolean(mLauncher, R.attr.isPrimaryColorDark); } @Override @@ -275,9 +277,9 @@ public class AllAppsTransitionController implements TouchController, VerticalPul } private void updateLightStatusBar(float shift) { - // Do not modify status bar on landscape as all apps is not full bleed. - if (!FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS - && mLauncher.getDeviceProfile().isVerticalBarLayout()) { + // Do not modify status bar in dark theme or on landscape as all apps is not full bleed. + if (mIsDarkTheme || (!FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS + && mLauncher.getDeviceProfile().isVerticalBarLayout())) { return; } // Use a light status bar (dark icons) if all apps is behind at least half of the status diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index d795c5628e..236bf24a18 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -36,8 +36,10 @@ import android.graphics.Region; import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.os.Parcelable; +import android.support.v4.graphics.ColorUtils; import android.util.AttributeSet; import android.util.DisplayMetrics; +import android.util.Log; import android.util.Property; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -75,6 +77,7 @@ import com.android.launcher3.badge.FolderBadgeInfo; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragView; +import com.android.launcher3.util.Themes; import com.android.launcher3.util.Thunk; import com.android.launcher3.widget.PendingAddShortcutInfo; @@ -384,14 +387,11 @@ public class FolderIcon extends FrameLayout implements FolderListener { private void computePreviewDrawingParams(int drawableSize, int totalSize) { if (mIntrinsicIconSize != drawableSize || mTotalWidth != totalSize || mPrevTopPadding != getPaddingTop()) { - DeviceProfile grid = mLauncher.getDeviceProfile(); - mIntrinsicIconSize = drawableSize; mTotalWidth = totalSize; mPrevTopPadding = getPaddingTop(); - mBackground.setup(getResources().getDisplayMetrics(), grid, this, mTotalWidth, - getPaddingTop()); + mBackground.setup(mLauncher, this, mTotalWidth, getPaddingTop()); mPreviewLayoutRule.init(mBackground.previewSize, mIntrinsicIconSize, Utilities.isRtl(getResources())); @@ -544,6 +544,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { private float mScale = 1f; private float mColorMultiplier = 1f; + private int mBgColor; private float mStrokeWidth; private int mStrokeAlpha = MAX_BG_OPACITY; private View mInvalidateDelegate; @@ -567,7 +568,6 @@ public class FolderIcon extends FrameLayout implements FolderListener { // Expressed on a scale from 0 to 255. private static final int BG_OPACITY = 160; private static final int MAX_BG_OPACITY = 225; - private static final int BG_INTENSITY = 245; private static final int SHADOW_OPACITY = 40; ValueAnimator mScaleAnimator; @@ -587,10 +587,12 @@ public class FolderIcon extends FrameLayout implements FolderListener { } }; - public void setup(DisplayMetrics dm, DeviceProfile grid, View invalidateDelegate, + public void setup(Launcher launcher, View invalidateDelegate, int availableSpace, int topPadding) { mInvalidateDelegate = invalidateDelegate; + mBgColor = Themes.getAttrColor(launcher, android.R.attr.colorPrimary); + DeviceProfile grid = launcher.getDeviceProfile(); final int previewSize = grid.folderIconSizePx; final int previewPadding = grid.folderIconPreviewPadding; @@ -600,7 +602,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { basePreviewOffsetY = previewPadding + grid.folderBackgroundOffset + topPadding; // Stroke width is 1dp - mStrokeWidth = dm.density; + mStrokeWidth = launcher.getResources().getDisplayMetrics().density; float radius = getScaledRadius(); float shadowRadius = radius + mStrokeWidth; @@ -655,7 +657,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { public void drawBackground(Canvas canvas) { mPaint.setStyle(Paint.Style.FILL); int alpha = (int) Math.min(MAX_BG_OPACITY, BG_OPACITY * mColorMultiplier); - mPaint.setColor(Color.argb(alpha, BG_INTENSITY, BG_INTENSITY, BG_INTENSITY)); + mPaint.setColor(ColorUtils.setAlphaComponent(mBgColor, alpha)); drawCircle(canvas, 0 /* deltaRadius */); @@ -700,7 +702,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { mStrokeAlphaAnimator.cancel(); } mStrokeAlphaAnimator = ObjectAnimator - .ofArgb(this, STROKE_ALPHA, MAX_BG_OPACITY / 2, MAX_BG_OPACITY) + .ofInt(this, STROKE_ALPHA, MAX_BG_OPACITY / 2, MAX_BG_OPACITY) .setDuration(100); mStrokeAlphaAnimator.addListener(new AnimatorListenerAdapter() { @Override @@ -712,7 +714,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { } public void drawBackgroundStroke(Canvas canvas) { - mPaint.setColor(Color.argb(mStrokeAlpha, BG_INTENSITY, BG_INTENSITY, BG_INTENSITY)); + mPaint.setColor(ColorUtils.setAlphaComponent(mBgColor, mStrokeAlpha)); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(mStrokeWidth); drawCircle(canvas, 1 /* deltaRadius */); diff --git a/src/com/android/launcher3/graphics/GradientView.java b/src/com/android/launcher3/graphics/GradientView.java index 8f16e9366a..8f9f871a40 100644 --- a/src/com/android/launcher3/graphics/GradientView.java +++ b/src/com/android/launcher3/graphics/GradientView.java @@ -42,7 +42,7 @@ public class GradientView extends View { private static final int DEFAULT_COLOR = Color.WHITE; private static final float GRADIENT_ALPHA_MASK_LENGTH_DP = 300; - private static final float FINAL_GRADIENT_ALPHA = 0.75f; + private static final int FINAL_GRADIENT_ALPHA = 0xBF; private static final boolean DEBUG = false; private static Bitmap sFinalGradientMask; diff --git a/src/com/android/launcher3/graphics/ScrimView.java b/src/com/android/launcher3/graphics/ScrimView.java index 5c739ac99c..2c5b9edb7c 100644 --- a/src/com/android/launcher3/graphics/ScrimView.java +++ b/src/com/android/launcher3/graphics/ScrimView.java @@ -32,6 +32,7 @@ import android.view.animation.Interpolator; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.util.Themes; public class ScrimView extends View { @@ -39,9 +40,6 @@ public class ScrimView extends View { private static final int MASK_HEIGHT_DP = 300; private static final float MASK_START_LENGTH_FACTOR = 1f; - private static final float FINAL_ALPHA = 0.87f; - private static final int SCRIM_COLOR = ColorUtils.setAlphaComponent( - Color.WHITE, (int) (FINAL_ALPHA * 255)); private static final boolean APPLY_ALPHA = true; private static Bitmap sFinalScrimMask; @@ -63,18 +61,20 @@ public class ScrimView extends View { super(context, attrs); mMaskHeight = Utilities.pxFromDp(MASK_HEIGHT_DP, getResources().getDisplayMetrics()); mHeadStart = (int) (mMaskHeight * MASK_START_LENGTH_FACTOR); - mPaint.setColor(SCRIM_COLOR); mAlphaStart = Launcher.getLauncher(context) .getDeviceProfile().isVerticalBarLayout() ? 0 : 55; + int scrimColor = Themes.getAttrColor(context, R.attr.allAppsScrimColor); + int scrimAlpha = Color.alpha(scrimColor); + mPaint.setColor(scrimColor); if (sFinalScrimMask == null) { sFinalScrimMask = Utilities.convertToAlphaMask( - Utilities.createOnePixBitmap(), FINAL_ALPHA); + Utilities.createOnePixBitmap(), scrimAlpha); } if (sAlphaScrimMask == null) { Bitmap alphaMaskFromResource = BitmapFactory.decodeResource(getResources(), R.drawable.all_apps_alpha_mask); - sAlphaScrimMask = Utilities.convertToAlphaMask(alphaMaskFromResource, FINAL_ALPHA); + sAlphaScrimMask = Utilities.convertToAlphaMask(alphaMaskFromResource, scrimAlpha); } } diff --git a/src/com/android/launcher3/util/Themes.java b/src/com/android/launcher3/util/Themes.java index d863339980..9cf45b0c7f 100644 --- a/src/com/android/launcher3/util/Themes.java +++ b/src/com/android/launcher3/util/Themes.java @@ -20,7 +20,6 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.ColorMatrix; -import android.view.ContextThemeWrapper; /** * Various utility methods associated with theming. @@ -31,10 +30,6 @@ public class Themes { return getAttrColor(context, android.R.attr.colorAccent); } - public static int getColorPrimary(Context context, int theme) { - return getAttrColor(new ContextThemeWrapper(context, theme), android.R.attr.colorPrimary); - } - public static int getAttrColor(Context context, int attr) { TypedArray ta = context.obtainStyledAttributes(new int[]{attr}); int colorAccent = ta.getColor(0, 0); @@ -42,6 +37,13 @@ public class Themes { return colorAccent; } + public static boolean getAttrBoolean(Context context, int attr) { + TypedArray ta = context.obtainStyledAttributes(new int[]{attr}); + boolean value = ta.getBoolean(0, false); + ta.recycle(); + return value; + } + /** * Returns the alpha corresponding to the theme attribute {@param attr}, in the range [0, 255]. */ From 477b8cc1b457b66a432f3a2fe062b76127860108 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 25 May 2017 09:07:08 -0700 Subject: [PATCH 110/446] Fixing string not correctly marked as non-translatable Bug: 38371442 Change-Id: I79a679d461e422dbb4e4832192ac40e6c2d509de --- res/values-bn-rBD/config.xml | 12 ------------ res/values-bn/config.xml | 13 ------------- res/values-gu-rIN/config.xml | 12 ------------ res/values-gu/config.xml | 13 ------------- res/values-kn-rIN/config.xml | 12 ------------ res/values-kn/config.xml | 13 ------------- res/values-ml-rIN/config.xml | 12 ------------ res/values-ml/config.xml | 13 ------------- res/values-mr-rIN/config.xml | 12 ------------ res/values-mr/config.xml | 13 ------------- res/values-ne-rNP/config.xml | 12 ------------ res/values-ne/config.xml | 13 ------------- res/values-pa-rIN/config.xml | 12 ------------ res/values-pa/config.xml | 13 ------------- res/values-sw600dp/config.xml | 4 ---- res/values-sw720dp/config.xml | 11 ----------- res/values-te-rIN/config.xml | 12 ------------ res/values-te/config.xml | 13 ------------- res/values-ur-rPK/config.xml | 12 ------------ res/values-ur/config.xml | 13 ------------- res/values/config.xml | 21 +++++++++++---------- res/values/strings.xml | 9 +++++++++ 22 files changed, 20 insertions(+), 250 deletions(-) delete mode 100644 res/values-bn-rBD/config.xml delete mode 100644 res/values-bn/config.xml delete mode 100644 res/values-gu-rIN/config.xml delete mode 100644 res/values-gu/config.xml delete mode 100644 res/values-kn-rIN/config.xml delete mode 100644 res/values-kn/config.xml delete mode 100644 res/values-ml-rIN/config.xml delete mode 100644 res/values-ml/config.xml delete mode 100644 res/values-mr-rIN/config.xml delete mode 100644 res/values-mr/config.xml delete mode 100644 res/values-ne-rNP/config.xml delete mode 100644 res/values-ne/config.xml delete mode 100644 res/values-pa-rIN/config.xml delete mode 100644 res/values-pa/config.xml delete mode 100644 res/values-sw600dp/config.xml delete mode 100644 res/values-sw720dp/config.xml delete mode 100644 res/values-te-rIN/config.xml delete mode 100644 res/values-te/config.xml delete mode 100644 res/values-ur-rPK/config.xml delete mode 100644 res/values-ur/config.xml diff --git a/res/values-bn-rBD/config.xml b/res/values-bn-rBD/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-bn-rBD/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-bn/config.xml b/res/values-bn/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-bn/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-gu-rIN/config.xml b/res/values-gu-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-gu-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-gu/config.xml b/res/values-gu/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-gu/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-kn-rIN/config.xml b/res/values-kn-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-kn-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-kn/config.xml b/res/values-kn/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-kn/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-ml-rIN/config.xml b/res/values-ml-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-ml-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-ml/config.xml b/res/values-ml/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-ml/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-mr-rIN/config.xml b/res/values-mr-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-mr-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-mr/config.xml b/res/values-mr/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-mr/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-ne-rNP/config.xml b/res/values-ne-rNP/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-ne-rNP/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-ne/config.xml b/res/values-ne/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-ne/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-pa-rIN/config.xml b/res/values-pa-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-pa-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-pa/config.xml b/res/values-pa/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-pa/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-sw600dp/config.xml b/res/values-sw600dp/config.xml deleted file mode 100644 index eb9af97938..0000000000 --- a/res/values-sw600dp/config.xml +++ /dev/null @@ -1,4 +0,0 @@ - - true - true - diff --git a/res/values-sw720dp/config.xml b/res/values-sw720dp/config.xml deleted file mode 100644 index 94cffcb551..0000000000 --- a/res/values-sw720dp/config.xml +++ /dev/null @@ -1,11 +0,0 @@ - - true - true - - - - 90 - - - false - diff --git a/res/values-te-rIN/config.xml b/res/values-te-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-te-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-te/config.xml b/res/values-te/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-te/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-ur-rPK/config.xml b/res/values-ur-rPK/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-ur-rPK/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-ur/config.xml b/res/values-ur/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-ur/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values/config.xml b/res/values/config.xml index 8f2590abc4..a467a5cccd 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -19,22 +19,23 @@ - + - M50,0L100,0 100,100 0,100 0,0z - M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z - M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0 - M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z + M50,0L100,0 100,100 0,100 0,0z + M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z + M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0 + M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z - + @string/icon_shape_system_default - Square - Squircle - Circle - Teardrop + @string/icon_shape_square + @string/icon_shape_squircle + @string/icon_shape_circle + @string/icon_shape_teardrop + diff --git a/res/values/strings.xml b/res/values/strings.xml index 3648e1516d..24a7b881ab 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -188,6 +188,15 @@ Change icon shape Use system default + + Square + + Squircle + + Circle + + Teardrop + Applying icon shape changes From 0ec2da54f8e5fd0faa85aebe1a9ea502a775b703 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 25 May 2017 16:42:18 +0000 Subject: [PATCH 111/446] Revert "Fixing string not correctly marked as non-translatable" This reverts commit 477b8cc1b457b66a432f3a2fe062b76127860108. Change-Id: I114f89c20d735d0e17cc93e8f78876bf8a388a6a --- res/values-bn-rBD/config.xml | 12 ++++++++++++ res/values-bn/config.xml | 13 +++++++++++++ res/values-gu-rIN/config.xml | 12 ++++++++++++ res/values-gu/config.xml | 13 +++++++++++++ res/values-kn-rIN/config.xml | 12 ++++++++++++ res/values-kn/config.xml | 13 +++++++++++++ res/values-ml-rIN/config.xml | 12 ++++++++++++ res/values-ml/config.xml | 13 +++++++++++++ res/values-mr-rIN/config.xml | 12 ++++++++++++ res/values-mr/config.xml | 13 +++++++++++++ res/values-ne-rNP/config.xml | 12 ++++++++++++ res/values-ne/config.xml | 13 +++++++++++++ res/values-pa-rIN/config.xml | 12 ++++++++++++ res/values-pa/config.xml | 13 +++++++++++++ res/values-sw600dp/config.xml | 4 ++++ res/values-sw720dp/config.xml | 11 +++++++++++ res/values-te-rIN/config.xml | 12 ++++++++++++ res/values-te/config.xml | 13 +++++++++++++ res/values-ur-rPK/config.xml | 12 ++++++++++++ res/values-ur/config.xml | 13 +++++++++++++ res/values/config.xml | 21 ++++++++++----------- res/values/strings.xml | 9 --------- 22 files changed, 250 insertions(+), 20 deletions(-) create mode 100644 res/values-bn-rBD/config.xml create mode 100644 res/values-bn/config.xml create mode 100644 res/values-gu-rIN/config.xml create mode 100644 res/values-gu/config.xml create mode 100644 res/values-kn-rIN/config.xml create mode 100644 res/values-kn/config.xml create mode 100644 res/values-ml-rIN/config.xml create mode 100644 res/values-ml/config.xml create mode 100644 res/values-mr-rIN/config.xml create mode 100644 res/values-mr/config.xml create mode 100644 res/values-ne-rNP/config.xml create mode 100644 res/values-ne/config.xml create mode 100644 res/values-pa-rIN/config.xml create mode 100644 res/values-pa/config.xml create mode 100644 res/values-sw600dp/config.xml create mode 100644 res/values-sw720dp/config.xml create mode 100644 res/values-te-rIN/config.xml create mode 100644 res/values-te/config.xml create mode 100644 res/values-ur-rPK/config.xml create mode 100644 res/values-ur/config.xml diff --git a/res/values-bn-rBD/config.xml b/res/values-bn-rBD/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-bn-rBD/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-bn/config.xml b/res/values-bn/config.xml new file mode 100644 index 0000000000..56f98c3563 --- /dev/null +++ b/res/values-bn/config.xml @@ -0,0 +1,13 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + + + diff --git a/res/values-gu-rIN/config.xml b/res/values-gu-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-gu-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-gu/config.xml b/res/values-gu/config.xml new file mode 100644 index 0000000000..56f98c3563 --- /dev/null +++ b/res/values-gu/config.xml @@ -0,0 +1,13 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + + + diff --git a/res/values-kn-rIN/config.xml b/res/values-kn-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-kn-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-kn/config.xml b/res/values-kn/config.xml new file mode 100644 index 0000000000..56f98c3563 --- /dev/null +++ b/res/values-kn/config.xml @@ -0,0 +1,13 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + + + diff --git a/res/values-ml-rIN/config.xml b/res/values-ml-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-ml-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-ml/config.xml b/res/values-ml/config.xml new file mode 100644 index 0000000000..56f98c3563 --- /dev/null +++ b/res/values-ml/config.xml @@ -0,0 +1,13 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + + + diff --git a/res/values-mr-rIN/config.xml b/res/values-mr-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-mr-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-mr/config.xml b/res/values-mr/config.xml new file mode 100644 index 0000000000..56f98c3563 --- /dev/null +++ b/res/values-mr/config.xml @@ -0,0 +1,13 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + + + diff --git a/res/values-ne-rNP/config.xml b/res/values-ne-rNP/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-ne-rNP/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-ne/config.xml b/res/values-ne/config.xml new file mode 100644 index 0000000000..56f98c3563 --- /dev/null +++ b/res/values-ne/config.xml @@ -0,0 +1,13 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + + + diff --git a/res/values-pa-rIN/config.xml b/res/values-pa-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-pa-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-pa/config.xml b/res/values-pa/config.xml new file mode 100644 index 0000000000..56f98c3563 --- /dev/null +++ b/res/values-pa/config.xml @@ -0,0 +1,13 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + + + diff --git a/res/values-sw600dp/config.xml b/res/values-sw600dp/config.xml new file mode 100644 index 0000000000..eb9af97938 --- /dev/null +++ b/res/values-sw600dp/config.xml @@ -0,0 +1,4 @@ + + true + true + diff --git a/res/values-sw720dp/config.xml b/res/values-sw720dp/config.xml new file mode 100644 index 0000000000..94cffcb551 --- /dev/null +++ b/res/values-sw720dp/config.xml @@ -0,0 +1,11 @@ + + true + true + + + + 90 + + + false + diff --git a/res/values-te-rIN/config.xml b/res/values-te-rIN/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-te-rIN/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-te/config.xml b/res/values-te/config.xml new file mode 100644 index 0000000000..56f98c3563 --- /dev/null +++ b/res/values-te/config.xml @@ -0,0 +1,13 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + + + diff --git a/res/values-ur-rPK/config.xml b/res/values-ur-rPK/config.xml new file mode 100644 index 0000000000..7ee78d01b5 --- /dev/null +++ b/res/values-ur-rPK/config.xml @@ -0,0 +1,12 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" + + + diff --git a/res/values-ur/config.xml b/res/values-ur/config.xml new file mode 100644 index 0000000000..56f98c3563 --- /dev/null +++ b/res/values-ur/config.xml @@ -0,0 +1,13 @@ + + + + + "M50,0L100,0 100,100 0,100 0,0z" + "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" + "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" + "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" + "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" + + + diff --git a/res/values/config.xml b/res/values/config.xml index a467a5cccd..8f2590abc4 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -19,23 +19,22 @@ - + - M50,0L100,0 100,100 0,100 0,0z - M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z - M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0 - M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z + M50,0L100,0 100,100 0,100 0,0z + M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z + M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0 + M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z - + @string/icon_shape_system_default - @string/icon_shape_square - @string/icon_shape_squircle - @string/icon_shape_circle - @string/icon_shape_teardrop + Square + Squircle + Circle + Teardrop - diff --git a/res/values/strings.xml b/res/values/strings.xml index 24a7b881ab..3648e1516d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -188,15 +188,6 @@ Change icon shape Use system default - - Square - - Squircle - - Circle - - Teardrop - Applying icon shape changes From 9d9dbcb1b80017f547b07bcd80de79a298bd80f6 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 25 May 2017 16:43:19 +0000 Subject: [PATCH 112/446] Revert "Revert "Fixing string not correctly marked as non-translatable"" This reverts commit 0ec2da54f8e5fd0faa85aebe1a9ea502a775b703. Change-Id: Id685c338ab5474e41cfd3792ef98b9cf4b0c4fba --- res/values-bn-rBD/config.xml | 12 ------------ res/values-bn/config.xml | 13 ------------- res/values-gu-rIN/config.xml | 12 ------------ res/values-gu/config.xml | 13 ------------- res/values-kn-rIN/config.xml | 12 ------------ res/values-kn/config.xml | 13 ------------- res/values-ml-rIN/config.xml | 12 ------------ res/values-ml/config.xml | 13 ------------- res/values-mr-rIN/config.xml | 12 ------------ res/values-mr/config.xml | 13 ------------- res/values-ne-rNP/config.xml | 12 ------------ res/values-ne/config.xml | 13 ------------- res/values-pa-rIN/config.xml | 12 ------------ res/values-pa/config.xml | 13 ------------- res/values-te-rIN/config.xml | 12 ------------ res/values-te/config.xml | 13 ------------- res/values-ur-rPK/config.xml | 12 ------------ res/values-ur/config.xml | 13 ------------- res/values/config.xml | 21 +++++++++++---------- res/values/strings.xml | 9 +++++++++ 20 files changed, 20 insertions(+), 235 deletions(-) delete mode 100644 res/values-bn-rBD/config.xml delete mode 100644 res/values-bn/config.xml delete mode 100644 res/values-gu-rIN/config.xml delete mode 100644 res/values-gu/config.xml delete mode 100644 res/values-kn-rIN/config.xml delete mode 100644 res/values-kn/config.xml delete mode 100644 res/values-ml-rIN/config.xml delete mode 100644 res/values-ml/config.xml delete mode 100644 res/values-mr-rIN/config.xml delete mode 100644 res/values-mr/config.xml delete mode 100644 res/values-ne-rNP/config.xml delete mode 100644 res/values-ne/config.xml delete mode 100644 res/values-pa-rIN/config.xml delete mode 100644 res/values-pa/config.xml delete mode 100644 res/values-te-rIN/config.xml delete mode 100644 res/values-te/config.xml delete mode 100644 res/values-ur-rPK/config.xml delete mode 100644 res/values-ur/config.xml diff --git a/res/values-bn-rBD/config.xml b/res/values-bn-rBD/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-bn-rBD/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-bn/config.xml b/res/values-bn/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-bn/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-gu-rIN/config.xml b/res/values-gu-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-gu-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-gu/config.xml b/res/values-gu/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-gu/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-kn-rIN/config.xml b/res/values-kn-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-kn-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-kn/config.xml b/res/values-kn/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-kn/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-ml-rIN/config.xml b/res/values-ml-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-ml-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-ml/config.xml b/res/values-ml/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-ml/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-mr-rIN/config.xml b/res/values-mr-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-mr-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-mr/config.xml b/res/values-mr/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-mr/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-ne-rNP/config.xml b/res/values-ne-rNP/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-ne-rNP/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-ne/config.xml b/res/values-ne/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-ne/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-pa-rIN/config.xml b/res/values-pa-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-pa-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-pa/config.xml b/res/values-pa/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-pa/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-te-rIN/config.xml b/res/values-te-rIN/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-te-rIN/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-te/config.xml b/res/values-te/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-te/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values-ur-rPK/config.xml b/res/values-ur-rPK/config.xml deleted file mode 100644 index 7ee78d01b5..0000000000 --- a/res/values-ur-rPK/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z" - - - diff --git a/res/values-ur/config.xml b/res/values-ur/config.xml deleted file mode 100644 index 56f98c3563..0000000000 --- a/res/values-ur/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - "M50,0L100,0 100,100 0,100 0,0z" - "M50,0L80,0 A20,20,0,0 1 100,20 L100,80 A20,20,0,0 1 80,100 L20,100 A20,20,0,0 1 0,80 L 0,20 A20,20,0,0 1 20,0z" - "M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z" - "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0" - "M50,0A50,30 0,0,1 100,30V70A50,30 0,0,1 0,70V30A50,30 0,0,1 50,0z" - - - diff --git a/res/values/config.xml b/res/values/config.xml index 8f2590abc4..a467a5cccd 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -19,22 +19,23 @@ - + - M50,0L100,0 100,100 0,100 0,0z - M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z - M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0 - M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z + M50,0L100,0 100,100 0,100 0,0z + M50,0 C10,0 0,10 0,50 0,90 10,100 50,100 90,100 100,90 100,50 100,10 90,0 50,0 Z + M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0 + M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z - + @string/icon_shape_system_default - Square - Squircle - Circle - Teardrop + @string/icon_shape_square + @string/icon_shape_squircle + @string/icon_shape_circle + @string/icon_shape_teardrop + diff --git a/res/values/strings.xml b/res/values/strings.xml index 3648e1516d..24a7b881ab 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -188,6 +188,15 @@ Change icon shape Use system default + + Square + + Squircle + + Circle + + Teardrop + Applying icon shape changes From 0ef74aba1a089443c4667f0c339e017916811c84 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 25 May 2017 10:46:47 -0700 Subject: [PATCH 113/446] Use View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR API now that it's available b/38431856 Change-Id: I6a5cc835f2d14661a312e30057ae88fe2e1f23fa --- src/com/android/launcher3/Launcher.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 4be25bb17e..17d401ca77 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -499,9 +499,6 @@ public class Launcher extends BaseActivity } } - // TODO: use platform flag on API >= 26 - private static final int SYSTEM_UI_FLAG_LIGHT_NAV_BAR = 0x10; - /** * Sets the status and/or nav bar to be light or not. Light status bar means dark icons. * @param isLight make sure the system bar is light. @@ -516,14 +513,14 @@ public class Launcher extends BaseActivity newSystemUiFlags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; } if (navBar && Utilities.isAtLeastO()) { - newSystemUiFlags |= SYSTEM_UI_FLAG_LIGHT_NAV_BAR; + newSystemUiFlags |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; } } else { if (statusBar) { newSystemUiFlags &= ~(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } if (navBar && Utilities.isAtLeastO()) { - newSystemUiFlags &= ~(SYSTEM_UI_FLAG_LIGHT_NAV_BAR); + newSystemUiFlags &= ~(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); } } From 27288381a1e29203cd9b1354ac0b25705e55ac9a Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Wed, 24 May 2017 15:35:09 -0700 Subject: [PATCH 114/446] Theming on Scrim- and GradientView Change-Id: I3070b54485a9476ffb71e325cdd45c2bd7ef5c9a --- src/com/android/launcher3/Launcher.java | 21 +++- .../allapps/AllAppsTransitionController.java | 19 +-- .../dynamicui/ColorExtractionService.java | 6 - .../launcher3/dynamicui/ExtractedColors.java | 15 --- .../dynamicui/WallpaperColorInfo.java | 113 ++++++++++++++++++ .../colorextraction/ColorExtractor.java | 108 ----------------- .../colorextraction/types/ExtractionType.java | 15 ++- .../colorextraction/types/Tonal.java | 18 +-- .../launcher3/graphics/GradientView.java | 61 ++++++---- .../android/launcher3/graphics/ScrimView.java | 22 ++-- 10 files changed, 199 insertions(+), 199 deletions(-) create mode 100644 src/com/android/launcher3/dynamicui/WallpaperColorInfo.java delete mode 100644 src/com/android/launcher3/dynamicui/colorextraction/ColorExtractor.java diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 22aff64ac1..3ef5a87468 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -99,6 +99,7 @@ import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.dragndrop.PinItemDragListener; import com.android.launcher3.dynamicui.ExtractedColors; +import com.android.launcher3.dynamicui.WallpaperColorInfo; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.keyboard.CustomActionsPopup; @@ -149,7 +150,8 @@ import java.util.Set; public class Launcher extends BaseActivity implements LauncherExterns, View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, View.OnTouchListener, LauncherProviderChangeListener, - AccessibilityManager.AccessibilityStateChangeListener { + AccessibilityManager.AccessibilityStateChangeListener, + WallpaperColorInfo.OnThemeChangeListener { public static final String TAG = "Launcher"; static final boolean LOGD = false; @@ -365,6 +367,10 @@ public class Launcher extends BaseActivity mLauncherCallbacks.preOnCreate(); } + WallpaperColorInfo wallpaperColorInfo = WallpaperColorInfo.getInstance(this); + wallpaperColorInfo.setOnThemeChangeListener(this); + overrideTheme(wallpaperColorInfo.isDark()); + super.onCreate(savedInstanceState); LauncherAppState app = LauncherAppState.getInstance(this); @@ -463,6 +469,17 @@ public class Launcher extends BaseActivity } } + @Override + public void onThemeChanged() { + recreate(); + } + + protected void overrideTheme(boolean isDark) { + if (isDark) { + setTheme(R.style.LauncherThemeDark); + } + } + @Override public View findViewById(int id) { return mLauncherView.findViewById(id); @@ -1859,6 +1876,8 @@ public class Launcher extends BaseActivity ((AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE)) .removeAccessibilityStateChangeListener(this); + WallpaperColorInfo.getInstance(this).setOnThemeChangeListener(null); + LauncherAnimUtils.onDestroyActivity(); if (mLauncherCallbacks != null) { diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 4f2e3d73e0..77bc8cbda2 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -24,7 +24,6 @@ import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.anim.SpringAnimationHandler; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.dynamicui.ExtractedColors; import com.android.launcher3.graphics.GradientView; import com.android.launcher3.graphics.ScrimView; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; @@ -43,7 +42,7 @@ import com.android.launcher3.util.TouchController; * closer to top or closer to the page indicator. */ public class AllAppsTransitionController implements TouchController, VerticalPullDetector.Listener, - ExtractedColors.OnChangeListener, SearchUiManager.OnScrollRangeChangeListener { + SearchUiManager.OnScrollRangeChangeListener { private static final String TAG = "AllAppsTrans"; private static final boolean DBG = false; @@ -112,7 +111,6 @@ public class AllAppsTransitionController implements TouchController, VerticalPul mEvaluator = new ArgbEvaluator(); mAllAppsBackgroundColor = Themes.getAttrColor(l, android.R.attr.colorPrimary); - mLauncher.getExtractedColors().addOnChangeListener(this); mIsDarkTheme = Themes.getAttrBoolean(mLauncher, R.attr.isPrimaryColorDark); } @@ -293,7 +291,6 @@ public class AllAppsTransitionController implements TouchController, VerticalPul if (mGradientView == null) { mGradientView = (GradientView) mLauncher.findViewById(R.id.gradient_bg); mGradientView.setVisibility(View.VISIBLE); - onExtractedColorsChanged(); } mGradientView.setProgress(progress); @@ -305,20 +302,6 @@ public class AllAppsTransitionController implements TouchController, VerticalPul mScrimView.setProgress(progress); } - @Override - public void onExtractedColorsChanged() { - if (FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) { - if (mGradientView != null) { - int color1 = mLauncher.getExtractedColors() - .getColor(ExtractedColors.ALLAPPS_GRADIENT_MAIN_INDEX); - int color2 = mLauncher.getExtractedColors() - .getColor(ExtractedColors.ALLAPPS_GRADIENT_SECONDARY_INDEX); - mGradientView.onExtractedColorsChanged(color1, color2); - mGradientView.requestLayout(); - } - } - } - /** * @param progress value between 0 and 1, 0 shows all apps and 1 shows workspace */ diff --git a/src/com/android/launcher3/dynamicui/ColorExtractionService.java b/src/com/android/launcher3/dynamicui/ColorExtractionService.java index 349b4fff63..06a4dabddb 100644 --- a/src/com/android/launcher3/dynamicui/ColorExtractionService.java +++ b/src/com/android/launcher3/dynamicui/ColorExtractionService.java @@ -65,9 +65,6 @@ public class ColorExtractionService extends IntentService { if (FeatureFlags.QSB_IN_HOTSEAT || FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) { extractedColors.updateWallpaperThemePalette(null); - if (FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) { - extractedColors.updateAllAppsGradientPalette(this); - } } } else { // We extract colors for the hotseat and status bar separately, @@ -80,9 +77,6 @@ public class ColorExtractionService extends IntentService { if (FeatureFlags.QSB_IN_HOTSEAT || FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) { extractedColors.updateWallpaperThemePalette(getWallpaperPalette()); - if (FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) { - extractedColors.updateAllAppsGradientPalette(this); - } } } diff --git a/src/com/android/launcher3/dynamicui/ExtractedColors.java b/src/com/android/launcher3/dynamicui/ExtractedColors.java index 96fe31a734..2d8bb869f4 100644 --- a/src/com/android/launcher3/dynamicui/ExtractedColors.java +++ b/src/com/android/launcher3/dynamicui/ExtractedColors.java @@ -26,7 +26,6 @@ import android.util.Log; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.dynamicui.colorextraction.ColorExtractor; import java.util.ArrayList; import java.util.Arrays; @@ -165,20 +164,6 @@ public class ExtractedColors { ? defaultColor : wallpaperPalette.getVibrantColor(defaultColor)); } - public void updateAllAppsGradientPalette(Context context) { - // TODO use isAtLeastO when available - try { - WallpaperManager.class.getDeclaredMethod("getWallpaperColors", int.class); - ColorExtractor extractor = new ColorExtractor(context); - ColorExtractor.GradientColors colors = extractor.getColors(); - setColorAtIndex(ALLAPPS_GRADIENT_MAIN_INDEX, colors.getMainColor()); - setColorAtIndex(ALLAPPS_GRADIENT_SECONDARY_INDEX, colors.getSecondaryColor()); - } catch (NoSuchMethodException e) { - setColorAtIndex(ALLAPPS_GRADIENT_MAIN_INDEX, Color.WHITE); - setColorAtIndex(ALLAPPS_GRADIENT_SECONDARY_INDEX, Color.WHITE); - } - } - public void addOnChangeListener(OnChangeListener listener) { mListeners.add(listener); } diff --git a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java b/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java new file mode 100644 index 0000000000..20fc424313 --- /dev/null +++ b/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java @@ -0,0 +1,113 @@ +package com.android.launcher3.dynamicui; + +import android.content.Context; +import android.graphics.Color; +import android.support.v4.graphics.ColorUtils; +import android.util.Pair; + +import com.android.launcher3.compat.WallpaperColorsCompat; +import com.android.launcher3.compat.WallpaperManagerCompat; +import com.android.launcher3.dynamicui.colorextraction.types.ExtractionType; +import com.android.launcher3.dynamicui.colorextraction.types.Tonal; + +import java.util.ArrayList; + +import static android.app.WallpaperManager.FLAG_SYSTEM; + +public class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChangedListenerCompat { + + private static final int FALLBACK_COLOR = Color.WHITE; + 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 mListeners = new ArrayList<>(); + private final WallpaperManagerCompat mWallpaperManager; + private final ExtractionType mExtractionType; + private int mMainColor; + private int mSecondaryColor; + private boolean mIsDark; + private OnThemeChangeListener mOnThemeChangeListener; + + private WallpaperColorInfo(Context context) { + mWallpaperManager = WallpaperManagerCompat.getInstance(context); + mWallpaperManager.addOnColorsChangedListener(this); + mExtractionType = new Tonal(); // TODO create and use DefaultExtractionLogic + update(mWallpaperManager.getWallpaperColors(FLAG_SYSTEM)); + } + + public int getMainColor() { + return mMainColor; + } + + public int getSecondaryColor() { + return mSecondaryColor; + } + + public boolean isDark() { + return mIsDark; + } + + @Override + public void onColorsChanged(WallpaperColorsCompat colors, int which) { + if (which == FLAG_SYSTEM) { + boolean wasDarkTheme = mIsDark; + update(colors); + notifyChange(wasDarkTheme != mIsDark); + } + } + + private void update(WallpaperColorsCompat wallpaperColors) { + Pair colors = mExtractionType.extractInto(wallpaperColors); + if (colors != null) { + mMainColor = colors.first; + mSecondaryColor = colors.second; + } else { + mMainColor = FALLBACK_COLOR; + mSecondaryColor = FALLBACK_COLOR; + } + float[] hsl = new float[3]; + ColorUtils.colorToHSL(mMainColor, hsl); + mIsDark = hsl[2] < 0.2f; + } + + public void setOnThemeChangeListener(OnThemeChangeListener onThemeChangeListener) { + this.mOnThemeChangeListener = onThemeChangeListener; + } + + public void addOnChangeListener(OnChangeListener listener) { + mListeners.add(listener); + } + + public void removeOnChangeListener(OnChangeListener listener) { + mListeners.remove(listener); + } + + public void notifyChange(boolean themeChanged) { + if (themeChanged) { + if (mOnThemeChangeListener != null) { + mOnThemeChangeListener.onThemeChanged(); + } + } else { + for (OnChangeListener listener : mListeners) { + listener.onExtractedColorsChanged(this); + } + } + } + + public interface OnChangeListener { + void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo); + } + + public interface OnThemeChangeListener { + void onThemeChanged(); + } +} diff --git a/src/com/android/launcher3/dynamicui/colorextraction/ColorExtractor.java b/src/com/android/launcher3/dynamicui/colorextraction/ColorExtractor.java deleted file mode 100644 index 98558677ae..0000000000 --- a/src/com/android/launcher3/dynamicui/colorextraction/ColorExtractor.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.android.launcher3.dynamicui.colorextraction; - -import static android.app.WallpaperManager.FLAG_SYSTEM; - -import android.content.Context; -import android.graphics.Color; - -import com.android.launcher3.compat.WallpaperColorsCompat; -import com.android.launcher3.compat.WallpaperManagerCompat; -import com.android.launcher3.dynamicui.colorextraction.types.ExtractionType; -import com.android.launcher3.dynamicui.colorextraction.types.Tonal; - - -/** - * Class to process wallpaper colors and generate a tonal palette based on them. - * - * TODO remove this class if available by platform - */ -public class ColorExtractor { - private static final int FALLBACK_COLOR = Color.WHITE; - - private final Context mContext; - private int mMainFallbackColor = FALLBACK_COLOR; - private int mSecondaryFallbackColor = FALLBACK_COLOR; - private final GradientColors mSystemColors; - private final ExtractionType mExtractionType; - - public ColorExtractor(Context context) { - mContext = context; - mSystemColors = new GradientColors(); - mExtractionType = new Tonal(); - - extractFrom(WallpaperManagerCompat.getInstance(context).getWallpaperColors(FLAG_SYSTEM)); - } - - public GradientColors getColors() { - return mSystemColors; - } - - private void extractFrom(WallpaperColorsCompat inWallpaperColors) { - applyFallback(mSystemColors); - if (inWallpaperColors == null) { - return; - } - mExtractionType.extractInto(inWallpaperColors, mSystemColors); - } - - private void applyFallback(GradientColors outGradientColors) { - outGradientColors.setMainColor(mMainFallbackColor); - outGradientColors.setSecondaryColor(mSecondaryFallbackColor); - } - - public static class GradientColors { - private int mMainColor = FALLBACK_COLOR; - private int mSecondaryColor = FALLBACK_COLOR; - private boolean mSupportsDarkText; - - public void setMainColor(int mainColor) { - mMainColor = mainColor; - } - - public void setSecondaryColor(int secondaryColor) { - mSecondaryColor = secondaryColor; - } - - public void setSupportsDarkText(boolean supportsDarkText) { - mSupportsDarkText = supportsDarkText; - } - - public void set(GradientColors other) { - mMainColor = other.mMainColor; - mSecondaryColor = other.mSecondaryColor; - mSupportsDarkText = other.mSupportsDarkText; - } - - public int getMainColor() { - return mMainColor; - } - - public int getSecondaryColor() { - return mSecondaryColor; - } - - public boolean supportsDarkText() { - return mSupportsDarkText; - } - - @Override - public boolean equals(Object o) { - if (o == null || o.getClass() != getClass()) { - return false; - } - GradientColors other = (GradientColors) o; - return other.mMainColor == mMainColor && - other.mSecondaryColor == mSecondaryColor && - other.mSupportsDarkText == mSupportsDarkText; - } - - @Override - public int hashCode() { - int code = mMainColor; - code = 31 * code + mSecondaryColor; - code = 31 * code + (mSupportsDarkText ? 0 : 1); - return code; - } - } -} - diff --git a/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java b/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java index 88958a480b..ba7408f60a 100644 --- a/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java +++ b/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java @@ -1,23 +1,22 @@ package com.android.launcher3.dynamicui.colorextraction.types; +import android.support.annotation.Nullable; +import android.util.Pair; + import com.android.launcher3.compat.WallpaperColorsCompat; -import com.android.launcher3.dynamicui.colorextraction.ColorExtractor; /** * Interface to allow various color extraction implementations. - * - * TODO remove this class if available by platform */ public interface ExtractionType { /** * Executes color extraction by reading WallpaperColors and setting - * main and secondary colors on GradientColors. + * main and secondary colors. * - * @param inWallpaperColors where to read from - * @param outGradientColors object that should receive the colors + * @param wallpaperColors where to read from + * @return a pair of main and secondary color */ - void extractInto(WallpaperColorsCompat inWallpaperColors, - ColorExtractor.GradientColors outGradientColors); + @Nullable Pair extractInto(WallpaperColorsCompat wallpaperColors); } diff --git a/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java b/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java index 800dcd2039..7c131f117e 100644 --- a/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java +++ b/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java @@ -9,7 +9,6 @@ import android.util.Pair; import android.util.SparseIntArray; import com.android.launcher3.compat.WallpaperColorsCompat; -import com.android.launcher3.dynamicui.colorextraction.ColorExtractor; import java.util.ArrayList; import java.util.Collections; @@ -33,11 +32,13 @@ public class Tonal implements ExtractionType { private static final float MIN_COLOR_OCCURRENCE = 0.1f; private static final float MIN_LUMINOSITY = 0.5f; - public void extractInto( - WallpaperColorsCompat wallpaperColors, ColorExtractor.GradientColors gradientColors) { + public @Nullable Pair extractInto(WallpaperColorsCompat wallpaperColors) { + if (wallpaperColors == null) { + return null; + } SparseIntArray colorsArray = wallpaperColors.getColors(); if (colorsArray.size() == 0) { - return; + return null; } // Tonal is not really a sort, it takes a color from the extracted // palette and finds a best fit amongst a collection of pre-defined @@ -91,13 +92,13 @@ public class Tonal implements ExtractionType { // Fall back to population sort if we couldn't find a tonal palette if (palette == null) { Log.w(TAG, "Could not find a tonal palette!"); - return; + return null; } int fitIndex = bestFit(palette, hsl[0], hsl[1], hsl[2]); if (fitIndex == -1) { Log.w(TAG, "Could not find best fit!"); - return; + return null; } float[] h = fit(palette.h, hsl[0], fitIndex, Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY); @@ -108,12 +109,13 @@ public class Tonal implements ExtractionType { hsl[0] = fract(h[0]) * 360.0f; hsl[1] = s[0]; hsl[2] = l[0]; - gradientColors.setMainColor(ColorUtils.HSLToColor(hsl)); + int mainColor = ColorUtils.HSLToColor(hsl); hsl[0] = fract(h[1]) * 360.0f; hsl[1] = s[1]; hsl[2] = l[1]; - gradientColors.setSecondaryColor(ColorUtils.HSLToColor(hsl)); + int secondaryColor = ColorUtils.HSLToColor(hsl); + return new Pair<>(mainColor, secondaryColor); } private static void populationSort(@NonNull List> wallpaperColors) { diff --git a/src/com/android/launcher3/graphics/GradientView.java b/src/com/android/launcher3/graphics/GradientView.java index 8f9f871a40..9dd9504540 100644 --- a/src/com/android/launcher3/graphics/GradientView.java +++ b/src/com/android/launcher3/graphics/GradientView.java @@ -33,20 +33,20 @@ import android.view.animation.Interpolator; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.dynamicui.WallpaperColorInfo; /** * Draws a translucent radial gradient background from an initial state with progress 0.0 to a * final state with progress 1.0; */ -public class GradientView extends View { +public class GradientView extends View implements WallpaperColorInfo.OnChangeListener { private static final int DEFAULT_COLOR = Color.WHITE; private static final float GRADIENT_ALPHA_MASK_LENGTH_DP = 300; - private static final int FINAL_GRADIENT_ALPHA = 0xBF; private static final boolean DEBUG = false; - private static Bitmap sFinalGradientMask; - private static Bitmap sAlphaGradientMask; + private final Bitmap mFinalGradientMask; + private final Bitmap mAlphaGradientMask; private int mColor1 = DEFAULT_COLOR; private int mColor2 = DEFAULT_COLOR; @@ -61,30 +61,48 @@ public class GradientView extends View { private final Paint mDebugPaint = DEBUG ? new Paint() : null; private final Interpolator mAccelerator = new AccelerateInterpolator(); private final float mAlphaStart; + private final WallpaperColorInfo mWallpaperColorInfo; public GradientView(Context context, AttributeSet attrs) { super(context, attrs); this.mAppContext = context.getApplicationContext(); this.mMaskHeight = Utilities.pxFromDp(GRADIENT_ALPHA_MASK_LENGTH_DP, mAppContext.getResources().getDisplayMetrics()); - this.mAlphaStart = Launcher.getLauncher(context) - .getDeviceProfile().isVerticalBarLayout() ? 0 : 100; + Launcher launcher = Launcher.getLauncher(context); + this.mAlphaStart = launcher.getDeviceProfile().isVerticalBarLayout() ? 0 : 100; + this.mWallpaperColorInfo = WallpaperColorInfo.getInstance(launcher); + updateColors(); - if (sFinalGradientMask == null) { - sFinalGradientMask = Utilities.convertToAlphaMask( - Utilities.createOnePixBitmap(), FINAL_GRADIENT_ALPHA); - } - if (sAlphaGradientMask == null) { - Bitmap alphaMaskFromResource = BitmapFactory.decodeResource(context.getResources(), - R.drawable.all_apps_alpha_mask); - sAlphaGradientMask = Utilities.convertToAlphaMask( - alphaMaskFromResource, FINAL_GRADIENT_ALPHA); - } + int finalAlpha = 0xBF; + mFinalGradientMask = Utilities.convertToAlphaMask( + Utilities.createOnePixBitmap(), finalAlpha); + Bitmap alphaMaskFromResource = BitmapFactory.decodeResource(context.getResources(), + R.drawable.all_apps_alpha_mask); + mAlphaGradientMask = Utilities.convertToAlphaMask( + alphaMaskFromResource, finalAlpha); } - public void onExtractedColorsChanged(int color1, int color2) { - this.mColor1 = color1; - this.mColor2 = color2; + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + mWallpaperColorInfo.addOnChangeListener(this); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mWallpaperColorInfo.removeOnChangeListener(this); + } + + @Override + public void onExtractedColorsChanged(WallpaperColorInfo info) { + updateColors(); + invalidate(); + } + + private void updateColors() { + this.mColor1 = mWallpaperColorInfo.getMainColor(); + this.mColor2 = mWallpaperColorInfo.getSecondaryColor(); if (mWidth + mHeight > 0) { createRadialShader(); } @@ -130,8 +148,8 @@ public class GradientView extends View { mPaint.setAlpha((int) (mAlphaStart + interpolatedAlpha)); mAlphaMaskRect.set(0, startMaskY, mWidth, startMaskY + mMaskHeight); mFinalMaskRect.set(0, startMaskY + mMaskHeight, mWidth, mHeight); - canvas.drawBitmap(sAlphaGradientMask, null, mAlphaMaskRect, mPaint); - canvas.drawBitmap(sFinalGradientMask, null, mFinalMaskRect, mPaint); + canvas.drawBitmap(mAlphaGradientMask, null, mAlphaMaskRect, mPaint); + canvas.drawBitmap(mFinalGradientMask, null, mFinalMaskRect, mPaint); if (DEBUG) { mDebugPaint.setColor(0xFF00FF00); @@ -139,5 +157,4 @@ public class GradientView extends View { canvas.drawLine(0, startMaskY + mMaskHeight, mWidth, startMaskY + mMaskHeight, mDebugPaint); } } - } \ No newline at end of file diff --git a/src/com/android/launcher3/graphics/ScrimView.java b/src/com/android/launcher3/graphics/ScrimView.java index 2c5b9edb7c..6d1f30a410 100644 --- a/src/com/android/launcher3/graphics/ScrimView.java +++ b/src/com/android/launcher3/graphics/ScrimView.java @@ -42,8 +42,8 @@ public class ScrimView extends View { private static final float MASK_START_LENGTH_FACTOR = 1f; private static final boolean APPLY_ALPHA = true; - private static Bitmap sFinalScrimMask; - private static Bitmap sAlphaScrimMask; + private final Bitmap mFinalScrimMask; + private final Bitmap mAlphaScrimMask; private final int mMaskHeight; private int mVisibleHeight; @@ -67,15 +67,11 @@ public class ScrimView extends View { int scrimColor = Themes.getAttrColor(context, R.attr.allAppsScrimColor); int scrimAlpha = Color.alpha(scrimColor); mPaint.setColor(scrimColor); - if (sFinalScrimMask == null) { - sFinalScrimMask = Utilities.convertToAlphaMask( - Utilities.createOnePixBitmap(), scrimAlpha); - } - if (sAlphaScrimMask == null) { - Bitmap alphaMaskFromResource = BitmapFactory.decodeResource(getResources(), - R.drawable.all_apps_alpha_mask); - sAlphaScrimMask = Utilities.convertToAlphaMask(alphaMaskFromResource, scrimAlpha); - } + mFinalScrimMask = Utilities.convertToAlphaMask( + Utilities.createOnePixBitmap(), scrimAlpha); + Bitmap alphaMaskFromResource = BitmapFactory.decodeResource(getResources(), + R.drawable.all_apps_alpha_mask); + mAlphaScrimMask = Utilities.convertToAlphaMask(alphaMaskFromResource, scrimAlpha); } @Override @@ -106,8 +102,8 @@ public class ScrimView extends View { protected void onDraw(Canvas canvas) { mAlphaMaskRect.set(0, 0, getWidth(), mMaskHeight); mFinalMaskRect.set(0, mMaskHeight, getWidth(), getHeight()); - canvas.drawBitmap(sAlphaScrimMask, null, mAlphaMaskRect, mPaint); - canvas.drawBitmap(sFinalScrimMask, null, mFinalMaskRect, mPaint); + canvas.drawBitmap(mAlphaScrimMask, null, mAlphaMaskRect, mPaint); + canvas.drawBitmap(mFinalScrimMask, null, mFinalMaskRect, mPaint); if (DEBUG) { mDebugPaint.setColor(0xFF0000FF); From 1d0b0e25dcde8ff3abf3484871c72116581f70d8 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 19 May 2017 19:02:03 -0700 Subject: [PATCH 115/446] Log when App info or Widgets system shortcuts are tapped Sample output: D/UserEvent: action:LONGPRESS Source child:APP_ICON, grid(1,3), span(1,1), pageIdx=0 parent:WORKSPACE id=0 Elapsed container 135 ms session 7984 ms action 0 ms isInLandscapeMode false isInMultiWindowMode false D/UserEvent: action:TAP Source child:WIDGETS_BUTTON parent:DEEPSHORTCUTS Elapsed container 41 ms session 8906 ms action 0 ms isInLandscapeMode false isInMultiWindowMode false D/UserEvent: action:LONGPRESS Source child:APP_ICON, grid(1,3), span(1,1), pageIdx=0 parent:WORKSPACE id=0 Elapsed container 184 ms session 11297 ms action 0 ms isInLandscapeMode false isInMultiWindowMode false D/UserEvent: action:TAP Source child:APPINFO_TARGET parent:DEEPSHORTCUTS Elapsed container 678 ms session 11976 ms action 0 ms isInLandscapeMode false isInMultiWindowMode false Bug: 37430954 Change-Id: I526edbf1eea551eb8eaddbb27e52058804fee874 --- .../logging/UserEventDispatcher.java | 20 +++++++++++++++---- .../launcher3/popup/SystemShortcut.java | 10 ++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index 7585be613d..edbb88c934 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -21,6 +21,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.SystemClock; +import android.support.annotation.Nullable; import android.util.Log; import android.view.View; import android.view.ViewParent; @@ -90,7 +91,7 @@ public class UserEventDispatcher { /** * Recursively finds the parent of the given child which implements IconLogInfoProvider */ - public static LogContainerProvider getLaunchProviderRecursive(View v) { + public static LogContainerProvider getLaunchProviderRecursive(@Nullable View v) { ViewParent parent; if (v != null) { parent = v.getParent(); @@ -147,7 +148,11 @@ public class UserEventDispatcher { return event; } - public boolean fillInLogContainerData(LauncherEvent event, View v) { + /** + * Fills in the container data on the given event if the given view is not null. + * @return whether container data was added. + */ + private boolean fillInLogContainerData(LauncherEvent event, @Nullable View v) { // Fill in grid(x,y), pageIndex of the child and container type of the parent LogContainerProvider provider = getLaunchProviderRecursive(v); if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) { @@ -203,9 +208,16 @@ public class UserEventDispatcher { } public void logActionOnControl(int action, int controlType) { - LauncherEvent event = newLauncherEvent( - newTouchAction(action), newTarget(Target.Type.CONTROL)); + logActionOnControl(action, controlType, null); + } + + public void logActionOnControl(int action, int controlType, @Nullable View controlInContainer) { + final LauncherEvent event = controlInContainer == null + ? newLauncherEvent(newTouchAction(action), newTarget(Target.Type.CONTROL)) + : newLauncherEvent(newTouchAction(action), newTarget(Target.Type.CONTROL), + newTarget(Target.Type.CONTAINER)); event.srcTarget[0].controlType = controlType; + fillInLogContainerData(event, controlInContainer); dispatchUserEvent(event, null); } diff --git a/src/com/android/launcher3/popup/SystemShortcut.java b/src/com/android/launcher3/popup/SystemShortcut.java index a52d1d49b6..6254d2d008 100644 --- a/src/com/android/launcher3/popup/SystemShortcut.java +++ b/src/com/android/launcher3/popup/SystemShortcut.java @@ -13,18 +13,20 @@ import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.model.WidgetItem; import com.android.launcher3.util.PackageUserKey; -import com.android.launcher3.util.Themes; import com.android.launcher3.widget.WidgetsBottomSheet; import java.util.List; +import static com.android.launcher3.userevent.nano.LauncherLogProto.Action; +import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; + /** * Represents a system shortcut for a given app. The shortcut should have a static label and * icon, and an onClickListener that depends on the item that the shortcut services. * * Example system shortcuts, defined as inner classes, include Widgets and AppInfo. */ -public abstract class SystemShortcut { +public abstract class SystemShortcut extends ItemInfo { private final int mIconResId; private final int mLabelResId; @@ -66,6 +68,8 @@ public abstract class SystemShortcut { (WidgetsBottomSheet) launcher.getLayoutInflater().inflate( R.layout.widgets_bottom_sheet, launcher.getDragLayer(), false); widgetsBottomSheet.populateAndShow(itemInfo); + launcher.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP, + ControlType.WIDGETS_BUTTON, view); } }; } @@ -85,6 +89,8 @@ public abstract class SystemShortcut { Rect sourceBounds = launcher.getViewBounds(view); Bundle opts = launcher.getActivityLaunchOptions(view); InfoDropTarget.startDetailsActivityForInfo(itemInfo, launcher, null, sourceBounds, opts); + launcher.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP, + ControlType.APPINFO_TARGET, view); } }; } From c6e07299c2aafe9397324e0823311171a7b9b09e Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Thu, 25 May 2017 13:42:58 -0700 Subject: [PATCH 116/446] Providing a default color extraction implementation. Enabling FeatureFlag LAUNCHER3_GRADIENT_ALL_APPS Change-Id: I86d982344a4a04a79bde6dce714b1f0bff90f992 --- res/values/config.xml | 3 + ...nal.java => ColorExtractionAlgorithm.java} | 63 ++++++++++--------- .../dynamicui/WallpaperColorInfo.java | 6 +- .../colorextraction/types/ExtractionType.java | 22 ------- .../launcher3/config/FeatureFlags.java | 2 +- 5 files changed, 39 insertions(+), 57 deletions(-) rename src/com/android/launcher3/dynamicui/{colorextraction/types/Tonal.java => ColorExtractionAlgorithm.java} (90%) delete mode 100644 src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java diff --git a/res/values/config.xml b/res/values/config.xml index a467a5cccd..9b7c795cc2 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -105,6 +105,9 @@ + + + diff --git a/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java b/src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java similarity index 90% rename from src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java rename to src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java index 7c131f117e..5a0e78b12d 100644 --- a/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java +++ b/src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java @@ -1,5 +1,22 @@ -package com.android.launcher3.dynamicui.colorextraction.types; +/* + * 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. + */ +package com.android.launcher3.dynamicui; + +import android.content.Context; import android.graphics.Color; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -8,6 +25,8 @@ import android.util.Log; import android.util.Pair; import android.util.SparseIntArray; +import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.compat.WallpaperColorsCompat; import java.util.ArrayList; @@ -15,13 +34,16 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; - /** * Implementation of tonal color extraction - * - * TODO remove this class if available by platform - */ -public class Tonal implements ExtractionType { + **/ +public class ColorExtractionAlgorithm { + + public static ColorExtractionAlgorithm newInstance(Context context) { + return Utilities.getOverrideObject(ColorExtractionAlgorithm.class, + context.getApplicationContext(), R.string.color_extraction_impl_class); + } + private static final String TAG = "Tonal"; // Used for tonal palette fitting @@ -32,6 +54,9 @@ public class Tonal implements ExtractionType { private static final float MIN_COLOR_OCCURRENCE = 0.1f; private static final float MIN_LUMINOSITY = 0.5f; + public ColorExtractionAlgorithm() { + } + public @Nullable Pair extractInto(WallpaperColorsCompat wallpaperColors) { if (wallpaperColors == null) { return null; @@ -142,34 +167,12 @@ public class Tonal implements ExtractionType { float delta = v - data[index]; for (int i = 0; i < data.length; i++) { - fitData[i] = constrain(data[i] + delta, min, max); + fitData[i] = Utilities.boundToRange(data[i] + delta, min, max); } return fitData; } - // TODO no MathUtils - private static float constrain(float x, float min, float max) { - x = Math.min(x, max); - x = Math.max(x, min); - return x; - } - - /*function adjustSatLumForFit(val, points, fitIndex) { - var fitValue = lerpBetweenPoints(points, fitIndex); - var diff = val - fitValue; - - var newPoints = []; - for (var ii=0; ii 1) point[1] = 1; - if (point[1] < 0) point[1] = 0; - newPoints[ii] = point; - } - return newPoints; - }*/ - /** * Finds the closest color in a palette, given another HSL color * @@ -308,5 +311,5 @@ public class Tonal implements ExtractionType { new float[] { 0.241f, 0.316f, 0.46f, 0.586f, 0.655f, 0.7f, 0.75f, 0.8f, 0.84f, 0.88f } ) }; -} +} diff --git a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java b/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java index 20fc424313..ca85b6af1b 100644 --- a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java +++ b/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java @@ -7,8 +7,6 @@ import android.util.Pair; import com.android.launcher3.compat.WallpaperColorsCompat; import com.android.launcher3.compat.WallpaperManagerCompat; -import com.android.launcher3.dynamicui.colorextraction.types.ExtractionType; -import com.android.launcher3.dynamicui.colorextraction.types.Tonal; import java.util.ArrayList; @@ -31,7 +29,7 @@ public class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChange private final ArrayList mListeners = new ArrayList<>(); private final WallpaperManagerCompat mWallpaperManager; - private final ExtractionType mExtractionType; + private final ColorExtractionAlgorithm mExtractionType; private int mMainColor; private int mSecondaryColor; private boolean mIsDark; @@ -40,7 +38,7 @@ public class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChange private WallpaperColorInfo(Context context) { mWallpaperManager = WallpaperManagerCompat.getInstance(context); mWallpaperManager.addOnColorsChangedListener(this); - mExtractionType = new Tonal(); // TODO create and use DefaultExtractionLogic + mExtractionType = ColorExtractionAlgorithm.newInstance(context); update(mWallpaperManager.getWallpaperColors(FLAG_SYSTEM)); } diff --git a/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java b/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java deleted file mode 100644 index ba7408f60a..0000000000 --- a/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.android.launcher3.dynamicui.colorextraction.types; - -import android.support.annotation.Nullable; -import android.util.Pair; - -import com.android.launcher3.compat.WallpaperColorsCompat; - - -/** - * Interface to allow various color extraction implementations. - */ -public interface ExtractionType { - - /** - * Executes color extraction by reading WallpaperColors and setting - * main and secondary colors. - * - * @param wallpaperColors where to read from - * @return a pair of main and secondary color - */ - @Nullable Pair extractInto(WallpaperColorsCompat wallpaperColors); -} diff --git a/src_flags/com/android/launcher3/config/FeatureFlags.java b/src_flags/com/android/launcher3/config/FeatureFlags.java index 656246667a..ed169b6f18 100644 --- a/src_flags/com/android/launcher3/config/FeatureFlags.java +++ b/src_flags/com/android/launcher3/config/FeatureFlags.java @@ -39,7 +39,7 @@ public final class FeatureFlags { // When enabled the promise icon is visible in all apps while installation an app. public static boolean LAUNCHER3_PROMISE_APPS_IN_ALL_APPS = true; // When enabled uses the AllAppsRadialGradientAndScrimDrawable for all apps - public static boolean LAUNCHER3_GRADIENT_ALL_APPS = false; + public static boolean LAUNCHER3_GRADIENT_ALL_APPS = true; // When enabled allows use of physics based motions in the Launcher. public static boolean LAUNCHER3_PHYSICS = true; From 2518cfc36590c0bf4d650c8650fc0870eef1f4bf Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Tue, 30 May 2017 13:53:41 -0700 Subject: [PATCH 117/446] Distignuishing between hotseat/workspace on the logging for opening all apps via swipe/fling. b/38422894 Change-Id: I84a5fd8df38f70caf887eb0def905756059ccd93 --- .../launcher3/allapps/AllAppsTransitionController.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 77bc8cbda2..ba20135be6 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -93,6 +93,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul private AnimatorSet mCurrentAnimation; private boolean mNoIntercept; + private boolean mTouchEventStartedOnHotseat; // Used in discovery bounce animation to provide the transition without workspace changing. private boolean mIsTranslateWithoutWorkspace = false; @@ -118,6 +119,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul public boolean onControllerInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { mNoIntercept = false; + mTouchEventStartedOnHotseat = mLauncher.getDragLayer().isEventOverHotseat(ev); if (!mLauncher.isAllAppsVisible() && mLauncher.getWorkspace().workspaceInModalState()) { mNoIntercept = true; } else if (mLauncher.isAllAppsVisible() && @@ -210,6 +212,9 @@ public class AllAppsTransitionController implements TouchController, VerticalPul return; // early termination. } + final int containerType = mTouchEventStartedOnHotseat + ? ContainerType.HOTSEAT : ContainerType.WORKSPACE; + if (fling) { if (velocity < 0) { calculateDuration(velocity, mAppsView.getTranslationY()); @@ -218,7 +223,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul mLauncher.getUserEventDispatcher().logActionOnContainer( Action.Touch.FLING, Action.Direction.UP, - ContainerType.HOTSEAT); + containerType); } mLauncher.showAppsView(true /* animated */, false /* updatePredictedApps */, @@ -241,7 +246,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul mLauncher.getUserEventDispatcher().logActionOnContainer( Action.Touch.SWIPE, Action.Direction.UP, - ContainerType.HOTSEAT); + containerType); } mLauncher.showAppsView(true, /* animated */ false /* updatePredictedApps */, From 47559fb858221d99655188f51642f7644ca4fd37 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 30 May 2017 15:46:25 -0700 Subject: [PATCH 118/446] Import translations. DO NOT MERGE Change-Id: I64d7acaae108b79025a5a82514fbeac9eee785cf Auto-generated-cl: translation import --- res/values-af/strings.xml | 20 ++++++++++++-------- res/values-am/strings.xml | 20 ++++++++++++-------- res/values-ar/strings.xml | 20 ++++++++++++-------- res/values-az-rAZ/strings.xml | 20 ++++++++++++-------- res/values-b+sr+Latn/strings.xml | 20 ++++++++++++-------- res/values-be-rBY/strings.xml | 20 ++++++++++++-------- res/values-bg/strings.xml | 20 ++++++++++++-------- res/values-bn-rBD/strings.xml | 20 ++++++++++++-------- res/values-bs-rBA/strings.xml | 20 ++++++++++++-------- res/values-ca/strings.xml | 20 ++++++++++++-------- res/values-cs/strings.xml | 20 ++++++++++++-------- res/values-da/strings.xml | 20 ++++++++++++-------- res/values-de/strings.xml | 20 ++++++++++++-------- res/values-el/strings.xml | 20 ++++++++++++-------- res/values-en-rAU/strings.xml | 20 ++++++++++++-------- res/values-en-rGB/strings.xml | 20 ++++++++++++-------- res/values-en-rIN/strings.xml | 20 ++++++++++++-------- res/values-es-rUS/strings.xml | 20 ++++++++++++-------- res/values-es/strings.xml | 20 ++++++++++++-------- res/values-et-rEE/strings.xml | 20 ++++++++++++-------- res/values-eu-rES/strings.xml | 20 ++++++++++++-------- res/values-fa/strings.xml | 20 ++++++++++++-------- res/values-fi/strings.xml | 20 ++++++++++++-------- res/values-fr-rCA/strings.xml | 20 ++++++++++++-------- res/values-fr/strings.xml | 20 ++++++++++++-------- res/values-gl-rES/strings.xml | 20 ++++++++++++-------- res/values-gu-rIN/strings.xml | 20 ++++++++++++-------- res/values-hi/strings.xml | 20 ++++++++++++-------- res/values-hr/strings.xml | 20 ++++++++++++-------- res/values-hu/strings.xml | 20 ++++++++++++-------- res/values-hy-rAM/strings.xml | 20 ++++++++++++-------- res/values-in/strings.xml | 20 ++++++++++++-------- res/values-is-rIS/strings.xml | 20 ++++++++++++-------- res/values-it/strings.xml | 20 ++++++++++++-------- res/values-iw/strings.xml | 20 ++++++++++++-------- res/values-ja/strings.xml | 20 ++++++++++++-------- res/values-ka-rGE/strings.xml | 20 ++++++++++++-------- res/values-kk-rKZ/strings.xml | 20 ++++++++++++-------- res/values-km-rKH/strings.xml | 20 ++++++++++++-------- res/values-kn-rIN/strings.xml | 20 ++++++++++++-------- res/values-ko/strings.xml | 20 ++++++++++++-------- res/values-ky-rKG/strings.xml | 20 ++++++++++++-------- res/values-lo-rLA/strings.xml | 20 ++++++++++++-------- res/values-lt/strings.xml | 20 ++++++++++++-------- res/values-lv/strings.xml | 20 ++++++++++++-------- res/values-mk-rMK/strings.xml | 20 ++++++++++++-------- res/values-ml-rIN/strings.xml | 20 ++++++++++++-------- res/values-mn-rMN/strings.xml | 20 ++++++++++++-------- res/values-mr-rIN/strings.xml | 20 ++++++++++++-------- res/values-ms-rMY/strings.xml | 20 ++++++++++++-------- res/values-my-rMM/strings.xml | 20 ++++++++++++-------- res/values-nb/strings.xml | 20 ++++++++++++-------- res/values-ne-rNP/strings.xml | 20 ++++++++++++-------- res/values-nl/strings.xml | 20 ++++++++++++-------- res/values-pa-rIN/strings.xml | 22 +++++++++++++--------- res/values-pl/strings.xml | 20 ++++++++++++-------- res/values-pt-rPT/strings.xml | 20 ++++++++++++-------- res/values-pt/strings.xml | 20 ++++++++++++-------- res/values-ro/strings.xml | 20 ++++++++++++-------- res/values-ru/strings.xml | 20 ++++++++++++-------- res/values-si-rLK/strings.xml | 20 ++++++++++++-------- res/values-sk/strings.xml | 20 ++++++++++++-------- res/values-sl/strings.xml | 20 ++++++++++++-------- res/values-sq-rAL/strings.xml | 20 ++++++++++++-------- res/values-sr/strings.xml | 20 ++++++++++++-------- res/values-sv/strings.xml | 20 ++++++++++++-------- res/values-sw/strings.xml | 20 ++++++++++++-------- res/values-ta-rIN/strings.xml | 20 ++++++++++++-------- res/values-te-rIN/strings.xml | 20 ++++++++++++-------- res/values-th/strings.xml | 20 ++++++++++++-------- res/values-tl/strings.xml | 20 ++++++++++++-------- res/values-tr/strings.xml | 20 ++++++++++++-------- res/values-uk/strings.xml | 20 ++++++++++++-------- res/values-ur-rPK/strings.xml | 20 ++++++++++++-------- res/values-uz-rUZ/strings.xml | 20 ++++++++++++-------- res/values-vi/strings.xml | 20 ++++++++++++-------- res/values-zh-rCN/strings.xml | 20 ++++++++++++-------- res/values-zh-rHK/strings.xml | 20 ++++++++++++-------- res/values-zh-rTW/strings.xml | 20 ++++++++++++-------- res/values-zu/strings.xml | 20 ++++++++++++-------- 80 files changed, 961 insertions(+), 641 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index bd966c732b..fda7db19cc 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -70,8 +70,7 @@ "Vouer: %1$s" "Legstukke" "Muurpapiere" - - + "Home-instellings" "Gedeaktiveer deur jou administrateur" "Oorsig" "Laat toe dat tuisskerm gedraai word" @@ -85,6 +84,14 @@ "Gebruik stelselverstek" + + + + + + + + "Onbekend" @@ -121,10 +128,7 @@ "Legstukgrootte is verander na breedte %1$s hoogte %2$s" "Kortpaaie" "%1$d kortpaaie vir %2$s" - - - - - - + "%1$d kortpaaie en %2$d kennisgewings vir %3$s" + "Maak toe" + "Kennisgewing is toegemaak" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index dee2910619..ba39963f88 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -70,8 +70,7 @@ "አቃፊ፦ %1$s" "ፍርግሞች" "የግድግዳ ወረቀቶች" - - + "የመነሻ ቅንብሮች" "በእርስዎ አስተዳዳሪ የተሰናከለ" "አጠቃላይ ዕይታ" "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" @@ -85,6 +84,14 @@ "የሥርዓቱን ነባሪ ተጠቀም" + + + + + + + + "የማይታወቅ" @@ -121,10 +128,7 @@ "የመግብር መጠን ወደ ስፋት %1$s ቁመት %2$s ተለውጧል" "አቋራጮች" "%1$d%2$s አቋራጮች" - - - - - - + "%1$d አቋራጮች እና %2$d ማሳወቂያዎች ለ%3$s" + "አሰናብት" + "ማሳወቂያ ተሰናብቷል" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 94a5aead47..2852376638 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -70,8 +70,7 @@ "المجلد: %1$s" "الأدوات" "الخلفيات" - - + "إعدادات الصفحة الرئيسية" "عطَّل المشرف هذه الميزة" "نظرة عامة" "السماح بتدوير الشاشة الرئيسية" @@ -85,6 +84,14 @@ "استخدام الإعداد الافتراضي للنظام" + + + + + + + + "غير معروفة" @@ -121,10 +128,7 @@ "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" "الاختصارات" "%1$d اختصار لتطبيق %2$s" - - - - - - + "هناك %1$d اختصار و%2$d إشعار عن %3$s" + "تجاهل" + "تم تجاهل الإشعار" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 853520ae13..6b997883ff 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -70,8 +70,7 @@ "Qovluq: %1$s" "Vidcet" "Divar kağızları" - - + "Home ayarları" "Admininiz tərəfindən deaktiv edilib" "İcmal" "Əsas ekranın firlanmağına icazə verin" @@ -85,6 +84,14 @@ "Sistem defoltu istifadə edin" + + + + + + + + "Naməlum" @@ -121,10 +128,7 @@ "Vidcetin eni %1$s hündürlüyü %2$s kimi ölçüləndirildi" "Qısa yollar" "%1$d üçün %2$s qısa yolu" - - - - - - + "%3$s üçün %1$d qısayol və %2$d bildiriş" + "Rədd edin" + "Bildiriş rədd edildi" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 03a93aae43..d96bd62f71 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -70,8 +70,7 @@ "Direktorijum: %1$s" "Vidžeti" "Pozadine" - - + "Podešavanja početnog ekrana" "Administrator je onemogućio" "Pregled" "Dozvoli rotaciju početnog ekrana" @@ -85,6 +84,14 @@ "Koristi podrazumevano sistemsko podešavanje" + + + + + + + + "Nepoznato" @@ -121,10 +128,7 @@ "Veličina vidžeta je promenjena na širinu %1$s i visinu %2$s" "Prečice" "%1$d prečice(a) za %2$s" - - - - - - + "Prečice (%1$d) i obaveštenja (%2$d) za %3$s" + "Odbaci" + "Obaveštenje je odbačeno" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index 85953c4d63..8ee1663235 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -70,8 +70,7 @@ "Папка: %1$s" "Віджэты" "Шпалеры" - - + "Налады галоўнага экрана" "Адключаная адміністратарам" "Агляд" "Дазволіць паварот галоўнага экрана" @@ -85,6 +84,14 @@ "Выкарыстоўваць стандартныя формы" + + + + + + + + "Невядома" @@ -121,10 +128,7 @@ "Памеры віджэта зменены на: шырыня %1$s, вышыня %2$s" "Ярлыкі" "Ярлыкі (%1$d) для %2$s" - - - - - - + "Ярлыкі (%1$d) і апавяшчэнні (%2$d) для %3$s" + "Адхіліць" + "Апавяшчэнне адхілена" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 93e484a3b8..61de76f24a 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -70,8 +70,7 @@ "Папка: „%1$s“" "Приспособления" "Тапети" - - + "Настройки за Google Home" "Деактивирано от администратора ви" "Общ преглед" "Разрешаване на завъртането на началния екран" @@ -85,6 +84,14 @@ "Използване на стандартната системна настройка" + + + + + + + + "Няма информация" @@ -121,10 +128,7 @@ "Приспособлението е преоразмерено към ширина %1$s и височина %2$s" "Преки пътища" "%1$d преки пътища за %2$s" - - - - - - + "%1$d преки пътища и %2$d известия за %3$s" + "Отхвърляне" + "Известието е отхвърлено" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index b498f50ca4..d7bd83b7fa 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -70,8 +70,7 @@ "ফোল্ডার: %1$s" "উইজেটগুলি" "ওয়ালপেপারগুলি" - - + "হোম এর সেটিংস" "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" "এক নজরে" "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" @@ -84,6 +83,14 @@ "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" "সিস্টেমের ডিফল্ট মান ব্যবহার করুন" + + + + + + + + "আইকনের আকৃতি পরিবর্তন করা হচ্ছে" "অজানা" "সরান" @@ -119,10 +126,7 @@ "উইজেটের আকার প্রস্থ %1$s উচ্চতা %2$s তে পরিবর্তন করা হয়েছে" "শর্টকাট" "%2$s এর %1$dটি শর্টকার্ট" - - - - - - + "%3$s এর জন্য %1$dটি শর্টকাট এবং %2$dটি বিজ্ঞপ্তি" + "খারিজ করুন" + "বিজ্ঞপ্তি খারিজ করা হয়েছে" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index fc2ad74702..c148413839 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Dodaci" "Pozadinske slike" - - + "Postavke za Home" "Onemogućio vaš administrator" "Pregled" "Dozvoli rotiranje početnog ekrana" @@ -85,6 +84,14 @@ "Koristite sistemski zadano" + + + + + + + + "Nepoznato" @@ -121,10 +128,7 @@ "Veličina vidžeta je promijenjena na širinu %1$s visinu %2$s" "Prečice" "%1$d prečica za aplikaciju %2$s" - - - - - - + "Za aplikaciju %3$s broj prečica je %1$d, a broj obavještenja je %2$d" + "Odbaci" + "Obavještenje je odbačeno" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 7af2ef923b..245c760175 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -70,8 +70,7 @@ "Carpeta: %1$s" "Widgets" "Fons de pantalla" - - + "Configuració de la pantalla d\'inici" "Desactivada per l\'administrador" "Visió general" "Permet la rotació de la pantalla d\'inici" @@ -85,6 +84,14 @@ "Utilitza l\'opció predeterminada del sistema" + + + + + + + + "Desconegut" @@ -121,10 +128,7 @@ "S\'ha canviat la mida del widget a l\'amplada %1$s i l\'alçada %2$s" "Dreceres" "%1$d dreceres per a l\'aplicació %2$s" - - - - - - + "%1$d dreceres i %2$d notificacions per a %3$s" + "Ignora" + "S\'ha ignorat la notificació" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 073ad04583..556294b56a 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -70,8 +70,7 @@ "Složka: %1$s" "Widgety" "Tapety" - - + "Nastavení plochy" "Zakázáno administrátorem" "Přehled" "Povolit otáčení plochy" @@ -85,6 +84,14 @@ "Použít výchozí nastavení systému" + + + + + + + + "Neznámé" @@ -121,10 +128,7 @@ "Velikost widgetu upravena: šířka %1$s, výška %2$s" "Zkratky" "Počet zkratek pro aplikaci %2$s: %1$d" - - - - - - + "Zkratky (%1$d) a oznámení (%2$d) aplikace %3$s" + "Zavřít" + "Oznámení bylo zavřeno" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 922e891502..f811f119c9 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -70,8 +70,7 @@ "Mappe: %1$s" "Widgets" "Baggrunde" - - + "Indstillinger for startskærmen" "Deaktiveret af din administrator" "Oversigt" "Tillad rotation af startskærmen" @@ -85,6 +84,14 @@ "Brug systemstandarden" + + + + + + + + "Ukendt" @@ -121,10 +128,7 @@ "Størrelsen for widgetten er ændret til bredde %1$s og højde %2$s" "Genveje" "%1$d genveje til %2$s" - - - - - - + "%1$d genveje og %2$d underretninger for %3$s" + "Afvis" + "Underretningen blev afvist" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index b7e385e6dd..f25b46fc42 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -70,8 +70,7 @@ "Ordner: %1$s" "Widgets" "Hintergründe" - - + "Einstellungen für den Startbildschirm" "Von deinem Administrator deaktiviert" "Übersicht" "Drehung des Startbildschirms zulassen" @@ -85,6 +84,14 @@ "Systemstandardeinstellung verwenden" + + + + + + + + "Unbekannt" @@ -121,10 +128,7 @@ "Größe des Widgets zu Breite %1$s und Höhe %2$s geändert" "Verknüpfungen" "%1$d Verknüpfungen für %2$s" - - - - - - + "%1$d Verknüpfungen und %2$d Benachrichtigungen für %3$s" + "Schließen" + "Benachrichtigung geschlossen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 4c589063ee..a148c51cea 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -70,8 +70,7 @@ "Φάκελος: %1$s" "Γραφικά στοιχεία" "Ταπετσαρίες" - - + "Ρυθμίσεις Αρχικής σελίδας" "Απενεργοποιήθηκε από τον διαχειριστή σας" "Επισκόπηση" "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" @@ -85,6 +84,14 @@ "Χρήση προεπιλογής συστήματος" + + + + + + + + "Άγνωστο" @@ -121,10 +128,7 @@ "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" "Συντομεύσεις" "%1$d συντομεύσεις για %2$s" - - - - - - + "%1$d συντομεύσεις και %2$d ειδοποιήσεις για την εφαρμογή %3$s" + "Παράβλεψη" + "Η ειδοποίηση παραβλέφθηκε" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index a718971217..504bd81cb0 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widgets" "Wallpapers" - - + "Home settings" "Disabled by your admin" "Overview" "Allow Homescreen rotation" @@ -85,6 +84,14 @@ "Use system default" + + + + + + + + "Unknown" @@ -121,10 +128,7 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" - - - - - - + "%1$d shortcuts and %2$d notifications for %3$s" + "Dismiss" + "Notification dismissed" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index a718971217..504bd81cb0 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widgets" "Wallpapers" - - + "Home settings" "Disabled by your admin" "Overview" "Allow Homescreen rotation" @@ -85,6 +84,14 @@ "Use system default" + + + + + + + + "Unknown" @@ -121,10 +128,7 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" - - - - - - + "%1$d shortcuts and %2$d notifications for %3$s" + "Dismiss" + "Notification dismissed" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index a718971217..504bd81cb0 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widgets" "Wallpapers" - - + "Home settings" "Disabled by your admin" "Overview" "Allow Homescreen rotation" @@ -85,6 +84,14 @@ "Use system default" + + + + + + + + "Unknown" @@ -121,10 +128,7 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" - - - - - - + "%1$d shortcuts and %2$d notifications for %3$s" + "Dismiss" + "Notification dismissed" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index cafea4c8f7..4999275651 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -70,8 +70,7 @@ "Carpeta: %1$s" "Widgets" "Fondos de pantalla" - - + "Configuración de Home" "El administrador inhabilitó esta función" "Recientes" "Permitir la rotación de la pantalla principal" @@ -85,6 +84,14 @@ "Usar el sistema predeterminado" + + + + + + + + "Desconocido" @@ -121,10 +128,7 @@ "Se cambió la dimensión del widget a %1$s de ancho y %2$s de alto." "Accesos directos" "%1$d accesos directos para %2$s" - - - - - - + "%1$d accesos directos y %2$d notificaciones de %3$s" + "Descartar" + "Se descartó la notificación" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 6b3bb34eb6..5e4f1617d8 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -70,8 +70,7 @@ "Carpeta: %1$s" "Widgets" "Fondos de pantalla" - - + "Ajustes de Home" "Inhabilitada por el administrador" "Visión general" "Permitir rotación de la pantalla de inicio" @@ -85,6 +84,14 @@ "Usar opción predeterminada del sistema" + + + + + + + + "Desconocido" @@ -121,10 +128,7 @@ "Se ha modificado el tamaño del widget a %1$s de ancho y %2$s de alto" "Accesos directos" "%1$d accesos directos de %2$s" - - - - - - + "%1$d accesos directos y %2$d notificaciones de %3$s" + "Ignorar" + "Notificación ignorada" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 5d57ef1182..51a3f7ab33 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -70,8 +70,7 @@ "Kaust: %1$s" "Vidinad" "Taustapildid" - - + "Avalehe seaded" "Keelas administraator" "Ülevaade" "Luba avaekraani pööramine" @@ -85,6 +84,14 @@ "Kasuta süsteemi vaikeseadet" + + + + + + + + "Teadmata" @@ -121,10 +128,7 @@ "Vidina suurust muudeti. Laius: %1$s. Kõrgus: %2$s" "Otseteed" "%1$d otseteed rakenduse %2$s jaoks" - - - - - - + "%1$d otseteed ja %2$d märguannet rakendusele %3$s" + "Loobu" + "Märguandest loobuti" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index ee6cf0caa1..063ce2b6aa 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -70,8 +70,7 @@ "Karpeta: %1$s" "Widgetak" "Horma-paperak" - - + "Hasierako pantailaren ezarpenak" "Administratzaileak desgaitu du" "Ikuspegi orokorra" "Baimendu hasierako pantaila biratzea" @@ -85,6 +84,14 @@ "Erabili sistemaren balio lehenetsiak" + + + + + + + + "Ezezaguna" @@ -121,10 +128,7 @@ "Aldatu da widgetaren tamaina. Zabalera: %1$s. Altuera: %2$s." "Lasterbideak" "%2$s aplikazioaren %1$d lasterbide" - - - - - - + "%3$s aplikazioaren %1$d lasterbide eta %2$d jakinarazpen" + "Baztertu" + "Baztertu egin da jakinarazpena" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 059a484bd5..f3b3a8477a 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -70,8 +70,7 @@ "پوشه: %1$s" "ابزارک‌ها" "کاغذدیواری‌ها" - - + "تنظیمات صفحه اصلی" "توسط سرپرست سیستم غیرفعال شده است" "نمای کلی" "امکان دادن به چرخش صفحه اصلی" @@ -85,6 +84,14 @@ "استفاده از پیش‌فرض سیستم" + + + + + + + + "نامشخص" @@ -121,10 +128,7 @@ "اندازه ابزارک به عرض %1$s ارتفاع %2$s تغییر کرد" "میان‌برها" "%1$d میانبر برای %2$s" - - - - - - + "%1$d میان‌بر و %2$d اعلان برای %3$s" + "رد کردن" + "اعلان رد شد" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 6223f63b30..49d44f85d3 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -70,8 +70,7 @@ "Kansio: %1$s" "Widgetit" "Taustakuvat" - - + "Kotiasetukset" "Järjestelmänvalvoja on poistanut toiminnon käytöstä." "Yleiskatsaus" "Salli aloitusnäytön kiertäminen" @@ -85,6 +84,14 @@ "Käytä järjestelmän oletusarvoa" + + + + + + + + "Tuntematon" @@ -121,10 +128,7 @@ "Widgetin kokoa muutettiin. Sen leveys on nyt %1$s ja korkeus %2$s." "Pikakuvakkeet" "Sovelluksella %2$s on %1$d pikakuvaketta." - - - - - - + "%3$s: %1$d pikakuvaketta ja %2$d ilmoitusta" + "Hylkää" + "Ilmoitus hylätty" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 1b2d6107af..0169e5dbdf 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -70,8 +70,7 @@ "Dossier : %1$s" "Widgets" "Fonds d\'écran" - - + "Paramètres d\'accueil" "Cette fonction est désactivée par votre administrateur" "Présentation" "Autoriser la rotation de l\'écran d\'accueil" @@ -85,6 +84,14 @@ "Utiliser les valeurs système par défaut" + + + + + + + + "Inconnu" @@ -121,10 +128,7 @@ "Le widget a été redimensionné (largeur : %1$s, hauteur : %2$s)" "Raccourcis" "%1$d raccourcis pour %2$s" - - - - - - + "%1$d raccourcis et %2$d notifications pour %3$s" + "Ignorer" + "Notification ignorée" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 9823764de8..944a6cb4c6 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -70,8 +70,7 @@ "Dossier \"%1$s\"" "Widgets" "Fonds d\'écran" - - + "Paramètres du domicile" "Désactivé par votre administrateur" "Vue d\'ensemble" "Autoriser la rotation de l\'écran d\'accueil" @@ -85,6 +84,14 @@ "Utiliser la valeur système par défaut" + + + + + + + + "Inconnu" @@ -121,10 +128,7 @@ "Le widget a bien été redimensionné (largeur : %1$s, hauteur : %2$s)." "Raccourcis" "%1$d raccourcis pour %2$s" - - - - - - + "%1$d raccourcis et %2$d notifications pour %3$s" + "Ignorer" + "Notification ignorée" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index e1c7e2a9f5..fb4489c64f 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -70,8 +70,7 @@ "Cartafol: %1$s" "Widgets" "Fondos de pantalla" - - + "Configuración de inicio" "Función desactivada polo administrador" "Visión xeral" "Permitir xirar a pantalla de inicio" @@ -85,6 +84,14 @@ "Usar valores predeterminados do sistema" + + + + + + + + "Descoñecido" @@ -121,10 +128,7 @@ "Cambiouse o tamaño do widget polo ancho %1$s e a altura %2$s" "Atallos" "%1$d atallos para %2$s" - - - - - - + "%1$d atallos e %2$d notificacións para a aplicación %3$s" + "Ignorar" + "Ignorouse a notificación" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 1dfbfd0564..9a316b296f 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -70,8 +70,7 @@ "ફોલ્ડર: %1$s" "વિજેટ્સ" "વૉલપેપર્સ" - - + "હોમ સેટિંગ્સ" "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" "વિહંગાવલોકન" "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" @@ -84,6 +83,14 @@ "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" "સિસ્ટમ ડિફૉલ્ટનો ઉપયોગ કરો" + + + + + + + + "આઇકનના આકારમાં કરેલ ફેરફારો લાગુ કરી રહ્યા છીએ" "અજાણ્યો" "દૂર કરો" @@ -119,10 +126,7 @@ "વિજેટનો આકાર બદલીને %1$s પહોળાઈ %2$s ઊંચાઈ કર્યો" "શૉર્ટકટ્સ" "%2$s માટે %1$d શૉર્ટકટ" - - - - - - + "%3$s માટે %1$d શૉર્ટકટ અને %2$d સૂચનાઓ" + "છોડી દો" + "સૂચના છોડી દીધી" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 975a650b26..db4a52e961 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -70,8 +70,7 @@ "फ़ोल्डर: %1$s" "शॉर्टकट" "वॉलपेपर" - - + "होम सेटिंग" "आपके व्यवस्थापक द्वारा अक्षम" "अवलोकन" "होमस्क्रीन घुमाने की अनुमति दें" @@ -85,6 +84,14 @@ "सिस्टम डिफ़ॉल्ट का उपयोग करें" + + + + + + + + "अज्ञात" @@ -121,10 +128,7 @@ "विजेट का आकार बदलकर उसकी चौड़ाई %1$s और ऊंचाई %2$s कर दी गई" "शॉर्टकट" "%2$s के लिए %1$d शॉर्टकट" - - - - - - + "%3$s के लिए %1$d शॉर्टकट और %2$d नोटिफ़िकेशन हैं" + "खारिज करें" + "नोटिफ़िकेशन को खारिज किया गया" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index f53cf5cfb7..322fb3f583 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -70,8 +70,7 @@ "Mapa: %1$s" "Widgeti" "Pozadine" - - + "Postavke Homea" "Onemogućio administrator" "Pregled" "Dopusti zakretanje početnog zaslona" @@ -85,6 +84,14 @@ "Upotrijebi zadane postavke sustava" + + + + + + + + "Nepoznato" @@ -121,10 +128,7 @@ "Širina widgeta promijenjena je na %1$s, a visina na %2$s" "Prečaci" "Prečaca za aplikaciju %2$s: %1$d" - - - - - - + "Za aplikaciju %3$s ima prečaca (ukupno %1$d) i obavijesti (ukupno %2$d)" + "Odbaci" + "Obavijest je odbačena" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 461730229a..938ed30810 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -70,8 +70,7 @@ "Mappa: %1$s" "Modulok" "Háttérképek" - - + "A Home beállításai" "A rendszergazda letiltotta" "Áttekintés" "A kezdőképernyő elforgatásának engedélyezése" @@ -85,6 +84,14 @@ "Alapértelmezett érték használata" + + + + + + + + "Ismeretlen" @@ -121,10 +128,7 @@ "Modul átméretezve %1$s szélességre és %2$s magasságra" "Gyorsparancsok" "%1$d gyorsparancs a(z) %2$s számára" - - - - - - + "%1$d parancsikon és %2$d értesítés a következő alkalmazásnál: %3$s" + "Elvetés" + "Értesítés elvetve" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index c946290a19..b00ed68dbb 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -70,8 +70,7 @@ "Պանակ՝ %1$s" "Վիջեթներ" "Պաստառներ" - - + "Գլխավոր էջի կարգավորումներ" "Անջատվել է ձեր ադմինիստրատորի կողմից" "Համատեսք" "Թույլ տալ հիմնական էկրանի պտտումը" @@ -85,6 +84,14 @@ "Օգտագործել համակարգի կանխադրված կարգավորումը" + + + + + + + + "Անհայտ է" @@ -121,10 +128,7 @@ "Վիջեթի լայնությունը փոխվել է %1$s-ի, իսկ բարձրությունը՝ %2$s-ի" "Դյուրանցումներ" "%1$d դյուրանցումներ %2$s հավելվածի համար" - - - - - - + "%1$d դյուրացում և %2$d ծանուցում %3$s-ի համար" + "Անտեսել" + "Ծանուցումը մերժված է" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 31d3db172e..0c80fb7dd0 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widget" "Wallpaper" - - + "Setelan layar Utama" "Dinonaktifkan oleh admin" "Ringkasan" "Izinkan layar Utama diputar" @@ -85,6 +84,14 @@ "Gunakan default sistem" + + + + + + + + "Tidak dikenal" @@ -121,10 +128,7 @@ "Widget diubah ukurannya menjadi lebar %1$s tinggi %2$s" "Pintasan" "%1$d pintasan untuk %2$s" - - - - - - + "%1$d pintasan dan %2$d notifikasi untuk %3$s" + "Tutup" + "Notifikasi ditutup" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index beb45df0bd..702506599f 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -70,8 +70,7 @@ "Mappa: %1$s" "Græjur" "Veggfóður" - - + "Heimastillingar" "Gert óvirkt af kerfisstjóra" "Yfirlit" "Leyfa snúning fyrir heimaskjá" @@ -85,6 +84,14 @@ "Nota sjálfgildi kerfis" + + + + + + + + "Óþekkt" @@ -121,10 +128,7 @@ "Stærð græju breytt í %1$s á breidd og %2$s á hæð" "Flýtileiðir" "%1$d flýtileiðir fyrir %2$s" - - - - - - + "%1$d flýtileiðir og %2$d tilkynningar fyrir %3$s" + "Hunsa" + "Tilkynningu lokað" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index b3fef36892..d0749cdc76 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -70,8 +70,7 @@ "Cartella: %1$s" "Widget" "Sfondi" - - + "Impostazioni Home" "Disattivata dall\'amministratore" "Panoramica" "Consenti rotazione della schermata Home" @@ -85,6 +84,14 @@ "Usa impostazione predefinita di sistema" + + + + + + + + "Sconosciuto" @@ -121,10 +128,7 @@ "Widget ridimensionato a larghezza %1$s, altezza %2$s" "Scorciatoie" "%1$d scorciatoie per %2$s" - - - - - - + "%1$d scorciatoie e %2$d notifiche relative a %3$s" + "Ignora" + "Notifica ignorata" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index cbc1ac3f8a..b472fabb2d 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -70,8 +70,7 @@ "תיקיה: %1$s" "רכיבי ווידג\'ט" "טפטים" - - + "הגדרות דף הבית" "הושבת על ידי מנהל המערכת שלך" "סקירה" "אפשרות סיבוב של מסך דף הבית" @@ -85,6 +84,14 @@ "השתמש בברירת המחדל של המערכת" + + + + + + + + "לא ידוע" @@ -121,10 +128,7 @@ "גודל הווידג\'ט שונה - רוחב %1$s גובה %2$s" "קיצורי דרך" "%1$d קיצורי דרך עבור %2$s" - - - - - - + "%1$d קיצורי דרך ו-%2$d הודעות של %3$s" + "סגור" + "ההודעה נסגרה" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index a0d36ca54d..4a58056a54 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -70,8 +70,7 @@ "フォルダ: %1$s" "ウィジェット" "壁紙" - - + "ホームの設定" "管理者により無効にされています" "概要" "ホーム画面の回転を許可" @@ -85,6 +84,14 @@ "システムのデフォルトを使用" + + + + + + + + "不明" @@ -121,10 +128,7 @@ "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" "ショートカット" "%2$s用の %1$d 件のショートカット" - - - - - - + "%3$s: %1$d 件のショートカットと %2$d 件の通知" + "表示しない" + "通知を非表示にしました" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index c9048e4fc6..0bade8e418 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -70,8 +70,7 @@ "საქაღალდე: %1$s" "ვიჯეტები" "ფონები" - - + "მთავარი გვერდის პარამეტრები" "გათიშულია თქვენი ადმინისტრატორის მიერ" "მიმოხილვა" "მთავარი ეკრანის შეტრიალების დაშვება" @@ -85,6 +84,14 @@ "ნაგულისხმევი სისტემური პარამეტრების გამოყენება" + + + + + + + + "უცნობი" @@ -121,10 +128,7 @@ "ვიჯეტის ზომები შეიცვალა: სიგანე %1$s სიმაღლე %2$s" "მალსახმობები" "%2$s-ს აქვს %1$d მალსახმობი" - - - - - - + "%3$s-ის %1$d მალსახმობი და %2$d შეტყობინება" + "დახურვა" + "შეტყობინება დაიხურა" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 9a75c36f32..9b2dab321d 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -70,8 +70,7 @@ "Қалта: %1$s" "Виджеттер" "Тұсқағаздар" - - + "Негізгі экран параметрлері" "Әкімші өшірді" "Шолу" "Негізгі экранның бұрылуына рұқсат ету" @@ -85,6 +84,14 @@ "Жүйенің әдепкі параметрін пайдалану" + + + + + + + + "Белгісіз" @@ -121,10 +128,7 @@ "Виджет өлшемінің ені %1$s, биіктігі %2$s болып өзгертілді" "Таңбашалар" "%2$s қолданбасына арналған %1$d таңбаша" - - - - - - + "%3$s қолданбасының %1$d таңбашасы мен %2$d хабарландыруы" + "Бас тарту" + "Хабарландырудан бас тартылды" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 4f0c0ee59e..59c13cc9ca 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -70,8 +70,7 @@ "ថត៖ %1$s" "ធាតុ​ក្រាហ្វិក" "ផ្ទាំង​រូបភាព" - - + "ការកំណត់​ទំព័រដើម" "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" "សង្ខេប" "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" @@ -85,6 +84,14 @@ "ប្រើលំនាំដើមរបស់ប្រព័ន្ធ" + + + + + + + + "មិន​ស្គាល់" @@ -121,10 +128,7 @@ "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %1$s កម្ពស់ប្រវែង %2$s" "ផ្លូវកាត់" "%1$d ផ្លូវកាត់សម្រាប់ %2$s" - - - - - - + "ផ្លូវកាត់ចំនួន %1$d និង​ការជូនដំណឹងចំនួន %2$d សម្រាប់ %3$s" + "បដិសេធ" + "បាន​បដិសេធ​ការជូនដំណឹង" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 626fbcdafe..1cda087cb0 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -70,8 +70,7 @@ "ಫೋಲ್ಡರ್: %1$s" "ವಿಜೆಟ್‌ಗಳು" "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" - - + "ಮುಖಪುಟ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" "ಅವಲೋಕನ" "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" @@ -84,6 +83,14 @@ "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" "ಸಿಸ್ಟಂ ಡಿಫಾಲ್ಟ್ ಬಳಸಿ" + + + + + + + + "ಐಕಾನ್ ಆಕಾರ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತಿದೆ" "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" @@ -119,10 +126,7 @@ "ವಿಜೆಟ್ ಅನ್ನು %1$s ಅಗಲ %2$s ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ" "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" "%2$s ಗೆ %1$d ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" - - - - - - + "%3$s ಗಾಗಿ %1$d ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು ಮತ್ತು %2$d ಅಧಿಸೂಚನೆಗಳು" + "ವಜಾಗೊಳಿಸಿ" + "ಅಧಿಸೂಚನೆಯನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 1a2dc7e181..2e8d149dcb 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -70,8 +70,7 @@ "폴더: %1$s" "위젯" "배경화면" - - + "홈 설정" "관리자가 사용 중지함" "개요" "홈 화면 회전 허용" @@ -85,6 +84,14 @@ "시스템 기본값 사용" + + + + + + + + "알 수 없음" @@ -121,10 +128,7 @@ "폭 %1$s, 높이 %2$s로 위젯 크기 조정됨" "바로가기" "%2$s에 사용 가능한 단축키 %1$d개" - - - - - - + "바로가기 %1$d개 및 %3$s 알림 %2$d개" + "닫기" + "알림이 해제되었습니다." diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index ac51c6f8d8..791dfcb2a7 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -70,8 +70,7 @@ "Фолдер: %1$s" "Виджеттер" "Тушкагаздар" - - + "Башкы беттин жөндөөлөрү" "Администраторуңуз өчүрүп койгон" "Көз жүгүртүү" "Башкы экранды айлантууга уруксат берүү" @@ -85,6 +84,14 @@ "Тутум сушунтаган демейкисин колдонуу" + + + + + + + + "Белгисиз" @@ -121,10 +128,7 @@ "Виджеттин кеңдиги %1$s бийиктиги %2$s болду" "Кыска жолдор" "%2$s колдонмосуна %1$d кыска жол бар" - - - - - - + "%3$s колдонмосу үчүн %1$d кыска жол жана %2$d эскертме бар" + "Этибарга албоо" + "Эскертме көз жаздымда калтырылды" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 98928fffd2..cbb17d92bd 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -70,8 +70,7 @@ "ໂຟນເດີ: %1$s" "ວິດເຈັດ" "ພາບພື້ນຫຼັງ" - - + "ການຕັ້ງຄ່າ Home" "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" "ພາບຮວມ" "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" @@ -85,6 +84,14 @@ "ໃຊ້ຄ່າເລີ່ມຕົ້ນລະບົບ" + + + + + + + + "​ບໍ່​ຮູ້​ຈັກ" @@ -121,10 +128,7 @@ "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %1$s ລວງ​ສູງ %2$s ແລ້ວ" "ທາງລັດ" "%1$d ທາງລັດສຳລັບ %2$s" - - - - - - + "%1$d ທາງລັດ ແລະ %2$d ການແຈ້ງເຕືອນສຳລັບ %3$s" + "ປິດໄວ້" + "ປິດການແຈ້ງເຕືອນແລ້ວ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index faf16bbd87..9c7f2aaf67 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -70,8 +70,7 @@ "Aplankas: „%1$s“" "Valdikliai" "Ekrano fonai" - - + "„Home“ nustatymai" "Išjungė administratorius" "Apžvalga" "Leisti pasukti pagrindinį ekraną" @@ -85,6 +84,14 @@ "Naudoti numatytuosius sistemos nustatymus" + + + + + + + + "Nežinoma" @@ -121,10 +128,7 @@ "Valdiklio dydis pakeistas: plotis – %1$s, aukštis – %2$s" "Spartieji klavišai" "Programos „%2$s“ spartieji klavišai (%1$d)" - - - - - - + "„%3$s“ spartieji klavišai (%1$d) ir pranešimai (%2$d)" + "Atsisakyti" + "Pranešimo atsisakyta" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 6228387796..b7f426ee65 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -70,8 +70,7 @@ "Mape: %1$s" "Logrīki" "Fona tapetes" - - + "Sākumlapas iestatījumi" "Atspējojis administrators" "Kopsavilkums" "Atļaut sākuma ekrāna pagriešanu" @@ -85,6 +84,14 @@ "Izmantot sistēmas noklusējumu" + + + + + + + + "Nezināma" @@ -121,10 +128,7 @@ "Logrīka lielums mainīts — platums: %1$s, augstums: %2$s." "Saīsnes" "%1$d saīsnes lietotnei %2$s" - - - - - - + "%1$d saīsnes un %2$d paziņojumi lietotnei %3$s" + "Nerādīt" + "Paziņojums netiek rādīts" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 73f8cfa7b8..6d6473fa0d 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -70,8 +70,7 @@ "Папка: %1$s" "Додатоци" "Позадини" - - + "Поставки за Home" "Оневозможено од администраторот" "Краток преглед" "Дозволете ротација на Почетниот екран" @@ -85,6 +84,14 @@ "Користи ја стандардната поставка на системот" + + + + + + + + "Непознато" @@ -121,10 +128,7 @@ "Големината на виџетот е променета на ширина %1$s висина %2$s" "Кратенки" "%1$d кратенки за %2$s" - - - - - - + "%1$d кратенки и %2$d известувања за %3$s" + "Отфрли" + "Известувањето е отфрлено" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index de90aca5a9..b909c1108b 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -70,8 +70,7 @@ "ഫോൾഡർ: %1$s" "വിജറ്റുകൾ" "വാൾപേപ്പർ" - - + "ഹോം ക്രമീകരണം" "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" "കാഴ്ച" "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" @@ -84,6 +83,14 @@ "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" "സിസ്‌റ്റം ഡിഫോൾട്ട് ഉപയോഗിക്കുക" + + + + + + + + "ഐക്കൺ ആകാര മാറ്റങ്ങൾ പ്രയോഗിക്കുന്നു" "അജ്ഞാതം" "നീക്കംചെയ്യുക" @@ -119,10 +126,7 @@ "വീതി %1$s ഉയരം %2$s-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി" "കുറുക്കുവഴികൾ" "%2$s ആപ്പിനുള്ള %1$d കുറുക്കുവഴികൾ" - - - - - - + "%3$s ആപ്പിനായുള്ള %1$d കുറുക്കുവഴികളും %2$d അറിയിപ്പുകളും" + "നിരസിക്കുക" + "അറിയിപ്പ് നിരസിച്ചു" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 09cef82901..696b42ccf9 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -70,8 +70,7 @@ "Фолдер: %1$s" "Виджет" "Ханын зураг" - - + "Нүүр хуудасны тохиргоо" "Таны админ идэвхгүй болгосон" "Тойм" "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" @@ -85,6 +84,14 @@ "Системийн өгөгдмөл тохиргоог ашиглах" + + + + + + + + "Тодорхойгүй" @@ -121,10 +128,7 @@ "Виджэтийн өргөн %1$s, өндөр %2$s болсон" "Товчлол" "%2$s%1$d товчлол" - - - - - - + "%1$d товчлол болон %3$s%2$d мэдэгдэл" + "Хаах" + "Мэдэгдлийг хаасан" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 9a479389b9..0c74b1584d 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -70,8 +70,7 @@ "फोल्डर: %1$s" "विजेट" "वॉलपेपर" - - + "होम सेटिंग्‍ज" "आपल्या प्रशासकाने अक्षम केले" "विहंगावलोकन" "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" @@ -84,6 +83,14 @@ "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" "सिस्‍टमचे डीफॉल्‍ट वापरा" + + + + + + + + "चिन्हाचा आकार बदल लागू करत आहे" "अज्ञात" "काढा" @@ -119,10 +126,7 @@ "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" "शॉर्टकट" "%2$s साठी %1$d शॉर्टकट" - - - - - - + "%3$sसाठी %1$d शॉर्टकट आणि %2$d सूचना" + "डिसमिस करा" + "सूचना डिसमिस केली" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index be95e32b64..20410bce17 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widget" "Kertas dinding" - - + "Tetapan laman utama" "Dilumpuhkan oleh pentadbir anda" "Ikhtisar" "Benarkan putaran Skrin Utama" @@ -85,6 +84,14 @@ "Gunakan lalai sistem" + + + + + + + + "Tidak diketahui" @@ -121,10 +128,7 @@ "Saiz widget diubah menjadi %1$s lebar %2$s tinggi" "Pintasan" "%1$d pintasan untuk %2$s" - - - - - - + "%1$d pintasan dan %2$d pemberitahuan untuk %3$s" + "Ketepikan" + "Pemberitahuan diketepikan" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index bcb7207f9f..19e017e107 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -70,8 +70,7 @@ "အကန့်အမည်: %1$s" "ဝိဂျက်များ" "နောက်ခံများ" - - + "ပင်မဆက်တင်များ" "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" "ခြုံငုံသုံးသပ်ချက်" "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" @@ -85,6 +84,14 @@ "စနစ်၏ မူရင်းပုံကို အသုံးပြုရန်" + + + + + + + + "မသိရ" @@ -121,10 +128,7 @@ "Widget အား အကျယ် %1$s အမြင့် %2$s အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏" "ဖြတ်လမ်းများ" "%2$s အတွက် အမြန်နည်း %1$d ခု" - - - - - - + "%3$s အတွက် ဖြတ်လမ်းလင့်ခ် %1$d နှင့် အကြောင်းကြားချက် %2$d ခု" + "ပယ်ရန်" + "အသိပေးချက်ကို ဖယ်ထုတ်ပြီးပါပြီ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 4bcee516ff..4d3389e090 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -70,8 +70,7 @@ "Mappe: %1$s" "Moduler" "Bakgrunner" - - + "Startsideinnstillinger" "Administratoren har slått av funksjonen" "Oversikt" "Tillat rotasjon av startskjermen" @@ -85,6 +84,14 @@ "Bruk systemstandard" + + + + + + + + "Ukjent" @@ -121,10 +128,7 @@ "Størrelsen på modulen er endret til bredde %1$s og høyde %2$s" "Snarveier" "%1$d snarveier for %2$s" - - - - - - + "%1$d snarveier og %2$d varsler for %3$s" + "Avvis" + "Varselet ble avvist" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 4d1658fb4c..0f0c654d94 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -70,8 +70,7 @@ "फोल्डर: %1$s" "विजेटहरू" "वालपेपरहरु" - - + "गृहपृष्ठका सेटिङहरू" "तपाईँको प्रशासकद्वारा असक्षम गरिएको" "परिदृश्य" "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" @@ -84,6 +83,14 @@ "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" "प्रणालीको पूर्वनिर्धारित सेटिङ प्रयोग गर्नुहोस्" + + + + + + + + "आइकनको आकारमा गरिएका परिवर्तनहरू लागू गरिँदैछन्" "अज्ञात" "हटाउनुहोस्" @@ -119,10 +126,7 @@ "विजेट चौडाइ %1$s उचाइ %2$s मा पुनः आकार मिलाइयो" "सर्टकटहरू" "%2$s का %1$d सर्टकटहरू" - - - - - - + "%3$s का %1$d सर्टकट र %2$d सूचनाहरू" + "खारेज गर्नुहोस्" + "सूचना खारेज गरियो" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 2653a22ee3..9e35568675 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -70,8 +70,7 @@ "Map: %1$s" "Widgets" "Achtergrond" - - + "Instellingen voor homepage" "Uitgeschakeld door je beheerder" "Overzicht" "Draaien van startscherm toestaan" @@ -85,6 +84,14 @@ "Systeemstandaard gebruiken" + + + + + + + + "Onbekend" @@ -121,10 +128,7 @@ "Formaat van widget gewijzigd in breedte %1$s en hoogte %2$s" "Snelkoppelingen" "%1$d snelkoppelingen voor %2$s" - - - - - - + "%1$d snelkoppelingen en %2$d meldingen voor %3$s" + "Sluiten" + "Melding gesloten" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 5e3b64b05a..76c6bd5371 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -70,20 +70,27 @@ "ਫੋਲਡਰ: %1$s" "ਵਿਜਿਟ" "ਵਾਲਪੇਪਰ" - - + "ਹੋਮ ਸੈਟਿੰਗਾਂ" "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" "ਰੂਪ-ਰੇਖਾ" "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" - "ਪ੍ਰਤੀਕ ਨੂੰ ਬੈਜ ਕਰਨਾ" + "ਪ੍ਰਤੀਕ \'ਤੇ ਬੈਜ ਲਗਾਉਣਾ" "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਚਾਲੂ ਹੈ" "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਬੰਦ ਹੈ" "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" "ਸਿਸਟਮ ਦੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ" + + + + + + + + "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" @@ -119,10 +126,7 @@ "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %1$s ਉਂਚਾਈ %2$s ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ" "ਸ਼ਾਰਟਕੱਟ" "%2$s ਲਈ %1$d ਸ਼ਾਰਟਕੱਟ" - - - - - - + "%3$s ਲਈ %1$d ਸ਼ਾਰਟਕੱਟ ਅਤੇ %2$d ਸੂਚਨਾਵਾਂ" + "ਖਾਰਜ ਕਰੋ" + "ਸੂਚਨਾ ਖਾਰਜ ਕੀਤੀ ਗਈ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 09f0fcafcf..b3eb423376 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widżety" "Tapety" - - + "Ustawienia strony głównej" "Funkcja wyłączona przez administratora" "Przegląd" "Zezwalaj na obrót ekranu głównego" @@ -85,6 +84,14 @@ "Użyj ustawienia domyślnego" + + + + + + + + "Brak informacji" @@ -121,10 +128,7 @@ "Szerokość i wysokość widżetu zmieniła się na %1$s x %2$s" "Skróty" "Skróty aplikacji %2$s: %1$d" - - - - - - + "Skróty (%1$d) i powiadomienia (%2$d) aplikacji %3$s" + "Odrzuć" + "Powiadomienie odrzucone" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index bf9d0e8162..d1b03aa357 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -70,8 +70,7 @@ "Pasta: %1$s" "Widgets" "Imagens de fundo" - - + "Definições da página inicial" "Desativada pelo administrador" "Vista geral" "Permitir rotação do ecrã principal" @@ -85,6 +84,14 @@ "Utilizar a predefinição do sistema" + + + + + + + + "Desconhecido" @@ -121,10 +128,7 @@ "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" "%1$d atalhos para a aplicação %2$s" - - - - - - + "%1$d atalhos e %2$d notificações para a aplicação %3$s" + "Ignorar" + "Notificação ignorada" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index dfa88c6626..c1176722fb 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -70,8 +70,7 @@ "Pasta: %1$s" "Widgets" "Planos de fundo" - - + "Configurações da página inicial" "Desativado pelo administrador" "Visão geral" "Permitir rotação da tela inicial" @@ -85,6 +84,14 @@ "Usar padrão do sistema" + + + + + + + + "Desconhecido" @@ -121,10 +128,7 @@ "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" "%1$d atalhos para %2$s" - - - - - - + "%1$d atalhos e %2$d notificações para o app %3$s" + "Dispensar" + "Notificação dispensada" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 21795062ea..69b44e28f2 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -70,8 +70,7 @@ "Dosar: %1$s" "Widgeturi" "Imagini de fundal" - - + "Setări pentru ecranul de pornire" "Dezactivată de administrator" "Prezentare generală" "Permiteți rotirea ecranului de pornire" @@ -85,6 +84,14 @@ "Folosiți setarea prestabilită a sistemului" + + + + + + + + "Necunoscut" @@ -121,10 +128,7 @@ "Widgetul a fost redimensionat la lățimea %1$s și înălțimea %2$s" "Comenzi rapide" "%1$d comenzi rapide pentru %2$s" - - - - - - + "%1$d comenzi rapide și %2$d notificări pentru %3$s" + "Închideți" + "Notificare închisă" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index faae2b4c0c..6f00f2d51e 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -70,8 +70,7 @@ "Папка: %1$s" "Виджеты" "Обои" - - + "Настройки главного экрана" "Функция отключена администратором" "Обзор" "Разрешить поворачивать главный экран" @@ -85,6 +84,14 @@ "Использовать системные настройки по умолчанию" + + + + + + + + "Неизвестно" @@ -121,10 +128,7 @@ "Изменен размер виджета: до %1$s в ширину и %2$s в высоту" "Ярлыки" "Количество ярлыков для приложения \"%2$s\": %1$d" - - - - - - + "Количество ярлыков для приложения \"%3$s\": %1$d. Количество уведомлений: %2$d." + "Закрыть" + "Уведомление закрыто" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index 9f6cf5bb73..fec9ff8ab2 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -70,8 +70,7 @@ "ෆෝල්ඩරය: %1$s" "විජට්" "වෝල්පේපර" - - + "Home සැකසීම්" "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" "දළ විශ්ලේෂණය" "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" @@ -85,6 +84,14 @@ "පද්ධති පෙරනිමි භාවිත කරන්න" + + + + + + + + "නොදනී" @@ -121,10 +128,7 @@ "විජට් පළල %1$s උස %2$s වෙත ප්‍රමාණකරණය කරන ලදි" "කෙටිමං" "%2$s සඳහා කෙටි මං %1$d" - - - - - - + "%3$s සඳහා කෙටි මං %1$dක් සහ දැනුම්දීම් %2$dක්" + "ඉවතලන්න" + "දැනුම්දීම ඉවතලන ලදී" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index e920fab1d6..500f14f82b 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -70,8 +70,7 @@ "Priečinok: %1$s" "Miniaplikácie" "Tapety" - - + "Nastavenia služby Home" "Zakázané vaším správcom" "Prehľad" "Povoliť otáčanie plochy" @@ -85,6 +84,14 @@ "Použiť predvolené nastavenie systému" + + + + + + + + "Neznáme" @@ -121,10 +128,7 @@ "Veľkosť miniaplikácie bola zmenená na %1$s x %2$s (šírka x výška)" "Skratky" "Počet skratiek aplikácie %2$s: %1$d" - - - - - - + "Odkazy (%1$d) a upozornenia (%2$d) pre aplikáciu %3$s" + "Zavrieť" + "Upozornenie bolo zavreté" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index fb5df08ced..bc951af462 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -70,8 +70,7 @@ "Mapa: %1$s" "Pripomočki" "Ozadja" - - + "Nastavitve začetnega zaslona" "Onemogočil skrbnik." "Pregled" "Omogočanje sukanja začetnega zaslona" @@ -85,6 +84,14 @@ "Uporabi privzeto nastavitev sistema" + + + + + + + + "Neznano" @@ -121,10 +128,7 @@ "Velikost pripomočka je bila spremenjena na %1$s širine in %2$s višine" "Bližnjice" "Št. bližnjic za aplikacijo %2$s: %1$d" - - - - - - + "Bližnjice (%1$d) in obvestila (%2$d) aplikacije %3$s" + "Opusti" + "Obvestilo je bilo opuščeno" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 039fae4327..f4798f6b75 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -70,8 +70,7 @@ "Dosja: %1$s" "Miniaplikacionet" "Imazhet e sfondit" - - + "Cilësimet e Home" "Çaktivizuar nga administratori" "Përmbledhje" "Lejo rrotullimin e ekranit kryesor" @@ -85,6 +84,14 @@ "Përdor parazgjedhjen e sisteit" + + + + + + + + "I panjohur" @@ -121,10 +128,7 @@ "Madhësia e miniaplikacionit u ndryshua me gjerësinë %1$s dhe lartësinë %2$s" "Shkurtoret" "%1$d shkurtesa për %2$s" - - - - - - + "%1$d shkurtore dhe %2$d njoftime për %3$s" + "Hiqe" + "Njoftimi u hoq" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 16ef6cc3a7..de24f32469 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -70,8 +70,7 @@ "Директоријум: %1$s" "Виџети" "Позадине" - - + "Подешавања почетног екрана" "Администратор је онемогућио" "Преглед" "Дозволи ротацију почетног екрана" @@ -85,6 +84,14 @@ "Користи подразумевано системско подешавање" + + + + + + + + "Непознато" @@ -121,10 +128,7 @@ "Величина виџета је промењена на ширину %1$s и висину %2$s" "Пречице" "%1$d пречице(а) за %2$s" - - - - - - + "Пречице (%1$d) и обавештења (%2$d) за %3$s" + "Одбаци" + "Обавештење је одбачено" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index ef5b6ac4c9..0baf97d56b 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -70,8 +70,7 @@ "Mapp: %1$s" "Widgetar" "Bakgrunder" - - + "Inställningar för startsidan" "Inaktiverat av administratören" "Översikt" "Tillåt rotering av startskärmen" @@ -85,6 +84,14 @@ "Använd systemstandard" + + + + + + + + "Okänt" @@ -121,10 +128,7 @@ "Widgetens storlek har ändrats till: bredd %1$s, höjd %2$s" "Genvägar" "%1$d genvägar för %2$s" - - - - - - + "%3$s har %1$d genvägar och %2$d aviseringar" + "Ignorera" + "Aviseringen togs bort" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 73b4a8c55f..96a78db239 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -72,8 +72,7 @@ "Folda: %1$s" "Wijeti" "Mandhari" - - + "Mipangilio ya ukurasa wa mwanzo" "Imezimwa na msimamizi wako" "Muhtasari" "Ruhusu kuzungusha skrini ya Kwanza" @@ -87,6 +86,14 @@ "Tumia umbo chaguo-msingi la mfumo" + + + + + + + + "Yasiyojulikana" @@ -123,10 +130,7 @@ "Wijeti imepunguzwa hadi upana %1$s urefu %2$s" "Njia za mkato" "Njia %1$d za mkato za %2$s" - - - - - - + "Njia %1$d za mkato na arifa %2$d za %3$s" + "Ondoa" + "Arifa imeondolewa" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 4b94a5997a..15fb1106a5 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -70,8 +70,7 @@ "கோப்புறை: %1$s" "ஷார்ட்கட்ஸ்" "வால்பேப்பர்கள்" - - + "முகப்பு அமைப்புகள்" "உங்கள் நிர்வாகி முடக்கியுள்ளார்" "மேலோட்டப் பார்வை" "முகப்புத் திரை சுழற்சியை அனுமதி" @@ -85,6 +84,14 @@ "அமைப்பின் இயல்புநிலையைப் பயன்படுத்து" + + + + + + + + "தெரியாதது" @@ -121,10 +128,7 @@ "அகலம் %1$s மற்றும் உயரம் %2$sக்கு விட்ஜெட் அளவு மாற்றப்பட்டது" "குறுக்குவழிகள்" "%2$sக்கான %1$d குறுக்குவழிகள்" - - - - - - + "%3$s பயன்பாட்டிற்கான %1$d குறுக்குவழிகளும் %2$d அறிவிப்புகளும் உள்ளன" + "நிராகரி" + "அறிவிப்பு நிராகரிக்கப்பட்டது" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 9003b8bfb1..05c4788f40 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -70,8 +70,7 @@ "ఫోల్డర్: %1$s" "విడ్జెట్‌లు" "వాల్‌పేపర్‌లు" - - + "హోమ్ సెట్టింగ్‌లు" "మీ నిర్వాహకులు నిలిపివేసారు" "స్థూలదృష్టి" "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" @@ -84,6 +83,14 @@ "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" "సిస్టమ్ డిఫాల్ట్‌ను ఉపయోగించండి" + + + + + + + + "చిహ్న ఆకార మార్పులను వర్తింపజేస్తోంది" "తెలియదు" "తీసివేయి" @@ -119,10 +126,7 @@ "విడ్జెట్ పరిమాణం వెడల్పు %1$sకి, ఎత్తు %2$sకి మార్చబడింది" "సత్వరమార్గాలు" "%2$s కోసం %1$d సత్వరమార్గాలు" - - - - - - + "%3$s కోసం %1$d సత్వరమార్గాలు మరియు %2$d నోటిఫికేషన్‌లు" + "తీసివేయి" + "నోటిఫికేషన్ తీసివేయబడింది" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 78e193c072..1f5c7c87c0 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -70,8 +70,7 @@ "โฟลเดอร์: %1$s" "วิดเจ็ต" "วอลเปเปอร์" - - + "การตั้งค่าหน้าแรก" "ปิดใช้โดยผู้ดูแลระบบ" "ภาพรวม" "อนุญาตให้หมุนหน้าจอหลัก" @@ -85,6 +84,14 @@ "ใช้ค่าเริ่มต้นของระบบ" + + + + + + + + "ไม่รู้จัก" @@ -121,10 +128,7 @@ "ปรับขนาดของวิดเจ็ตเป็นกว้าง %1$s สูง %2$s แล้ว" "ทางลัด" "%1$d ทางลัดสำหรับ %2$s" - - - - - - + "ทางลัด %1$d รายการและการแจ้งเตือน %2$d รายการสำหรับ %3$s" + "ปิด" + "ปิดการแจ้งเตือนแล้ว" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 829360c185..ff92183d20 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Mga Widget" "Mga Wallpaper" - - + "Mga setting ng Home" "Na-disable ng iyong admin" "Pangkalahatang-ideya" "Payagan ang pag-rotate ng Home screen" @@ -85,6 +84,14 @@ "Gamitin ang default ng system" + + + + + + + + "Hindi kilala" @@ -121,10 +128,7 @@ "Na-resize ang widget sa lapad %1$s taas %2$s" "Mga Shortcut" "%1$d (na) shortcut para sa %2$s" - - - - - - + "%1$d (na) shortcut at %2$d (na) notification para sa %3$s" + "I-dismiss" + "Na-dismiss ang notification" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index b41b15de99..ff28712655 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -70,8 +70,7 @@ "Klasör: %1$s" "Widget\'lar" "Duvar Kağıtları" - - + "Ana ekran ayarları" "Yöneticiniz tarafından devre dışı bırakıldı" "Genel bakış" "Ana ekranı döndürmeye izin ver" @@ -85,6 +84,14 @@ "Sistem varsayılanını kullan" + + + + + + + + "Bilinmiyor" @@ -121,10 +128,7 @@ "Widget, %1$s genişlik ve %2$s yükseklik değerine yeniden boyutlandırıldı" "Kısayollar" "%2$s için %1$d kısayol" - - - - - - + "%3$s için %1$d kısayol ve %2$d bildirim" + "Kapat" + "Bildirim kapatıldı" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index aadd595294..c904d414df 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -70,8 +70,7 @@ "Папка %1$s" "Віджети" "Фонові малюнки" - - + "Налаштування Home" "Вимкнув адміністратор" "Огляд" "Дозволити обертання головного екрана" @@ -85,6 +84,14 @@ "Використовувати налаштування системи за умовчанням" + + + + + + + + "Невідомо" @@ -121,10 +128,7 @@ "Розміри віджета змінено на %1$s завширшки та %2$s заввишки" "Ярлики" "Ярликів для додатка %2$s: %1$d" - - - - - - + "Ярлики (%1$d) і сповіщення (%2$d) додатка %3$s" + "Закрити" + "Сповіщення закрито" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 24f4dd78df..31ac66f514 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -70,8 +70,7 @@ "فولڈر: %1$s" "ویجیٹس" "وال پیپرز" - - + "ہوم ترتیبات" "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" "مجموعی جائزہ" "ہوم اسکرین گھمانے کی اجازت دیں" @@ -84,6 +83,14 @@ "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" "سسٹم ڈیفالٹ کا استعمال کریں" + + + + + + + + "آئيکن کی شکل کی تبدیلیاں لاگو ہو رہی ہیں" "نامعلوم" "ہٹائیں" @@ -119,10 +126,7 @@ "ویجیٹ کے سائز کو چوڑائی %1$s اونچائی %2$s میں تبدیل کر دیا گیا" "شارٹ کٹس" "%2$s کیلئے %1$d شارٹ کٹس" - - - - - - + "%3$s کے %1$d شارٹ کٹس اور %2$d اطلاعات" + "برخاست کریں" + "اطلاع مسترد ہو گئی" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index eef716e5f2..716eedde23 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -70,8 +70,7 @@ "Jild: %1$s" "Vidjetlar" "Fon rasmlari" - - + "Home sozlamalari" "Administrator tomonidan o‘chirilgan" "Umumiy ko‘rinish" "Asosiy ekranni aylantirishga ruxsat berish" @@ -85,6 +84,14 @@ "Standart tizim parametrlaridan foydalanish" + + + + + + + + "Noma’lum" @@ -121,10 +128,7 @@ "Vidjetning eni %1$s, bo‘yi %2$s qilib o‘zgartirildi" "Tezkor tugmalar" "%2$s ilovasi uchun %1$d ta tezkor tugma" - - - - - - + "%3$s ilovasi uchun %1$d ta yorliq va %2$d ta bildirishnoma" + "Yopish" + "Bildirishnoma yopildi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index f24a169a56..580a4dda79 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -70,8 +70,7 @@ "Thư mục: %1$s" "Tiện ích con" "Hình nền" - - + "Cài đặt trang chủ" "Bị tắt bởi quản trị viên của bạn" "Tổng quan" "Cho phép xoay Màn hình chính" @@ -85,6 +84,14 @@ "Sử dụng mặc định của hệ thống" + + + + + + + + "Không xác định" @@ -121,10 +128,7 @@ "Đã đổi kích thước tiện ích thành chiều rộng %1$s chiều cao %2$s" "Lối tắt" "%1$d phím tắt cho %2$s" - - - - - - + "%1$d phím tắt và %2$d thông báo cho %3$s" + "Loại bỏ" + "Đã loại bỏ thông báo" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 8231d93a35..0a43a9175d 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -70,8 +70,7 @@ "文件夹:%1$s" "微件" "壁纸" - - + "主屏幕设置" "已被您的管理员停用" "概览" "允许旋转主屏幕" @@ -85,6 +84,14 @@ "使用系统默认设置" + + + + + + + + "未知" @@ -121,10 +128,7 @@ "微件尺寸已调整为:宽度 %1$s,高度 %2$s" "快捷方式" "%2$s%1$d 个快捷方式" - - - - - - + "%3$s%1$d 个快捷方式和 %2$d 条通知" + "关闭" + "已关闭通知" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 1a42ad86ad..ae66324aa0 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -70,8 +70,7 @@ "資料夾:%1$s" "小工具" "桌布" - - + "Home 設定" "已由您的管理員停用" "概覽" "允許主畫面旋轉" @@ -85,6 +84,14 @@ "使用系統預設設定" + + + + + + + + "不明" @@ -121,10 +128,7 @@ "已調整小工具的大小至闊 %1$s%2$s" "捷徑" "「%2$s」嘅 %1$d 個捷徑" - - - - - - + "「%3$s」嘅 %1$d 個捷徑同 %2$d 個通知" + "關閉" + "關閉咗通知" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index b0cbf6c417..02f63504ef 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -70,8 +70,7 @@ "資料夾:%1$s" "小工具" "桌布" - - + "Home 設定" "已由你的管理員停用" "總覽" "允許旋轉主螢幕" @@ -85,6 +84,14 @@ "使用系統預設值" + + + + + + + + "不明" @@ -121,10 +128,7 @@ "已將小工具的寬度和高度分別調整為 %1$s%2$s" "捷徑" "「%2$s」有 %1$d 個捷徑" - - - - - - + "%1$d 個捷徑和 %2$d 則「%3$s」通知" + "關閉" + "已關閉通知" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 9226248bd1..bdb46a359e 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -70,8 +70,7 @@ "Ifolda: %1$s" "Amawijethi" "Izithombe zangemuva" - - + "Izilungiselelo zasekhaya" "Kukhutshazwe umlawuli wakho" "Ukubuka konke" "Vumela ukuphendukiswa kwesikrini sasekhaya" @@ -85,6 +84,14 @@ "Sebenzisa okuzenzakalelayo kwesistimu" + + + + + + + + "Akwaziwa" @@ -121,10 +128,7 @@ "Iwijethi inikezwe usayizi omusha ngobubanzi obungu-%1$s ubude obungu-%2$s" "Izinqamuleli" "%1$d izinqamuleli ze-%2$s" - - - - - - + "%1$d izinqamuleli nezaziso ezingu-%2$d ze-%3$s" + "Cashisa" + "Isaziso sicashisiwe" From 07309691c8ac9908c899eb58939823a09fe03031 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 30 May 2017 15:47:17 -0700 Subject: [PATCH 119/446] Import translations. DO NOT MERGE Change-Id: I0a45159b7ef25640e7dfdbb7a465245033d031e9 Auto-generated-cl: translation import --- res/values-af/strings.xml | 20 ++++++++++++-------- res/values-am/strings.xml | 20 ++++++++++++-------- res/values-ar/strings.xml | 20 ++++++++++++-------- res/values-az/strings.xml | 20 ++++++++++++-------- res/values-b+sr+Latn/strings.xml | 20 ++++++++++++-------- res/values-be/strings.xml | 20 ++++++++++++-------- res/values-bg/strings.xml | 20 ++++++++++++-------- res/values-bn/strings.xml | 20 ++++++++++++-------- res/values-bs/strings.xml | 20 ++++++++++++-------- res/values-ca/strings.xml | 20 ++++++++++++-------- res/values-cs/strings.xml | 20 ++++++++++++-------- res/values-da/strings.xml | 20 ++++++++++++-------- res/values-de/strings.xml | 20 ++++++++++++-------- res/values-el/strings.xml | 20 ++++++++++++-------- res/values-en-rAU/strings.xml | 20 ++++++++++++-------- res/values-en-rGB/strings.xml | 20 ++++++++++++-------- res/values-en-rIN/strings.xml | 20 ++++++++++++-------- res/values-es-rUS/strings.xml | 20 ++++++++++++-------- res/values-es/strings.xml | 20 ++++++++++++-------- res/values-et/strings.xml | 20 ++++++++++++-------- res/values-eu/strings.xml | 20 ++++++++++++-------- res/values-fa/strings.xml | 20 ++++++++++++-------- res/values-fi/strings.xml | 20 ++++++++++++-------- res/values-fr-rCA/strings.xml | 20 ++++++++++++-------- res/values-fr/strings.xml | 20 ++++++++++++-------- res/values-gl/strings.xml | 20 ++++++++++++-------- res/values-gu/strings.xml | 20 ++++++++++++-------- res/values-hi/strings.xml | 20 ++++++++++++-------- res/values-hr/strings.xml | 20 ++++++++++++-------- res/values-hu/strings.xml | 20 ++++++++++++-------- res/values-hy/strings.xml | 20 ++++++++++++-------- res/values-in/strings.xml | 20 ++++++++++++-------- res/values-is/strings.xml | 20 ++++++++++++-------- res/values-it/strings.xml | 20 ++++++++++++-------- res/values-iw/strings.xml | 20 ++++++++++++-------- res/values-ja/strings.xml | 20 ++++++++++++-------- res/values-ka/strings.xml | 20 ++++++++++++-------- res/values-kk/strings.xml | 20 ++++++++++++-------- res/values-km/strings.xml | 20 ++++++++++++-------- res/values-kn/strings.xml | 20 ++++++++++++-------- res/values-ko/strings.xml | 20 ++++++++++++-------- res/values-ky/strings.xml | 20 ++++++++++++-------- res/values-lo/strings.xml | 20 ++++++++++++-------- res/values-lt/strings.xml | 20 ++++++++++++-------- res/values-lv/strings.xml | 20 ++++++++++++-------- res/values-mk/strings.xml | 20 ++++++++++++-------- res/values-ml/strings.xml | 20 ++++++++++++-------- res/values-mn/strings.xml | 20 ++++++++++++-------- res/values-mr/strings.xml | 20 ++++++++++++-------- res/values-ms/strings.xml | 20 ++++++++++++-------- res/values-my/strings.xml | 20 ++++++++++++-------- res/values-nb/strings.xml | 20 ++++++++++++-------- res/values-ne/strings.xml | 20 ++++++++++++-------- res/values-nl/strings.xml | 20 ++++++++++++-------- res/values-pa/strings.xml | 22 +++++++++++++--------- res/values-pl/strings.xml | 20 ++++++++++++-------- res/values-pt-rPT/strings.xml | 20 ++++++++++++-------- res/values-pt/strings.xml | 20 ++++++++++++-------- res/values-ro/strings.xml | 20 ++++++++++++-------- res/values-ru/strings.xml | 20 ++++++++++++-------- res/values-si/strings.xml | 20 ++++++++++++-------- res/values-sk/strings.xml | 20 ++++++++++++-------- res/values-sl/strings.xml | 20 ++++++++++++-------- res/values-sq/strings.xml | 20 ++++++++++++-------- res/values-sr/strings.xml | 20 ++++++++++++-------- res/values-sv/strings.xml | 20 ++++++++++++-------- res/values-sw/strings.xml | 20 ++++++++++++-------- res/values-ta/strings.xml | 20 ++++++++++++-------- res/values-te/strings.xml | 20 ++++++++++++-------- res/values-th/strings.xml | 20 ++++++++++++-------- res/values-tl/strings.xml | 20 ++++++++++++-------- res/values-tr/strings.xml | 20 ++++++++++++-------- res/values-uk/strings.xml | 20 ++++++++++++-------- res/values-ur/strings.xml | 20 ++++++++++++-------- res/values-uz/strings.xml | 20 ++++++++++++-------- res/values-vi/strings.xml | 20 ++++++++++++-------- res/values-zh-rCN/strings.xml | 20 ++++++++++++-------- res/values-zh-rHK/strings.xml | 20 ++++++++++++-------- res/values-zh-rTW/strings.xml | 20 ++++++++++++-------- res/values-zu/strings.xml | 20 ++++++++++++-------- 80 files changed, 961 insertions(+), 641 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index bd966c732b..fda7db19cc 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -70,8 +70,7 @@ "Vouer: %1$s" "Legstukke" "Muurpapiere" - - + "Home-instellings" "Gedeaktiveer deur jou administrateur" "Oorsig" "Laat toe dat tuisskerm gedraai word" @@ -85,6 +84,14 @@ "Gebruik stelselverstek" + + + + + + + + "Onbekend" @@ -121,10 +128,7 @@ "Legstukgrootte is verander na breedte %1$s hoogte %2$s" "Kortpaaie" "%1$d kortpaaie vir %2$s" - - - - - - + "%1$d kortpaaie en %2$d kennisgewings vir %3$s" + "Maak toe" + "Kennisgewing is toegemaak" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index dee2910619..ba39963f88 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -70,8 +70,7 @@ "አቃፊ፦ %1$s" "ፍርግሞች" "የግድግዳ ወረቀቶች" - - + "የመነሻ ቅንብሮች" "በእርስዎ አስተዳዳሪ የተሰናከለ" "አጠቃላይ ዕይታ" "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" @@ -85,6 +84,14 @@ "የሥርዓቱን ነባሪ ተጠቀም" + + + + + + + + "የማይታወቅ" @@ -121,10 +128,7 @@ "የመግብር መጠን ወደ ስፋት %1$s ቁመት %2$s ተለውጧል" "አቋራጮች" "%1$d%2$s አቋራጮች" - - - - - - + "%1$d አቋራጮች እና %2$d ማሳወቂያዎች ለ%3$s" + "አሰናብት" + "ማሳወቂያ ተሰናብቷል" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 94a5aead47..2852376638 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -70,8 +70,7 @@ "المجلد: %1$s" "الأدوات" "الخلفيات" - - + "إعدادات الصفحة الرئيسية" "عطَّل المشرف هذه الميزة" "نظرة عامة" "السماح بتدوير الشاشة الرئيسية" @@ -85,6 +84,14 @@ "استخدام الإعداد الافتراضي للنظام" + + + + + + + + "غير معروفة" @@ -121,10 +128,7 @@ "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" "الاختصارات" "%1$d اختصار لتطبيق %2$s" - - - - - - + "هناك %1$d اختصار و%2$d إشعار عن %3$s" + "تجاهل" + "تم تجاهل الإشعار" diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index 853520ae13..6b997883ff 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -70,8 +70,7 @@ "Qovluq: %1$s" "Vidcet" "Divar kağızları" - - + "Home ayarları" "Admininiz tərəfindən deaktiv edilib" "İcmal" "Əsas ekranın firlanmağına icazə verin" @@ -85,6 +84,14 @@ "Sistem defoltu istifadə edin" + + + + + + + + "Naməlum" @@ -121,10 +128,7 @@ "Vidcetin eni %1$s hündürlüyü %2$s kimi ölçüləndirildi" "Qısa yollar" "%1$d üçün %2$s qısa yolu" - - - - - - + "%3$s üçün %1$d qısayol və %2$d bildiriş" + "Rədd edin" + "Bildiriş rədd edildi" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 03a93aae43..d96bd62f71 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -70,8 +70,7 @@ "Direktorijum: %1$s" "Vidžeti" "Pozadine" - - + "Podešavanja početnog ekrana" "Administrator je onemogućio" "Pregled" "Dozvoli rotaciju početnog ekrana" @@ -85,6 +84,14 @@ "Koristi podrazumevano sistemsko podešavanje" + + + + + + + + "Nepoznato" @@ -121,10 +128,7 @@ "Veličina vidžeta je promenjena na širinu %1$s i visinu %2$s" "Prečice" "%1$d prečice(a) za %2$s" - - - - - - + "Prečice (%1$d) i obaveštenja (%2$d) za %3$s" + "Odbaci" + "Obaveštenje je odbačeno" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 85953c4d63..8ee1663235 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -70,8 +70,7 @@ "Папка: %1$s" "Віджэты" "Шпалеры" - - + "Налады галоўнага экрана" "Адключаная адміністратарам" "Агляд" "Дазволіць паварот галоўнага экрана" @@ -85,6 +84,14 @@ "Выкарыстоўваць стандартныя формы" + + + + + + + + "Невядома" @@ -121,10 +128,7 @@ "Памеры віджэта зменены на: шырыня %1$s, вышыня %2$s" "Ярлыкі" "Ярлыкі (%1$d) для %2$s" - - - - - - + "Ярлыкі (%1$d) і апавяшчэнні (%2$d) для %3$s" + "Адхіліць" + "Апавяшчэнне адхілена" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 93e484a3b8..61de76f24a 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -70,8 +70,7 @@ "Папка: „%1$s“" "Приспособления" "Тапети" - - + "Настройки за Google Home" "Деактивирано от администратора ви" "Общ преглед" "Разрешаване на завъртането на началния екран" @@ -85,6 +84,14 @@ "Използване на стандартната системна настройка" + + + + + + + + "Няма информация" @@ -121,10 +128,7 @@ "Приспособлението е преоразмерено към ширина %1$s и височина %2$s" "Преки пътища" "%1$d преки пътища за %2$s" - - - - - - + "%1$d преки пътища и %2$d известия за %3$s" + "Отхвърляне" + "Известието е отхвърлено" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index b498f50ca4..d7bd83b7fa 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -70,8 +70,7 @@ "ফোল্ডার: %1$s" "উইজেটগুলি" "ওয়ালপেপারগুলি" - - + "হোম এর সেটিংস" "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" "এক নজরে" "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" @@ -84,6 +83,14 @@ "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" "সিস্টেমের ডিফল্ট মান ব্যবহার করুন" + + + + + + + + "আইকনের আকৃতি পরিবর্তন করা হচ্ছে" "অজানা" "সরান" @@ -119,10 +126,7 @@ "উইজেটের আকার প্রস্থ %1$s উচ্চতা %2$s তে পরিবর্তন করা হয়েছে" "শর্টকাট" "%2$s এর %1$dটি শর্টকার্ট" - - - - - - + "%3$s এর জন্য %1$dটি শর্টকাট এবং %2$dটি বিজ্ঞপ্তি" + "খারিজ করুন" + "বিজ্ঞপ্তি খারিজ করা হয়েছে" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index fc2ad74702..c148413839 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Dodaci" "Pozadinske slike" - - + "Postavke za Home" "Onemogućio vaš administrator" "Pregled" "Dozvoli rotiranje početnog ekrana" @@ -85,6 +84,14 @@ "Koristite sistemski zadano" + + + + + + + + "Nepoznato" @@ -121,10 +128,7 @@ "Veličina vidžeta je promijenjena na širinu %1$s visinu %2$s" "Prečice" "%1$d prečica za aplikaciju %2$s" - - - - - - + "Za aplikaciju %3$s broj prečica je %1$d, a broj obavještenja je %2$d" + "Odbaci" + "Obavještenje je odbačeno" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 7af2ef923b..245c760175 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -70,8 +70,7 @@ "Carpeta: %1$s" "Widgets" "Fons de pantalla" - - + "Configuració de la pantalla d\'inici" "Desactivada per l\'administrador" "Visió general" "Permet la rotació de la pantalla d\'inici" @@ -85,6 +84,14 @@ "Utilitza l\'opció predeterminada del sistema" + + + + + + + + "Desconegut" @@ -121,10 +128,7 @@ "S\'ha canviat la mida del widget a l\'amplada %1$s i l\'alçada %2$s" "Dreceres" "%1$d dreceres per a l\'aplicació %2$s" - - - - - - + "%1$d dreceres i %2$d notificacions per a %3$s" + "Ignora" + "S\'ha ignorat la notificació" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 073ad04583..556294b56a 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -70,8 +70,7 @@ "Složka: %1$s" "Widgety" "Tapety" - - + "Nastavení plochy" "Zakázáno administrátorem" "Přehled" "Povolit otáčení plochy" @@ -85,6 +84,14 @@ "Použít výchozí nastavení systému" + + + + + + + + "Neznámé" @@ -121,10 +128,7 @@ "Velikost widgetu upravena: šířka %1$s, výška %2$s" "Zkratky" "Počet zkratek pro aplikaci %2$s: %1$d" - - - - - - + "Zkratky (%1$d) a oznámení (%2$d) aplikace %3$s" + "Zavřít" + "Oznámení bylo zavřeno" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 922e891502..f811f119c9 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -70,8 +70,7 @@ "Mappe: %1$s" "Widgets" "Baggrunde" - - + "Indstillinger for startskærmen" "Deaktiveret af din administrator" "Oversigt" "Tillad rotation af startskærmen" @@ -85,6 +84,14 @@ "Brug systemstandarden" + + + + + + + + "Ukendt" @@ -121,10 +128,7 @@ "Størrelsen for widgetten er ændret til bredde %1$s og højde %2$s" "Genveje" "%1$d genveje til %2$s" - - - - - - + "%1$d genveje og %2$d underretninger for %3$s" + "Afvis" + "Underretningen blev afvist" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index b7e385e6dd..f25b46fc42 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -70,8 +70,7 @@ "Ordner: %1$s" "Widgets" "Hintergründe" - - + "Einstellungen für den Startbildschirm" "Von deinem Administrator deaktiviert" "Übersicht" "Drehung des Startbildschirms zulassen" @@ -85,6 +84,14 @@ "Systemstandardeinstellung verwenden" + + + + + + + + "Unbekannt" @@ -121,10 +128,7 @@ "Größe des Widgets zu Breite %1$s und Höhe %2$s geändert" "Verknüpfungen" "%1$d Verknüpfungen für %2$s" - - - - - - + "%1$d Verknüpfungen und %2$d Benachrichtigungen für %3$s" + "Schließen" + "Benachrichtigung geschlossen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 4c589063ee..a148c51cea 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -70,8 +70,7 @@ "Φάκελος: %1$s" "Γραφικά στοιχεία" "Ταπετσαρίες" - - + "Ρυθμίσεις Αρχικής σελίδας" "Απενεργοποιήθηκε από τον διαχειριστή σας" "Επισκόπηση" "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" @@ -85,6 +84,14 @@ "Χρήση προεπιλογής συστήματος" + + + + + + + + "Άγνωστο" @@ -121,10 +128,7 @@ "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" "Συντομεύσεις" "%1$d συντομεύσεις για %2$s" - - - - - - + "%1$d συντομεύσεις και %2$d ειδοποιήσεις για την εφαρμογή %3$s" + "Παράβλεψη" + "Η ειδοποίηση παραβλέφθηκε" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index a718971217..504bd81cb0 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widgets" "Wallpapers" - - + "Home settings" "Disabled by your admin" "Overview" "Allow Homescreen rotation" @@ -85,6 +84,14 @@ "Use system default" + + + + + + + + "Unknown" @@ -121,10 +128,7 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" - - - - - - + "%1$d shortcuts and %2$d notifications for %3$s" + "Dismiss" + "Notification dismissed" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index a718971217..504bd81cb0 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widgets" "Wallpapers" - - + "Home settings" "Disabled by your admin" "Overview" "Allow Homescreen rotation" @@ -85,6 +84,14 @@ "Use system default" + + + + + + + + "Unknown" @@ -121,10 +128,7 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" - - - - - - + "%1$d shortcuts and %2$d notifications for %3$s" + "Dismiss" + "Notification dismissed" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index a718971217..504bd81cb0 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widgets" "Wallpapers" - - + "Home settings" "Disabled by your admin" "Overview" "Allow Homescreen rotation" @@ -85,6 +84,14 @@ "Use system default" + + + + + + + + "Unknown" @@ -121,10 +128,7 @@ "Widget re-sized to width %1$s height %2$s" "Short cuts" "%1$d shortcuts for %2$s" - - - - - - + "%1$d shortcuts and %2$d notifications for %3$s" + "Dismiss" + "Notification dismissed" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index cafea4c8f7..4999275651 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -70,8 +70,7 @@ "Carpeta: %1$s" "Widgets" "Fondos de pantalla" - - + "Configuración de Home" "El administrador inhabilitó esta función" "Recientes" "Permitir la rotación de la pantalla principal" @@ -85,6 +84,14 @@ "Usar el sistema predeterminado" + + + + + + + + "Desconocido" @@ -121,10 +128,7 @@ "Se cambió la dimensión del widget a %1$s de ancho y %2$s de alto." "Accesos directos" "%1$d accesos directos para %2$s" - - - - - - + "%1$d accesos directos y %2$d notificaciones de %3$s" + "Descartar" + "Se descartó la notificación" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 6b3bb34eb6..5e4f1617d8 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -70,8 +70,7 @@ "Carpeta: %1$s" "Widgets" "Fondos de pantalla" - - + "Ajustes de Home" "Inhabilitada por el administrador" "Visión general" "Permitir rotación de la pantalla de inicio" @@ -85,6 +84,14 @@ "Usar opción predeterminada del sistema" + + + + + + + + "Desconocido" @@ -121,10 +128,7 @@ "Se ha modificado el tamaño del widget a %1$s de ancho y %2$s de alto" "Accesos directos" "%1$d accesos directos de %2$s" - - - - - - + "%1$d accesos directos y %2$d notificaciones de %3$s" + "Ignorar" + "Notificación ignorada" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 5d57ef1182..51a3f7ab33 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -70,8 +70,7 @@ "Kaust: %1$s" "Vidinad" "Taustapildid" - - + "Avalehe seaded" "Keelas administraator" "Ülevaade" "Luba avaekraani pööramine" @@ -85,6 +84,14 @@ "Kasuta süsteemi vaikeseadet" + + + + + + + + "Teadmata" @@ -121,10 +128,7 @@ "Vidina suurust muudeti. Laius: %1$s. Kõrgus: %2$s" "Otseteed" "%1$d otseteed rakenduse %2$s jaoks" - - - - - - + "%1$d otseteed ja %2$d märguannet rakendusele %3$s" + "Loobu" + "Märguandest loobuti" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index ee6cf0caa1..063ce2b6aa 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -70,8 +70,7 @@ "Karpeta: %1$s" "Widgetak" "Horma-paperak" - - + "Hasierako pantailaren ezarpenak" "Administratzaileak desgaitu du" "Ikuspegi orokorra" "Baimendu hasierako pantaila biratzea" @@ -85,6 +84,14 @@ "Erabili sistemaren balio lehenetsiak" + + + + + + + + "Ezezaguna" @@ -121,10 +128,7 @@ "Aldatu da widgetaren tamaina. Zabalera: %1$s. Altuera: %2$s." "Lasterbideak" "%2$s aplikazioaren %1$d lasterbide" - - - - - - + "%3$s aplikazioaren %1$d lasterbide eta %2$d jakinarazpen" + "Baztertu" + "Baztertu egin da jakinarazpena" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 059a484bd5..f3b3a8477a 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -70,8 +70,7 @@ "پوشه: %1$s" "ابزارک‌ها" "کاغذدیواری‌ها" - - + "تنظیمات صفحه اصلی" "توسط سرپرست سیستم غیرفعال شده است" "نمای کلی" "امکان دادن به چرخش صفحه اصلی" @@ -85,6 +84,14 @@ "استفاده از پیش‌فرض سیستم" + + + + + + + + "نامشخص" @@ -121,10 +128,7 @@ "اندازه ابزارک به عرض %1$s ارتفاع %2$s تغییر کرد" "میان‌برها" "%1$d میانبر برای %2$s" - - - - - - + "%1$d میان‌بر و %2$d اعلان برای %3$s" + "رد کردن" + "اعلان رد شد" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 6223f63b30..49d44f85d3 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -70,8 +70,7 @@ "Kansio: %1$s" "Widgetit" "Taustakuvat" - - + "Kotiasetukset" "Järjestelmänvalvoja on poistanut toiminnon käytöstä." "Yleiskatsaus" "Salli aloitusnäytön kiertäminen" @@ -85,6 +84,14 @@ "Käytä järjestelmän oletusarvoa" + + + + + + + + "Tuntematon" @@ -121,10 +128,7 @@ "Widgetin kokoa muutettiin. Sen leveys on nyt %1$s ja korkeus %2$s." "Pikakuvakkeet" "Sovelluksella %2$s on %1$d pikakuvaketta." - - - - - - + "%3$s: %1$d pikakuvaketta ja %2$d ilmoitusta" + "Hylkää" + "Ilmoitus hylätty" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 1b2d6107af..0169e5dbdf 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -70,8 +70,7 @@ "Dossier : %1$s" "Widgets" "Fonds d\'écran" - - + "Paramètres d\'accueil" "Cette fonction est désactivée par votre administrateur" "Présentation" "Autoriser la rotation de l\'écran d\'accueil" @@ -85,6 +84,14 @@ "Utiliser les valeurs système par défaut" + + + + + + + + "Inconnu" @@ -121,10 +128,7 @@ "Le widget a été redimensionné (largeur : %1$s, hauteur : %2$s)" "Raccourcis" "%1$d raccourcis pour %2$s" - - - - - - + "%1$d raccourcis et %2$d notifications pour %3$s" + "Ignorer" + "Notification ignorée" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 9823764de8..944a6cb4c6 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -70,8 +70,7 @@ "Dossier \"%1$s\"" "Widgets" "Fonds d\'écran" - - + "Paramètres du domicile" "Désactivé par votre administrateur" "Vue d\'ensemble" "Autoriser la rotation de l\'écran d\'accueil" @@ -85,6 +84,14 @@ "Utiliser la valeur système par défaut" + + + + + + + + "Inconnu" @@ -121,10 +128,7 @@ "Le widget a bien été redimensionné (largeur : %1$s, hauteur : %2$s)." "Raccourcis" "%1$d raccourcis pour %2$s" - - - - - - + "%1$d raccourcis et %2$d notifications pour %3$s" + "Ignorer" + "Notification ignorée" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index e1c7e2a9f5..fb4489c64f 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -70,8 +70,7 @@ "Cartafol: %1$s" "Widgets" "Fondos de pantalla" - - + "Configuración de inicio" "Función desactivada polo administrador" "Visión xeral" "Permitir xirar a pantalla de inicio" @@ -85,6 +84,14 @@ "Usar valores predeterminados do sistema" + + + + + + + + "Descoñecido" @@ -121,10 +128,7 @@ "Cambiouse o tamaño do widget polo ancho %1$s e a altura %2$s" "Atallos" "%1$d atallos para %2$s" - - - - - - + "%1$d atallos e %2$d notificacións para a aplicación %3$s" + "Ignorar" + "Ignorouse a notificación" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index 1dfbfd0564..9a316b296f 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -70,8 +70,7 @@ "ફોલ્ડર: %1$s" "વિજેટ્સ" "વૉલપેપર્સ" - - + "હોમ સેટિંગ્સ" "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" "વિહંગાવલોકન" "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" @@ -84,6 +83,14 @@ "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" "સિસ્ટમ ડિફૉલ્ટનો ઉપયોગ કરો" + + + + + + + + "આઇકનના આકારમાં કરેલ ફેરફારો લાગુ કરી રહ્યા છીએ" "અજાણ્યો" "દૂર કરો" @@ -119,10 +126,7 @@ "વિજેટનો આકાર બદલીને %1$s પહોળાઈ %2$s ઊંચાઈ કર્યો" "શૉર્ટકટ્સ" "%2$s માટે %1$d શૉર્ટકટ" - - - - - - + "%3$s માટે %1$d શૉર્ટકટ અને %2$d સૂચનાઓ" + "છોડી દો" + "સૂચના છોડી દીધી" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 975a650b26..db4a52e961 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -70,8 +70,7 @@ "फ़ोल्डर: %1$s" "शॉर्टकट" "वॉलपेपर" - - + "होम सेटिंग" "आपके व्यवस्थापक द्वारा अक्षम" "अवलोकन" "होमस्क्रीन घुमाने की अनुमति दें" @@ -85,6 +84,14 @@ "सिस्टम डिफ़ॉल्ट का उपयोग करें" + + + + + + + + "अज्ञात" @@ -121,10 +128,7 @@ "विजेट का आकार बदलकर उसकी चौड़ाई %1$s और ऊंचाई %2$s कर दी गई" "शॉर्टकट" "%2$s के लिए %1$d शॉर्टकट" - - - - - - + "%3$s के लिए %1$d शॉर्टकट और %2$d नोटिफ़िकेशन हैं" + "खारिज करें" + "नोटिफ़िकेशन को खारिज किया गया" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index f53cf5cfb7..322fb3f583 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -70,8 +70,7 @@ "Mapa: %1$s" "Widgeti" "Pozadine" - - + "Postavke Homea" "Onemogućio administrator" "Pregled" "Dopusti zakretanje početnog zaslona" @@ -85,6 +84,14 @@ "Upotrijebi zadane postavke sustava" + + + + + + + + "Nepoznato" @@ -121,10 +128,7 @@ "Širina widgeta promijenjena je na %1$s, a visina na %2$s" "Prečaci" "Prečaca za aplikaciju %2$s: %1$d" - - - - - - + "Za aplikaciju %3$s ima prečaca (ukupno %1$d) i obavijesti (ukupno %2$d)" + "Odbaci" + "Obavijest je odbačena" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 461730229a..938ed30810 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -70,8 +70,7 @@ "Mappa: %1$s" "Modulok" "Háttérképek" - - + "A Home beállításai" "A rendszergazda letiltotta" "Áttekintés" "A kezdőképernyő elforgatásának engedélyezése" @@ -85,6 +84,14 @@ "Alapértelmezett érték használata" + + + + + + + + "Ismeretlen" @@ -121,10 +128,7 @@ "Modul átméretezve %1$s szélességre és %2$s magasságra" "Gyorsparancsok" "%1$d gyorsparancs a(z) %2$s számára" - - - - - - + "%1$d parancsikon és %2$d értesítés a következő alkalmazásnál: %3$s" + "Elvetés" + "Értesítés elvetve" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index c946290a19..b00ed68dbb 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -70,8 +70,7 @@ "Պանակ՝ %1$s" "Վիջեթներ" "Պաստառներ" - - + "Գլխավոր էջի կարգավորումներ" "Անջատվել է ձեր ադմինիստրատորի կողմից" "Համատեսք" "Թույլ տալ հիմնական էկրանի պտտումը" @@ -85,6 +84,14 @@ "Օգտագործել համակարգի կանխադրված կարգավորումը" + + + + + + + + "Անհայտ է" @@ -121,10 +128,7 @@ "Վիջեթի լայնությունը փոխվել է %1$s-ի, իսկ բարձրությունը՝ %2$s-ի" "Դյուրանցումներ" "%1$d դյուրանցումներ %2$s հավելվածի համար" - - - - - - + "%1$d դյուրացում և %2$d ծանուցում %3$s-ի համար" + "Անտեսել" + "Ծանուցումը մերժված է" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 31d3db172e..0c80fb7dd0 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widget" "Wallpaper" - - + "Setelan layar Utama" "Dinonaktifkan oleh admin" "Ringkasan" "Izinkan layar Utama diputar" @@ -85,6 +84,14 @@ "Gunakan default sistem" + + + + + + + + "Tidak dikenal" @@ -121,10 +128,7 @@ "Widget diubah ukurannya menjadi lebar %1$s tinggi %2$s" "Pintasan" "%1$d pintasan untuk %2$s" - - - - - - + "%1$d pintasan dan %2$d notifikasi untuk %3$s" + "Tutup" + "Notifikasi ditutup" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index beb45df0bd..702506599f 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -70,8 +70,7 @@ "Mappa: %1$s" "Græjur" "Veggfóður" - - + "Heimastillingar" "Gert óvirkt af kerfisstjóra" "Yfirlit" "Leyfa snúning fyrir heimaskjá" @@ -85,6 +84,14 @@ "Nota sjálfgildi kerfis" + + + + + + + + "Óþekkt" @@ -121,10 +128,7 @@ "Stærð græju breytt í %1$s á breidd og %2$s á hæð" "Flýtileiðir" "%1$d flýtileiðir fyrir %2$s" - - - - - - + "%1$d flýtileiðir og %2$d tilkynningar fyrir %3$s" + "Hunsa" + "Tilkynningu lokað" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index b3fef36892..d0749cdc76 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -70,8 +70,7 @@ "Cartella: %1$s" "Widget" "Sfondi" - - + "Impostazioni Home" "Disattivata dall\'amministratore" "Panoramica" "Consenti rotazione della schermata Home" @@ -85,6 +84,14 @@ "Usa impostazione predefinita di sistema" + + + + + + + + "Sconosciuto" @@ -121,10 +128,7 @@ "Widget ridimensionato a larghezza %1$s, altezza %2$s" "Scorciatoie" "%1$d scorciatoie per %2$s" - - - - - - + "%1$d scorciatoie e %2$d notifiche relative a %3$s" + "Ignora" + "Notifica ignorata" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index cbc1ac3f8a..b472fabb2d 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -70,8 +70,7 @@ "תיקיה: %1$s" "רכיבי ווידג\'ט" "טפטים" - - + "הגדרות דף הבית" "הושבת על ידי מנהל המערכת שלך" "סקירה" "אפשרות סיבוב של מסך דף הבית" @@ -85,6 +84,14 @@ "השתמש בברירת המחדל של המערכת" + + + + + + + + "לא ידוע" @@ -121,10 +128,7 @@ "גודל הווידג\'ט שונה - רוחב %1$s גובה %2$s" "קיצורי דרך" "%1$d קיצורי דרך עבור %2$s" - - - - - - + "%1$d קיצורי דרך ו-%2$d הודעות של %3$s" + "סגור" + "ההודעה נסגרה" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index a0d36ca54d..4a58056a54 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -70,8 +70,7 @@ "フォルダ: %1$s" "ウィジェット" "壁紙" - - + "ホームの設定" "管理者により無効にされています" "概要" "ホーム画面の回転を許可" @@ -85,6 +84,14 @@ "システムのデフォルトを使用" + + + + + + + + "不明" @@ -121,10 +128,7 @@ "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" "ショートカット" "%2$s用の %1$d 件のショートカット" - - - - - - + "%3$s: %1$d 件のショートカットと %2$d 件の通知" + "表示しない" + "通知を非表示にしました" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index c9048e4fc6..0bade8e418 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -70,8 +70,7 @@ "საქაღალდე: %1$s" "ვიჯეტები" "ფონები" - - + "მთავარი გვერდის პარამეტრები" "გათიშულია თქვენი ადმინისტრატორის მიერ" "მიმოხილვა" "მთავარი ეკრანის შეტრიალების დაშვება" @@ -85,6 +84,14 @@ "ნაგულისხმევი სისტემური პარამეტრების გამოყენება" + + + + + + + + "უცნობი" @@ -121,10 +128,7 @@ "ვიჯეტის ზომები შეიცვალა: სიგანე %1$s სიმაღლე %2$s" "მალსახმობები" "%2$s-ს აქვს %1$d მალსახმობი" - - - - - - + "%3$s-ის %1$d მალსახმობი და %2$d შეტყობინება" + "დახურვა" + "შეტყობინება დაიხურა" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 9a75c36f32..9b2dab321d 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -70,8 +70,7 @@ "Қалта: %1$s" "Виджеттер" "Тұсқағаздар" - - + "Негізгі экран параметрлері" "Әкімші өшірді" "Шолу" "Негізгі экранның бұрылуына рұқсат ету" @@ -85,6 +84,14 @@ "Жүйенің әдепкі параметрін пайдалану" + + + + + + + + "Белгісіз" @@ -121,10 +128,7 @@ "Виджет өлшемінің ені %1$s, биіктігі %2$s болып өзгертілді" "Таңбашалар" "%2$s қолданбасына арналған %1$d таңбаша" - - - - - - + "%3$s қолданбасының %1$d таңбашасы мен %2$d хабарландыруы" + "Бас тарту" + "Хабарландырудан бас тартылды" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 4f0c0ee59e..59c13cc9ca 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -70,8 +70,7 @@ "ថត៖ %1$s" "ធាតុ​ក្រាហ្វិក" "ផ្ទាំង​រូបភាព" - - + "ការកំណត់​ទំព័រដើម" "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" "សង្ខេប" "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" @@ -85,6 +84,14 @@ "ប្រើលំនាំដើមរបស់ប្រព័ន្ធ" + + + + + + + + "មិន​ស្គាល់" @@ -121,10 +128,7 @@ "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %1$s កម្ពស់ប្រវែង %2$s" "ផ្លូវកាត់" "%1$d ផ្លូវកាត់សម្រាប់ %2$s" - - - - - - + "ផ្លូវកាត់ចំនួន %1$d និង​ការជូនដំណឹងចំនួន %2$d សម្រាប់ %3$s" + "បដិសេធ" + "បាន​បដិសេធ​ការជូនដំណឹង" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 626fbcdafe..1cda087cb0 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -70,8 +70,7 @@ "ಫೋಲ್ಡರ್: %1$s" "ವಿಜೆಟ್‌ಗಳು" "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" - - + "ಮುಖಪುಟ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" "ಅವಲೋಕನ" "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" @@ -84,6 +83,14 @@ "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" "ಸಿಸ್ಟಂ ಡಿಫಾಲ್ಟ್ ಬಳಸಿ" + + + + + + + + "ಐಕಾನ್ ಆಕಾರ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತಿದೆ" "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" @@ -119,10 +126,7 @@ "ವಿಜೆಟ್ ಅನ್ನು %1$s ಅಗಲ %2$s ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ" "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" "%2$s ಗೆ %1$d ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" - - - - - - + "%3$s ಗಾಗಿ %1$d ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು ಮತ್ತು %2$d ಅಧಿಸೂಚನೆಗಳು" + "ವಜಾಗೊಳಿಸಿ" + "ಅಧಿಸೂಚನೆಯನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 1a2dc7e181..2e8d149dcb 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -70,8 +70,7 @@ "폴더: %1$s" "위젯" "배경화면" - - + "홈 설정" "관리자가 사용 중지함" "개요" "홈 화면 회전 허용" @@ -85,6 +84,14 @@ "시스템 기본값 사용" + + + + + + + + "알 수 없음" @@ -121,10 +128,7 @@ "폭 %1$s, 높이 %2$s로 위젯 크기 조정됨" "바로가기" "%2$s에 사용 가능한 단축키 %1$d개" - - - - - - + "바로가기 %1$d개 및 %3$s 알림 %2$d개" + "닫기" + "알림이 해제되었습니다." diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index ac51c6f8d8..791dfcb2a7 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -70,8 +70,7 @@ "Фолдер: %1$s" "Виджеттер" "Тушкагаздар" - - + "Башкы беттин жөндөөлөрү" "Администраторуңуз өчүрүп койгон" "Көз жүгүртүү" "Башкы экранды айлантууга уруксат берүү" @@ -85,6 +84,14 @@ "Тутум сушунтаган демейкисин колдонуу" + + + + + + + + "Белгисиз" @@ -121,10 +128,7 @@ "Виджеттин кеңдиги %1$s бийиктиги %2$s болду" "Кыска жолдор" "%2$s колдонмосуна %1$d кыска жол бар" - - - - - - + "%3$s колдонмосу үчүн %1$d кыска жол жана %2$d эскертме бар" + "Этибарга албоо" + "Эскертме көз жаздымда калтырылды" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 98928fffd2..cbb17d92bd 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -70,8 +70,7 @@ "ໂຟນເດີ: %1$s" "ວິດເຈັດ" "ພາບພື້ນຫຼັງ" - - + "ການຕັ້ງຄ່າ Home" "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" "ພາບຮວມ" "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" @@ -85,6 +84,14 @@ "ໃຊ້ຄ່າເລີ່ມຕົ້ນລະບົບ" + + + + + + + + "​ບໍ່​ຮູ້​ຈັກ" @@ -121,10 +128,7 @@ "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %1$s ລວງ​ສູງ %2$s ແລ້ວ" "ທາງລັດ" "%1$d ທາງລັດສຳລັບ %2$s" - - - - - - + "%1$d ທາງລັດ ແລະ %2$d ການແຈ້ງເຕືອນສຳລັບ %3$s" + "ປິດໄວ້" + "ປິດການແຈ້ງເຕືອນແລ້ວ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index faf16bbd87..9c7f2aaf67 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -70,8 +70,7 @@ "Aplankas: „%1$s“" "Valdikliai" "Ekrano fonai" - - + "„Home“ nustatymai" "Išjungė administratorius" "Apžvalga" "Leisti pasukti pagrindinį ekraną" @@ -85,6 +84,14 @@ "Naudoti numatytuosius sistemos nustatymus" + + + + + + + + "Nežinoma" @@ -121,10 +128,7 @@ "Valdiklio dydis pakeistas: plotis – %1$s, aukštis – %2$s" "Spartieji klavišai" "Programos „%2$s“ spartieji klavišai (%1$d)" - - - - - - + "„%3$s“ spartieji klavišai (%1$d) ir pranešimai (%2$d)" + "Atsisakyti" + "Pranešimo atsisakyta" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 6228387796..b7f426ee65 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -70,8 +70,7 @@ "Mape: %1$s" "Logrīki" "Fona tapetes" - - + "Sākumlapas iestatījumi" "Atspējojis administrators" "Kopsavilkums" "Atļaut sākuma ekrāna pagriešanu" @@ -85,6 +84,14 @@ "Izmantot sistēmas noklusējumu" + + + + + + + + "Nezināma" @@ -121,10 +128,7 @@ "Logrīka lielums mainīts — platums: %1$s, augstums: %2$s." "Saīsnes" "%1$d saīsnes lietotnei %2$s" - - - - - - + "%1$d saīsnes un %2$d paziņojumi lietotnei %3$s" + "Nerādīt" + "Paziņojums netiek rādīts" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 73f8cfa7b8..6d6473fa0d 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -70,8 +70,7 @@ "Папка: %1$s" "Додатоци" "Позадини" - - + "Поставки за Home" "Оневозможено од администраторот" "Краток преглед" "Дозволете ротација на Почетниот екран" @@ -85,6 +84,14 @@ "Користи ја стандардната поставка на системот" + + + + + + + + "Непознато" @@ -121,10 +128,7 @@ "Големината на виџетот е променета на ширина %1$s висина %2$s" "Кратенки" "%1$d кратенки за %2$s" - - - - - - + "%1$d кратенки и %2$d известувања за %3$s" + "Отфрли" + "Известувањето е отфрлено" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index de90aca5a9..b909c1108b 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -70,8 +70,7 @@ "ഫോൾഡർ: %1$s" "വിജറ്റുകൾ" "വാൾപേപ്പർ" - - + "ഹോം ക്രമീകരണം" "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" "കാഴ്ച" "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" @@ -84,6 +83,14 @@ "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" "സിസ്‌റ്റം ഡിഫോൾട്ട് ഉപയോഗിക്കുക" + + + + + + + + "ഐക്കൺ ആകാര മാറ്റങ്ങൾ പ്രയോഗിക്കുന്നു" "അജ്ഞാതം" "നീക്കംചെയ്യുക" @@ -119,10 +126,7 @@ "വീതി %1$s ഉയരം %2$s-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി" "കുറുക്കുവഴികൾ" "%2$s ആപ്പിനുള്ള %1$d കുറുക്കുവഴികൾ" - - - - - - + "%3$s ആപ്പിനായുള്ള %1$d കുറുക്കുവഴികളും %2$d അറിയിപ്പുകളും" + "നിരസിക്കുക" + "അറിയിപ്പ് നിരസിച്ചു" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 09cef82901..696b42ccf9 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -70,8 +70,7 @@ "Фолдер: %1$s" "Виджет" "Ханын зураг" - - + "Нүүр хуудасны тохиргоо" "Таны админ идэвхгүй болгосон" "Тойм" "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" @@ -85,6 +84,14 @@ "Системийн өгөгдмөл тохиргоог ашиглах" + + + + + + + + "Тодорхойгүй" @@ -121,10 +128,7 @@ "Виджэтийн өргөн %1$s, өндөр %2$s болсон" "Товчлол" "%2$s%1$d товчлол" - - - - - - + "%1$d товчлол болон %3$s%2$d мэдэгдэл" + "Хаах" + "Мэдэгдлийг хаасан" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 9a479389b9..0c74b1584d 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -70,8 +70,7 @@ "फोल्डर: %1$s" "विजेट" "वॉलपेपर" - - + "होम सेटिंग्‍ज" "आपल्या प्रशासकाने अक्षम केले" "विहंगावलोकन" "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" @@ -84,6 +83,14 @@ "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" "सिस्‍टमचे डीफॉल्‍ट वापरा" + + + + + + + + "चिन्हाचा आकार बदल लागू करत आहे" "अज्ञात" "काढा" @@ -119,10 +126,7 @@ "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" "शॉर्टकट" "%2$s साठी %1$d शॉर्टकट" - - - - - - + "%3$sसाठी %1$d शॉर्टकट आणि %2$d सूचना" + "डिसमिस करा" + "सूचना डिसमिस केली" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index be95e32b64..20410bce17 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widget" "Kertas dinding" - - + "Tetapan laman utama" "Dilumpuhkan oleh pentadbir anda" "Ikhtisar" "Benarkan putaran Skrin Utama" @@ -85,6 +84,14 @@ "Gunakan lalai sistem" + + + + + + + + "Tidak diketahui" @@ -121,10 +128,7 @@ "Saiz widget diubah menjadi %1$s lebar %2$s tinggi" "Pintasan" "%1$d pintasan untuk %2$s" - - - - - - + "%1$d pintasan dan %2$d pemberitahuan untuk %3$s" + "Ketepikan" + "Pemberitahuan diketepikan" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index bcb7207f9f..19e017e107 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -70,8 +70,7 @@ "အကန့်အမည်: %1$s" "ဝိဂျက်များ" "နောက်ခံများ" - - + "ပင်မဆက်တင်များ" "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" "ခြုံငုံသုံးသပ်ချက်" "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" @@ -85,6 +84,14 @@ "စနစ်၏ မူရင်းပုံကို အသုံးပြုရန်" + + + + + + + + "မသိရ" @@ -121,10 +128,7 @@ "Widget အား အကျယ် %1$s အမြင့် %2$s အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏" "ဖြတ်လမ်းများ" "%2$s အတွက် အမြန်နည်း %1$d ခု" - - - - - - + "%3$s အတွက် ဖြတ်လမ်းလင့်ခ် %1$d နှင့် အကြောင်းကြားချက် %2$d ခု" + "ပယ်ရန်" + "အသိပေးချက်ကို ဖယ်ထုတ်ပြီးပါပြီ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 4bcee516ff..4d3389e090 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -70,8 +70,7 @@ "Mappe: %1$s" "Moduler" "Bakgrunner" - - + "Startsideinnstillinger" "Administratoren har slått av funksjonen" "Oversikt" "Tillat rotasjon av startskjermen" @@ -85,6 +84,14 @@ "Bruk systemstandard" + + + + + + + + "Ukjent" @@ -121,10 +128,7 @@ "Størrelsen på modulen er endret til bredde %1$s og høyde %2$s" "Snarveier" "%1$d snarveier for %2$s" - - - - - - + "%1$d snarveier og %2$d varsler for %3$s" + "Avvis" + "Varselet ble avvist" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 4d1658fb4c..0f0c654d94 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -70,8 +70,7 @@ "फोल्डर: %1$s" "विजेटहरू" "वालपेपरहरु" - - + "गृहपृष्ठका सेटिङहरू" "तपाईँको प्रशासकद्वारा असक्षम गरिएको" "परिदृश्य" "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" @@ -84,6 +83,14 @@ "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" "प्रणालीको पूर्वनिर्धारित सेटिङ प्रयोग गर्नुहोस्" + + + + + + + + "आइकनको आकारमा गरिएका परिवर्तनहरू लागू गरिँदैछन्" "अज्ञात" "हटाउनुहोस्" @@ -119,10 +126,7 @@ "विजेट चौडाइ %1$s उचाइ %2$s मा पुनः आकार मिलाइयो" "सर्टकटहरू" "%2$s का %1$d सर्टकटहरू" - - - - - - + "%3$s का %1$d सर्टकट र %2$d सूचनाहरू" + "खारेज गर्नुहोस्" + "सूचना खारेज गरियो" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 2653a22ee3..9e35568675 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -70,8 +70,7 @@ "Map: %1$s" "Widgets" "Achtergrond" - - + "Instellingen voor homepage" "Uitgeschakeld door je beheerder" "Overzicht" "Draaien van startscherm toestaan" @@ -85,6 +84,14 @@ "Systeemstandaard gebruiken" + + + + + + + + "Onbekend" @@ -121,10 +128,7 @@ "Formaat van widget gewijzigd in breedte %1$s en hoogte %2$s" "Snelkoppelingen" "%1$d snelkoppelingen voor %2$s" - - - - - - + "%1$d snelkoppelingen en %2$d meldingen voor %3$s" + "Sluiten" + "Melding gesloten" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 5e3b64b05a..76c6bd5371 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -70,20 +70,27 @@ "ਫੋਲਡਰ: %1$s" "ਵਿਜਿਟ" "ਵਾਲਪੇਪਰ" - - + "ਹੋਮ ਸੈਟਿੰਗਾਂ" "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" "ਰੂਪ-ਰੇਖਾ" "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" - "ਪ੍ਰਤੀਕ ਨੂੰ ਬੈਜ ਕਰਨਾ" + "ਪ੍ਰਤੀਕ \'ਤੇ ਬੈਜ ਲਗਾਉਣਾ" "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਚਾਲੂ ਹੈ" "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਬੰਦ ਹੈ" "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" "ਸਿਸਟਮ ਦੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ" + + + + + + + + "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" @@ -119,10 +126,7 @@ "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %1$s ਉਂਚਾਈ %2$s ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ" "ਸ਼ਾਰਟਕੱਟ" "%2$s ਲਈ %1$d ਸ਼ਾਰਟਕੱਟ" - - - - - - + "%3$s ਲਈ %1$d ਸ਼ਾਰਟਕੱਟ ਅਤੇ %2$d ਸੂਚਨਾਵਾਂ" + "ਖਾਰਜ ਕਰੋ" + "ਸੂਚਨਾ ਖਾਰਜ ਕੀਤੀ ਗਈ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 09f0fcafcf..b3eb423376 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Widżety" "Tapety" - - + "Ustawienia strony głównej" "Funkcja wyłączona przez administratora" "Przegląd" "Zezwalaj na obrót ekranu głównego" @@ -85,6 +84,14 @@ "Użyj ustawienia domyślnego" + + + + + + + + "Brak informacji" @@ -121,10 +128,7 @@ "Szerokość i wysokość widżetu zmieniła się na %1$s x %2$s" "Skróty" "Skróty aplikacji %2$s: %1$d" - - - - - - + "Skróty (%1$d) i powiadomienia (%2$d) aplikacji %3$s" + "Odrzuć" + "Powiadomienie odrzucone" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index bf9d0e8162..d1b03aa357 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -70,8 +70,7 @@ "Pasta: %1$s" "Widgets" "Imagens de fundo" - - + "Definições da página inicial" "Desativada pelo administrador" "Vista geral" "Permitir rotação do ecrã principal" @@ -85,6 +84,14 @@ "Utilizar a predefinição do sistema" + + + + + + + + "Desconhecido" @@ -121,10 +128,7 @@ "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" "%1$d atalhos para a aplicação %2$s" - - - - - - + "%1$d atalhos e %2$d notificações para a aplicação %3$s" + "Ignorar" + "Notificação ignorada" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index dfa88c6626..c1176722fb 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -70,8 +70,7 @@ "Pasta: %1$s" "Widgets" "Planos de fundo" - - + "Configurações da página inicial" "Desativado pelo administrador" "Visão geral" "Permitir rotação da tela inicial" @@ -85,6 +84,14 @@ "Usar padrão do sistema" + + + + + + + + "Desconhecido" @@ -121,10 +128,7 @@ "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" "%1$d atalhos para %2$s" - - - - - - + "%1$d atalhos e %2$d notificações para o app %3$s" + "Dispensar" + "Notificação dispensada" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 21795062ea..69b44e28f2 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -70,8 +70,7 @@ "Dosar: %1$s" "Widgeturi" "Imagini de fundal" - - + "Setări pentru ecranul de pornire" "Dezactivată de administrator" "Prezentare generală" "Permiteți rotirea ecranului de pornire" @@ -85,6 +84,14 @@ "Folosiți setarea prestabilită a sistemului" + + + + + + + + "Necunoscut" @@ -121,10 +128,7 @@ "Widgetul a fost redimensionat la lățimea %1$s și înălțimea %2$s" "Comenzi rapide" "%1$d comenzi rapide pentru %2$s" - - - - - - + "%1$d comenzi rapide și %2$d notificări pentru %3$s" + "Închideți" + "Notificare închisă" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index faae2b4c0c..6f00f2d51e 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -70,8 +70,7 @@ "Папка: %1$s" "Виджеты" "Обои" - - + "Настройки главного экрана" "Функция отключена администратором" "Обзор" "Разрешить поворачивать главный экран" @@ -85,6 +84,14 @@ "Использовать системные настройки по умолчанию" + + + + + + + + "Неизвестно" @@ -121,10 +128,7 @@ "Изменен размер виджета: до %1$s в ширину и %2$s в высоту" "Ярлыки" "Количество ярлыков для приложения \"%2$s\": %1$d" - - - - - - + "Количество ярлыков для приложения \"%3$s\": %1$d. Количество уведомлений: %2$d." + "Закрыть" + "Уведомление закрыто" diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 9f6cf5bb73..fec9ff8ab2 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -70,8 +70,7 @@ "ෆෝල්ඩරය: %1$s" "විජට්" "වෝල්පේපර" - - + "Home සැකසීම්" "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" "දළ විශ්ලේෂණය" "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" @@ -85,6 +84,14 @@ "පද්ධති පෙරනිමි භාවිත කරන්න" + + + + + + + + "නොදනී" @@ -121,10 +128,7 @@ "විජට් පළල %1$s උස %2$s වෙත ප්‍රමාණකරණය කරන ලදි" "කෙටිමං" "%2$s සඳහා කෙටි මං %1$d" - - - - - - + "%3$s සඳහා කෙටි මං %1$dක් සහ දැනුම්දීම් %2$dක්" + "ඉවතලන්න" + "දැනුම්දීම ඉවතලන ලදී" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index e920fab1d6..500f14f82b 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -70,8 +70,7 @@ "Priečinok: %1$s" "Miniaplikácie" "Tapety" - - + "Nastavenia služby Home" "Zakázané vaším správcom" "Prehľad" "Povoliť otáčanie plochy" @@ -85,6 +84,14 @@ "Použiť predvolené nastavenie systému" + + + + + + + + "Neznáme" @@ -121,10 +128,7 @@ "Veľkosť miniaplikácie bola zmenená na %1$s x %2$s (šírka x výška)" "Skratky" "Počet skratiek aplikácie %2$s: %1$d" - - - - - - + "Odkazy (%1$d) a upozornenia (%2$d) pre aplikáciu %3$s" + "Zavrieť" + "Upozornenie bolo zavreté" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index fb5df08ced..bc951af462 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -70,8 +70,7 @@ "Mapa: %1$s" "Pripomočki" "Ozadja" - - + "Nastavitve začetnega zaslona" "Onemogočil skrbnik." "Pregled" "Omogočanje sukanja začetnega zaslona" @@ -85,6 +84,14 @@ "Uporabi privzeto nastavitev sistema" + + + + + + + + "Neznano" @@ -121,10 +128,7 @@ "Velikost pripomočka je bila spremenjena na %1$s širine in %2$s višine" "Bližnjice" "Št. bližnjic za aplikacijo %2$s: %1$d" - - - - - - + "Bližnjice (%1$d) in obvestila (%2$d) aplikacije %3$s" + "Opusti" + "Obvestilo je bilo opuščeno" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 039fae4327..f4798f6b75 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -70,8 +70,7 @@ "Dosja: %1$s" "Miniaplikacionet" "Imazhet e sfondit" - - + "Cilësimet e Home" "Çaktivizuar nga administratori" "Përmbledhje" "Lejo rrotullimin e ekranit kryesor" @@ -85,6 +84,14 @@ "Përdor parazgjedhjen e sisteit" + + + + + + + + "I panjohur" @@ -121,10 +128,7 @@ "Madhësia e miniaplikacionit u ndryshua me gjerësinë %1$s dhe lartësinë %2$s" "Shkurtoret" "%1$d shkurtesa për %2$s" - - - - - - + "%1$d shkurtore dhe %2$d njoftime për %3$s" + "Hiqe" + "Njoftimi u hoq" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 16ef6cc3a7..de24f32469 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -70,8 +70,7 @@ "Директоријум: %1$s" "Виџети" "Позадине" - - + "Подешавања почетног екрана" "Администратор је онемогућио" "Преглед" "Дозволи ротацију почетног екрана" @@ -85,6 +84,14 @@ "Користи подразумевано системско подешавање" + + + + + + + + "Непознато" @@ -121,10 +128,7 @@ "Величина виџета је промењена на ширину %1$s и висину %2$s" "Пречице" "%1$d пречице(а) за %2$s" - - - - - - + "Пречице (%1$d) и обавештења (%2$d) за %3$s" + "Одбаци" + "Обавештење је одбачено" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index ef5b6ac4c9..0baf97d56b 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -70,8 +70,7 @@ "Mapp: %1$s" "Widgetar" "Bakgrunder" - - + "Inställningar för startsidan" "Inaktiverat av administratören" "Översikt" "Tillåt rotering av startskärmen" @@ -85,6 +84,14 @@ "Använd systemstandard" + + + + + + + + "Okänt" @@ -121,10 +128,7 @@ "Widgetens storlek har ändrats till: bredd %1$s, höjd %2$s" "Genvägar" "%1$d genvägar för %2$s" - - - - - - + "%3$s har %1$d genvägar och %2$d aviseringar" + "Ignorera" + "Aviseringen togs bort" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 73b4a8c55f..96a78db239 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -72,8 +72,7 @@ "Folda: %1$s" "Wijeti" "Mandhari" - - + "Mipangilio ya ukurasa wa mwanzo" "Imezimwa na msimamizi wako" "Muhtasari" "Ruhusu kuzungusha skrini ya Kwanza" @@ -87,6 +86,14 @@ "Tumia umbo chaguo-msingi la mfumo" + + + + + + + + "Yasiyojulikana" @@ -123,10 +130,7 @@ "Wijeti imepunguzwa hadi upana %1$s urefu %2$s" "Njia za mkato" "Njia %1$d za mkato za %2$s" - - - - - - + "Njia %1$d za mkato na arifa %2$d za %3$s" + "Ondoa" + "Arifa imeondolewa" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 4b94a5997a..15fb1106a5 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -70,8 +70,7 @@ "கோப்புறை: %1$s" "ஷார்ட்கட்ஸ்" "வால்பேப்பர்கள்" - - + "முகப்பு அமைப்புகள்" "உங்கள் நிர்வாகி முடக்கியுள்ளார்" "மேலோட்டப் பார்வை" "முகப்புத் திரை சுழற்சியை அனுமதி" @@ -85,6 +84,14 @@ "அமைப்பின் இயல்புநிலையைப் பயன்படுத்து" + + + + + + + + "தெரியாதது" @@ -121,10 +128,7 @@ "அகலம் %1$s மற்றும் உயரம் %2$sக்கு விட்ஜெட் அளவு மாற்றப்பட்டது" "குறுக்குவழிகள்" "%2$sக்கான %1$d குறுக்குவழிகள்" - - - - - - + "%3$s பயன்பாட்டிற்கான %1$d குறுக்குவழிகளும் %2$d அறிவிப்புகளும் உள்ளன" + "நிராகரி" + "அறிவிப்பு நிராகரிக்கப்பட்டது" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 9003b8bfb1..05c4788f40 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -70,8 +70,7 @@ "ఫోల్డర్: %1$s" "విడ్జెట్‌లు" "వాల్‌పేపర్‌లు" - - + "హోమ్ సెట్టింగ్‌లు" "మీ నిర్వాహకులు నిలిపివేసారు" "స్థూలదృష్టి" "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" @@ -84,6 +83,14 @@ "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" "సిస్టమ్ డిఫాల్ట్‌ను ఉపయోగించండి" + + + + + + + + "చిహ్న ఆకార మార్పులను వర్తింపజేస్తోంది" "తెలియదు" "తీసివేయి" @@ -119,10 +126,7 @@ "విడ్జెట్ పరిమాణం వెడల్పు %1$sకి, ఎత్తు %2$sకి మార్చబడింది" "సత్వరమార్గాలు" "%2$s కోసం %1$d సత్వరమార్గాలు" - - - - - - + "%3$s కోసం %1$d సత్వరమార్గాలు మరియు %2$d నోటిఫికేషన్‌లు" + "తీసివేయి" + "నోటిఫికేషన్ తీసివేయబడింది" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 78e193c072..1f5c7c87c0 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -70,8 +70,7 @@ "โฟลเดอร์: %1$s" "วิดเจ็ต" "วอลเปเปอร์" - - + "การตั้งค่าหน้าแรก" "ปิดใช้โดยผู้ดูแลระบบ" "ภาพรวม" "อนุญาตให้หมุนหน้าจอหลัก" @@ -85,6 +84,14 @@ "ใช้ค่าเริ่มต้นของระบบ" + + + + + + + + "ไม่รู้จัก" @@ -121,10 +128,7 @@ "ปรับขนาดของวิดเจ็ตเป็นกว้าง %1$s สูง %2$s แล้ว" "ทางลัด" "%1$d ทางลัดสำหรับ %2$s" - - - - - - + "ทางลัด %1$d รายการและการแจ้งเตือน %2$d รายการสำหรับ %3$s" + "ปิด" + "ปิดการแจ้งเตือนแล้ว" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 829360c185..ff92183d20 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -70,8 +70,7 @@ "Folder: %1$s" "Mga Widget" "Mga Wallpaper" - - + "Mga setting ng Home" "Na-disable ng iyong admin" "Pangkalahatang-ideya" "Payagan ang pag-rotate ng Home screen" @@ -85,6 +84,14 @@ "Gamitin ang default ng system" + + + + + + + + "Hindi kilala" @@ -121,10 +128,7 @@ "Na-resize ang widget sa lapad %1$s taas %2$s" "Mga Shortcut" "%1$d (na) shortcut para sa %2$s" - - - - - - + "%1$d (na) shortcut at %2$d (na) notification para sa %3$s" + "I-dismiss" + "Na-dismiss ang notification" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index b41b15de99..ff28712655 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -70,8 +70,7 @@ "Klasör: %1$s" "Widget\'lar" "Duvar Kağıtları" - - + "Ana ekran ayarları" "Yöneticiniz tarafından devre dışı bırakıldı" "Genel bakış" "Ana ekranı döndürmeye izin ver" @@ -85,6 +84,14 @@ "Sistem varsayılanını kullan" + + + + + + + + "Bilinmiyor" @@ -121,10 +128,7 @@ "Widget, %1$s genişlik ve %2$s yükseklik değerine yeniden boyutlandırıldı" "Kısayollar" "%2$s için %1$d kısayol" - - - - - - + "%3$s için %1$d kısayol ve %2$d bildirim" + "Kapat" + "Bildirim kapatıldı" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index aadd595294..c904d414df 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -70,8 +70,7 @@ "Папка %1$s" "Віджети" "Фонові малюнки" - - + "Налаштування Home" "Вимкнув адміністратор" "Огляд" "Дозволити обертання головного екрана" @@ -85,6 +84,14 @@ "Використовувати налаштування системи за умовчанням" + + + + + + + + "Невідомо" @@ -121,10 +128,7 @@ "Розміри віджета змінено на %1$s завширшки та %2$s заввишки" "Ярлики" "Ярликів для додатка %2$s: %1$d" - - - - - - + "Ярлики (%1$d) і сповіщення (%2$d) додатка %3$s" + "Закрити" + "Сповіщення закрито" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 24f4dd78df..31ac66f514 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -70,8 +70,7 @@ "فولڈر: %1$s" "ویجیٹس" "وال پیپرز" - - + "ہوم ترتیبات" "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" "مجموعی جائزہ" "ہوم اسکرین گھمانے کی اجازت دیں" @@ -84,6 +83,14 @@ "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" "سسٹم ڈیفالٹ کا استعمال کریں" + + + + + + + + "آئيکن کی شکل کی تبدیلیاں لاگو ہو رہی ہیں" "نامعلوم" "ہٹائیں" @@ -119,10 +126,7 @@ "ویجیٹ کے سائز کو چوڑائی %1$s اونچائی %2$s میں تبدیل کر دیا گیا" "شارٹ کٹس" "%2$s کیلئے %1$d شارٹ کٹس" - - - - - - + "%3$s کے %1$d شارٹ کٹس اور %2$d اطلاعات" + "برخاست کریں" + "اطلاع مسترد ہو گئی" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index eef716e5f2..716eedde23 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -70,8 +70,7 @@ "Jild: %1$s" "Vidjetlar" "Fon rasmlari" - - + "Home sozlamalari" "Administrator tomonidan o‘chirilgan" "Umumiy ko‘rinish" "Asosiy ekranni aylantirishga ruxsat berish" @@ -85,6 +84,14 @@ "Standart tizim parametrlaridan foydalanish" + + + + + + + + "Noma’lum" @@ -121,10 +128,7 @@ "Vidjetning eni %1$s, bo‘yi %2$s qilib o‘zgartirildi" "Tezkor tugmalar" "%2$s ilovasi uchun %1$d ta tezkor tugma" - - - - - - + "%3$s ilovasi uchun %1$d ta yorliq va %2$d ta bildirishnoma" + "Yopish" + "Bildirishnoma yopildi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index f24a169a56..580a4dda79 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -70,8 +70,7 @@ "Thư mục: %1$s" "Tiện ích con" "Hình nền" - - + "Cài đặt trang chủ" "Bị tắt bởi quản trị viên của bạn" "Tổng quan" "Cho phép xoay Màn hình chính" @@ -85,6 +84,14 @@ "Sử dụng mặc định của hệ thống" + + + + + + + + "Không xác định" @@ -121,10 +128,7 @@ "Đã đổi kích thước tiện ích thành chiều rộng %1$s chiều cao %2$s" "Lối tắt" "%1$d phím tắt cho %2$s" - - - - - - + "%1$d phím tắt và %2$d thông báo cho %3$s" + "Loại bỏ" + "Đã loại bỏ thông báo" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 8231d93a35..0a43a9175d 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -70,8 +70,7 @@ "文件夹:%1$s" "微件" "壁纸" - - + "主屏幕设置" "已被您的管理员停用" "概览" "允许旋转主屏幕" @@ -85,6 +84,14 @@ "使用系统默认设置" + + + + + + + + "未知" @@ -121,10 +128,7 @@ "微件尺寸已调整为:宽度 %1$s,高度 %2$s" "快捷方式" "%2$s%1$d 个快捷方式" - - - - - - + "%3$s%1$d 个快捷方式和 %2$d 条通知" + "关闭" + "已关闭通知" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 1a42ad86ad..ae66324aa0 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -70,8 +70,7 @@ "資料夾:%1$s" "小工具" "桌布" - - + "Home 設定" "已由您的管理員停用" "概覽" "允許主畫面旋轉" @@ -85,6 +84,14 @@ "使用系統預設設定" + + + + + + + + "不明" @@ -121,10 +128,7 @@ "已調整小工具的大小至闊 %1$s%2$s" "捷徑" "「%2$s」嘅 %1$d 個捷徑" - - - - - - + "「%3$s」嘅 %1$d 個捷徑同 %2$d 個通知" + "關閉" + "關閉咗通知" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index b0cbf6c417..02f63504ef 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -70,8 +70,7 @@ "資料夾:%1$s" "小工具" "桌布" - - + "Home 設定" "已由你的管理員停用" "總覽" "允許旋轉主螢幕" @@ -85,6 +84,14 @@ "使用系統預設值" + + + + + + + + "不明" @@ -121,10 +128,7 @@ "已將小工具的寬度和高度分別調整為 %1$s%2$s" "捷徑" "「%2$s」有 %1$d 個捷徑" - - - - - - + "%1$d 個捷徑和 %2$d 則「%3$s」通知" + "關閉" + "已關閉通知" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 9226248bd1..bdb46a359e 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -70,8 +70,7 @@ "Ifolda: %1$s" "Amawijethi" "Izithombe zangemuva" - - + "Izilungiselelo zasekhaya" "Kukhutshazwe umlawuli wakho" "Ukubuka konke" "Vumela ukuphendukiswa kwesikrini sasekhaya" @@ -85,6 +84,14 @@ "Sebenzisa okuzenzakalelayo kwesistimu" + + + + + + + + "Akwaziwa" @@ -121,10 +128,7 @@ "Iwijethi inikezwe usayizi omusha ngobubanzi obungu-%1$s ubude obungu-%2$s" "Izinqamuleli" "%1$d izinqamuleli ze-%2$s" - - - - - - + "%1$d izinqamuleli nezaziso ezingu-%2$d ze-%3$s" + "Cashisa" + "Isaziso sicashisiwe" From 3a253967df1cb5ea97c82b34162ae3ecd7f24bc0 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Wed, 31 May 2017 11:21:13 -0700 Subject: [PATCH 120/446] Add debug message to indicate why shortcut has been deleted. b/62088762 Change-Id: I2bd6104d1f4d76d7bf888615a06088d3405f03c6 --- src/com/android/launcher3/AllAppsList.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index d7f0180fa2..be0192bd60 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -24,6 +24,7 @@ import android.os.Process; import android.os.UserHandle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.Log; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.PackageInstallerCompat; @@ -39,6 +40,8 @@ import java.util.List; * Stores the list of all applications for the all apps view. */ public class AllAppsList { + private static final String TAG = "AllAppsList"; + public static final int DEFAULT_APPLICATIONS_NUMBER = 42; /** The list off all apps. */ @@ -184,6 +187,7 @@ public class AllAppsList { if (user.equals(applicationInfo.user) && packageName.equals(applicationInfo.componentName.getPackageName())) { if (!findActivity(matches, applicationInfo.componentName)) { + Log.w(TAG, "Shortcut will be removed due to app component name change."); removed.add(applicationInfo); data.remove(i); } From acaf5b3a37af11b40166c10e856175bb96cb1476 Mon Sep 17 00:00:00 2001 From: Tony Date: Wed, 10 May 2017 13:05:32 -0500 Subject: [PATCH 121/446] Remove gap between popup items - Unround interior corners - Update colors (shortcuts are gray when next to notifications, notifications always white) - Clean up animation to animate entire popup with simple reveal instead of individual items animating with reveal and icon scale Bug: 35766387 Bug: 36110804 Change-Id: I33685d53e2db3904731676123dc230be4dabb5d4 --- res/drawable/bg_white_round_rect.xml | 21 -- res/layout/horizontal_divider.xml | 5 + res/layout/notification.xml | 6 +- res/layout/shortcuts_item.xml | 3 +- res/values/colors.xml | 2 +- res/values/config.xml | 7 +- res/values/dimens.xml | 1 - .../anim/PillHeightRevealOutlineProvider.java | 41 --- .../anim/PillRevealOutlineProvider.java | 68 ----- .../RoundedRectRevealOutlineProvider.java | 20 ++ .../notification/NotificationItemView.java | 17 +- .../popup/PopupContainerWithArrow.java | 249 +++++++++--------- .../launcher3/popup/PopupItemView.java | 201 ++++---------- .../shortcuts/ShortcutsItemView.java | 63 +---- 14 files changed, 223 insertions(+), 481 deletions(-) delete mode 100644 res/drawable/bg_white_round_rect.xml create mode 100644 res/layout/horizontal_divider.xml delete mode 100644 src/com/android/launcher3/anim/PillHeightRevealOutlineProvider.java delete mode 100644 src/com/android/launcher3/anim/PillRevealOutlineProvider.java diff --git a/res/drawable/bg_white_round_rect.xml b/res/drawable/bg_white_round_rect.xml deleted file mode 100644 index c7f786ff61..0000000000 --- a/res/drawable/bg_white_round_rect.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/res/layout/horizontal_divider.xml b/res/layout/horizontal_divider.xml new file mode 100644 index 0000000000..33773ebfac --- /dev/null +++ b/res/layout/horizontal_divider.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/res/layout/notification.xml b/res/layout/notification.xml index f955c6b803..a03dd0833d 100644 --- a/res/layout/notification.xml +++ b/res/layout/notification.xml @@ -19,9 +19,7 @@ android:id="@+id/notification_view" android:layout_width="@dimen/bg_popup_item_width" android:layout_height="wrap_content" - android:elevation="@dimen/deep_shortcuts_elevation" - android:background="@drawable/bg_white_round_rect" - android:backgroundTint="@color/notification_color_beneath"> + android:elevation="@dimen/deep_shortcuts_elevation"> + android:elevation="@dimen/deep_shortcuts_elevation"> #FFF - #EEEEEE + #F5F5F5 #FFF #757575 #E0E0E0 diff --git a/res/values/config.xml b/res/values/config.xml index 9b7c795cc2..6df556b8df 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -124,11 +124,8 @@ - 220 - 80 - 40 - 150 - 20 + 220 + 80 300 diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 110e79042d..3a531b08db 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -148,7 +148,6 @@ 9dp 220dp 56dp - 4dp 6dp 16dp diff --git a/src/com/android/launcher3/anim/PillHeightRevealOutlineProvider.java b/src/com/android/launcher3/anim/PillHeightRevealOutlineProvider.java deleted file mode 100644 index 679e8e32f5..0000000000 --- a/src/com/android/launcher3/anim/PillHeightRevealOutlineProvider.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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. - */ - -package com.android.launcher3.anim; - -import android.graphics.Rect; - -/** - * Extension of {@link PillRevealOutlineProvider} which only changes the height of the pill. - * For now, we assume the height is added/removed from the bottom. - */ -public class PillHeightRevealOutlineProvider extends PillRevealOutlineProvider { - - private final int mNewHeight; - - public PillHeightRevealOutlineProvider(Rect pillRect, float radius, int newHeight) { - super(0, 0, pillRect, radius); - mOutline.set(pillRect); - mNewHeight = newHeight; - } - - @Override - public void setProgress(float progress) { - mOutline.top = 0; - int heightDifference = mPillRect.height() - mNewHeight; - mOutline.bottom = (int) (mPillRect.bottom - heightDifference * (1 - progress)); - } -} diff --git a/src/com/android/launcher3/anim/PillRevealOutlineProvider.java b/src/com/android/launcher3/anim/PillRevealOutlineProvider.java deleted file mode 100644 index 450f9db9a7..0000000000 --- a/src/com/android/launcher3/anim/PillRevealOutlineProvider.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.launcher3.anim; - -import android.graphics.Rect; -import android.view.ViewOutlineProvider; - -/** - * A {@link ViewOutlineProvider} that animates a reveal in a "pill" shape. - * A pill is simply a round rect, but we assume the width is greater than - * the height and that the radius is equal to half the height. - */ -public class PillRevealOutlineProvider extends RevealOutlineAnimation { - - private int mCenterX; - private int mCenterY; - private float mFinalRadius; - protected Rect mPillRect; - - /** - * @param x reveal center x - * @param y reveal center y - * @param pillRect round rect that represents the final pill shape - */ - public PillRevealOutlineProvider(int x, int y, Rect pillRect) { - this(x, y, pillRect, pillRect.height() / 2f); - } - - public PillRevealOutlineProvider(int x, int y, Rect pillRect, float radius) { - mCenterX = x; - mCenterY = y; - mPillRect = pillRect; - mOutlineRadius = mFinalRadius = radius; - } - - @Override - public boolean shouldRemoveElevationDuringAnimation() { - return false; - } - - @Override - public void setProgress(float progress) { - // Assumes width is greater than height. - int centerToEdge = Math.max(mCenterX, mPillRect.width() - mCenterX); - int currentSize = (int) (progress * centerToEdge); - - // Bound the outline to the final pill shape defined by mPillRect. - mOutline.left = Math.max(mPillRect.left, mCenterX - currentSize); - mOutline.top = Math.max(mPillRect.top, mCenterY - currentSize); - mOutline.right = Math.min(mPillRect.right, mCenterX + currentSize); - mOutline.bottom = Math.min(mPillRect.bottom, mCenterY + currentSize); - mOutlineRadius = Math.min(mFinalRadius, mOutline.height() / 2); - } -} diff --git a/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java b/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java index 9c09477bbf..d01b26c8f4 100644 --- a/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java +++ b/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java @@ -18,6 +18,11 @@ package com.android.launcher3.anim; import android.graphics.Rect; +import com.android.launcher3.popup.PopupContainerWithArrow; + +import static com.android.launcher3.popup.PopupContainerWithArrow.ROUNDED_BOTTOM_CORNERS; +import static com.android.launcher3.popup.PopupContainerWithArrow.ROUNDED_TOP_CORNERS; + /** * A {@link RevealOutlineAnimation} that provides an outline that interpolates between two radii * and two {@link Rect}s. @@ -32,12 +37,21 @@ public class RoundedRectRevealOutlineProvider extends RevealOutlineAnimation { private final Rect mStartRect; private final Rect mEndRect; + private final @PopupContainerWithArrow.RoundedCornerFlags int mRoundedCorners; + public RoundedRectRevealOutlineProvider(float startRadius, float endRadius, Rect startRect, Rect endRect) { + this(startRadius, endRadius, startRect, endRect, + ROUNDED_TOP_CORNERS | ROUNDED_BOTTOM_CORNERS); + } + + public RoundedRectRevealOutlineProvider(float startRadius, float endRadius, Rect startRect, + Rect endRect, int roundedCorners) { mStartRadius = startRadius; mEndRadius = endRadius; mStartRect = startRect; mEndRect = endRect; + mRoundedCorners = roundedCorners; } @Override @@ -51,7 +65,13 @@ public class RoundedRectRevealOutlineProvider extends RevealOutlineAnimation { mOutline.left = (int) ((1 - progress) * mStartRect.left + progress * mEndRect.left); mOutline.top = (int) ((1 - progress) * mStartRect.top + progress * mEndRect.top); + if ((mRoundedCorners & ROUNDED_TOP_CORNERS) == 0) { + mOutline.top -= mOutlineRadius; + } mOutline.right = (int) ((1 - progress) * mStartRect.right + progress * mEndRect.right); mOutline.bottom = (int) ((1 - progress) * mStartRect.bottom + progress * mEndRect.bottom); + if ((mRoundedCorners & ROUNDED_BOTTOM_CORNERS) == 0) { + mOutline.bottom += mOutlineRadius; + } } } diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java index 997def277d..416d546eab 100644 --- a/src/com/android/launcher3/notification/NotificationItemView.java +++ b/src/com/android/launcher3/notification/NotificationItemView.java @@ -21,7 +21,6 @@ import android.app.Notification; import android.content.Context; import android.graphics.Rect; import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -30,7 +29,7 @@ import android.widget.TextView; import com.android.launcher3.ItemInfo; import com.android.launcher3.R; -import com.android.launcher3.anim.PillHeightRevealOutlineProvider; +import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; import com.android.launcher3.graphics.IconPalette; import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; import com.android.launcher3.popup.PopupItemView; @@ -87,9 +86,10 @@ public class NotificationItemView extends PopupItemView implements LogContainerP } public Animator animateHeightRemoval(int heightToRemove) { - final int newHeight = getHeight() - heightToRemove; - return new PillHeightRevealOutlineProvider(mPillRect, - getBackgroundRadius(), newHeight).createRevealAnimator(this, true /* isReversed */); + Rect endRect = new Rect(mPillRect); + endRect.bottom -= heightToRemove; + return new RoundedRectRevealOutlineProvider(getBackgroundRadius(), getBackgroundRadius(), + mPillRect, endRect, mRoundedCorners).createRevealAnimator(this, false); } public void updateHeader(int notificationCount, @Nullable IconPalette palette) { @@ -162,13 +162,6 @@ public class NotificationItemView extends PopupItemView implements LogContainerP } } - @Override - public int getArrowColor(boolean isArrowAttachedToBottom) { - return ContextCompat.getColor(getContext(), isArrowAttachedToBottom - ? R.color.popup_background_color - : R.color.popup_header_background_color); - } - @Override public void fillInLogContainerData(View v, ItemInfo info, LauncherLogProto.Target target, LauncherLogProto.Target targetParent) { diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index b373a17669..152886e812 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -20,19 +20,22 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; -import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; import android.graphics.CornerPathEffect; +import android.graphics.Outline; import android.graphics.Paint; +import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.ShapeDrawable; import android.os.Build; import android.os.Handler; import android.os.Looper; +import android.support.annotation.IntDef; +import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.view.Gravity; import android.view.LayoutInflater; @@ -40,7 +43,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.accessibility.AccessibilityEvent; -import android.view.animation.DecelerateInterpolator; +import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.FrameLayout; import com.android.launcher3.AbstractFloatingView; @@ -53,13 +56,13 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; -import com.android.launcher3.LogAccelerateInterpolator; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.accessibility.ShortcutMenuAccessibilityDelegate; import com.android.launcher3.anim.PropertyListBuilder; import com.android.launcher3.anim.PropertyResetListener; +import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; @@ -73,6 +76,8 @@ import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.shortcuts.ShortcutsItemView; import com.android.launcher3.util.PackageUserKey; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Collections; import java.util.List; import java.util.Map; @@ -89,6 +94,16 @@ import static com.android.launcher3.userevent.nano.LauncherLogProto.Target; public class PopupContainerWithArrow extends AbstractFloatingView implements DragSource, DragController.DragListener { + public static final int ROUNDED_TOP_CORNERS = 1 << 0; + public static final int ROUNDED_BOTTOM_CORNERS = 1 << 1; + + @IntDef(flag = true, value = { + ROUNDED_TOP_CORNERS, + ROUNDED_BOTTOM_CORNERS + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RoundedCornerFlags {} + protected final Launcher mLauncher; private final int mStartDragThreshold; private LauncherAccessibilityDelegate mAccessibilityDelegate; @@ -107,6 +122,8 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra protected Animator mOpenCloseAnimator; private boolean mDeferContainerRemoval; private AnimatorSet mReduceHeightAnimatorSet; + private final Rect mStartRect = new Rect(); + private final Rect mEndRect = new Rect(); public PopupContainerWithArrow(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); @@ -222,6 +239,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra mArrow.setPivotX(arrowWidth / 2); mArrow.setPivotY(mIsAboveIcon ? 0 : arrowHeight); + measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); animateOpen(); mLauncher.getDragController().addDragListener(this); @@ -238,46 +256,66 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra private void addDummyViews(PopupPopulator.Item[] itemTypesToPopulate, boolean notificationFooterHasIcons) { final Resources res = getResources(); - final int spacing = res.getDimensionPixelSize(R.dimen.popup_items_spacing); final LayoutInflater inflater = mLauncher.getLayoutInflater(); + int shortcutsItemRoundedCorners = ROUNDED_TOP_CORNERS | ROUNDED_BOTTOM_CORNERS; int numItems = itemTypesToPopulate.length; for (int i = 0; i < numItems; i++) { PopupPopulator.Item itemTypeToPopulate = itemTypesToPopulate[i]; + PopupPopulator.Item prevItemTypeToPopulate = + i > 0 ? itemTypesToPopulate[i - 1] : null; PopupPopulator.Item nextItemTypeToPopulate = i < numItems - 1 ? itemTypesToPopulate[i + 1] : null; final View item = inflater.inflate(itemTypeToPopulate.layoutId, this, false); + boolean shouldUnroundTopCorners = prevItemTypeToPopulate != null + && itemTypeToPopulate.isShortcut ^ prevItemTypeToPopulate.isShortcut; + boolean shouldUnroundBottomCorners = nextItemTypeToPopulate != null + && itemTypeToPopulate.isShortcut ^ nextItemTypeToPopulate.isShortcut; + if (itemTypeToPopulate == PopupPopulator.Item.NOTIFICATION) { mNotificationItemView = (NotificationItemView) item; int footerHeight = notificationFooterHasIcons ? res.getDimensionPixelSize(R.dimen.notification_footer_height) : 0; item.findViewById(R.id.footer).getLayoutParams().height = footerHeight; + + int roundedCorners = ROUNDED_TOP_CORNERS | ROUNDED_BOTTOM_CORNERS; + if (shouldUnroundTopCorners) { + roundedCorners &= ~ROUNDED_TOP_CORNERS; + } + if (shouldUnroundBottomCorners) { + roundedCorners &= ~ROUNDED_BOTTOM_CORNERS; + } + int backgroundColor = ContextCompat.getColor(getContext(), + R.color.notification_color_beneath); + mNotificationItemView.setBackgroundWithCorners(backgroundColor, roundedCorners); + mNotificationItemView.getMainView().setAccessibilityDelegate(mAccessibilityDelegate); } else if (itemTypeToPopulate == PopupPopulator.Item.SHORTCUT) { item.setAccessibilityDelegate(mAccessibilityDelegate); } - boolean shouldAddBottomMargin = nextItemTypeToPopulate != null - && itemTypeToPopulate.isShortcut ^ nextItemTypeToPopulate.isShortcut; - if (itemTypeToPopulate.isShortcut) { if (mShortcutsItemView == null) { mShortcutsItemView = (ShortcutsItemView) inflater.inflate( R.layout.shortcuts_item, this, false); addView(mShortcutsItemView); + if (shouldUnroundTopCorners) { + shortcutsItemRoundedCorners &= ~ROUNDED_TOP_CORNERS; + } } mShortcutsItemView.addShortcutView(item, itemTypeToPopulate); - if (shouldAddBottomMargin) { - ((LayoutParams) mShortcutsItemView.getLayoutParams()).bottomMargin = spacing; + if (shouldUnroundBottomCorners) { + shortcutsItemRoundedCorners &= ~ROUNDED_BOTTOM_CORNERS; } } else { addView(item); - if (shouldAddBottomMargin) { - ((LayoutParams) item.getLayoutParams()).bottomMargin = spacing; - } } } + int backgroundColor = ContextCompat.getColor(getContext(), mNotificationItemView == null + ? R.color.popup_background_color + : R.color.popup_header_background_color); + mShortcutsItemView.setBackgroundWithCorners(backgroundColor, shortcutsItemRoundedCorners); } protected PopupItemView getItemViewAt(int index) { @@ -297,45 +335,31 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra setVisibility(View.VISIBLE); mIsOpen = true; - final AnimatorSet shortcutAnims = LauncherAnimUtils.createAnimatorSet(); - final int itemCount = getItemCount(); + final AnimatorSet openAnim = LauncherAnimUtils.createAnimatorSet(); + final Resources res = getResources(); - final long duration = getResources().getInteger( - R.integer.config_deepShortcutOpenDuration); - final long arrowScaleDuration = getResources().getInteger( - R.integer.config_deepShortcutArrowOpenDuration); - final long arrowScaleDelay = duration - arrowScaleDuration; - final long stagger = getResources().getInteger( - R.integer.config_deepShortcutOpenStagger); - final TimeInterpolator fadeInterpolator = new LogAccelerateInterpolator(100, 0); - - // Animate shortcuts - DecelerateInterpolator interpolator = new DecelerateInterpolator(); - for (int i = 0; i < itemCount; i++) { - final PopupItemView popupItemView = getItemViewAt(i); - popupItemView.setVisibility(INVISIBLE); - popupItemView.setAlpha(0); - - Animator anim = popupItemView.createOpenAnimation(mIsAboveIcon, mIsLeftAligned); - anim.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - popupItemView.setVisibility(VISIBLE); - } - }); - anim.setDuration(duration); - int animationIndex = mIsAboveIcon ? itemCount - i - 1 : i; - anim.setStartDelay(stagger * animationIndex); - anim.setInterpolator(interpolator); - shortcutAnims.play(anim); - - Animator fadeAnim = ObjectAnimator.ofFloat(popupItemView, View.ALPHA, 1); - fadeAnim.setInterpolator(fadeInterpolator); - // We want the shortcut to be fully opaque before the arrow starts animating. - fadeAnim.setDuration(arrowScaleDelay); - shortcutAnims.play(fadeAnim); + // Rectangular reveal. + int itemsTotalHeight = 0; + for (int i = 0; i < getItemCount(); i++) { + itemsTotalHeight += getItemViewAt(i).getMeasuredHeight(); } - shortcutAnims.addListener(new AnimatorListenerAdapter() { + Point startPoint = computeAnimStartPoint(itemsTotalHeight); + int top = mIsAboveIcon ? getPaddingTop() : startPoint.y; + float radius = getItemViewAt(0).getBackgroundRadius(); + mStartRect.set(startPoint.x, startPoint.y, startPoint.x, startPoint.y); + mEndRect.set(0, top, getMeasuredWidth(), top + itemsTotalHeight); + final ValueAnimator revealAnim = new RoundedRectRevealOutlineProvider + (radius, radius, mStartRect, mEndRect).createRevealAnimator(this, false); + revealAnim.setDuration((long) res.getInteger(R.integer.config_popupOpenCloseDuration)); + revealAnim.setInterpolator(new AccelerateDecelerateInterpolator()); + + // Animate the arrow. + mArrow.setScaleX(0); + mArrow.setScaleY(0); + Animator arrowScale = createArrowScaleAnim(1).setDuration(res.getInteger( + R.integer.config_popupArrowOpenDuration)); + + openAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mOpenCloseAnimator = null; @@ -346,15 +370,26 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra } }); - // Animate the arrow - mArrow.setScaleX(0); - mArrow.setScaleY(0); - Animator arrowScale = createArrowScaleAnim(1).setDuration(arrowScaleDuration); - arrowScale.setStartDelay(arrowScaleDelay); - shortcutAnims.play(arrowScale); + mOpenCloseAnimator = openAnim; + openAnim.playSequentially(revealAnim, arrowScale); + openAnim.start(); + } - mOpenCloseAnimator = shortcutAnims; - shortcutAnims.start(); + /** + * Returns the point at which the center of the arrow merges with the first popup item. + */ + private Point computeAnimStartPoint(int itemsTotalHeight) { + int arrowCenterX = getResources().getDimensionPixelSize(mIsLeftAligned ^ mIsRtl ? + R.dimen.popup_arrow_horizontal_center_start: + R.dimen.popup_arrow_horizontal_center_end); + if (!mIsLeftAligned) { + arrowCenterX = getMeasuredWidth() - arrowCenterX; + } + int arrowHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom() + - itemsTotalHeight; + // The y-coordinate of edge between the arrow and the first popup item. + int arrowEdge = getPaddingTop() + (mIsAboveIcon ? itemsTotalHeight : arrowHeight); + return new Point(arrowCenterX, arrowEdge); } /** @@ -506,7 +541,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra // since the latter expects the arrow which hasn't been added yet. PopupItemView itemAttachedToArrow = (PopupItemView) (getChildAt(mIsAboveIcon ? getChildCount() - 1 : 0)); - arrowPaint.setColor(itemAttachedToArrow.getArrowColor(mIsAboveIcon)); + arrowPaint.setColor(ContextCompat.getColor(mLauncher, R.color.popup_background_color)); // The corner path effect won't be reflected in the shadow, but shouldn't be noticeable. int radius = getResources().getDimensionPixelSize(R.dimen.popup_arrow_corner_radius); arrowPaint.setPathEffect(new CornerPathEffect(radius)); @@ -609,22 +644,8 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra AnimatorSet removeNotification = LauncherAnimUtils.createAnimatorSet(); final int duration = getResources().getInteger( R.integer.config_removeNotificationViewDuration); - final int spacing = getResources().getDimensionPixelSize(R.dimen.popup_items_spacing); removeNotification.play(reduceNotificationViewHeight( - mNotificationItemView.getHeightMinusFooter() + spacing, duration)); - final View removeMarginView = mIsAboveIcon ? getItemViewAt(getItemCount() - 2) - : mNotificationItemView; - if (removeMarginView != null) { - ValueAnimator removeMargin = ValueAnimator.ofFloat(1, 0).setDuration(duration); - removeMargin.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator valueAnimator) { - ((MarginLayoutParams) removeMarginView.getLayoutParams()).bottomMargin - = (int) (spacing * (float) valueAnimator.getAnimatedValue()); - } - }); - removeNotification.play(removeMargin); - } + mNotificationItemView.getHeightMinusFooter(), duration)); Animator fade = ObjectAnimator.ofFloat(mNotificationItemView, ALPHA, 0) .setDuration(duration); fade.addListener(new AnimatorListenerAdapter() { @@ -634,19 +655,25 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra mNotificationItemView = null; if (getItemCount() == 0) { close(false); - return; } } }); removeNotification.play(fade); final long arrowScaleDuration = getResources().getInteger( - R.integer.config_deepShortcutArrowOpenDuration); + R.integer.config_popupArrowOpenDuration); Animator hideArrow = createArrowScaleAnim(0).setDuration(arrowScaleDuration); hideArrow.setStartDelay(0); Animator showArrow = createArrowScaleAnim(1).setDuration(arrowScaleDuration); showArrow.setStartDelay((long) (duration - arrowScaleDuration * 1.5)); removeNotification.playSequentially(hideArrow, showArrow); removeNotification.start(); + if (mShortcutsItemView != null) { + int backgroundColor = ContextCompat.getColor(getContext(), + R.color.popup_background_color); + // With notifications gone, all corners of shortcuts item should be rounded. + mShortcutsItemView.setBackgroundWithCorners(backgroundColor, + ROUNDED_TOP_CORNERS | ROUNDED_BOTTOM_CORNERS); + } return; } mNotificationItemView.trimNotifications(NotificationKeyData.extractKeysOnly( @@ -770,55 +797,40 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra if (!mIsOpen) { return; } + mEndRect.setEmpty(); if (mOpenCloseAnimator != null) { + Outline outline = new Outline(); + getOutlineProvider().getOutline(this, outline); + outline.getRect(mEndRect); mOpenCloseAnimator.cancel(); } mIsOpen = false; - final AnimatorSet shortcutAnims = LauncherAnimUtils.createAnimatorSet(); - final int itemCount = getItemCount(); - int numOpenShortcuts = 0; - for (int i = 0; i < itemCount; i++) { - if (getItemViewAt(i).isOpenOrOpening()) { - numOpenShortcuts++; - } + final AnimatorSet closeAnim = LauncherAnimUtils.createAnimatorSet(); + final Resources res = getResources(); + + // Animate the arrow. + Animator arrowScale = createArrowScaleAnim(0).setDuration(res.getInteger( + R.integer.config_popupArrowOpenDuration)); + + // Rectangular reveal (reversed). + int itemsTotalHeight = 0; + for (int i = 0; i < getItemCount(); i++) { + itemsTotalHeight += getItemViewAt(i).getMeasuredHeight(); } - final long duration = getResources().getInteger( - R.integer.config_deepShortcutCloseDuration); - final long arrowScaleDuration = getResources().getInteger( - R.integer.config_deepShortcutArrowOpenDuration); - final long stagger = getResources().getInteger( - R.integer.config_deepShortcutCloseStagger); - final TimeInterpolator fadeInterpolator = new LogAccelerateInterpolator(100, 0); - - int firstOpenItemIndex = mIsAboveIcon ? itemCount - numOpenShortcuts : 0; - for (int i = firstOpenItemIndex; i < firstOpenItemIndex + numOpenShortcuts; i++) { - final PopupItemView view = getItemViewAt(i); - Animator anim; - anim = view.createCloseAnimation(mIsAboveIcon, mIsLeftAligned, duration); - int animationIndex = mIsAboveIcon ? i - firstOpenItemIndex - : numOpenShortcuts - i - 1; - anim.setStartDelay(stagger * animationIndex); - - Animator fadeAnim = ObjectAnimator.ofFloat(view, View.ALPHA, 0); - // Don't start fading until the arrow is gone. - fadeAnim.setStartDelay(stagger * animationIndex + arrowScaleDuration); - fadeAnim.setDuration(duration - arrowScaleDuration); - fadeAnim.setInterpolator(fadeInterpolator); - shortcutAnims.play(fadeAnim); - anim.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - view.setVisibility(INVISIBLE); - } - }); - shortcutAnims.play(anim); + Point startPoint = computeAnimStartPoint(itemsTotalHeight); + int top = mIsAboveIcon ? getPaddingTop() : startPoint.y; + float radius = getItemViewAt(0).getBackgroundRadius(); + mStartRect.set(startPoint.x, startPoint.y, startPoint.x, startPoint.y); + if (mEndRect.isEmpty()) { + mEndRect.set(0, top, getMeasuredWidth(), top + itemsTotalHeight); } - Animator arrowAnim = createArrowScaleAnim(0).setDuration(arrowScaleDuration); - arrowAnim.setStartDelay(0); - shortcutAnims.play(arrowAnim); + final ValueAnimator revealAnim = new RoundedRectRevealOutlineProvider( + radius, radius, mStartRect, mEndRect).createRevealAnimator(this, true); + revealAnim.setDuration((long) res.getInteger(R.integer.config_popupOpenCloseDuration)); + revealAnim.setInterpolator(new AccelerateDecelerateInterpolator()); - shortcutAnims.addListener(new AnimatorListenerAdapter() { + closeAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mOpenCloseAnimator = null; @@ -829,8 +841,9 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra } } }); - mOpenCloseAnimator = shortcutAnims; - shortcutAnims.start(); + mOpenCloseAnimator = closeAnim; + closeAnim.playSequentially(arrowScale, revealAnim); + closeAnim.start(); mOriginalIcon.forceHideBadge(false); } diff --git a/src/com/android/launcher3/popup/PopupItemView.java b/src/com/android/launcher3/popup/PopupItemView.java index b073defa44..05cadb671a 100644 --- a/src/com/android/launcher3/popup/PopupItemView.java +++ b/src/com/android/launcher3/popup/PopupItemView.java @@ -16,38 +16,34 @@ package com.android.launcher3.popup; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; -import android.graphics.Point; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.RoundRectShape; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; -import com.android.launcher3.LogAccelerateInterpolator; import com.android.launcher3.R; import com.android.launcher3.Utilities; -import com.android.launcher3.anim.PillRevealOutlineProvider; +import com.android.launcher3.popup.PopupContainerWithArrow.RoundedCornerFlags; + +import static com.android.launcher3.popup.PopupContainerWithArrow.ROUNDED_BOTTOM_CORNERS; +import static com.android.launcher3.popup.PopupContainerWithArrow.ROUNDED_TOP_CORNERS; /** - * An abstract {@link FrameLayout} that supports animating an item's content - * (e.g. icon and text) separate from the item's background. + * An abstract {@link FrameLayout} that contains content for {@link PopupContainerWithArrow}. */ -public abstract class PopupItemView extends FrameLayout - implements ValueAnimator.AnimatorUpdateListener { - - protected static final Point sTempPoint = new Point(); +public abstract class PopupItemView extends FrameLayout { protected final Rect mPillRect; - private float mOpenAnimationProgress; + protected @RoundedCornerFlags int mRoundedCorners; protected final boolean mIsRtl; protected View mIconView; @@ -93,164 +89,55 @@ public abstract class PopupItemView extends FrameLayout @Override protected void dispatchDraw(Canvas canvas) { + if (mRoundedCorners == 0) { + super.dispatchDraw(canvas); + return; + } + int saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null); super.dispatchDraw(canvas); + // Clip children to this item's rounded corners. int cornerWidth = mRoundedCornerBitmap.getWidth(); int cornerHeight = mRoundedCornerBitmap.getHeight(); - // Clip top left corner. - mMatrix.reset(); - canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint); - // Clip top right corner. - mMatrix.setRotate(90, cornerWidth / 2, cornerHeight / 2); - mMatrix.postTranslate(canvas.getWidth() - cornerWidth, 0); - canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint); - // Clip bottom right corner. - mMatrix.setRotate(180, cornerWidth / 2, cornerHeight / 2); - mMatrix.postTranslate(canvas.getWidth() - cornerWidth, canvas.getHeight() - cornerHeight); - canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint); - // Clip bottom left corner. - mMatrix.setRotate(270, cornerWidth / 2, cornerHeight / 2); - mMatrix.postTranslate(0, canvas.getHeight() - cornerHeight); - canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint); + if ((mRoundedCorners & ROUNDED_TOP_CORNERS) != 0) { + // Clip top left corner. + mMatrix.reset(); + canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint); + // Clip top right corner. + mMatrix.setRotate(90, cornerWidth / 2, cornerHeight / 2); + mMatrix.postTranslate(canvas.getWidth() - cornerWidth, 0); + canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint); + } + if ((mRoundedCorners & ROUNDED_BOTTOM_CORNERS) != 0) { + // Clip bottom right corner. + mMatrix.setRotate(180, cornerWidth / 2, cornerHeight / 2); + mMatrix.postTranslate(canvas.getWidth() - cornerWidth, canvas.getHeight() - cornerHeight); + canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint); + // Clip bottom left corner. + mMatrix.setRotate(270, cornerWidth / 2, cornerHeight / 2); + mMatrix.postTranslate(0, canvas.getHeight() - cornerHeight); + canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint); + } canvas.restoreToCount(saveCount); } /** - * Creates an animator to play when the shortcut container is being opened. + * Creates a round rect drawable (with the specified corners unrounded) + * and sets it as this View's background. */ - public Animator createOpenAnimation(boolean isContainerAboveIcon, boolean pivotLeft) { - Point center = getIconCenter(); - int arrowCenter = getResources().getDimensionPixelSize(pivotLeft ^ mIsRtl ? - R.dimen.popup_arrow_horizontal_center_start: - R.dimen.popup_arrow_horizontal_center_end); - ValueAnimator openAnimator = new ZoomRevealOutlineProvider(center.x, center.y, - mPillRect, this, mIconView, isContainerAboveIcon, pivotLeft, arrowCenter) - .createRevealAnimator(this, false); - mOpenAnimationProgress = 0f; - openAnimator.addUpdateListener(this); - return openAnimator; - } - - @Override - public void onAnimationUpdate(ValueAnimator valueAnimator) { - mOpenAnimationProgress = valueAnimator.getAnimatedFraction(); - } - - public boolean isOpenOrOpening() { - return mOpenAnimationProgress > 0; - } - - /** - * Creates an animator to play when the shortcut container is being closed. - */ - public Animator createCloseAnimation(boolean isContainerAboveIcon, boolean pivotLeft, - long duration) { - Point center = getIconCenter(); - int arrowCenter = getResources().getDimensionPixelSize(pivotLeft ^ mIsRtl ? - R.dimen.popup_arrow_horizontal_center_start : - R.dimen.popup_arrow_horizontal_center_end); - ValueAnimator closeAnimator = new ZoomRevealOutlineProvider(center.x, center.y, - mPillRect, this, mIconView, isContainerAboveIcon, pivotLeft, arrowCenter) - .createRevealAnimator(this, true); - // Scale down the duration and interpolator according to the progress - // that the open animation was at when the close started. - closeAnimator.setDuration((long) (duration * mOpenAnimationProgress)); - closeAnimator.setInterpolator(new CloseInterpolator(mOpenAnimationProgress)); - closeAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mOpenAnimationProgress = 0; - } - }); - return closeAnimator; - } - - /** - * Returns the position of the center of the icon relative to the container. - */ - public Point getIconCenter() { - sTempPoint.y = getMeasuredHeight() / 2; - sTempPoint.x = getResources().getDimensionPixelSize(R.dimen.bg_popup_item_height) / 2; - if (Utilities.isRtl(getResources())) { - sTempPoint.x = getMeasuredWidth() - sTempPoint.x; - } - return sTempPoint; + public void setBackgroundWithCorners(int color, @RoundedCornerFlags int roundedCorners) { + mRoundedCorners = roundedCorners; + float rTop = (roundedCorners & ROUNDED_TOP_CORNERS) == 0 ? 0 : getBackgroundRadius(); + float rBot = (roundedCorners & ROUNDED_BOTTOM_CORNERS) == 0 ? 0 : getBackgroundRadius(); + float[] radii = new float[] {rTop, rTop, rTop, rTop, rBot, rBot, rBot, rBot}; + ShapeDrawable roundRectBackground = new ShapeDrawable(new RoundRectShape(radii, null, null)); + roundRectBackground.getPaint().setColor(color); + setBackground(roundRectBackground); } protected float getBackgroundRadius() { return getResources().getDimensionPixelSize(R.dimen.bg_round_rect_radius); } - - public abstract int getArrowColor(boolean isArrowAttachedToBottom); - - /** - * Extension of {@link PillRevealOutlineProvider} which scales the icon based on the height. - */ - private static class ZoomRevealOutlineProvider extends PillRevealOutlineProvider { - - private final View mTranslateView; - private final View mZoomView; - - private final float mFullHeight; - private final float mTranslateYMultiplier; - - private final boolean mPivotLeft; - private final float mTranslateX; - private final float mArrowCenter; - - public ZoomRevealOutlineProvider(int x, int y, Rect pillRect, PopupItemView translateView, - View zoomView, boolean isContainerAboveIcon, boolean pivotLeft, float arrowCenter) { - super(x, y, pillRect, translateView.getBackgroundRadius()); - mTranslateView = translateView; - mZoomView = zoomView; - mFullHeight = pillRect.height(); - - mTranslateYMultiplier = isContainerAboveIcon ? 0.5f : -0.5f; - - mPivotLeft = pivotLeft; - mTranslateX = pivotLeft ? arrowCenter : pillRect.right - arrowCenter; - mArrowCenter = arrowCenter; - } - - @Override - public void setProgress(float progress) { - super.setProgress(progress); - - if (mZoomView != null) { - mZoomView.setScaleX(progress); - mZoomView.setScaleY(progress); - } - - float height = mOutline.height(); - mTranslateView.setTranslationY(mTranslateYMultiplier * (mFullHeight - height)); - - float offsetX = Math.min(mOutline.width(), mArrowCenter); - float pivotX = mPivotLeft ? (mOutline.left + offsetX) : (mOutline.right - offsetX); - mTranslateView.setTranslationX(mTranslateX - pivotX); - } - } - - /** - * An interpolator that reverses the current open animation progress. - */ - private static class CloseInterpolator extends LogAccelerateInterpolator { - private float mStartProgress; - private float mRemainingProgress; - - /** - * @param openAnimationProgress The progress that the open interpolator ended at. - */ - public CloseInterpolator(float openAnimationProgress) { - super(100, 0); - mStartProgress = 1f - openAnimationProgress; - mRemainingProgress = openAnimationProgress; - } - - @Override - public float getInterpolation(float v) { - return mStartProgress + super.getInterpolation(v) * mRemainingProgress; - } - } } diff --git a/src/com/android/launcher3/shortcuts/ShortcutsItemView.java b/src/com/android/launcher3/shortcuts/ShortcutsItemView.java index 5b3b02eac2..340a6f000f 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutsItemView.java +++ b/src/com/android/launcher3/shortcuts/ShortcutsItemView.java @@ -16,12 +16,10 @@ package com.android.launcher3.shortcuts; -import android.animation.Animator; -import android.animation.AnimatorSet; import android.content.Context; import android.graphics.Point; -import android.support.v4.content.ContextCompat; import android.util.AttributeSet; +import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; @@ -30,9 +28,7 @@ import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BubbleTextView; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; -import com.android.launcher3.anim.PropertyListBuilder; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; @@ -135,7 +131,17 @@ public class ShortcutsItemView extends PopupItemView implements View.OnLongClick if (mSystemShortcutIcons == null) { mSystemShortcutIcons = (LinearLayout) mLauncher.getLayoutInflater().inflate( R.layout.system_shortcut_icons, mShortcutsLayout, false); - mShortcutsLayout.addView(mSystemShortcutIcons, 0); + + View divider = LayoutInflater.from(getContext()).inflate( + R.layout.horizontal_divider, this, false); + + if (mShortcutsLayout.getChildCount() > 0) { + mShortcutsLayout.addView(divider); + } + mShortcutsLayout.addView(mSystemShortcutIcons); + if (mShortcutsLayout.getChildCount() == 1) { + mShortcutsLayout.addView(divider); + } } mSystemShortcutIcons.addView(shortcutView, index); } else { @@ -209,51 +215,6 @@ public class ShortcutsItemView extends PopupItemView implements View.OnLongClick } } - @Override - public Animator createOpenAnimation(boolean isContainerAboveIcon, boolean pivotLeft) { - AnimatorSet openAnimation = LauncherAnimUtils.createAnimatorSet(); - openAnimation.play(super.createOpenAnimation(isContainerAboveIcon, pivotLeft)); - for (int i = 0; i < mShortcutsLayout.getChildCount(); i++) { - if (!(mShortcutsLayout.getChildAt(i) instanceof DeepShortcutView)) { - continue; - } - DeepShortcutView shortcutView = ((DeepShortcutView) mShortcutsLayout.getChildAt(i)); - View deepShortcutIcon = shortcutView.getIconView(); - deepShortcutIcon.setScaleX(0); - deepShortcutIcon.setScaleY(0); - openAnimation.play(LauncherAnimUtils.ofPropertyValuesHolder( - deepShortcutIcon, new PropertyListBuilder().scale(1).build())); - } - return openAnimation; - } - - @Override - public Animator createCloseAnimation(boolean isContainerAboveIcon, boolean pivotLeft, - long duration) { - AnimatorSet closeAnimation = LauncherAnimUtils.createAnimatorSet(); - closeAnimation.play(super.createCloseAnimation(isContainerAboveIcon, pivotLeft, duration)); - for (int i = 0; i < mShortcutsLayout.getChildCount(); i++) { - if (!(mShortcutsLayout.getChildAt(i) instanceof DeepShortcutView)) { - continue; - } - DeepShortcutView shortcutView = ((DeepShortcutView) mShortcutsLayout.getChildAt(i)); - View deepShortcutIcon = shortcutView.getIconView(); - deepShortcutIcon.setScaleX(1); - deepShortcutIcon.setScaleY(1); - closeAnimation.play(LauncherAnimUtils.ofPropertyValuesHolder( - deepShortcutIcon, new PropertyListBuilder().scale(0).build())); - } - return closeAnimation; - } - - @Override - public int getArrowColor(boolean isArrowAttachedToBottom) { - return ContextCompat.getColor(getContext(), - isArrowAttachedToBottom || mSystemShortcutIcons == null - ? R.color.popup_background_color - : R.color.popup_header_background_color); - } - @Override public void fillInLogContainerData(View v, ItemInfo info, LauncherLogProto.Target target, LauncherLogProto.Target targetParent) { From f8d6ed21ced3cf901439cbd40fd2985f68ab7e84 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 1 Jun 2017 14:26:38 -0700 Subject: [PATCH 122/446] Moving workspace bind logic into a separate class. This change separates the loading and binding code. Eventually workspace loading will not depend on bind and we will be able to preload workspace even before the launcher activity is started. Bug: 34112546 Bug: 37616877 Change-Id: Ia8e661465cb40ad073b5b76adfc74b9e15633b1d --- src/com/android/launcher3/LauncherModel.java | 464 +----------------- .../launcher3/model/LoaderResults.java | 377 ++++++++++++++ 2 files changed, 401 insertions(+), 440 deletions(-) create mode 100644 src/com/android/launcher3/model/LoaderResults.java diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index b5ca301d0c..ee06d9e587 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -60,6 +60,7 @@ import com.android.launcher3.model.CacheDataUpdatedTask; import com.android.launcher3.model.ExtendedModelTask; import com.android.launcher3.model.GridSizeMigrationTask; import com.android.launcher3.model.LoaderCursor; +import com.android.launcher3.model.LoaderResults; import com.android.launcher3.model.ModelWriter; import com.android.launcher3.model.PackageInstallStateChangedTask; import com.android.launcher3.model.PackageItemInfo; @@ -90,13 +91,11 @@ import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.CancellationException; import java.util.concurrent.Executor; @@ -112,9 +111,6 @@ public class LauncherModel extends BroadcastReceiver static final String TAG = "Launcher.Model"; - private static final int ITEMS_CHUNK = 6; // batch size for the workspace icons - private static final long INVALID_SCREEN_ID = -1L; - private final MainThreadExecutor mUiExecutor = new MainThreadExecutor(); @Thunk final LauncherAppState mApp; @Thunk final Object mLock = new Object(); @@ -531,13 +527,21 @@ public class LauncherModel extends BroadcastReceiver // If there is already one running, tell it to stop. stopLoaderLocked(); - mLoaderTask = new LoaderTask(mApp.getContext(), synchronousBindPage); + LoaderResults loaderResults = new LoaderResults(mApp, sBgDataModel, + mBgAllAppsList, synchronousBindPage, mCallbacks); if (synchronousBindPage != PagedView.INVALID_RESTORE_PAGE && mModelLoaded && !mIsLoaderTaskRunning) { - mLoaderTask.runBindSynchronousPage(synchronousBindPage); + + // Divide the set of loaded items into those that we are binding synchronously, + // and everything else that is to be bound normally (asynchronously). + loaderResults.bindWorkspace(); + // For now, continue posting the binding of AllApps as there are other + // issues that arise from that. + loaderResults.bindAllApps(); + loaderResults.bindDeepShortcuts(); return true; } else { - sWorkerThread.setPriority(Thread.NORM_PRIORITY); + mLoaderTask = new LoaderTask(mApp.getContext(), loaderResults); sWorker.post(mLoaderTask); } } @@ -593,13 +597,13 @@ public class LauncherModel extends BroadcastReceiver */ private class LoaderTask implements Runnable { private Context mContext; - private int mPageToBindFirst; + private final LoaderResults mResults; private boolean mStopped; - LoaderTask(Context context, int pageToBindFirst) { + LoaderTask(Context context, LoaderResults results) { mContext = context; - mPageToBindFirst = pageToBindFirst; + mResults = results; } private void waitForIdle() { @@ -614,35 +618,6 @@ public class LauncherModel extends BroadcastReceiver } } - void runBindSynchronousPage(int synchronousBindPage) { - if (synchronousBindPage == PagedView.INVALID_RESTORE_PAGE) { - // Ensure that we have a valid page index to load synchronously - throw new RuntimeException("Should not call runBindSynchronousPage() without " + - "valid page index"); - } - if (!mModelLoaded) { - // Ensure that we don't try and bind a specified page when the pages have not been - // loaded already (we should load everything asynchronously in that case) - throw new RuntimeException("Expecting AllApps and Workspace to be loaded"); - } - synchronized (mLock) { - if (mIsLoaderTaskRunning) { - // Ensure that we are never running the background loading at this point since - // we also touch the background collections - throw new RuntimeException("Error! Background loading is already running"); - } - } - - // Divide the set of loaded items into those that we are binding synchronously, and - // everything else that is to be bound normally (asynchronously). - bindWorkspace(synchronousBindPage); - // XXX: For now, continue posting the binding of AllApps as there are other issues that - // arise from that. - onlyBindAllApps(); - - bindDeepShortcuts(); - } - private void verifyNotStopped() throws CancellationException { synchronized (LoaderTask.this) { if (mStopped) { @@ -666,7 +641,7 @@ public class LauncherModel extends BroadcastReceiver verifyNotStopped(); if (DEBUG_LOADERS) Log.d(TAG, "step 1.2: bind workspace workspace"); - bindWorkspace(mPageToBindFirst); + mResults.bindWorkspace(); // Take a break if (DEBUG_LOADERS) { @@ -681,8 +656,12 @@ public class LauncherModel extends BroadcastReceiver if (DEBUG_LOADERS) Log.d(TAG, "step 2.1: loading all apps"); loadAllApps(); + if (DEBUG_LOADERS) Log.d(TAG, "step 2.2: Binding all apps"); verifyNotStopped(); - if (DEBUG_LOADERS) Log.d(TAG, "step 2.2: Update icon cache"); + mResults.bindAllApps(); + + verifyNotStopped(); + if (DEBUG_LOADERS) Log.d(TAG, "step 2.3: Update icon cache"); updateIconCache(); // Take a break @@ -700,7 +679,7 @@ public class LauncherModel extends BroadcastReceiver verifyNotStopped(); if (DEBUG_LOADERS) Log.d(TAG, "step 3.2: bind deep shortcuts"); - bindDeepShortcuts(); + mResults.bindDeepShortcuts(); // Take a break if (DEBUG_LOADERS) Log.d(TAG, "step 3 completed, wait for idle"); @@ -741,36 +720,6 @@ public class LauncherModel extends BroadcastReceiver } } - /** - * Gets the callbacks object. If we've been stopped, or if the launcher object - * has somehow been garbage collected, return null instead. Pass in the Callbacks - * object that was around when the deferred message was scheduled, and if there's - * a new Callbacks object around then also return null. This will save us from - * calling onto it with data that will be ignored. - */ - Callbacks tryGetCallbacks(Callbacks oldCallbacks) { - synchronized (mLock) { - if (mStopped) { - return null; - } - - if (mCallbacks == null) { - return null; - } - - final Callbacks callbacks = mCallbacks.get(); - if (callbacks != oldCallbacks) { - return null; - } - if (callbacks == null) { - Log.w(TAG, "no mCallbacks"); - return null; - } - - return callbacks; - } - } - private void loadWorkspace() { if (LauncherAppState.PROFILE_STARTUP) { Trace.beginSection("Loading Workspace"); @@ -1313,291 +1262,6 @@ public class LauncherModel extends BroadcastReceiver } } - /** Filters the set of items who are directly or indirectly (via another container) on the - * specified screen. */ - private void filterCurrentWorkspaceItems(long currentScreenId, - ArrayList allWorkspaceItems, - ArrayList currentScreenItems, - ArrayList otherScreenItems) { - // Purge any null ItemInfos - Iterator iter = allWorkspaceItems.iterator(); - while (iter.hasNext()) { - ItemInfo i = iter.next(); - if (i == null) { - iter.remove(); - } - } - - // Order the set of items by their containers first, this allows use to walk through the - // list sequentially, build up a list of containers that are in the specified screen, - // as well as all items in those containers. - Set itemsOnScreen = new HashSet(); - Collections.sort(allWorkspaceItems, new Comparator() { - @Override - public int compare(ItemInfo lhs, ItemInfo rhs) { - return Utilities.longCompare(lhs.container, rhs.container); - } - }); - for (ItemInfo info : allWorkspaceItems) { - if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { - if (info.screenId == currentScreenId) { - currentScreenItems.add(info); - itemsOnScreen.add(info.id); - } else { - otherScreenItems.add(info); - } - } else if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - currentScreenItems.add(info); - itemsOnScreen.add(info.id); - } else { - if (itemsOnScreen.contains(info.container)) { - currentScreenItems.add(info); - itemsOnScreen.add(info.id); - } else { - otherScreenItems.add(info); - } - } - } - } - - /** Filters the set of widgets which are on the specified screen. */ - private void filterCurrentAppWidgets(long currentScreenId, - ArrayList appWidgets, - ArrayList currentScreenWidgets, - ArrayList otherScreenWidgets) { - - for (LauncherAppWidgetInfo widget : appWidgets) { - if (widget == null) continue; - if (widget.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && - widget.screenId == currentScreenId) { - currentScreenWidgets.add(widget); - } else { - otherScreenWidgets.add(widget); - } - } - } - - /** Sorts the set of items by hotseat, workspace (spatially from top to bottom, left to - * right) */ - private void sortWorkspaceItemsSpatially(ArrayList workspaceItems) { - final InvariantDeviceProfile profile = mApp.getInvariantDeviceProfile(); - final int screenCols = profile.numColumns; - final int screenCellCount = profile.numColumns * profile.numRows; - Collections.sort(workspaceItems, new Comparator() { - @Override - public int compare(ItemInfo lhs, ItemInfo rhs) { - if (lhs.container == rhs.container) { - // Within containers, order by their spatial position in that container - switch ((int) lhs.container) { - case LauncherSettings.Favorites.CONTAINER_DESKTOP: { - long lr = (lhs.screenId * screenCellCount + - lhs.cellY * screenCols + lhs.cellX); - long rr = (rhs.screenId * screenCellCount + - rhs.cellY * screenCols + rhs.cellX); - return Utilities.longCompare(lr, rr); - } - case LauncherSettings.Favorites.CONTAINER_HOTSEAT: { - // We currently use the screen id as the rank - return Utilities.longCompare(lhs.screenId, rhs.screenId); - } - default: - if (FeatureFlags.IS_DOGFOOD_BUILD) { - throw new RuntimeException("Unexpected container type when " + - "sorting workspace items."); - } - return 0; - } - } else { - // Between containers, order by hotseat, desktop - return Utilities.longCompare(lhs.container, rhs.container); - } - } - }); - } - - private void bindWorkspaceScreens(final Callbacks oldCallbacks, - final ArrayList orderedScreens) { - final Runnable r = new Runnable() { - @Override - public void run() { - Callbacks callbacks = tryGetCallbacks(oldCallbacks); - if (callbacks != null) { - callbacks.bindScreens(orderedScreens); - } - } - }; - mUiExecutor.execute(r); - } - - private void bindWorkspaceItems(final Callbacks oldCallbacks, - final ArrayList workspaceItems, - final ArrayList appWidgets, - final Executor executor) { - - // Bind the workspace items - int N = workspaceItems.size(); - for (int i = 0; i < N; i += ITEMS_CHUNK) { - final int start = i; - final int chunkSize = (i+ITEMS_CHUNK <= N) ? ITEMS_CHUNK : (N-i); - final Runnable r = new Runnable() { - @Override - public void run() { - Callbacks callbacks = tryGetCallbacks(oldCallbacks); - if (callbacks != null) { - callbacks.bindItems(workspaceItems, start, start+chunkSize, - false); - } - } - }; - executor.execute(r); - } - - // Bind the widgets, one at a time - N = appWidgets.size(); - for (int i = 0; i < N; i++) { - final LauncherAppWidgetInfo widget = appWidgets.get(i); - final Runnable r = new Runnable() { - public void run() { - Callbacks callbacks = tryGetCallbacks(oldCallbacks); - if (callbacks != null) { - callbacks.bindAppWidget(widget); - } - } - }; - executor.execute(r); - } - } - - /** - * Binds all loaded data to actual views on the main thread. - */ - private void bindWorkspace(int synchronizeBindPage) { - final long t = SystemClock.uptimeMillis(); - Runnable r; - - // Don't use these two variables in any of the callback runnables. - // Otherwise we hold a reference to them. - final Callbacks oldCallbacks = mCallbacks.get(); - if (oldCallbacks == null) { - // This launcher has exited and nobody bothered to tell us. Just bail. - Log.w(TAG, "LoaderTask running with no launcher"); - return; - } - - // Save a copy of all the bg-thread collections - ArrayList workspaceItems = new ArrayList<>(); - ArrayList appWidgets = new ArrayList<>(); - ArrayList orderedScreenIds = new ArrayList<>(); - - synchronized (sBgDataModel) { - workspaceItems.addAll(sBgDataModel.workspaceItems); - appWidgets.addAll(sBgDataModel.appWidgets); - orderedScreenIds.addAll(sBgDataModel.workspaceScreens); - } - - final int currentScreen; - { - int currScreen = synchronizeBindPage != PagedView.INVALID_RESTORE_PAGE - ? synchronizeBindPage : oldCallbacks.getCurrentWorkspaceScreen(); - if (currScreen >= orderedScreenIds.size()) { - // There may be no workspace screens (just hotseat items and an empty page). - currScreen = PagedView.INVALID_RESTORE_PAGE; - } - currentScreen = currScreen; - } - final boolean validFirstPage = currentScreen >= 0; - final long currentScreenId = - validFirstPage ? orderedScreenIds.get(currentScreen) : INVALID_SCREEN_ID; - - // Separate the items that are on the current screen, and all the other remaining items - ArrayList currentWorkspaceItems = new ArrayList<>(); - ArrayList otherWorkspaceItems = new ArrayList<>(); - ArrayList currentAppWidgets = new ArrayList<>(); - ArrayList otherAppWidgets = new ArrayList<>(); - - filterCurrentWorkspaceItems(currentScreenId, workspaceItems, currentWorkspaceItems, - otherWorkspaceItems); - filterCurrentAppWidgets(currentScreenId, appWidgets, currentAppWidgets, - otherAppWidgets); - sortWorkspaceItemsSpatially(currentWorkspaceItems); - sortWorkspaceItemsSpatially(otherWorkspaceItems); - - // Tell the workspace that we're about to start binding items - r = new Runnable() { - public void run() { - Callbacks callbacks = tryGetCallbacks(oldCallbacks); - if (callbacks != null) { - callbacks.clearPendingBinds(); - callbacks.startBinding(); - } - } - }; - mUiExecutor.execute(r); - - bindWorkspaceScreens(oldCallbacks, orderedScreenIds); - - Executor mainExecutor = mUiExecutor; - // Load items on the current page. - bindWorkspaceItems(oldCallbacks, currentWorkspaceItems, currentAppWidgets, mainExecutor); - - // In case of validFirstPage, only bind the first screen, and defer binding the - // remaining screens after first onDraw (and an optional the fade animation whichever - // happens later). - // This ensures that the first screen is immediately visible (eg. during rotation) - // In case of !validFirstPage, bind all pages one after other. - final Executor deferredExecutor = - validFirstPage ? new ViewOnDrawExecutor(mUiExecutor) : mainExecutor; - - mainExecutor.execute(new Runnable() { - @Override - public void run() { - Callbacks callbacks = tryGetCallbacks(oldCallbacks); - if (callbacks != null) { - callbacks.finishFirstPageBind( - validFirstPage ? (ViewOnDrawExecutor) deferredExecutor : null); - } - } - }); - - bindWorkspaceItems(oldCallbacks, otherWorkspaceItems, otherAppWidgets, deferredExecutor); - - // Tell the workspace that we're done binding items - r = new Runnable() { - public void run() { - Callbacks callbacks = tryGetCallbacks(oldCallbacks); - if (callbacks != null) { - callbacks.finishBindingItems(); - } - - // If we're profiling, ensure this is the last thing in the queue. - if (DEBUG_LOADERS) { - Log.d(TAG, "bound workspace in " - + (SystemClock.uptimeMillis()-t) + "ms"); - } - - } - }; - deferredExecutor.execute(r); - - if (validFirstPage) { - r = new Runnable() { - public void run() { - Callbacks callbacks = tryGetCallbacks(oldCallbacks); - if (callbacks != null) { - // We are loading synchronously, which means, some of the pages will be - // bound after first draw. Inform the callbacks that page binding is - // not complete, and schedule the remaining pages. - if (currentScreen != PagedView.INVALID_RESTORE_PAGE) { - callbacks.onPageBoundSynchronously(currentScreen); - } - callbacks.executeOnNextDraw((ViewOnDrawExecutor) deferredExecutor); - } - } - }; - mUiExecutor.execute(r); - } - } - private void updateIconCache() { // Ignore packages which have a promise icon. HashSet packagesToIgnore = new HashSet<>(); @@ -1619,44 +1283,9 @@ public class LauncherModel extends BroadcastReceiver mIconCache.updateDbIcons(packagesToIgnore); } - private void onlyBindAllApps() { - final Callbacks oldCallbacks = mCallbacks.get(); - if (oldCallbacks == null) { - // This launcher has exited and nobody bothered to tell us. Just bail. - Log.w(TAG, "LoaderTask running with no launcher (onlyBindAllApps)"); - return; - } - - // shallow copy - @SuppressWarnings("unchecked") - final ArrayList list - = (ArrayList) mBgAllAppsList.data.clone(); - Runnable r = new Runnable() { - public void run() { - final long t = SystemClock.uptimeMillis(); - final Callbacks callbacks = tryGetCallbacks(oldCallbacks); - if (callbacks != null) { - callbacks.bindAllApplications(list); - } - if (DEBUG_LOADERS) { - Log.d(TAG, "bound all " + list.size() + " apps from cache in " - + (SystemClock.uptimeMillis() - t) + "ms"); - } - } - }; - mUiExecutor.execute(r); - } - private void loadAllApps() { final long loadTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; - final Callbacks oldCallbacks = mCallbacks.get(); - if (oldCallbacks == null) { - // This launcher has exited and nobody bothered to tell us. Just bail. - Log.w(TAG, "LoaderTask running with no launcher (loadAllApps)"); - return; - } - final List profiles = mUserManager.getUserProfiles(); // Clear the list of apps @@ -1695,30 +1324,9 @@ public class LauncherModel extends BroadcastReceiver } } - // Huh? Shouldn't this be inside the Runnable below? - final ArrayList added = mBgAllAppsList.added; - mBgAllAppsList.added = new ArrayList(); - - - // Post callback on main thread - mUiExecutor.execute(new Runnable() { - public void run() { - - final long bindTime = SystemClock.uptimeMillis(); - final Callbacks callbacks = tryGetCallbacks(oldCallbacks); - if (callbacks != null) { - callbacks.bindAllApplications(added); - if (DEBUG_LOADERS) { - Log.d(TAG, "bound " + added.size() + " apps in " - + (SystemClock.uptimeMillis() - bindTime) + "ms"); - } - } else { - Log.i(TAG, "not binding apps: no Launcher activity"); - } - } - }); + mBgAllAppsList.added = new ArrayList<>(); if (DEBUG_LOADERS) { - Log.d(TAG, "Icons processed in " + Log.d(TAG, "All apps loaded in in " + (SystemClock.uptimeMillis() - loadTime) + "ms"); } } @@ -1739,21 +1347,6 @@ public class LauncherModel extends BroadcastReceiver } } - public void bindDeepShortcuts() { - final MultiHashMap shortcutMapCopy = - sBgDataModel.deepShortcutMap.clone(); - Runnable r = new Runnable() { - @Override - public void run() { - Callbacks callbacks = getCallback(); - if (callbacks != null) { - callbacks.bindDeepShortcutMap(shortcutMapCopy); - } - } - }; - mUiExecutor.execute(r); - } - /** * Refreshes the cached shortcuts if the shortcut permission has changed. * Current implementation simply reloads the workspace, but it can be optimized to @@ -1924,15 +1517,6 @@ public class LauncherModel extends BroadcastReceiver return mCallbacks != null ? mCallbacks.get() : null; } - /** - * @return {@link FolderInfo} if its already loaded. - */ - public FolderInfo findFolderById(Long folderId) { - synchronized (sBgDataModel) { - return sBgDataModel.folders.get(folderId); - } - } - /** * @return the looper for the worker thread which can be used to start background tasks. */ diff --git a/src/com/android/launcher3/model/LoaderResults.java b/src/com/android/launcher3/model/LoaderResults.java new file mode 100644 index 0000000000..61fd356b8d --- /dev/null +++ b/src/com/android/launcher3/model/LoaderResults.java @@ -0,0 +1,377 @@ +/* + * 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. + */ + +package com.android.launcher3.model; + +import android.util.Log; + +import com.android.launcher3.AllAppsList; +import com.android.launcher3.AppInfo; +import com.android.launcher3.InvariantDeviceProfile; +import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherAppWidgetInfo; +import com.android.launcher3.LauncherModel.Callbacks; +import com.android.launcher3.LauncherSettings; +import com.android.launcher3.MainThreadExecutor; +import com.android.launcher3.PagedView; +import com.android.launcher3.Utilities; +import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.MultiHashMap; +import com.android.launcher3.util.ViewOnDrawExecutor; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.concurrent.Executor; + +/** + * Helper class to handle results of {@link com.android.launcher3.LauncherModel.LoaderTask}. + */ +public class LoaderResults { + + private static final String TAG = "LoaderResults"; + private static final long INVALID_SCREEN_ID = -1L; + private static final int ITEMS_CHUNK = 6; // batch size for the workspace icons + + private final Executor mUiExecutor; + + private final LauncherAppState mApp; + private final BgDataModel mBgDataModel; + private final AllAppsList mBgAllAppsList; + private final int mPageToBindFirst; + private final WeakReference mCallbacks; + + public LoaderResults(LauncherAppState app, BgDataModel dataModel, + AllAppsList allAppsList, int pageToBindFirst, WeakReference callbacks) { + mUiExecutor = new MainThreadExecutor(); + mApp = app; + mBgDataModel = dataModel; + mBgAllAppsList = allAppsList; + mPageToBindFirst = pageToBindFirst; + mCallbacks = callbacks == null ? new WeakReference(null) : callbacks; + } + + /** + * Binds all loaded data to actual views on the main thread. + */ + public void bindWorkspace() { + Runnable r; + + Callbacks callbacks = mCallbacks.get(); + // Don't use these two variables in any of the callback runnables. + // Otherwise we hold a reference to them. + if (callbacks == null) { + // This launcher has exited and nobody bothered to tell us. Just bail. + Log.w(TAG, "LoaderTask running with no launcher"); + return; + } + + // Save a copy of all the bg-thread collections + ArrayList workspaceItems = new ArrayList<>(); + ArrayList appWidgets = new ArrayList<>(); + final ArrayList orderedScreenIds = new ArrayList<>(); + + synchronized (mBgDataModel) { + workspaceItems.addAll(mBgDataModel.workspaceItems); + appWidgets.addAll(mBgDataModel.appWidgets); + orderedScreenIds.addAll(mBgDataModel.workspaceScreens); + } + + final int currentScreen; + { + int currScreen = mPageToBindFirst != PagedView.INVALID_RESTORE_PAGE + ? mPageToBindFirst : callbacks.getCurrentWorkspaceScreen(); + if (currScreen >= orderedScreenIds.size()) { + // There may be no workspace screens (just hotseat items and an empty page). + currScreen = PagedView.INVALID_RESTORE_PAGE; + } + currentScreen = currScreen; + } + final boolean validFirstPage = currentScreen >= 0; + final long currentScreenId = + validFirstPage ? orderedScreenIds.get(currentScreen) : INVALID_SCREEN_ID; + + // Separate the items that are on the current screen, and all the other remaining items + ArrayList currentWorkspaceItems = new ArrayList<>(); + ArrayList otherWorkspaceItems = new ArrayList<>(); + ArrayList currentAppWidgets = new ArrayList<>(); + ArrayList otherAppWidgets = new ArrayList<>(); + + filterCurrentWorkspaceItems(currentScreenId, workspaceItems, currentWorkspaceItems, + otherWorkspaceItems); + filterCurrentAppWidgets(currentScreenId, appWidgets, currentAppWidgets, + otherAppWidgets); + sortWorkspaceItemsSpatially(currentWorkspaceItems); + sortWorkspaceItemsSpatially(otherWorkspaceItems); + + // Tell the workspace that we're about to start binding items + r = new Runnable() { + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.clearPendingBinds(); + callbacks.startBinding(); + } + } + }; + mUiExecutor.execute(r); + + // Bind workspace screens + mUiExecutor.execute(new Runnable() { + @Override + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindScreens(orderedScreenIds); + } + } + }); + + Executor mainExecutor = mUiExecutor; + // Load items on the current page. + bindWorkspaceItems(currentWorkspaceItems, currentAppWidgets, mainExecutor); + + // In case of validFirstPage, only bind the first screen, and defer binding the + // remaining screens after first onDraw (and an optional the fade animation whichever + // happens later). + // This ensures that the first screen is immediately visible (eg. during rotation) + // In case of !validFirstPage, bind all pages one after other. + final Executor deferredExecutor = + validFirstPage ? new ViewOnDrawExecutor(mUiExecutor) : mainExecutor; + + mainExecutor.execute(new Runnable() { + @Override + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.finishFirstPageBind( + validFirstPage ? (ViewOnDrawExecutor) deferredExecutor : null); + } + } + }); + + bindWorkspaceItems(otherWorkspaceItems, otherAppWidgets, deferredExecutor); + + // Tell the workspace that we're done binding items + r = new Runnable() { + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.finishBindingItems(); + } + } + }; + deferredExecutor.execute(r); + + if (validFirstPage) { + r = new Runnable() { + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + // We are loading synchronously, which means, some of the pages will be + // bound after first draw. Inform the callbacks that page binding is + // not complete, and schedule the remaining pages. + if (currentScreen != PagedView.INVALID_RESTORE_PAGE) { + callbacks.onPageBoundSynchronously(currentScreen); + } + callbacks.executeOnNextDraw((ViewOnDrawExecutor) deferredExecutor); + } + } + }; + mUiExecutor.execute(r); + } + } + + + /** Filters the set of items who are directly or indirectly (via another container) on the + * specified screen. */ + private void filterCurrentWorkspaceItems(long currentScreenId, + ArrayList allWorkspaceItems, + ArrayList currentScreenItems, + ArrayList otherScreenItems) { + // Purge any null ItemInfos + Iterator iter = allWorkspaceItems.iterator(); + while (iter.hasNext()) { + ItemInfo i = iter.next(); + if (i == null) { + iter.remove(); + } + } + + // Order the set of items by their containers first, this allows use to walk through the + // list sequentially, build up a list of containers that are in the specified screen, + // as well as all items in those containers. + Set itemsOnScreen = new HashSet(); + Collections.sort(allWorkspaceItems, new Comparator() { + @Override + public int compare(ItemInfo lhs, ItemInfo rhs) { + return Utilities.longCompare(lhs.container, rhs.container); + } + }); + for (ItemInfo info : allWorkspaceItems) { + if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { + if (info.screenId == currentScreenId) { + currentScreenItems.add(info); + itemsOnScreen.add(info.id); + } else { + otherScreenItems.add(info); + } + } else if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + currentScreenItems.add(info); + itemsOnScreen.add(info.id); + } else { + if (itemsOnScreen.contains(info.container)) { + currentScreenItems.add(info); + itemsOnScreen.add(info.id); + } else { + otherScreenItems.add(info); + } + } + } + } + + /** Filters the set of widgets which are on the specified screen. */ + private void filterCurrentAppWidgets(long currentScreenId, + ArrayList appWidgets, + ArrayList currentScreenWidgets, + ArrayList otherScreenWidgets) { + + for (LauncherAppWidgetInfo widget : appWidgets) { + if (widget == null) continue; + if (widget.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && + widget.screenId == currentScreenId) { + currentScreenWidgets.add(widget); + } else { + otherScreenWidgets.add(widget); + } + } + } + + /** Sorts the set of items by hotseat, workspace (spatially from top to bottom, left to + * right) */ + private void sortWorkspaceItemsSpatially(ArrayList workspaceItems) { + final InvariantDeviceProfile profile = mApp.getInvariantDeviceProfile(); + final int screenCols = profile.numColumns; + final int screenCellCount = profile.numColumns * profile.numRows; + Collections.sort(workspaceItems, new Comparator() { + @Override + public int compare(ItemInfo lhs, ItemInfo rhs) { + if (lhs.container == rhs.container) { + // Within containers, order by their spatial position in that container + switch ((int) lhs.container) { + case LauncherSettings.Favorites.CONTAINER_DESKTOP: { + long lr = (lhs.screenId * screenCellCount + + lhs.cellY * screenCols + lhs.cellX); + long rr = (rhs.screenId * screenCellCount + + rhs.cellY * screenCols + rhs.cellX); + return Utilities.longCompare(lr, rr); + } + case LauncherSettings.Favorites.CONTAINER_HOTSEAT: { + // We currently use the screen id as the rank + return Utilities.longCompare(lhs.screenId, rhs.screenId); + } + default: + if (FeatureFlags.IS_DOGFOOD_BUILD) { + throw new RuntimeException("Unexpected container type when " + + "sorting workspace items."); + } + return 0; + } + } else { + // Between containers, order by hotseat, desktop + return Utilities.longCompare(lhs.container, rhs.container); + } + } + }); + } + + private void bindWorkspaceItems(final ArrayList workspaceItems, + final ArrayList appWidgets, + final Executor executor) { + + // Bind the workspace items + int N = workspaceItems.size(); + for (int i = 0; i < N; i += ITEMS_CHUNK) { + final int start = i; + final int chunkSize = (i+ITEMS_CHUNK <= N) ? ITEMS_CHUNK : (N-i); + final Runnable r = new Runnable() { + @Override + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindItems(workspaceItems, start, start+chunkSize, false); + } + } + }; + executor.execute(r); + } + + // Bind the widgets, one at a time + N = appWidgets.size(); + for (int i = 0; i < N; i++) { + final LauncherAppWidgetInfo widget = appWidgets.get(i); + final Runnable r = new Runnable() { + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindAppWidget(widget); + } + } + }; + executor.execute(r); + } + } + + public void bindDeepShortcuts() { + final MultiHashMap shortcutMapCopy; + synchronized (mBgDataModel) { + shortcutMapCopy = mBgDataModel.deepShortcutMap.clone(); + } + Runnable r = new Runnable() { + @Override + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindDeepShortcutMap(shortcutMapCopy); + } + } + }; + mUiExecutor.execute(r); + } + + + public void bindAllApps() { + // shallow copy + @SuppressWarnings("unchecked") + final ArrayList list = (ArrayList) mBgAllAppsList.data.clone(); + + Runnable r = new Runnable() { + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindAllApplications(list); + } + } + }; + mUiExecutor.execute(r); + } +} From 869a97da73504a01a51771a7ef96a9380fcd2d12 Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 2 Jun 2017 12:18:46 -0700 Subject: [PATCH 123/446] Promise icons don't support popup Bug: 62253847 Change-Id: I1123f3d1efad65e74957b1404b5b2c95ba392713 --- src/com/android/launcher3/shortcuts/DeepShortcutManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java index df7f6954d1..5ce78dc3a7 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -65,8 +65,10 @@ public class DeepShortcutManager { } public static boolean supportsShortcuts(ItemInfo info) { + boolean isItemPromise = info instanceof com.android.launcher3.ShortcutInfo + && ((com.android.launcher3.ShortcutInfo) info).isPromise(); return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION - && !info.isDisabled(); + && !info.isDisabled() && !isItemPromise; } public boolean wasLastCallSuccess() { From 85efb4b07d69a39363df18042933e70390402c22 Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 2 Jun 2017 13:06:10 -0700 Subject: [PATCH 124/446] Launch wallpaper picker with rectangular reveal There was a logic error causing it to be launched with null activity options. Bug: 37904252 Change-Id: Ia44b7bccf0b7f83ceab9d3949542b79a842e4873 --- src/com/android/launcher3/Launcher.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index ff7ca812bf..0075887ee5 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2533,8 +2533,8 @@ public class Launcher extends BaseActivity .putExtra(Utilities.EXTRA_WALLPAPER_OFFSET, offset); String pickerPackage = getString(R.string.wallpaper_picker_package); - boolean hasTargetPackage = TextUtils.isEmpty(pickerPackage); - if (!hasTargetPackage) { + boolean hasTargetPackage = !TextUtils.isEmpty(pickerPackage); + if (hasTargetPackage) { intent.setPackage(pickerPackage); } From c6e97692e4144a6fc33eb74fabb73b1aae9ff908 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 2 Jun 2017 13:46:55 -0700 Subject: [PATCH 125/446] Moving LoaderTask static Will move it to a separate file in a followup cl. This simplifies dependencies between LauncherModel and LoaderTask which and making it easier to start the loader before Launcher activity is created (as the Callbacks in LauncherModel can change while loader is running). Bug: 34112546 Bug: 37616877 Change-Id: Ie9619c6b0de0e3eb60657c04ae1b58d946c829e9 --- src/com/android/launcher3/AppFilter.java | 5 + src/com/android/launcher3/Launcher.java | 2 +- .../android/launcher3/LauncherAppState.java | 4 +- src/com/android/launcher3/LauncherModel.java | 300 +++++++++--------- .../android/launcher3/model/BgDataModel.java | 10 + .../launcher3/model/ExtendedModelTask.java | 11 + .../launcher3/model/LoaderResults.java | 17 +- .../launcher3/model/PackageUpdatedTask.java | 7 +- .../model/SdCardAvailableReceiver.java | 7 +- .../android/launcher3/model/WidgetsModel.java | 41 ++- 10 files changed, 215 insertions(+), 189 deletions(-) diff --git a/src/com/android/launcher3/AppFilter.java b/src/com/android/launcher3/AppFilter.java index db8f5dd0e0..923835a679 100644 --- a/src/com/android/launcher3/AppFilter.java +++ b/src/com/android/launcher3/AppFilter.java @@ -1,9 +1,14 @@ package com.android.launcher3; import android.content.ComponentName; +import android.content.Context; public class AppFilter { + public static AppFilter newInstance(Context context) { + return Utilities.getOverrideObject(AppFilter.class, context, R.string.app_filter_class); + } + public boolean shouldShowApp(ComponentName app) { return true; } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index ff7ca812bf..c8c5661878 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -3970,7 +3970,7 @@ public class Launcher extends BaseActivity * refreshes the widgets and shortcuts associated with the given package/user */ public void refreshAndBindWidgetsForPackageUser(@Nullable PackageUserKey packageUser) { - mModel.refreshAndBindWidgetsAndShortcuts(this, mWidgetsView.isEmpty(), packageUser); + mModel.refreshAndBindWidgetsAndShortcuts(packageUser); } public void lockScreenOrientation() { diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index 27ccabea9c..cf20febd5b 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -93,9 +93,7 @@ public class LauncherAppState { mInvariantDeviceProfile = new InvariantDeviceProfile(mContext); mIconCache = new IconCache(mContext, mInvariantDeviceProfile); mWidgetCache = new WidgetPreviewLoader(mContext, mIconCache); - - mModel = new LauncherModel(this, mIconCache, - Utilities.getOverrideObject(AppFilter.class, mContext, R.string.app_filter_class)); + mModel = new LauncherModel(this, mIconCache, AppFilter.newInstance(mContext)); LauncherAppsCompat.getInstance(mContext).addOnAppsChangedCallback(mModel); diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index ee06d9e587..265c7e33ad 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -69,7 +69,6 @@ import com.android.launcher3.model.SdCardAvailableReceiver; import com.android.launcher3.model.ShortcutsChangedTask; import com.android.launcher3.model.UserLockStateChangedTask; import com.android.launcher3.model.WidgetItem; -import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.provider.ImportDataTask; import com.android.launcher3.provider.LauncherDbUtils; import com.android.launcher3.shortcuts.DeepShortcutManager; @@ -116,7 +115,6 @@ public class LauncherModel extends BroadcastReceiver @Thunk final Object mLock = new Object(); @Thunk LoaderTask mLoaderTask; @Thunk boolean mIsLoaderTaskRunning; - @Thunk boolean mHasLoaderCompletedOnce; @Thunk static final HandlerThread sWorkerThread = new HandlerThread("launcher-loader"); static { @@ -139,23 +137,6 @@ public class LauncherModel extends BroadcastReceiver // < only access in worker thread > private final AllAppsList mBgAllAppsList; - // Entire list of widgets. - private final WidgetsModel mBgWidgetsModel; - - private boolean mHasShortcutHostPermission; - // Runnable to check if the shortcuts permission has changed. - private final Runnable mShortcutPermissionCheckRunnable = new Runnable() { - @Override - public void run() { - if (mModelLoaded) { - boolean hasShortcutHostPermission = - DeepShortcutManager.getInstance(mApp.getContext()).hasHostPermission(); - if (hasShortcutHostPermission != mHasShortcutHostPermission) { - forceReload(); - } - } - } - }; /** * All the static data should be accessed on the background thread, A lock should be acquired @@ -163,12 +144,19 @@ public class LauncherModel extends BroadcastReceiver */ static final BgDataModel sBgDataModel = new BgDataModel(); - // - - private final IconCache mIconCache; - - private final LauncherAppsCompat mLauncherApps; - private final UserManagerCompat mUserManager; + // Runnable to check if the shortcuts permission has changed. + private final Runnable mShortcutPermissionCheckRunnable = new Runnable() { + @Override + public void run() { + if (mModelLoaded) { + boolean hasShortcutHostPermission = + DeepShortcutManager.getInstance(mApp.getContext()).hasHostPermission(); + if (hasShortcutHostPermission != sBgDataModel.hasShortcutHostPermission) { + forceReload(); + } + } + } + }; public interface Callbacks { public boolean setLoadOnResume(); @@ -204,14 +192,8 @@ public class LauncherModel extends BroadcastReceiver } LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter) { - Context context = app.getContext(); mApp = app; mBgAllAppsList = new AllAppsList(iconCache, appFilter); - mBgWidgetsModel = new WidgetsModel(iconCache, appFilter); - mIconCache = iconCache; - - mLauncherApps = LauncherAppsCompat.getInstance(context); - mUserManager = UserManagerCompat.getInstance(context); } /** Runs the specified runnable immediately if called from the worker thread, otherwise it is @@ -539,9 +521,10 @@ public class LauncherModel extends BroadcastReceiver // issues that arise from that. loaderResults.bindAllApps(); loaderResults.bindDeepShortcuts(); + loaderResults.bindWidgets(); return true; } else { - mLoaderTask = new LoaderTask(mApp.getContext(), loaderResults); + mLoaderTask = new LoaderTask(mApp, mBgAllAppsList, sBgDataModel, loaderResults); sWorker.post(mLoaderTask); } } @@ -588,6 +571,44 @@ public class LauncherModel extends BroadcastReceiver }); } + public class LoaderTransaction implements AutoCloseable { + + private final LoaderTask mTask; + + private LoaderTransaction(LoaderTask task) throws CancellationException { + synchronized (mLock) { + if (mLoaderTask != task) { + throw new CancellationException("Loader already stopped"); + } + mTask = task; + mIsLoaderTaskRunning = true; + mModelLoaded = false; + } + } + + public void commit() { + synchronized (mLock) { + // Everything loaded bind the data. + mModelLoaded = true; + } + } + + @Override + public void close() { + synchronized (mLock) { + // If we are still the last one to be scheduled, remove ourselves. + if (mLoaderTask == mTask) { + mLoaderTask = null; + } + mIsLoaderTaskRunning = false; + } + } + } + + public LoaderTransaction beginLoader(LoaderTask task) throws CancellationException { + return new LoaderTransaction(task); + } + /** * Runnable for the thread that loads the contents of the launcher: * - workspace icons @@ -595,46 +616,62 @@ public class LauncherModel extends BroadcastReceiver * - all apps icons * - deep shortcuts within apps */ - private class LoaderTask implements Runnable { - private Context mContext; + private static class LoaderTask implements Runnable { + private final LauncherAppState mApp; + private final AllAppsList mBgAllAppsList; + private final BgDataModel mBgDataModel; + private final LoaderResults mResults; + private final LauncherAppsCompat mLauncherApps; + private final UserManagerCompat mUserManager; + private final DeepShortcutManager mShortcutManager; + private final PackageInstallerCompat mPackageInstaller; + private final AppWidgetManagerCompat mAppWidgetManager; + private final IconCache mIconCache; + private boolean mStopped; - LoaderTask(Context context, LoaderResults results) { - mContext = context; + LoaderTask(LauncherAppState app, AllAppsList bgAllAppsList, BgDataModel dataModel, + LoaderResults results) { + mApp = app; + mBgAllAppsList = bgAllAppsList; + mBgDataModel = dataModel; mResults = results; + + mLauncherApps = LauncherAppsCompat.getInstance(mApp.getContext()); + mUserManager = UserManagerCompat.getInstance(mApp.getContext()); + mShortcutManager = DeepShortcutManager.getInstance(mApp.getContext()); + mPackageInstaller = PackageInstallerCompat.getInstance(mApp.getContext()); + mAppWidgetManager = AppWidgetManagerCompat.getInstance(mApp.getContext()); + mIconCache = mApp.getIconCache(); } - private void waitForIdle() { + private synchronized void waitForIdle() { // Wait until the either we're stopped or the other threads are done. // This way we don't start loading all apps until the workspace has settled // down. - synchronized (LoaderTask.this) { - LooperIdleLock idleLock = new LooperIdleLock(this, Looper.getMainLooper()); - // Just in case mFlushingWorkerThread changes but we aren't woken up, - // wait no longer than 1sec at a time - while (!mStopped && idleLock.awaitLocked(1000)); - } + LooperIdleLock idleLock = new LooperIdleLock(this, Looper.getMainLooper()); + // Just in case mFlushingWorkerThread changes but we aren't woken up, + // wait no longer than 1sec at a time + while (!mStopped && idleLock.awaitLocked(1000)); } - private void verifyNotStopped() throws CancellationException { - synchronized (LoaderTask.this) { - if (mStopped) { - throw new CancellationException("Loader stopped"); - } + private synchronized void verifyNotStopped() throws CancellationException { + if (mStopped) { + throw new CancellationException("Loader stopped"); } } public void run() { - synchronized (mLock) { + synchronized (this) { + // Skip fast if we are already stopped. if (mStopped) { return; } - mIsLoaderTaskRunning = true; } - try { + try (LoaderTransaction transaction = mApp.getModel().beginLoader(this)) { long now = 0; if (DEBUG_LOADERS) Log.d(TAG, "step 1.1: loading workspace"); loadWorkspace(); @@ -688,36 +725,21 @@ public class LauncherModel extends BroadcastReceiver // fourth step if (DEBUG_LOADERS) Log.d(TAG, "step 4.1: loading widgets"); - refreshAndBindWidgetsAndShortcuts(getCallback(), false /* bindFirst */, - null /* packageUser */); + mBgDataModel.widgetsModel.update(mApp, null); - synchronized (mLock) { - // Everything loaded bind the data. - mModelLoaded = true; - mHasLoaderCompletedOnce = true; - } + verifyNotStopped(); + if (DEBUG_LOADERS) Log.d(TAG, "step 4.2: Binding widgets"); + mResults.bindWidgets(); + + transaction.commit(); } catch (CancellationException e) { // Loader stopped, ignore - } finally { - // Clear out this reference, otherwise we end up holding it until all of the - // callback runnables are done. - mContext = null; - - synchronized (mLock) { - // If we are still the last one to be scheduled, remove ourselves. - if (mLoaderTask == this) { - mLoaderTask = null; - } - mIsLoaderTaskRunning = false; - } } } - public void stopLocked() { - synchronized (LoaderTask.this) { - mStopped = true; - this.notify(); - } + public synchronized void stopLocked() { + mStopped = true; + this.notify(); } private void loadWorkspace() { @@ -725,12 +747,10 @@ public class LauncherModel extends BroadcastReceiver Trace.beginSection("Loading Workspace"); } - final Context context = mContext; + final Context context = mApp.getContext(); final ContentResolver contentResolver = context.getContentResolver(); final PackageManagerHelper pmHelper = new PackageManagerHelper(context); final boolean isSafeMode = pmHelper.isSafeMode(); - final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); - final DeepShortcutManager shortcutManager = DeepShortcutManager.getInstance(context); final boolean isSdCardReady = Utilities.isBootCompleted(); final MultiHashMap pendingPackages = new MultiHashMap<>(); @@ -743,7 +763,7 @@ public class LauncherModel extends BroadcastReceiver } if (!clearDb && GridSizeMigrationTask.ENABLED && - !GridSizeMigrationTask.migrateGridIfNeeded(mContext)) { + !GridSizeMigrationTask.migrateGridIfNeeded(context)) { // Migration failed. Clear workspace. clearDb = true; } @@ -758,12 +778,12 @@ public class LauncherModel extends BroadcastReceiver LauncherSettings.Settings.call(contentResolver, LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES); - synchronized (sBgDataModel) { - sBgDataModel.clear(); + synchronized (mBgDataModel) { + mBgDataModel.clear(); - final HashMap installingPkgs = PackageInstallerCompat - .getInstance(mContext).updateAndGetActiveSessionCache(); - sBgDataModel.workspaceScreens.addAll(loadWorkspaceScreensDb(mContext)); + final HashMap installingPkgs = + mPackageInstaller.updateAndGetActiveSessionCache(); + mBgDataModel.workspaceScreens.addAll(loadWorkspaceScreensDb(context)); Map shortcutKeyToPinnedShortcuts = new HashMap<>(); final LoaderCursor c = new LoaderCursor(contentResolver.query( @@ -798,8 +818,8 @@ public class LauncherModel extends BroadcastReceiver // We can only query for shortcuts when the user is unlocked. if (userUnlocked) { List pinnedShortcuts = - shortcutManager.queryForPinnedShortcuts(null, user); - if (shortcutManager.wasLastCallSuccess()) { + mShortcutManager.queryForPinnedShortcuts(null, user); + if (mShortcutManager.wasLastCallSuccess()) { for (ShortcutInfoCompat shortcut : pinnedShortcuts) { shortcutKeyToPinnedShortcuts.put(ShortcutKey.fromInfo(shortcut), shortcut); @@ -864,14 +884,14 @@ public class LauncherModel extends BroadcastReceiver // If there is no target package, its an implicit intent // (legacy shortcut) which is always valid boolean validTarget = TextUtils.isEmpty(targetPkg) || - launcherApps.isPackageEnabledForProfile(targetPkg, c.user); + mLauncherApps.isPackageEnabledForProfile(targetPkg, c.user); if (cn != null && validTarget) { // If the apk is present and the shortcut points to a specific // component. // If the component is already present - if (launcherApps.isActivityEnabledForProfile(cn, c.user)) { + if (mLauncherApps.isActivityEnabledForProfile(cn, c.user)) { // no special handling necessary for this item c.markRestored(); } else { @@ -1022,14 +1042,14 @@ public class LauncherModel extends BroadcastReceiver } } - c.checkAndAddItem(info, sBgDataModel); + c.checkAndAddItem(info, mBgDataModel); } else { throw new RuntimeException("Unexpected null ShortcutInfo"); } break; case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: - FolderInfo folderInfo = sBgDataModel.findOrMakeFolder(c.id); + FolderInfo folderInfo = mBgDataModel.findOrMakeFolder(c.id); c.applyCommonProperties(folderInfo); // Do not trim the folder label, as is was set by the user. @@ -1041,7 +1061,7 @@ public class LauncherModel extends BroadcastReceiver // no special handling required for restored folders c.markRestored(); - c.checkAndAddItem(folderInfo, sBgDataModel); + c.checkAndAddItem(folderInfo, mBgDataModel); break; case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: @@ -1062,8 +1082,7 @@ public class LauncherModel extends BroadcastReceiver LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY); if (widgetProvidersMap == null) { - widgetProvidersMap = AppWidgetManagerCompat - .getInstance(mContext).getAllProvidersMap(); + widgetProvidersMap = mAppWidgetManager.getAllProvidersMap(); } final AppWidgetProviderInfo provider = widgetProvidersMap.get( new ComponentKey( @@ -1161,7 +1180,7 @@ public class LauncherModel extends BroadcastReceiver appWidgetInfo.pendingItemInfo, false); } - c.checkAndAddItem(appWidgetInfo, sBgDataModel); + c.checkAndAddItem(appWidgetInfo, mBgDataModel); } break; } @@ -1175,7 +1194,7 @@ public class LauncherModel extends BroadcastReceiver // Break early if we've stopped loading if (mStopped) { - sBgDataModel.clear(); + mBgDataModel.clear(); return; } @@ -1187,9 +1206,9 @@ public class LauncherModel extends BroadcastReceiver LauncherSettings.Settings.METHOD_DELETE_EMPTY_FOLDERS) .getSerializable(LauncherSettings.Settings.EXTRA_VALUE); for (long folderId : deletedFolderIds) { - sBgDataModel.workspaceItems.remove(sBgDataModel.folders.get(folderId)); - sBgDataModel.folders.remove(folderId); - sBgDataModel.itemsIdMap.remove(folderId); + mBgDataModel.workspaceItems.remove(mBgDataModel.folders.get(folderId)); + mBgDataModel.folders.remove(folderId); + mBgDataModel.itemsIdMap.remove(folderId); } // Remove any ghost widgets @@ -1201,18 +1220,18 @@ public class LauncherModel extends BroadcastReceiver HashSet pendingShortcuts = InstallShortcutReceiver.getPendingShortcuts(context); for (ShortcutKey key : shortcutKeyToPinnedShortcuts.keySet()) { - MutableInt numTimesPinned = sBgDataModel.pinnedShortcutCounts.get(key); + MutableInt numTimesPinned = mBgDataModel.pinnedShortcutCounts.get(key); if ((numTimesPinned == null || numTimesPinned.value == 0) && !pendingShortcuts.contains(key)) { // Shortcut is pinned but doesn't exist on the workspace; unpin it. - shortcutManager.unpinShortcut(key); + mShortcutManager.unpinShortcut(key); } } FolderIconPreviewVerifier verifier = new FolderIconPreviewVerifier(mApp.getInvariantDeviceProfile()); // Sort the folder items and make sure all items in the preview are high resolution. - for (FolderInfo folder : sBgDataModel.folders) { + for (FolderInfo folder : mBgDataModel.folders) { Collections.sort(folder.contents, Folder.ITEM_POS_COMPARATOR); verifier.setFolderInfo(folder); @@ -1234,16 +1253,15 @@ public class LauncherModel extends BroadcastReceiver c.commitRestoredItems(); if (!isSdCardReady && !pendingPackages.isEmpty()) { context.registerReceiver( - new SdCardAvailableReceiver( - LauncherModel.this, mContext, pendingPackages), + new SdCardAvailableReceiver(mApp, pendingPackages), new IntentFilter(Intent.ACTION_BOOT_COMPLETED), null, sWorker); } // Remove any empty screens - ArrayList unusedScreens = new ArrayList<>(sBgDataModel.workspaceScreens); - for (ItemInfo item: sBgDataModel.itemsIdMap) { + ArrayList unusedScreens = new ArrayList<>(mBgDataModel.workspaceScreens); + for (ItemInfo item: mBgDataModel.itemsIdMap) { long screenId = item.screenId; if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && unusedScreens.contains(screenId)) { @@ -1253,8 +1271,8 @@ public class LauncherModel extends BroadcastReceiver // If there are any empty screens remove them, and update. if (unusedScreens.size() != 0) { - sBgDataModel.workspaceScreens.removeAll(unusedScreens); - updateWorkspaceScreenOrder(context, sBgDataModel.workspaceScreens); + mBgDataModel.workspaceScreens.removeAll(unusedScreens); + updateWorkspaceScreenOrder(context, mBgDataModel.workspaceScreens); } } if (LauncherAppState.PROFILE_STARTUP) { @@ -1265,8 +1283,8 @@ public class LauncherModel extends BroadcastReceiver private void updateIconCache() { // Ignore packages which have a promise icon. HashSet packagesToIgnore = new HashSet<>(); - synchronized (sBgDataModel) { - for (ItemInfo info : sBgDataModel.itemsIdMap) { + synchronized (mBgDataModel) { + for (ItemInfo info : mBgDataModel.itemsIdMap) { if (info instanceof ShortcutInfo) { ShortcutInfo si = (ShortcutInfo) info; if (si.isPromise() && si.getTargetComponent() != null) { @@ -1312,14 +1330,14 @@ public class LauncherModel extends BroadcastReceiver mBgAllAppsList.add(new AppInfo(app, user, quietMode), app); } - ManagedProfileHeuristic.onAllAppsLoaded(mContext, apps, user); + ManagedProfileHeuristic.onAllAppsLoaded(mApp.getContext(), apps, user); } if (FeatureFlags.LAUNCHER3_PROMISE_APPS_IN_ALL_APPS) { // get all active sessions and add them to the all apps list - PackageInstallerCompat installer = PackageInstallerCompat.getInstance(mContext); - for (PackageInstaller.SessionInfo info : installer.getAllVerifiedSessions()) { - mBgAllAppsList.addPromiseApp(mContext, + for (PackageInstaller.SessionInfo info : + mPackageInstaller.getAllVerifiedSessions()) { + mBgAllAppsList.addPromiseApp(mApp.getContext(), PackageInstallInfo.fromInstallingState(info)); } } @@ -1332,15 +1350,14 @@ public class LauncherModel extends BroadcastReceiver } private void loadDeepShortcuts() { - sBgDataModel.deepShortcutMap.clear(); - DeepShortcutManager shortcutManager = DeepShortcutManager.getInstance(mContext); - mHasShortcutHostPermission = shortcutManager.hasHostPermission(); - if (mHasShortcutHostPermission) { + mBgDataModel.deepShortcutMap.clear(); + mBgDataModel.hasShortcutHostPermission = mShortcutManager.hasHostPermission(); + if (mBgDataModel.hasShortcutHostPermission) { for (UserHandle user : mUserManager.getUserProfiles()) { if (mUserManager.isUserUnlocked(user)) { List shortcuts = - shortcutManager.queryForAllShortcuts(user); - sBgDataModel.updateDeepShortcutMap(null, user, shortcuts); + mShortcutManager.queryForAllShortcuts(user); + mBgDataModel.updateDeepShortcutMap(null, user, shortcuts); } } } @@ -1370,12 +1387,6 @@ public class LauncherModel extends BroadcastReceiver } public void enqueueModelUpdateTask(BaseModelUpdateTask task) { - if (!mModelLoaded && mLoaderTask == null) { - if (DEBUG_LOADERS) { - Log.d(TAG, "enqueueModelUpdateTask Ignoring task since loader is pending=" + task); - } - return; - } task.init(this); runOnWorkerThread(task); } @@ -1404,8 +1415,11 @@ public class LauncherModel extends BroadcastReceiver } @Override - public void run() { - if (!mModel.mHasLoaderCompletedOnce) { + public final void run() { + if (!mModel.mModelLoaded) { + if (DEBUG_LOADERS) { + Log.d(TAG, "Ignoring model task since loader is pending=" + this); + } // Loader has not yet run. return; } @@ -1465,34 +1479,12 @@ public class LauncherModel extends BroadcastReceiver }); } - private void bindWidgetsModel(final Callbacks callbacks) { - final MultiHashMap widgets - = mBgWidgetsModel.getWidgetsMap().clone(); - mUiExecutor.execute(new Runnable() { + public void refreshAndBindWidgetsAndShortcuts(@Nullable final PackageUserKey packageUser) { + enqueueModelUpdateTask(new ExtendedModelTask() { @Override - public void run() { - Callbacks cb = getCallback(); - if (callbacks == cb && cb != null) { - callbacks.bindAllWidgets(widgets); - } - } - }); - } - - public void refreshAndBindWidgetsAndShortcuts(final Callbacks callbacks, - final boolean bindFirst, @Nullable final PackageUserKey packageUser) { - runOnWorkerThread(new Runnable() { - @Override - public void run() { - if (bindFirst && !mBgWidgetsModel.isEmpty()) { - bindWidgetsModel(callbacks); - } - ArrayList widgets = mBgWidgetsModel.update( - mApp.getContext(), packageUser); - bindWidgetsModel(callbacks); - - // update the Widget entries inside DB on the worker thread. - mApp.getWidgetCache().removeObsoletePreviews(widgets, packageUser); + public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { + dataModel.widgetsModel.update(app, packageUser); + bindUpdatedWidgets(dataModel); } }); } diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index be93be4dc3..d9c5143f2e 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -90,11 +90,21 @@ public class BgDataModel { */ public final Map pinnedShortcutCounts = new HashMap<>(); + /** + * True if the launcher has permission to access deep shortcuts. + */ + public boolean hasShortcutHostPermission; + /** * Maps all launcher activities to the id's of their shortcuts (if they have any). */ public final MultiHashMap deepShortcutMap = new MultiHashMap<>(); + /** + * Entire list of widgets. + */ + public final WidgetsModel widgetsModel = new WidgetsModel(); + /** * Clears all the data */ diff --git a/src/com/android/launcher3/model/ExtendedModelTask.java b/src/com/android/launcher3/model/ExtendedModelTask.java index 05419662bc..080aaf54b0 100644 --- a/src/com/android/launcher3/model/ExtendedModelTask.java +++ b/src/com/android/launcher3/model/ExtendedModelTask.java @@ -59,4 +59,15 @@ public abstract class ExtendedModelTask extends BaseModelUpdateTask { } }); } + + public void bindUpdatedWidgets(BgDataModel dataModel) { + final MultiHashMap widgets + = dataModel.widgetsModel.getWidgetsMap(); + scheduleCallbackTask(new CallbackTask() { + @Override + public void execute(Callbacks callbacks) { + callbacks.bindAllWidgets(widgets); + } + }); + } } diff --git a/src/com/android/launcher3/model/LoaderResults.java b/src/com/android/launcher3/model/LoaderResults.java index 61fd356b8d..28df64d39d 100644 --- a/src/com/android/launcher3/model/LoaderResults.java +++ b/src/com/android/launcher3/model/LoaderResults.java @@ -24,6 +24,7 @@ import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; +import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; import com.android.launcher3.MainThreadExecutor; @@ -58,6 +59,7 @@ public class LoaderResults { private final BgDataModel mBgDataModel; private final AllAppsList mBgAllAppsList; private final int mPageToBindFirst; + private final WeakReference mCallbacks; public LoaderResults(LauncherAppState app, BgDataModel dataModel, @@ -358,7 +360,6 @@ public class LoaderResults { mUiExecutor.execute(r); } - public void bindAllApps() { // shallow copy @SuppressWarnings("unchecked") @@ -374,4 +375,18 @@ public class LoaderResults { }; mUiExecutor.execute(r); } + + public void bindWidgets() { + final MultiHashMap widgets + = mBgDataModel.widgetsModel.getWidgetsMap(); + Runnable r = new Runnable() { + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindAllWidgets(widgets); + } + } + }; + mUiExecutor.execute(r); + } } diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 8380f01361..46fea218fc 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -44,6 +44,7 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.ItemInfoMatcher; +import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; @@ -373,11 +374,9 @@ public class PackageUpdatedTask extends ExtendedModelTask { } else if (Utilities.isAtLeastO() && mOp == OP_ADD) { // Load widgets for the new package. for (int i = 0; i < N; i++) { - LauncherModel model = app.getModel(); - model.refreshAndBindWidgetsAndShortcuts( - model.getCallback(), false /* bindFirst */, - new PackageUserKey(packages[i], mUser) /* packageUser */); + dataModel.widgetsModel.update(app, new PackageUserKey(packages[i], mUser)); } + bindUpdatedWidgets(dataModel); } } } diff --git a/src/com/android/launcher3/model/SdCardAvailableReceiver.java b/src/com/android/launcher3/model/SdCardAvailableReceiver.java index bae5c73c1b..3aedae69aa 100644 --- a/src/com/android/launcher3/model/SdCardAvailableReceiver.java +++ b/src/com/android/launcher3/model/SdCardAvailableReceiver.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.Intent; import android.os.UserHandle; +import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.util.MultiHashMap; @@ -43,10 +44,10 @@ public class SdCardAvailableReceiver extends BroadcastReceiver { private final Context mContext; private final MultiHashMap mPackages; - public SdCardAvailableReceiver(LauncherModel model, Context context, + public SdCardAvailableReceiver(LauncherAppState app, MultiHashMap packages) { - mModel = model; - mContext = context; + mModel = app.getModel(); + mContext = app.getContext(); mPackages = packages; } diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java index 827675a833..ed900bf358 100644 --- a/src/com/android/launcher3/model/WidgetsModel.java +++ b/src/com/android/launcher3/model/WidgetsModel.java @@ -38,36 +38,26 @@ public class WidgetsModel { private static final boolean DEBUG = false; /* Map of widgets and shortcuts that are tracked per package. */ - private final MultiHashMap mWidgetsList; + private final MultiHashMap mWidgetsList = new MultiHashMap<>(); - private final IconCache mIconCache; - private final AppFilter mAppFilter; + private AppFilter mAppFilter; - public WidgetsModel(IconCache iconCache, AppFilter appFilter) { - mIconCache = iconCache; - mAppFilter = appFilter; - mWidgetsList = new MultiHashMap<>(); - } - - public MultiHashMap getWidgetsMap() { - return mWidgetsList; - } - - public boolean isEmpty() { - return mWidgetsList.isEmpty(); + public synchronized MultiHashMap getWidgetsMap() { + return mWidgetsList.clone(); } /** * @param packageUser If null, all widgets and shortcuts are updated and returned, otherwise * only widgets and shortcuts associated with the package/user are. */ - public ArrayList update(Context context, @Nullable PackageUserKey packageUser) { + public void update(LauncherAppState app, @Nullable PackageUserKey packageUser) { Preconditions.assertWorkerThread(); + Context context = app.getContext(); final ArrayList widgetsAndShortcuts = new ArrayList<>(); try { PackageManager pm = context.getPackageManager(); - InvariantDeviceProfile idp = LauncherAppState.getIDP(context); + InvariantDeviceProfile idp = app.getInvariantDeviceProfile(); // Widgets AppWidgetManagerCompat widgetManager = AppWidgetManagerCompat.getInstance(context); @@ -81,7 +71,7 @@ public class WidgetsModel { .getCustomShortcutActivityList(packageUser)) { widgetsAndShortcuts.add(new WidgetItem(info)); } - setWidgetsAndShortcuts(widgetsAndShortcuts, context, packageUser); + setWidgetsAndShortcuts(widgetsAndShortcuts, app, packageUser); } catch (Exception e) { if (!FeatureFlags.IS_DOGFOOD_BUILD && Utilities.isBinderSizeError(e)) { // the returned value may be incomplete and will not be refreshed until the next @@ -92,11 +82,12 @@ public class WidgetsModel { throw e; } } - return widgetsAndShortcuts; + + app.getWidgetCache().removeObsoletePreviews(widgetsAndShortcuts, packageUser); } - private void setWidgetsAndShortcuts(ArrayList rawWidgetsShortcuts, - Context context, @Nullable PackageUserKey packageUser) { + private synchronized void setWidgetsAndShortcuts(ArrayList rawWidgetsShortcuts, + LauncherAppState app, @Nullable PackageUserKey packageUser) { if (DEBUG) { Log.d(TAG, "addWidgetsAndShortcuts, widgetsShortcuts#=" + rawWidgetsShortcuts.size()); } @@ -133,7 +124,7 @@ public class WidgetsModel { } } - InvariantDeviceProfile idp = LauncherAppState.getIDP(context); + InvariantDeviceProfile idp = app.getInvariantDeviceProfile(); UserHandle myUser = Process.myUserHandle(); // add and update. @@ -152,6 +143,9 @@ public class WidgetsModel { } } + if (mAppFilter == null) { + mAppFilter = AppFilter.newInstance(app.getContext()); + } if (!mAppFilter.shouldShowApp(item.componentName)) { if (DEBUG) { Log.d(TAG, String.format("%s is filtered and not added to the widget tray.", @@ -174,8 +168,9 @@ public class WidgetsModel { } // Update each package entry + IconCache iconCache = app.getIconCache(); for (PackageItemInfo p : tmpPackageItemInfos.values()) { - mIconCache.getTitleAndIconForApp(p, true /* userLowResIcon */); + iconCache.getTitleAndIconForApp(p, true /* userLowResIcon */); } } } \ No newline at end of file From 6c74114660a73bcb615feb1b074753e10cae95c0 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 2 Jun 2017 18:16:58 -0700 Subject: [PATCH 126/446] Import translations. DO NOT MERGE Change-Id: I01fa29ac699eaac1d7eed9f345c3b65a9f480508 Auto-generated-cl: translation import --- res/values-af/strings.xml | 12 ++++-------- res/values-ar/strings.xml | 12 ++++-------- res/values-az-rAZ/strings.xml | 12 ++++-------- res/values-b+sr+Latn/strings.xml | 12 ++++-------- res/values-be-rBY/strings.xml | 12 ++++-------- res/values-bg/strings.xml | 12 ++++-------- res/values-bn-rBD/strings.xml | 12 ++++-------- res/values-bs-rBA/strings.xml | 12 ++++-------- res/values-ca/strings.xml | 12 ++++-------- res/values-cs/strings.xml | 12 ++++-------- res/values-da/strings.xml | 12 ++++-------- res/values-de/strings.xml | 12 ++++-------- res/values-el/strings.xml | 12 ++++-------- res/values-en-rAU/strings.xml | 12 ++++-------- res/values-en-rGB/strings.xml | 12 ++++-------- res/values-en-rIN/strings.xml | 12 ++++-------- res/values-es-rUS/strings.xml | 12 ++++-------- res/values-es/strings.xml | 12 ++++-------- res/values-et-rEE/strings.xml | 12 ++++-------- res/values-eu-rES/strings.xml | 12 ++++-------- res/values-fa/strings.xml | 12 ++++-------- res/values-fi/strings.xml | 12 ++++-------- res/values-fr-rCA/strings.xml | 12 ++++-------- res/values-fr/strings.xml | 12 ++++-------- res/values-gl-rES/strings.xml | 12 ++++-------- res/values-gu-rIN/strings.xml | 12 ++++-------- res/values-hi/strings.xml | 12 ++++-------- res/values-hr/strings.xml | 12 ++++-------- res/values-hu/strings.xml | 12 ++++-------- res/values-hy-rAM/strings.xml | 12 ++++-------- res/values-in/strings.xml | 12 ++++-------- res/values-is-rIS/strings.xml | 12 ++++-------- res/values-it/strings.xml | 12 ++++-------- res/values-iw/strings.xml | 12 ++++-------- res/values-ja/strings.xml | 14 +++++--------- res/values-ka-rGE/strings.xml | 12 ++++-------- res/values-kk-rKZ/strings.xml | 12 ++++-------- res/values-km-rKH/strings.xml | 12 ++++-------- res/values-kn-rIN/strings.xml | 12 ++++-------- res/values-ko/strings.xml | 12 ++++-------- res/values-ky-rKG/strings.xml | 12 ++++-------- res/values-lo-rLA/strings.xml | 12 ++++-------- res/values-lt/strings.xml | 12 ++++-------- res/values-lv/strings.xml | 12 ++++-------- res/values-mk-rMK/strings.xml | 12 ++++-------- res/values-ml-rIN/strings.xml | 12 ++++-------- res/values-mn-rMN/strings.xml | 12 ++++-------- res/values-mr-rIN/strings.xml | 12 ++++-------- res/values-ms-rMY/strings.xml | 12 ++++-------- res/values-my-rMM/strings.xml | 12 ++++-------- res/values-nb/strings.xml | 12 ++++-------- res/values-ne-rNP/strings.xml | 12 ++++-------- res/values-nl/strings.xml | 12 ++++-------- res/values-pa-rIN/strings.xml | 12 ++++-------- res/values-pl/strings.xml | 12 ++++-------- res/values-pt-rPT/strings.xml | 12 ++++-------- res/values-pt/strings.xml | 12 ++++-------- res/values-ro/strings.xml | 12 ++++-------- res/values-ru/strings.xml | 12 ++++-------- res/values-si-rLK/strings.xml | 12 ++++-------- res/values-sk/strings.xml | 12 ++++-------- res/values-sl/strings.xml | 12 ++++-------- res/values-sq-rAL/strings.xml | 12 ++++-------- res/values-sr/strings.xml | 12 ++++-------- res/values-sv/strings.xml | 12 ++++-------- res/values-sw/strings.xml | 12 ++++-------- res/values-ta-rIN/strings.xml | 12 ++++-------- res/values-te-rIN/strings.xml | 12 ++++-------- res/values-th/strings.xml | 12 ++++-------- res/values-tl/strings.xml | 12 ++++-------- res/values-tr/strings.xml | 12 ++++-------- res/values-uk/strings.xml | 12 ++++-------- res/values-ur-rPK/strings.xml | 12 ++++-------- res/values-uz-rUZ/strings.xml | 12 ++++-------- res/values-vi/strings.xml | 12 ++++-------- res/values-zh-rCN/strings.xml | 12 ++++-------- res/values-zh-rHK/strings.xml | 12 ++++-------- res/values-zh-rTW/strings.xml | 12 ++++-------- res/values-zu/strings.xml | 12 ++++-------- 79 files changed, 317 insertions(+), 633 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index fda7db19cc..68b8307790 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -84,14 +84,10 @@ "Gebruik stelselverstek" - - - - - - - - + "Vierkant" + "Sirkelvierkant" + "Sirkel" + "Traandruppel" "Onbekend" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 2852376638..cb2634d27b 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -84,14 +84,10 @@ "استخدام الإعداد الافتراضي للنظام" - - - - - - - - + "مربّع" + "رمز دائري مربّع" + "دائرة" + "رمز على شكل دمعة" "غير معروفة" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 6b997883ff..1f89f5a229 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -84,14 +84,10 @@ "Sistem defoltu istifadə edin" - - - - - - - - + "Kvadrat" + "Kənarları dairəvi kvadrat" + "Çevrə" + "Gözyaşı damlası" "Naməlum" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index d96bd62f71..9f2855d4d5 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -84,14 +84,10 @@ "Koristi podrazumevano sistemsko podešavanje" - - - - - - - - + "Kvadrat" + "Zaobljeni kvadrat" + "Krug" + "Suza" "Nepoznato" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index 8ee1663235..a0b7a69273 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -84,14 +84,10 @@ "Выкарыстоўваць стандартныя формы" - - - - - - - - + "Квадрат" + "Прамавугольнік са скругленымі вугламі" + "Круг" + "Сляза" "Невядома" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 61de76f24a..fc3ba4ba80 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -84,14 +84,10 @@ "Използване на стандартната системна настройка" - - - - - - - - + "Квадрат" + "Комбинация от кръг и квадрат" + "Кръг" + "Сълза" "Няма информация" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index d7bd83b7fa..1ee4b6b174 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -83,14 +83,10 @@ "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" "সিস্টেমের ডিফল্ট মান ব্যবহার করুন" - - - - - - - - + "চৌকো" + "চৌকো-গোলাকার" + "গোলাকার" + "চোখের জল" "আইকনের আকৃতি পরিবর্তন করা হচ্ছে" "অজানা" "সরান" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index c148413839..259e51617f 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -84,14 +84,10 @@ "Koristite sistemski zadano" - - - - - - - - + "Kvadrat" + "Zaobljeni kvadrat" + "Krug" + "Suza" "Nepoznato" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 245c760175..feee97d40a 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -84,14 +84,10 @@ "Utilitza l\'opció predeterminada del sistema" - - - - - - - - + "Quadrat" + "Quadrat arrodonit" + "Cercle" + "Llàgrima" "Desconegut" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 556294b56a..2560de3d59 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -84,14 +84,10 @@ "Použít výchozí nastavení systému" - - - - - - - - + "Čtverec" + "Kruh/čtverec" + "Kruh" + "Slza" "Neznámé" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index f811f119c9..521f9eab1e 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -84,14 +84,10 @@ "Brug systemstandarden" - - - - - - - - + "Kvadrat" + "Kvadrat med runde hjørner" + "Cirkel" + "Dråbeform" "Ukendt" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index f25b46fc42..03eb04801a 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -84,14 +84,10 @@ "Systemstandardeinstellung verwenden" - - - - - - - - + "Quadrat" + "Superkreis" + "Kreis" + "Träne" "Unbekannt" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index a148c51cea..a2b44b4bc2 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -84,14 +84,10 @@ "Χρήση προεπιλογής συστήματος" - - - - - - - - + "Τετράγωνο" + "Στρογγυλεμένο τετράγωνο" + "Κύκλος" + "Δάκρυ" "Άγνωστο" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 504bd81cb0..08ef4f4e32 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -84,14 +84,10 @@ "Use system default" - - - - - - - - + "Square" + "Squircle" + "Circle" + "Teardrop" "Unknown" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 504bd81cb0..08ef4f4e32 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -84,14 +84,10 @@ "Use system default" - - - - - - - - + "Square" + "Squircle" + "Circle" + "Teardrop" "Unknown" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 504bd81cb0..08ef4f4e32 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -84,14 +84,10 @@ "Use system default" - - - - - - - - + "Square" + "Squircle" + "Circle" + "Teardrop" "Unknown" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 4999275651..e4315bba1a 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -84,14 +84,10 @@ "Usar el sistema predeterminado" - - - - - - - - + "Cuadrado" + "Cuadrado con esquinas redondeadas" + "Círculo" + "Gota" "Desconocido" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 5e4f1617d8..3c2691067d 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -84,14 +84,10 @@ "Usar opción predeterminada del sistema" - - - - - - - - + "Cuadrado" + "Cuadrado con esquinas redondeadas" + "Círculo" + "Lágrima" "Desconocido" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 51a3f7ab33..3cd9a9ea44 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -84,14 +84,10 @@ "Kasuta süsteemi vaikeseadet" - - - - - - - - + "Ruut" + "Ümarate nurkadega ruut" + "Ring" + "Tilk" "Teadmata" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index 063ce2b6aa..dfb969f364 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -84,14 +84,10 @@ "Erabili sistemaren balio lehenetsiak" - - - - - - - - + "Karratua" + "Ertz biribilduko karratua" + "Zirkulua" + "Malkoa" "Ezezaguna" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index f3b3a8477a..7da80a4002 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -84,14 +84,10 @@ "استفاده از پیش‌فرض سیستم" - - - - - - - - + "مربع" + "مربع با گوشه‌های گرد" + "دایره" + "قطره اشک" "نامشخص" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 49d44f85d3..b125d45145 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -84,14 +84,10 @@ "Käytä järjestelmän oletusarvoa" - - - - - - - - + "Neliö" + "Ympyräneliö" + "Ympyrä" + "Pisara" "Tuntematon" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 0169e5dbdf..3b7a1aebd2 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -84,14 +84,10 @@ "Utiliser les valeurs système par défaut" - - - - - - - - + "Carré" + "Carré aux coins ronds" + "Cercle" + "Goutte" "Inconnu" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 944a6cb4c6..ca4c7e7ea3 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -84,14 +84,10 @@ "Utiliser la valeur système par défaut" - - - - - - - - + "Carré" + "Squircle" + "Cercle" + "Goutte" "Inconnu" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index fb4489c64f..c1d2536cea 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -84,14 +84,10 @@ "Usar valores predeterminados do sistema" - - - - - - - - + "Cadrado" + "Cadrado de bordos redondeados" + "Círculo" + "Bágoa" "Descoñecido" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 9a316b296f..31d92b0161 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -83,14 +83,10 @@ "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" "સિસ્ટમ ડિફૉલ્ટનો ઉપયોગ કરો" - - - - - - - - + "ચોરસ" + "ચોરસ જેવું ગોળ" + "વર્તુળ" + "ટિઅરડ્રોપ" "આઇકનના આકારમાં કરેલ ફેરફારો લાગુ કરી રહ્યા છીએ" "અજાણ્યો" "દૂર કરો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index db4a52e961..e5b316c6a0 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -84,14 +84,10 @@ "सिस्टम डिफ़ॉल्ट का उपयोग करें" - - - - - - - - + "वर्ग" + "गोल कोनों वाला वर्ग" + "मंडली" + "आंसू की बूंद" "अज्ञात" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 322fb3f583..de5f9aea07 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -84,14 +84,10 @@ "Upotrijebi zadane postavke sustava" - - - - - - - - + "Kvadrat" + "Zaobljeni kvadrat" + "Krug" + "Suza" "Nepoznato" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 938ed30810..f0f597cd16 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -84,14 +84,10 @@ "Alapértelmezett érték használata" - - - - - - - - + "Négyzet" + "Squircle" + "Kör" + "Könnycsepp" "Ismeretlen" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index b00ed68dbb..f9fa33779b 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -84,14 +84,10 @@ "Օգտագործել համակարգի կանխադրված կարգավորումը" - - - - - - - - + "Քառակուսի" + "Քառանկյուն" + "Օղակ" + "Արցունքաձև" "Անհայտ է" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 0c80fb7dd0..3aff82bf37 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -84,14 +84,10 @@ "Gunakan default sistem" - - - - - - - - + "Persegi" + "Persegi bundar" + "Lingkaran" + "Butiran Air" "Tidak dikenal" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 702506599f..b672245c2d 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -84,14 +84,10 @@ "Nota sjálfgildi kerfis" - - - - - - - - + "Ferningur" + "Ferhringur" + "Hringur" + "Dropi" "Óþekkt" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index d0749cdc76..9e3fd93d11 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -84,14 +84,10 @@ "Usa impostazione predefinita di sistema" - - - - - - - - + "Quadrato" + "Supercerchio" + "Cerchio" + "Goccia" "Sconosciuto" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index b472fabb2d..f02d15605c 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -84,14 +84,10 @@ "השתמש בברירת המחדל של המערכת" - - - - - - - - + "ריבוע" + "ריבוע בעל פינות מעוגלות" + "מעגל" + "טיפה" "לא ידוע" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 4a58056a54..dc6f9bc120 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -84,14 +84,10 @@ "システムのデフォルトを使用" - - - - - - - - + "スクエア" + "スクワークル" + "サークル" + "ティアドロップ" "不明" @@ -128,7 +124,7 @@ "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" "ショートカット" "%2$s用の %1$d 件のショートカット" - "%3$s: %1$d 件のショートカットと %2$d 件の通知" + "%3$s: %1$d 個のショートカットと %2$d 件の通知" "表示しない" "通知を非表示にしました" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 0bade8e418..5544ee1524 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -84,14 +84,10 @@ "ნაგულისხმევი სისტემური პარამეტრების გამოყენება" - - - - - - - - + "კვადრატი" + "წრეკუთხედი" + "წრე" + "წვეთი" "უცნობი" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 9b2dab321d..1507a58992 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -84,14 +84,10 @@ "Жүйенің әдепкі параметрін пайдалану" - - - - - - - - + "Шаршы" + "Жұмыр төртбұрыш" + "Шеңбер" + "Тамшы" "Белгісіз" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 59c13cc9ca..9f0e72dfd7 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -84,14 +84,10 @@ "ប្រើលំនាំដើមរបស់ប្រព័ន្ធ" - - - - - - - - + "ការ៉េ" + "ការ៉េជ្រុងកោង" + "រង្វង់" + "តំណក់​ទឹកភ្នែក" "មិន​ស្គាល់" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 1cda087cb0..2785ad85a7 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -83,14 +83,10 @@ "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" "ಸಿಸ್ಟಂ ಡಿಫಾಲ್ಟ್ ಬಳಸಿ" - - - - - - - - + "ಚೌಕ" + "ಚೌಕವೃತ್ತ" + "ವೃತ್ತ" + "ಕಂಬನಿ" "ಐಕಾನ್ ಆಕಾರ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತಿದೆ" "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 2e8d149dcb..f9185e86d2 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -84,14 +84,10 @@ "시스템 기본값 사용" - - - - - - - - + "정사각형" + "모서리가 둥근 정사각형" + "원" + "눈물방울" "알 수 없음" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 791dfcb2a7..87d98c5c79 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -84,14 +84,10 @@ "Тутум сушунтаган демейкисин колдонуу" - - - - - - - - + "Чарчы" + "Бурчтары жумуру төрт бурчтук" + "Тегерек" + "Тамчы" "Белгисиз" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index cbb17d92bd..9530aef2b7 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -84,14 +84,10 @@ "ໃຊ້ຄ່າເລີ່ມຕົ້ນລະບົບ" - - - - - - - - + "ສີ່ຫຼ່ຽມຈັດຕຸລັດ" + "ສີ່ຫຼ່ຽມຂອບມົນ" + "ວົງມົນ" + "ນ້ຳຢອດ" "​ບໍ່​ຮູ້​ຈັກ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 9c7f2aaf67..517e61137c 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -84,14 +84,10 @@ "Naudoti numatytuosius sistemos nustatymus" - - - - - - - - + "Kvadratas" + "Kvadratais suapvalintais kampais" + "Apskritimas" + "Ašara" "Nežinoma" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index b7f426ee65..0c00bda9c5 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -84,14 +84,10 @@ "Izmantot sistēmas noklusējumu" - - - - - - - - + "Kvadrāts" + "Kvadrāts ar noapaļotiem stūriem" + "Aplis" + "Lāse" "Nezināma" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index 6d6473fa0d..f9948922cb 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -84,14 +84,10 @@ "Користи ја стандардната поставка на системот" - - - - - - - - + "Квадрат" + "Заоблен квадрат" + "Круг" + "Солза" "Непознато" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index b909c1108b..5995c5cdca 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -83,14 +83,10 @@ "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" "സിസ്‌റ്റം ഡിഫോൾട്ട് ഉപയോഗിക്കുക" - - - - - - - - + "ചതുരം" + "ചതുരവൃത്തം" + "വൃത്തം" + "കണ്ണുനീര്‍ തുള്ളി" "ഐക്കൺ ആകാര മാറ്റങ്ങൾ പ്രയോഗിക്കുന്നു" "അജ്ഞാതം" "നീക്കംചെയ്യുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 696b42ccf9..11e7959197 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -84,14 +84,10 @@ "Системийн өгөгдмөл тохиргоог ашиглах" - - - - - - - - + "Дөрвөлжин" + "Мохоо өнцөгтэй дөрвөлжин" + "Дугуй" + "Дусал" "Тодорхойгүй" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 0c74b1584d..f9443a191a 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -83,14 +83,10 @@ "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" "सिस्‍टमचे डीफॉल्‍ट वापरा" - - - - - - - - + "चौरस" + "गोलाकार चौरस" + "वर्तुळ" + "अश्रू" "चिन्हाचा आकार बदल लागू करत आहे" "अज्ञात" "काढा" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 20410bce17..385a9438d5 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -84,14 +84,10 @@ "Gunakan lalai sistem" - - - - - - - - + "Segi empat sama" + "Segi empat berbucu bulat" + "Bulatan" + "Titisan air mata" "Tidak diketahui" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 19e017e107..0588aaabf2 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -84,14 +84,10 @@ "စနစ်၏ မူရင်းပုံကို အသုံးပြုရန်" - - - - - - - - + "လေးထောင့်" + "စတုရန်းမကျ စက်ဝိုင်းမကျပုံ" + "စက်ဝိုင်း" + "မျက်ရည်စက်ပုံ" "မသိရ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 4d3389e090..fb7eecdd52 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -84,14 +84,10 @@ "Bruk systemstandard" - - - - - - - - + "Kvadrat" + "Superellipse" + "Sirkel" + "Dråpe" "Ukjent" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 0f0c654d94..524e9c6337 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -83,14 +83,10 @@ "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" "प्रणालीको पूर्वनिर्धारित सेटिङ प्रयोग गर्नुहोस्" - - - - - - - - + "वर्ग" + "वर्गाकार वृत्त" + "वृत्त" + "आँसुको थोपा" "आइकनको आकारमा गरिएका परिवर्तनहरू लागू गरिँदैछन्" "अज्ञात" "हटाउनुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 9e35568675..bd99a5c7b4 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -84,14 +84,10 @@ "Systeemstandaard gebruiken" - - - - - - - - + "Vierkant" + "Squircle" + "Cirkel" + "Traan" "Onbekend" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 76c6bd5371..97add38bb3 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -83,14 +83,10 @@ "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" "ਸਿਸਟਮ ਦੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ" - - - - - - - - + "ਵਰਗ" + "ਵਰਗ ਰੂਪੀ ਗੋਲ-ਚੱਕਰ" + "ਗੋਲ-ਚੱਕਰ" + "ਹੰਝੂ ਦੀ ਬੂੰਦ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index b3eb423376..0955d13f5c 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -84,14 +84,10 @@ "Użyj ustawienia domyślnego" - - - - - - - - + "Kwadrat" + "Zaokrąglony kwadrat" + "Okrąg" + "Łza" "Brak informacji" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index d1b03aa357..e9e56cc84b 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -84,14 +84,10 @@ "Utilizar a predefinição do sistema" - - - - - - - - + "Quadrado" + "Quadrado e círculo" + "Círculo" + "Lágrima" "Desconhecido" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index c1176722fb..4e178078d2 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -84,14 +84,10 @@ "Usar padrão do sistema" - - - - - - - - + "Quadrado" + "Quadrado arredondado" + "Círculo" + "Lágrima" "Desconhecido" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 69b44e28f2..953b2c899c 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -84,14 +84,10 @@ "Folosiți setarea prestabilită a sistemului" - - - - - - - - + "Pătrat" + "Pătrat cu colțuri rotunjite" + "Cerc" + "Lacrimă" "Necunoscut" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 6f00f2d51e..60296aeb63 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -84,14 +84,10 @@ "Использовать системные настройки по умолчанию" - - - - - - - - + "Квадрат" + "Квадрат с закругленными краями" + "Круг" + "Капля" "Неизвестно" diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index fec9ff8ab2..ff6416f407 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -84,14 +84,10 @@ "පද්ධති පෙරනිමි භාවිත කරන්න" - - - - - - - - + "සමචතුරස්‍රය" + "හතරැස් කවය" + "කවය" + "කඳුළු බිංදුව" "නොදනී" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 500f14f82b..1a49d7d44b 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -84,14 +84,10 @@ "Použiť predvolené nastavenie systému" - - - - - - - - + "Štvorec" + "Okrúhly štvorec" + "Kruh" + "Slza" "Neznáme" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index bc951af462..16cb58cf92 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -84,14 +84,10 @@ "Uporabi privzeto nastavitev sistema" - - - - - - - - + "Kvadrat" + "Zaobljen kvadrat" + "Krog" + "Solza" "Neznano" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index f4798f6b75..1ad19ce28f 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -84,14 +84,10 @@ "Përdor parazgjedhjen e sisteit" - - - - - - - - + "Katror" + "Katror me kënde të rrumbullakëta" + "Rreth" + "Pikë loti" "I panjohur" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index de24f32469..f02a829d36 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -84,14 +84,10 @@ "Користи подразумевано системско подешавање" - - - - - - - - + "Квадрат" + "Заобљени квадрат" + "Круг" + "Суза" "Непознато" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 0baf97d56b..6778bdc83e 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -84,14 +84,10 @@ "Använd systemstandard" - - - - - - - - + "Kvadrat" + "Kvirkel" + "Cirkel" + "Droppe" "Okänt" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 96a78db239..48e8a329f1 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -86,14 +86,10 @@ "Tumia umbo chaguo-msingi la mfumo" - - - - - - - - + "Mraba" + "Mstatili wenye pembe duara" + "Mduara" + "Umbo la chozi" "Yasiyojulikana" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index 15fb1106a5..eca34ce9c4 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -84,14 +84,10 @@ "அமைப்பின் இயல்புநிலையைப் பயன்படுத்து" - - - - - - - - + "சதுரம்" + "சதுரவட்டம்" + "வட்டம்" + "கண்ணீர்துளி" "தெரியாதது" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 05c4788f40..e79512e23b 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -83,14 +83,10 @@ "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" "సిస్టమ్ డిఫాల్ట్‌ను ఉపయోగించండి" - - - - - - - - + "చతురస్రం" + "చతురస్రాకార వృత్తం" + "వృత్తం" + "కన్నీటి చుక్క" "చిహ్న ఆకార మార్పులను వర్తింపజేస్తోంది" "తెలియదు" "తీసివేయి" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 1f5c7c87c0..2adf4b996c 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -84,14 +84,10 @@ "ใช้ค่าเริ่มต้นของระบบ" - - - - - - - - + "สี่เหลี่ยมจัตุรัส" + "สี่เหลี่ยมขอบมน" + "วงกลม" + "หยดน้ำตา" "ไม่รู้จัก" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index ff92183d20..4390a3a384 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -84,14 +84,10 @@ "Gamitin ang default ng system" - - - - - - - - + "Parisukat" + "Squircle" + "Bilog" + "Teardrop" "Hindi kilala" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index ff28712655..cb03f5184d 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -84,14 +84,10 @@ "Sistem varsayılanını kullan" - - - - - - - - + "Kare" + "Kare-daire" + "Daire" + "Gözyaşı damlası" "Bilinmiyor" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index c904d414df..70a742fe7e 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -84,14 +84,10 @@ "Використовувати налаштування системи за умовчанням" - - - - - - - - + "Квадрат" + "Квадрат із заокругленими кутами" + "Круг" + "Сльоза" "Невідомо" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 31ac66f514..0a747e6a33 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -83,14 +83,10 @@ "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" "سسٹم ڈیفالٹ کا استعمال کریں" - - - - - - - - + "مربع" + "اسکورکل" + "حلقہ" + "آنسو کا قطرہ" "آئيکن کی شکل کی تبدیلیاں لاگو ہو رہی ہیں" "نامعلوم" "ہٹائیں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 716eedde23..d11a60d9bf 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -84,14 +84,10 @@ "Standart tizim parametrlaridan foydalanish" - - - - - - - - + "Kvadrat" + "Qirralari aylana kvadrat" + "Aylana" + "Tomchi" "Noma’lum" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 580a4dda79..bd7fc450f3 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -84,14 +84,10 @@ "Sử dụng mặc định của hệ thống" - - - - - - - - + "Hình vuông" + "Hình vuông cạnh bo tròn" + "Hình tròn" + "Hình giọt nước" "Không xác định" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 0a43a9175d..3ac74fd109 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -84,14 +84,10 @@ "使用系统默认设置" - - - - - - - - + "方形" + "方圆形" + "圆形" + "泪珠形" "未知" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index ae66324aa0..97cee9724c 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -84,14 +84,10 @@ "使用系統預設設定" - - - - - - - - + "正方形" + "方圓形" + "圓形" + "淚珠形" "不明" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 02f63504ef..6a75cce105 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -84,14 +84,10 @@ "使用系統預設值" - - - - - - - - + "正方形" + "方圓形" + "圓形" + "淚珠形" "不明" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index bdb46a359e..56d9985fba 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -84,14 +84,10 @@ "Sebenzisa okuzenzakalelayo kwesistimu" - - - - - - - - + "Isikwele" + "I-Squircle" + "Indingiliza" + "I-Teardrop" "Akwaziwa" From 26d7528bc22bb1dcca5f477745f92c42c76aa028 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 2 Jun 2017 18:17:40 -0700 Subject: [PATCH 127/446] Import translations. DO NOT MERGE Change-Id: I62ae15df954f8a27f87bc27b7217360fb0925079 Auto-generated-cl: translation import --- res/values-af/strings.xml | 12 ++++-------- res/values-ar/strings.xml | 12 ++++-------- res/values-az/strings.xml | 12 ++++-------- res/values-b+sr+Latn/strings.xml | 12 ++++-------- res/values-be/strings.xml | 12 ++++-------- res/values-bg/strings.xml | 12 ++++-------- res/values-bn/strings.xml | 12 ++++-------- res/values-bs/strings.xml | 12 ++++-------- res/values-ca/strings.xml | 12 ++++-------- res/values-cs/strings.xml | 12 ++++-------- res/values-da/strings.xml | 12 ++++-------- res/values-de/strings.xml | 12 ++++-------- res/values-el/strings.xml | 12 ++++-------- res/values-en-rAU/strings.xml | 12 ++++-------- res/values-en-rGB/strings.xml | 12 ++++-------- res/values-en-rIN/strings.xml | 12 ++++-------- res/values-es-rUS/strings.xml | 12 ++++-------- res/values-es/strings.xml | 12 ++++-------- res/values-et/strings.xml | 12 ++++-------- res/values-eu/strings.xml | 12 ++++-------- res/values-fa/strings.xml | 12 ++++-------- res/values-fi/strings.xml | 12 ++++-------- res/values-fr-rCA/strings.xml | 12 ++++-------- res/values-fr/strings.xml | 12 ++++-------- res/values-gl/strings.xml | 12 ++++-------- res/values-gu/strings.xml | 12 ++++-------- res/values-hi/strings.xml | 12 ++++-------- res/values-hr/strings.xml | 12 ++++-------- res/values-hu/strings.xml | 12 ++++-------- res/values-hy/strings.xml | 12 ++++-------- res/values-in/strings.xml | 12 ++++-------- res/values-is/strings.xml | 12 ++++-------- res/values-it/strings.xml | 12 ++++-------- res/values-iw/strings.xml | 12 ++++-------- res/values-ja/strings.xml | 14 +++++--------- res/values-ka/strings.xml | 12 ++++-------- res/values-kk/strings.xml | 12 ++++-------- res/values-km/strings.xml | 12 ++++-------- res/values-kn/strings.xml | 12 ++++-------- res/values-ko/strings.xml | 12 ++++-------- res/values-ky/strings.xml | 12 ++++-------- res/values-lo/strings.xml | 12 ++++-------- res/values-lt/strings.xml | 12 ++++-------- res/values-lv/strings.xml | 12 ++++-------- res/values-mk/strings.xml | 12 ++++-------- res/values-ml/strings.xml | 12 ++++-------- res/values-mn/strings.xml | 12 ++++-------- res/values-mr/strings.xml | 12 ++++-------- res/values-ms/strings.xml | 12 ++++-------- res/values-my/strings.xml | 12 ++++-------- res/values-nb/strings.xml | 12 ++++-------- res/values-ne/strings.xml | 12 ++++-------- res/values-nl/strings.xml | 12 ++++-------- res/values-pa/strings.xml | 12 ++++-------- res/values-pl/strings.xml | 12 ++++-------- res/values-pt-rPT/strings.xml | 12 ++++-------- res/values-pt/strings.xml | 12 ++++-------- res/values-ro/strings.xml | 12 ++++-------- res/values-ru/strings.xml | 12 ++++-------- res/values-si/strings.xml | 12 ++++-------- res/values-sk/strings.xml | 12 ++++-------- res/values-sl/strings.xml | 12 ++++-------- res/values-sq/strings.xml | 12 ++++-------- res/values-sr/strings.xml | 12 ++++-------- res/values-sv/strings.xml | 12 ++++-------- res/values-sw/strings.xml | 12 ++++-------- res/values-ta/strings.xml | 12 ++++-------- res/values-te/strings.xml | 12 ++++-------- res/values-th/strings.xml | 12 ++++-------- res/values-tl/strings.xml | 12 ++++-------- res/values-tr/strings.xml | 12 ++++-------- res/values-uk/strings.xml | 12 ++++-------- res/values-ur/strings.xml | 12 ++++-------- res/values-uz/strings.xml | 12 ++++-------- res/values-vi/strings.xml | 12 ++++-------- res/values-zh-rCN/strings.xml | 12 ++++-------- res/values-zh-rHK/strings.xml | 12 ++++-------- res/values-zh-rTW/strings.xml | 12 ++++-------- res/values-zu/strings.xml | 12 ++++-------- 79 files changed, 317 insertions(+), 633 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index fda7db19cc..68b8307790 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -84,14 +84,10 @@ "Gebruik stelselverstek" - - - - - - - - + "Vierkant" + "Sirkelvierkant" + "Sirkel" + "Traandruppel" "Onbekend" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 2852376638..cb2634d27b 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -84,14 +84,10 @@ "استخدام الإعداد الافتراضي للنظام" - - - - - - - - + "مربّع" + "رمز دائري مربّع" + "دائرة" + "رمز على شكل دمعة" "غير معروفة" diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index 6b997883ff..1f89f5a229 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -84,14 +84,10 @@ "Sistem defoltu istifadə edin" - - - - - - - - + "Kvadrat" + "Kənarları dairəvi kvadrat" + "Çevrə" + "Gözyaşı damlası" "Naməlum" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index d96bd62f71..9f2855d4d5 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -84,14 +84,10 @@ "Koristi podrazumevano sistemsko podešavanje" - - - - - - - - + "Kvadrat" + "Zaobljeni kvadrat" + "Krug" + "Suza" "Nepoznato" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 8ee1663235..a0b7a69273 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -84,14 +84,10 @@ "Выкарыстоўваць стандартныя формы" - - - - - - - - + "Квадрат" + "Прамавугольнік са скругленымі вугламі" + "Круг" + "Сляза" "Невядома" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 61de76f24a..fc3ba4ba80 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -84,14 +84,10 @@ "Използване на стандартната системна настройка" - - - - - - - - + "Квадрат" + "Комбинация от кръг и квадрат" + "Кръг" + "Сълза" "Няма информация" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index d7bd83b7fa..1ee4b6b174 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -83,14 +83,10 @@ "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" "সিস্টেমের ডিফল্ট মান ব্যবহার করুন" - - - - - - - - + "চৌকো" + "চৌকো-গোলাকার" + "গোলাকার" + "চোখের জল" "আইকনের আকৃতি পরিবর্তন করা হচ্ছে" "অজানা" "সরান" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index c148413839..259e51617f 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -84,14 +84,10 @@ "Koristite sistemski zadano" - - - - - - - - + "Kvadrat" + "Zaobljeni kvadrat" + "Krug" + "Suza" "Nepoznato" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 245c760175..feee97d40a 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -84,14 +84,10 @@ "Utilitza l\'opció predeterminada del sistema" - - - - - - - - + "Quadrat" + "Quadrat arrodonit" + "Cercle" + "Llàgrima" "Desconegut" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 556294b56a..2560de3d59 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -84,14 +84,10 @@ "Použít výchozí nastavení systému" - - - - - - - - + "Čtverec" + "Kruh/čtverec" + "Kruh" + "Slza" "Neznámé" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index f811f119c9..521f9eab1e 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -84,14 +84,10 @@ "Brug systemstandarden" - - - - - - - - + "Kvadrat" + "Kvadrat med runde hjørner" + "Cirkel" + "Dråbeform" "Ukendt" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index f25b46fc42..03eb04801a 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -84,14 +84,10 @@ "Systemstandardeinstellung verwenden" - - - - - - - - + "Quadrat" + "Superkreis" + "Kreis" + "Träne" "Unbekannt" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index a148c51cea..a2b44b4bc2 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -84,14 +84,10 @@ "Χρήση προεπιλογής συστήματος" - - - - - - - - + "Τετράγωνο" + "Στρογγυλεμένο τετράγωνο" + "Κύκλος" + "Δάκρυ" "Άγνωστο" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 504bd81cb0..08ef4f4e32 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -84,14 +84,10 @@ "Use system default" - - - - - - - - + "Square" + "Squircle" + "Circle" + "Teardrop" "Unknown" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 504bd81cb0..08ef4f4e32 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -84,14 +84,10 @@ "Use system default" - - - - - - - - + "Square" + "Squircle" + "Circle" + "Teardrop" "Unknown" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 504bd81cb0..08ef4f4e32 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -84,14 +84,10 @@ "Use system default" - - - - - - - - + "Square" + "Squircle" + "Circle" + "Teardrop" "Unknown" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 4999275651..e4315bba1a 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -84,14 +84,10 @@ "Usar el sistema predeterminado" - - - - - - - - + "Cuadrado" + "Cuadrado con esquinas redondeadas" + "Círculo" + "Gota" "Desconocido" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 5e4f1617d8..3c2691067d 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -84,14 +84,10 @@ "Usar opción predeterminada del sistema" - - - - - - - - + "Cuadrado" + "Cuadrado con esquinas redondeadas" + "Círculo" + "Lágrima" "Desconocido" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 51a3f7ab33..3cd9a9ea44 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -84,14 +84,10 @@ "Kasuta süsteemi vaikeseadet" - - - - - - - - + "Ruut" + "Ümarate nurkadega ruut" + "Ring" + "Tilk" "Teadmata" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 063ce2b6aa..dfb969f364 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -84,14 +84,10 @@ "Erabili sistemaren balio lehenetsiak" - - - - - - - - + "Karratua" + "Ertz biribilduko karratua" + "Zirkulua" + "Malkoa" "Ezezaguna" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index f3b3a8477a..7da80a4002 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -84,14 +84,10 @@ "استفاده از پیش‌فرض سیستم" - - - - - - - - + "مربع" + "مربع با گوشه‌های گرد" + "دایره" + "قطره اشک" "نامشخص" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 49d44f85d3..b125d45145 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -84,14 +84,10 @@ "Käytä järjestelmän oletusarvoa" - - - - - - - - + "Neliö" + "Ympyräneliö" + "Ympyrä" + "Pisara" "Tuntematon" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 0169e5dbdf..3b7a1aebd2 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -84,14 +84,10 @@ "Utiliser les valeurs système par défaut" - - - - - - - - + "Carré" + "Carré aux coins ronds" + "Cercle" + "Goutte" "Inconnu" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 944a6cb4c6..ca4c7e7ea3 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -84,14 +84,10 @@ "Utiliser la valeur système par défaut" - - - - - - - - + "Carré" + "Squircle" + "Cercle" + "Goutte" "Inconnu" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index fb4489c64f..c1d2536cea 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -84,14 +84,10 @@ "Usar valores predeterminados do sistema" - - - - - - - - + "Cadrado" + "Cadrado de bordos redondeados" + "Círculo" + "Bágoa" "Descoñecido" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index 9a316b296f..31d92b0161 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -83,14 +83,10 @@ "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" "સિસ્ટમ ડિફૉલ્ટનો ઉપયોગ કરો" - - - - - - - - + "ચોરસ" + "ચોરસ જેવું ગોળ" + "વર્તુળ" + "ટિઅરડ્રોપ" "આઇકનના આકારમાં કરેલ ફેરફારો લાગુ કરી રહ્યા છીએ" "અજાણ્યો" "દૂર કરો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index db4a52e961..e5b316c6a0 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -84,14 +84,10 @@ "सिस्टम डिफ़ॉल्ट का उपयोग करें" - - - - - - - - + "वर्ग" + "गोल कोनों वाला वर्ग" + "मंडली" + "आंसू की बूंद" "अज्ञात" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 322fb3f583..de5f9aea07 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -84,14 +84,10 @@ "Upotrijebi zadane postavke sustava" - - - - - - - - + "Kvadrat" + "Zaobljeni kvadrat" + "Krug" + "Suza" "Nepoznato" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 938ed30810..f0f597cd16 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -84,14 +84,10 @@ "Alapértelmezett érték használata" - - - - - - - - + "Négyzet" + "Squircle" + "Kör" + "Könnycsepp" "Ismeretlen" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index b00ed68dbb..f9fa33779b 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -84,14 +84,10 @@ "Օգտագործել համակարգի կանխադրված կարգավորումը" - - - - - - - - + "Քառակուսի" + "Քառանկյուն" + "Օղակ" + "Արցունքաձև" "Անհայտ է" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 0c80fb7dd0..3aff82bf37 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -84,14 +84,10 @@ "Gunakan default sistem" - - - - - - - - + "Persegi" + "Persegi bundar" + "Lingkaran" + "Butiran Air" "Tidak dikenal" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 702506599f..b672245c2d 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -84,14 +84,10 @@ "Nota sjálfgildi kerfis" - - - - - - - - + "Ferningur" + "Ferhringur" + "Hringur" + "Dropi" "Óþekkt" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index d0749cdc76..9e3fd93d11 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -84,14 +84,10 @@ "Usa impostazione predefinita di sistema" - - - - - - - - + "Quadrato" + "Supercerchio" + "Cerchio" + "Goccia" "Sconosciuto" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index b472fabb2d..f02d15605c 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -84,14 +84,10 @@ "השתמש בברירת המחדל של המערכת" - - - - - - - - + "ריבוע" + "ריבוע בעל פינות מעוגלות" + "מעגל" + "טיפה" "לא ידוע" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 4a58056a54..dc6f9bc120 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -84,14 +84,10 @@ "システムのデフォルトを使用" - - - - - - - - + "スクエア" + "スクワークル" + "サークル" + "ティアドロップ" "不明" @@ -128,7 +124,7 @@ "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" "ショートカット" "%2$s用の %1$d 件のショートカット" - "%3$s: %1$d 件のショートカットと %2$d 件の通知" + "%3$s: %1$d 個のショートカットと %2$d 件の通知" "表示しない" "通知を非表示にしました" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 0bade8e418..5544ee1524 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -84,14 +84,10 @@ "ნაგულისხმევი სისტემური პარამეტრების გამოყენება" - - - - - - - - + "კვადრატი" + "წრეკუთხედი" + "წრე" + "წვეთი" "უცნობი" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 9b2dab321d..1507a58992 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -84,14 +84,10 @@ "Жүйенің әдепкі параметрін пайдалану" - - - - - - - - + "Шаршы" + "Жұмыр төртбұрыш" + "Шеңбер" + "Тамшы" "Белгісіз" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 59c13cc9ca..9f0e72dfd7 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -84,14 +84,10 @@ "ប្រើលំនាំដើមរបស់ប្រព័ន្ធ" - - - - - - - - + "ការ៉េ" + "ការ៉េជ្រុងកោង" + "រង្វង់" + "តំណក់​ទឹកភ្នែក" "មិន​ស្គាល់" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 1cda087cb0..2785ad85a7 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -83,14 +83,10 @@ "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" "ಸಿಸ್ಟಂ ಡಿಫಾಲ್ಟ್ ಬಳಸಿ" - - - - - - - - + "ಚೌಕ" + "ಚೌಕವೃತ್ತ" + "ವೃತ್ತ" + "ಕಂಬನಿ" "ಐಕಾನ್ ಆಕಾರ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತಿದೆ" "ಅಪರಿಚಿತ" "ತೆಗೆದುಹಾಕಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 2e8d149dcb..f9185e86d2 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -84,14 +84,10 @@ "시스템 기본값 사용" - - - - - - - - + "정사각형" + "모서리가 둥근 정사각형" + "원" + "눈물방울" "알 수 없음" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index 791dfcb2a7..87d98c5c79 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -84,14 +84,10 @@ "Тутум сушунтаган демейкисин колдонуу" - - - - - - - - + "Чарчы" + "Бурчтары жумуру төрт бурчтук" + "Тегерек" + "Тамчы" "Белгисиз" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index cbb17d92bd..9530aef2b7 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -84,14 +84,10 @@ "ໃຊ້ຄ່າເລີ່ມຕົ້ນລະບົບ" - - - - - - - - + "ສີ່ຫຼ່ຽມຈັດຕຸລັດ" + "ສີ່ຫຼ່ຽມຂອບມົນ" + "ວົງມົນ" + "ນ້ຳຢອດ" "​ບໍ່​ຮູ້​ຈັກ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 9c7f2aaf67..517e61137c 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -84,14 +84,10 @@ "Naudoti numatytuosius sistemos nustatymus" - - - - - - - - + "Kvadratas" + "Kvadratais suapvalintais kampais" + "Apskritimas" + "Ašara" "Nežinoma" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index b7f426ee65..0c00bda9c5 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -84,14 +84,10 @@ "Izmantot sistēmas noklusējumu" - - - - - - - - + "Kvadrāts" + "Kvadrāts ar noapaļotiem stūriem" + "Aplis" + "Lāse" "Nezināma" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 6d6473fa0d..f9948922cb 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -84,14 +84,10 @@ "Користи ја стандардната поставка на системот" - - - - - - - - + "Квадрат" + "Заоблен квадрат" + "Круг" + "Солза" "Непознато" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index b909c1108b..5995c5cdca 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -83,14 +83,10 @@ "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" "സിസ്‌റ്റം ഡിഫോൾട്ട് ഉപയോഗിക്കുക" - - - - - - - - + "ചതുരം" + "ചതുരവൃത്തം" + "വൃത്തം" + "കണ്ണുനീര്‍ തുള്ളി" "ഐക്കൺ ആകാര മാറ്റങ്ങൾ പ്രയോഗിക്കുന്നു" "അജ്ഞാതം" "നീക്കംചെയ്യുക" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 696b42ccf9..11e7959197 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -84,14 +84,10 @@ "Системийн өгөгдмөл тохиргоог ашиглах" - - - - - - - - + "Дөрвөлжин" + "Мохоо өнцөгтэй дөрвөлжин" + "Дугуй" + "Дусал" "Тодорхойгүй" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 0c74b1584d..f9443a191a 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -83,14 +83,10 @@ "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" "सिस्‍टमचे डीफॉल्‍ट वापरा" - - - - - - - - + "चौरस" + "गोलाकार चौरस" + "वर्तुळ" + "अश्रू" "चिन्हाचा आकार बदल लागू करत आहे" "अज्ञात" "काढा" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index 20410bce17..385a9438d5 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -84,14 +84,10 @@ "Gunakan lalai sistem" - - - - - - - - + "Segi empat sama" + "Segi empat berbucu bulat" + "Bulatan" + "Titisan air mata" "Tidak diketahui" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 19e017e107..0588aaabf2 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -84,14 +84,10 @@ "စနစ်၏ မူရင်းပုံကို အသုံးပြုရန်" - - - - - - - - + "လေးထောင့်" + "စတုရန်းမကျ စက်ဝိုင်းမကျပုံ" + "စက်ဝိုင်း" + "မျက်ရည်စက်ပုံ" "မသိရ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 4d3389e090..fb7eecdd52 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -84,14 +84,10 @@ "Bruk systemstandard" - - - - - - - - + "Kvadrat" + "Superellipse" + "Sirkel" + "Dråpe" "Ukjent" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 0f0c654d94..524e9c6337 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -83,14 +83,10 @@ "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" "प्रणालीको पूर्वनिर्धारित सेटिङ प्रयोग गर्नुहोस्" - - - - - - - - + "वर्ग" + "वर्गाकार वृत्त" + "वृत्त" + "आँसुको थोपा" "आइकनको आकारमा गरिएका परिवर्तनहरू लागू गरिँदैछन्" "अज्ञात" "हटाउनुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 9e35568675..bd99a5c7b4 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -84,14 +84,10 @@ "Systeemstandaard gebruiken" - - - - - - - - + "Vierkant" + "Squircle" + "Cirkel" + "Traan" "Onbekend" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 76c6bd5371..97add38bb3 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -83,14 +83,10 @@ "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" "ਸਿਸਟਮ ਦੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ" - - - - - - - - + "ਵਰਗ" + "ਵਰਗ ਰੂਪੀ ਗੋਲ-ਚੱਕਰ" + "ਗੋਲ-ਚੱਕਰ" + "ਹੰਝੂ ਦੀ ਬੂੰਦ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" "ਹਟਾਓ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index b3eb423376..0955d13f5c 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -84,14 +84,10 @@ "Użyj ustawienia domyślnego" - - - - - - - - + "Kwadrat" + "Zaokrąglony kwadrat" + "Okrąg" + "Łza" "Brak informacji" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index d1b03aa357..e9e56cc84b 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -84,14 +84,10 @@ "Utilizar a predefinição do sistema" - - - - - - - - + "Quadrado" + "Quadrado e círculo" + "Círculo" + "Lágrima" "Desconhecido" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index c1176722fb..4e178078d2 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -84,14 +84,10 @@ "Usar padrão do sistema" - - - - - - - - + "Quadrado" + "Quadrado arredondado" + "Círculo" + "Lágrima" "Desconhecido" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 69b44e28f2..953b2c899c 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -84,14 +84,10 @@ "Folosiți setarea prestabilită a sistemului" - - - - - - - - + "Pătrat" + "Pătrat cu colțuri rotunjite" + "Cerc" + "Lacrimă" "Necunoscut" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 6f00f2d51e..60296aeb63 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -84,14 +84,10 @@ "Использовать системные настройки по умолчанию" - - - - - - - - + "Квадрат" + "Квадрат с закругленными краями" + "Круг" + "Капля" "Неизвестно" diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index fec9ff8ab2..ff6416f407 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -84,14 +84,10 @@ "පද්ධති පෙරනිමි භාවිත කරන්න" - - - - - - - - + "සමචතුරස්‍රය" + "හතරැස් කවය" + "කවය" + "කඳුළු බිංදුව" "නොදනී" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 500f14f82b..1a49d7d44b 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -84,14 +84,10 @@ "Použiť predvolené nastavenie systému" - - - - - - - - + "Štvorec" + "Okrúhly štvorec" + "Kruh" + "Slza" "Neznáme" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index bc951af462..16cb58cf92 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -84,14 +84,10 @@ "Uporabi privzeto nastavitev sistema" - - - - - - - - + "Kvadrat" + "Zaobljen kvadrat" + "Krog" + "Solza" "Neznano" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index f4798f6b75..1ad19ce28f 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -84,14 +84,10 @@ "Përdor parazgjedhjen e sisteit" - - - - - - - - + "Katror" + "Katror me kënde të rrumbullakëta" + "Rreth" + "Pikë loti" "I panjohur" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index de24f32469..f02a829d36 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -84,14 +84,10 @@ "Користи подразумевано системско подешавање" - - - - - - - - + "Квадрат" + "Заобљени квадрат" + "Круг" + "Суза" "Непознато" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 0baf97d56b..6778bdc83e 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -84,14 +84,10 @@ "Använd systemstandard" - - - - - - - - + "Kvadrat" + "Kvirkel" + "Cirkel" + "Droppe" "Okänt" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 96a78db239..48e8a329f1 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -86,14 +86,10 @@ "Tumia umbo chaguo-msingi la mfumo" - - - - - - - - + "Mraba" + "Mstatili wenye pembe duara" + "Mduara" + "Umbo la chozi" "Yasiyojulikana" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 15fb1106a5..eca34ce9c4 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -84,14 +84,10 @@ "அமைப்பின் இயல்புநிலையைப் பயன்படுத்து" - - - - - - - - + "சதுரம்" + "சதுரவட்டம்" + "வட்டம்" + "கண்ணீர்துளி" "தெரியாதது" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 05c4788f40..e79512e23b 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -83,14 +83,10 @@ "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" "సిస్టమ్ డిఫాల్ట్‌ను ఉపయోగించండి" - - - - - - - - + "చతురస్రం" + "చతురస్రాకార వృత్తం" + "వృత్తం" + "కన్నీటి చుక్క" "చిహ్న ఆకార మార్పులను వర్తింపజేస్తోంది" "తెలియదు" "తీసివేయి" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 1f5c7c87c0..2adf4b996c 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -84,14 +84,10 @@ "ใช้ค่าเริ่มต้นของระบบ" - - - - - - - - + "สี่เหลี่ยมจัตุรัส" + "สี่เหลี่ยมขอบมน" + "วงกลม" + "หยดน้ำตา" "ไม่รู้จัก" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index ff92183d20..4390a3a384 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -84,14 +84,10 @@ "Gamitin ang default ng system" - - - - - - - - + "Parisukat" + "Squircle" + "Bilog" + "Teardrop" "Hindi kilala" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index ff28712655..cb03f5184d 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -84,14 +84,10 @@ "Sistem varsayılanını kullan" - - - - - - - - + "Kare" + "Kare-daire" + "Daire" + "Gözyaşı damlası" "Bilinmiyor" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index c904d414df..70a742fe7e 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -84,14 +84,10 @@ "Використовувати налаштування системи за умовчанням" - - - - - - - - + "Квадрат" + "Квадрат із заокругленими кутами" + "Круг" + "Сльоза" "Невідомо" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 31ac66f514..0a747e6a33 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -83,14 +83,10 @@ "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" "سسٹم ڈیفالٹ کا استعمال کریں" - - - - - - - - + "مربع" + "اسکورکل" + "حلقہ" + "آنسو کا قطرہ" "آئيکن کی شکل کی تبدیلیاں لاگو ہو رہی ہیں" "نامعلوم" "ہٹائیں" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 716eedde23..d11a60d9bf 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -84,14 +84,10 @@ "Standart tizim parametrlaridan foydalanish" - - - - - - - - + "Kvadrat" + "Qirralari aylana kvadrat" + "Aylana" + "Tomchi" "Noma’lum" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 580a4dda79..bd7fc450f3 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -84,14 +84,10 @@ "Sử dụng mặc định của hệ thống" - - - - - - - - + "Hình vuông" + "Hình vuông cạnh bo tròn" + "Hình tròn" + "Hình giọt nước" "Không xác định" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 0a43a9175d..3ac74fd109 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -84,14 +84,10 @@ "使用系统默认设置" - - - - - - - - + "方形" + "方圆形" + "圆形" + "泪珠形" "未知" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index ae66324aa0..97cee9724c 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -84,14 +84,10 @@ "使用系統預設設定" - - - - - - - - + "正方形" + "方圓形" + "圓形" + "淚珠形" "不明" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 02f63504ef..6a75cce105 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -84,14 +84,10 @@ "使用系統預設值" - - - - - - - - + "正方形" + "方圓形" + "圓形" + "淚珠形" "不明" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index bdb46a359e..56d9985fba 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -84,14 +84,10 @@ "Sebenzisa okuzenzakalelayo kwesistimu" - - - - - - - - + "Isikwele" + "I-Squircle" + "Indingiliza" + "I-Teardrop" "Akwaziwa" From 9d7f2b9e0d2b40414951f3dba461c6cabc9c7cbf Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 5 Jun 2017 14:25:58 -0700 Subject: [PATCH 128/446] Decrease jank in all apps physics. By creating the spring in onCreateViewHolder and adding in onBindViewHolder, we are able to take advantage of RecyclerView's prefetching optimizations. Bug: 38349031 Change-Id: Ie445039fd90ca92ae4ce1ff71c57b15f662377a8 --- .../launcher3/allapps/AllAppsGridAdapter.java | 48 ++++++++++++------- .../anim/SpringAnimationHandler.java | 2 +- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java index d3d23ca249..83c1370140 100644 --- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java +++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java @@ -102,7 +102,12 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter Date: Mon, 5 Jun 2017 17:54:45 -0700 Subject: [PATCH 129/446] Fix visibility of notification footer divider Now it is only visible when the notification footer is present, instead of always being visible. Change-Id: Ie85ff31918901115cdfe55b36e75aa80b43e7b13 --- res/layout/notification.xml | 3 ++- .../launcher3/notification/NotificationFooterLayout.java | 1 + src/com/android/launcher3/popup/PopupContainerWithArrow.java | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/res/layout/notification.xml b/res/layout/notification.xml index a03dd0833d..a183c92f7a 100644 --- a/res/layout/notification.xml +++ b/res/layout/notification.xml @@ -66,7 +66,8 @@ android:layout_width="match_parent" android:layout_height="@dimen/popup_item_divider_height" android:background="?android:attr/listDivider" - android:layout_below="@id/main_view"/> + android:layout_below="@id/main_view" + android:visibility="gone" /> Date: Mon, 5 Jun 2017 14:58:38 -0700 Subject: [PATCH 130/446] Improved color extraction algorithm Change-Id: I31fdd2a5bc8598dbc8ea5363c995b29057f45997 --- .../dynamicui/ColorExtractionAlgorithm.java | 535 ++++++++++++++++-- 1 file changed, 490 insertions(+), 45 deletions(-) diff --git a/src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java b/src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java index 5a0e78b12d..21d5b27447 100644 --- a/src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java +++ b/src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java @@ -23,6 +23,7 @@ import android.support.annotation.Nullable; import android.support.v4.graphics.ColorUtils; import android.util.Log; import android.util.Pair; +import android.util.Range; import android.util.SparseIntArray; import com.android.launcher3.R; @@ -51,16 +52,18 @@ public class ColorExtractionAlgorithm { private static final float FIT_WEIGHT_S = 1.0f; private static final float FIT_WEIGHT_L = 10.0f; + // When extracting the main color, only consider colors + // present in at least MIN_COLOR_OCCURRENCE of the image private static final float MIN_COLOR_OCCURRENCE = 0.1f; - private static final float MIN_LUMINOSITY = 0.5f; - public ColorExtractionAlgorithm() { - } + // Temporary variable to avoid allocations + private final float[] mTmpHSL = new float[3]; public @Nullable Pair extractInto(WallpaperColorsCompat wallpaperColors) { if (wallpaperColors == null) { return null; } + SparseIntArray colorsArray = wallpaperColors.getColors(); if (colorsArray.size() == 0) { return null; @@ -71,13 +74,12 @@ public class ColorExtractionAlgorithm { // and replaces the original palette List> colors = new ArrayList<>(colorsArray.size()); - for (int i = colorsArray.size() - 1; i >= 0; i --) { + for (int i = colorsArray.size() - 1; i >= 0; i--) { colors.add(Pair.create(colorsArray.keyAt(i), colorsArray.valueAt(i))); } // First find the most representative color in the image populationSort(colors); - // Calculate total int total = 0; for (Pair weightedColor : colors) { @@ -96,53 +98,80 @@ public class ColorExtractionAlgorithm { int colorValue = weightedColor.first; ColorUtils.RGBToHSL(Color.red(colorValue), Color.green(colorValue), Color.blue(colorValue), hsl); - if (hsl[2] > MIN_LUMINOSITY) { + + // Stop when we find a color that meets our criteria + if (!isBlacklisted(hsl)) { bestColor = weightedColor; + break; } } - // Fallback to first color + // Fail if not found if (bestColor == null) { - bestColor = colors.get(0); + return null; } int colorValue = bestColor.first; ColorUtils.RGBToHSL(Color.red(colorValue), Color.green(colorValue), Color.blue(colorValue), hsl); - hsl[0] /= 360.0f; // normalize - // TODO, we're finding a tonal palette for a hue, not all components + // The Android HSL definition requires the hue to go from 0 to 360 but + // the Material Tonal Palette defines hues from 0 to 1. + hsl[0] /= 360f; + + // Find the palette that contains the closest color TonalPalette palette = findTonalPalette(hsl[0]); - // Fall back to population sort if we couldn't find a tonal palette if (palette == null) { Log.w(TAG, "Could not find a tonal palette!"); return null; } + // Figure out what's the main color index in the optimal palette int fitIndex = bestFit(palette, hsl[0], hsl[1], hsl[2]); if (fitIndex == -1) { Log.w(TAG, "Could not find best fit!"); return null; } + + // Generate the 10 colors palette by offsetting each one of them float[] h = fit(palette.h, hsl[0], fitIndex, Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY); float[] s = fit(palette.s, hsl[1], fitIndex, 0.0f, 1.0f); float[] l = fit(palette.l, hsl[2], fitIndex, 0.0f, 1.0f); + final int textInversionIndex = h.length - 3; - hsl[0] = fract(h[0]) * 360.0f; - hsl[1] = s[0]; - hsl[2] = l[0]; - int mainColor = ColorUtils.HSLToColor(hsl); + // best fit + a 2 colors offset + int primaryIndex = fitIndex; + int secondaryIndex = primaryIndex + (primaryIndex >= 2 ? -2 : 2); + int mainColor = getColorInt(primaryIndex, h, s, l); + int secondaryColor = getColorInt(secondaryIndex, h, s, l); - hsl[0] = fract(h[1]) * 360.0f; - hsl[1] = s[1]; - hsl[2] = l[1]; - int secondaryColor = ColorUtils.HSLToColor(hsl); return new Pair<>(mainColor, secondaryColor); } + private int getColorInt(int fitIndex, float[] h, float[] s, float[] l) { + mTmpHSL[0] = fract(h[fitIndex]) * 360.0f; + mTmpHSL[1] = s[fitIndex]; + mTmpHSL[2] = l[fitIndex]; + return ColorUtils.HSLToColor(mTmpHSL); + } + + /** + * Checks if a given color exists in the blacklist + * @param hsl float array with 3 components (H 0..360, S 0..1 and L 0..1) + * @return true if color should be avoided + */ + private boolean isBlacklisted(float[] hsl) { + for (ColorRange badRange: BLACKLISTED_COLORS) { + if (badRange.containsColor(hsl[0], hsl[1], hsl[2])) { + return true; + } + } + return false; + } + private static void populationSort(@NonNull List> wallpaperColors) { Collections.sort(wallpaperColors, new Comparator>() { @Override @@ -160,7 +189,7 @@ public class ColorExtractionAlgorithm { * @param index which index to calculate the delta against * @param min minimum accepted value (clamp) * @param max maximum accepted value (clamp) - * @return + * @return new shifted palette */ private static float[] fit(float[] data, float v, int index, float min, float max) { float[] fitData = new float[data.length]; @@ -272,44 +301,460 @@ public class ColorExtractionAlgorithm { // Data definition of Material Design tonal palettes // When the sort type is set to TONAL, these palettes are used to find - // a best fist. Each palette is defined as 10 HSL colors + // a best fit. Each palette is defined as 22 HSL colors private static final TonalPalette[] TONAL_PALETTES = { - // Orange new TonalPalette( - new float[] { 0.028f, 0.042f, 0.053f, 0.061f, 0.078f, 0.1f, 0.111f, 0.111f, 0.111f, 0.111f }, - new float[] { 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f }, - new float[] { 0.5f, 0.53f, 0.54f, 0.55f, 0.535f, 0.52f, 0.5f, 0.63f, 0.75f, 0.85f } + new float[]{0.991f, 0.9833333333333333f, 0f, 0f, 0f, 0.01134380453752181f, + 0.015625000000000003f, 0.024193548387096798f, 0.027397260273972573f, + 0.017543859649122865f}, + new float[]{1f, 1f, 1f, 1f, 0.8434782608695652f, 1f, 1f, 1f, 1f, 1f}, + new float[]{0.2f, 0.27450980392156865f, 0.34901960784313724f, + 0.4235294117647059f, 0.5490196078431373f, 0.6254901960784314f, + 0.6862745098039216f, 0.7568627450980392f, 0.8568627450980393f, + 0.9254901960784314f} ), - // Yellow new TonalPalette( - new float[] { 0.111f, 0.111f, 0.125f, 0.133f, 0.139f, 0.147f, 0.156f, 0.156f, 0.156f, 0.156f }, - new float[] { 1f, 0.942f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f }, - new float[] { 0.43f, 0.484f, 0.535f, 0.555f, 0.57f, 0.575f, 0.595f, 0.715f, 0.78f, 0.885f } + new float[]{0.6385767790262171f, 0.6301169590643275f, 0.6223958333333334f, + 0.6151079136690647f, 0.6065400843881856f, 0.5986964618249534f, + 0.5910746812386157f, 0.5833333333333334f, 0.5748031496062993f, + 0.5582010582010583f}, + new float[]{1f, 1f, 0.9014084507042253f, 0.8128654970760234f, + 0.7979797979797981f, 0.7816593886462883f, 0.778723404255319f, + 1f, 1f, 1f}, + new float[]{0.17450980392156862f, 0.2235294117647059f, 0.2784313725490196f, + 0.3352941176470588f, 0.388235294117647f, 0.44901960784313727f, + 0.5392156862745098f, 0.6509803921568628f, 0.7509803921568627f, + 0.8764705882352941f} ), - // Green new TonalPalette( - new float[] { 0.325f, 0.336f, 0.353f, 0.353f, 0.356f, 0.356f, 0.356f, 0.356f, 0.356f, 0.356f }, - new float[] { 1f, 1f, 0.852f, 0.754f, 0.639f, 0.667f, 0.379f, 0.542f, 1f, 1f }, - new float[] { 0.06f, 0.1f, 0.151f, 0.194f, 0.25f, 0.312f, 0.486f, 0.651f, 0.825f, 0.885f } + new float[]{0.5669934640522876f, 0.5748031496062993f, + 0.5595238095238095f, 0.5473118279569893f, 0.5393258426966292f, + 0.5315955766192734f, 0.524031007751938f, 0.5154711673699016f, + 0.508080808080808f, 0.5f}, + new float[]{1f, 1f, 1f, 1f, 1f, 1f, 0.8847736625514403f, 1f, 1f, 1f}, + new float[]{0.2f, 0.24901960784313726f, 0.27450980392156865f, + 0.30392156862745096f, 0.34901960784313724f, 0.4137254901960784f, + 0.47647058823529415f, 0.5352941176470588f, 0.6764705882352942f, 0.8f} ), - // Blue new TonalPalette( - new float[] { 0.631f, 0.603f, 0.592f, 0.586f, 0.572f, 0.544f, 0.519f, 0.519f, 0.519f, 0.519f }, - new float[] { 0.852f, 1f, 0.887f, 0.852f, 0.871f, 0.907f, 0.949f, 0.934f, 0.903f, 0.815f }, - new float[] { 0.34f, 0.38f, 0.482f, 0.497f, 0.536f, 0.571f, 0.608f, 0.696f, 0.794f, 0.892f } + new float[]{0.5082304526748972f, 0.5069444444444444f, 0.5f, 0.5f, + 0.5f, 0.48724954462659376f, 0.4800347222222222f, + 0.4755134281200632f, 0.4724409448818897f, 0.4671052631578947f}, + new float[]{1f, 0.8888888888888887f, 0.9242424242424242f, 1f, 1f, + 0.8133333333333332f, 0.7868852459016393f, 1f, 1f, 1f}, + new float[]{0.1588235294117647f, 0.21176470588235297f, + 0.25882352941176473f, 0.3f, 0.34901960784313724f, + 0.44117647058823534f, 0.5215686274509804f, 0.5862745098039216f, + 0.7509803921568627f, 0.8509803921568627f} ), - // Purple new TonalPalette( - new float[] { 0.839f, 0.831f, 0.825f, 0.819f, 0.803f, 0.803f, 0.772f, 0.772f, 0.772f, 0.772f }, - new float[] { 1f, 1f, 1f, 1f, 1f, 1f, 0.769f, 0.701f, 0.612f, 0.403f }, - new float[] { 0.125f, 0.15f, 0.2f, 0.245f, 0.31f, 0.36f, 0.567f, 0.666f, 0.743f, 0.833f } + new float[]{0.3333333333333333f, 0.3333333333333333f, + 0.34006734006734f, 0.34006734006734f, 0.34006734006734f, + 0.34259259259259256f, 0.3475783475783476f, 0.34767025089605735f, + 0.3467741935483871f, 0.3703703703703704f}, + new float[]{0.6703296703296703f, 0.728813559322034f, + 0.5657142857142856f, 0.5076923076923077f, 0.3944223107569721f, + 0.6206896551724138f, 0.8931297709923666f, 1f, 1f, 1f}, + new float[]{0.1784313725490196f, 0.23137254901960785f, + 0.3431372549019608f, 0.38235294117647056f, 0.49215686274509807f, + 0.6588235294117647f, 0.7431372549019608f, 0.8176470588235294f, + 0.8784313725490196f, 0.9294117647058824f} ), - // Red new TonalPalette( - new float[] { 0.964f, 0.975f, 0.975f, 0.975f, 0.972f, 0.992f, 1.003f, 1.011f, 1.011f, 1.011f }, - new float[] { 0.869f, 0.802f, 0.739f, 0.903f, 1f, 1f, 1f, 1f, 1f, 1f }, - new float[] { 0.241f, 0.316f, 0.46f, 0.586f, 0.655f, 0.7f, 0.75f, 0.8f, 0.84f, 0.88f } + new float[]{0.162280701754386f, 0.15032679738562088f, + 0.15879265091863518f, 0.16236559139784948f, 0.17443868739205526f, + 0.17824074074074076f, 0.18674698795180725f, + 0.18692449355432778f, 0.1946778711484594f, 0.18604651162790695f}, + new float[]{1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f}, + new float[]{0.14901960784313725f, 0.2f, 0.24901960784313726f, + 0.30392156862745096f, 0.3784313725490196f, 0.4235294117647059f, + 0.48823529411764705f, 0.6450980392156863f, 0.7666666666666666f, + 0.8313725490196078f} + ), + new TonalPalette( + new float[]{0.10619469026548674f, 0.11924686192468618f, + 0.13046448087431692f, 0.14248366013071895f, 0.1506024096385542f, + 0.16220238095238093f, 0.16666666666666666f, + 0.16666666666666666f, 0.162280701754386f, 0.15686274509803924f}, + new float[]{1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f}, + new float[]{0.44313725490196076f, 0.46862745098039216f, + 0.47843137254901963f, 0.5f, 0.5117647058823529f, + 0.5607843137254902f, 0.6509803921568628f, 0.7509803921568627f, + 0.8509803921568627f, 0.9f} + ), + new TonalPalette( + new float[]{0.03561253561253561f, 0.05098039215686275f, + 0.07516339869281045f, 0.09477124183006536f, 0.1150326797385621f, + 0.134640522875817f, 0.14640522875816991f, 0.1582397003745319f, + 0.15773809523809523f, 0.15359477124183002f}, + new float[]{1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f}, + new float[]{0.4588235294117647f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, + 0.5f, 0.6509803921568628f, 0.7803921568627451f, 0.9f} + ), + new TonalPalette( + new float[]{0.9596491228070175f, 0.9593837535014005f, + 0.9514767932489452f, 0.943859649122807f, 0.9396825396825397f, + 0.9395424836601307f, 0.9393939393939394f, 0.9362745098039216f, + 0.9754098360655739f, 0.9824561403508771f}, + new float[]{0.84070796460177f, 0.8206896551724138f, + 0.7979797979797981f, 0.7661290322580644f, 0.9051724137931036f, + 1f, 1f, 1f, 1f, 1f}, + new float[]{0.22156862745098038f, 0.2843137254901961f, + 0.388235294117647f, 0.48627450980392156f, 0.5450980392156863f, + 0.6f, 0.6764705882352942f, 0.8f, 0.8803921568627451f, + 0.9254901960784314f} + ), + new TonalPalette( + new float[]{0.841025641025641f, 0.8333333333333334f, + 0.8285256410256411f, 0.821522309711286f, 0.8083333333333333f, + 0.8046594982078853f, 0.8005822416302766f, 0.7842377260981912f, + 0.7771084337349398f, 0.7747747747747749f}, + new float[]{1f, 1f, 1f, 1f, 1f, 1f, 1f, + 0.737142857142857f, 0.6434108527131781f, 0.46835443037974644f}, + new float[]{0.12745098039215685f, 0.15490196078431373f, + 0.20392156862745098f, 0.24901960784313726f, 0.3137254901960784f, + 0.36470588235294116f, 0.44901960784313727f, + 0.6568627450980392f, 0.7470588235294118f, 0.8450980392156863f} + ), + new TonalPalette( + new float[]{0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}, + new float[]{0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}, + new float[]{0.14901960784313725f, 0.2f, 0.2980392156862745f, 0.4f, + 0.4980392156862745f, 0.6196078431372549f, 0.7176470588235294f, + 0.8196078431372549f, 0.9176470588235294f, 0.9490196078431372f} + ), + new TonalPalette( + new float[]{0.955952380952381f, 0.9681069958847737f, + 0.9760479041916167f, 0.9873563218390804f, 0f, 0f, + 0.009057971014492771f, 0.026748971193415648f, + 0.041666666666666616f, 0.05303030303030304f}, + new float[]{1f, 0.8350515463917526f, 0.6929460580912863f, + 0.6387665198237885f, 0.6914893617021276f, 0.7583892617449666f, + 0.8070175438596495f, 0.9310344827586209f, 1f, 1f}, + new float[]{0.27450980392156865f, 0.3803921568627451f, + 0.4725490196078432f, 0.5549019607843138f, 0.6313725490196078f, + 0.707843137254902f, 0.7764705882352941f, 0.8294117647058823f, + 0.9058823529411765f, 0.9568627450980391f} + ), + new TonalPalette( + new float[]{0.7514619883040936f, 0.7679738562091503f, + 0.7802083333333333f, 0.7844311377245509f, 0.796875f, + 0.8165618448637316f, 0.8487179487179487f, 0.8582375478927203f, + 0.8562091503267975f, 0.8666666666666667f}, + new float[]{1f, 1f, 0.8163265306122449f, 0.6653386454183268f, + 0.7547169811320753f, 0.929824561403509f, 0.9558823529411766f, + 0.9560439560439562f, 1f, 1f}, + new float[]{0.2235294117647059f, 0.3f, 0.38431372549019605f, + 0.492156862745098f, 0.5843137254901961f, 0.6647058823529411f, + 0.7333333333333334f, 0.8215686274509804f, 0.9f, + 0.9411764705882353f} + ), + new TonalPalette( + new float[]{0.6666666666666666f, 0.6666666666666666f, + 0.6666666666666666f, 0.6666666666666666f, 0.6666666666666666f, + 0.6666666666666666f, 0.6666666666666666f, 0.6666666666666666f, + 0.6666666666666666f, 0.6666666666666666f}, + new float[]{0.24590163934426232f, 0.17880794701986752f, + 0.14606741573033713f, 0.13761467889908252f, 0.14893617021276592f, + 0.16756756756756758f, 0.20312500000000017f, + 0.26086956521739135f, 0.29999999999999966f, 0.5000000000000004f}, + new float[]{0.2392156862745098f, 0.296078431372549f, + 0.34901960784313724f, 0.4274509803921569f, 0.5392156862745098f, + 0.6372549019607843f, 0.7490196078431373f, 0.8196078431372549f, + 0.8823529411764706f, 0.9372549019607843f} + ), + new TonalPalette( + new float[]{0.9678571428571429f, 0.9944812362030905f, 0f, 0f, + 0.0047348484848484815f, 0.00316455696202532f, 0f, + 0.9980392156862745f, 0.9814814814814816f, 0.9722222222222221f}, + new float[]{1f, 0.7023255813953488f, 0.6638655462184874f, + 0.6521739130434782f, 0.7719298245614035f, 0.8315789473684211f, + 0.6867469879518071f, 0.7264957264957265f, 0.8181818181818182f, + 0.8181818181818189f}, + new float[]{0.27450980392156865f, 0.4215686274509804f, + 0.4666666666666667f, 0.503921568627451f, 0.5529411764705883f, + 0.6274509803921569f, 0.6745098039215687f, 0.7705882352941176f, + 0.892156862745098f, 0.9568627450980391f} + ), + new TonalPalette( + new float[]{0.9052287581699346f, 0.9112021857923498f, 0.9270152505446624f, + 0.9343137254901961f, 0.9391534391534391f, 0.9437984496124031f, + 0.943661971830986f, 0.9438943894389439f, 0.9426229508196722f, + 0.9444444444444444f}, + new float[]{1f, 0.8133333333333332f, 0.7927461139896375f, 0.7798165137614679f, + 0.7777777777777779f, 0.8190476190476191f, 0.8255813953488372f, + 0.8211382113821142f, 0.8133333333333336f, 0.8000000000000006f}, + new float[]{0.2f, 0.29411764705882354f, 0.3784313725490196f, + 0.42745098039215684f, 0.4764705882352941f, 0.5882352941176471f, + 0.6627450980392157f, 0.7588235294117647f, 0.8529411764705882f, + 0.9411764705882353f} + ), + new TonalPalette( + new float[]{0.6884057971014492f, 0.6974789915966387f, 0.7079889807162534f, + 0.7154471544715447f, 0.7217741935483872f, 0.7274143302180687f, + 0.7272727272727273f, 0.7258064516129031f, 0.7252252252252251f, + 0.7333333333333333f}, + new float[]{0.8214285714285715f, 0.6878612716763006f, 0.6080402010050251f, + 0.5774647887323943f, 0.5391304347826086f, 0.46724890829694316f, + 0.4680851063829788f, 0.462686567164179f, 0.45679012345678977f, + 0.4545454545454551f}, + new float[]{0.2196078431372549f, 0.33921568627450976f, 0.39019607843137255f, + 0.4176470588235294f, 0.45098039215686275f, + 0.5509803921568628f, 0.6313725490196078f, 0.7372549019607844f, + 0.8411764705882353f, 0.9352941176470588f} + ), + new TonalPalette( + new float[]{0.6470588235294118f, 0.6516666666666667f, 0.6464174454828661f, + 0.6441441441441442f, 0.6432748538011696f, 0.6416666666666667f, + 0.6402439024390243f, 0.6412429378531074f, 0.6435185185185186f, + 0.6428571428571429f}, + new float[]{0.8095238095238095f, 0.6578947368421053f, 0.5721925133689839f, + 0.5362318840579711f, 0.5f, 0.4424778761061947f, 0.44086021505376327f, + 0.44360902255639095f, + 0.4499999999999997f, 0.4375000000000006f}, + new float[]{0.16470588235294117f, 0.2980392156862745f, 0.36666666666666664f, + 0.40588235294117647f, 0.44705882352941173f, + 0.5568627450980392f, 0.6352941176470588f, 0.7392156862745098f, + 0.8431372549019608f, 0.9372549019607843f} + ), + new TonalPalette( + new float[]{0.46732026143790845f, 0.4718614718614719f, 0.4793650793650794f, + 0.48071625344352614f, 0.4829683698296837f, 0.484375f, + 0.4841269841269842f, 0.48444444444444457f, 0.48518518518518516f, + 0.4907407407407408f}, + new float[]{1f, 1f, 1f, 1f, 1f, 0.6274509803921569f, 0.41832669322709176f, + 0.41899441340782106f, 0.4128440366972478f, + 0.4090909090909088f}, + new float[]{0.1f, 0.15098039215686274f, 0.20588235294117646f, + 0.2372549019607843f, 0.26862745098039215f, 0.4f, 0.5078431372549019f, + 0.6490196078431372f, 0.7862745098039216f, 0.9137254901960784f} + ), + new TonalPalette( + new float[]{0.5444444444444444f, 0.5555555555555556f, 0.5555555555555556f, + 0.553763440860215f, 0.5526315789473684f, 0.5555555555555556f, + 0.5555555555555555f, 0.5555555555555556f, 0.5512820512820514f, + 0.5666666666666667f}, + new float[]{0.24590163934426232f, 0.19148936170212766f, 0.1791044776119403f, + 0.18343195266272191f, 0.18446601941747576f, + 0.1538461538461539f, 0.15625000000000003f, 0.15328467153284678f, + 0.15662650602409653f, 0.151515151515151f}, + new float[]{0.1196078431372549f, 0.1843137254901961f, 0.2627450980392157f, + 0.33137254901960783f, 0.403921568627451f, 0.5411764705882354f, + 0.6235294117647059f, 0.7313725490196079f, 0.8372549019607843f, + 0.9352941176470588f} + ), + new TonalPalette( + new float[]{0.022222222222222223f, 0.02469135802469136f, 0.031249999999999997f, + 0.03947368421052631f, 0.04166666666666668f, + 0.043650793650793655f, 0.04411764705882352f, 0.04166666666666652f, + 0.04444444444444459f, 0.05555555555555529f}, + new float[]{0.33333333333333337f, 0.2783505154639175f, 0.2580645161290323f, + 0.25675675675675674f, 0.2528735632183908f, 0.17500000000000002f, + 0.15315315315315312f, 0.15189873417721522f, + 0.15789473684210534f, 0.15789473684210542f}, + new float[]{0.08823529411764705f, 0.19019607843137254f, 0.2431372549019608f, + 0.2901960784313725f, 0.3411764705882353f, 0.47058823529411764f, + 0.5647058823529412f, 0.6901960784313725f, 0.8137254901960784f, + 0.9254901960784314f} + ), + new TonalPalette( + new float[]{0.050884955752212385f, 0.07254901960784313f, 0.0934640522875817f, + 0.10457516339869281f, 0.11699346405228758f, + 0.1255813953488372f, 0.1268939393939394f, 0.12533333333333332f, + 0.12500000000000003f, 0.12777777777777777f}, + new float[]{1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f}, + new float[]{0.44313725490196076f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5784313725490196f, + 0.6549019607843137f, 0.7549019607843137f, 0.8509803921568627f, + 0.9411764705882353f} ) }; + @SuppressWarnings("WeakerAccess") + static final ColorRange[] BLACKLISTED_COLORS = new ColorRange[] { + + // Red + new ColorRange( + new Range<>(0f, 20f) /* H */, + new Range<>(0.7f, 1f) /* S */, + new Range<>(0.21f, 0.79f)) /* L */, + new ColorRange( + new Range<>(0f, 20f), + new Range<>(0.3f, 0.7f), + new Range<>(0.355f, 0.653f)), + + // Red Orange + new ColorRange( + new Range<>(20f, 40f), + new Range<>(0.7f, 1f), + new Range<>(0.28f, 0.643f)), + new ColorRange( + new Range<>(20f, 40f), + new Range<>(0.3f, 0.7f), + new Range<>(0.414f, 0.561f)), + new ColorRange( + new Range<>(20f, 40f), + new Range<>(0f, 3f), + new Range<>(0.343f, 0.584f)), + + // Orange + new ColorRange( + new Range<>(40f, 60f), + new Range<>(0.7f, 1f), + new Range<>(0.173f, 0.349f)), + new ColorRange( + new Range<>(40f, 60f), + new Range<>(0.3f, 0.7f), + new Range<>(0.233f, 0.427f)), + new ColorRange( + new Range<>(40f, 60f), + new Range<>(0f, 0.3f), + new Range<>(0.231f, 0.484f)), + + // Yellow 60 + new ColorRange( + new Range<>(60f, 80f), + new Range<>(0.7f, 1f), + new Range<>(0.488f, 0.737f)), + new ColorRange( + new Range<>(60f, 80f), + new Range<>(0.3f, 0.7f), + new Range<>(0.673f, 0.837f)), + + // Yellow Green 80 + new ColorRange( + new Range<>(80f, 100f), + new Range<>(0.7f, 1f), + new Range<>(0.469f, 0.61f)), + + // Yellow green 100 + new ColorRange( + new Range<>(100f, 120f), + new Range<>(0.7f, 1f), + new Range<>(0.388f, 0.612f)), + new ColorRange( + new Range<>(100f, 120f), + new Range<>(0.3f, 0.7f), + new Range<>(0.424f, 0.541f)), + + // Green + new ColorRange( + new Range<>(120f, 140f), + new Range<>(0.7f, 1f), + new Range<>(0.375f, 0.52f)), + new ColorRange( + new Range<>(120f, 140f), + new Range<>(0.3f, 0.7f), + new Range<>(0.435f, 0.524f)), + + // Green Blue 140 + new ColorRange( + new Range<>(140f, 160f), + new Range<>(0.7f, 1f), + new Range<>(0.496f, 0.641f)), + + // Seafoam + new ColorRange( + new Range<>(160f, 180f), + new Range<>(0.7f, 1f), + new Range<>(0.496f, 0.567f)), + + // Cyan + new ColorRange( + new Range<>(180f, 200f), + new Range<>(0.7f, 1f), + new Range<>(0.52f, 0.729f)), + + // Blue + new ColorRange( + new Range<>(220f, 240f), + new Range<>(0.7f, 1f), + new Range<>(0.396f, 0.571f)), + new ColorRange( + new Range<>(220f, 240f), + new Range<>(0.3f, 0.7f), + new Range<>(0.425f, 0.551f)), + + // Blue Purple 240 + new ColorRange( + new Range<>(240f, 260f), + new Range<>(0.7f, 1f), + new Range<>(0.418f, 0.639f)), + new ColorRange( + new Range<>(220f, 240f), + new Range<>(0.3f, 0.7f), + new Range<>(0.441f, 0.576f)), + + // Blue Purple 260 + new ColorRange( + new Range<>(260f, 280f), + new Range<>(0.3f, 1f), // Bigger range + new Range<>(0.461f, 0.553f)), + + // Fuchsia + new ColorRange( + new Range<>(300f, 320f), + new Range<>(0.7f, 1f), + new Range<>(0.484f, 0.588f)), + new ColorRange( + new Range<>(300f, 320f), + new Range<>(0.3f, 0.7f), + new Range<>(0.48f, 0.592f)), + + // Pink + new ColorRange( + new Range<>(320f, 340f), + new Range<>(0.7f, 1f), + new Range<>(0.466f, 0.629f)), + + // Soft red + new ColorRange( + new Range<>(340f, 360f), + new Range<>(0.7f, 1f), + new Range<>(0.437f, 0.596f)) + }; + + /** + * Representation of an HSL color range. + *
    + *
  • hsl[0] is Hue [0 .. 360)
  • + *
  • hsl[1] is Saturation [0...1]
  • + *
  • hsl[2] is Lightness [0...1]
  • + *
+ */ + static class ColorRange { + private Range mHue; + private Range mSaturation; + private Range mLightness; + + ColorRange(Range hue, Range saturation, Range lightness) { + mHue = hue; + mSaturation = saturation; + mLightness = lightness; + } + + boolean containsColor(float h, float s, float l) { + if (!mHue.contains(h)) { + return false; + } else if (!mSaturation.contains(s)) { + return false; + } else if (!mLightness.contains(l)) { + return false; + } + return true; + } + + float[] getCenter() { + return new float[] { + mHue.getLower() + (mHue.getUpper() - mHue.getLower()) / 2f, + mSaturation.getLower() + (mSaturation.getUpper() - mSaturation.getLower()) / 2f, + mLightness.getLower() + (mLightness.getUpper() - mLightness.getLower()) / 2f + }; + } + + @Override + public String toString() { + return String.format("H: %s, S: %s, L %s", mHue, mSaturation, mLightness); + } + } + } From b434fde42702000cfb8eacfdfc85c2f759be0a75 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 6 Jun 2017 10:46:59 -0700 Subject: [PATCH 131/446] Moving LoaderTask to a separate class file Bug: 34112546 Change-Id: I86d93cfb5d3903bfd3878564cbe8b67b64fd8423 --- .../launcher3/AppWidgetsRestoredReceiver.java | 3 +- src/com/android/launcher3/LauncherModel.java | 794 +---------------- .../android/launcher3/model/LoaderTask.java | 839 ++++++++++++++++++ 3 files changed, 846 insertions(+), 790 deletions(-) create mode 100644 src/com/android/launcher3/model/LoaderTask.java diff --git a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java index 84a8bce6e6..70be7dae45 100644 --- a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java +++ b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java @@ -12,6 +12,7 @@ import android.os.Handler; import android.util.Log; import com.android.launcher3.LauncherSettings.Favorites; +import com.android.launcher3.model.LoaderTask; import com.android.launcher3.util.ContentWriter; public class AppWidgetsRestoredReceiver extends BroadcastReceiver { @@ -52,7 +53,7 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { final AppWidgetProviderInfo provider = widgets.getAppWidgetInfo(newWidgetIds[i]); final int state; - if (LauncherModel.isValidProvider(provider)) { + if (LoaderTask.isValidProvider(provider)) { // This will ensure that we show 'Click to setup' UI if required. state = LauncherAppWidgetInfo.FLAG_UI_NOT_READY; } else { diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 265c7e33ad..48c5c562c3 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -16,7 +16,6 @@ package com.android.launcher3; -import android.appwidget.AppWidgetProviderInfo; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentProviderOperation; @@ -24,61 +23,40 @@ import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.LauncherActivityInfo; -import android.content.pm.PackageInstaller; import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Process; -import android.os.SystemClock; -import android.os.Trace; import android.os.UserHandle; import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.Log; -import android.util.LongSparseArray; -import android.util.MutableInt; import android.util.Pair; -import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo; import com.android.launcher3.compat.UserManagerCompat; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dynamicui.ExtractionUtils; -import com.android.launcher3.folder.Folder; -import com.android.launcher3.folder.FolderIcon; -import com.android.launcher3.folder.FolderIconPreviewVerifier; import com.android.launcher3.graphics.LauncherIcons; -import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.AddWorkspaceItemsTask; import com.android.launcher3.model.BgDataModel; import com.android.launcher3.model.CacheDataUpdatedTask; import com.android.launcher3.model.ExtendedModelTask; -import com.android.launcher3.model.GridSizeMigrationTask; -import com.android.launcher3.model.LoaderCursor; import com.android.launcher3.model.LoaderResults; +import com.android.launcher3.model.LoaderTask; import com.android.launcher3.model.ModelWriter; import com.android.launcher3.model.PackageInstallStateChangedTask; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.model.PackageUpdatedTask; -import com.android.launcher3.model.SdCardAvailableReceiver; import com.android.launcher3.model.ShortcutsChangedTask; import com.android.launcher3.model.UserLockStateChangedTask; import com.android.launcher3.model.WidgetItem; -import com.android.launcher3.provider.ImportDataTask; import com.android.launcher3.provider.LauncherDbUtils; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; -import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.util.ComponentKey; -import com.android.launcher3.util.LooperIdleLock; -import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.util.MultiHashMap; -import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Provider; @@ -89,12 +67,9 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.concurrent.CancellationException; import java.util.concurrent.Executor; @@ -105,7 +80,7 @@ import java.util.concurrent.Executor; */ public class LauncherModel extends BroadcastReceiver implements LauncherAppsCompat.OnAppsChangedCallbackCompat { - static final boolean DEBUG_LOADERS = false; + static final boolean DEBUG_TASKS = false; private static final boolean DEBUG_RECEIVER = false; static final String TAG = "Launcher.Model"; @@ -113,7 +88,8 @@ public class LauncherModel extends BroadcastReceiver private final MainThreadExecutor mUiExecutor = new MainThreadExecutor(); @Thunk final LauncherAppState mApp; @Thunk final Object mLock = new Object(); - @Thunk LoaderTask mLoaderTask; + @Thunk + LoaderTask mLoaderTask; @Thunk boolean mIsLoaderTaskRunning; @Thunk static final HandlerThread sWorkerThread = new HandlerThread("launcher-loader"); @@ -609,761 +585,6 @@ public class LauncherModel extends BroadcastReceiver return new LoaderTransaction(task); } - /** - * Runnable for the thread that loads the contents of the launcher: - * - workspace icons - * - widgets - * - all apps icons - * - deep shortcuts within apps - */ - private static class LoaderTask implements Runnable { - private final LauncherAppState mApp; - private final AllAppsList mBgAllAppsList; - private final BgDataModel mBgDataModel; - - private final LoaderResults mResults; - - private final LauncherAppsCompat mLauncherApps; - private final UserManagerCompat mUserManager; - private final DeepShortcutManager mShortcutManager; - private final PackageInstallerCompat mPackageInstaller; - private final AppWidgetManagerCompat mAppWidgetManager; - private final IconCache mIconCache; - - private boolean mStopped; - - LoaderTask(LauncherAppState app, AllAppsList bgAllAppsList, BgDataModel dataModel, - LoaderResults results) { - mApp = app; - mBgAllAppsList = bgAllAppsList; - mBgDataModel = dataModel; - mResults = results; - - mLauncherApps = LauncherAppsCompat.getInstance(mApp.getContext()); - mUserManager = UserManagerCompat.getInstance(mApp.getContext()); - mShortcutManager = DeepShortcutManager.getInstance(mApp.getContext()); - mPackageInstaller = PackageInstallerCompat.getInstance(mApp.getContext()); - mAppWidgetManager = AppWidgetManagerCompat.getInstance(mApp.getContext()); - mIconCache = mApp.getIconCache(); - } - - private synchronized void waitForIdle() { - // Wait until the either we're stopped or the other threads are done. - // This way we don't start loading all apps until the workspace has settled - // down. - LooperIdleLock idleLock = new LooperIdleLock(this, Looper.getMainLooper()); - // Just in case mFlushingWorkerThread changes but we aren't woken up, - // wait no longer than 1sec at a time - while (!mStopped && idleLock.awaitLocked(1000)); - } - - private synchronized void verifyNotStopped() throws CancellationException { - if (mStopped) { - throw new CancellationException("Loader stopped"); - } - } - - public void run() { - synchronized (this) { - // Skip fast if we are already stopped. - if (mStopped) { - return; - } - } - - try (LoaderTransaction transaction = mApp.getModel().beginLoader(this)) { - long now = 0; - if (DEBUG_LOADERS) Log.d(TAG, "step 1.1: loading workspace"); - loadWorkspace(); - - verifyNotStopped(); - if (DEBUG_LOADERS) Log.d(TAG, "step 1.2: bind workspace workspace"); - mResults.bindWorkspace(); - - // Take a break - if (DEBUG_LOADERS) { - Log.d(TAG, "step 1 completed, wait for idle"); - now = SystemClock.uptimeMillis(); - } - waitForIdle(); - if (DEBUG_LOADERS) Log.d(TAG, "Waited " + (SystemClock.uptimeMillis() - now) + "ms"); - verifyNotStopped(); - - // second step - if (DEBUG_LOADERS) Log.d(TAG, "step 2.1: loading all apps"); - loadAllApps(); - - if (DEBUG_LOADERS) Log.d(TAG, "step 2.2: Binding all apps"); - verifyNotStopped(); - mResults.bindAllApps(); - - verifyNotStopped(); - if (DEBUG_LOADERS) Log.d(TAG, "step 2.3: Update icon cache"); - updateIconCache(); - - // Take a break - if (DEBUG_LOADERS) { - Log.d(TAG, "step 2 completed, wait for idle"); - now = SystemClock.uptimeMillis(); - } - waitForIdle(); - if (DEBUG_LOADERS) Log.d(TAG, "Waited " + (SystemClock.uptimeMillis() - now) + "ms"); - verifyNotStopped(); - - // third step - if (DEBUG_LOADERS) Log.d(TAG, "step 3.1: loading deep shortcuts"); - loadDeepShortcuts(); - - verifyNotStopped(); - if (DEBUG_LOADERS) Log.d(TAG, "step 3.2: bind deep shortcuts"); - mResults.bindDeepShortcuts(); - - // Take a break - if (DEBUG_LOADERS) Log.d(TAG, "step 3 completed, wait for idle"); - waitForIdle(); - verifyNotStopped(); - - // fourth step - if (DEBUG_LOADERS) Log.d(TAG, "step 4.1: loading widgets"); - mBgDataModel.widgetsModel.update(mApp, null); - - verifyNotStopped(); - if (DEBUG_LOADERS) Log.d(TAG, "step 4.2: Binding widgets"); - mResults.bindWidgets(); - - transaction.commit(); - } catch (CancellationException e) { - // Loader stopped, ignore - } - } - - public synchronized void stopLocked() { - mStopped = true; - this.notify(); - } - - private void loadWorkspace() { - if (LauncherAppState.PROFILE_STARTUP) { - Trace.beginSection("Loading Workspace"); - } - - final Context context = mApp.getContext(); - final ContentResolver contentResolver = context.getContentResolver(); - final PackageManagerHelper pmHelper = new PackageManagerHelper(context); - final boolean isSafeMode = pmHelper.isSafeMode(); - final boolean isSdCardReady = Utilities.isBootCompleted(); - final MultiHashMap pendingPackages = new MultiHashMap<>(); - - boolean clearDb = false; - try { - ImportDataTask.performImportIfPossible(context); - } catch (Exception e) { - // Migration failed. Clear workspace. - clearDb = true; - } - - if (!clearDb && GridSizeMigrationTask.ENABLED && - !GridSizeMigrationTask.migrateGridIfNeeded(context)) { - // Migration failed. Clear workspace. - clearDb = true; - } - - if (clearDb) { - Log.d(TAG, "loadWorkspace: resetting launcher database"); - LauncherSettings.Settings.call(contentResolver, - LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB); - } - - Log.d(TAG, "loadWorkspace: loading default favorites"); - LauncherSettings.Settings.call(contentResolver, - LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES); - - synchronized (mBgDataModel) { - mBgDataModel.clear(); - - final HashMap installingPkgs = - mPackageInstaller.updateAndGetActiveSessionCache(); - mBgDataModel.workspaceScreens.addAll(loadWorkspaceScreensDb(context)); - - Map shortcutKeyToPinnedShortcuts = new HashMap<>(); - final LoaderCursor c = new LoaderCursor(contentResolver.query( - LauncherSettings.Favorites.CONTENT_URI, null, null, null, null), mApp); - - HashMap widgetProvidersMap = null; - - try { - final int appWidgetIdIndex = c.getColumnIndexOrThrow( - LauncherSettings.Favorites.APPWIDGET_ID); - final int appWidgetProviderIndex = c.getColumnIndexOrThrow( - LauncherSettings.Favorites.APPWIDGET_PROVIDER); - final int spanXIndex = c.getColumnIndexOrThrow - (LauncherSettings.Favorites.SPANX); - final int spanYIndex = c.getColumnIndexOrThrow( - LauncherSettings.Favorites.SPANY); - final int rankIndex = c.getColumnIndexOrThrow( - LauncherSettings.Favorites.RANK); - final int optionsIndex = c.getColumnIndexOrThrow( - LauncherSettings.Favorites.OPTIONS); - - final LongSparseArray allUsers = c.allUsers; - final LongSparseArray quietMode = new LongSparseArray<>(); - final LongSparseArray unlockedUsers = new LongSparseArray<>(); - for (UserHandle user : mUserManager.getUserProfiles()) { - long serialNo = mUserManager.getSerialNumberForUser(user); - allUsers.put(serialNo, user); - quietMode.put(serialNo, mUserManager.isQuietModeEnabled(user)); - - boolean userUnlocked = mUserManager.isUserUnlocked(user); - - // We can only query for shortcuts when the user is unlocked. - if (userUnlocked) { - List pinnedShortcuts = - mShortcutManager.queryForPinnedShortcuts(null, user); - if (mShortcutManager.wasLastCallSuccess()) { - for (ShortcutInfoCompat shortcut : pinnedShortcuts) { - shortcutKeyToPinnedShortcuts.put(ShortcutKey.fromInfo(shortcut), - shortcut); - } - } else { - // Shortcut manager can fail due to some race condition when the - // lock state changes too frequently. For the purpose of the loading - // shortcuts, consider the user is still locked. - userUnlocked = false; - } - } - unlockedUsers.put(serialNo, userUnlocked); - } - - ShortcutInfo info; - LauncherAppWidgetInfo appWidgetInfo; - Intent intent; - String targetPkg; - - FolderIconPreviewVerifier verifier = - new FolderIconPreviewVerifier(mApp.getInvariantDeviceProfile()); - while (!mStopped && c.moveToNext()) { - try { - if (c.user == null) { - // User has been deleted, remove the item. - c.markDeleted("User has been deleted"); - continue; - } - - boolean allowMissingTarget = false; - switch (c.itemType) { - case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: - case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: - case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: - intent = c.parseIntent(); - if (intent == null) { - c.markDeleted("Invalid or null intent"); - continue; - } - - int disabledState = quietMode.get(c.serialNumber) ? - ShortcutInfo.FLAG_DISABLED_QUIET_USER : 0; - ComponentName cn = intent.getComponent(); - targetPkg = cn == null ? intent.getPackage() : cn.getPackageName(); - - if (!Process.myUserHandle().equals(c.user)) { - if (c.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) { - c.markDeleted("Legacy shortcuts are only allowed for default user"); - continue; - } else if (c.restoreFlag != 0) { - // Don't restore items for other profiles. - c.markDeleted("Restore from managed profile not supported"); - continue; - } - } - if (TextUtils.isEmpty(targetPkg) && - c.itemType != LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) { - c.markDeleted("Only legacy shortcuts can have null package"); - continue; - } - - // If there is no target package, its an implicit intent - // (legacy shortcut) which is always valid - boolean validTarget = TextUtils.isEmpty(targetPkg) || - mLauncherApps.isPackageEnabledForProfile(targetPkg, c.user); - - if (cn != null && validTarget) { - // If the apk is present and the shortcut points to a specific - // component. - - // If the component is already present - if (mLauncherApps.isActivityEnabledForProfile(cn, c.user)) { - // no special handling necessary for this item - c.markRestored(); - } else { - if (c.hasRestoreFlag(ShortcutInfo.FLAG_AUTOINSTALL_ICON)) { - // We allow auto install apps to have their intent - // updated after an install. - intent = pmHelper.getAppLaunchIntent(targetPkg, c.user); - if (intent != null) { - c.restoreFlag = 0; - c.updater().put( - LauncherSettings.Favorites.INTENT, - intent.toUri(0)).commit(); - cn = intent.getComponent(); - } else { - c.markDeleted("Unable to find a launch target"); - continue; - } - } else { - // The app is installed but the component is no - // longer available. - c.markDeleted("Invalid component removed: " + cn); - continue; - } - } - } - // else if cn == null => can't infer much, leave it - // else if !validPkg => could be restored icon or missing sd-card - - if (!TextUtils.isEmpty(targetPkg) && !validTarget) { - // Points to a valid app (superset of cn != null) but the apk - // is not available. - - if (c.restoreFlag != 0) { - // Package is not yet available but might be - // installed later. - FileLog.d(TAG, "package not yet restored: " + targetPkg); - - if (c.hasRestoreFlag(ShortcutInfo.FLAG_RESTORE_STARTED)) { - // Restore has started once. - } else if (installingPkgs.containsKey(targetPkg)) { - // App restore has started. Update the flag - c.restoreFlag |= ShortcutInfo.FLAG_RESTORE_STARTED; - c.updater().commit(); - } else { - c.markDeleted("Unrestored app removed: " + targetPkg); - continue; - } - } else if (pmHelper.isAppOnSdcard(targetPkg, c.user)) { - // Package is present but not available. - disabledState |= ShortcutInfo.FLAG_DISABLED_NOT_AVAILABLE; - // Add the icon on the workspace anyway. - allowMissingTarget = true; - } else if (!isSdCardReady) { - // SdCard is not ready yet. Package might get available, - // once it is ready. - Log.d(TAG, "Missing pkg, will check later: " + targetPkg); - pendingPackages.addToList(c.user, targetPkg); - // Add the icon on the workspace anyway. - allowMissingTarget = true; - } else { - // Do not wait for external media load anymore. - c.markDeleted("Invalid package removed: " + targetPkg); - continue; - } - } - - if (validTarget) { - // The shortcut points to a valid target (either no target - // or something which is ready to be used) - c.markRestored(); - } - - boolean useLowResIcon = !c.isOnWorkspaceOrHotseat() && - !verifier.isItemInPreview(c.getInt(rankIndex)); - - if (c.restoreFlag != 0) { - // Already verified above that user is same as default user - info = c.getRestoredItemInfo(intent); - } else if (c.itemType == - LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { - info = c.getAppShortcutInfo( - intent, allowMissingTarget, useLowResIcon); - } else if (c.itemType == - LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { - - ShortcutKey key = ShortcutKey.fromIntent(intent, c.user); - if (unlockedUsers.get(c.serialNumber)) { - ShortcutInfoCompat pinnedShortcut = - shortcutKeyToPinnedShortcuts.get(key); - if (pinnedShortcut == null) { - // The shortcut is no longer valid. - c.markDeleted("Pinned shortcut not found"); - continue; - } - info = new ShortcutInfo(pinnedShortcut, context); - info.iconBitmap = LauncherIcons - .createShortcutIcon(pinnedShortcut, context); - if (pmHelper.isAppSuspended( - pinnedShortcut.getPackage(), info.user)) { - info.isDisabled |= ShortcutInfo.FLAG_DISABLED_SUSPENDED; - } - intent = info.intent; - } else { - // Create a shortcut info in disabled mode for now. - info = c.loadSimpleShortcut(); - info.isDisabled |= ShortcutInfo.FLAG_DISABLED_LOCKED_USER; - } - } else { // item type == ITEM_TYPE_SHORTCUT - info = c.loadSimpleShortcut(); - - // Shortcuts are only available on the primary profile - if (!TextUtils.isEmpty(targetPkg) - && pmHelper.isAppSuspended(targetPkg, c.user)) { - disabledState |= ShortcutInfo.FLAG_DISABLED_SUSPENDED; - } - - // App shortcuts that used to be automatically added to Launcher - // didn't always have the correct intent flags set, so do that - // here - if (intent.getAction() != null && - intent.getCategories() != null && - intent.getAction().equals(Intent.ACTION_MAIN) && - intent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) { - intent.addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK | - Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); - } - } - - if (info != null) { - c.applyCommonProperties(info); - - info.intent = intent; - info.rank = c.getInt(rankIndex); - info.spanX = 1; - info.spanY = 1; - info.isDisabled |= disabledState; - if (isSafeMode && !Utilities.isSystemApp(context, intent)) { - info.isDisabled |= ShortcutInfo.FLAG_DISABLED_SAFEMODE; - } - - if (c.restoreFlag != 0 && !TextUtils.isEmpty(targetPkg)) { - Integer progress = installingPkgs.get(targetPkg); - if (progress != null) { - info.setInstallProgress(progress); - } else { - info.status &= ~ShortcutInfo.FLAG_INSTALL_SESSION_ACTIVE; - } - } - - c.checkAndAddItem(info, mBgDataModel); - } else { - throw new RuntimeException("Unexpected null ShortcutInfo"); - } - break; - - case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: - FolderInfo folderInfo = mBgDataModel.findOrMakeFolder(c.id); - c.applyCommonProperties(folderInfo); - - // Do not trim the folder label, as is was set by the user. - folderInfo.title = c.getString(c.titleIndex); - folderInfo.spanX = 1; - folderInfo.spanY = 1; - folderInfo.options = c.getInt(optionsIndex); - - // no special handling required for restored folders - c.markRestored(); - - c.checkAndAddItem(folderInfo, mBgDataModel); - break; - - case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: - case LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: - // Read all Launcher-specific widget details - boolean customWidget = c.itemType == - LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET; - - int appWidgetId = c.getInt(appWidgetIdIndex); - String savedProvider = c.getString(appWidgetProviderIndex); - - final ComponentName component = - ComponentName.unflattenFromString(savedProvider); - - final boolean isIdValid = !c.hasRestoreFlag( - LauncherAppWidgetInfo.FLAG_ID_NOT_VALID); - final boolean wasProviderReady = !c.hasRestoreFlag( - LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY); - - if (widgetProvidersMap == null) { - widgetProvidersMap = mAppWidgetManager.getAllProvidersMap(); - } - final AppWidgetProviderInfo provider = widgetProvidersMap.get( - new ComponentKey( - ComponentName.unflattenFromString(savedProvider), - c.user)); - - final boolean isProviderReady = isValidProvider(provider); - if (!isSafeMode && !customWidget && - wasProviderReady && !isProviderReady) { - c.markDeleted( - "Deleting widget that isn't installed anymore: " - + provider); - } else { - if (isProviderReady) { - appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId, - provider.provider); - - // The provider is available. So the widget is either - // available or not available. We do not need to track - // any future restore updates. - int status = c.restoreFlag & - ~LauncherAppWidgetInfo.FLAG_RESTORE_STARTED; - if (!wasProviderReady) { - // If provider was not previously ready, update the - // status and UI flag. - - // Id would be valid only if the widget restore broadcast was received. - if (isIdValid) { - status |= LauncherAppWidgetInfo.FLAG_UI_NOT_READY; - } else { - status &= ~LauncherAppWidgetInfo - .FLAG_PROVIDER_NOT_READY; - } - } - appWidgetInfo.restoreStatus = status; - } else { - Log.v(TAG, "Widget restore pending id=" + c.id - + " appWidgetId=" + appWidgetId - + " status =" + c.restoreFlag); - appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId, - component); - appWidgetInfo.restoreStatus = c.restoreFlag; - Integer installProgress = installingPkgs.get(component.getPackageName()); - - if (c.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_RESTORE_STARTED)) { - // Restore has started once. - } else if (installProgress != null) { - // App restore has started. Update the flag - appWidgetInfo.restoreStatus |= - LauncherAppWidgetInfo.FLAG_RESTORE_STARTED; - } else if (!isSafeMode) { - c.markDeleted("Unrestored widget removed: " + component); - continue; - } - - appWidgetInfo.installProgress = - installProgress == null ? 0 : installProgress; - } - if (appWidgetInfo.hasRestoreFlag( - LauncherAppWidgetInfo.FLAG_DIRECT_CONFIG)) { - appWidgetInfo.bindOptions = c.parseIntent(); - } - - c.applyCommonProperties(appWidgetInfo); - appWidgetInfo.spanX = c.getInt(spanXIndex); - appWidgetInfo.spanY = c.getInt(spanYIndex); - appWidgetInfo.user = c.user; - - if (!c.isOnWorkspaceOrHotseat()) { - c.markDeleted("Widget found where container != " + - "CONTAINER_DESKTOP nor CONTAINER_HOTSEAT - ignoring!"); - continue; - } - - if (!customWidget) { - String providerName = - appWidgetInfo.providerName.flattenToString(); - if (!providerName.equals(savedProvider) || - (appWidgetInfo.restoreStatus != c.restoreFlag)) { - c.updater() - .put(LauncherSettings.Favorites.APPWIDGET_PROVIDER, - providerName) - .put(LauncherSettings.Favorites.RESTORED, - appWidgetInfo.restoreStatus) - .commit(); - } - } - - if (appWidgetInfo.restoreStatus != - LauncherAppWidgetInfo.RESTORE_COMPLETED) { - String pkg = appWidgetInfo.providerName.getPackageName(); - appWidgetInfo.pendingItemInfo = new PackageItemInfo(pkg); - appWidgetInfo.pendingItemInfo.user = appWidgetInfo.user; - mIconCache.getTitleAndIconForApp( - appWidgetInfo.pendingItemInfo, false); - } - - c.checkAndAddItem(appWidgetInfo, mBgDataModel); - } - break; - } - } catch (Exception e) { - Log.e(TAG, "Desktop items loading interrupted", e); - } - } - } finally { - Utilities.closeSilently(c); - } - - // Break early if we've stopped loading - if (mStopped) { - mBgDataModel.clear(); - return; - } - - // Remove dead items - if (c.commitDeleted()) { - // Remove any empty folder - ArrayList deletedFolderIds = (ArrayList) LauncherSettings.Settings - .call(contentResolver, - LauncherSettings.Settings.METHOD_DELETE_EMPTY_FOLDERS) - .getSerializable(LauncherSettings.Settings.EXTRA_VALUE); - for (long folderId : deletedFolderIds) { - mBgDataModel.workspaceItems.remove(mBgDataModel.folders.get(folderId)); - mBgDataModel.folders.remove(folderId); - mBgDataModel.itemsIdMap.remove(folderId); - } - - // Remove any ghost widgets - LauncherSettings.Settings.call(contentResolver, - LauncherSettings.Settings.METHOD_REMOVE_GHOST_WIDGETS); - } - - // Unpin shortcuts that don't exist on the workspace. - HashSet pendingShortcuts = - InstallShortcutReceiver.getPendingShortcuts(context); - for (ShortcutKey key : shortcutKeyToPinnedShortcuts.keySet()) { - MutableInt numTimesPinned = mBgDataModel.pinnedShortcutCounts.get(key); - if ((numTimesPinned == null || numTimesPinned.value == 0) - && !pendingShortcuts.contains(key)) { - // Shortcut is pinned but doesn't exist on the workspace; unpin it. - mShortcutManager.unpinShortcut(key); - } - } - - FolderIconPreviewVerifier verifier = - new FolderIconPreviewVerifier(mApp.getInvariantDeviceProfile()); - // Sort the folder items and make sure all items in the preview are high resolution. - for (FolderInfo folder : mBgDataModel.folders) { - Collections.sort(folder.contents, Folder.ITEM_POS_COMPARATOR); - verifier.setFolderInfo(folder); - - int numItemsInPreview = 0; - for (ShortcutInfo info : folder.contents) { - if (info.usingLowResIcon - && info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION - && verifier.isItemInPreview(info.rank)) { - mIconCache.getTitleAndIcon(info, false); - numItemsInPreview++; - } - - if (numItemsInPreview >= FolderIcon.NUM_ITEMS_IN_PREVIEW) { - break; - } - } - } - - c.commitRestoredItems(); - if (!isSdCardReady && !pendingPackages.isEmpty()) { - context.registerReceiver( - new SdCardAvailableReceiver(mApp, pendingPackages), - new IntentFilter(Intent.ACTION_BOOT_COMPLETED), - null, - sWorker); - } - - // Remove any empty screens - ArrayList unusedScreens = new ArrayList<>(mBgDataModel.workspaceScreens); - for (ItemInfo item: mBgDataModel.itemsIdMap) { - long screenId = item.screenId; - if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && - unusedScreens.contains(screenId)) { - unusedScreens.remove(screenId); - } - } - - // If there are any empty screens remove them, and update. - if (unusedScreens.size() != 0) { - mBgDataModel.workspaceScreens.removeAll(unusedScreens); - updateWorkspaceScreenOrder(context, mBgDataModel.workspaceScreens); - } - } - if (LauncherAppState.PROFILE_STARTUP) { - Trace.endSection(); - } - } - - private void updateIconCache() { - // Ignore packages which have a promise icon. - HashSet packagesToIgnore = new HashSet<>(); - synchronized (mBgDataModel) { - for (ItemInfo info : mBgDataModel.itemsIdMap) { - if (info instanceof ShortcutInfo) { - ShortcutInfo si = (ShortcutInfo) info; - if (si.isPromise() && si.getTargetComponent() != null) { - packagesToIgnore.add(si.getTargetComponent().getPackageName()); - } - } else if (info instanceof LauncherAppWidgetInfo) { - LauncherAppWidgetInfo lawi = (LauncherAppWidgetInfo) info; - if (lawi.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY)) { - packagesToIgnore.add(lawi.providerName.getPackageName()); - } - } - } - } - mIconCache.updateDbIcons(packagesToIgnore); - } - - private void loadAllApps() { - final long loadTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; - - final List profiles = mUserManager.getUserProfiles(); - - // Clear the list of apps - mBgAllAppsList.clear(); - for (UserHandle user : profiles) { - // Query for the set of apps - final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; - final List apps = mLauncherApps.getActivityList(null, user); - if (DEBUG_LOADERS) { - Log.d(TAG, "getActivityList took " - + (SystemClock.uptimeMillis()-qiaTime) + "ms for user " + user); - Log.d(TAG, "getActivityList got " + apps.size() + " apps for user " + user); - } - // Fail if we don't have any apps - // TODO: Fix this. Only fail for the current user. - if (apps == null || apps.isEmpty()) { - return; - } - boolean quietMode = mUserManager.isQuietModeEnabled(user); - // Create the ApplicationInfos - for (int i = 0; i < apps.size(); i++) { - LauncherActivityInfo app = apps.get(i); - // This builds the icon bitmaps. - mBgAllAppsList.add(new AppInfo(app, user, quietMode), app); - } - - ManagedProfileHeuristic.onAllAppsLoaded(mApp.getContext(), apps, user); - } - - if (FeatureFlags.LAUNCHER3_PROMISE_APPS_IN_ALL_APPS) { - // get all active sessions and add them to the all apps list - for (PackageInstaller.SessionInfo info : - mPackageInstaller.getAllVerifiedSessions()) { - mBgAllAppsList.addPromiseApp(mApp.getContext(), - PackageInstallInfo.fromInstallingState(info)); - } - } - - mBgAllAppsList.added = new ArrayList<>(); - if (DEBUG_LOADERS) { - Log.d(TAG, "All apps loaded in in " - + (SystemClock.uptimeMillis() - loadTime) + "ms"); - } - } - - private void loadDeepShortcuts() { - mBgDataModel.deepShortcutMap.clear(); - mBgDataModel.hasShortcutHostPermission = mShortcutManager.hasHostPermission(); - if (mBgDataModel.hasShortcutHostPermission) { - for (UserHandle user : mUserManager.getUserProfiles()) { - if (mUserManager.isUserUnlocked(user)) { - List shortcuts = - mShortcutManager.queryForAllShortcuts(user); - mBgDataModel.updateDeepShortcutMap(null, user, shortcuts); - } - } - } - } - } - /** * Refreshes the cached shortcuts if the shortcut permission has changed. * Current implementation simply reloads the workspace, but it can be optimized to @@ -1417,7 +638,7 @@ public class LauncherModel extends BroadcastReceiver @Override public final void run() { if (!mModel.mModelLoaded) { - if (DEBUG_LOADERS) { + if (DEBUG_TASKS) { Log.d(TAG, "Ignoring model task since loader is pending=" + this); } // Loader has not yet run. @@ -1489,11 +710,6 @@ public class LauncherModel extends BroadcastReceiver }); } - static boolean isValidProvider(AppWidgetProviderInfo provider) { - return (provider != null) && (provider.provider != null) - && (provider.provider.getPackageName() != null); - } - public void dumpState(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { if (args.length > 0 && TextUtils.equals(args[0], "--all")) { writer.println(prefix + "All apps list: size=" + mBgAllAppsList.data.size()); diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java new file mode 100644 index 0000000000..bcf516eed8 --- /dev/null +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -0,0 +1,839 @@ +/* + * 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. + */ + +package com.android.launcher3.model; + +import android.appwidget.AppWidgetProviderInfo; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.LauncherActivityInfo; +import android.content.pm.PackageInstaller; +import android.os.Handler; +import android.os.Looper; +import android.os.Process; +import android.os.SystemClock; +import android.os.Trace; +import android.os.UserHandle; +import android.text.TextUtils; +import android.util.Log; +import android.util.LongSparseArray; +import android.util.MutableInt; + +import com.android.launcher3.AllAppsList; +import com.android.launcher3.AppInfo; +import com.android.launcher3.FolderInfo; +import com.android.launcher3.IconCache; +import com.android.launcher3.InstallShortcutReceiver; +import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherAppWidgetInfo; +import com.android.launcher3.LauncherModel; +import com.android.launcher3.LauncherSettings; +import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.Utilities; +import com.android.launcher3.compat.AppWidgetManagerCompat; +import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.compat.PackageInstallerCompat; +import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.folder.Folder; +import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.folder.FolderIconPreviewVerifier; +import com.android.launcher3.graphics.LauncherIcons; +import com.android.launcher3.logging.FileLog; +import com.android.launcher3.provider.ImportDataTask; +import com.android.launcher3.shortcuts.DeepShortcutManager; +import com.android.launcher3.shortcuts.ShortcutInfoCompat; +import com.android.launcher3.shortcuts.ShortcutKey; +import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.LooperIdleLock; +import com.android.launcher3.util.ManagedProfileHeuristic; +import com.android.launcher3.util.MultiHashMap; +import com.android.launcher3.util.PackageManagerHelper; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CancellationException; + +/** + * Runnable for the thread that loads the contents of the launcher: + * - workspace icons + * - widgets + * - all apps icons + * - deep shortcuts within apps + */ +public class LoaderTask implements Runnable { + private static final boolean DEBUG_LOADERS = false; + private static final String TAG = "LoaderTask"; + + private final LauncherAppState mApp; + private final AllAppsList mBgAllAppsList; + private final BgDataModel mBgDataModel; + + private final LoaderResults mResults; + + private final LauncherAppsCompat mLauncherApps; + private final UserManagerCompat mUserManager; + private final DeepShortcutManager mShortcutManager; + private final PackageInstallerCompat mPackageInstaller; + private final AppWidgetManagerCompat mAppWidgetManager; + private final IconCache mIconCache; + + private boolean mStopped; + + public LoaderTask(LauncherAppState app, AllAppsList bgAllAppsList, BgDataModel dataModel, + LoaderResults results) { + mApp = app; + mBgAllAppsList = bgAllAppsList; + mBgDataModel = dataModel; + mResults = results; + + mLauncherApps = LauncherAppsCompat.getInstance(mApp.getContext()); + mUserManager = UserManagerCompat.getInstance(mApp.getContext()); + mShortcutManager = DeepShortcutManager.getInstance(mApp.getContext()); + mPackageInstaller = PackageInstallerCompat.getInstance(mApp.getContext()); + mAppWidgetManager = AppWidgetManagerCompat.getInstance(mApp.getContext()); + mIconCache = mApp.getIconCache(); + } + + private synchronized void waitForIdle() { + // Wait until the either we're stopped or the other threads are done. + // This way we don't start loading all apps until the workspace has settled + // down. + LooperIdleLock idleLock = new LooperIdleLock(this, Looper.getMainLooper()); + // Just in case mFlushingWorkerThread changes but we aren't woken up, + // wait no longer than 1sec at a time + while (!mStopped && idleLock.awaitLocked(1000)); + } + + private synchronized void verifyNotStopped() throws CancellationException { + if (mStopped) { + throw new CancellationException("Loader stopped"); + } + } + + public void run() { + synchronized (this) { + // Skip fast if we are already stopped. + if (mStopped) { + return; + } + } + + try (LauncherModel.LoaderTransaction transaction = mApp.getModel().beginLoader(this)) { + long now = 0; + if (DEBUG_LOADERS) Log.d(TAG, "step 1.1: loading workspace"); + loadWorkspace(); + + verifyNotStopped(); + if (DEBUG_LOADERS) Log.d(TAG, "step 1.2: bind workspace workspace"); + mResults.bindWorkspace(); + + // Take a break + if (DEBUG_LOADERS) { + Log.d(TAG, "step 1 completed, wait for idle"); + now = SystemClock.uptimeMillis(); + } + waitForIdle(); + if (DEBUG_LOADERS) Log.d(TAG, "Waited " + (SystemClock.uptimeMillis() - now) + "ms"); + verifyNotStopped(); + + // second step + if (DEBUG_LOADERS) Log.d(TAG, "step 2.1: loading all apps"); + loadAllApps(); + + if (DEBUG_LOADERS) Log.d(TAG, "step 2.2: Binding all apps"); + verifyNotStopped(); + mResults.bindAllApps(); + + verifyNotStopped(); + if (DEBUG_LOADERS) Log.d(TAG, "step 2.3: Update icon cache"); + updateIconCache(); + + // Take a break + if (DEBUG_LOADERS) { + Log.d(TAG, "step 2 completed, wait for idle"); + now = SystemClock.uptimeMillis(); + } + waitForIdle(); + if (DEBUG_LOADERS) Log.d(TAG, "Waited " + (SystemClock.uptimeMillis() - now) + "ms"); + verifyNotStopped(); + + // third step + if (DEBUG_LOADERS) Log.d(TAG, "step 3.1: loading deep shortcuts"); + loadDeepShortcuts(); + + verifyNotStopped(); + if (DEBUG_LOADERS) Log.d(TAG, "step 3.2: bind deep shortcuts"); + mResults.bindDeepShortcuts(); + + // Take a break + if (DEBUG_LOADERS) Log.d(TAG, "step 3 completed, wait for idle"); + waitForIdle(); + verifyNotStopped(); + + // fourth step + if (DEBUG_LOADERS) Log.d(TAG, "step 4.1: loading widgets"); + mBgDataModel.widgetsModel.update(mApp, null); + + verifyNotStopped(); + if (DEBUG_LOADERS) Log.d(TAG, "step 4.2: Binding widgets"); + mResults.bindWidgets(); + + transaction.commit(); + } catch (CancellationException e) { + // Loader stopped, ignore + } + } + + public synchronized void stopLocked() { + mStopped = true; + this.notify(); + } + + private void loadWorkspace() { + if (LauncherAppState.PROFILE_STARTUP) { + Trace.beginSection("Loading Workspace"); + } + + final Context context = mApp.getContext(); + final ContentResolver contentResolver = context.getContentResolver(); + final PackageManagerHelper pmHelper = new PackageManagerHelper(context); + final boolean isSafeMode = pmHelper.isSafeMode(); + final boolean isSdCardReady = Utilities.isBootCompleted(); + final MultiHashMap pendingPackages = new MultiHashMap<>(); + + boolean clearDb = false; + try { + ImportDataTask.performImportIfPossible(context); + } catch (Exception e) { + // Migration failed. Clear workspace. + clearDb = true; + } + + if (!clearDb && GridSizeMigrationTask.ENABLED && + !GridSizeMigrationTask.migrateGridIfNeeded(context)) { + // Migration failed. Clear workspace. + clearDb = true; + } + + if (clearDb) { + Log.d(TAG, "loadWorkspace: resetting launcher database"); + LauncherSettings.Settings.call(contentResolver, + LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB); + } + + Log.d(TAG, "loadWorkspace: loading default favorites"); + LauncherSettings.Settings.call(contentResolver, + LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES); + + synchronized (mBgDataModel) { + mBgDataModel.clear(); + + final HashMap installingPkgs = + mPackageInstaller.updateAndGetActiveSessionCache(); + mBgDataModel.workspaceScreens.addAll(LauncherModel.loadWorkspaceScreensDb(context)); + + Map shortcutKeyToPinnedShortcuts = new HashMap<>(); + final LoaderCursor c = new LoaderCursor(contentResolver.query( + LauncherSettings.Favorites.CONTENT_URI, null, null, null, null), mApp); + + HashMap widgetProvidersMap = null; + + try { + final int appWidgetIdIndex = c.getColumnIndexOrThrow( + LauncherSettings.Favorites.APPWIDGET_ID); + final int appWidgetProviderIndex = c.getColumnIndexOrThrow( + LauncherSettings.Favorites.APPWIDGET_PROVIDER); + final int spanXIndex = c.getColumnIndexOrThrow + (LauncherSettings.Favorites.SPANX); + final int spanYIndex = c.getColumnIndexOrThrow( + LauncherSettings.Favorites.SPANY); + final int rankIndex = c.getColumnIndexOrThrow( + LauncherSettings.Favorites.RANK); + final int optionsIndex = c.getColumnIndexOrThrow( + LauncherSettings.Favorites.OPTIONS); + + final LongSparseArray allUsers = c.allUsers; + final LongSparseArray quietMode = new LongSparseArray<>(); + final LongSparseArray unlockedUsers = new LongSparseArray<>(); + for (UserHandle user : mUserManager.getUserProfiles()) { + long serialNo = mUserManager.getSerialNumberForUser(user); + allUsers.put(serialNo, user); + quietMode.put(serialNo, mUserManager.isQuietModeEnabled(user)); + + boolean userUnlocked = mUserManager.isUserUnlocked(user); + + // We can only query for shortcuts when the user is unlocked. + if (userUnlocked) { + List pinnedShortcuts = + mShortcutManager.queryForPinnedShortcuts(null, user); + if (mShortcutManager.wasLastCallSuccess()) { + for (ShortcutInfoCompat shortcut : pinnedShortcuts) { + shortcutKeyToPinnedShortcuts.put(ShortcutKey.fromInfo(shortcut), + shortcut); + } + } else { + // Shortcut manager can fail due to some race condition when the + // lock state changes too frequently. For the purpose of the loading + // shortcuts, consider the user is still locked. + userUnlocked = false; + } + } + unlockedUsers.put(serialNo, userUnlocked); + } + + ShortcutInfo info; + LauncherAppWidgetInfo appWidgetInfo; + Intent intent; + String targetPkg; + + FolderIconPreviewVerifier verifier = + new FolderIconPreviewVerifier(mApp.getInvariantDeviceProfile()); + while (!mStopped && c.moveToNext()) { + try { + if (c.user == null) { + // User has been deleted, remove the item. + c.markDeleted("User has been deleted"); + continue; + } + + boolean allowMissingTarget = false; + switch (c.itemType) { + case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: + case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: + case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: + intent = c.parseIntent(); + if (intent == null) { + c.markDeleted("Invalid or null intent"); + continue; + } + + int disabledState = quietMode.get(c.serialNumber) ? + ShortcutInfo.FLAG_DISABLED_QUIET_USER : 0; + ComponentName cn = intent.getComponent(); + targetPkg = cn == null ? intent.getPackage() : cn.getPackageName(); + + if (!Process.myUserHandle().equals(c.user)) { + if (c.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) { + c.markDeleted("Legacy shortcuts are only allowed for default user"); + continue; + } else if (c.restoreFlag != 0) { + // Don't restore items for other profiles. + c.markDeleted("Restore from managed profile not supported"); + continue; + } + } + if (TextUtils.isEmpty(targetPkg) && + c.itemType != LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) { + c.markDeleted("Only legacy shortcuts can have null package"); + continue; + } + + // If there is no target package, its an implicit intent + // (legacy shortcut) which is always valid + boolean validTarget = TextUtils.isEmpty(targetPkg) || + mLauncherApps.isPackageEnabledForProfile(targetPkg, c.user); + + if (cn != null && validTarget) { + // If the apk is present and the shortcut points to a specific + // component. + + // If the component is already present + if (mLauncherApps.isActivityEnabledForProfile(cn, c.user)) { + // no special handling necessary for this item + c.markRestored(); + } else { + if (c.hasRestoreFlag(ShortcutInfo.FLAG_AUTOINSTALL_ICON)) { + // We allow auto install apps to have their intent + // updated after an install. + intent = pmHelper.getAppLaunchIntent(targetPkg, c.user); + if (intent != null) { + c.restoreFlag = 0; + c.updater().put( + LauncherSettings.Favorites.INTENT, + intent.toUri(0)).commit(); + cn = intent.getComponent(); + } else { + c.markDeleted("Unable to find a launch target"); + continue; + } + } else { + // The app is installed but the component is no + // longer available. + c.markDeleted("Invalid component removed: " + cn); + continue; + } + } + } + // else if cn == null => can't infer much, leave it + // else if !validPkg => could be restored icon or missing sd-card + + if (!TextUtils.isEmpty(targetPkg) && !validTarget) { + // Points to a valid app (superset of cn != null) but the apk + // is not available. + + if (c.restoreFlag != 0) { + // Package is not yet available but might be + // installed later. + FileLog.d(TAG, "package not yet restored: " + targetPkg); + + if (c.hasRestoreFlag(ShortcutInfo.FLAG_RESTORE_STARTED)) { + // Restore has started once. + } else if (installingPkgs.containsKey(targetPkg)) { + // App restore has started. Update the flag + c.restoreFlag |= ShortcutInfo.FLAG_RESTORE_STARTED; + c.updater().commit(); + } else { + c.markDeleted("Unrestored app removed: " + targetPkg); + continue; + } + } else if (pmHelper.isAppOnSdcard(targetPkg, c.user)) { + // Package is present but not available. + disabledState |= ShortcutInfo.FLAG_DISABLED_NOT_AVAILABLE; + // Add the icon on the workspace anyway. + allowMissingTarget = true; + } else if (!isSdCardReady) { + // SdCard is not ready yet. Package might get available, + // once it is ready. + Log.d(TAG, "Missing pkg, will check later: " + targetPkg); + pendingPackages.addToList(c.user, targetPkg); + // Add the icon on the workspace anyway. + allowMissingTarget = true; + } else { + // Do not wait for external media load anymore. + c.markDeleted("Invalid package removed: " + targetPkg); + continue; + } + } + + if (validTarget) { + // The shortcut points to a valid target (either no target + // or something which is ready to be used) + c.markRestored(); + } + + boolean useLowResIcon = !c.isOnWorkspaceOrHotseat() && + !verifier.isItemInPreview(c.getInt(rankIndex)); + + if (c.restoreFlag != 0) { + // Already verified above that user is same as default user + info = c.getRestoredItemInfo(intent); + } else if (c.itemType == + LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { + info = c.getAppShortcutInfo( + intent, allowMissingTarget, useLowResIcon); + } else if (c.itemType == + LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { + + ShortcutKey key = ShortcutKey.fromIntent(intent, c.user); + if (unlockedUsers.get(c.serialNumber)) { + ShortcutInfoCompat pinnedShortcut = + shortcutKeyToPinnedShortcuts.get(key); + if (pinnedShortcut == null) { + // The shortcut is no longer valid. + c.markDeleted("Pinned shortcut not found"); + continue; + } + info = new ShortcutInfo(pinnedShortcut, context); + info.iconBitmap = LauncherIcons + .createShortcutIcon(pinnedShortcut, context); + if (pmHelper.isAppSuspended( + pinnedShortcut.getPackage(), info.user)) { + info.isDisabled |= ShortcutInfo.FLAG_DISABLED_SUSPENDED; + } + intent = info.intent; + } else { + // Create a shortcut info in disabled mode for now. + info = c.loadSimpleShortcut(); + info.isDisabled |= ShortcutInfo.FLAG_DISABLED_LOCKED_USER; + } + } else { // item type == ITEM_TYPE_SHORTCUT + info = c.loadSimpleShortcut(); + + // Shortcuts are only available on the primary profile + if (!TextUtils.isEmpty(targetPkg) + && pmHelper.isAppSuspended(targetPkg, c.user)) { + disabledState |= ShortcutInfo.FLAG_DISABLED_SUSPENDED; + } + + // App shortcuts that used to be automatically added to Launcher + // didn't always have the correct intent flags set, so do that + // here + if (intent.getAction() != null && + intent.getCategories() != null && + intent.getAction().equals(Intent.ACTION_MAIN) && + intent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) { + intent.addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK | + Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + } + } + + if (info != null) { + c.applyCommonProperties(info); + + info.intent = intent; + info.rank = c.getInt(rankIndex); + info.spanX = 1; + info.spanY = 1; + info.isDisabled |= disabledState; + if (isSafeMode && !Utilities.isSystemApp(context, intent)) { + info.isDisabled |= ShortcutInfo.FLAG_DISABLED_SAFEMODE; + } + + if (c.restoreFlag != 0 && !TextUtils.isEmpty(targetPkg)) { + Integer progress = installingPkgs.get(targetPkg); + if (progress != null) { + info.setInstallProgress(progress); + } else { + info.status &= ~ShortcutInfo.FLAG_INSTALL_SESSION_ACTIVE; + } + } + + c.checkAndAddItem(info, mBgDataModel); + } else { + throw new RuntimeException("Unexpected null ShortcutInfo"); + } + break; + + case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: + FolderInfo folderInfo = mBgDataModel.findOrMakeFolder(c.id); + c.applyCommonProperties(folderInfo); + + // Do not trim the folder label, as is was set by the user. + folderInfo.title = c.getString(c.titleIndex); + folderInfo.spanX = 1; + folderInfo.spanY = 1; + folderInfo.options = c.getInt(optionsIndex); + + // no special handling required for restored folders + c.markRestored(); + + c.checkAndAddItem(folderInfo, mBgDataModel); + break; + + case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: + case LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: + // Read all Launcher-specific widget details + boolean customWidget = c.itemType == + LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET; + + int appWidgetId = c.getInt(appWidgetIdIndex); + String savedProvider = c.getString(appWidgetProviderIndex); + + final ComponentName component = + ComponentName.unflattenFromString(savedProvider); + + final boolean isIdValid = !c.hasRestoreFlag( + LauncherAppWidgetInfo.FLAG_ID_NOT_VALID); + final boolean wasProviderReady = !c.hasRestoreFlag( + LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY); + + if (widgetProvidersMap == null) { + widgetProvidersMap = mAppWidgetManager.getAllProvidersMap(); + } + final AppWidgetProviderInfo provider = widgetProvidersMap.get( + new ComponentKey( + ComponentName.unflattenFromString(savedProvider), + c.user)); + + final boolean isProviderReady = isValidProvider(provider); + if (!isSafeMode && !customWidget && + wasProviderReady && !isProviderReady) { + c.markDeleted( + "Deleting widget that isn't installed anymore: " + + provider); + } else { + if (isProviderReady) { + appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId, + provider.provider); + + // The provider is available. So the widget is either + // available or not available. We do not need to track + // any future restore updates. + int status = c.restoreFlag & + ~LauncherAppWidgetInfo.FLAG_RESTORE_STARTED; + if (!wasProviderReady) { + // If provider was not previously ready, update the + // status and UI flag. + + // Id would be valid only if the widget restore broadcast was received. + if (isIdValid) { + status |= LauncherAppWidgetInfo.FLAG_UI_NOT_READY; + } else { + status &= ~LauncherAppWidgetInfo + .FLAG_PROVIDER_NOT_READY; + } + } + appWidgetInfo.restoreStatus = status; + } else { + Log.v(TAG, "Widget restore pending id=" + c.id + + " appWidgetId=" + appWidgetId + + " status =" + c.restoreFlag); + appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId, + component); + appWidgetInfo.restoreStatus = c.restoreFlag; + Integer installProgress = installingPkgs.get(component.getPackageName()); + + if (c.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_RESTORE_STARTED)) { + // Restore has started once. + } else if (installProgress != null) { + // App restore has started. Update the flag + appWidgetInfo.restoreStatus |= + LauncherAppWidgetInfo.FLAG_RESTORE_STARTED; + } else if (!isSafeMode) { + c.markDeleted("Unrestored widget removed: " + component); + continue; + } + + appWidgetInfo.installProgress = + installProgress == null ? 0 : installProgress; + } + if (appWidgetInfo.hasRestoreFlag( + LauncherAppWidgetInfo.FLAG_DIRECT_CONFIG)) { + appWidgetInfo.bindOptions = c.parseIntent(); + } + + c.applyCommonProperties(appWidgetInfo); + appWidgetInfo.spanX = c.getInt(spanXIndex); + appWidgetInfo.spanY = c.getInt(spanYIndex); + appWidgetInfo.user = c.user; + + if (!c.isOnWorkspaceOrHotseat()) { + c.markDeleted("Widget found where container != " + + "CONTAINER_DESKTOP nor CONTAINER_HOTSEAT - ignoring!"); + continue; + } + + if (!customWidget) { + String providerName = + appWidgetInfo.providerName.flattenToString(); + if (!providerName.equals(savedProvider) || + (appWidgetInfo.restoreStatus != c.restoreFlag)) { + c.updater() + .put(LauncherSettings.Favorites.APPWIDGET_PROVIDER, + providerName) + .put(LauncherSettings.Favorites.RESTORED, + appWidgetInfo.restoreStatus) + .commit(); + } + } + + if (appWidgetInfo.restoreStatus != + LauncherAppWidgetInfo.RESTORE_COMPLETED) { + String pkg = appWidgetInfo.providerName.getPackageName(); + appWidgetInfo.pendingItemInfo = new PackageItemInfo(pkg); + appWidgetInfo.pendingItemInfo.user = appWidgetInfo.user; + mIconCache.getTitleAndIconForApp( + appWidgetInfo.pendingItemInfo, false); + } + + c.checkAndAddItem(appWidgetInfo, mBgDataModel); + } + break; + } + } catch (Exception e) { + Log.e(TAG, "Desktop items loading interrupted", e); + } + } + } finally { + Utilities.closeSilently(c); + } + + // Break early if we've stopped loading + if (mStopped) { + mBgDataModel.clear(); + return; + } + + // Remove dead items + if (c.commitDeleted()) { + // Remove any empty folder + ArrayList deletedFolderIds = (ArrayList) LauncherSettings.Settings + .call(contentResolver, + LauncherSettings.Settings.METHOD_DELETE_EMPTY_FOLDERS) + .getSerializable(LauncherSettings.Settings.EXTRA_VALUE); + for (long folderId : deletedFolderIds) { + mBgDataModel.workspaceItems.remove(mBgDataModel.folders.get(folderId)); + mBgDataModel.folders.remove(folderId); + mBgDataModel.itemsIdMap.remove(folderId); + } + + // Remove any ghost widgets + LauncherSettings.Settings.call(contentResolver, + LauncherSettings.Settings.METHOD_REMOVE_GHOST_WIDGETS); + } + + // Unpin shortcuts that don't exist on the workspace. + HashSet pendingShortcuts = + InstallShortcutReceiver.getPendingShortcuts(context); + for (ShortcutKey key : shortcutKeyToPinnedShortcuts.keySet()) { + MutableInt numTimesPinned = mBgDataModel.pinnedShortcutCounts.get(key); + if ((numTimesPinned == null || numTimesPinned.value == 0) + && !pendingShortcuts.contains(key)) { + // Shortcut is pinned but doesn't exist on the workspace; unpin it. + mShortcutManager.unpinShortcut(key); + } + } + + FolderIconPreviewVerifier verifier = + new FolderIconPreviewVerifier(mApp.getInvariantDeviceProfile()); + // Sort the folder items and make sure all items in the preview are high resolution. + for (FolderInfo folder : mBgDataModel.folders) { + Collections.sort(folder.contents, Folder.ITEM_POS_COMPARATOR); + verifier.setFolderInfo(folder); + + int numItemsInPreview = 0; + for (ShortcutInfo info : folder.contents) { + if (info.usingLowResIcon + && info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION + && verifier.isItemInPreview(info.rank)) { + mIconCache.getTitleAndIcon(info, false); + numItemsInPreview++; + } + + if (numItemsInPreview >= FolderIcon.NUM_ITEMS_IN_PREVIEW) { + break; + } + } + } + + c.commitRestoredItems(); + if (!isSdCardReady && !pendingPackages.isEmpty()) { + context.registerReceiver( + new SdCardAvailableReceiver(mApp, pendingPackages), + new IntentFilter(Intent.ACTION_BOOT_COMPLETED), + null, + new Handler(LauncherModel.getWorkerLooper())); + } + + // Remove any empty screens + ArrayList unusedScreens = new ArrayList<>(mBgDataModel.workspaceScreens); + for (ItemInfo item: mBgDataModel.itemsIdMap) { + long screenId = item.screenId; + if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && + unusedScreens.contains(screenId)) { + unusedScreens.remove(screenId); + } + } + + // If there are any empty screens remove them, and update. + if (unusedScreens.size() != 0) { + mBgDataModel.workspaceScreens.removeAll(unusedScreens); + LauncherModel.updateWorkspaceScreenOrder(context, mBgDataModel.workspaceScreens); + } + } + if (LauncherAppState.PROFILE_STARTUP) { + Trace.endSection(); + } + } + + private void updateIconCache() { + // Ignore packages which have a promise icon. + HashSet packagesToIgnore = new HashSet<>(); + synchronized (mBgDataModel) { + for (ItemInfo info : mBgDataModel.itemsIdMap) { + if (info instanceof ShortcutInfo) { + ShortcutInfo si = (ShortcutInfo) info; + if (si.isPromise() && si.getTargetComponent() != null) { + packagesToIgnore.add(si.getTargetComponent().getPackageName()); + } + } else if (info instanceof LauncherAppWidgetInfo) { + LauncherAppWidgetInfo lawi = (LauncherAppWidgetInfo) info; + if (lawi.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY)) { + packagesToIgnore.add(lawi.providerName.getPackageName()); + } + } + } + } + mIconCache.updateDbIcons(packagesToIgnore); + } + + private void loadAllApps() { + final long loadTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; + + final List profiles = mUserManager.getUserProfiles(); + + // Clear the list of apps + mBgAllAppsList.clear(); + for (UserHandle user : profiles) { + // Query for the set of apps + final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; + final List apps = mLauncherApps.getActivityList(null, user); + if (DEBUG_LOADERS) { + Log.d(TAG, "getActivityList took " + + (SystemClock.uptimeMillis()-qiaTime) + "ms for user " + user); + Log.d(TAG, "getActivityList got " + apps.size() + " apps for user " + user); + } + // Fail if we don't have any apps + // TODO: Fix this. Only fail for the current user. + if (apps == null || apps.isEmpty()) { + return; + } + boolean quietMode = mUserManager.isQuietModeEnabled(user); + // Create the ApplicationInfos + for (int i = 0; i < apps.size(); i++) { + LauncherActivityInfo app = apps.get(i); + // This builds the icon bitmaps. + mBgAllAppsList.add(new AppInfo(app, user, quietMode), app); + } + + ManagedProfileHeuristic.onAllAppsLoaded(mApp.getContext(), apps, user); + } + + if (FeatureFlags.LAUNCHER3_PROMISE_APPS_IN_ALL_APPS) { + // get all active sessions and add them to the all apps list + for (PackageInstaller.SessionInfo info : + mPackageInstaller.getAllVerifiedSessions()) { + mBgAllAppsList.addPromiseApp(mApp.getContext(), + PackageInstallerCompat.PackageInstallInfo.fromInstallingState(info)); + } + } + + mBgAllAppsList.added = new ArrayList<>(); + if (DEBUG_LOADERS) { + Log.d(TAG, "All apps loaded in in " + + (SystemClock.uptimeMillis() - loadTime) + "ms"); + } + } + + private void loadDeepShortcuts() { + mBgDataModel.deepShortcutMap.clear(); + mBgDataModel.hasShortcutHostPermission = mShortcutManager.hasHostPermission(); + if (mBgDataModel.hasShortcutHostPermission) { + for (UserHandle user : mUserManager.getUserProfiles()) { + if (mUserManager.isUserUnlocked(user)) { + List shortcuts = + mShortcutManager.queryForAllShortcuts(user); + mBgDataModel.updateDeepShortcutMap(null, user, shortcuts); + } + } + } + } + + public static boolean isValidProvider(AppWidgetProviderInfo provider) { + return (provider != null) && (provider.provider != null) + && (provider.provider.getPackageName() != null); + } +} From 6d60532167910444e84f2a8da5ad69e858b08a0c Mon Sep 17 00:00:00 2001 From: Jonathan Miranda Date: Tue, 6 Jun 2017 20:36:24 +0000 Subject: [PATCH 132/446] Revert "Decrease jank in all apps physics." This change created an issue where some items appear to not have springs when the device does not have that many apps. This reverts commit 9d7f2b9e0d2b40414951f3dba461c6cabc9c7cbf. Change-Id: I8e79cf3f86972fde8184debb6ab4d0f32283a8bd --- .../launcher3/allapps/AllAppsGridAdapter.java | 48 +++++++------------ .../anim/SpringAnimationHandler.java | 2 +- 2 files changed, 18 insertions(+), 32 deletions(-) diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java index 83c1370140..d3d23ca249 100644 --- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java +++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java @@ -102,12 +102,7 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter Date: Tue, 6 Jun 2017 15:42:32 -0700 Subject: [PATCH 133/446] Add support for popup dark theme Bug: 62380473 Change-Id: Ib22e9b82841bf10b7f139638f268f0a878e3c6b9 --- res/layout/deep_shortcut.xml | 5 +++-- res/layout/horizontal_divider.xml | 2 +- res/layout/notification.xml | 5 +++-- res/layout/notification_footer.xml | 2 +- res/layout/notification_main.xml | 2 +- res/layout/system_shortcut.xml | 9 +++++---- res/layout/system_shortcut_icon_only.xml | 5 +++-- res/layout/system_shortcut_icons.xml | 2 +- res/values-sw720dp/styles.xml | 5 +++++ res/values/attrs.xml | 3 +++ res/values/colors.xml | 4 ---- res/values/styles.xml | 15 +++++++++------ .../notification/NotificationItemView.java | 3 ++- .../launcher3/popup/PopupContainerWithArrow.java | 15 ++++++--------- 14 files changed, 43 insertions(+), 34 deletions(-) diff --git a/res/layout/deep_shortcut.xml b/res/layout/deep_shortcut.xml index 85caba4a0b..4a2ad42254 100644 --- a/res/layout/deep_shortcut.xml +++ b/res/layout/deep_shortcut.xml @@ -18,7 +18,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:launcher="http://schemas.android.com/apk/res-auto" android:layout_width="@dimen/bg_popup_item_width" - android:layout_height="@dimen/bg_popup_item_height" > + android:layout_height="@dimen/bg_popup_item_height" + android:theme="@style/PopupItem" > + android:background="?attr/popupColorTertiary" />
diff --git a/res/layout/horizontal_divider.xml b/res/layout/horizontal_divider.xml index 33773ebfac..167f8f5d8c 100644 --- a/res/layout/horizontal_divider.xml +++ b/res/layout/horizontal_divider.xml @@ -2,4 +2,4 @@ \ No newline at end of file + android:background="?attr/popupColorTertiary" /> \ No newline at end of file diff --git a/res/layout/notification.xml b/res/layout/notification.xml index a183c92f7a..085dfa93ce 100644 --- a/res/layout/notification.xml +++ b/res/layout/notification.xml @@ -19,6 +19,7 @@ android:id="@+id/notification_view" android:layout_width="@dimen/bg_popup_item_width" android:layout_height="wrap_content" + android:theme="@style/PopupItem" android:elevation="@dimen/deep_shortcuts_elevation"> diff --git a/res/layout/notification_footer.xml b/res/layout/notification_footer.xml index ed2212be16..86280e0b6d 100644 --- a/res/layout/notification_footer.xml +++ b/res/layout/notification_footer.xml @@ -22,7 +22,7 @@ android:elevation="@dimen/notification_elevation" android:clipChildren="false" android:layout_gravity="center_vertical" - android:background="@color/popup_background_color"> + android:background="?attr/popupColorPrimary"> + android:layout_height="@dimen/bg_popup_item_height" + android:theme="@style/PopupItem" > + android:layout_gravity="start|center_vertical" + android:backgroundTint="?android:attr/textColorTertiary"/> + android:background="?attr/popupColorTertiary" /> diff --git a/res/layout/system_shortcut_icon_only.xml b/res/layout/system_shortcut_icon_only.xml index 2b58b92eed..c59cb53319 100644 --- a/res/layout/system_shortcut_icon_only.xml +++ b/res/layout/system_shortcut_icon_only.xml @@ -16,8 +16,9 @@ + android:tint="?android:attr/textColorHint" + android:padding="@dimen/system_shortcut_header_icon_padding" + android:theme="@style/PopupItem" /> diff --git a/res/layout/system_shortcut_icons.xml b/res/layout/system_shortcut_icons.xml index 676be8e694..db59d4962c 100644 --- a/res/layout/system_shortcut_icons.xml +++ b/res/layout/system_shortcut_icons.xml @@ -21,4 +21,4 @@ android:layout_height="@dimen/system_shortcut_header_height" android:orientation="horizontal" android:gravity="end|center_vertical" - android:background="@color/popup_header_background_color" /> + android:background="?attr/popupColorSecondary" /> diff --git a/res/values-sw720dp/styles.xml b/res/values-sw720dp/styles.xml index bc65a0e9aa..168afec4bb 100644 --- a/res/values-sw720dp/styles.xml +++ b/res/values-sw720dp/styles.xml @@ -27,6 +27,11 @@ true ?android:attr/textColorSecondary @layout/all_apps_search_container + #DDFFFFFF + #FFF + #F5F5F5 + #E0E0E0 + false diff --git a/res/values/attrs.xml b/res/values/attrs.xml index eaadd475a4..b85ba3e6f1 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -20,6 +20,9 @@ + + + diff --git a/res/values/colors.xml b/res/values/colors.xml index 6deffc1393..9ac248a8e6 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -31,12 +31,8 @@ #FFF - #F5F5F5 - #FFF #757575 - #E0E0E0 #1DE9B6 - @android:color/tertiary_text_light #E0E0E0 #FFFFFF diff --git a/res/values/styles.xml b/res/values/styles.xml index f75ca4eeb1..5ef044e981 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -27,12 +27,16 @@ #FF757575 @layout/all_apps_search_container #DDFFFFFF + #FFF + #F5F5F5 + #E0E0E0 false @@ -106,12 +113,8 @@ - - - diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java index 416d546eab..20707aa67e 100644 --- a/src/com/android/launcher3/notification/NotificationItemView.java +++ b/src/com/android/launcher3/notification/NotificationItemView.java @@ -34,6 +34,7 @@ import com.android.launcher3.graphics.IconPalette; import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; import com.android.launcher3.popup.PopupItemView; import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.util.Themes; import java.util.List; @@ -98,7 +99,7 @@ public class NotificationItemView extends PopupItemView implements LogContainerP if (mNotificationHeaderTextColor == Notification.COLOR_DEFAULT) { mNotificationHeaderTextColor = IconPalette.resolveContrastColor(getContext(), palette.dominantColor, - getResources().getColor(R.color.popup_header_background_color)); + Themes.getAttrColor(getContext(), R.attr.popupColorSecondary)); } mHeaderCount.setTextColor(mNotificationHeaderTextColor); } diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index fa4caab8b9..131abbad92 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -35,7 +35,6 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; import android.support.annotation.IntDef; -import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.view.Gravity; import android.view.LayoutInflater; @@ -75,6 +74,7 @@ import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.shortcuts.ShortcutsItemView; import com.android.launcher3.util.PackageUserKey; +import com.android.launcher3.util.Themes; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -289,8 +289,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra if (shouldUnroundBottomCorners) { roundedCorners &= ~ROUNDED_BOTTOM_CORNERS; } - int backgroundColor = ContextCompat.getColor(getContext(), - R.color.notification_color_beneath); + int backgroundColor = Themes.getAttrColor(mLauncher, R.attr.popupColorTertiary); mNotificationItemView.setBackgroundWithCorners(backgroundColor, roundedCorners); mNotificationItemView.getMainView().setAccessibilityDelegate(mAccessibilityDelegate); @@ -315,9 +314,8 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra addView(item); } } - int backgroundColor = ContextCompat.getColor(getContext(), mNotificationItemView == null - ? R.color.popup_background_color - : R.color.popup_header_background_color); + int backgroundColor = Themes.getAttrColor(mLauncher, mNotificationItemView == null + ? R.attr.popupColorPrimary : R.attr.popupColorSecondary); mShortcutsItemView.setBackgroundWithCorners(backgroundColor, shortcutsItemRoundedCorners); } @@ -544,7 +542,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra // since the latter expects the arrow which hasn't been added yet. PopupItemView itemAttachedToArrow = (PopupItemView) (getChildAt(mIsAboveIcon ? getChildCount() - 1 : 0)); - arrowPaint.setColor(ContextCompat.getColor(mLauncher, R.color.popup_background_color)); + arrowPaint.setColor(Themes.getAttrColor(mLauncher, R.attr.popupColorPrimary)); // The corner path effect won't be reflected in the shadow, but shouldn't be noticeable. int radius = getResources().getDimensionPixelSize(R.dimen.popup_arrow_corner_radius); arrowPaint.setPathEffect(new CornerPathEffect(radius)); @@ -671,8 +669,7 @@ public class PopupContainerWithArrow extends AbstractFloatingView implements Dra removeNotification.playSequentially(hideArrow, showArrow); removeNotification.start(); if (mShortcutsItemView != null) { - int backgroundColor = ContextCompat.getColor(getContext(), - R.color.popup_background_color); + int backgroundColor = Themes.getAttrColor(mLauncher, R.attr.popupColorPrimary); // With notifications gone, all corners of shortcuts item should be rounded. mShortcutsItemView.setBackgroundWithCorners(backgroundColor, ROUNDED_TOP_CORNERS | ROUNDED_BOTTOM_CORNERS); From bd867a3d3e3f5f9709c0fd813dfbd025a74df2f3 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Tue, 6 Jun 2017 16:35:33 -0700 Subject: [PATCH 134/446] Don't use CharSequence as notification text If a notification changes the color etc. on the CharSequence, then it overrode our colors. Gmail for instance always makes the second text dark (apparently), overriding our dark theme. Change-Id: Ibd8751d70849fd10fd0114af02d382aba1771d4e --- .../launcher3/notification/NotificationMainView.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/notification/NotificationMainView.java b/src/com/android/launcher3/notification/NotificationMainView.java index 0d6da77ee1..9b8dd648f6 100644 --- a/src/com/android/launcher3/notification/NotificationMainView.java +++ b/src/com/android/launcher3/notification/NotificationMainView.java @@ -87,11 +87,11 @@ public class NotificationMainView extends FrameLayout implements SwipeHelper.Cal CharSequence title = mNotificationInfo.title; CharSequence text = mNotificationInfo.text; if (!TextUtils.isEmpty(title) && !TextUtils.isEmpty(text)) { - mTitleView.setText(title); - mTextView.setText(text); + mTitleView.setText(title.toString()); + mTextView.setText(text.toString()); } else { mTitleView.setMaxLines(2); - mTitleView.setText(TextUtils.isEmpty(title) ? text : title); + mTitleView.setText(TextUtils.isEmpty(title) ? text.toString() : title.toString()); mTextView.setVisibility(GONE); } iconView.setBackground(mNotificationInfo.getIconForBackground(getContext(), From 966d901af0fd319aa2b62d6abccc5ac728e68423 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 6 Jun 2017 16:43:59 -0700 Subject: [PATCH 135/446] Removing QsbBlockerView > Removing workspace state change listener. State change happens with hardware layer, so children should not be calling invalidatge() during the animation > Moving QSB inside the QSB and removing a floating layout Bug: 37616877 Change-Id: I9af3522a05dafa5796586bb64f512d98688caf79 --- res/layout-land/launcher.xml | 6 - res/layout-port/launcher.xml | 4 - res/layout-sw720dp/launcher.xml | 4 - res/layout/qsb_blocker_view.xml | 20 --- res/values/config.xml | 3 - src/com/android/launcher3/DeviceProfile.java | 8 -- src/com/android/launcher3/Launcher.java | 9 +- .../launcher3/PinchAnimationManager.java | 9 +- src/com/android/launcher3/Workspace.java | 90 +------------ .../WorkspaceStateTransitionAnimation.java | 21 ---- .../android/launcher3/qsb/QsbBlockerView.java | 93 -------------- .../util/MultiStateAlphaController.java | 119 ------------------ 12 files changed, 8 insertions(+), 378 deletions(-) delete mode 100644 res/layout/qsb_blocker_view.xml delete mode 100644 src/com/android/launcher3/qsb/QsbBlockerView.java delete mode 100644 src/com/android/launcher3/util/MultiStateAlphaController.java diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml index 1e82f22761..4e09ef953d 100644 --- a/res/layout-land/launcher.xml +++ b/res/layout-land/launcher.xml @@ -67,12 +67,6 @@ android:layout_height="@dimen/dynamic_grid_page_indicator_height" android:layout_gravity="bottom|left"/> - - - - - - - - - \ No newline at end of file diff --git a/res/values/config.xml b/res/values/config.xml index 6df556b8df..d2272f256b 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -114,9 +114,6 @@ - - - diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 508fc34065..9bb56d6030 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -532,14 +532,6 @@ public class DeviceProfile { workspacePadding.bottom); workspace.setPageSpacing(getWorkspacePageSpacing()); - // Only display when enabled - if (FeatureFlags.QSB_ON_FIRST_SCREEN) { - View qsbContainer = launcher.getQsbContainer(); - lp = (FrameLayout.LayoutParams) qsbContainer.getLayoutParams(); - lp.topMargin = mInsets.top + workspacePadding.top; - qsbContainer.setLayoutParams(lp); - } - // Layout the hotseat Hotseat hotseat = (Hotseat) launcher.findViewById(R.id.hotseat); lp = (FrameLayout.LayoutParams) hotseat.getLayoutParams(); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 909853e06c..d23badc582 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -224,7 +224,6 @@ public class Launcher extends BaseActivity private View mLauncherView; @Thunk DragLayer mDragLayer; private DragController mDragController; - private View mQsbContainer; public View mWeightWatcher; @@ -1278,9 +1277,7 @@ public class Launcher extends BaseActivity private void setupViews() { mDragLayer = (DragLayer) findViewById(R.id.drag_layer); mFocusHandler = mDragLayer.getFocusIndicatorHelper(); - mWorkspace = (Workspace) mDragLayer.findViewById(R.id.workspace); - mQsbContainer = mDragLayer.findViewById(mDeviceProfile.isVerticalBarLayout() - ? R.id.workspace_blocked_row : R.id.qsb_container); + mWorkspace = mDragLayer.findViewById(R.id.workspace); mWorkspace.initParentViews(mDragLayer); mLauncherView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN @@ -1667,10 +1664,6 @@ public class Launcher extends BaseActivity return mWorkspace; } - public View getQsbContainer() { - return mQsbContainer; - } - public Hotseat getHotseat() { return mHotseat; } diff --git a/src/com/android/launcher3/PinchAnimationManager.java b/src/com/android/launcher3/PinchAnimationManager.java index f8196e5f6d..c3d3bb3dfa 100644 --- a/src/com/android/launcher3/PinchAnimationManager.java +++ b/src/com/android/launcher3/PinchAnimationManager.java @@ -56,11 +56,10 @@ public class PinchAnimationManager { private static final LinearInterpolator INTERPOLATOR = new LinearInterpolator(); private static final int INDEX_HOTSEAT = 0; - private static final int INDEX_QSB = 1; - private static final int INDEX_OVERVIEW_PANEL_BUTTONS = 2; - private static final int INDEX_SCRIM = 3; + private static final int INDEX_OVERVIEW_PANEL_BUTTONS = 1; + private static final int INDEX_SCRIM = 2; - private final Animator[] mAnimators = new Animator[4]; + private final Animator[] mAnimators = new Animator[3]; private Launcher mLauncher; private Workspace mWorkspace; @@ -196,8 +195,6 @@ public class PinchAnimationManager { private void animateHotseatAndQsb(boolean show) { startAnimator(INDEX_HOTSEAT, mWorkspace.createHotseatAlphaAnimator(show ? 1 : 0), THRESHOLD_ANIM_DURATION); - startAnimator(INDEX_QSB, mWorkspace.mQsbAlphaController.animateAlphaAtIndex( - show ? 1 : 0, Workspace.QSB_ALPHA_INDEX_STATE_CHANGE), THRESHOLD_ANIM_DURATION); } private void animateOverviewPanelButtons(boolean show) { diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index ea4a662d38..ce92c8eb07 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -80,7 +80,6 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.LongArrayMap; -import com.android.launcher3.util.MultiStateAlphaController; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.VerticalFlingDetector; @@ -234,14 +233,6 @@ public class Workspace extends PagedView */ private float[] mHotseatAlpha = new float[] {1, 1, 1}; - public static final int QSB_ALPHA_INDEX_STATE_CHANGE = 0; - public static final int QSB_ALPHA_INDEX_Y_TRANSLATION = 1; - public static final int QSB_ALPHA_INDEX_PAGE_SCROLL = 2; - public static final int QSB_ALPHA_INDEX_OVERLAY_SCROLL = 3; - - - MultiStateAlphaController mQsbAlphaController; - @ViewDebug.ExportedProperty(category = "launcher") private State mState = State.NORMAL; private boolean mIsSwitchingState = false; @@ -323,7 +314,6 @@ public class Workspace extends PagedView private WorkspaceStateTransitionAnimation mStateTransitionAnimation; private AccessibilityDelegate mPagesAccessibilityDelegate; - private OnStateChangeListener mOnStateChangeListener; /** * Used to inflate the Workspace from XML. @@ -378,10 +368,6 @@ public class Workspace extends PagedView } } - public void setOnStateChangeListener(OnStateChangeListener listener) { - mOnStateChangeListener = listener; - } - /** * Estimates the size of an item using spans: hSpan, vSpan. * @@ -536,7 +522,6 @@ public class Workspace extends PagedView public void initParentViews(View parent) { super.initParentViews(parent); mPageIndicator.setAccessibilityDelegate(new OverviewAccessibilityDelegate()); - mQsbAlphaController = new MultiStateAlphaController(mLauncher.getQsbContainer(), 4); } private int getDefaultPage() { @@ -576,11 +561,6 @@ public class Workspace extends PagedView return mTouchState != TOUCH_STATE_REST; } - private int getEmbeddedQsbId() { - return mLauncher.getDeviceProfile().isVerticalBarLayout() - ? R.id.qsb_container : R.id.workspace_blocked_row; - } - /** * Initializes and binds the first page * @param qsb an existing qsb to recycle or null. @@ -622,41 +602,17 @@ public class Workspace extends PagedView if (qsb == null) { // In transposed layout, we add the QSB in the Grid. As workspace does not touch the // edges, we do not need a full width QSB. - qsb = LayoutInflater.from(getContext()).inflate( - mLauncher.getDeviceProfile().isVerticalBarLayout() - ? R.layout.qsb_container : R.layout.qsb_blocker_view, - firstPage, false); + qsb = LayoutInflater.from(getContext()) + .inflate(R.layout.qsb_container,firstPage, false); } CellLayout.LayoutParams lp = new CellLayout.LayoutParams(0, 0, firstPage.getCountX(), 1); lp.canReorder = false; - if (!firstPage.addViewToCellLayout(qsb, 0, getEmbeddedQsbId(), lp, true)) { + if (!firstPage.addViewToCellLayout(qsb, 0, R.id.qsb_container, lp, true)) { Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout"); } } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - // Update the QSB to match the cell height. This is treating the QSB essentially as a child - // of workspace despite that it's not a true child. - // Note that it relies on the strict ordering of measuring the workspace before the QSB - // at the dragLayer level. - // Only measure the QSB when the view is enabled - if (FeatureFlags.QSB_ON_FIRST_SCREEN && getChildCount() > 0) { - CellLayout firstPage = (CellLayout) getChildAt(0); - int cellHeight = firstPage.getCellHeight(); - - View qsbContainer = mLauncher.getQsbContainer(); - ViewGroup.LayoutParams lp = qsbContainer.getLayoutParams(); - if (cellHeight > 0 && lp.height != cellHeight) { - lp.height = cellHeight; - qsbContainer.setLayoutParams(lp); - } - } - } - public void removeAllWorkspaceScreens() { // Disable all layout transitions before removing all pages to ensure that we don't get the // transition animations competing with us changing the scroll when we add pages or the @@ -670,7 +626,7 @@ public class Workspace extends PagedView } // Recycle the QSB widget - View qsb = findViewById(getEmbeddedQsbId()); + View qsb = findViewById(R.id.qsb_container); if (qsb != null) { ((ViewGroup) qsb.getParent()).removeView(qsb); } @@ -1406,17 +1362,9 @@ public class Workspace extends PagedView super.scrollTo(x, y); } - private void onWorkspaceOverallScrollChanged() { - if (!mIgnoreQsbScroll) { - mLauncher.getQsbContainer().setTranslationX( - mOverlayTranslation + mFirstPageScrollX - getScrollX()); - } - } - @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); - onWorkspaceOverallScrollChanged(); // Update the page indicator progress. boolean isTransitioning = mIsSwitchingState @@ -1497,9 +1445,6 @@ public class Workspace extends PagedView // device I've tried, translating the launcher causes things to get quite laggy. setWorkspaceTranslationAndAlpha(Direction.X, transX, alpha); setHotseatTranslationAndAlpha(Direction.X, transX, alpha); - onWorkspaceOverallScrollChanged(); - - mQsbAlphaController.setAlphaAtIndex(alpha, QSB_ALPHA_INDEX_OVERLAY_SCROLL); } /** @@ -1509,9 +1454,6 @@ public class Workspace extends PagedView */ public void setWorkspaceYTranslationAndAlpha(float translation, float alpha) { setWorkspaceTranslationAndAlpha(Direction.Y, translation, alpha); - - mLauncher.getQsbContainer().setTranslationY(translation); - mQsbAlphaController.setAlphaAtIndex(alpha, QSB_ALPHA_INDEX_Y_TRANSLATION); } /** @@ -1707,10 +1649,6 @@ public class Workspace extends PagedView float scrollProgress = getScrollProgress(screenCenter, child, i); float alpha = 1 - Math.abs(scrollProgress); child.getShortcutsAndWidgets().setAlpha(alpha); - - if (isQsbContainerPage(i)) { - mQsbAlphaController.setAlphaAtIndex(alpha, QSB_ALPHA_INDEX_PAGE_SCROLL); - } } } } @@ -1805,7 +1743,6 @@ public class Workspace extends PagedView } super.onLayout(changed, left, top, right, bottom); mFirstPageScrollX = getScrollForPage(0); - onWorkspaceOverallScrollChanged(); final LayoutTransition transition = getLayoutTransition(); // If the transition is running defer updating max scroll, as some empty pages could @@ -1827,7 +1764,6 @@ public class Workspace extends PagedView mIgnoreQsbScroll = false; transition.removeTransitionListener(this); mFirstPageScrollX = getScrollForPage(0); - onWorkspaceOverallScrollChanged(); } } }); @@ -2070,10 +2006,6 @@ public class Workspace extends PagedView mLauncher.notifyWidgetProvidersChanged(); } - if (mOnStateChangeListener != null) { - mOnStateChangeListener.prepareStateChange(toState, animated ? workspaceAnim : null); - } - onPrepareStateTransition(mState.hasMultipleVisiblePages); StateTransitionListener listener = new StateTransitionListener(); @@ -4230,20 +4162,6 @@ public class Workspace extends PagedView } } - public interface OnStateChangeListener { - - /** - * Called when the workspace state is changing. - * @param toState final state - * @param targetAnim animation which will be played during the transition or null. - */ - void prepareStateChange(State toState, AnimatorSet targetAnim); - } - - public static final boolean isQsbContainerPage(int pageNo) { - return pageNo == 0; - } - private class StateTransitionListener extends AnimatorListenerAdapter implements AnimatorUpdateListener { @Override diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java index 482a2c93b8..32deaf2862 100644 --- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java +++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java @@ -355,27 +355,10 @@ public class WorkspaceStateTransitionAnimation { cl.setBackgroundAlpha(finalBackgroundAlpha); cl.setShortcutAndWidgetAlpha(finalAlpha); } - - if (Workspace.isQsbContainerPage(i) && - states.stateIsNormal && mWorkspaceFadeInAdjacentScreens) { - if (animated) { - Animator anim = mWorkspace.mQsbAlphaController - .animateAlphaAtIndex(finalAlpha, Workspace.QSB_ALPHA_INDEX_PAGE_SCROLL); - anim.setDuration(duration); - anim.setInterpolator(mZoomInInterpolator); - mStateAnimator.play(anim); - } else { - mWorkspace.mQsbAlphaController.setAlphaAtIndex( - finalAlpha, Workspace.QSB_ALPHA_INDEX_PAGE_SCROLL); - } - } } final ViewGroup overviewPanel = mLauncher.getOverviewPanel(); - Animator qsbAlphaAnimation = mWorkspace.mQsbAlphaController - .animateAlphaAtIndex(finalQsbAlpha, Workspace.QSB_ALPHA_INDEX_STATE_CHANGE); - if (animated) { Animator scale = LauncherAnimUtils.ofPropertyValuesHolder(mWorkspace, new PropertyListBuilder().scale(mNewScale) @@ -393,7 +376,6 @@ public class WorkspaceStateTransitionAnimation { // For animation optimization, we may need to provide the Launcher transition // with a set of views on which to force build and manage layers in certain scenarios. layerViews.addView(overviewPanel); - layerViews.addView(mLauncher.getQsbContainer()); layerViews.addView(mLauncher.getHotseat()); layerViews.addView(mWorkspace.getPageIndicator()); @@ -407,11 +389,9 @@ public class WorkspaceStateTransitionAnimation { overviewPanelAlpha.setDuration(duration); hotseatAlpha.setDuration(duration); - qsbAlphaAnimation.setDuration(duration); mStateAnimator.play(overviewPanelAlpha); mStateAnimator.play(hotseatAlpha); - mStateAnimator.play(qsbAlphaAnimation); mStateAnimator.addListener(new AnimatorListenerAdapter() { boolean canceled = false; @Override @@ -439,7 +419,6 @@ public class WorkspaceStateTransitionAnimation { AlphaUpdateListener.updateVisibility(overviewPanel, accessibilityEnabled); mWorkspace.getPageIndicator().setShouldAutoHide(!states.stateIsSpringLoaded); - qsbAlphaAnimation.end(); mWorkspace.createHotseatAlphaAnimator(finalHotseatAlpha).end(); mWorkspace.updateCustomContentVisibility(); mWorkspace.setScaleX(mNewScale); diff --git a/src/com/android/launcher3/qsb/QsbBlockerView.java b/src/com/android/launcher3/qsb/QsbBlockerView.java deleted file mode 100644 index 5379336dea..0000000000 --- a/src/com/android/launcher3/qsb/QsbBlockerView.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.launcher3.qsb; - -import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; -import android.animation.ValueAnimator; -import android.animation.ValueAnimator.AnimatorUpdateListener; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.util.AttributeSet; -import android.view.View; - -import com.android.launcher3.Launcher; -import com.android.launcher3.Workspace; -import com.android.launcher3.Workspace.OnStateChangeListener; -import com.android.launcher3.Workspace.State; - -/** - * A simple view used to show the region blocked by QSB during drag and drop. - */ -public class QsbBlockerView extends View implements OnStateChangeListener { - - private static final int VISIBLE_ALPHA = 100; - - private final Paint mBgPaint; - - public QsbBlockerView(Context context, AttributeSet attrs) { - super(context, attrs); - - mBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mBgPaint.setColor(Color.WHITE); - mBgPaint.setAlpha(0); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - - Workspace w = Launcher.getLauncher(getContext()).getWorkspace(); - w.setOnStateChangeListener(this); - prepareStateChange(w.getState(), null); - } - - @Override - public void prepareStateChange(State toState, AnimatorSet targetAnim) { - int finalAlpha = getAlphaForState(toState); - if (targetAnim == null) { - mBgPaint.setAlpha(finalAlpha); - invalidate(); - } else { - ObjectAnimator anim = ObjectAnimator.ofArgb(mBgPaint, "alpha", finalAlpha); - anim.addUpdateListener(new AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator valueAnimator) { - invalidate(); - } - }); - targetAnim.play(anim); - } - } - - private static int getAlphaForState(State state) { - switch (state) { - case SPRING_LOADED: - case OVERVIEW: - case OVERVIEW_HIDDEN: - return VISIBLE_ALPHA; - } - return 0; - } - - @Override - protected void onDraw(Canvas canvas) { - canvas.drawPaint(mBgPaint); - } -} diff --git a/src/com/android/launcher3/util/MultiStateAlphaController.java b/src/com/android/launcher3/util/MultiStateAlphaController.java deleted file mode 100644 index 956fc9eba0..0000000000 --- a/src/com/android/launcher3/util/MultiStateAlphaController.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.launcher3.util; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ValueAnimator; -import android.animation.ValueAnimator.AnimatorUpdateListener; -import android.content.Context; -import android.view.View; -import android.view.accessibility.AccessibilityManager; - -import java.util.Arrays; - -/** - * A utility class which divides the alpha for a view across multiple states. - */ -public class MultiStateAlphaController { - - private final View mTargetView; - private final float[] mAlphas; - private final AccessibilityManager mAm; - private int mZeroAlphaListenerCount = 0; - - public MultiStateAlphaController(View view, int stateCount) { - mTargetView = view; - mAlphas = new float[stateCount]; - Arrays.fill(mAlphas, 1); - - mAm = (AccessibilityManager) view.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); - } - - public void setAlphaAtIndex(float alpha, int index) { - mAlphas[index] = alpha; - updateAlpha(); - } - - private void updateAlpha() { - // Only update the alpha if no zero-alpha animation is running. - if (mZeroAlphaListenerCount > 0) { - return; - } - float finalAlpha = 1; - for (float a : mAlphas) { - finalAlpha = finalAlpha * a; - } - mTargetView.setAlpha(finalAlpha); - mTargetView.setVisibility(finalAlpha > 0 ? View.VISIBLE - : (mAm.isEnabled() ? View.GONE : View.INVISIBLE)); - } - - /** - * Returns an animator which changes the alpha at the index {@param index} - * to {@param finalAlpha}. Alphas at other index are not affected. - */ - public Animator animateAlphaAtIndex(float finalAlpha, final int index) { - final ValueAnimator anim; - - if (Float.compare(finalAlpha, mAlphas[index]) == 0) { - // Return a dummy animator to avoid null checks. - anim = ValueAnimator.ofFloat(0, 0); - } else { - ValueAnimator animator = ValueAnimator.ofFloat(mAlphas[index], finalAlpha); - animator.addUpdateListener(new AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator valueAnimator) { - float value = (Float) valueAnimator.getAnimatedValue(); - setAlphaAtIndex(value, index); - } - }); - anim = animator; - } - - if (Float.compare(finalAlpha, 0f) == 0) { - // In case when any channel is animating to 0, and the current alpha is also 0, do not - // update alpha of the target view while the animation is running. - // We special case '0' because if any channel is set to 0, values of other - // channels do not matter. - anim.addListener(new ZeroAlphaAnimatorListener()); - } - return anim; - } - - private class ZeroAlphaAnimatorListener extends AnimatorListenerAdapter { - - private boolean mStartedAtZero = false; - - @Override - public void onAnimationStart(Animator animation) { - mStartedAtZero = Float.compare(mTargetView.getAlpha(), 0f) == 0; - if (mStartedAtZero) { - mZeroAlphaListenerCount++; - mTargetView.setAlpha(0); - } - } - - @Override - public void onAnimationEnd(Animator animation) { - if (mStartedAtZero) { - mZeroAlphaListenerCount--; - updateAlpha(); - } - } - } -} From 47ab9b1fc5a8625bc714a1def91374d762927877 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Tue, 6 Jun 2017 17:38:57 -0700 Subject: [PATCH 136/446] Generalize findContrastColor() to work for dark backgrounds Previously it assumed the background was lighter than the foreground. Bug: 62380473 Change-Id: Icd53750a2f9181890c8b9c62721d07946e115e99 --- .../launcher3/graphics/IconPalette.java | 31 +++++++++---------- .../notification/NotificationItemView.java | 2 +- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/com/android/launcher3/graphics/IconPalette.java b/src/com/android/launcher3/graphics/IconPalette.java index 60ca7b236b..750f4deec5 100644 --- a/src/com/android/launcher3/graphics/IconPalette.java +++ b/src/com/android/launcher3/graphics/IconPalette.java @@ -134,43 +134,40 @@ public class IconPalette { * This was copied from com.android.internal.util.NotificationColorUtil. */ private static int ensureTextContrast(int color, int bg) { - return findContrastColor(color, bg, true, 4.5); + return findContrastColor(color, bg, 4.5); } /** * Finds a suitable color such that there's enough contrast. * - * @param color the color to start searching from. - * @param other the color to ensure contrast against. Assumed to be lighter than {@param color} - * @param findFg if true, we assume {@param color} is a foreground, otherwise a background. + * @param fg the color to start searching from. + * @param bg the color to ensure contrast against. * @param minRatio the minimum contrast ratio required. * @return a color with the same hue as {@param color}, potentially darkened to meet the * contrast ratio. * * This was copied from com.android.internal.util.NotificationColorUtil. */ - private static int findContrastColor(int color, int other, boolean findFg, double minRatio) { - int fg = findFg ? color : other; - int bg = findFg ? other : color; + private static int findContrastColor(int fg, int bg, double minRatio) { if (ColorUtils.calculateContrast(fg, bg) >= minRatio) { - return color; + return fg; } double[] lab = new double[3]; - ColorUtils.colorToLAB(findFg ? fg : bg, lab); + ColorUtils.colorToLAB(bg, lab); + double bgL = lab[0]; + ColorUtils.colorToLAB(fg, lab); + double fgL = lab[0]; + boolean isBgDark = bgL < 50; - double low = 0, high = lab[0]; + double low = isBgDark ? fgL : 0, high = isBgDark ? 100 : fgL; final double a = lab[1], b = lab[2]; for (int i = 0; i < 15 && high - low > 0.00001; i++) { final double l = (low + high) / 2; - if (findFg) { - fg = ColorUtils.LABToColor(l, a, b); - } else { - bg = ColorUtils.LABToColor(l, a, b); - } + fg = ColorUtils.LABToColor(l, a, b); if (ColorUtils.calculateContrast(fg, bg) > minRatio) { - low = l; + if (isBgDark) high = l; else low = l; } else { - high = l; + if (isBgDark) low = l; else high = l; } } return ColorUtils.LABToColor(low, a, b); diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java index 20707aa67e..cc81b11216 100644 --- a/src/com/android/launcher3/notification/NotificationItemView.java +++ b/src/com/android/launcher3/notification/NotificationItemView.java @@ -99,7 +99,7 @@ public class NotificationItemView extends PopupItemView implements LogContainerP if (mNotificationHeaderTextColor == Notification.COLOR_DEFAULT) { mNotificationHeaderTextColor = IconPalette.resolveContrastColor(getContext(), palette.dominantColor, - Themes.getAttrColor(getContext(), R.attr.popupColorSecondary)); + Themes.getAttrColor(getContext(), R.attr.popupColorPrimary)); } mHeaderCount.setTextColor(mNotificationHeaderTextColor); } From d9a2187621b933922dbebe91dbe7d70983d72436 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 7 Jun 2017 10:39:17 -0700 Subject: [PATCH 137/446] Adding tint support for shadow drawable. Bug: 37616877 Change-Id: I2ce8d82143238422bccabfa5191ef95e936a713d --- res/values/attrs.xml | 1 + .../launcher3/graphics/ShadowDrawable.java | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/res/values/attrs.xml b/res/values/attrs.xml index b85ba3e6f1..1799b093e5 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -122,5 +122,6 @@ + diff --git a/src/com/android/launcher3/graphics/ShadowDrawable.java b/src/com/android/launcher3/graphics/ShadowDrawable.java index 5f4fc6cc71..45c1b6afb4 100644 --- a/src/com/android/launcher3/graphics/ShadowDrawable.java +++ b/src/com/android/launcher3/graphics/ShadowDrawable.java @@ -16,6 +16,8 @@ package com.android.launcher3.graphics; +import android.annotation.TargetApi; +import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; @@ -26,7 +28,9 @@ import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.os.Build; import android.util.AttributeSet; import com.android.launcher3.R; @@ -40,6 +44,7 @@ import java.io.IOException; /** * A drawable which adds shadow around a child drawable. */ +@TargetApi(Build.VERSION_CODES.O) public class ShadowDrawable extends Drawable { private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); @@ -99,6 +104,24 @@ public class ShadowDrawable extends Drawable { return mState.mIntrinsicWidth; } + @Override + public boolean canApplyTheme() { + return mState.canApplyTheme(); + } + + @Override + public void applyTheme(Resources.Theme t) { + if (mState.canApplyTheme()) { + // Workaround since ColorStateList does not expose applyTheme method + ColorDrawable cd = new ColorDrawable(); + cd.setTintList(mState.mTintColor); + cd.applyTheme(t); + + mState.mLastDrawnBitmap = null; + invalidateSelf(); + } + } + private void regenerateBitmapCache() { Bitmap bitmap = Bitmap.createBitmap(mState.mIntrinsicWidth, mState.mIntrinsicHeight, Bitmap.Config.ARGB_8888); @@ -109,6 +132,9 @@ public class ShadowDrawable extends Drawable { d.setBounds(mState.mShadowSize, mState.mShadowSize, mState.mIntrinsicWidth - mState.mShadowSize, mState.mIntrinsicHeight - mState.mShadowSize); + if (mState.mTintColor != null) { + d.setTint(mState.mTintColor.getDefaultColor()); + } d.draw(canvas); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); @@ -146,6 +172,7 @@ public class ShadowDrawable extends Drawable { R.styleable.ShadowDrawable_android_shadowColor, Color.BLACK); mState.mShadowSize = a.getDimensionPixelSize( R.styleable.ShadowDrawable_android_elevation, 0); + mState.mTintColor = a.getColorStateList(R.styleable.ShadowDrawable_android_tint); mState.mIntrinsicHeight = d.getIntrinsicHeight() + 2 * mState.mShadowSize; mState.mIntrinsicWidth = d.getIntrinsicWidth() + 2 * mState.mShadowSize; @@ -165,6 +192,7 @@ public class ShadowDrawable extends Drawable { int mShadowColor; int mShadowSize; + ColorStateList mTintColor; Bitmap mLastDrawnBitmap; ConstantState mChildState; @@ -178,5 +206,10 @@ public class ShadowDrawable extends Drawable { public int getChangingConfigurations() { return mChangingConfigurations; } + + @Override + public boolean canApplyTheme() { + return mTintColor != null; + } } } From 75de76f917370e814f53500e0e4f2b4c640e69e1 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 7 Jun 2017 13:17:19 -0700 Subject: [PATCH 138/446] Fix bug where physics appears not to run in all apps. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ie. When scrolling up from the bottom, the animation will immediately start since the last visible item condition is true — and by the time it reaches the top the spring is done moving. Bug: 38349031 Change-Id: I344deef47c50b33405345dd3a137ccdb12aeae02 --- .../launcher3/allapps/AllAppsContainerView.java | 10 ++++++---- .../android/launcher3/anim/SpringAnimationHandler.java | 5 +++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index a399d748a9..f1616fc09f 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -20,7 +20,6 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.InsetDrawable; -import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Selection; @@ -426,8 +425,11 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - if (mScrollState == RecyclerView.SCROLL_STATE_DRAGGING) { - mSpringAnimationHandler.skipToEnd(); + if (mScrollState == RecyclerView.SCROLL_STATE_DRAGGING + || (dx == 0 && dy == 0)) { + if (mSpringAnimationHandler.isRunning()){ + mSpringAnimationHandler.skipToEnd(); + } return; } @@ -436,7 +438,7 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc // We only show the spring animation when at the top or bottom, so we wait until the // first or last row is visible to ensure that all animations run in sync. - if (first == 0 || last >= mAdapter.getItemCount() - mAdapter.getNumAppsPerRow()) { + if ((first == 0 && dy < 0) || (last == mAdapter.getItemCount() - 1 && dy > 0)) { mSpringAnimationHandler.animateToFinalPosition(0); } } diff --git a/src/com/android/launcher3/anim/SpringAnimationHandler.java b/src/com/android/launcher3/anim/SpringAnimationHandler.java index 488657c36d..6a5e3514a1 100644 --- a/src/com/android/launcher3/anim/SpringAnimationHandler.java +++ b/src/com/android/launcher3/anim/SpringAnimationHandler.java @@ -138,6 +138,11 @@ public class SpringAnimationHandler { reset(); } + public boolean isRunning() { + // All the animations run at the same time so we can just check the first one. + return !mAnimations.isEmpty() && mAnimations.get(0).isRunning(); + } + public void skipToEnd() { if (DEBUG) Log.d(TAG, "setStartVelocity#skipToEnd"); if (DEBUG) Log.v(TAG, "setStartVelocity#skipToEnd", new Exception()); From 9e4c359054dbc774e38179887519079bc4c4b25b Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 7 Jun 2017 14:05:08 -0700 Subject: [PATCH 139/446] Adding utility method to temporarily hide scrollbar Bug: 37616877 Change-Id: I286493746c44ace8958ffd8df24317125b445cf7 --- src/com/android/launcher3/BaseRecyclerView.java | 16 ++++++++++++++-- .../launcher3/allapps/AllAppsRecyclerView.java | 4 ++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/BaseRecyclerView.java b/src/com/android/launcher3/BaseRecyclerView.java index 1e6d894850..514cc07511 100644 --- a/src/com/android/launcher3/BaseRecyclerView.java +++ b/src/com/android/launcher3/BaseRecyclerView.java @@ -48,6 +48,8 @@ public abstract class BaseRecyclerView extends RecyclerView private int mDownY; private int mLastY; + private boolean mScrollBarVisible = true; + public BaseRecyclerView(Context context) { this(context, null); } @@ -199,8 +201,18 @@ public abstract class BaseRecyclerView extends RecyclerView @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); - onUpdateScrollbar(0); - mScrollbar.draw(canvas); + if (mScrollBarVisible) { + onUpdateScrollbar(0); + mScrollbar.draw(canvas); + } + } + + /** + * Sets the scrollbar visibility. The call does not refresh the UI, its the responsibility + * of the caller to call {@link #invalidate()}. + */ + public void setScrollBarVisible(boolean visible) { + mScrollBarVisible = visible; } /** diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index d76abccd3b..b2a74ff157 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -97,6 +97,10 @@ public class AllAppsRecyclerView extends BaseRecyclerView { mFastScrollHelper = new AllAppsFastScrollHelper(this, apps); } + public AlphabeticalAppsList getApps() { + return mApps; + } + /** * Sets the number of apps per row in this recycler view. */ From a69369450281376cb207be554199bb4895843eb2 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Wed, 31 May 2017 14:48:19 -0700 Subject: [PATCH 140/446] Dark color on super light wallpaper support Change-Id: I0fdfa9abefb72e06c45b1f635ac97e2acfa97f05 --- res/layout-land/launcher.xml | 2 +- res/layout-port/launcher.xml | 2 +- res/layout-sw720dp/launcher.xml | 2 +- res/layout/overview_panel.xml | 9 ++++--- res/values-sw720dp/styles.xml | 6 ++++- res/values/attrs.xml | 10 +++++++- res/values/styles.xml | 25 ++++++++++++++++--- src/com/android/launcher3/BubbleTextView.java | 13 ++++++---- src/com/android/launcher3/Launcher.java | 11 ++++++-- .../allapps/AllAppsTransitionController.java | 6 +++-- .../launcher3/dragndrop/DragLayer.java | 4 ++- .../dynamicui/WallpaperColorInfo.java | 6 +++++ .../pageindicators/CaretDrawable.java | 2 +- src/com/android/launcher3/util/Themes.java | 8 ++++++ 14 files changed, 83 insertions(+), 23 deletions(-) diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml index 4e09ef953d..2e03576728 100644 --- a/res/layout-land/launcher.xml +++ b/res/layout-land/launcher.xml @@ -27,7 +27,7 @@ android:id="@+id/drag_layer" android:clipChildren="false" android:clipToPadding="false" - android:background="@drawable/workspace_bg" + android:background="?attr/workspaceStatusBarScrim" android:importantForAccessibility="no" android:layout_width="match_parent" android:layout_height="match_parent"> diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml index 0f88698f04..93c90780bb 100644 --- a/res/layout-port/launcher.xml +++ b/res/layout-port/launcher.xml @@ -29,7 +29,7 @@ android:clipChildren="false" android:importantForAccessibility="no" android:clipToPadding="false" - android:background="@drawable/workspace_bg" + android:background="?attr/workspaceStatusBarScrim" android:layout_width="match_parent" android:layout_height="match_parent"> diff --git a/res/layout-sw720dp/launcher.xml b/res/layout-sw720dp/launcher.xml index b9b94b6b01..ca4d846f17 100644 --- a/res/layout-sw720dp/launcher.xml +++ b/res/layout-sw720dp/launcher.xml @@ -28,7 +28,7 @@ android:clipChildren="false" android:clipToPadding="false" android:importantForAccessibility="no" - android:background="@drawable/workspace_bg" + android:background="?attr/workspaceStatusBarScrim" android:layout_width="match_parent" android:layout_height="match_parent"> diff --git a/res/layout/overview_panel.xml b/res/layout/overview_panel.xml index 78a0f15967..d1ac56c505 100644 --- a/res/layout/overview_panel.xml +++ b/res/layout/overview_panel.xml @@ -32,12 +32,13 @@ android:layout_weight="1" android:drawablePadding="4dp" android:drawableTop="@drawable/ic_wallpaper" + android:drawableTint="?attr/workspaceTextColor" android:fontFamily="sans-serif-condensed" android:gravity="center_horizontal" android:stateListAnimator="@animator/overview_button_anim" android:text="@string/wallpaper_button_text" android:textAllCaps="true" - android:textColor="@android:color/white" + android:textColor="?attr/workspaceTextColor" android:textSize="12sp" /> \ No newline at end of file diff --git a/res/values-sw720dp/styles.xml b/res/values-sw720dp/styles.xml index 168afec4bb..0c060ea0d4 100644 --- a/res/values-sw720dp/styles.xml +++ b/res/values-sw720dp/styles.xml @@ -31,7 +31,11 @@ #FFF #F5F5F5 #E0E0E0 - false + false + false + ?android:textColorPrimary + #22000000 + #44000000 diff --git a/res/values/attrs.xml b/res/values/attrs.xml index b85ba3e6f1..3f6f506c92 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -23,7 +23,13 @@ - + + + + + + + @@ -39,6 +45,8 @@ + + #E0E0E0 - false + false + false + ?android:textColorPrimary + #B0000000 + #22000000 + #44000000 + @drawable/workspace_bg + + - diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 1f7eba812e..ea1ee9e6d3 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -51,6 +51,7 @@ import com.android.launcher3.graphics.HolographicOutlineHelper; import com.android.launcher3.graphics.IconPalette; import com.android.launcher3.graphics.PreloadIconDrawable; import com.android.launcher3.model.PackageItemInfo; +import com.android.launcher3.util.Themes; import java.text.NumberFormat; @@ -65,8 +66,6 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { private static final float AMBIENT_SHADOW_RADIUS = 2.5f; private static final float KEY_SHADOW_RADIUS = 1f; private static final float KEY_SHADOW_OFFSET = 0.5f; - private static final int AMBIENT_SHADOW_COLOR = 0x33000000; - private static final int KEY_SHADOW_COLOR = 0x66000000; private static final int DISPLAY_WORKSPACE = 0; private static final int DISPLAY_ALL_APPS = 1; @@ -82,6 +81,8 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { private final CheckLongPressHelper mLongPressHelper; private final HolographicOutlineHelper mOutlineHelper; private final StylusEventHelper mStylusEventHelper; + private final int mAmbientShadowColor; + private final int mKeyShadowColor; private boolean mBackgroundSizeChanged; @@ -147,6 +148,8 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { mLayoutHorizontal = a.getBoolean(R.styleable.BubbleTextView_layoutHorizontal, false); mDeferShadowGenerationOnTouch = a.getBoolean(R.styleable.BubbleTextView_deferShadowGeneration, false); + mAmbientShadowColor = a.getColor(R.styleable.BubbleTextView_ambientShadowColor, 0x33000000); + mKeyShadowColor = a.getColor(R.styleable.BubbleTextView_keyShadowColor, 0x66000000); int display = a.getInteger(R.styleable.BubbleTextView_iconDisplay, DISPLAY_WORKSPACE); int defaultIconSize = grid.iconSizePx; @@ -174,7 +177,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { // Set shadow layer as the larger shadow to that the textView does not clip the shadow. float density = getResources().getDisplayMetrics().density; - setShadowLayer(density * AMBIENT_SHADOW_RADIUS, 0, 0, AMBIENT_SHADOW_COLOR); + setShadowLayer(density * AMBIENT_SHADOW_RADIUS, 0, 0, mAmbientShadowColor); } else { mBackground = null; } @@ -435,14 +438,14 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { // We enhance the shadow by drawing the shadow twice float density = getResources().getDisplayMetrics().density; - getPaint().setShadowLayer(density * AMBIENT_SHADOW_RADIUS, 0, 0, AMBIENT_SHADOW_COLOR); + getPaint().setShadowLayer(density * AMBIENT_SHADOW_RADIUS, 0, 0, mAmbientShadowColor); super.draw(canvas); canvas.save(Canvas.CLIP_SAVE_FLAG); canvas.clipRect(getScrollX(), getScrollY() + getExtendedPaddingTop(), getScrollX() + getWidth(), getScrollY() + getHeight(), Region.Op.INTERSECT); getPaint().setShadowLayer( - density * KEY_SHADOW_RADIUS, 0.0f, density * KEY_SHADOW_OFFSET, KEY_SHADOW_COLOR); + density * KEY_SHADOW_RADIUS, 0.0f, density * KEY_SHADOW_OFFSET, mKeyShadowColor); super.draw(canvas); canvas.restore(); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index d23badc582..62cf2b3c4d 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -127,6 +127,7 @@ import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.PendingRequestArgs; import com.android.launcher3.util.TestingUtils; +import com.android.launcher3.util.Themes; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.ViewOnDrawExecutor; import com.android.launcher3.widget.PendingAddShortcutInfo; @@ -368,7 +369,7 @@ public class Launcher extends BaseActivity WallpaperColorInfo wallpaperColorInfo = WallpaperColorInfo.getInstance(this); wallpaperColorInfo.setOnThemeChangeListener(this); - overrideTheme(wallpaperColorInfo.isDark()); + overrideTheme(wallpaperColorInfo.isDark(), wallpaperColorInfo.supportsDarkText()); super.onCreate(savedInstanceState); @@ -466,6 +467,10 @@ public class Launcher extends BaseActivity if (mLauncherCallbacks != null) { mLauncherCallbacks.onCreate(savedInstanceState); } + + if (Themes.getAttrBoolean(this, R.attr.isWorkspaceDarkText)) { + activateLightSystemBars(true, true, true); + } } @Override @@ -473,9 +478,11 @@ public class Launcher extends BaseActivity recreate(); } - protected void overrideTheme(boolean isDark) { + protected void overrideTheme(boolean isDark, boolean supportsDarkText) { if (isDark) { setTheme(R.style.LauncherThemeDark); + } else if (supportsDarkText) { + setTheme(R.style.LauncherThemeDarkText); } } diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index ba20135be6..d79b0d19d2 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -71,6 +71,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul private final VerticalPullDetector mDetector; private final ArgbEvaluator mEvaluator; private final boolean mIsDarkTheme; + private final boolean mIsWorkspaceDarkText; // Animation in this class is controlled by a single variable {@link mProgress}. // Visually, it represents top y coordinate of the all apps container if multiplied with @@ -112,7 +113,8 @@ public class AllAppsTransitionController implements TouchController, VerticalPul mEvaluator = new ArgbEvaluator(); mAllAppsBackgroundColor = Themes.getAttrColor(l, android.R.attr.colorPrimary); - mIsDarkTheme = Themes.getAttrBoolean(mLauncher, R.attr.isPrimaryColorDark); + mIsDarkTheme = Themes.getAttrBoolean(mLauncher, R.attr.isMainColorDark); + mIsWorkspaceDarkText = Themes.getAttrBoolean(mLauncher, R.attr.isWorkspaceDarkText); } @Override @@ -281,7 +283,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul private void updateLightStatusBar(float shift) { // Do not modify status bar in dark theme or on landscape as all apps is not full bleed. - if (mIsDarkTheme || (!FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS + if (mIsDarkTheme || mIsWorkspaceDarkText || (!FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS && mLauncher.getDeviceProfile().isVerticalBarLayout())) { return; } diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index 7178c5e8d8..ed81f90756 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -58,6 +58,7 @@ import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.logging.LoggerUtils; +import com.android.launcher3.util.Themes; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.TouchController; import com.android.launcher3.widget.WidgetsBottomSheet; @@ -451,7 +452,8 @@ public class DragLayer extends InsettableFrameLayout { @Override public void setInsets(Rect insets) { super.setInsets(insets); - setBackgroundResource(insets.top == 0 ? 0 : R.drawable.workspace_bg); + setBackground(insets.top == 0 ? null + : Themes.getAttrDrawable(getContext(), R.attr.workspaceStatusBarScrim)); } @Override diff --git a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java b/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java index ca85b6af1b..7470118e6c 100644 --- a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java +++ b/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java @@ -33,6 +33,7 @@ public class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChange private int mMainColor; private int mSecondaryColor; private boolean mIsDark; + private boolean mSupportsDarkText; private OnThemeChangeListener mOnThemeChangeListener; private WallpaperColorInfo(Context context) { @@ -54,6 +55,10 @@ public class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChange return mIsDark; } + public boolean supportsDarkText() { + return mSupportsDarkText; + } + @Override public void onColorsChanged(WallpaperColorsCompat colors, int which) { if (which == FLAG_SYSTEM) { @@ -72,6 +77,7 @@ public class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChange mMainColor = FALLBACK_COLOR; mSecondaryColor = FALLBACK_COLOR; } + mSupportsDarkText = wallpaperColors != null ? wallpaperColors.supportsDarkText() : false; float[] hsl = new float[3]; ColorUtils.colorToHSL(mMainColor, hsl); mIsDark = hsl[2] < 0.2f; diff --git a/src/com/android/launcher3/pageindicators/CaretDrawable.java b/src/com/android/launcher3/pageindicators/CaretDrawable.java index 416b2f0b5c..c5abfe35ef 100644 --- a/src/com/android/launcher3/pageindicators/CaretDrawable.java +++ b/src/com/android/launcher3/pageindicators/CaretDrawable.java @@ -45,7 +45,7 @@ public class CaretDrawable extends Drawable { final int strokeWidth = res.getDimensionPixelSize(R.dimen.all_apps_caret_stroke_width); final int shadowSpread = res.getDimensionPixelSize(R.dimen.all_apps_caret_shadow_spread); - mCaretPaint.setColor(Themes.getAttrColor(context, android.R.attr.textColorPrimary)); + mCaretPaint.setColor(Themes.getAttrColor(context, R.attr.workspaceTextColor)); mCaretPaint.setAntiAlias(true); mCaretPaint.setStrokeWidth(strokeWidth); mCaretPaint.setStyle(Paint.Style.STROKE); diff --git a/src/com/android/launcher3/util/Themes.java b/src/com/android/launcher3/util/Themes.java index 9cf45b0c7f..89597b9ede 100644 --- a/src/com/android/launcher3/util/Themes.java +++ b/src/com/android/launcher3/util/Themes.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.ColorMatrix; +import android.graphics.drawable.Drawable; /** * Various utility methods associated with theming. @@ -44,6 +45,13 @@ public class Themes { return value; } + public static Drawable getAttrDrawable(Context context, int attr) { + TypedArray ta = context.obtainStyledAttributes(new int[]{attr}); + Drawable value = ta.getDrawable(0); + ta.recycle(); + return value; + } + /** * Returns the alpha corresponding to the theme attribute {@param attr}, in the range [0, 255]. */ From 5c83e7cdc5f4d0406a5e564971871e1f694fddfc Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 6 Jun 2017 15:41:21 -0700 Subject: [PATCH 141/446] Refactor and generalize SpringAnimationHandler. SpringAnimationHandler is only responsible for motion tracking and updating the list of springs it is handling. Spring initialization and updates are handled by the AnimationFactory interface. This is done in preparation for future CLs where SpringAnimationHandler will be used in more cases. Bug: 38349031 Change-Id: I5ebce710cc05e4e88b708ceea5d2cfefbd0eb3d0 --- res/values/config.xml | 3 + .../allapps/AllAppsContainerView.java | 5 +- .../launcher3/allapps/AllAppsGridAdapter.java | 146 ++++++++++++-- .../anim/SpringAnimationHandler.java | 188 +++++++----------- 4 files changed, 212 insertions(+), 130 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index d2272f256b..db1a75da91 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -64,6 +64,9 @@ 50 + + + diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index f1616fc09f..c3df07360e 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -91,9 +91,8 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mLauncher = Launcher.getLauncher(context); mApps = new AlphabeticalAppsList(context); - mSpringAnimationHandler = new SpringAnimationHandler(SpringAnimationHandler.Y_DIRECTION); - mAdapter = new AllAppsGridAdapter(mLauncher, mApps, mLauncher, this, - mSpringAnimationHandler); + mAdapter = new AllAppsGridAdapter(mLauncher, mApps, mLauncher, this); + mSpringAnimationHandler = mAdapter.getSpringAnimationHandler(); mApps.setAdapter(mAdapter); mLayoutManager = mAdapter.getLayoutManager(); mSearchQueryBuilder = new SpannableStringBuilder(); diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java index d3d23ca249..9c7372f2ca 100644 --- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java +++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java @@ -19,6 +19,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Point; +import android.support.animation.DynamicAnimation; import android.support.animation.SpringAnimation; import android.support.v4.view.accessibility.AccessibilityEventCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; @@ -38,6 +39,7 @@ import com.android.launcher3.AppInfo; import com.android.launcher3.BubbleTextView; import com.android.launcher3.Launcher; import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.allapps.AlphabeticalAppsList.AdapterItem; import com.android.launcher3.anim.SpringAnimationHandler; import com.android.launcher3.config.FeatureFlags; @@ -96,11 +98,6 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter mSpringAnimationHandler; public AllAppsGridAdapter(Launcher launcher, AlphabeticalAppsList apps, View.OnClickListener - iconClickListener, View.OnLongClickListener iconLongClickListener, - SpringAnimationHandler springAnimationHandler) { + iconClickListener, View.OnLongClickListener iconLongClickListener) { Resources res = launcher.getResources(); mLauncher = launcher; mApps = apps; @@ -228,7 +224,14 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter( + SpringAnimationHandler.Y_DIRECTION, new AllAppsSpringAnimationFactory()); + } + } + + public SpringAnimationHandler getSpringAnimationHandler() { + return mSpringAnimationHandler; } public static boolean isDividerViewType(int viewType) { @@ -292,8 +295,7 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter { + private static final float DEFAULT_MAX_VALUE_PX = 100; + private static final float DEFAULT_MIN_VALUE_PX = -DEFAULT_MAX_VALUE_PX; + + // Damping ratio range is [0, 1] + private static final float SPRING_DAMPING_RATIO = 0.55f; + + // Stiffness is a non-negative number. + private static final float MIN_SPRING_STIFFNESS = 580f; + private static final float MAX_SPRING_STIFFNESS = 900f; + + // The amount by which each adjacent rows' stiffness will differ. + private static final float ROW_STIFFNESS_COEFFICIENT = 50f; + + @Override + public SpringAnimation initialize(ViewHolder vh) { + return SpringAnimationHandler.forView(vh.itemView, DynamicAnimation.TRANSLATION_Y, 0); + } + + /** + * @param spring A new or recycled SpringAnimation. + * @param vh The ViewHolder that {@param spring} is related to. + */ + @Override + public void update(SpringAnimation spring, ViewHolder vh) { + int numPredictedApps = Math.min(mAppsPerRow, mApps.getPredictedApps().size()); + int appPosition = getAppPosition(vh.getAdapterPosition(), numPredictedApps, + mAppsPerRow); + + int col = appPosition % mAppsPerRow; + int row = appPosition / mAppsPerRow; + + int numTotalRows = mApps.getNumAppRows() - 1; // zero-based count + if (row > (numTotalRows / 2)) { + // Mirror the rows so that the top row acts the same as the bottom row. + row = Math.abs(numTotalRows - row); + } + + // We manipulate the stiffness, min, and max values based on the items distance to the + // first row and the items distance to the center column to create the ^-shaped motion + // effect. + float rowFactor = (1 + row) * 0.5f; + float colFactor = getColumnFactor(col, mAppsPerRow); + + float minValue = DEFAULT_MIN_VALUE_PX * (rowFactor + colFactor); + float maxValue = DEFAULT_MAX_VALUE_PX * (rowFactor + colFactor); + + float stiffness = Utilities.boundToRange( + MAX_SPRING_STIFFNESS - (row * ROW_STIFFNESS_COEFFICIENT), + MIN_SPRING_STIFFNESS, + MAX_SPRING_STIFFNESS); + + spring.setMinValue(minValue) + .setMaxValue(maxValue) + .getSpring() + .setStiffness(stiffness) + .setDampingRatio(SPRING_DAMPING_RATIO); + } + + /** + * @return The app position is the position of the app in the Adapter if we ignored all + * other view types. + * + * The first app is at position 0, and the first app each following row is at a + * position that is a multiple of {@param appsPerRow}. + * + * ie. If there are 5 apps per row, and there are two rows of apps: + * 0 1 2 3 4 + * 5 6 7 8 9 + */ + private int getAppPosition(int position, int numPredictedApps, int appsPerRow) { + int appPosition = position; + int numDividerViews = 1 + (numPredictedApps == 0 ? 0 : 1); + + int allAppsStartAt = numDividerViews + numPredictedApps; + if (numDividerViews == 1 || position < allAppsStartAt) { + appPosition -= 1; + } else { + // We cannot assume that the predicted row will always be full. + int numPredictedAppsOffset = appsPerRow - numPredictedApps; + appPosition = position + numPredictedAppsOffset - numDividerViews; + } + + return appPosition; + } + + /** + * Increase the column factor as the distance increases between the column and the center + * column(s). + */ + private float getColumnFactor(int col, int numCols) { + float centerColumn = numCols / 2; + int distanceToCenter = (int) Math.abs(col - centerColumn); + + boolean evenNumberOfColumns = numCols % 2 == 0; + if (evenNumberOfColumns && col < centerColumn) { + distanceToCenter -= 1; + } + + float factor = 0; + while (distanceToCenter > 0) { + if (distanceToCenter == 1) { + factor += 0.2f; + } else { + factor += 0.1f; + } + --distanceToCenter; + } + + return factor; + } + } } diff --git a/src/com/android/launcher3/anim/SpringAnimationHandler.java b/src/com/android/launcher3/anim/SpringAnimationHandler.java index 6a5e3514a1..038f82682c 100644 --- a/src/com/android/launcher3/anim/SpringAnimationHandler.java +++ b/src/com/android/launcher3/anim/SpringAnimationHandler.java @@ -15,7 +15,7 @@ */ package com.android.launcher3.anim; -import android.support.animation.DynamicAnimation; +import android.support.animation.FloatPropertyCompat; import android.support.animation.SpringAnimation; import android.support.animation.SpringForce; import android.support.annotation.IntDef; @@ -24,8 +24,7 @@ import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; -import com.android.launcher3.Utilities; -import com.android.launcher3.allapps.AlphabeticalAppsList; +import com.android.launcher3.R; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -35,77 +34,67 @@ import java.util.ArrayList; * Handler class that manages springs for a set of views that should all move based on the same * {@link MotionEvent}s. * - * Supports using physics for X or Y translations. + * Supports setting either X or Y velocity on the list of springs added to this handler. */ -public class SpringAnimationHandler { +public class SpringAnimationHandler { private static final String TAG = "SpringAnimationHandler"; private static final boolean DEBUG = false; - private static final float DEFAULT_MAX_VALUE = 100; - private static final float DEFAULT_MIN_VALUE = -DEFAULT_MAX_VALUE; - - private static final float SPRING_DAMPING_RATIO = 0.55f; - private static final float MIN_SPRING_STIFFNESS = 580f; - private static final float MAX_SPRING_STIFFNESS = 900f; + private static final float VELOCITY_DAMPING_FACTOR = 0.175f; @Retention(RetentionPolicy.SOURCE) @IntDef({Y_DIRECTION, X_DIRECTION}) public @interface Direction {} public static final int Y_DIRECTION = 0; public static final int X_DIRECTION = 1; - private int mDirection; + private int mVelocityDirection; private VelocityTracker mVelocityTracker; private float mCurrentVelocity = 0; private boolean mShouldComputeVelocity = false; + private AnimationFactory mAnimationFactory; + private ArrayList mAnimations = new ArrayList<>(); - public SpringAnimationHandler(@Direction int direction) { - mDirection = direction; - mVelocityTracker = VelocityTracker.obtain(); + /** + * @param direction Either {@link #X_DIRECTION} or {@link #Y_DIRECTION}. + * Determines which direction we use to calculate and set the velocity. + * @param factory The AnimationFactory is responsible for initializing and updating the + * SpringAnimations added to this class. + */ + public SpringAnimationHandler(@Direction int direction, AnimationFactory factory) { + mVelocityDirection = direction; + mAnimationFactory = factory; } - public SpringAnimation add(View view, int position, AlphabeticalAppsList apps, int appsPerRow, - SpringAnimation recycle) { - int numPredictedApps = Math.min(appsPerRow, apps.getPredictedApps().size()); - int appPosition = getAppPosition(position, numPredictedApps, appsPerRow); - - int col = appPosition % appsPerRow; - int row = appPosition / appsPerRow; - - int numTotalRows = apps.getNumAppRows() - 1; // zero offset - if (row > (numTotalRows / 2)) { - // Mirror the rows so that the top row acts the same as the bottom row. - row = Math.abs(numTotalRows - row); + /** + * Adds a new or recycled animation to the list of springs handled by this class. + * + * @param view The view the spring is attached to. + * @param object Used to initialize and update the spring. + */ + public void add(View view, T object) { + SpringAnimation spring = (SpringAnimation) view.getTag(R.id.spring_animation_tag); + if (spring == null) { + spring = mAnimationFactory.initialize(object); + view.setTag(R.id.spring_animation_tag, spring); } - - // We manipulate the stiffness, min, and max values based on the items distance to the first - // row and the items distance to the center column to create the ^-shaped motion effect. - float rowFactor = (1 + row) * 0.5f; - float colFactor = getColumnFactor(col, appsPerRow); - - float minValue = DEFAULT_MIN_VALUE * (rowFactor + colFactor); - float maxValue = DEFAULT_MAX_VALUE * (rowFactor + colFactor); - - float stiffness = Utilities.boundToRange(MAX_SPRING_STIFFNESS - (row * 50f), - MIN_SPRING_STIFFNESS, MAX_SPRING_STIFFNESS); - - SpringAnimation animation = (recycle != null ? recycle : createSpringAnimation(view)) - .setStartVelocity(mCurrentVelocity) - .setMinValue(minValue) - .setMaxValue(maxValue); - animation.getSpring().setStiffness(stiffness); - - mAnimations.add(animation); - return animation; + mAnimationFactory.update(spring, object); + spring.setStartVelocity(mCurrentVelocity); + mAnimations.add(spring); } - public SpringAnimation remove(SpringAnimation animation) { - animation.skipToEnd(); + /** + * Stops and removes the spring attached to {@param view}. + */ + public void remove(View view) { + SpringAnimation animation = (SpringAnimation) view.getTag(R.id.spring_animation_tag); + if (animation.canSkipToEnd()) { + animation.skipToEnd(); + } mAnimations.remove(animation); - return animation; } public void addMovement(MotionEvent event) { @@ -149,7 +138,9 @@ public class SpringAnimationHandler { int size = mAnimations.size(); for (int i = 0; i < size; ++i) { - mAnimations.get(i).skipToEnd(); + if (mAnimations.get(i).canSkipToEnd()) { + mAnimations.get(i).skipToEnd(); + } } } @@ -169,78 +160,19 @@ public class SpringAnimationHandler { } private void computeVelocity() { - getVelocityTracker().computeCurrentVelocity(175); + getVelocityTracker().computeCurrentVelocity(1000 /* millis */); mCurrentVelocity = isVerticalDirection() ? getVelocityTracker().getYVelocity() : getVelocityTracker().getXVelocity(); + mCurrentVelocity *= VELOCITY_DAMPING_FACTOR; mShouldComputeVelocity = false; if (DEBUG) Log.d(TAG, "computeVelocity=" + mCurrentVelocity); } private boolean isVerticalDirection() { - return mDirection == Y_DIRECTION; - } - - private SpringAnimation createSpringAnimation(View view) { - DynamicAnimation.ViewProperty property = isVerticalDirection() - ? DynamicAnimation.TRANSLATION_Y - : DynamicAnimation.TRANSLATION_X; - - return new SpringAnimation(view, property, 0) - .setStartValue(1f) - .setSpring(new SpringForce(0) - .setDampingRatio(SPRING_DAMPING_RATIO)); - } - - /** - * @return The app position is the position of the app in the Adapter if we ignored all other - * view types. - * - * ie. The first predicted app is at position 0, and the first app of all apps is - * at {@param appsPerRow}. - */ - private int getAppPosition(int position, int numPredictedApps, int appsPerRow) { - int appPosition = position; - int numDividerViews = 1 + (numPredictedApps == 0 ? 0 : 1); - - int allAppsStartAt = numDividerViews + numPredictedApps; - if (numDividerViews == 1 || position < allAppsStartAt) { - appPosition -= 1; - } else { - // We cannot assume that the predicted row will always be full. - int numPredictedAppsOffset = appsPerRow - numPredictedApps; - appPosition = position + numPredictedAppsOffset - numDividerViews; - } - - return appPosition; - } - - /** - * Increase the column factor as the distance increases between the column and the center - * column(s). - */ - private float getColumnFactor(int col, int numCols) { - float centerColumn = numCols / 2; - int distanceToCenter = (int) Math.abs(col - centerColumn); - - boolean evenNumberOfColumns = numCols % 2 == 0; - if (evenNumberOfColumns && col < centerColumn) { - distanceToCenter -= 1; - } - - float factor = 0; - while (distanceToCenter > 0) { - if (distanceToCenter == 1) { - factor += 0.2f; - } else { - factor += 0.1f; - } - --distanceToCenter; - } - - return factor; + return mVelocityDirection == Y_DIRECTION; } private VelocityTracker getVelocityTracker() { @@ -249,4 +181,34 @@ public class SpringAnimationHandler { } return mVelocityTracker; } + + /** + * This interface is used to initialize and update the SpringAnimations added to the + * {@link SpringAnimationHandler}. + * + * @param The object that each SpringAnimation is attached to. + */ + public interface AnimationFactory { + + /** + * Initializes a new Spring for {@param object}. + */ + SpringAnimation initialize(T object); + + /** + * Updates the value of {@param spring} based on {@param object}. + */ + void update(SpringAnimation spring, T object); + } + + /** + * Helper method to create a new SpringAnimation for {@param view}. + */ + public static SpringAnimation forView(View view, FloatPropertyCompat property, float finalPos) { + SpringAnimation spring = new SpringAnimation(view, property, finalPos); + spring.setStartValue(1f); + spring.setSpring(new SpringForce(finalPos)); + return spring; + } + } From e86f11fa386e5cc3ee81bd72771fc22750a35f03 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 6 Jun 2017 14:33:18 -0700 Subject: [PATCH 142/446] Adding support for loading workspace in the absence of Launcher. > LoadWorkspace can be called with a LoaderResult which does not bind anything. > Synchronous bind does not look for a valid page id, and will fallback to the current pageId similar to full load flow Bug: 37616877 Change-Id: If14491dc79c5b85ae1019cc93e4e08759df3387d --- src/com/android/launcher3/LauncherModel.java | 99 ++++++------------- .../model/AddWorkspaceItemsTask.java | 2 +- ...odelTask.java => BaseModelUpdateTask.java} | 68 ++++++++++++- .../launcher3/model/CacheDataUpdatedTask.java | 2 +- .../launcher3/model/LoaderResults.java | 13 ++- .../android/launcher3/model/LoaderTask.java | 9 +- .../model/PackageInstallStateChangedTask.java | 2 +- .../launcher3/model/PackageUpdatedTask.java | 4 +- .../launcher3/model/ShortcutsChangedTask.java | 2 +- .../model/UserLockStateChangedTask.java | 2 +- .../model/BaseModelUpdateTaskTestCase.java | 19 ++-- 11 files changed, 125 insertions(+), 97 deletions(-) rename src/com/android/launcher3/model/{ExtendedModelTask.java => BaseModelUpdateTask.java} (53%) diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 48c5c562c3..82bee0e4c6 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -42,7 +42,7 @@ import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.model.AddWorkspaceItemsTask; import com.android.launcher3.model.BgDataModel; import com.android.launcher3.model.CacheDataUpdatedTask; -import com.android.launcher3.model.ExtendedModelTask; +import com.android.launcher3.model.BaseModelUpdateTask; import com.android.launcher3.model.LoaderResults; import com.android.launcher3.model.LoaderTask; import com.android.launcher3.model.ModelWriter; @@ -80,7 +80,6 @@ import java.util.concurrent.Executor; */ public class LauncherModel extends BroadcastReceiver implements LauncherAppsCompat.OnAppsChangedCallbackCompat { - static final boolean DEBUG_TASKS = false; private static final boolean DEBUG_RECEIVER = false; static final String TAG = "Launcher.Model"; @@ -425,7 +424,7 @@ public class LauncherModel extends BroadcastReceiver public void forceReload() { synchronized (mLock) { // Stop any existing loaders first, so they don't set mModelLoaded to true later - stopLoaderLocked(); + stopLoader(); mModelLoaded = false; } @@ -451,16 +450,6 @@ public class LauncherModel extends BroadcastReceiver } } - /** - * If there is already a loader task running, tell it to stop. - */ - private void stopLoaderLocked() { - LoaderTask oldTask = mLoaderTask; - if (oldTask != null) { - oldTask.stopLocked(); - } - } - public boolean isCurrentCallbacks(Callbacks callbacks) { return (mCallbacks != null && mCallbacks.get() == callbacks); } @@ -484,12 +473,10 @@ public class LauncherModel extends BroadcastReceiver }); // If there is already one running, tell it to stop. - stopLoaderLocked(); + stopLoader(); LoaderResults loaderResults = new LoaderResults(mApp, sBgDataModel, mBgAllAppsList, synchronousBindPage, mCallbacks); - if (synchronousBindPage != PagedView.INVALID_RESTORE_PAGE - && mModelLoaded && !mIsLoaderTaskRunning) { - + if (mModelLoaded && !mIsLoaderTaskRunning) { // Divide the set of loaded items into those that we are binding synchronously, // and everything else that is to be bound normally (asynchronously). loaderResults.bindWorkspace(); @@ -500,22 +487,34 @@ public class LauncherModel extends BroadcastReceiver loaderResults.bindWidgets(); return true; } else { - mLoaderTask = new LoaderTask(mApp, mBgAllAppsList, sBgDataModel, loaderResults); - sWorker.post(mLoaderTask); + startLoaderForResults(loaderResults); } } } return false; } + /** + * If there is already a loader task running, tell it to stop. + */ public void stopLoader() { synchronized (mLock) { - if (mLoaderTask != null) { - mLoaderTask.stopLocked(); + LoaderTask oldTask = mLoaderTask; + mLoaderTask = null; + if (oldTask != null) { + oldTask.stopLocked(); } } } + public void startLoaderForResults(LoaderResults results) { + synchronized (mLock) { + stopLoader(); + mLoaderTask = new LoaderTask(mApp, mBgAllAppsList, sBgDataModel, results); + runOnWorkerThread(mLoaderTask); + } + } + /** * Loads the workspace screen ids in an ordered list. */ @@ -529,7 +528,7 @@ public class LauncherModel extends BroadcastReceiver } public void onInstallSessionCreated(final PackageInstallInfo sessionInfo) { - enqueueModelUpdateTask(new ExtendedModelTask() { + enqueueModelUpdateTask(new BaseModelUpdateTask() { @Override public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { apps.addPromiseApp(app.getContext(), sessionInfo); @@ -607,8 +606,8 @@ public class LauncherModel extends BroadcastReceiver CacheDataUpdatedTask.OP_CACHE_UPDATE, user, updatedPackages)); } - public void enqueueModelUpdateTask(BaseModelUpdateTask task) { - task.init(this); + public void enqueueModelUpdateTask(ModelUpdateTask task) { + task.init(mApp, this, sBgDataModel, mBgAllAppsList, mUiExecutor); runOnWorkerThread(task); } @@ -624,54 +623,14 @@ public class LauncherModel extends BroadcastReceiver /** * A runnable which changes/updates the data model of the launcher based on certain events. */ - public static abstract class BaseModelUpdateTask implements Runnable { - - private LauncherModel mModel; - private Executor mUiExecutor; - - /* package private */ - void init(LauncherModel model) { - mModel = model; - mUiExecutor = mModel.mUiExecutor; - } - - @Override - public final void run() { - if (!mModel.mModelLoaded) { - if (DEBUG_TASKS) { - Log.d(TAG, "Ignoring model task since loader is pending=" + this); - } - // Loader has not yet run. - return; - } - execute(mModel.mApp, sBgDataModel, mModel.mBgAllAppsList); - } + public interface ModelUpdateTask extends Runnable { /** - * Execute the actual task. Called on the worker thread. + * Called before the task is posted to initialize the internal state. */ - public abstract void execute( - LauncherAppState app, BgDataModel dataModel, AllAppsList apps); + void init(LauncherAppState app, LauncherModel model, + BgDataModel dataModel, AllAppsList allAppsList, Executor uiExecutor); - /** - * Schedules a {@param task} to be executed on the current callbacks. - */ - public final void scheduleCallbackTask(final CallbackTask task) { - final Callbacks callbacks = mModel.getCallback(); - mUiExecutor.execute(new Runnable() { - public void run() { - Callbacks cb = mModel.getCallback(); - if (callbacks == cb && cb != null) { - task.execute(callbacks); - } - } - }); - } - - public ModelWriter getModelWriter() { - // Updates from model task, do not deal with icon position in hotseat. - return mModel.getWriter(false /* hasVerticalHotseat */); - } } public void updateAndBindShortcutInfo(final ShortcutInfo si, final ShortcutInfoCompat info) { @@ -689,7 +648,7 @@ public class LauncherModel extends BroadcastReceiver * Utility method to update a shortcut on the background thread. */ public void updateAndBindShortcutInfo(final Provider shortcutProvider) { - enqueueModelUpdateTask(new ExtendedModelTask() { + enqueueModelUpdateTask(new BaseModelUpdateTask() { @Override public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { ShortcutInfo info = shortcutProvider.get(); @@ -701,7 +660,7 @@ public class LauncherModel extends BroadcastReceiver } public void refreshAndBindWidgetsAndShortcuts(@Nullable final PackageUserKey packageUser) { - enqueueModelUpdateTask(new ExtendedModelTask() { + enqueueModelUpdateTask(new BaseModelUpdateTask() { @Override public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { dataModel.widgetsModel.update(app, packageUser); diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index 2e8e15bf7b..b27ccfd017 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -47,7 +47,7 @@ import java.util.List; /** * Task to add auto-created workspace items. */ -public class AddWorkspaceItemsTask extends ExtendedModelTask { +public class AddWorkspaceItemsTask extends BaseModelUpdateTask { private final Provider>> mAppsProvider; diff --git a/src/com/android/launcher3/model/ExtendedModelTask.java b/src/com/android/launcher3/model/BaseModelUpdateTask.java similarity index 53% rename from src/com/android/launcher3/model/ExtendedModelTask.java rename to src/com/android/launcher3/model/BaseModelUpdateTask.java index 080aaf54b0..9b4510fcae 100644 --- a/src/com/android/launcher3/model/ExtendedModelTask.java +++ b/src/com/android/launcher3/model/BaseModelUpdateTask.java @@ -16,8 +16,12 @@ package com.android.launcher3.model; import android.os.UserHandle; +import android.util.Log; -import com.android.launcher3.LauncherModel.BaseModelUpdateTask; +import com.android.launcher3.AllAppsList; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherModel; +import com.android.launcher3.LauncherModel.ModelUpdateTask; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.ShortcutInfo; @@ -25,11 +29,69 @@ import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.MultiHashMap; import java.util.ArrayList; +import java.util.concurrent.Executor; /** - * Extension of {@link BaseModelUpdateTask} with some utility methods + * Extension of {@link ModelUpdateTask} with some utility methods */ -public abstract class ExtendedModelTask extends BaseModelUpdateTask { +public abstract class BaseModelUpdateTask implements ModelUpdateTask { + + private static final boolean DEBUG_TASKS = false; + private static final String TAG = "BaseModelUpdateTask"; + + private LauncherAppState mApp; + private LauncherModel mModel; + private BgDataModel mDataModel; + private AllAppsList mAllAppsList; + private Executor mUiExecutor; + + public void init(LauncherAppState app, LauncherModel model, + BgDataModel dataModel, AllAppsList allAppsList, Executor uiExecutor) { + mApp = app; + mModel = model; + mDataModel = dataModel; + mAllAppsList = allAppsList; + mUiExecutor = uiExecutor; + } + + @Override + public final void run() { + if (!mModel.isModelLoaded()) { + if (DEBUG_TASKS) { + Log.d(TAG, "Ignoring model task since loader is pending=" + this); + } + // Loader has not yet run. + return; + } + execute(mApp, mDataModel, mAllAppsList); + } + + /** + * Execute the actual task. Called on the worker thread. + */ + public abstract void execute( + LauncherAppState app, BgDataModel dataModel, AllAppsList apps); + + /** + * Schedules a {@param task} to be executed on the current callbacks. + */ + public final void scheduleCallbackTask(final CallbackTask task) { + final Callbacks callbacks = mModel.getCallback(); + mUiExecutor.execute(new Runnable() { + public void run() { + Callbacks cb = mModel.getCallback(); + if (callbacks == cb && cb != null) { + task.execute(callbacks); + } + } + }); + } + + public ModelWriter getModelWriter() { + // Updates from model task, do not deal with icon position in hotseat. + return mModel.getWriter(false /* hasVerticalHotseat */); + } + public void bindUpdatedShortcuts( ArrayList updatedShortcuts, UserHandle user) { diff --git a/src/com/android/launcher3/model/CacheDataUpdatedTask.java b/src/com/android/launcher3/model/CacheDataUpdatedTask.java index d7cece4884..8597e10486 100644 --- a/src/com/android/launcher3/model/CacheDataUpdatedTask.java +++ b/src/com/android/launcher3/model/CacheDataUpdatedTask.java @@ -34,7 +34,7 @@ import java.util.HashSet; /** * Handles changes due to cache updates. */ -public class CacheDataUpdatedTask extends ExtendedModelTask { +public class CacheDataUpdatedTask extends BaseModelUpdateTask { public static final int OP_CACHE_UPDATE = 1; public static final int OP_SESSION_UPDATE = 2; diff --git a/src/com/android/launcher3/model/LoaderResults.java b/src/com/android/launcher3/model/LoaderResults.java index 28df64d39d..0df8b6fee2 100644 --- a/src/com/android/launcher3/model/LoaderResults.java +++ b/src/com/android/launcher3/model/LoaderResults.java @@ -16,6 +16,7 @@ package com.android.launcher3.model; +import android.os.Looper; import android.util.Log; import com.android.launcher3.AllAppsList; @@ -32,6 +33,7 @@ import com.android.launcher3.PagedView; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.LooperIdleLock; import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.ViewOnDrawExecutor; @@ -45,7 +47,7 @@ import java.util.Set; import java.util.concurrent.Executor; /** - * Helper class to handle results of {@link com.android.launcher3.LauncherModel.LoaderTask}. + * Helper class to handle results of {@link com.android.launcher3.model.LoaderTask}. */ public class LoaderResults { @@ -389,4 +391,13 @@ public class LoaderResults { }; mUiExecutor.execute(r); } + + public LooperIdleLock newIdleLock(Object lock) { + LooperIdleLock idleLock = new LooperIdleLock(lock, Looper.getMainLooper()); + // If we are not binding, there is no reason to wait for idle. + if (mCallbacks.get() == null) { + idleLock.queueIdle(); + } + return idleLock; + } } diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index bcf516eed8..b24d68251a 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -116,11 +116,11 @@ public class LoaderTask implements Runnable { mIconCache = mApp.getIconCache(); } - private synchronized void waitForIdle() { + protected synchronized void waitForIdle() { // Wait until the either we're stopped or the other threads are done. // This way we don't start loading all apps until the workspace has settled // down. - LooperIdleLock idleLock = new LooperIdleLock(this, Looper.getMainLooper()); + LooperIdleLock idleLock = mResults.newIdleLock(this); // Just in case mFlushingWorkerThread changes but we aren't woken up, // wait no longer than 1sec at a time while (!mStopped && idleLock.awaitLocked(1000)); @@ -202,7 +202,10 @@ public class LoaderTask implements Runnable { transaction.commit(); } catch (CancellationException e) { - // Loader stopped, ignore + // Loader stopped, ignore + if (DEBUG_LOADERS) { + Log.d(TAG, "Loader cancelled", e); + } } } diff --git a/src/com/android/launcher3/model/PackageInstallStateChangedTask.java b/src/com/android/launcher3/model/PackageInstallStateChangedTask.java index 76b90a8e20..1e0af6881b 100644 --- a/src/com/android/launcher3/model/PackageInstallStateChangedTask.java +++ b/src/com/android/launcher3/model/PackageInstallStateChangedTask.java @@ -35,7 +35,7 @@ import java.util.HashSet; /** * Handles changes due to a sessions updates for a currently installing app. */ -public class PackageInstallStateChangedTask extends ExtendedModelTask { +public class PackageInstallStateChangedTask extends BaseModelUpdateTask { private final PackageInstallInfo mInstallInfo; diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 46fea218fc..a237b3e7e1 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -30,7 +30,6 @@ import com.android.launcher3.InstallShortcutReceiver; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; -import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; @@ -44,7 +43,6 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.ItemInfoMatcher; -import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; @@ -58,7 +56,7 @@ import java.util.HashSet; * Handles updates due to changes in package manager (app installed/updated/removed) * or when a user availability changes. */ -public class PackageUpdatedTask extends ExtendedModelTask { +public class PackageUpdatedTask extends BaseModelUpdateTask { private static final boolean DEBUG = false; private static final String TAG = "PackageUpdatedTask"; diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index 47e83e5b95..6f325858d7 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -34,7 +34,7 @@ import java.util.List; /** * Handles changes due to shortcut manager updates (deep shortcut changes) */ -public class ShortcutsChangedTask extends ExtendedModelTask { +public class ShortcutsChangedTask extends BaseModelUpdateTask { private final String mPackageName; private final List mShortcuts; diff --git a/src/com/android/launcher3/model/UserLockStateChangedTask.java b/src/com/android/launcher3/model/UserLockStateChangedTask.java index fefed75524..5682006461 100644 --- a/src/com/android/launcher3/model/UserLockStateChangedTask.java +++ b/src/com/android/launcher3/model/UserLockStateChangedTask.java @@ -38,7 +38,7 @@ import java.util.List; /** * Task to handle changing of lock state of the user */ -public class UserLockStateChangedTask extends ExtendedModelTask { +public class UserLockStateChangedTask extends BaseModelUpdateTask { private final UserHandle mUser; diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index 13e09869fb..3d03507eab 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -21,7 +21,7 @@ import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; -import com.android.launcher3.LauncherModel.BaseModelUpdateTask; +import com.android.launcher3.LauncherModel.ModelUpdateTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherProvider; import com.android.launcher3.util.ComponentKey; @@ -75,8 +75,10 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2 executeTaskForTest(BaseModelUpdateTask task) throws Exception { - LauncherModel mockModel = mock(LauncherModel.class); - when(mockModel.getCallback()).thenReturn(callbacks); - - Field f = BaseModelUpdateTask.class.getDeclaredField("mModel"); - f.setAccessible(true); - f.set(task, mockModel); + public List executeTaskForTest(ModelUpdateTask task) throws Exception { + when(model.isModelLoaded()).thenReturn(true); Executor mockExecutor = mock(Executor.class); - f = BaseModelUpdateTask.class.getDeclaredField("mUiExecutor"); - f.setAccessible(true); - f.set(task, mockExecutor); - task.execute(appState, bgDataModel, allAppsList); + task.init(appState, model, bgDataModel, allAppsList, mockExecutor); + task.run(); ArgumentCaptor captor = ArgumentCaptor.forClass(Runnable.class); verify(mockExecutor, atLeast(0)).execute(captor.capture()); From 54ba601a99cd8cecc2750e305275c40ac2bfba8b Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Thu, 8 Jun 2017 10:53:53 -0700 Subject: [PATCH 143/446] Dark text support for caret, drop target text and cell layout drop outline Change-Id: I1bcad657b6e49be6fa93cafe9d8ae304604be34d --- res/layout/drop_target_bar_vert.xml | 5 +---- res/values-sw720dp/styles.xml | 2 +- res/values/styles.xml | 4 ++-- src/com/android/launcher3/CellLayout.java | 2 +- .../android/launcher3/pageindicators/CaretDrawable.java | 7 +++++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/res/layout/drop_target_bar_vert.xml b/res/layout/drop_target_bar_vert.xml index e2a65d4a55..2394d0d138 100644 --- a/res/layout/drop_target_bar_vert.xml +++ b/res/layout/drop_target_bar_vert.xml @@ -32,8 +32,7 @@ android:gravity="center" android:paddingLeft="@dimen/vert_drop_target_horizontal_gap" android:paddingRight="@dimen/vert_drop_target_horizontal_gap" - android:id="@+id/delete_target_text" - android:textColor="@android:color/white" /> + android:id="@+id/delete_target_text" />
\ No newline at end of file diff --git a/res/values-sw720dp/styles.xml b/res/values-sw720dp/styles.xml index 0c060ea0d4..5cfe84ffc4 100644 --- a/res/values-sw720dp/styles.xml +++ b/res/values-sw720dp/styles.xml @@ -42,7 +42,7 @@ From 1d7ff6fdb766d6228fe0897199ce0af38c4469f5 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 9 Jun 2017 11:24:28 -0700 Subject: [PATCH 155/446] Making some constants accessible Change-Id: Id5caff8defe8ccc4a79e1c99b0040abb1750b3e1 --- src/com/android/launcher3/graphics/ShadowGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/graphics/ShadowGenerator.java b/src/com/android/launcher3/graphics/ShadowGenerator.java index 37fb4ecb01..9ea11a7b21 100644 --- a/src/com/android/launcher3/graphics/ShadowGenerator.java +++ b/src/com/android/launcher3/graphics/ShadowGenerator.java @@ -40,7 +40,7 @@ public class ShadowGenerator { public static final float BLUR_FACTOR = 0.5f/48; // Percent of actual icon size - private static final float KEY_SHADOW_DISTANCE = 1f/48; + public static final float KEY_SHADOW_DISTANCE = 1f/48; private static final int KEY_SHADOW_ALPHA = 61; private static final int AMBIENT_SHADOW_ALPHA = 30; From 20ecc54ebd2913f1e6a8d156be9ae0f8ca874a37 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Fri, 9 Jun 2017 15:03:56 -0700 Subject: [PATCH 156/446] Replace use of java.util.HashMap with android.util.ArrayMap in AnimationLayerSet. Change-Id: I8563d17d97ff36c2b07f73ecb73b0a355780355e Bug: 62466540 --- src/com/android/launcher3/anim/AnimationLayerSet.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/anim/AnimationLayerSet.java b/src/com/android/launcher3/anim/AnimationLayerSet.java index 14bcd17183..f0b34587a2 100644 --- a/src/com/android/launcher3/anim/AnimationLayerSet.java +++ b/src/com/android/launcher3/anim/AnimationLayerSet.java @@ -18,9 +18,8 @@ package com.android.launcher3.anim; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.util.ArrayMap; import android.view.View; - -import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -29,14 +28,14 @@ import java.util.Map; */ public class AnimationLayerSet extends AnimatorListenerAdapter { - private final HashMap mViewsToLayerTypeMap; + private final ArrayMap mViewsToLayerTypeMap; public AnimationLayerSet() { - mViewsToLayerTypeMap = new HashMap<>(); + mViewsToLayerTypeMap = new ArrayMap<>(); } public AnimationLayerSet(View v) { - mViewsToLayerTypeMap = new HashMap<>(1); + mViewsToLayerTypeMap = new ArrayMap<>(1); addView(v); } From 93527e2c5d1eb4eb3df856d5afe74a57506c4896 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Fri, 9 Jun 2017 14:27:03 -0700 Subject: [PATCH 157/446] Replace use of java.util.HashMap with android.support.v4.util.ArrayMap. Note: I could not use android.util.ArrayMap as it is a final class. Change-Id: I1314961885dfbaa427cb830bdbd3d1f494be63d2 Bug: 62466540 --- src/com/android/launcher3/util/MultiHashMap.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/util/MultiHashMap.java b/src/com/android/launcher3/util/MultiHashMap.java index b7275c1f76..2b2908547c 100644 --- a/src/com/android/launcher3/util/MultiHashMap.java +++ b/src/com/android/launcher3/util/MultiHashMap.java @@ -16,13 +16,13 @@ package com.android.launcher3.util; +import android.support.v4.util.ArrayMap; import java.util.ArrayList; -import java.util.HashMap; /** * A utility map from keys to an ArrayList of values. */ -public class MultiHashMap extends HashMap> { +public class MultiHashMap extends ArrayMap> { public MultiHashMap() { } From 26453a297b622011258dc6b32403ba6586f00996 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Fri, 9 Jun 2017 16:02:25 -0700 Subject: [PATCH 158/446] Replace use of java.util.HashMap with android.util.ArrayMap in AutoInstallsLayout, DefaultLayoutParser, ImportDataTask classes. Change-Id: Idcf1f5f020132ddf43751067a38a64bfc088800e Bug: 62466540 --- .../android/launcher3/AutoInstallsLayout.java | 41 +++++++++---------- .../launcher3/DefaultLayoutParser.java | 19 ++++----- .../launcher3/provider/ImportDataTask.java | 24 +++++------ 3 files changed, 38 insertions(+), 46 deletions(-) diff --git a/src/com/android/launcher3/AutoInstallsLayout.java b/src/com/android/launcher3/AutoInstallsLayout.java index 98eb208eb2..d82579bf77 100644 --- a/src/com/android/launcher3/AutoInstallsLayout.java +++ b/src/com/android/launcher3/AutoInstallsLayout.java @@ -30,23 +30,20 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Log; import android.util.Pair; import android.util.Patterns; - import com.android.launcher3.LauncherProvider.SqlArguments; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.util.Thunk; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; import java.util.Locale; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; /** * Layout parsing code for auto installs layout @@ -83,7 +80,7 @@ public class AutoInstallsLayout { // Try with grid size and hotseat count String layoutName = String.format(Locale.ENGLISH, FORMATTED_LAYOUT_RES_WITH_HOSTEAT, - (int) grid.numColumns, (int) grid.numRows, (int) grid.numHotseatIcons); + grid.numColumns, grid.numRows, grid.numHotseatIcons); int layoutId = targetRes.getIdentifier(layoutName, "xml", pkg); // Try with only grid size @@ -91,7 +88,7 @@ public class AutoInstallsLayout { Log.d(TAG, "Formatted layout: " + layoutName + " not found. Trying layout without hosteat"); layoutName = String.format(Locale.ENGLISH, FORMATTED_LAYOUT_RES, - (int) grid.numColumns, (int) grid.numRows); + grid.numColumns, grid.numRows); layoutId = targetRes.getIdentifier(layoutName, "xml", pkg); } @@ -209,7 +206,7 @@ public class AutoInstallsLayout { beginDocument(parser, mRootTag); final int depth = parser.getDepth(); int type; - HashMap tagParserMap = getLayoutElementsMap(); + ArrayMap tagParserMap = getLayoutElementsMap(); int count = 0; while (((type = parser.next()) != XmlPullParser.END_TAG || @@ -243,10 +240,10 @@ public class AutoInstallsLayout { * Parses the current node and returns the number of elements added. */ protected int parseAndAddNode( - XmlResourceParser parser, - HashMap tagParserMap, - ArrayList screenIds) - throws XmlPullParserException, IOException { + XmlResourceParser parser, + ArrayMap tagParserMap, + ArrayList screenIds) + throws XmlPullParserException, IOException { if (TAG_INCLUDE.equals(parser.getName())) { final int resId = getAttributeResourceValue(parser, ATTR_WORKSPACE, 0); @@ -303,16 +300,16 @@ public class AutoInstallsLayout { } } - protected HashMap getFolderElementsMap() { - HashMap parsers = new HashMap(); + protected ArrayMap getFolderElementsMap() { + ArrayMap parsers = new ArrayMap<>(); parsers.put(TAG_APP_ICON, new AppShortcutParser()); parsers.put(TAG_AUTO_INSTALL, new AutoInstallParser()); parsers.put(TAG_SHORTCUT, new ShortcutParser(mSourceRes)); return parsers; } - protected HashMap getLayoutElementsMap() { - HashMap parsers = new HashMap(); + protected ArrayMap getLayoutElementsMap() { + ArrayMap parsers = new ArrayMap<>(); parsers.put(TAG_APP_ICON, new AppShortcutParser()); parsers.put(TAG_AUTO_INSTALL, new AutoInstallParser()); parsers.put(TAG_FOLDER, new FolderParser()); @@ -528,13 +525,13 @@ public class AutoInstallsLayout { } protected class FolderParser implements TagParser { - private final HashMap mFolderElements; + private final ArrayMap mFolderElements; public FolderParser() { this(getFolderElementsMap()); } - public FolderParser(HashMap elements) { + public FolderParser(ArrayMap elements) { mFolderElements = elements; } @@ -561,7 +558,7 @@ public class AutoInstallsLayout { } final ContentValues myValues = new ContentValues(mValues); - ArrayList folderItems = new ArrayList(); + ArrayList folderItems = new ArrayList<>(); int type; int folderDepth = parser.getDepth(); @@ -617,7 +614,7 @@ public class AutoInstallsLayout { } } - protected static final void beginDocument(XmlPullParser parser, String firstElementName) + protected static void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException { int type; while ((type = parser.next()) != XmlPullParser.START_TAG @@ -671,7 +668,7 @@ public class AutoInstallsLayout { return value; } - public static interface LayoutParserCallback { + public interface LayoutParserCallback { long generateNewItemId(); long insertAndCheck(SQLiteDatabase db, ContentValues values); diff --git a/src/com/android/launcher3/DefaultLayoutParser.java b/src/com/android/launcher3/DefaultLayoutParser.java index 05911ab7fa..1ec30ba68d 100644 --- a/src/com/android/launcher3/DefaultLayoutParser.java +++ b/src/com/android/launcher3/DefaultLayoutParser.java @@ -13,18 +13,15 @@ import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.os.Bundle; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Log; - import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.util.Thunk; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - import java.io.IOException; import java.net.URISyntaxException; -import java.util.HashMap; import java.util.List; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; /** * Implements the layout parser with rules for internal layouts and partner layouts. @@ -55,20 +52,20 @@ public class DefaultLayoutParser extends AutoInstallsLayout { } @Override - protected HashMap getFolderElementsMap() { + protected ArrayMap getFolderElementsMap() { return getFolderElementsMap(mSourceRes); } - @Thunk HashMap getFolderElementsMap(Resources res) { - HashMap parsers = new HashMap(); + @Thunk ArrayMap getFolderElementsMap(Resources res) { + ArrayMap parsers = new ArrayMap<>(); parsers.put(TAG_FAVORITE, new AppShortcutWithUriParser()); parsers.put(TAG_SHORTCUT, new UriShortcutParser(res)); return parsers; } @Override - protected HashMap getLayoutElementsMap() { - HashMap parsers = new HashMap(); + protected ArrayMap getLayoutElementsMap() { + ArrayMap parsers = new ArrayMap<>(); parsers.put(TAG_FAVORITE, new AppShortcutWithUriParser()); parsers.put(TAG_APPWIDGET, new AppWidgetParser()); parsers.put(TAG_SHORTCUT, new UriShortcutParser(mSourceRes)); diff --git a/src/com/android/launcher3/provider/ImportDataTask.java b/src/com/android/launcher3/provider/ImportDataTask.java index 314f244170..b83d3c0cdf 100644 --- a/src/com/android/launcher3/provider/ImportDataTask.java +++ b/src/com/android/launcher3/provider/ImportDataTask.java @@ -31,9 +31,9 @@ import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.os.Process; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.LongSparseArray; import android.util.SparseBooleanArray; - import com.android.launcher3.AutoInstallsLayout.LayoutParserCallback; import com.android.launcher3.DefaultLayoutParser; import com.android.launcher3.LauncherAppState; @@ -51,10 +51,8 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.GridSizeMigrationTask; import com.android.launcher3.util.LongArrayMap; - import java.net.URISyntaxException; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; /** @@ -134,7 +132,7 @@ public class ImportDataTask { String profileId = Long.toString(UserManagerCompat.getInstance(mContext) .getSerialNumberForUser(Process.myUserHandle())); - boolean createEmptyRowOnFirstScreen = false; + boolean createEmptyRowOnFirstScreen; if (FeatureFlags.QSB_ON_FIRST_SCREEN) { try (Cursor c = mContext.getContentResolver().query(mOtherFavoritesUri, null, // get items on the first row of the first screen @@ -326,9 +324,9 @@ public class ImportDataTask { } } - private static final String getPackage(Intent intent) { + private static String getPackage(Intent intent) { return intent.getComponent() != null ? intent.getComponent().getPackageName() - : intent.getPackage(); + : intent.getPackage(); } /** @@ -378,7 +376,7 @@ public class ImportDataTask { return false; } - private static final int getMyHotseatLayoutId(Context context) { + private static int getMyHotseatLayoutId(Context context) { return LauncherAppState.getIDP(context).numHotseatIcons <= 5 ? R.xml.dw_phone_hotseat : R.xml.dw_tablet_hotseat; @@ -393,9 +391,9 @@ public class ImportDataTask { } @Override - protected HashMap getLayoutElementsMap() { + protected ArrayMap getLayoutElementsMap() { // Only allow shortcut parsers - HashMap parsers = new HashMap(); + ArrayMap parsers = new ArrayMap<>(); parsers.put(TAG_FAVORITE, new AppShortcutWithUriParser()); parsers.put(TAG_SHORTCUT, new UriShortcutParser(mSourceRes)); parsers.put(TAG_RESOLVE, new ResolveParser()); @@ -407,7 +405,7 @@ public class ImportDataTask { * {@link LayoutParserCallback} which adds items in empty hotseat spots. */ private static class HotseatParserCallback implements LayoutParserCallback { - private final HashSet mExisitingApps; + private final HashSet mExistingApps; private final LongArrayMap mExistingItems; private final ArrayList mOutOps; private final int mRequiredSize; @@ -416,7 +414,7 @@ public class ImportDataTask { HotseatParserCallback( HashSet existingApps, LongArrayMap existingItems, ArrayList outOps, int startItemId, int requiredSize) { - mExisitingApps = existingApps; + mExistingApps = existingApps; mExistingItems = existingItems; mOutOps = outOps; mRequiredSize = requiredSize; @@ -441,11 +439,11 @@ public class ImportDataTask { return 0; } String pkg = getPackage(intent); - if (pkg == null || mExisitingApps.contains(pkg)) { + if (pkg == null || mExistingApps.contains(pkg)) { // The item does not target an app or is already in hotseat. return 0; } - mExisitingApps.add(pkg); + mExistingApps.add(pkg); // find next vacant spot. long screen = 0; From 2d75266c75e8dbbabaf9e0db96c49b1005a10db2 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Fri, 9 Jun 2017 16:08:03 -0700 Subject: [PATCH 159/446] Replace use of java.util.HashMap with android.util.ArrayMap in DrawableFactory. Change-Id: I4ab7f908c3e8768762942ca83f576197dfea66d6 Bug: 62466540 --- src/com/android/launcher3/graphics/DrawableFactory.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/graphics/DrawableFactory.java b/src/com/android/launcher3/graphics/DrawableFactory.java index 60bbce4066..45344c020e 100644 --- a/src/com/android/launcher3/graphics/DrawableFactory.java +++ b/src/com/android/launcher3/graphics/DrawableFactory.java @@ -28,16 +28,14 @@ import android.graphics.drawable.Drawable; import android.os.Process; import android.os.UserHandle; import android.support.annotation.UiThread; +import android.util.ArrayMap; import android.util.Log; - import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.ItemInfo; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.allapps.AllAppsBackgroundDrawable; -import java.util.HashMap; - /** * Factory for creating new drawables. */ @@ -61,7 +59,7 @@ public class DrawableFactory { } protected final UserHandle mMyUser = Process.myUserHandle(); - protected final HashMap mUserBadges = new HashMap<>(); + protected final ArrayMap mUserBadges = new ArrayMap<>(); /** * Returns a FastBitmapDrawable with the icon. From 7886c037f87ba2274e95b160d125b02bb3928449 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Fri, 9 Jun 2017 15:03:56 -0700 Subject: [PATCH 160/446] Replace use of java.util.HashMap with android.util.ArrayMap in AnimationLayerSet. Change-Id: I8563d17d97ff36c2b07f73ecb73b0a355780355e Bug: 62466540 (cherry picked from commit 20ecc54ebd2913f1e6a8d156be9ae0f8ca874a37) --- src/com/android/launcher3/anim/AnimationLayerSet.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/anim/AnimationLayerSet.java b/src/com/android/launcher3/anim/AnimationLayerSet.java index 14bcd17183..f0b34587a2 100644 --- a/src/com/android/launcher3/anim/AnimationLayerSet.java +++ b/src/com/android/launcher3/anim/AnimationLayerSet.java @@ -18,9 +18,8 @@ package com.android.launcher3.anim; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.util.ArrayMap; import android.view.View; - -import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -29,14 +28,14 @@ import java.util.Map; */ public class AnimationLayerSet extends AnimatorListenerAdapter { - private final HashMap mViewsToLayerTypeMap; + private final ArrayMap mViewsToLayerTypeMap; public AnimationLayerSet() { - mViewsToLayerTypeMap = new HashMap<>(); + mViewsToLayerTypeMap = new ArrayMap<>(); } public AnimationLayerSet(View v) { - mViewsToLayerTypeMap = new HashMap<>(1); + mViewsToLayerTypeMap = new ArrayMap<>(1); addView(v); } From 0590a4c0cec8095dc299f1cacfe27a98f11a83b5 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Fri, 9 Jun 2017 16:02:25 -0700 Subject: [PATCH 161/446] Replace use of java.util.HashMap with android.util.ArrayMap in AutoInstallsLayout, DefaultLayoutParser, ImportDataTask classes. Change-Id: Idcf1f5f020132ddf43751067a38a64bfc088800e Bug: 62466540 (cherry picked from commit 26453a297b622011258dc6b32403ba6586f00996) --- .../android/launcher3/AutoInstallsLayout.java | 41 +++++++++---------- .../launcher3/DefaultLayoutParser.java | 19 ++++----- .../launcher3/provider/ImportDataTask.java | 24 +++++------ 3 files changed, 38 insertions(+), 46 deletions(-) diff --git a/src/com/android/launcher3/AutoInstallsLayout.java b/src/com/android/launcher3/AutoInstallsLayout.java index 98eb208eb2..d82579bf77 100644 --- a/src/com/android/launcher3/AutoInstallsLayout.java +++ b/src/com/android/launcher3/AutoInstallsLayout.java @@ -30,23 +30,20 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Log; import android.util.Pair; import android.util.Patterns; - import com.android.launcher3.LauncherProvider.SqlArguments; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.util.Thunk; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; import java.util.Locale; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; /** * Layout parsing code for auto installs layout @@ -83,7 +80,7 @@ public class AutoInstallsLayout { // Try with grid size and hotseat count String layoutName = String.format(Locale.ENGLISH, FORMATTED_LAYOUT_RES_WITH_HOSTEAT, - (int) grid.numColumns, (int) grid.numRows, (int) grid.numHotseatIcons); + grid.numColumns, grid.numRows, grid.numHotseatIcons); int layoutId = targetRes.getIdentifier(layoutName, "xml", pkg); // Try with only grid size @@ -91,7 +88,7 @@ public class AutoInstallsLayout { Log.d(TAG, "Formatted layout: " + layoutName + " not found. Trying layout without hosteat"); layoutName = String.format(Locale.ENGLISH, FORMATTED_LAYOUT_RES, - (int) grid.numColumns, (int) grid.numRows); + grid.numColumns, grid.numRows); layoutId = targetRes.getIdentifier(layoutName, "xml", pkg); } @@ -209,7 +206,7 @@ public class AutoInstallsLayout { beginDocument(parser, mRootTag); final int depth = parser.getDepth(); int type; - HashMap tagParserMap = getLayoutElementsMap(); + ArrayMap tagParserMap = getLayoutElementsMap(); int count = 0; while (((type = parser.next()) != XmlPullParser.END_TAG || @@ -243,10 +240,10 @@ public class AutoInstallsLayout { * Parses the current node and returns the number of elements added. */ protected int parseAndAddNode( - XmlResourceParser parser, - HashMap tagParserMap, - ArrayList screenIds) - throws XmlPullParserException, IOException { + XmlResourceParser parser, + ArrayMap tagParserMap, + ArrayList screenIds) + throws XmlPullParserException, IOException { if (TAG_INCLUDE.equals(parser.getName())) { final int resId = getAttributeResourceValue(parser, ATTR_WORKSPACE, 0); @@ -303,16 +300,16 @@ public class AutoInstallsLayout { } } - protected HashMap getFolderElementsMap() { - HashMap parsers = new HashMap(); + protected ArrayMap getFolderElementsMap() { + ArrayMap parsers = new ArrayMap<>(); parsers.put(TAG_APP_ICON, new AppShortcutParser()); parsers.put(TAG_AUTO_INSTALL, new AutoInstallParser()); parsers.put(TAG_SHORTCUT, new ShortcutParser(mSourceRes)); return parsers; } - protected HashMap getLayoutElementsMap() { - HashMap parsers = new HashMap(); + protected ArrayMap getLayoutElementsMap() { + ArrayMap parsers = new ArrayMap<>(); parsers.put(TAG_APP_ICON, new AppShortcutParser()); parsers.put(TAG_AUTO_INSTALL, new AutoInstallParser()); parsers.put(TAG_FOLDER, new FolderParser()); @@ -528,13 +525,13 @@ public class AutoInstallsLayout { } protected class FolderParser implements TagParser { - private final HashMap mFolderElements; + private final ArrayMap mFolderElements; public FolderParser() { this(getFolderElementsMap()); } - public FolderParser(HashMap elements) { + public FolderParser(ArrayMap elements) { mFolderElements = elements; } @@ -561,7 +558,7 @@ public class AutoInstallsLayout { } final ContentValues myValues = new ContentValues(mValues); - ArrayList folderItems = new ArrayList(); + ArrayList folderItems = new ArrayList<>(); int type; int folderDepth = parser.getDepth(); @@ -617,7 +614,7 @@ public class AutoInstallsLayout { } } - protected static final void beginDocument(XmlPullParser parser, String firstElementName) + protected static void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException { int type; while ((type = parser.next()) != XmlPullParser.START_TAG @@ -671,7 +668,7 @@ public class AutoInstallsLayout { return value; } - public static interface LayoutParserCallback { + public interface LayoutParserCallback { long generateNewItemId(); long insertAndCheck(SQLiteDatabase db, ContentValues values); diff --git a/src/com/android/launcher3/DefaultLayoutParser.java b/src/com/android/launcher3/DefaultLayoutParser.java index 05911ab7fa..1ec30ba68d 100644 --- a/src/com/android/launcher3/DefaultLayoutParser.java +++ b/src/com/android/launcher3/DefaultLayoutParser.java @@ -13,18 +13,15 @@ import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.os.Bundle; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Log; - import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.util.Thunk; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - import java.io.IOException; import java.net.URISyntaxException; -import java.util.HashMap; import java.util.List; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; /** * Implements the layout parser with rules for internal layouts and partner layouts. @@ -55,20 +52,20 @@ public class DefaultLayoutParser extends AutoInstallsLayout { } @Override - protected HashMap getFolderElementsMap() { + protected ArrayMap getFolderElementsMap() { return getFolderElementsMap(mSourceRes); } - @Thunk HashMap getFolderElementsMap(Resources res) { - HashMap parsers = new HashMap(); + @Thunk ArrayMap getFolderElementsMap(Resources res) { + ArrayMap parsers = new ArrayMap<>(); parsers.put(TAG_FAVORITE, new AppShortcutWithUriParser()); parsers.put(TAG_SHORTCUT, new UriShortcutParser(res)); return parsers; } @Override - protected HashMap getLayoutElementsMap() { - HashMap parsers = new HashMap(); + protected ArrayMap getLayoutElementsMap() { + ArrayMap parsers = new ArrayMap<>(); parsers.put(TAG_FAVORITE, new AppShortcutWithUriParser()); parsers.put(TAG_APPWIDGET, new AppWidgetParser()); parsers.put(TAG_SHORTCUT, new UriShortcutParser(mSourceRes)); diff --git a/src/com/android/launcher3/provider/ImportDataTask.java b/src/com/android/launcher3/provider/ImportDataTask.java index 314f244170..b83d3c0cdf 100644 --- a/src/com/android/launcher3/provider/ImportDataTask.java +++ b/src/com/android/launcher3/provider/ImportDataTask.java @@ -31,9 +31,9 @@ import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.os.Process; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.LongSparseArray; import android.util.SparseBooleanArray; - import com.android.launcher3.AutoInstallsLayout.LayoutParserCallback; import com.android.launcher3.DefaultLayoutParser; import com.android.launcher3.LauncherAppState; @@ -51,10 +51,8 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.GridSizeMigrationTask; import com.android.launcher3.util.LongArrayMap; - import java.net.URISyntaxException; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; /** @@ -134,7 +132,7 @@ public class ImportDataTask { String profileId = Long.toString(UserManagerCompat.getInstance(mContext) .getSerialNumberForUser(Process.myUserHandle())); - boolean createEmptyRowOnFirstScreen = false; + boolean createEmptyRowOnFirstScreen; if (FeatureFlags.QSB_ON_FIRST_SCREEN) { try (Cursor c = mContext.getContentResolver().query(mOtherFavoritesUri, null, // get items on the first row of the first screen @@ -326,9 +324,9 @@ public class ImportDataTask { } } - private static final String getPackage(Intent intent) { + private static String getPackage(Intent intent) { return intent.getComponent() != null ? intent.getComponent().getPackageName() - : intent.getPackage(); + : intent.getPackage(); } /** @@ -378,7 +376,7 @@ public class ImportDataTask { return false; } - private static final int getMyHotseatLayoutId(Context context) { + private static int getMyHotseatLayoutId(Context context) { return LauncherAppState.getIDP(context).numHotseatIcons <= 5 ? R.xml.dw_phone_hotseat : R.xml.dw_tablet_hotseat; @@ -393,9 +391,9 @@ public class ImportDataTask { } @Override - protected HashMap getLayoutElementsMap() { + protected ArrayMap getLayoutElementsMap() { // Only allow shortcut parsers - HashMap parsers = new HashMap(); + ArrayMap parsers = new ArrayMap<>(); parsers.put(TAG_FAVORITE, new AppShortcutWithUriParser()); parsers.put(TAG_SHORTCUT, new UriShortcutParser(mSourceRes)); parsers.put(TAG_RESOLVE, new ResolveParser()); @@ -407,7 +405,7 @@ public class ImportDataTask { * {@link LayoutParserCallback} which adds items in empty hotseat spots. */ private static class HotseatParserCallback implements LayoutParserCallback { - private final HashSet mExisitingApps; + private final HashSet mExistingApps; private final LongArrayMap mExistingItems; private final ArrayList mOutOps; private final int mRequiredSize; @@ -416,7 +414,7 @@ public class ImportDataTask { HotseatParserCallback( HashSet existingApps, LongArrayMap existingItems, ArrayList outOps, int startItemId, int requiredSize) { - mExisitingApps = existingApps; + mExistingApps = existingApps; mExistingItems = existingItems; mOutOps = outOps; mRequiredSize = requiredSize; @@ -441,11 +439,11 @@ public class ImportDataTask { return 0; } String pkg = getPackage(intent); - if (pkg == null || mExisitingApps.contains(pkg)) { + if (pkg == null || mExistingApps.contains(pkg)) { // The item does not target an app or is already in hotseat. return 0; } - mExisitingApps.add(pkg); + mExistingApps.add(pkg); // find next vacant spot. long screen = 0; From 415ff73c84c05224e816ebac7cfb5ad2efc77246 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Fri, 9 Jun 2017 16:08:03 -0700 Subject: [PATCH 162/446] Replace use of java.util.HashMap with android.util.ArrayMap in DrawableFactory. Change-Id: I4ab7f908c3e8768762942ca83f576197dfea66d6 Bug: 62466540 (cherry picked from commit 2d75266c75e8dbbabaf9e0db96c49b1005a10db2) --- src/com/android/launcher3/graphics/DrawableFactory.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/graphics/DrawableFactory.java b/src/com/android/launcher3/graphics/DrawableFactory.java index 60bbce4066..45344c020e 100644 --- a/src/com/android/launcher3/graphics/DrawableFactory.java +++ b/src/com/android/launcher3/graphics/DrawableFactory.java @@ -28,16 +28,14 @@ import android.graphics.drawable.Drawable; import android.os.Process; import android.os.UserHandle; import android.support.annotation.UiThread; +import android.util.ArrayMap; import android.util.Log; - import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.ItemInfo; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.allapps.AllAppsBackgroundDrawable; -import java.util.HashMap; - /** * Factory for creating new drawables. */ @@ -61,7 +59,7 @@ public class DrawableFactory { } protected final UserHandle mMyUser = Process.myUserHandle(); - protected final HashMap mUserBadges = new HashMap<>(); + protected final ArrayMap mUserBadges = new ArrayMap<>(); /** * Returns a FastBitmapDrawable with the icon. From 14c3389dfee69644ec923e073d386f4dcd4e9a54 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Fri, 9 Jun 2017 17:10:39 -0700 Subject: [PATCH 163/446] Revert changes made in http://ag/2388716 as we have few open questions about the performance loss because of this CL. Change-Id: I4c499b176dbd80a31f2088ece27346077fbbcdec Bug: 62466540 --- src/com/android/launcher3/util/MultiHashMap.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/util/MultiHashMap.java b/src/com/android/launcher3/util/MultiHashMap.java index 2b2908547c..b7275c1f76 100644 --- a/src/com/android/launcher3/util/MultiHashMap.java +++ b/src/com/android/launcher3/util/MultiHashMap.java @@ -16,13 +16,13 @@ package com.android.launcher3.util; -import android.support.v4.util.ArrayMap; import java.util.ArrayList; +import java.util.HashMap; /** * A utility map from keys to an ArrayList of values. */ -public class MultiHashMap extends ArrayMap> { +public class MultiHashMap extends HashMap> { public MultiHashMap() { } From a93d09fe632fd39e01cd38a59c21b5e8fdc9d782 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Sun, 11 Jun 2017 01:11:48 -0700 Subject: [PATCH 164/446] Replacing png asset with vector drawable Change-Id: Id3aa5f7a1782052cd646b8935cff5f62e2ee2cdf --- res/color-v24/all_apps_bg_hand_fill.xml | 27 +++++ res/drawable-hdpi/ic_all_apps_bg_hand.png | Bin 9093 -> 0 bytes res/drawable-mdpi/ic_all_apps_bg_hand.png | Bin 5890 -> 0 bytes res/drawable-xhdpi/ic_all_apps_bg_hand.png | Bin 11678 -> 0 bytes res/drawable-xxhdpi/ic_all_apps_bg_hand.png | Bin 18196 -> 0 bytes res/drawable-xxxhdpi/ic_all_apps_bg_hand.png | Bin 26755 -> 0 bytes res/drawable/ic_all_apps_bg_hand.xml | 100 +++++++++++++++++++ res/values/colors.xml | 2 + 8 files changed, 129 insertions(+) create mode 100644 res/color-v24/all_apps_bg_hand_fill.xml delete mode 100644 res/drawable-hdpi/ic_all_apps_bg_hand.png delete mode 100644 res/drawable-mdpi/ic_all_apps_bg_hand.png delete mode 100644 res/drawable-xhdpi/ic_all_apps_bg_hand.png delete mode 100644 res/drawable-xxhdpi/ic_all_apps_bg_hand.png delete mode 100644 res/drawable-xxxhdpi/ic_all_apps_bg_hand.png create mode 100644 res/drawable/ic_all_apps_bg_hand.xml diff --git a/res/color-v24/all_apps_bg_hand_fill.xml b/res/color-v24/all_apps_bg_hand_fill.xml new file mode 100644 index 0000000000..1b0b53890c --- /dev/null +++ b/res/color-v24/all_apps_bg_hand_fill.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/ic_all_apps_bg_hand.png b/res/drawable-hdpi/ic_all_apps_bg_hand.png deleted file mode 100644 index 437fd374ca9e849f71f146371cbe9c0182e2fdd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9093 zcmYLv2T)Vp^Y*1l2dSYK0mUFqlp>-a(u z-mu@MaR&eaZH?zjkoQD8Y2;22Oj2Klz=Q!am>XPJk~?_n(1n);rONcn;Z{<2okw0* zPStwA7HD?Fl;Z&Y8}As^Lu~t-VgfQhJL{>n)cu;jiJyuwhZ`v5n#JMT3vwlHJ~qK-{Lo2zbc7~*4&%O< z(FQy*nhdU;|>Oy!>_EL!(4z&Bbk$z>H={%qc?(LmC2mzfZ_u^i{p~XL~q1K zo^4gKh~B3{%Butxps`1EWcF5VvdGxI$I&J*zh48QM=2KXtdS-oNkwb>0+R-mx+Kz{9*C79ZTPOx2BMMv?<;QM)U=)T2Y>QKUeb# zi)94y+#b6FviCFk5@D_(rxdc79oxKiL&Kqk1h9>TfA2e}eZ+DnGxV(1Rn)0(&bXik z@MG0m2o^l58>4(*3^DN0eoWIQ`Bio4J8^&6R4|M7)IFY0!mePsiVD-10Xz1Q6`&*d zZeUHL9ktbC@f!8QwY`*&0i=#jW0HpIbCk0wa}N8M%%I#?Y$#T|INq)a$wX*pnhnR!Gne2#R$H9s{M}nZA@P4-S|$4yIfQ2UY76eoEXu{BUeqXZB|AX7ElLT7BF%gOsIGab6+2< z--1F){ZjuZ3z}IzG%65E`2KwW#8ALBPCL{{@juAO2e4w8%PBD?xkQrQ0IrG=YH1+* z+9n$Xy#H@xHtPL@yd|2?jT};BYcAHdVvk-uE-y5a>mmWBz2Cgh&eIhtiZQ|zuI{Hb zju<(RWc)osPlFzDiWoB5vd&E|ob*WMP)Wqi7=TZoolaNm*Oi|OA$FLGNbk~GIdVti zRE4D@X!zJyG@m10xY<00Y2b|YQvlXfg5z^YrVrh{zfuzADmS4xY=Zz@_S_zWp~ipFwvcMDM~e2_ zmo{FDa5e)@zRtYezPfC~|A2h@L%X4j8d0yg+NHKXW8;++VyuB`cDZAIOMF}QJm$B* zuRE$T5;2+%p@SAFfYdVl#Q^QoIV&MqSalXOcL1$vH$(Kx(24h-M?DM{W2hl|D}A0G zLy)U!@>~Ya@7+J&SkS>2Wqt?8C^-R5CNd!bKS++P1|})Q-U9(z ze6lYLKttxTq~t9beoNU<4V_!Ev=W_uOOG|ciUC^uva~?JfnX9vdMA;dhKkc83OYX1 z(F^RVVf&mBgSV4vaR6TfelW2@)d@(i2^-sZE694R5%llhzj{d|JQN(C!Nl=auV+xy>lu~ z;vqqM@{b<9_Bi}@0q62t&VsHUt4+gRW@XKZH26d*6-PYX$91u0!8m z6|<7vu-sTU(=0w}rlFayudnwVT|>8B{@cEaBPNk}XYuV>mx7LbVXnE=BYAoE#*5TR ztQoyjVaJ$vC^hYOdKpwRh4KkCNbH>CA_@D1U3Q!(6Po*O-6^z4?LQWF53hfj!-&VO zTN9&poltoIVxZt{Huy8p3tXh5qcd6T`N-1uQuT^c;@v)YxQsm`*@wN!@y(ml>R|+q z5N#uN?~Z}3qcQZ3HH@aq>9Rq4ERK-+V6NIzBw{2rX)K@w1+X=VKe;+cGcyVhX$iC0 zFxTNd*L%X5GQDH#Wv45?Nf+oBl{|E=_fK%j(`GE!d4b|Rg% zH5GZ#?*7BgAHIFEUTE&o;&D`oA*N_`*mOqbtdPHnG6F>uKcRH`UG#-9g~P88;CP6u z+mvud=FiK(!lj8vn2)DVJ?m#vBSmi-`4{l90L7IR+vABuhk??D%5aY+2@2Pe8? zsBrfC$|%K>kREwjeMipUwW8g^_hwi@LzD1lLi^89NSME7@v2388_tvEPNS{viypdp zad=(n@bLkYQgVrmXhW{%rRKrVKl1(ivsw$Q&v^-Z=feVurVMT}pqqe~E~s(_gqN&_ zhw8sCbOwX2cNUtO+UH%fd>U4iTg>VH6d@{ObM)Fg95Te7niPJv&UN-v?J^v$?w93t z1~n}d1f9IcyOm)Xtu5q4Ke!o{E(sR6j~b8a2okiu_-pi45VpOnk^u7(l3AH2bE&nZ z65CZpd6(>^y-M92r=Za<%bm3dVkg2pB-MAgU;As=(dU4dDkHH`K3EFTuo<~dQV&UyfXRuVr#9%_dLUU;|1RQ zK09!-65iIb{hMja_s$XP7^ONPm9H)Sh;oquef&Me0>${3dmYw%GFKpeoO1rczx^Bp*d84n9XZBI37iJ}i!%kD!%AW}Jml?s;r;l*dyx@_>~M)d zPG7VG*&Rc=lNVuEAAheu%e2hS!r|?-eTz(Of6luva!Yx&f6&&yl zDaWLPVFy{R32DncXLt^RX;_@(r9%UaY*>rNp>F<9NuegktB!B-MYega+~%n(f$WYn5t-BOwgr1YERkeS(33Q2rIq2u0|o;1O7q zQ#i>)eT3^9Vt{|3gA>}zQpJJpjpMpouo}S*J)4RyF+F#YDejj}eCc{a*2HYcV>|Zk z{#BzhtMRZAd-)-+?3u2sAczVRDnVm)`UKC1@ZCD!dwnETKgie4U&s+ZE>KhdfM&AE zTD>l8_de+jZ|SMX5FfZE`02gqRf9mht*=r(e_;u{R>l!#^fnjmDtZnB*e?>pRZn3gLmN%*4n9caN&+3~0=f7ky5TEntGMWkNn-r%FwhxS09Q(SYO%UsDE8V^=cUDAf(P-s z#}cm5RLH?(a=1+kDs@Q8f^f`+v>HLV7?i8M3%HR@rha~(w*6%+@0g~!z7N) z(ZpTp7k2_GHpE@aiH+<@hKGlF^__!4_+@>C3XCK&(9Cm|N}J#O;xl_aDwDaOJ0Zyt zIs9_JSmyOoKL0A-Rq~*Q_ORa$S~^dh%Uh81u8WZp?}ucYSc?=IHXF#5Oy-vFvEpX# zWvil=r~bhBfglUd#zojc;gpxJ9f>xy0yjV**zZf)9t+V zwT7=^@^)flyWHMl-Zb9J_#HdiR_PHoxo?b% z(|+8(X~pmv>Ut7?ho{Oo^8RO|m&W6H%I`*`ySS(iES%h8n2L<4N4}!;n8^Dk5`Gk4 z!qGy-pJE=V`PH^QcV;$OLx@H#6x?!{d(iOhVDp5sZasF zvf`lp)NU}@y?K~f2?O3Ma;5Lbrf$CppWm&2;c|BJC0p5}BA9qqYe2l&AwIXqPE;Z$ z7JcV!=caJyh2p9pPCLc961ld(bE@E=g0278CcnC#G5_mJDUE$`m#z3CK&1Io`sex&O$=Ntih{4ok{V zP(=jv)Evfu*)c2w;w4wjZ!XZziGcxQ8oF&mx5&f=-96py(5XG4rXz<#PNJH%VQ;I9 zX~S~UK}rMrvQrmdbu%e=Aw8QKWXaI&%)9BGlK!t58zkTwRRbtl(Vv1Of!> z-OUbOYgHw&jGMPYu|smG@J_M;$(FKrtFoX+1;8uPJ^+U*<-RcGLTZWupeejFI_V6LULn zqH~86U`D>uxOpb|e0SAMN;Uw~THTB_LauFXe$sjPW9u|>ki@|?*+z4Y5Z2rXBx+}Fd9`$wka+T z4E2n3I$B*;_xYZRizvz9@I*NqH+yee5^QyV79<8RRi(y!^clQM&M>6H5SNfQxM+29 zHF)Zcc4JowmXTW~0Wb>lt^HaU%<|FD$@LC{Y1tS zeB(_^Z5nEfzRwt<(i)0{%0*F2`mNGAn(Y)Z=i<9OONwK0mm#IAt0(=e4HE&eQZ1@0 z%W0KFeyiukJ!zXsa+d8-TGg*8fTD5r7lt2r%%Ht zrHVz;blz1qCQNfgy|*Ad36n*!m;IXKND0exd1h(Z~s5X@E3} zP_j~nvx?46e*YfRo;o!(^+8Q7*z7<&Iv+26n-du5N--L_G%0nQY>iD{kicJxnz>|b zA=45wp88(mLw3rI-?gT|2gO+kvWjN1r#>D-4NIc+3N8mJ&B@y1n6MGs195%&-Sbqq zFOjC-zi-gHRl_aW;ezhcYr`z_-vX%*%*@PcBFC7>ZyI;Hg3ie1)8BwKQB9|bPLYg? z8u+QDV`|S=hAVGl-a0t&7@<<8-tpCDk^d^;27Z}3)UJU>j8L9J?s%E2?@ZH(!|v8` zBH#sCq8{cZqE?N*%J0 zuqAEG<`cQ*|IPUYF8wt3H5uJaIpg$3?e6Yo{l{sQLZ!$u`3&{os#=FkxOMfuk4CxZ z#Z?Tv($asZ{JZowX_m~@fbi3!y!fhe73y_RLTa1T=Q@VEB7b7z9usw4&(&uO*HV6H zS%DY!qH`3bDZakV_Mhyx{v!tlWG5}3?keIaV8TRk5Y*kL?H#S#7W>g!1wS5Kp#lwl z5tZv!XShkgoK3U3r6<+=2F0PMyqLKdAuZ#c-+Z)+8ba>1ix#V$ksYN!-+#H?0N9uw z|DZE1$UW$ZI-kz4!?gBL-T|1o|7Ydh=a81ACb;8iDeD~Dofbgvodl=9ko}vHWkS)j zP)G*54i#Z^`Kv~Cqh79L?pD5`dEX!;fC~AyUkZfh_Lsyu-PW|C8-CR++!Thi1l%3v z=6+#vzAt+3D(MYrZMgmXx`dKGxiJ9cuv<-LuR6{M!^{oEW(r{4nVGwRl!#b;E(xs&KCZ1~n~i{AR%l~A%wSHS`0zbmOq08l1?gcA9c#LpBH12Hxw zRDP>qtL6bC7QgWOQu?5qa47IRvG`LFc{&@Zo;Oi%=D8?9F!#D8^{hyPqX6}Cu>hIR+Li=kBcvMD=Vh&5N00z5G^|yUVw8mWn`w#v z#1BX0-7?*M5sr?I&HRnvJ39a%e)QD$)fw8`+uH+kyo+;<;*uc><^o1m%w?;0g&0zj z{{8br{{jHI7%ep=hZyBxx}?D1Dmp--g*TyWtB2&^;DxPM?HpA>Nr@JS=h=NU6>!*> zrqCekTeJUbFldNstv_1eg7<8u@A3h&R0+^wbQIsUjS>jedDhAQ0H}nUYNYi(su&dJst) z6??SRhjIupVBxuvJFk3Wde zYSFXkR<9Fjj*^BFE&xb!`eN;0I*~ra^S*8w9%G}+lKG7kmKPIcSB>2PT#A8s(Z)StEr*l6c|)+5E{oqm{Rc=_ z&sRWQjN7&o)AKc6p@2%UiXQ~+9G52cTaC$LNVrJdk|hVgx+pAR;g5Wsrv>(;nJ6+C zOvzqgsE8Pnxq6?$k<;UA9fRKh%iJUb>zqowOYEH&mtN&E7BhaS(<TZq zz9`;|aNeu?G#1WRap}9{1f-1+9bUDERcYi1UIov0RH;Cp!(4;p{}b|sjUK;+cu6~v znSSqf<47g#>mcy#>Tjo<%Np|<-Xdrjzu2CGIMd(2@)V`-nunzC-fsX#lwKh^?mEpe zaLQ5~e^mJU*Ih{b>VCw$i0L(6S$O)c5kc^=Y)({8@(i6{tEJ2gr5kdgr4bBkU<(TW z+gS!HN*^|@pc+TdyN{#Orn=ooxeTmvwmx?3xS{B>qGXXz?wkwl!GH!6?EvXpiHhS{*S{k$dpnMwiYl7(m% zJ4D`jc7z;}Ee^GhWyC$IyixkCuRXj5HmBxiMUXttkTkGnnl9;}1u5Vd&B* z^&|@cujsCOxsQENHEd{|LiXD4jV0CBcR#yB*FN-I`-(x{Mv!25V7h%`c)ES#0{YF$ z#yttcP%cMX>5El!Zwc@M{_fI*6nH{Qv%Zo{8|rUQ@is~Lle2u z!6rc!0d)P!kbE~&X@$Ms5_vL^OrezOnrD1py8YcRUeXUg2QhN85#R79S|81D>?GhC zbM(J`N#IP)#GiH)046{(^nSMIcwxOwP%yklZ_l+k1^1t?*v+cfD+64DSqy>a?53vh)v}!Wp&V`SWA3FgA7g?*) zi!ttZWNAujV>~!o*HeN~S|lE#)Eg1eB}d>a#E(9G0(*Lml6)=wt>_390r1J#P(6UHIIQ1CKgHA`sSk*|5yvlE3o5g$rn7zOxO!k1Gx)Z%A2 zO5iJ&){obuqdTTQZ*oc^cYz%!A12}dcr}Iit)I5$7%KC2XDA8AAGom zb?r)(oaH-2Qs+sje)Ej~fu?2ltP{($330Ab`RZIFR=5&E3kjYn4j9P1CH&NVZ!T5S zDT4(5O@gNT2nrw~y3=V7UB=P1wBzW9M6_wn5GJ^e4iXwS1NK8@?htzCgLWAaEtG6Q zRq812fJZi~S%_`6$@F1%H6T1?5F3X%{KJ@&8@gxFU0g%R$fhU5eF6IHwK%#5G17xNMYS>0otLp+%-=_Z62 z&${Giqejx&qxs>Yy!|=d2~4lZO_UOjwxDR(Yz2>|FG3hv z50-T&kh~%>QGEU7_rIfU6N3U>?&)um@m6f=BEyT7=C;Sk_`vkChHF<07I!C5zIuPO z1@-(=hZs#SlFh##(HgVOvdS*t(mG%>Y9wen`ucOu=a~)*Yc2BceiL3Ndpd&zupJiD za^ZAIJCRgLyQOSI3E>uDE5DA#Uz9>cMb&8y{F&<=<~8H*8s@)uGe5IsquNW$9AzUM zj4;n#EKOCOzO@!*%*R)Jm`tUQF$Xz>O@*QG5$R=K4e7Kse>{8pH?g0Nz{>;*OS^DE z6;k->a``0HYrM~nnG^Q%@6(XHQK4Rnh;A_#Izf7TN*B$+qUBZ!W8el~NCk;0l>+45 z_XLF@g?i79ooH+-R_#a$EHJLP?^Q=k2sui~Q0^-KzkFgLKbl;(KW(w};k|;Y^qh)5 zq)HYqqY;B5hsg9^eM4l0Mf+!3YfOsauAGhG9e}qxfOBngb+93G&i|FkhKk^$-A3g&Ow5z9(ItZfW>|GnRvt(-)N|f>YU$SY5%yH?O9K7!mPQNvaR6njC6@ z>7pEe4SZ|mtVwwN>G>N*@5%;cEisZh^{O+cJo)@@6MG0t5s>~x^#1Da?-k!V7v8%u zBuZ?7IfP#lyd0;{X-pHTxpl71O?uDLtg`u8LvI$*L9!%0DS0vqIeG( zwK#*-ed|_tkz8s2+6sf%dYOAyASFGe8I}>KooVe(MJGkrGdWC%uxY9l3 zDLmyRgxc3D{j2n5k5mnB5-q=5R80 zqH-(Dq{{VLJin;&* diff --git a/res/drawable-mdpi/ic_all_apps_bg_hand.png b/res/drawable-mdpi/ic_all_apps_bg_hand.png deleted file mode 100644 index 0a0024138e662c1856d8ffda343bf268f823e026..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5890 zcmV+d7yamoP)|NXkhfglJvR`?|02I14Bn~Qvg^8eAZ zCpZvPr#en}h;Y-N{`992qeqWEtFyE7-}C0pySbFx+uPgdxo>~_+wXH6=WU9c2`T^u z)kBqOm_B{_C9dmsC-*`uqEzWI>_<6jiArn3`pkvriBtUg)Oo?(Qq;<<@{g+f>=8)l;jIH6THdc!?YP z`ueUYQEg0u)Qr{+iaR`M;er`xN`q9?+MVV=P|Uy?D(nddaW$=x6o^`65@=iy;A!Pm z9rNz#>Dj4NqqoTYBx8aAPgXdv$+R|8*G32!AR|G6a9%jD)nY#?4Tzvxfu|ts$%>Xa zf<5_b0wO60@VIjQln{0*a8g2*uQ!Mwz>}BIG)fr4dZ?^gg(^Z6Nw5F`AU7m9Nns}< z6OfrOASuDZTjbmx1XT^5Oo+8jS_24OCv-ulbWVx5n;i(M5bPx9Mb$^yAXTf$NC`k#CnJE!)v7{Bks1Ag5 ztyPJq^8`pa|8>k}7Cg7QTl8Vjb2>VJ_!Ae(S0Qk_X)Q`k)pRU2P)(+9#^&fWrV=pL zQ=+ZlyY|yHJ(~#- z_;#WX5&#hPccKT#1U%%S04RDPeXCu7QUEA=VZN<)0m=ZN$OY9fK-m}pgkudz;`9N! zVAR6~05U&RN&sOWsP+NM>H;)x@yd9{*wUtBY#Jy9K!~#W8>zh8cdQ>OmFI%^lL$~v z1C-JQh|U5TIm*Cy(&UkbE3drrtMZfiH7o!$R2QJ%-n@nNA}v_H))YW#lehG|;Z3Cw zlDKpKH4yh8A!8~)pxb%MCU6jjN=@E}z_4fPUIf>5J8-oXqU>-%g84SiH`Tt;BsSJR zNaA?wApWs#tE24x{{Gv!AKsGH=M3S}f-qG2mEYgN28gPVtwW{V-Q8c}{&g;1yts>f z5*5Nw>5TcS<6MPOQB)sB`_>X1nB6EmQrLTb=d|^AtseVtYU?l?hoMs4%SEUP(fJ^& zk~sOz)}X@6M1}}(vciGt7k5wJxoFZKzA8U~a;yVksPuEc+DX^@#x;@49=&_9<@}or z4+JoUVt~l6?w|Ffgs8=Vki@As^l<&NiT79#Wh--U%68&!*7~$tB*B{dCrODXFESi3PQq=pT;LuR3}oJNi}V<-IfSuA^uh zGjYRylwUurZCmamm#n_|182K!^vxi8p$1JOE%Ig4bzUy$ohmyaoMCK`a!#DSO{Qq4 z6}h3P3KcjIJ#%|DC;yx$JCKzlJzjA&Ay7Vg+4_zTU$o-igI}goK`G%D;ijcam;N{; zL}Xuhr0~!X&@>W^{7=^N)<5(^g6=+0t^7S`R3OT5TeUdC@;nWs_Nc?X@nd__*j!?0(@(j~Bcf#*K8nX|CL2`{U zGUnh=NO0G}g$utb>`1HA+4>Nv5b&ezGsJ&SF({M#X9YL@`v+o{VXG zW#V$L8o>gE1eHKEu;jY7-Q73dEM9sRaPGw4pY`k=Q`up~&gD0Jm-Bl-G8p5w&M-)x ztcVVo50D;2l!mbZlGS2q$Dhu6Y->AvFX`U3h|J#NDQtMF) z8VJ^Gg&VXZs}*rSv3*Jx8zMQSaQEu5cT;8I0C#Z3$c~3MO$sp=f4|9)Wogy5CE zGXu^#%YsP>NRHg3tGp5FOK4IdrW&%5QyuiDDQ`LqvN$m9}#9l0Uj-GVA&0c20frzIEfN zdX;^a+C74^u&pCto}@*npf9Kz5cTGk;HDDnu_htyc&n=JT}1Av2-l55CfR2-Dlf1c=tH>eYIAsfClR9DDsl(8*SgZ(b|+ zW(P7QKy?3r8+9wkw|*7EsE-)|BC0|!@9WfR<<#WNlrgn!T!85C*2UVb9PJO8tU@&O ziZ7HK6(CyW^($4#KGUEqjy)I^Ad(|KR$5+&@)id&DL|x-_?S1s1jxKj?(FRBnlook zFn8|UKwMN3ba!``1ZclUp=)y~TX9xFg?F_u-T>-)5 zx-MO0!q{B3$MWFa+rrMsL4arI8(r&5Ai48jt4KXPJ+A|3)0!Up0FvW9_y#N#Li{_i z3p+Z4-X*V9BWmgRo2%xHAyX(asn_t9GqrUDk*q}KV{PmSL8isLg;c3TrQ12VxoVwp zYBjt7kOo8x7A&Cah1DuVu{PScx)K0#bzV9O7HB=BLL^VFqK$*AhI&nmYb?*XeEepxg5pXn2m!-NaZxA70j=NaBGhN z0irD9g=0-CbT6H60X(>n-hdD)a3G>~?wMVkIH?L@f2dLuIMmYF0+0F;WZ{z>$bb+k zSnt8l_B)ViAykmYR04!h!G2>Z!JM!j(hn6ZJnD@&J8r_Hf^~6rwWkswK$JA_G9%80 zFu84;@oiP}!ZGmLh_g>~AoIc|t6AeSC=k{|2JT8g8wX)MgenAKJ!I~P1FeOyC!{F| z`$LazY44y&8wc&85+F+11_eHa0vQlmIed^S#=^WDS~&<1jYKO4g%^T_Y<0o~d|MSl zz(6qNYi`gKt(*a&#Y@T!SXa1U^Kl0p`;Lpy?zPIblZVSksv`(L; zgHWYXvi0-gbo6_C=JHSC$b*f-TFS%0I|wp;TM(|nf-pj4zLk?>KFz2`5JreX9KIvt z{E&tq9H}_8V@=oAty^!d@J=}h!jXz+4)q6j-E~($o-$?1S8beBfB=ze8Xofg{rhDy zXWyg(g!Rx--FSWc@CJhBbzZr0WxB+q0tDfcXxLiz5s5E08T&I?(DK7OP4;!$Gdm$-m1siIkF=WEk*K0z`POmHqU7jOnAaSVq} zoH+5A-qy~jqaUuyp7V|AIiGqx2eG&kS=VqDr*IsHap208D|`9(T@O9p5m!JBQOafg?DGeS~KhKES(txcZoWxSDZBpF*p3Pk zM{x-I3CwQnzaRN{G&ChfQ$yU?<);!FdC( zUA=nsWxR0a%$Y|`fC}ROYjpIAPe9L!6Fujg=s8Eco`YQ`IPc(1Y$r6Y;6*%(r}$-0 zaK&euK819gehLMwYj)3x7d_{^=s8D4&)Mzu9K40s;RWY8JdG#tFZ`W%h92zPxpNi0 z;-lmIQ%J09!9B-1mKN)p>^X1XRYLL-p2stI692|Ou3fwK7d(Oow{PD*L9h6@JNgt7 z*KY{P7d}1bis(6~M9(>3^_+L?p5v`+A~=7=qj(7S;~p-W-rBx>`^qjpg>>{O^u2xk zCQQ!}>zdtjo-@ID9RI}M2+L!57!TlH+=bg?V`FdGv17+fm!3j8`V_Kz&c`8p&JNjg zymig5=g4&p_u+2bL2z!xO}L&v-SrbDOsM6;Q%FYxG#+0CUB3y@b6&H1j=iqg!NGrm zgFoT-*!J$b?@n~$DWs!AP!5N=eq;5VH|?Gy*EPSMgFA5>LAe<>;LrF2wqY|i^4G9Y zzntEc(EyE#znZ`CMqED^DRE z4bc(5>o-=;# z-}v;L(CZpO*?_eoI7_hz^W)>==kU4EAQyg6myQM~Ki&_%e&gSB=K zoMnDJ2UAUOCSa@y&Ik;}APhKq^ymQnVtO4{LbT2ASXu<>soNnnJIe?#$hyJ z8Hr&SjDhHfKK%K5ZP>7(q5gOj9Tx)BQNCu7%Ih~^qiGGJ!f_bJ!iD&IfG4b`kCPLL^ndy1s%~IZP4nLTW)D=osmn1S!DH`>7wV1 z_vtx<&>wwe&p~GsoOUKSEzulJ(1=hsZ2}dqs9jxd{DP=;lgF3{xnWUhk!J|np9lBnJkZ`MbGg+miF&C zElqHm5R^t}Ac9j9)ln6d2M!!qMZb_<$Atjp!~**@1I$XH=Zp&IIX!%OP8-p4n&Ow> zc5+O%5U4YO}{@*$C(gy47h$1zUPQzX|%9F7j#fbxr;<994Q!v9#>zvswfX*BVIW3Ov6IQS(vD218)$aPHy$6nV6Oj$2DD2`$%(xXR@a!$Ods-r_-$_MnE0V(vHjv;!E zx30DDB%SMg-~$x=+SyFPRFSb^$)my(?hIl>C$sVaEhZS3Zo$MBj3b{6N@<$ zARQe7QZ4ZMO>oa?oSi#&E{vFn$iGBAr3g)Z`I}K`_eLuNm0EL0Wr`9iAA&`2Z;mQ1-O;9D7|0 z7aaEkq%=gO1AMfS=UD5SPtVB!0a6;G;wCu3*Kb1h zoD2~lr3gh9apALAT6<1L43N?gWff1HpzAjQ!O;LIeG=tOW6#k5DGibdjNNnO6DQsM Y3~Mh}A31i8VgLXD07*qoM6N<$fP1*5TzSwX=&k5QbO88 zT8>8G|MLC)?|I&Po_BY4c6MjxGqdl`OI>XhD)Ou3001gARV94@U|GjhpoRSbvGOLiJVQy;Us0H_7iQT{iC`C|G3+%mQhI3ZSLy6wcB9)qsYQK zf0%@!q?3d*`}7f=v*;VcPx)QXHGSUsjPSfOG(P@~7@SF!rWLMxkm2XI)x4E{G;^x( zdhz5W<7C$BLl&BmnvEU?z~@#mC+?ycBbL2~RLrOT6edpRCr$f7vMS9q02qjkF$b1B z{8y*4$Flr&y`jaE0HAHx!)D(}JR8=LKXnssSovV=GTR(t@Yx=VA*9-vZ8=YMDr>4~ zPDngI>XPp2?w%E%HH+Y+dcd`Q(*)r|3_!|Yn(}k5Tu~XBdh790^Pv5WDZg4~)ycHf z)Bx3|80MsZ{}$ur&y3TG6O62t0kE!^t{EFs_ZiNAGR-@0Y4g;BRY&3>&)!s@!^4pZ z0NnG21vkpr?)Yj-PTId0KJw`+^Bd09dd@rPEmQbm5C*bvU+{w`f;72{12Jj&F~_PS zF!1^1-r6{g^Hj}-;$~w;Igg);r{!{;_>PMb0OfZ5Z!N$4PIDS`F}U+E!QkH7Sjh=t z3>nCx($vv8&nWPf67hdvt0eQOoB&$RGiiH?vE93|m#8Mlqyf0m796cCscHXI?Q3w@ zoexiQZ$NFo{CAWMHFN8iGL*1P4*ex@Y0yUcn#NSzu-KXK4XZI@---fY`nUL(U0;^b z1f^Q0Iu;YhWB|~Gc@beNMv#!4CY}J;$SEo_YI41Q;t=+dyy_MgWMcBSa^iG@~z$Taye_K9YN8ZY5`!Q>n+Z z>yCO1HK{fb(@Nz}j9GneR_QYxj!DxUJi|q8gtjb+@k8AJU+|!+$CU7;zW%SX3^86J zF!y&buj3n^)Kw4WIGW{ktO&6c%IT#8Aqac+X?BWXL{nupM&P{->h@Ly0HT?dE}{2e z4n6rJo8B2*AKt$rAONCS%!`g{&y+t=2lIUvAOKeFVc~xxtd*91wKUyhHXdGr0q;ZS z+6Md4b!=>dt}lP)xlmEuBi4hvz>3qAEeOu^S-x0z*98^FKiPB%JYq$WN}jBUtE(6& zCdMqvk%1eRH$wzCjb+J4b=SQL-sdpZA_>4sg5;!+jsTm?3%xd+aJFXc0zj*gvZo)q zZj=oM%egU}GCpAr9Z(T;ooVn16^)0N#7q(cbiA}+86?CL`u=nR;@i=r;IyHTrH$4*M9=0^QRX^HZ(bHVI4ky}qlJep>f(67_!OPt5Zg zY)j-u30w~b`A=&$zH}OnCdYQIXIr|oM|`-PT;&!+zK=_e->K?@8K8J*D%R)dJ%GaA z{h-r{`xUbPqL}>MO!tJg2*40;=PIA8FG-r@o4_cC>$LO&fyLp+TmY?bd0_N%inHwOjOM3jln%GD z9+{0UE;QI)1L)43J6rYAZW1;I649{&%6kKrO`IiT>CEZBXJT|1s}KWk|B&IChtgKA z1Mpbf!9YxaWi)0L|L3dD%o~fL<>M~by0~s)Gx9>S~nA}#sc(psU+HeG(4T?lt`*pU46=)P=@q} z7o+r?bFEKw+HX?bnR_!0TIDz*69YxFE}e!bK%I(eKVPhx!>;Py9F5H%AOK1gmW@x1 zM$yeRC%MH}hIHS~0xfNASJf2kBpJs8(X5-ZB)ie^2&2%L<9M8$B15AWRetV~eaQEF zOij_!3V@PlBgK(yYvxc?t!_{vlXF9U&1Y@w6b8Qq65ZM8JLQ7bWFZ<&LIH;}nXQYA zK;}SRkPB_qh9+s`jBawl2`N?F8AdN8b4~PL102yagWMS_ZT`}px=#KIXVI{V{B3#pB;*-fVn>H72eQyQSRzCTNNlQBEv%^%XZ zlT6546CzBbYqsj*R0>K865s4mP_c#n``eNznzeihh$egU-}YH-yG+9!ne><=crFb+ z!w!R(d|DOCV|#LHWurEuYgCx2l`h3dM=}CsRf=j;laV>(efHVMYM*CSTVSHe1}#)f zPZ^cyTmu7-aZ3lX%loFn>bmD+HFt9^;#OO>W_O03%^uoR+DW(O7=p;e+to)!(ktl+wSSRH z6$hI$C+{}pNvpf_LSFXq)kH3ig#K#$v#E5CyHAe_M%(!`^_SQFdk7p$Q`ht@jJkF8 zJH)DZ=Y4lO8N*V+(5j^Mb}s%toQwp zU1#knOne!Z|9%FZki3QW4ZoEDG7X z*Oi z#@UONxv28<8j#8TeQbxQlH*cTnVARgIZ*l{Ga;j4OFf8vO4y?(*9%O`%;g)mv!BC9 zV>~ee>>+rMGP9Le({=1QHTj_}^NCc&$0QtZoaEd0qS?Az5z66ijSn||R^iY^XJ2t6pw>CKsI-(eb2ooKA+tEthN?=}*!8E|> ziP0?lO{`7MB^{UA@UmHaZ*MPEi6(D(5PH?*xNT#R{@W`;XvRE7942L`v_jU^w)4o!0>S;a~-lyy5Sv$QJ=?l+!iPGp4I=EGS$r-qYQbKq;zKpT>Wc zN|2Ia^vhNOZzwzR(=U=~A(0ltgd0^{X;icey81Nf_cuZkux~RA6z>{|9}6;i`&=N3 z`h0?MSvaPp=uwf_K@c|}3%y=&-sy8ZnsEL^S;k>5d(~t5G;;z1@W90R2NW?=hhjN-|TKi`Q#?YHJ#A>eg(%J8r?&VjiP>7PXaVX3=jw#`|U+ zh9J(r`z9f*{WGB!y{GYAO*Jrw=+PVax0_jdPFVZBjwfoOIpk#1H3$CECMTGqOZ?+w z#T4z?fSB0VfWly_BS7cwp2flp^t|Fu!jh=~5S`!`a{b^}j zPao55jS}jS;RzbD<_^%%I<9=Im zTVG}V{(X9YHb$2}#5W#7MG=rXaOZ z_^8>y1)0A`sbKo6N%wtSo@0;{=U#UKe9=LvD&34-ZcNiovio|Vi{z42=Ggt<`W_09 zGDP+}p*c4L>w`TPj{)qb8%jdOI5xYek2gyXS(rPxSABkS6x;w5KZ4rTKq8OVW+ljO4l+GKA zPkX5p$X|^Oxpwf${e8(U9sN70jFAR9y4Gp+$bR5^Pwcx{Kza2|!oTY4#;$^w$!-~> zrM~0K{q4%a3u}E5`R>f(MPaw*&BMd*)GV2IA}%zTv0hwC-1Z zz_y3IndQ$P`SWX}DR?j`DhPmMxR(XsP|$0X1p2h*^pfh$Unw+)-AsxtnS+{N0UXesa15js;V zQ?hRze>6@JXqevANB~geh|632R}-4yy=~W{N(+x}6}}-o2=!PE-JJbkVf}uuV*E7h zroPO|{nYjCh553KY*xLk*fc^g&7yb{5kk1*hVnefeu9kShfABEK5wUSJ@*udw`}p7 z>GT`l%uwage!BGwuhKa!Q6!Zs0zN-hvQ>soW157XsR>UQmmXO0z3I!5wltD1xwY4% zWaIjKO1~+;yVu?iBYWI&r)zEUZq(Q;95$3D=6A zzdj}eZBD`+mW{77iqd8~38yuyY(`)H=9K*q(?-FMK|#Gflfga7oW!Vm0Uus#OK{eg zsSQVbB;JcHk~{I0`IdRBPLJAlRLU}kJn&!Z@{Wt)V(?+EM&@g`^w82Kts40sFf?gN zSgPJYlQ7bh_oF3o{gg?p`tqMX##I-&dWuB1e)FWq&wb9n5#OisO5%9#ImF5I2L@gW zeR@MZ-Fo|XsduFd%5x&uQQ=3pfZOT6*8-}K3WZ1Abaa9j40p_3o{8tmOdghUZ|)jD zDCeMQjpFQ7HY}Sm*l5_wF_uY5m=4HKi(5QD?Ke;GZ7jZY(j0^hpr0h+`@O%^7K@c= z7JPZ9BsxJ24mQL;Sv%3%D%%yQQ>-;~ulp&#HJY(Pc^c=qAvdGjdB2V9=G@`U{WxGx zr7e`qQ6hb0u{eI(K40cgCSkdD`dR=e@TDfOzVH;yoryjfY%%v=vgqu}tEO_j_EYRW zCC>vw^%RzPgFOH=RS`C;SHc_3d9z^~>YuFL<7YjO6eoqmUw^IG@N-GiIeoplN(MNJ zcp1*u-cmWrYcrm%48A0se0M^1I^L9yptIG;=}WA!UTj3_8=V~tuCv6Sid0-1 zM$!^ClZjqW4@)$c{8Ke7WIr)S6ciFd7@={X^~puSv;JJOQokZzc9h%0`KZ))Rr{Of z$@l=5At<*(MY;Y;YJmL=dK1NZARv$!Rj_}u6Tc^T15vOFanRk^+_2E>`Bju3MdBRP zZzOmeZ?HVx2MukFKoy6x@@C8MwAFlDuia}A>FVGbWq_8tQt@-*6}(qAT3w@m=2zwH z!MUm-XL9)s0??BNp9wyVVIr)|hAp35_3OWZRw;zC7eF7lG9>xS#KVSib<2-+*7)g1 zf!Vh$vYj-y!*BzLgYEoFPEqt71TsGueKZB5K?480LR37Y?A zCjMyeiI8Z-XVi-G!$9Q|ls<7lKt@_{OO8Cx-SgLlG`$YoH`zCz0gftO@2xgRx2V#O z{kugBrz(Zb-1r55b|R1}1qA|>OQ*~)_LtlV9K1~Gj3Z2Tm~;EB(y%4fN>O0%kQ(5p znJPAJil30yFo_*!b)k*zJuR+(XV5 z$*(T=zmp(DUGG>PS^8jKP*V4=MB20p#yN5njrn)qBew7`PCtjeoG?Q7m?^o1aXepr zeD`YuuLKoG!~#T7QulkbSN_!1nohxw2+jLkxAKFEps*s3VBj%HYZNT6Th;czbNN z8sJQx_bgPm(5k+YZ4aErOHW5uM~hxTQZtnp6}_l_GFoUekS5tVG^A_Hxm(7jL9Ez0 zdS2wXrH*ny<#VE)CVl+=>7E{T%VWMceE+auGdeqKNl8uZ8!BTMaFfx>Y0W8VAxc2F z%GoVcj&V(%3$M-g^Gnu**ynNwp(Y2~PWcbQ!g*3PNF&mrGX7QRH;ams z3SuUr?+cx;UWJ9h-rXNAJWrY#CqjRl$N%+xzp|uw`I*DXb~ye#a^Z@e3a3Pa-6tz| zJ~9W_L+^@!z>|MahmA&Qu1H?tguWKRN*EY=HJ@}wb?UL)E)lV?WQJraJbzGg=kECP zLfBw%*G|r5MTh>O=bQ#D@9vNOEbL^P7}_k$C9cq~RktryGf52aF(p z{dVI?`=t%&#CfHEERv8&_sGYl+le#TS+h=`Y-6HaS;3(LHi+)xjkqk-z!4E+=hOkq zo$D*B`zAq^4Sm_|d{ro%_oPFTmMnWi5}q9ydqF_p;2B3_G5zsJfnuT)1G^1nw|_85w+@uS2AWp=VCb2%`uUjb+ww&8U@PvITf#TH_L#DWZioO z_Pztt33jY35b^Q1s9Cu`)nJtZMA9XDICFR+Mv}9M7AI!WT@T^8cv_@f{2?F5mYMJzVDFS!I$KqvJoj2L(kjj^X z@tvNA>YvsL>*$$Jp8(`+M-bGk1{k@I8{qKsFt8vj&mKwwJvfL&OL23te4z1t~nm-yF zR|ikteZ)+OJH6{(L+76JgnTg{o)Pc+72SA~2-yCzd}7>hseiPG7YSL&{>UiJ3Ec0l zZANu9cQ<2xN_r`hmfQlNY9y>(rE#*y!%@)Ya)P1nX<6Q_*}BG-|E>J<0wTYdk<_a7 z?)wnWjGTy-qW>_}>_x%QuqkuS#!?GGc#%(dW7vhf9H9s1<0nnBqcy$r>CoQ@yqEPzrfeZ^l&n48@?#E>~DVk2CqJb~D^p9Hq zuUqIJmVQDOLVnMhk4MYob{l6;H>=;86$C8;e;>kH+S?V4)$={Cx$@%J?ik&8Sjo-y z{V7K>Av!mcw8`5_?=Q|aDwIKj$O*Eb%KRwhI-P={s4phh zwIS2GEaztA+#Rx;!~Wi&&CU>{?G6rkk)DVkg;Js zgwF!KKQGRyk;Lxb?xd?T+i4f5!Mdl zydn;XdgAwNVL#m4NBgXyfsbXA8YCb1o4<6ask`xc8qWqvO+uI0@_yoRKOF}TCHFMb zDn+XT3OV&sk@(N7cG=j<%1R{uEZh}d4Xijg*|LSL4YkiqTArRRd2?`{V{QQ!x&@n| zbwc7RBy>71Yo%dlU6hSW606Qu$+$?y-(_AbArTa z98Eb@BUI~TV&EVfKjwQ{Zazgk*y&_tHJ4<2;?9QN4$y7&ucPL`&c>tvy0a-nf`%${ zJ|ayV&G=7x(xDJY&7%8XVUMgq8zhJQ-L6X5RVLIhag3}7cqp80ajFnrvF@#7b^y6H zYDI&9cl?1An)dcJE6*4^Lb9v_vXr8trl5mTwy6qd$e3?fLCqt6Dj9)}=Vzz!SNciv zpWHBQnl5FU+6!*Puptm<85Pdx!mdhU?D@|-q#XT~#jzy6*+09yEplP8gG^(pW~ye! z&e-VmrBQ*))amlq0Qx(wU%ucie&H)!yNVerCO0uh3+r3cRiSU?`?h?9PGU)@u0C2a zkpf`65{{W&E)({DnkWxlir$&+bz2%Yt#xH{)46NbA4d+hO{B&v>D%xc9RAI3Ec->4 znNAM2W~DusdNef2*f_ZWP#~+ena-W_Sd?Ny&i0foG3|&S75uw(=T4C09IE|X4S>1D zk>IqqC&4LwM@DH5+m;GpYsHxL^Q1UYWCpu12kSqpBIEDFz~QY?C+uQ4&YTH(vTVVGbnBH~auRcc5;2VY z|K_n_Ll#&RQSTzzCo$bbSOh(?tRI=mRkdfb-*r{;N%H)n0RY-}4|AgZt zQw6J*h3oHcPSknWhPLE!03fG*T3L614D*;`dOW@F@x#M33-{VBWv=)2`BpgJTGPR= zDdF1Hyjp5z(K*yPdmaJUR??|xHe#!WrCGpK{q=u=m6y*M|>12*KJXx-Guv38BJ1x9km@F+T1t>yGp|2vVE&U1QM z0FVYI#hKWO@xuEn0lq01`zkobN7&zpFI=Vh@a$wuUL+R%6zS}hRY0Gc*%FwKllSFK;PHBxfS5cREc}&7KC6ziu5v> zZ6gIU-|F=8EiE?sZCMy*qn_*k4gDYOF3#)20dh+JPr$djjfY1u6d1nc#T~t)7r_pD ztD|hUh+)7VNz6Em;q$-H`cK+Pe2Pap9McUky}_PLv+@#i$F=$BcVb330RJ+>7tVvV z{jv0{wa@pEBHVBcA4K=$naVG|t<$+@G@DQNMvbSs@GlV;I@T*Q%=>{S>UOb~#ikhq zL8d@cKUY6XjFsIH4#+zT_VZmG`NMin^9H&+B#+)mi;xJ!_&Dw(<9PxRM_Ck@lSfat zr-inX{d%UB`h-ktb{80+J8}{9lTK?b)CkUNDecjCp<PX<~SS2vk=k*_ncYCrHu7U)Ul_TThu^J=8Pyz#6z<9*lDnJ(?N+4cXlDacIv zF}$-{1r8oJ<&4Fvmg8QZ{|PYLp8g$f|C|Ez$+N`2d=i~{+tZ-0jKEbUM$?pL7d5!7|TK_|Ko=KmRCTU9GD){F^RwL~dnu02!j zWXztau?E1QaF1D0++rHh5lR4yoA5Agkd4n^C&Q!)`{(xZdsd#^=G93RTP6=JYJ@?F z^GvE`679xOMgj&mZxDn@@R%|acdcp@H`IQcv_vE$Cn#7%n#U0emCuYIOP%Ph?ILTL zXpyfdRw1hyAi*lhSi~jS?v6`7o^O9X{)0Gx04M|`vZPDGFJZ7RC-K}}E@5+51XcR= z*h6-|zZka+ZIb_gcHCV~bnTEG%;LYn_mNWmbc;0#+cC)<%c7?qk)t^KyP( zR47(U;D>f;2+z$@OB{q?LE36=$0T$t>B>By?(6SgjJ*|qA)qL}y=pqV&Aj+$4SpE{SvUa^dUI*Lx zipjE@zlR1W05;yLg=XG1Tda6P7Dk2IyKNXtq$BcE(f9mtF}`t?VI=H+f;>Reu439G z;X0{ve~&MeZ|`3Y!LJlOQr6Dzr`G)NJ>N0*9Q;ymk_e7ri4<_4so$jQ2g>msr$vy` zw=JF@Wej2LABD-rU#U%<`!gS&SG0cPPH$Z0X|7iK)iiM10;=VK=5Q`E?Do+Lr^3wD z4X9x0$uPpa{LX6FFQ?(u=>w^cae(v8v%3|!fe=?{#34c zD>5ZdP=*XYm|G2Wid8bdX%-|->J0=Dy#p0CUR)$n2n`s-Km$?zp-sQsU zKbbP;X#Gq@>TD@V=j!HEZJFA0az^zu+GF{LssNB>QG{c0{w7J~KX7S8GA6mB7obFi z(I(zQzVtBV@W0wiQrTR5GGQA()6VtjKW%&5e2_%D9zc>egpY`sBKY5yIj)4~VT!q& zTK2|Fsrr)nz0#r#sQ}0lElBty2^ZT*BNBIIVO}=zd4Pq43!}g^2nRpuO{?ts@kyg> zp~FBPGC1!SU*sYAmGge$cLg3{hmjLd5H?*HS!~aXEEX1NJ%J=7WD}n2Nj7u8Of(O5*_`|iul-Hmh)Qc>6NHm zhgge^V!9#d+3xA9{7_sTxVLIrm$*R#I3kqopJ<`<^T z0igSUfw#)0g_rXS&XI9FfLsQ$^+j!2UjHSko#W!-Viuh{8=vpj$IM;Wr9hXb7HaoG zy70F9vj6RXsQ;4B&eZ@PD5D&l7Yk?8L_Y{PLT zOmfD(f|)^^GACL?dQdqC^xenF(uwX71fG{Nu@K^-0x{%j;kZbJZL^Jb9C^Ue=1gN* z!*)9bR+N*$+72oMgLyxR9OI^pE9cFg30nzBB*MPg@eD})VqhT_a_s$fG=K<#I!vdX z7OFv3r>9N`il)zSDU=Z`WZf-r*QWEcvq!wf;}YkRkuhP`&%c-eghdD~k65UlhN*70WFi*}-W z0-4e@!%9GDbsPO{SMfXqy_|jTPNiAZf1eHmEOL-zV&oG>KR=hZUdlG zC#n{r6@HHMTK#ws97ll}xmdTF?<$-M@lgG3GLOk;2fb)UD#(WjR=(7gsi|h;>UmLE zul-O8L_jXmwl|UI_ibM&XCuoB?fdm-ABljpwH5HevPiogS21t$`nGYC+J%D*(~!0iXhL>Ja_GMqL7<0e#N2DX-zN}OUS2y6q`?ty>Fe^HyfjVp;LUS^Ld zTm``spCKQ5_R_3#p9avP#t$L1=9SfnfV>gGB)9V-FZ1bf3KabRF%a~KT*L`RoFx1n z6H+)>bGxTw+4=|*ywjUUr*H;?;6gpkiLQ`wIgO~Sjh-@dsm-7VQkJoe`D1`9yE$EL(>emPeN(%p_MV$VXnaRK{jk}z5EdHiJAnRN|YTSnEb8ko(+l+C4#Rhz9-e#tW zPdA6O6#ZKG4-{uA=YmU*g0)AtQ@&+%FX52p^J>kZ=glT%;NK4phB?zb5uNkp1G9S*ShmYiOK%Bn4lWn%bad(?W@5DF`Me1-hf} zj%0LLu(*qXVoV6>r~B(a_aSV*&vl+i4HRe$d}LZB;fTy6Y=Cy?%wr_7H&Z^8w`lZ< z6E`0lKx6V(r?Sh`dMs)gBf4XK8)qhZJRqS~UKU!oZXRWX%V5v8Z^;yR0}%MJko_!5 zCZ1)3i--)^5PAo#IME$9xOy#+(E=h;2Qdid5QzICNT`?Kqq~F{?&j$4|6T|_Uzx_s zz`PIyL;!{q`!s)ZV=w?3^p$7@1qDC)Cf>GhtCqEwIKT_?p$X)b$+QUcHZ2Drdoi?^ z4TX(NJoMtgsW5yQgY`&ML4&ONheHWt+)5Eq0Hy$5eVv$ghJXU%E~M;msfm|U?qXV$ zze3tmxeJOM_XX> z!C1$>#@M}g{QmFzd3`=I&ok$qbM9Hb=iK|;rwD!BJIstcj1UAdYu>$W2tm|n@axAw z5AFo~P3ngrjUmn3H;lcg7KV?Z5q+@@tIGeLWqx@f{Q3oti!wIjUcMVy zo<8xR)%kmR&k{`8Mc)hGE_@PMbg$t1?O)$!t7BagP1v9F^8KHW{z#$2<4-_F7`$4<9(Hf2yj?y7{G`Z|^r!%CmHvKY?$i zB>N*31cjCuFUHP*pH>}xnVM$W%=-Fz6OK&3?69yf4p&##dV&5=T~#{trTnF(PyPyk z5e$wsCK>UMC2wcSz>7pf(DZ&Dim zW`VfRK&@WVohXrjAmSndYgNmf;k=47q=SN1;vUQ1^?k=@TVPZiF9k;LeVjM_W0Ibk zm6bKjT={AqBukKlk@!P+_G=z0NbS*u{P~ucuhS$FoTuDS=OP5D#b2D#i=P9brXM1R zxkUv9^_F`M%~1P9+M!eDbZ_!OP~LH;FC%3J-3to~vVtd}pl81js$-HG>ftm{kgibz zXTk$ng^wpqD5RlSQ&V+#v#Ey;^PE;+)|lMk_9`*|R=98-5bkA<(r+Ck#`dP0-M_di zbG5W#{+Kdllt6i`O3esC?;=np)vGs!zUoP^m!BiCLZ6EZrK9m)Y{! zF|fy%u+2$0-B<<)DtIioJa3y=?Ta_8y@gE0NM^TDK@4cRVBQ;2qGd+h(!gK&uV#;< zXz?IxlypGWc3)opKHhJjg=R7darPC);&3=6C8eD;B|%goHS{@INq3^pWH5A^Ry-%? zL&2&L;uHie{`tvT^p|7cdpkO9XTmK{NkIYbuuBH;RX5Y>i%;j}$Q;AbZh!jp=?7p_ zrX>zR3$~_m^m4k@W{9K)oqP9A^c;6am~=wWBW3oS6nOnXN@V2EtIp5tGS|;yq<3H*$EyZbbcrSSU45L8okn+8nnV?{9MB1 zCbA-o?5;aj3RuWW-R2qz7N6JR_{`w^n1|Mx2%^P(cO` zTm!yUdBeQjRC(;)A3Lil*zqeDc|~P5BeC5mVf}@y{KKc}1g9~Od;c8w{w(I5bo#Ev zb}aTM<_2#k<0c8t-=oVbQl6;zZ1Y=Z6eFO@^XAX6;`M7-j4&BoQqy@^u3@5sIgrb+ zo!Io0>~i>vwh_-jAJ9PPooNTN3$x<=0y6#8zQx8(MmS^I4BNGgkk#YP+!i;JyqWs? zJwTE3+Kv00UK;~5$Uzl!vL$^F%bJo$*H%IzcOv27pZu7Qabe-HhG!eg+}g4?hM+M=HMpFEzug-B z-<8dZR*Z1c--y9y-hU-wAYWZDfPbQ+)&(cg>bBnxMRu${Hpd>fVU9Jo(~I!DcbYM* z;!8dtDPU&oDcC4wIY;{U#y}{kHmv_Q>n0B;KqcN@lQ#!DFrVzLkWGLkBrrHV6zO^7_jMtL+)bs5&myyu!lsx^6(cj$7xp|6tR@NnkRa3%yz zSC}XumifybT&=!Bev`i0#(@5n;*qvw3`*vLN7$V8{6!lnY5!d(%){87ab8t7-y&+} zwA&2MR#_dZpd~;xL_pA781{gM=)m%3ex(g`QtyY}w&I=3_4d$lIxVqjG9x z9*aJ&C!6bSeFM64)ozK2Q%Ol|C`xg?(iSsEv4Fl~q+-hbVqW9M)Cb_;4DZM5Ku?Xx zr1RD8IUqd>#O(&7~DLgy@+5V8m3f+41I+l zM}A@_@9b6PN;RLeyWbl>PSbVOt$gz|m$6RZ87bL~<3Of%Mzq|+O>_DhBty`fW7k~Y z`1sXtEc;K^Cf1$xt6B_BWvjk#H<}H_ucFWLy*UAWWgM_# zk`_e;;iUL~zG0#>7rArhRnI|JMyNoC2R8m24 zVaj2=#FM@ZlCH|lttVOjIW)+TG7XTH8McXe3V~~9%Jd%CbzF;j#>=h52?ce@9&+`| zsD!3(mWS{HpyiS%hN?S0%M(>}UfrR@WL%$&R;VZXFUoSp6oM3QJbLB22y>HMADy|a z;}ay|RTOnYrJ4#_*m!1AIo|i&XE5cQoIUMQ_2QU*@;k)yXiq+>xkzu8b5^brQ(dJ#{mHW^=w2RPRRN5&`+Me4?Kc} z`DoW~V=oMZVqT`*hM*4&Xx{vV1K;Bax33!f#JGubLc=5CfV2QfCIgzi=7p{?HPXzFH$)iF&fFHMHrS_?r{;q`|A644)nP2?Qy{=W zfz*ib;v-5a`gMn%hy+9UprG{4F&aL^nfrDfN|G!zM>i-68qr>Z)Vh=mj-yX$FCGUY z;|4j17u4B^JfJhEW+Te$yM67fD*$ci%$d6 zZEy+vLj{4j4SJddqeAJA7pVZC^i5vr&8ek^E^AG`8Z~1-j&>>|+Js(GGDtg#eh|^I zL+R6%s4#cJK;Ed$c(K~b#fq9M?e^D`Xu5aQNGu~0RDB`J zRV6UzZcyt|ReX@Tm|Zs&=KSh|(PI0)rwKg32bYQi*TvpN(Bf8aVL1x!+nsX{%DL;; zJ5UQjuh}CEf}ZlyXfHlUD+Zm&;0Nd!5MC^2@zCMvqb!&VF|vM~T?UvveKX=X`n&Fa zi}djaV3c?@^Q*m(76LMg8-0ZeI6^KK%b3~#=@z$LG>4+xL#myWOcYp#Vf-i znL$~J8+_Fb>N;!T%xy=Lpw{_ppQ5_65YT6tm;1g$hoSE_1dp?OMBL}4$o-(?;vL~E zbg5X+(2MtvNo?l8z<}*Y6%~}6d1aufT2368G?mlgQMly+FU5KQo)z(Zna0ZWxX5mj zx25IegNW2adf^%T2Pz0m6N7vDLMOsDwF$%Il?xQJKrS8u!mn9hi%YbHA_ zsL}yN@0eNa^?tY?M1jCy5Df`zBRlRUu*AdOFCXYZd|LhR*UwnoHn68YVe*Ka)xU@3 zX9P3ZHSJwLbgB0{{`WVyz`ej4|0yT_J?N5(wFFVb))4VgX+xsw1gGHzB?GYdK%uWCN1aUd5moZilNIc8U$+)bVT+rxXQ0^8HJhwG8-thozEHyF z#hJPJVdS;Q^v!sSfbGofTrc@@1rrW}VJYZXHs(~96urhPCE7c#1yca0p!=bRLUy$W zy|`_LQ{Wjt)9XY2rRk#8v2G>`hKC+~&ttW#RuAIy*ZW2=loVt0G~XMxue(LKvk5Ce zo%u3zyJ9?20uy)OH^-`I%2D8BSBo$O-GZX-gim=TSX0FfcKyDLMVoBMSs?d|1;C^Z z3R|UkucorFB%UtmrNwE@KsK%A?+{{ji|4_zMtgByLFUgNAj#Ca$Nu4rd4}y5yGYh! zU}hR-=kP0{tB}ncq4^HOqf5ms)X18b9g{ON&lY)$rN|o>!Ey?u_2Y^Kf6pye;%^i2 zqOtpSPM}+7No{=c183}ncKYMZb0d7-0D{iliMVW7*IilL7Fy5-Px^(Z+Um*5i-?F2 zB+n+6?f&H6m`IB*ajqp-7dPn2 z*cfD?5%F;)uE%8K-@iPWIf!gQ_P6Qz9l>$`GYg1g(y6y(GW z&rR3pJe(8&!ARZFq~G0c^EX!2r+TjvEZFO&!zJ*BA2TN zR!VYn=4NLRshGD)R4CBSMY@!~q;v|@+KaGU(&3a=L2^xE%VY~}QA18$!3Y|0y4KB) zKIf;I`Jr=14aa=>%X!W-YfKrm6d!f~xz{H)Um6$CF~k${lklYkr-XIayG7;BqZKTM4kT2gP(?4$i%b zsZ~8y5M235Xp4-v<-{ANrJOE(K@6W&kZbPX9256VsvzC&^SvXt`h0lDe;16(kM!&R zja`*3-`M3Dxi{s4@A`#QjdZX=cUKL&KN3+v@KC@FnO^9TV;O>I=~{_9+52=m(0y)1 za?VxemVOmZ5gY$kh=Kt&6#(G9d5OVvTa?15Ie$TNwq>v&&f}PTel4Pb)S-!X9}H&W z6Rn#Pxk)H~+0JVwR_87b1$k;O&T6@LgUn-X?D|>GY!|Ymh&sq`aB+aI;OBoLkE4ek#e@@0viVo$-F4at))-?&omW!j%(U9G{us*M)&7#?NCx`Q>$=5|fxX>J zP!;+k#PvaaabBiDqSJkrCWVu}7ps(8O{{o-Oii_j7PGj3ezd&yaUs1ozmc( zz%}08Mv^ijVY(PJ9Phe)qfb+>jDxiuET0(tMnyq%Sdw&xv-OH}hHabgy!_IBYT52E zBHr#wSJa$J*i&t=?CgG6kaBn$D`oCuxq3UPvWd)zl26VCYcdw6Uo{9U4s_++sOOKd zqIFhoCL(i`*_G0xfhfxcaZ{IWTjFU0e5PGMC^pi0dWi^NZjw-^da^>_Z+%DxP`8>?}y z?t6E6uPuJJ<>)?3Zm69N+-k`mJY3JWNJ~qTe)l+B#^eXfiV>}>%|_!D9GwnRO}WAy z^;Is^eevo~lFak3xdyl^y=kClmMd$rjxz4VYAW(dZ$GV~?qsjAQXRF=GSBJXs>qKW z8R&3{*=&kA&&&+%b;;gD>Tk=lxP(xPp$Y}1{M_Zv5Ib*tUVHX4oMI+cumX)!*XyEf zDOc2LiVxK6Lnnro#9;1iP1D{?0?e#`HYvfg{KcxY=%Aa(t>H|YQT&{e&U)s~LU?e@ zqRadV%m}+7r}EXO0udRGY`K*}b&94A+f_h5gUhedmiDfnMQ`)LYFW?A{)(`F!gOY` ze5U)5bZ&d}K8GLcIJ@Z-Z7BZ6u8ol<>XGY9901dwf3ND%B%B&w`yjY9X1}@ckVGE& z4z`r#6u#-eHhxb?zx`!v7Jh7mT2S}W?GvEPs!k6 z>Y};Lodpj}6ji8o2>jiiEsx;aNU#NB)eMo(k@>FwXnz(p!f-IwL7T3N;FlZ;is~ya z-`v^yJ0z7*xg5D}9_W$PMz07ZHMwK5ZvW^DFv*6!Vil`;B5{GknoscifYPD`)+sr) z&;GDNQs)F}N`pE#O#=I_9SNad;vQ2&>fuGd{P%}C3*4gx#U1skT8h6khiWu-$o6o^ zHw|FJ!Y=FZzfC_>?o}0}g>Dj{<|>Tl6vPltw;U z&n0$%U#NT_l@}8{n*O~05Q2uH@b}cd=$eMze4M|3b@<7h^h;u5bibpB8|5F z8aKPW`coaPyA%Tg?$D0qwT}nF!QSIdWaKn`OR-`NecGaZ)$OO}#`z>l#&PL2^qHO3 zdQ^QCro~@ie&`cqsrR573nubjumek>Dc96pg7%{CCHRW8*!j9Ce+K8b*hlWvF%!cN z)-hLhkyRnedpoDc7nT!>A1iqA-rvdhWqG(0GGDoKdXuM2;mmQ)M$~<%{FMa9Bd_Jn zCC{p|QNPE%`{i|2KWctFX+4x=7JYvk%|3I&dHSE^_~S;HU!#QlzzR8?sW@ed??{5$2zjsR?$$r zOhqN2VV*5Qty?(X6eXO>v^y0Oqv-rre{wPI1@WJ@K;5E#+{(vT$vjl)6y7@=~4%&c48%Uw7`W@+54=nlE@%U_h>UEtv`l&~Vt`uOE#!INqZA;>uU zp8Gw8n4eNTzqQ7fx{p-_*4SJALhMU2M;)Af`{V3Xj_CK0K#MIctW2ctldgW^LvMQM zN}1_Kz$+S)AN=*%oUz?>TcX#Rk6rWh+Sz@&TX%Zd!gHql-c)ZzR7Z>J;#)bf4C+8G zol)SR@^`{Gt3{-$deG4Qa2a^~+E^P*cVZb+ik=!>uDt(Gi_D)NIPx^WYril1(5(?G zybnVr^4tsJ;937*2(hjU#BaJRFx0$(P7Bq2`YdpEgs+X3e96yh$3`LGSE%@3j)L9O z9nuG0v-2h#qUoNEa~dy2YOoRJj1W8fR*^xrE__ptyjmj&C) zy+1IcmOP)mLy~(;_*3qsh0KIUbM!4JJ`Q+iG4kQnG)eiz-dW|n?JK@K7u;g)UrN%b z)o$ikpHc1X7VnRe(!z;ro^%!!XiBNY-+G1DkgI79GLt!}+K?(xKR zF1Rb7czZ>4S@D8Pu|uh={XxK8$DID`L278Eg>Bj{M_{F-%^>uetI4!c5R+~IWArlb zhZDLr4nGGk+hVSW90btz;pH-(vzOWLx+Q-dWQA&xUzqdnz?5u->$a~G6lOwCG3d5) z6m(P^N_Lp>rksDV_tyVkatC9AvXI}oruP;Q`t^BkJ>o2~{zdm|W|fv@;A1L`3LQ>B zmNo+|_l8#JR)CJ!vlZXF%-iM{18noR2j1#ST$?-%F}OY84G_OFq@M83^AV8d!FW29 zekjV!*ZsoPNrh+63OG03Te!|y(;Eh6ZJ+=c zSo%c5>$Zg}7;eDqk`(i`jXV2QJ8i83jYAgtQZJGIQZJLC9x@#}?mhZlR`5eb8HWnMp{R>#evzId03 z>kgk*ehOXfO`C=#DeiMzWB%vZBn=)#;mYz;S5Z>P%Pr#v_3N*S#Vib+)&uFx@ffkdr_jZi`>@AZWnwI4` zVHD9=bBljht3P!*jeQRr3FwJabmrinXN$3&d(XFKpU6X5a|qNqGm=y`{tC8N-f+F- zby|h$X;c2(1dI<-g9Mj$a!!N&kN$ugen4T(J@FyOnW-CdEj~T zdy94QuOwQH9ns~%TO{V=C_C_=k=3)0`ObA_^b*;|L;IF8%eGwA%SqeGIi=*R!(Suj z)ux}m`$A%}-$L2W2(pT)tX61Uw~47-%r%^Q6@%8`)Q88DL113WtK&ZSYPzF$t}-ndJrR(})k$ z3St!9IS?6vT5sOXac0Z&m*$V&b)Pv4iL~dVbyU+Elvwn#Od}yRDUtSwJkbr z&S_zuSA2^TWk(BTn~aw@3>fnA@#Q)W{+x~OK0I7mDVVDKV2+tLzgm^8JO+K1xVpa9 zDt$PYZIbiQyu!yl&w!quUYDzMaR`f8l5p&(tLVF=%}7{afZTp&MKKAvsvgj6MW^mr z-Y^_zEV6D(*vWU*j4C3)7eW*7L4WoWQxDqC^#s;rj>h}>{_EvGM;aK$!aRtTvBk$q za|_iImx8A&yOqGY}zzBjo*@MH;Z!R@jhH}e8+h`&Et+13pACdU}&$N zGURIGIN#8qj;X4uvKnoGVFQytxC}Opyiql`6GMto=@YEgcZ7>g#VVr{|B3b7m-zZQ zN#5}At;|KVt8hA9&{~O@VPbB1`CK>*_ezsoE^yg7T#sX&#dOX>+-Gl z?Q7L?m(CQUQI(%s28vdb`IY3JRxNKcCg_8SpvVR1-pFtpV`#xAN2EEcF1aT%D*jHN zxcE3XCp21_JkNewLZg!%Snubhz745Q%iwl&hU6KCXI2ruc1~4ag_w=1mJ?6m2BQ3^ z)Ycj=&9h?z_I>QtzfF0QiOU*HDF$Ui(C2Eo=saEoV*Ks$;OAUfj*d){I;8g89yQ=( zIR1fV>pvAv;qGZ8(~1xwAt5@aar?^jv9X#FKs9~hhoP+fd7gNjIEIt0BNMuSmX62Q z)qk~U^{etB3bu&O96AZPH9IpaWhpKd) zw~_yu{CXO-ejK}}`nS06UHNi#W^CzGu2DZ6tCoOjY7ZC*xzo}zG5cn>w)>785`(Lc zGUHw+q)cPvzS*mT`~x$;mLEG%{9>FPUT%8Za=9T@N(YQ%fV{NY7R`P&w)(3-9H@9= zVo03UD5MW!Cr{nY%N>yEL`G->o_^Onc5~=PYjoaOG6VI+47H6m?V0!Y_v3aWft4?9 zwaKwK*p8dsT9Zg>Vp4Xh6akSb1nEbzW5o>Tf2vp6MyyL9|6lCuzJh|jyl}wCov*5m z$gNs^$pnB)h8jx0;A|nj@uZig&BA^~0ts9D7oxByei2Ou^x+qJ6}iJ z%cI2K4$(Zy6#R5g()=XB)4GpG^Z;uS!PdA)b-DZfRPl>%b&kM8lhQ7U$4n(IcN)OC z0ghv4>e%C_Bg{FyG&qka^{2u7#?QyI8=Y!gECZ@$3ih#|ZVlr6lr%0*1D&x8XYWJ* zU7n`u$fR7q;3=%?)t7dBs%+X&brJQyThh*2iMSSE7W$}@&HW`7%|@u zdgyYufMKb-5I|50_izH%WgDBzK~=4PD?(_kwms2FlaY`FFwZz*XyRR^@uTFXpWv!p zKV*5VPKgb=K+?aZ^DU$=0?A{mN@4aSnE}#5T6`0we2AI%y>^TF=u>W8n@qPrZv>>a ztwo6Egl7M^3z@S)GyUv+IkYjbHTdZ6oRtYej5>(DFQ4}A%RCOe7b9f+DDyFr?SlPe z?68FC12Jkfk@!82e*KX9Vx9cWoY4I>iNb@1b5a-n0#yno;g;hg_HiO~C=USnUtVhm zsE?ejaKA%||GOBd`h!JOFtvg(H57Z%nTa#FP<<1%H`@v74k%J0RYL7{Qy>IUx39ea zklK^LMHSQ{xxE2Px|U;d0^+MU?QF^f`LT$#+qJ!!WTf0U!rRz|TrTLEkF<;V@`r5^ zr5rk_@+HSn*6qAb*ar4pfh9HhOT-7Z8d^XF=XCv;0NhsxT#L#$S3U-xs`?F42GB5{ zzAX-fFENS;lA4CnuuB)bv=$?cc_1yqS#@yhf5j&~N{dGAd1CxJ87*|~?eKwJ&6{p+ z%Do6g?uGDSH1x+%*D+#Yc&jV@RtzD9za;u8O{A>fN=2%^M8G#$Sk9q_iK#o zJZYg|r*Vw_8JE}puRpjdM-APG+I4yRi&==AhdjtLQcb5066%{Dx^{64^fO+jCX?UF z^|GMPO_G~G#XqT}KV+qXbc;N`b>zErwr6yItL~AJbkTsSbxf>u2j3r=Nb`9j|28#L zE$vzn#YT6lUA=d7>la;KAW(k(u8Ndfz?bMa(r`!>Z}J|P9(wWd7mHcT52=RIZy+do zZ()#Q*0p8+l?J8Gt6p>l2p{B%!+guifJb5PI1NXg!r`MZ4A7s3jK2CP37&l|v8&F@ za;<9={xs~csDRe6`6!k~RA4djqPx#|SLl)2c;wv4yG^{iJ1;sjx<8~0Py@oA?O5Ia zqN&cDubCTA)f&xN_%G+gyRU$mZ^gC;-6l;@f*3@nE*-_@bP+BrcaK6t;-a&RFrFGZ zakpvrrIT+i@nW$uHDv7fM$@8lw6pnts0W}*ZH39aWVEAshc^%>aMAhnZ7Aqbtz0X+ z*z(!E;b(@#xlde*$AQOo)+DYRAzb#@CrK!%Gv=C2N&71hwff_ei+>TGr;-NdB9AUD z9ftCK!4-J^U8h(iC+9MIcsTU>t_c<7t&`D0nIq5j^mg3?*aXQ0s*Yr{DVY{M9Q`H^ z(TYedzhZ88;H(4F1K?^nUO2)GkHJS}MKRKVEOPFxZ}^n=_4jLIKJYdCg5Iaa7up|I zXCA@iYy{zrrllyCwEoMZ+45^i+8cr2Ycq(jL z+JXDe_KoaxbW_RiF!t6h-C#O@rs=9M;GiO=bw&*n@4Q^`*g6SsTYC{s1HQ;uJg z_cy4a5WZmdte=b*zQqV61(|Z;9z?B*OHcZ*)!mnw5`P6o18BHkvrK4zQY!oI=yE>4 z>FUV6R}{|GpYq&N5lqKUosfl~c880oHWu06uOaAs*_hu%+^*WMpWsogK|p0LF4p?< zSZ9+auzw%CWPG#X$D-u@V;{(Bw?Zt&tZ(a5Lkll_@h9Rr2A%UM`ak;oW!t9H^70oR z?sMk?i)++=(M5qL<@7usEQZEE$tqs8sNhp_dzJ}+1WpSv(DPiqPqWs!dQ5fwp16G< zX5SPbA{6wTzN*CP`k%|NtJ@Gn!#s<13~*HTKkK(rV?_tDh!zsyfA(yj!}i_>>jLU; zet;s`m||SB@dm`+ZJ#(MPb)V!H7sG#th^3qkEqMoDvo_aR`^c+$7Fjd;N7X9RYb`6}%41JV$H%5N+Cq6ns z84`%BEx)U`*CL-{5fMf2X=tM%P79qXc@PyAB_T8=3H)CQ7G6-x5T{m@au%fK-7<93 zswvqR`i!K*WDwLF)IyZAdT4^E$s+1UxBWy=-}bB;lDqBlz(R&@sg?f$(Drwv+hs~# zpAz&mqzYPFeC~@sB4Vcy-TP)H(fR1}V~uYiR3JYx)?3~b3yE+)1IJHganWYM#X=NQ zD!R@5(GMvWGLJe*2Qd<^(=hjfM46Isu9%X%?DB8s?_WC%U?ze>au=G?LKooA5%-ta zCv>yHaH4MZeXw$k`CRR<$wvA1nrAL&)Vn8nO^;U1qH@8y6e4Jv5QNTYsDzhSfu)d> zbvd9aFum=)i^HjpyejvdY>I*biT7Svg5zAKb@?czk9%OqtK zul~^1m>|?~J4MNFYvnt=y?UvT&2gxJ0QdGiJk^n&e|XNQ{_b+PSed+TEo-xs^tT75N1jbCwl>|p z61bQ$I=sBl-;usrvv_AaWKXIvH`l@X>{&864hx+nPt8rw;P*553As6m{Dew{u|>qH zj)_T6hUm|MC1EP)b2t?SeSImB)RF!+WvHsm2jyI&qcOW^za6``)}^OfQNr~OoUw$U zce`KHNSjrFC>8v^!w^MtCLh8i46j(V#7JES^M>>lF8@&PSoFNpvFN+)Xo*Be`&y3(TgMB!N=xpJG5-qQ%!w$Q|6SArn+CO~wFhaM616yGbWw4HEJ)Hvn7ApQw zJZ1W5h#orZ>4DZk)OV6~Ey4jEeJF&T&EKhiC0%*#ZKFRpf_S~Aj%yvh7SH1+wcoOe zceDA%PnbMicoUVEn~P-g4bwjOANTq_6J{Tj#XybZ<{TFXVUi2KUA9~~^lxWAKb37{ zq7tYOinBS6Iw0ly{UhA-dc}+?LMU6@@$%!Fq)-k7psD@?gDEujI65(_ z#G|6yJJLPS(dSxNCU;W<54L-dV}Jx#dnIrxgH(d0hhZJtiPjdw*>noqDSq(4zGZX2 z)q2>In}h>)KzQkhat?3O`~{8Z?|)P!mzlU z#N$p*+^zqxMb2ZjVZ!)YV7$w29eXCjn*@~{1GEfW0dEl3tWbG)u-oUk(7$^5X#5x* zu84X8zke}MPchJBcH#l6M0wA7Ttyaf^KeY3^1Eu~8H9&GI_1-vkc%BY#|H`hX$DJvnHZ!^bLzB<{{_et*r3a>+xcsRp*q z_2j%GF@kp!syQ+Jr2K&2hkLO-uF>s8u0VHR*i|W9bB{|bGE0I`ly>Lc(xlB35Oqfe zv$7aw-yrafIi@28<6EtkD|eUfy;uShtYvaWSo(!OIj}2Rwz*+Qi!~7~msF67)vnxI zYmL`<%g5b+q#2}eJ!o4ZAEvN7H(f@uJ_i2AF*&*XK>phta?)d2rYHqAFU!JxP^#Mt z`1FreT5EW>iYo@_==3#{{R#18WzVI*Cx&UjQS-1g()X3Pa*}8lnP3V`wZHO23On36VdoKKJI?$?t(DBdSNs2pGv0$hQEa5ny3^PLUsM$>rx zD>3wcD#R~6c>fQEbu#=%Sm;QfdeCk$C4pN4dpq&J2)aL=uaY&j*E6pH{CdX=L1b`x$CGmm+jMNw zKMEW+F8%aBW;>Syi{)Nz=K#_F;0oSV$DPP6zW?I!HuaI5(YRVVuE!=T52WsqZxRV35?b+|OIMRpF+y4-xE zrcwsf_stpU=c-*p`Q&*$2vw(-O_qn=;VwGLSbVf=&mq&QPVaEOx z3FLh+SHUHnLl{;mxyna%cROd#Vt9cl>J+8Wn%J9%P>B7Hh6?p8css{p&g)=q{q=Ny z+!-b%Tr;n*dsvxAbr2PBJ@A9tnEfsKb@)aWX*06te;Bq!6y>kcF@q^^jG%yg-hiFi zjQJ^d&|D?|=9IbwoD3;k3E9qx1WZk>{#|Oi^$>$HMMw9w*t>;E%#K#6!g19=$D2s? z!XxvYUx(iy6ZmS{yo$^1Hs*TDnNFVpqJxwbJ>9kcxVAnyn3J4nko_;PxbC5&P0_Dd zoJ4WW?A}u;Fkh+pA*}TOSQ5SicNnk3&v6p>dWtm4NSiUoQCBNT)<1nwhLzGr6e$8Dgmp*&&&>EuoC#?AePgS9V87_krVK0f~^sQsV?Kz3%#t((0<4)TOyHmq)1z>j6gjMf^s-4`p zj^Of7*zKGJUljKIA|4-{xLVuN(z5PLUTWi%Iu9sMm8%qx@~;Ct#aMML7RS`Ik@k9i zU7XJE+$6Y+wb3fr1}B!QrAT)mz(zCfqXa<(0D0sofogMN4rw~2%7s?J2L*4INQPrS z5=BXed+QzRZefW-MK*f7jD2^(YYtw<{xCYN zyN>C!$GXNznJbCr9!0kxDuAus0!H#am^<5egr*}tsNSA7MwE-k08?(<9c+pIjQgs=v~xM~)pl6<|Z}JDJYt!lz|X(Epwmm?PWy2Y!L!s9|ZLYnRK)zRIT;9B9L1( zZLOqECjPNDZo+F)Q&Fn_=D?RLa9mZaIwRmKxYXd&>+0HJA+m_qywf46Ql1Wce}nSj z6H&C|gN>=Nagy~-1Os@o0s4*^yC~9jj$FgdS^RM7atcCHHNL&LHc*nmG5jlCle@To4N{$%EGd@bjdBa7UzyAoI| z2)xt5lN#}#`khPoVd3SLi6Q}SV4{wKki_eXYv3HI;_NAV$`_2JCa`*;?XtGU2)Dk*9`Si)x3c?|AukKieS8b?uq#q$C17zSz(#0moby z{rr;Bf2n<$?^H{r!w-%geZLxWzD7qkvb$;jXM3_T_6IdVu<$M*6R392ZQC<}E#j@@ z1E&JG>V_%ICqeAq-|lc3H`0U2UC2FR$l&a`m0T6cf@%=k@364y2Xu*tDT(gxMZt;A zwcm9T8(waF18>KHGyI`Q^X_#x_dkN&+NHalMC&l@ahGzwj6nXzQS>k7idr8-T8hoc zk^F>@RRFR@^N6AoA&JhpeCrLoPJA4_(L#U^Esn!{9UgXyFgLXq%So`?#=8YO`)v?K z@3b0>2J9|=Y>pQ5ETJZR`QJq3G=YcztnbCQV{a%@L30Y zcjj_J7A26*hm<#1gIE=?DXL5^CZMq_oX0o+Xt)BpzQ)@ihF{wOq}~74MD;(;{15a} z={{x$ihu(0sUe@O~B+%@Ox;l}P_<9-7eW&j{ zj{BwGdYi(n#<%=K7n9D(0OqX3&G>hxHz^K9fSNH2LJ|$U#kzfZ`(0Fr%C5srqOwq9{v^6kY~(rbe=rLLAq; zXM#j)ui)LnIY;Puk2ODcsir%PM8|Lvd76X(J$OcIdk;k2)?L32$)W8W2v`@c03z=o zsx?lsNHtC4Any`*X%xH*36ojEn~UVjiZ0`uPxzoBNcjsy>({e*d`Kea$d0PL`7ixs*tJ zShc^2uv_w*<8Uq0Pny#fFkt3RC| z`I#hY4=~LX?HV9e9E^}E=fC*w&rehA%GnJ7+X8jw%Zw<{*X1az!$GJy9JDyQ=eVO~ z&Q|*GZl;yG&2}~nYDl^qIYW3d4-f+A<0ccnft1ZXOZaviRhaXm_4g;4vioqHza<;+ z0%!*=wNWyS`eW7F2oT-T29moraUs`M(wBEb;K3x|#yYNx89NHVv7?UEdk1NEOyQ}R zj=lTrK#|RcZJtJ9(-E!|uge6+g4z&pVCN#(Zn1q5RhahUSN&-Vhkc&n89)NLUdaL7 z-E0jgQOkHuPjvL6aJ-cHpj`P`N;64?@%2Nu1{|~mc1R{}=fuFVx(!H5AL~)L2p~+E z&%N8g@z-1p-~{qQu4bXdY?ELKGNWM~uIYoiI{KggMqWEkwEr5)b)A@6@V8sLykrIV}U89>r5*;|R9J@;- zL5pB6S+}1DcEl(J>o`@L1vBVDTfE&}DX@T!mb7}+1ds{Kviy=lLyLRcyB9m`+G=;u z0`JfP3BfIM)TB6^^&WD>7Bj6Mk%i)l?5_rzgu)bNE5Hin7-)>`Q4U;qupcv5bsI+M z*wqB6Fo8%=i^M^<1waB+V4YrhoF)h1wT>|8bra4y*ReT1umnOGPK4$9M`n`Z_V;4f z=fIlB+I%>HC$Xs^Dq2*>j(1x6D3YBUyKDA(j6q<4urGWBX39?qjGkIVS`*j+=)GqL zY#Yi=G_$-OIF&;ZT}(m59ifghSSXC}XvD?EnWlE{_#OumslsqsR3N;DUDuTZrzTvp z9E>H)<-+$CiaL0TpZ)#n{!uRikg*b#d{e3tKCFVG4O9386mz4)BE6JW;Ol2CZLP1Rb*)0+PNO{$}qm9w2qA;OKYt*$U1f*V@*Pn9l^#t(V8(5E? zbp8eUCCe8eDAbM=o8Ce4oTHdS@${wpe}cdpQV^?0kUe|#UM!i&H9Ld%-bLDlVQGZV z1@5i>qP%nlJ%1W}UlfKtF`d7VlK5}Pb$tWh4R#xXnsgH7`TKFs6Qfc&>&AA z9@(*B3nZfg40|e7JLi}JK5!E7`eE_w1v4USUxI>Q)P&L2r?7U5H<@6)RQ&{ijVjal z0n&~R+q5slEBowEq$fpt24{-1MJvbz%L8B3Cdp74w{PJ~em+$2m-bN%M%+|qxq_Us zxBb_JIki^oUzk@!Zjh!hGHx@tTgxfv*b2kB@~1jihX)+wsWDd?&OD_h`0cI3tu_g@ z$-bz^Rb+xvM|!ds0D``Gh3M%kt5gtQ_Nk|b(gh^bn(Z9MO@dOOJ5zM>(9qDVU9pd_ z?OBd2CHt)qc z{DChDKgK16$3+@js{As~qVAbQ6Sf?i664aKve_5-=jyLL#v z#*^X#55xmI^0r)UuN`WahWPwIN?|plg;h@SLw`yZOFB{zGgTDTBzN~r-uR+4#Rz8u zrS{{ClK=UYuK4+ofXpkRwK;Vuh|XcxoTWXJ%@jlv!L^kIi%!se=J-Jr?#D+1eRdq` zI|95Ub|?JZQ!41EpIxKpM zNkC75kf5>)D@6iMJ$?t-FVGxlNKIjUA*s2qNV(F5rP;YIVuyU+o+zt=6RT!RkK? zt(?p5ifXrz>ktNsE~qeDMdDifm3L7aSTpIipE;M06sIF#eWu^GZb01{mmEqD*a`qz eRxk(49gd8J9Ccd5xTgRmAWe1M+nAe=g8vUL0oZc@ diff --git a/res/drawable-xxxhdpi/ic_all_apps_bg_hand.png b/res/drawable-xxxhdpi/ic_all_apps_bg_hand.png deleted file mode 100644 index 49c004dba494e26436fe46f10cfbfecdda8ac9dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26755 zcmY&=2Rv5M|NnjLnN3Fao+TrMN66kvc0y*hWRD^vdlbTxy=7$+B|EbBC|k(N=6|lf z-{1fD>-Cc7x%Zs&S?|v}_grC`>I#H-G)vD38DLkZ&v?zS%b?e4#Yy(61u6+iz_KOtWV zH|xDG$5kOSfnYO`H+b!wa^p#ba(UStq5bv~{HETf4yiy*UX_%S?rm&;gHIOmy*n3& zzT21gcmQ4KuV`#D_!Wb88W%Unu%wyrMGGsQE^_zfjn0AG%P1DDYiwdMXLZxWU{K01 zmE~npkSi}gi_Q0>pkW3}e{gkN`}sB29J8BZ&yHK)FIgu9a$+YkLl9?DWPBQnCy#_$ zLgp8(lP1>$1_=5nAa;D+K9^HfO|8lL>C-PsJq_no*O4u3)|nbEB*cw{2tC+;rOOTXOog$Gc$r15L8-o zW8&m-vvYmrl7&K?o!bsY{ZT@GA7C`$OKBGZLV9mbov3U0%P)J zH@xf-7Db~8#2D4^j&f)orOdGS%0UyZdRp4sK8EpY=!1x9>=YHaf8&5{tT066ZTePY zM;1XlhpnrtYmP_;9s+_4e@DB>t#vJR4U}`fHi|}v0=CP-2)_xebZqZu?|G#Pl2Z+e z^x6}#$>$4@69B;!#3;*Z+Bpcr??0zpnsk$QK$38yLC{GwgY?DFj;xzWS*;j__A3Z_ zeAyv=u@igrVZz?MnUsj*D~D$ZIny@I5+($lX1@L<&HqhUbdJh)$7?!<83RH-JeYCq zmlTL*2#4N~|0YBPZ1afYDZx_<2MPZXnO32DMB1fVepqMR+X@yDT5aaQv~ zR!g%&kfz`L%;CyiV%}z2AyH91+e{2X02hKA7CTIjV1OHu>HUoI62O5_ibkIQKIgxH zAideqT`;Ni>jUn@8X5%%nm1Uon(j_ryoHaCpZA6ZT<~SsSNq*isQFyazCSUxn&?IIqxi# z6a4P(x7O>49?ly6lueV<$X021>0Zk5Ty(_t;0(rIj_f zx}6d$^iQnO-{Q z%?Hs%SaJ>r4cKfH&%~$uMn-W`7&Fxe*yX)#ZP(?!Ib~i0H`yF}X=C25KvGCijiCky z9eQODFRCbj7K?wfsK2Uzo0yo$V{UFPUGrM&RWnqD33Y1}I4vpcD9Mn2$jQmE%)*(0 z#mmCvk$Uh8tAIg;lgcJE%b+Cv76@nqm`Ws%1O_@(6e!;GTD+KwE==jzB7&etK2r;l z8H~xj)(Q2Ncec?H(C^+=89vdm8Ka2Q@2ApbMMXs!Q(rjSet;PFd9~FmA?{~P!y7sM z+uKt0K`>S%9_D|FOiXLjt^Z%5xd@#|L1H%hNX5HHS_4H+FA)&qsgZ9(rI%;cnZ3GX zcPRG7vrLRcd@qVEBm{Nx7dZ}DWvJlwf8z3-p99_?7g*YMEJ6%DJ}7~ftXPEge(ut< zU8NW-5-5O5J0KVTp`SkkC4xpURFfRA^M>-{nZ4S?)g3-w-uIK1 zxHQ0jLWo>U!5m7<@t6LynHcRaapL3STPk}I1vK`p?qgc25ODqpOV9Q77FhY#z?=OG}YD4!0bKXcd zMziyHEO9=t%w4lMp|QCeAqnS3^+0U`u#)S~*`g+XY1$1ZrX_0iaCNTZy%PBX$GsK~ z*!!v=289`hdVJ{fT7TL|Pf0?OLBjfdTf}s7u3iP=O$3?Q^(i zVIO2esvH~)Sz|9u^QNN?1GGI;hJ1LZDV)eZfMLx8Hy}ve-{B-r;F)A#vRZfV5xvGu zb9eRIY z(mZ5=(|U?*IO8ACOrX7|fPn6t>qn4ICT7bCPsZ#Rlb3|4<%!v8(Qx${7)At;>VDtx z2)q{Z27(eY0tu2b4i<;Gt8Q=BizE#Wy>~NO(+L`N@xpWCwE+2?^0H;HtKy-xhslvc zWYzhvQoI4hQ9s9?o*pW-C+JXJY-_aeXy&VH6e#`R4)RY$P6EB)AI}>m2=e5VCZoQ4 zPQ9ghO#L8$x7Appw2hCSKYeP6Yk-ic9fC0Plgf8>96l@x)l{($X$3tBo?3dXbt)@> zfX==(Ts*teZJpqfu*O-(D{=>hSyJcWvMGak-bA2o{{INg&kG8wHyxo^A0Rw_J7qsJXvtY+p%@ z(p5Ait;}&c?nOY*_MhUKN+?b2^wHDq{{4v+@|anxds??bKX%-D1#&iuns$4)ipPIv ztlw%`#?I#8-mfK&mXZKK#z%@Ppa6^Nk{{oveb!x`;%Oe2UaBe}VhZDa zl3TODYL;*(yas(-AGP+_YQEIUllG1*=HgNh6tQw~+4Y$81UEJPuta80m8K3v^Q4pJ zzj6)0m0SZS5*r=*?7+G=8cA;K?|Q=WMLApt6{9W6_fRM^Rsm4Y|cUL4Cp~q$0=f%|qZa?F0yA0{9_${eLr=JAt zJ)Ap<7dT#_dgcd(F=(rrTJa~%C!lO6{cGSHvPVx0eSC{1G$prCz^1o+-+#46Mf%gP zFA51qOzlU3RZPFamGtljUQntB=H}*_ECM>?giBV9U1S++oJ=l{MVB}(9x71MXPS7N zj*%1Sj0?OWtxAs&v)@J_Ail;!9Th45J5{M@a6P1aiawktbzbWd8>yQZS4xFid*5ru zfCC}RtN(o0kbHHsHgz{X@z7s=+WSFW?Q>N#9wdv+<$1ca|HV|pQHwmt$C^iIx^|y1 zHb0%Y&7U)j&9R0$q6zQN4?G5~$C?A|jZZ|ER-TDw_{45F4lWb$u$8t79|I{h z|DfqQe1h6_#!?x0f8N_yDKqA8zdhdacQo&<|M`u6ldwy7$BVC4w52U!T=rx0+Pjh{ zP;ER4v}1Q}4Qn~yqup*i+1xnaaF9IDJ`lC>P*(05ee}{$U%&1Nju{7pf+FwRxCvT) zmrD8@oxx2$(NlGAFdj{aHYaxZO=RTxdnOF%al`KI!AP{lUwL(5Y*S36gh%GHPac%;3IN?nXg;GLq4Hm%(SM2piw;C_B1nF7`}$N zY7O$Pdx}n!AZ^a4o!B9hWn+$Xbzg+nahD?xdG1FK1~zLxY*`#AVCen#MOlx#iR-(r zbLel$aaEkCqs4x+hYKp+%r3{7f@|yg)(8y!9 z3|=$Z@JP`j15a#pA3 zK}W{UIm4~sO>d-)QIG^_z$bK&2!G%Yq)P8h=u)91iryxME&k1-~CApAUHW$wX1O!Z{KR|?-s7(mdx@r}3b#zE0w;pOb-Cv== z(HR$e!}MxoWTgL?Qj-Wm*5ilc{vMmT5XNLa<>F!;3unT>%*Tcvn{Srn*PUJ{3>gI^ zy!Np$pkC8Q6y_WsN{WdcOEhB+`$C+^YPTdZvhj?Q{a@X(cI6m(kXqicsMPJ-dw7^Q z5DZGn`Q4;?!NE#2-G>3dY+S!-rH||j@dv`Z%eaY-m55cG)O_&sLHUZQAGAlJOE#V~ zFNY8(zmnbzGym7EK)zpiN{(^Mb1$k5B(orQLg-yv^YQQ!P)X{=no78=pZ3H1CXzptbW$=~ z)m1e+yO%pL+Np+v#D&_i91Qr#CT9yps{$pN^J_FWSqKt0frWKjbg%K}%fLkDHW;9hqpEu;86gx8X8ywj zG`GEio&tWP==spw1WXmDK`(@@MHK)jeBZjB6LWQh!JmBub9E+9I-?(r@qkl?9A#VW zwJeTleG}G8gl+(g@(Lih0gp6`%|)aDC_L8<5NHr@>&#KBm5y-$9168QVsMmDpnecg zp=1%zsxpFxYk<@U;0-noA0#-NNQ#0I2hV6Tl9N5<@qqGBP!0<)CRYn4vfG#ofu||< z1rxNlQ2oPz(QxemIEBukfnw3%x64mjq%%7QhyM!T%G6pE`b_>exib2gG6v*lM?_)X z@!`yYBQRIeJRJ78?8`B%&>A-Mjg8Nz-MjnCA;_&7QX|iSd{?9LRLxY%1dXO$o*?)y za0+qlp;d96aX6&%wF0BzI~n)?{P|N1-wBFIM-!Si&tK~tTn|2@gt)l4f#oWxFR(OW zCQX7y)y(o(;OGMD<}a|r;8{bdF1KSfgbhiW;X0V@+$+S_EYQ{imhYPF?nfrvPq{5D ze83E^U5X}ThbM7E%z1mnhY~8_;km(s{ADA6#3KHL09xm3ojLr>X4y*q>37MMXE%YZ zqa|_7Ri{-}fT`&Q^}A^&hXE#jyHm%!kYMIV^6m4C7l`i=8kAiIMFLS_(|8{+F22kc zEd98+f1a^SHGhHz4bZM}aV5>?_DkjQJ_?F|-*|Z&#EkG~-Th$4$IBpKlz=Il1&%84 zvWCS$KToBdzkw|bhtw-SnR$$N3P-dH@>PI1HM5(+d=gYBuMlkFYxl!o{Sz=HY@cWZ zx01d$YB_r&XJhdKGBdqenH|{l;%8aL_6T~cm_0S;eVJSSH>?~SN*B)=pqs&I;UJDH z`r?ZFO^NR5K^9flG20Jn?&#>~2u$WeV21*=f@zIX#9WQ4X59oZy{z+A;_tjUp}MMB!^J1CRc92seF+7y-C>Zc#^OktH}X%-$Y`-l z-E|d$paL#r_QT2)5MOm(0FiHr$+`HNV)!i+$~n8E&+rBoV)!AX5kYuD!?yqM^`J*VxBUi2uM+ZxBNUT{ zRz;a(c1^-KS?bit4=@R z`wI)(^G)PafZN+fv|Mxq(NGVIxFCtP5JW>pP z98z`zr!`44FAb4)wzSU&%@$rdl+ClN@~ayhL$)8}CMU^85R>>nEFXj#zTVZMx<$&B zx>6fN;(JbB+)(B?OZB_9(fic1I#}ZN_96NOr{3#*?G%QVO#f*2n za`W=aoR?OdpFjVro^WO)jyW zFB{l>A5a^B9a0E-Fs_%)P?Aze(w|XXfG?C{n}J$q?#9s^QLW_0QGr_k?av z)wI-yyep0%$r^cKwrHhgk(=zZ7g(_L%X`+jn)%+a13K78;riQy=ZL1{ z&~j=b*H*-SN1K<@qswaQWsU!6M`!;#9MvM`!&l_E%Fd#I+f@j&@Ar`m0n5wEPBWS)|KIZEW1rYn^&-<#2u=!UcO*D7>i#L5za-T;f1( zdxmhLwk$`grQ4e_$1-|vpruqw`Xxm=Qm{dZBs040Tu2~OQTB1ZieLakLH+%mooi#c z(pgzqdUit@p-`gy!x%;&wl^kcyamE*JIb}9)tP&H<}lwI4XNGPe_7Lf9;4EZ9rvXC zj;XAONPB0000{*vU_F4_o@Y;CY_5eel{2a>RtRlh)#+q^?b2y;<=K-bPws3j=q!~F z;gMR1g0WD}BtMPr6Ib#mi+FzNg%uGisTO)&Q^!Ikq*yGO3TwV-J}%&bRQK8!@_gS9 z6j6(${L<+B7jM+m)GQCyG^{W?6=MuyH}SzBq1IcNag966WlU5;trPsx1vh!<)%-=c z(R8gdey>tY+)eVb1jEo0G(ZixC99&27jrk}goDAKwDqGj4=yDtNOXwd{82KFrqZiy zvg6%}ooC?~?l5?e6wig?75eXR$^06kA|?=xlRNGTDR?1tzUGCApdq7P(@oks8h46x zKYXpv0DY!GyW-`i6fyPuY&63VgWVP+zdQ4qNYc}%U!pXZ`Wgh8P-9p_2p4ZW*5lKi zj#z?*+wVSlOI!BmN^fkEF*Z?0X#+Dsm^JOe_wVdU5$E6twdylVN2IIy*Q3AWN7}^3 zsILH&XBHa@IKvzUP#Q843$)F7 z#*_tO)U{5HZ%Y};z~Bsqbg0LzhDf!$aowj#*o>CM8B}{ymyJesdvaYixHJ-841<9X zleGI&H#ebD$!D_YXbIKw0h!zA1*QyFY%H4A@Kw3I4918R+BLU&`t)hkh^f!~cS%OF zCK|BE%~*$)aL=n*8rvaNHb{|2`|nXnMn#V_LuF;9#>HC3g-w;nNg?}eFA1(exl%y$ z`F!hx9GV6Ru(aYwjKtXVPj{ojF=Fq6rK9M?1W8#ijb(m?LXi_9nDvb}Zxzr5Z{Qig zZms4t{Dehj@j+*_ubAhqg^?0cgHebBiT(*U#$qihIyp(AX&q)q1}#D1g@H+E07mSs zt+Vmut9YTt%t%^goeC)le-gvX3;&N`+frW5v4oVQa+F`PV;D}gImy{m@8B&P(Z286 z>p5LX%yLQvt{U(Pci{0eTt}R~_#0cdHPGp>ltAs*A zmeU3ZAORS-1IT9xMt`^S^I5v!c)I3ayrjC0F&V(z9SUN!UC&DT78~i)t*YH${txpv6W7SUa&ra&d%BD)H2F96eIDC+nooIB`RRM3m}Rv z*i{-t22N(3jMap;#lp7u(VPzbW2Mv-yZ-3r>V{)g4C{f1h`9G+Ub2hcnRl^(w<5{t zN}QT4eNNC0gWAmPA9QuS?s~vxg?x)uw#c#Z%gWGTPQ0p>3Rw5S|Ftf_8p->U3iI{K zr>^ZyjE8w*)R(zp(}!C0cQ;MHu$V9-sZ;Zi{YJf1K+&{7Z%{ubXXNzoC31bgSMq6m zd+eQDu~G(4!<`-1yAl$oi>s@vBPZUXUFm2_uor*Sj_lI{532qc1Za1vogeQV8tp#} zU_HgdcVUgPiJIGu-#fm2S6DbP(tcGZP@Q=jO-cCg*7QKxNDOKgP(!}vwl6F{w+%Z5 zex1C0#36<5)sxDQI7Vr|m}dPd{%%X7zm!S9{-?WOaLRlwk(>NuK{PZ4oG$G?w6mN@A~#z8g!+uN}zJS{{ZABb(UDdx(!h=$rk4SD!Brk}j?mNu+$ zI2Xnj-DZ}-oMKx&O7}1_mJK=ydJD5dA#xbl=*^&5N6V__tm-;#`=aM{0V@+38JRQH zNzEf>WLbrAK=bkE;R@}@CN?nR4`>oeQp9&_GW>U`F1(!m9olnL=-|3nbMwU-=rI`V6=3iqZ#!K}bFW7k`yZ+Imn+Ro74SIuPNgN%;aU*x} zd_|2*(n&7Jg_-)3o;d)v7w|RcGMxC`vJlxs44Y;UD^Do#&&p9Tm&MM|;|aSoj9Zvq z%TJo~eTYQihw}8e14Upg)$ud8Ahym>&7>^nXZ`8DqZA5G*!MmN+wS z{=Q8*t-|s#Y^|nUTR2U4`ZoI7W`cxsI}7xh5)}n9xCYJ( zoYPy=F$EOSxgh^Re-s0>%_x(Xt2BcYrBrDGZSF9~n$K3%Gs!R`Uounk>zebJ9xj7{ z5N?Hein+|mm;J4ohQpdCqIPuAMgH7ht6rNsTqtXHVd9?bPB@o5@d14-G@pzSS#6uL zx96CV;pU!_m0jjVZlU6iK1@*(mZ-){J2Xz-W>L#S?p?#tU)AA_ONvl#U_{1Ul`Fee zj8~9L!^!!wxRJ6Rr#@0$ zCz=1_r+D$HEsGJN-}N>2mlE(XdxCHu6jBQRpyZ9UrpRy@2a9_$nmHw@he)V&gU zbWj}p)0t|c^+B(I0E|Hc+owW#S)_9DMjyEGZ90NE$k;Vr8mh*i8hJ>o+&Vf!5~U5r z@ZMer53#d|hUlzVLlX)kt*KRVtWjRsd>nR5k7!93dw%8T(tu%OWLJfW+BFT=>9>p( z+KG`y!Zu2&Y#hdEs!MI;)^>J+ikjaOxd!0)T<{IR;3lcXwh%V%Pfla5xc8JS!t8X$ zEPaYG8aj+!Idy3)-2%Cz*ar}8p?}#y$XfLAl8LDBF9_N?3!JrU73!eCRd$stq`4P^ zdea%qF)~hU>YW~cx2bBIWw&|osxF;Vh%f400l@i9^SCV~L-Di2es+CXR@yJc+X4HF8wJ!YAcNIOi0<3f<8+O|=8neTt0-V) z{Xxn~yDalI7g=GW*E~vSH?3GN&-&rJ`AF*2QIDvOqls;mgArFs%>Ft46T9p#b}hlFkOntgQsjX%n~RT1@}q16UaI7qJbKKeE@SugGh)L^k$EhR z;*zenOm#2bC~AJ|aKX3-XLarK&4b)=gBPrw(@X`m=YX*#1ZAf z31L$Db{(VnI9Jtf7?;BQIkoA%r&d-O2`r8kU2kShkwN=mLHMz1^@C4FX*oF^StusU z)#XQ7&wuo#;As86}1_7bz~iIJhon&bm5Cluu-8nPvc`#Q5Vp zl^7G_tt^b>f^5&8PFAvu+n1PP%hyZjG~ARx?r{|7)F7egA?A{5sTqsrRKM{A_Me-*BqA5K_o^74Nl{`aM5`dDI*UP zXNzJAI7k^ zn>LKMPjbBSqzWM>8R{_%#cnL}g4It;iu%TU&%-sx4Wu2q=_W5ji~PQR{C4sQgAhyx z5zmIW{MOLW(9}LQdpsMGl*`}xUeF{v=8Z=4AsN5UVCy&a~hyRa7(UwUMD9B7&oNaAzLQw2{g&VwB4USDBWd z+-oP$lGGxXyB?aTUhYeaV`ySFPAvwti)IXxuJeY+boq)b!-=N{{E-hr5jL;d}A!lgV8)q(Y4az@tt`AiJs zlqs=H`|o3^qqh`Z-5a!w{m7Mrb0S+6-YLcb;1Ph)R2Zq|{3@Z4tOFGpMgk^H4m@z) zf#dr?nN6zeM5x5D#TdiIY0GwRm72}mZG}0wrTQcP3hPVpM>9t)MKRTHipm`rIJmYK zv6`neJ)c6MI#zPSx#yeF^}EC+gZy`_7jAti1+YiSv*FT3u=H6JpI|*0&_~=0ih4FT z={WZ*zt8b|M#JThXuX?{hPIS+o$arbKG|&Ly%Z8u`KQwMpy$Bb<{ufQNBW>I)J_$> zdB=!+sHo{rR`Gaq`OJ0bQiP5^(bcw(DE(x(+-m!>%1+^$T3U?_Wz||~qV_Z(Js@Xj zl$NRzbd((#!-#yY6f>)Uh}~m_Iq&` zYwk`y0moHBuz~^aJsY{uuNLwxD=(o5W*HZsPD#X|K&$^wWdl#Yz_tgN{_AkdYuE0w zE-zEHtk{=zB+k8Cde1Yb7GMD)sbCC^ra*gz(dF20oQTSikP@Lg_oC;Sxhp_M5sRz$ zRV}JDtoD4{U+q!d(@nK3&2^(%hEKP^OynzGoS){P5s_ggaR`g{E4BwUy+froJNbuB z|FiAVBw>}d(K{QXMNKvq7DLKhx#WP}B*gsnMurRv-4-4(DQm}TqeMpihTDQ4aDr7! zd+RL=e|9(V=-1HARqBPav=hPtBJJq7IG3=l!Q%-nzjsAz-)<7GaeW|nFPCi2^ACzl z{@NjZ6O$cAr|JWv7elMD6RF`9Pq{Lj<`I*+VE#u+-8sK5u}c&;(Yq)v_t7YPuu!Vu zTQ)^@?jPn(q?Y1lX_}$6`gIOV>3wxmj&!%|lEfXcyJ(!);api?(6vf#G9(4jY7 zFBE+^Dj?%x-^sP6MKdb38#Q*BV&AEjZZK(e`K2_LD<-*c{47^%zw<-E-g8vr2OhA* z>ern+x%X7Pf5$PhD*D-NRbUvKynFXXq)6Yh>^@2OWt~;WuFBZvXO@E4u0&(^SrO?t zP}e1}FG@6Pv3ceUf0o9*7c}ip_aGM6ll&luc_*WX7!<=O7PnLZg{gLih)x!>bAg)WCyuGx3?M=yi8bbf z&Jdjq0+XQ7w_9~dx%TXm&Vw&8m}I0>1G9}71=ViF_I<405V^0jI zRzEvg3R2PVfkkhoj@f_dGa;v5Y$F(E!Bd2_Ymk?%F!3%m<>@JRZlb$F%5S3=tilHK zj0>^AA_0F@UsIZkzQE~!bX$j>6$dx2fs7wNrcRIS*{gUXlX1I)dU?*wU>yFtaWrWL zN>|Flr(z9n&Efk_@AG3_rNW$|Qfes6c z?F3JJmt%F|UYA||{+nH9@}w@Uy87HU6*-Q`Vn&&?7{-Ex=f(lOhBxyLTl~juV>K81 z$O&ryD6Z>$kLphqo-|tV1>0Euiset$`5{M z!E!6T+Ca02N>FO5s%HMsXh$9^y1}57DEgM!ZYfqb0Q9Q4`>~=`7%|Y8crnlp!r4?F_ED0QD=6=N_>ITEJjE$7>{fiT_*3iN>-N(%1R1oyg9zNL$z_ADeXu^+cQw4%?PPk2HuhI?<;-ue zB`#%U@viu`=WOnrwW!x~E4_ngVF7d__nRt&&zx1ivlaB=LpL#~g9?e}<*$SP8ww5v zO$pB{3NFVl51m#%Z!GW$c+j?+4lNQd#sNsnY7SkKskzt?*gNLa{F(W~U?V4sU0)z= zOQXex!TNg*_gY~OjS)~%OaoIV@qYH;K^3R$fWP!bS;@%3pxC3xG&)WfHznJodRAe- zdKGO1L?F{Q(Wl}oM)!PhZul#4Ro1BNaeQmk*RruQ^k5ZjW3bj^9NWjyAw(2UaSHto zoy#s)grgJM<&(oq%Z{^#D-F}GsNucMuKza(_055fYgnuH(tVT4_gJ4h<~pZQ-1?P@Vrq~Fb42^5 zF792{UMMFeTb78L0N=3fKuQHm1Q3R%&ZSrrePE0QoBk_pypgX)JUy5@x!U8(Cl8_w zhGoB_2Zb$=bua$qwvADoIDTaM#Du|a4%lf5K`jK5dD6ci<%#i+eTnVzHe2L}_A3fD zgK&T{oRoYwDqE=V8p#ea{biN~zf#(o$?Wl}%oDD*-TVY#y@AIQSg6#uCoYnISRa~m zFm(P}>6>SWP|+^(Z@g6{Jo2>m>mia)YYirpBzR2**17{uIQFjoBfibJ;dR48j+Zyo zB(0_DCVo8l`Hvx$6%8uuqvR9slp}S{^No7eYI3$DX5CZ(<+gyWUzN<5#|UTNR@C??BEt#N{%QbP5MWj?g%S>RO6>_P?cZ`*_CicQ7L0tPR@Qcy1|*=|hgIT2&Y!oou+$`>>~o77=+}C&yL|oShb$-V zQ{~?|TGa5U^tmk;a`haW)m4p82`|`0;9)Q3GlG6dx*QiX)EIWv*&sX41PJa1T_M;Aik(>w13uYL$By=BrucL zW&e*I;X$WV&mA>@7Ksxv!TPJ~?K;8!M~VM@1OoO0=URvtU3AxewjQ=5Uk_TAYlj`S zg3{2-r82804LL*rq)n6b7LoAWU6fvO(Y0CL#+a!7cncLvF+@ zzpSi(DSxnc4!4T6kPL$GO^Bq*iX3s2Td2cp?x|H%8oF?R?RVEK%aLuokf;lbo-aM# z9(S9YTh2X~UIyBZM3?%Der)mmc=`DGiM8He%9jIgT1e_W3(AU#zPWG=oN*$c0L(+b z^S#UcCyU6OS?sd1ZJ)UFt#5e~)s@Ej{U1)SKOCiVO1Lif_Lj9LP2*xfpEF+j)m5Jm zKRA@tdvcwo#p|YoUu`qf>R!Kee-wkX6bm|xYy2ik!}Xb(XR?t9YfCW6ZfCxVpC-EE zeiF?q(g@O7XY=>fvVrHk1wq_5*kxQQ>3 z9mr@oDvlv)(RNqKGIy#(KsV1=Q?6fBl^#qqH8qVsQE?nE`VpPMj)htxfj(E=K4bmV zZY&|uAUlw?ARFuhCEf4;ZLbDaXMq9+dGEe!U*Pa%ElocS$~BiYDsJar{8G06`=OQT z6Ucx(5u8YY)}t$)7T5DPtPBj>Rg|=sO51GY9u)O>5nKbL?cY>9r_i(in73m-NiG-@y6!g{QDG}j9RyT4`-f@uc(b%k5>oM=6e%mY z1(k&2f%FU=$m#zGK@|w7007kcn;riBYKZbAfsjn1EtVtUcQ6hP4usvVg8%x0p4TlG z)X(d5(Boqn_3%xn_-n`v{|nFOK*4t9iCwp9xuMU{Fr{S(>g4o`X7uZ)FlY0p854FN z{dbx20cf4I3aiKC%$=Zs9u3!V0E_r*GA$<~WreaaJz8uX^YDvDx9Z(&*O@vE?3=Wr zTKl3?z&UBe>V`yyMPBstzE1gqFX$ZIe_$aEn4th|0%QoIUHQ`W>24hGg!$FetqCff zITAPU9MXe6pw#5}_nK=0s zfcR0Zzl}uf`a!Xn|2ze_6L16DW8ffF&R;s) zGx>sY$_CcAS=~SmaFsv?^HBsJ9QD?Lb>{graRrnkXV)`_rTur3vDc<^t!l(iNzn%~ zfsPDO%tSIH5!&WB+#?3|SGckx0JS6(04f{4Fz-OTIV!3=`k?Rc#p3Je9weJP!KiH` zkfF`uO^eVjX}@BxohHbOKqitph<+Np#~@zA1;S%A1knZaDC-y}cpd#&&@OIIg2RZ) z6Py$>1VnC&V?bqT`Fle`he!rEO>hg{132*UfQjI|GoC0$b)qMZxZjK2gK>o@x&m(; zFTaK!boZ^n|9Dmoz`@8kzcSw_h+^$8xBZ8J>?r#=bi(`kg0h-sb7)G@W!sJ#1W0^< zi_CKJ1rJdvwQJI4Ae>q-fx80RKKqQfplUe?3ce9EDyOec+ai7-UjTOYxEBo>3q0mN z5ej3W5&`%>yha@=``*4l8p~=ffZRYNussv|0$)fPpoqLxzM$O`pS9__n5Gf|QUwru zQe?*!#FVe;7?=&07o*n$9s(jckHT-#TUwS}eqEH+1VP&c5})%I@jl+p@XG)G;D7rX zR}!;o!g1#CkOBuoke9c2yzIbuBny3^YhwD$`fn8iWJIPAcx{G+KxT)sQx>RXRBc0V z?0P_w0-!=2^jv--bp_ZOBs#D#jrd7CUsw&&6)-kPAafpq5@iVDPm|vKAg;I8)fZI? zvgJ)!jt{(&G-pC$XN{#GP-k3aWbBRUY`rW7X*D1h3rw+l_-N!rK)K|a?8x>@{*3eK zm+qz7+s)5tNo9$l&(f9Tt;D*Uj{cLC0=t!@hF(6t{@x&l5remw!sj!GyJ&w)ueOSd zuC;dtDue5!2q?h?XZ;q&h%`n!8Ya| z!~PHc^j?KMMC>7ZbqMu;8e+0m$ABJl-Aj&;Svg2ezegZB7@vB>7|b;TbLo!H zvarJt`D|zqC#4Dr>%rF4rw?!mg$Ch-pbj%twHLLn5^{@mZX*Xc^C*-u~2Lz z5cEMD<3K_GBEHIf=ww8v>?6F%92 z3mG9$VrXM@iT^f&Z6q@YC*j6caeLSryQh*d*;Fjp+>XuHXu+^os&Ve)YJ~6vC0Pak zilx3WGjveHh-ay4>yLtuNA%V=yLaQW-+D-SJ-#6VeV!teDeA5wm#Ki~6Ib!WH{rUa z27I62e2x0V*`pAbt|xU}5r7ULVEuZKS0*omlJZrAfYyy*NXNM}UGoOYL#DmWUVh9K zl-)6QSo78wtRJAF&9?E;kQsu)-IWUezcV^DxtPciPlhaB7HuvBWu3*Ifk4phR zjpDf1MpipC$j}EWzyaYW#&O(NJ{iXJpKn)XCx~J};QQ5RxGn)IV?~4JZ}2Piu?n01 zw_2q~K$^vX8NwUqT}dFL)d7>V*8v88ZJbU40&T0t5YSG39luf{T&=LdaRKa;&3mKR z>%p+}PknYED)PX59ss5P*Jz-JB46=lRMK#G?#70Nl82W)rdJ&7kzkMnDubQoYW%G4 zl*lj$1Hi~aPB@d-Eh|&6^bG356b1w|@EJyok_$m;ECl%wv39{V{2aQ{6$l35%4pt? zQK{d-{V&@r8ebH6YjyM-8Ta34N{aw|G8R0-C;8-H&{7W&$qQ-*nr7_orvm?CAY97> zD)UVF!riRGOH2767(g_4F%IM=ezRVA<4-9k?po{xydL01 zt?MABBxh?+gL8Puq0(EY-Lykj;8tA!pbF0iI|gvA*B!UWNe2bU zSepycTi*VM_Idb9jZBWxRZRNHISqq``a~q3qnlOD|6hx!RVxPUcUuUj z4Ja;o8%fsRR0y)ca?R6zc-TYQ{f;ge9de4b&Fj(4`9>eC0(WEJAwnj_WC&9MLb9>Z zLjmMC*sQM{L!QgO)M8)j+xSnt8VpO{ciA`aEq@59>puwkn?!&|Hm&cVQ3{>R^ix>= z&-xY)=2bkP?&FNB%6qmq3D^99`Kb}Nvlnn z0*_)$BK^+5zJUSgspK~@Kjn8AW&+(zXRcm?ZU$LZ$cayx{UJ+wLK`%6)P0fQDdurf zXAtJnF6Z>WloFH#5dP;OK4ryIHLvGIl>*M>4j>#t?FJtijqe^^h>|HREQ8!O5KtpW z$t$GvFGOZJsbtxJmwqwvxBI>YVXo~QoNtC@Ie|P3z59WQFGs}ba#t^cXQs$x2O7bs-RG+O=S?yDw)?;G{*zWipxLR6k2e4WQ>dDgoQNd#z?uY*iIiN#qSN`9ixgHcAf7RK+e)MmF zoY!v;w-kXvvRbNH4XFA0dzxh6X80uQw_`l;nUbT_EGND#@Br(xq)f2l|ClqW7CucU ztNCH@9KWGP4?ETE*f7Bl(NsM_N z?=Ef59e?*=_r6^v)D0pafy_pxYT;kFgA*U0ZuV{1zBoVCuP!ey#~xwI=fnpda}%Rl zK3R8jVHFHHI(sH7E4xVvObue^y&S8xlQ{3I$>^Zyd0ip!RqV99a7?bJEl565! z_Z1Ydb03ArL{YF(a{hWB{Od* zz^PtQc?Tg@NQSOEuiQIOPJ&WUtoM&j5WEhER@9^f(gj^1Ga1~BFK&1=4)k2Wp4#!pzHUEoGx%Y+8@bn)J9 zo191YSG+cj(#1})DQIXoO|5JORSj5p$aMQgng2xKl>nSZCfRg@s+O z#m#8bYh%)%9{~a&>@AhIOiSor#)`s<`>a*_zWE?Iiq8?&7cqg%uaKx^1Ghh?0t$IH z`Qmpe83|yX`Uk zEO+amoR|q%PgXM;VR;hWAlwy)4pYR5YE!$eOEVYI(4_Way6>MJO0bf?`K=5QOwI7h zDZ<+v!;UYwdOW0HrXE8E=AoW7t$EaA28N+ASg?}#y4N-Ox6=6b=gpb!fkSs&Sb|5a zA`KKZt}EZG)deBGNEh&sM|MCQJ*stukBYe$_PQCQ=jFE*pzW~MJR?Fv!fFk`p$7mD zRN^A4X4dm)&7QgrHgl38e(K{!%WW>EM%q z=Kk}&S3sZ1=Q}+My^qcRjZu#voMpx*Nm8i8fC3r<*~9mJHRxRTd^KL4TpYHvJdb0t z)=B_H7RW~UPX7JB>0B#`&C~%(D4Bb|PNhFG-+VVEBXZ_K*`+-h@}Yo5{j`VXw%ZaC|d)HgJ=h;C6Y z{_&bu5)!?-A#*+?wm<$eX^!8txv?n}Ht9#=53xl>`1{7dhjaizhJTD1htQ7{0tl-K zg3cbc2fC(;kl8Ai%9T}dY=!spAA+N^=42y~17*$|^zt_}ongthTOdV1Nn z@6=x5$uPIXM74IApR5PI_;JtFI-4udkAYW9AJ6MkJbNRawZmD&v35Flc`>OJf(q8s z0p=MPBCV!=kt>Ez0%wVv4PT;vJ+tgG0M#o2vP6qrI1^T97lJcovw9p@Bw#YLn4s%l zm;j+nKMuZngk{a#oqhj7fo?qv1+dQibt9V!VlypZvstvO)&B6sxQx}gt{8Ao2PMIj z>|{0l6O#STh?;&$*>4l$?_vhSC+U;GykGGM9pN1==}Ai(v* z?A`lFEHnB<0F+vfM*-|O<7q}_8a#OV>M6m|O7wwx&eT>5zUOeLuN1*>zn?tZ8I1Ga zo80&$-3eFn1WjhD+FJBA!johNUL+(k=|>R4YBf(tWV`wZ7fRhRS4_eDJ-w+P(FE#O z$gW%^zIq&V+R(d1M1H%$Z<|ho-x(CXd?FA8_LnY2y(rEzwtcs~FP#CN{Qw`MPu@0O zcFY=oR&jgu3+<8eD{^&MC5i(Vhs(!&( zULBQ($BJ{T3QAv3){ZB9rG2z7twmDxykJr$5he0>d@_Z6GFuezxga$WK74@hSD zfrvZyr01xMLF$KTR?C|=Z|F)l?7$Jun*r&x=Xt7vKHC2M*D_Z7e`J8Ox))XM8>1d4 zcet+>Y~QOjq>(C+_6X6~?^q==H#Z-mGI{Y~?8z8-PYtn;Q`Y`4tYhZl#6M5U=18tZ z<9utr^`$BQb>tz~Jo#)_{@~PGO6&`V@)wSiXT#LPEyul9QhRP?uw6T}Mh*{sGNqRZ zGlt8uOoeG8Ev2IHAf&OvfL&xj+w@)+wN$~})7KjNJ*!k{BKG4>Pg`;76@d1nq6$x> zw~}uARQy_5`OzN|5>mSB40doDDH}|8Yo{1=j=ykp(@Oo&(2=g&`9?eU^9q@FY+F{+ zHNO7|8~hXYG;{4?k^5@n-gocD=q&K6&0!wWrJv)(bM}vtntc4};r69!E7yQ8FzFxX zVJ|T6`BC=MiZ52o;P1q!gLge#Cvo`FTp10;-f{wep8QUc9%I*6g1(8flgvPG_?V)pld)%fIp= zXn2=AzqdncDP1G4ae<652g|Tz^f`k<2@eFZtX7BIXD_SfuU&~3y#hy|?%v5pnSUBA zx2B4EAmza?hZfZ(qKy1r$&B|p8LhoXHur1fIKW>+`J3TBsvo`QJS+|#Nd$Zsxr^u8 zZ*}bphr6Jy9LL|SnNyNHBsjtT7~`4nz3Dx!!&<|OKVeY{9pEMFLj|ebSdP;>wl_d4 zf$SH)uioV?B_G}J|C;*tc&OIz|4EcfrH)FMQ=_JuBso#J44X>L>4tNBPCf|dlu{|B z!9?RyN2#MelXO!vZ57GMB_RzWR3!E&a%%>Ij9kVrVzvywwYTc~+pm{Dygd6^>sjl) z-s`gWj7te8`tWvec}C~KfOchnTl4A(u*CoFaN1h7!2}?&wab239(U_jSAfMBE*~x! ze(p2(VmyOM8B_<%Eo)2Yqq4sq`uF`QB)Eib7B+(!b?@(Yrqze^dOkFE9w+-Ha+{!Tlu!$@)>B&)1bW2%C}x)0}T$R7ta+h=>ooS zI4x3KI1G5bgvum(i4wh|m;7V_?PW107VzvSKE&a4er;|ms4tS}iD!%Fjdz z_5!3A0i-+MXojQ~Iiq!MF5$wYmu-Hp2s8O@7ta&_Vq+5;djFj=1eU6xr08tWJiO30 zo0A&YZ-XA3)Q2bZJ6m(^bz8mSrn~0`eAdz4>SXM28eT=y_Ey@f0)+Iy6HEGVZ;0AL ziJr$o4?Pd@kqw1jVDXuMK#jvw6G)v~{c~C+u{K`>8^Ae_TI^mU(fYKf>krwvwHBww$a+zK&YoF!iZPs|G|G?S2 zOSZ;|?dhMIcPhH3)aT@W&V%b}_t(*~I-i}g4la!C32(Ax4ELNUY#8Q+$~=r*FV#kr zm5+r<%UwPhjeH6|I@Hq;8w?dYW-_R8Wf*fsmLge~>PkgUTw{HDugQr+!PVsPb2kwlG3I#(4P?BMUA-kh@_44TY&*u zXH>P+695QRwoCj~OkCcKm#q-tWt|LapD1-M@}-}KR)^OqbZtlFgD;Gnd`Z2Wa2JD9 z$}&4;S-w1Gc@KwoySx!EyT?XMe?~B$PiD8xj}_R;wQF{frn>r*T}jYdw|cxxlR=$- zOxm``w;uN{_^SawDWQ$qa@wooMtrPQuNNMxm}dW7!gh6==GAQE94qGxY%Ab9b}ZPe ztZ9`RN@EL^uS{f;Ie=667{$2uORV&S?0N<1iD&YDuh7F18hV-Ajeb>jrx%8;PPf}e zr~%3+3dP&&@n20i)6nd+R*XIq!Ad{v8+gaH9a9#~H#=~#<;SMpw(PI$0|p##PvV%f z<*wZa8B}S`P6qW5oRm1n462k?h*ut4Jl0rO5HvU4?!shJ3OFn&R7$I4P+e=VQo;Kt zisZ9geOqo>RHiaU_oz7cOVj7-B!%`>gwQ`IEg28GurtN!gk+p%hrkH zrkv$+s_+QU(^$%g5g;9MsrJ=IpVSC?WF!Jqh>4&y-k;yc@wSAMzv6SVqPPmb;2Zf0F}wMBq)R;U@*cc8UT_UO6(+kr0O~wd z#K7*SS?0DJ9=kJVAWeZWj#;PMB@;{SD2uLEV9Y7S%rPbj8$Ea-saeg|chP=n+w+lm z#mro}f7<1@*&4a$|8Mu--V5A=8PtXZ(ow&bV5P4d*D}z27t~Ezwm)u!mDws{2|vwQ zX-TN88Sl7IC?4a@*QCz(m+rG=KN`cBTOkC>B+k)jBDVZkp=wA2VvID+tgJOSpF1s* zD@p_-K2yY8=W`X8x_UX@9!h08k}Z#k{K0PH%e*(Hal&ac?aZ|6adn~i9}#ZR z?6(At!j|f3Q>9An2_W?8E7H#0l&uySU-91I_p{faq$DH;>Ql6&b7ejt)w1?1rL!&vP}8 znAUHqZ1kGJ%Tpm{Gm-a?6&bv|E%mrX;r@F3nR0Cp$2*eGU42jrR#ueIt97Z;-jQ*B zUcl$~-}H;1Sp9MrmK>7Oc7bsrg45RZa(bkGv)D+O@>hKX8;@aa@DrVM1u$J&4Ko_j z-Sg`4d5Et^6*z+HFLfUDNp)FYCJ`BDA{<`M=ej?!)>qNP zLxepSWb7GTCQ!t95;oR|0RWguP zI|O9*15g7(P9nc>Ty}krvaI`4U|e@ydZB?}LIcXHH;f^n+l{OVDCwL7mb+CC%=>{Z z<~z2CQrB<}_p^>Z2s@SrjOuyfyUY2%*Aut~T@%0?aDw^3YPOucXx{SKNVZb2)zdhA z1U~hQ?dqK%G|l)m15p`4$a{#m3vj}AJ~w3qODd8lN2ARu89VcfZ}1n9fR)s)?&RVM zb0`3ox`&=Lv-UJt(_UG&0!VK=h|@=!9yyjsVj*DS^bk{X4&<{DU<5AjTCz)gCQI!h zdSp2fy_D_28jVgs&3MojkXxYeKNp0Us`%XHoc3!2+Nwq@xAh;R6&?0YK0oArcnJ0? zP{e@QRv(wPwI(Hy(N>{F1#zFF9NRFlsjs9hf0O4OJUczKH?rni=Av}*s(ey2|Ju@@V`2B* zWM-YsZEZIctcB8J#I@VRVh5zy7Z|gVjm%-N&7!!`)L_q!t`CoNF(B!mz$ehkQf?gv zuqZI*+@}iv{_02ok0!OjnvKK-OK8Gt($T>rTN`%k%L|)>HMT>^3FhkT|1VJbAjW*6 zFbt8lK>&IvErc;XK52Ud1My&>74WrEkODO0=MSiELYj0d!RU%hkR%T^;Wsg{nuO*o zA}Ss=f>kq3zi0>4Mr!E|c%F9K0nc}UDVBCtx+yJ)yta#hR;*tO!Bbj~*Rv5qr%|ZA z!?$)kA8yKHJ5U0z!RHSEq3Tud5+T`u2QCT}{!RRLj2R-)15%lZGzr{|IbE&N!3yeV z%haR}btl_~?ccrOb#x=>rArM$0R69ohvG)UZF^;TeN9FHknI!dsC91Y6IDXw?(gL! zEa9}GdBGEq*GJy#pl5_)>{yN9wmvfOpWuJ2aX!1ra!EGzA{jR7PKD}h07div{~s{tKa-i54%fa@Z>r ztoB^KmX~+!i9#!qt9V%fi1&?39QqsjT{78Gm3mK)G@K|eno6}crJrg1m2hW7>u)zxrrpV#AB12o`(zxR&ViZp3B0HUAsKM~3jyC)6%)avr2qcbOAD^(ZA@JT&j?{IIH_h^ z!5t;WBsZQ~!UToh|Ab)sKCN{`@b)mvNj0wD-El*sn7N?{V=gF$K)imED7FA7XC!*# zqDsg??_l0&y(-%gMsILUs-YMAq}Ey7J|d<4Eul5wzgCk6?l?zOO97HL>+OX;Op`s& zjthC3hv^fjJRiRw`1rxx1|!+B-PwF@g$}`oai`@m z*FNH9twD$bK;ShZikA=;@Q8RG|Wj5Vtl$8TnYWzd#Vx)(oJ(BVz=8`3w zMFh7a!zaZx^FUt>a*l8qMCrv9fa`<=Rt|oem17A%xBszWD~g#9augX+T-HbwHSA>B zpE2Ke-}54W_Wyx7M6yqn@}&V7bI}*{P983y=>{x54&~J@ELh{agEiyzE=m2ulv(XU zx1>TceL#&y0>YUk&J7H<)q5BP^Kl@5gNP7-{cDyv(EW#EC`0FJQeC09FyOS0ohXEl z%2AIiB~jdp3-P;ugy*Va48o(d3IBB;5zJ7K(jmA+%>q0T&%N}W5o@apik9w^ktU44TPiJS;7SPu{)imKPZ z&LnnNeLGbt$)RZlBV8AgRXYs`a~ebpMQ40tJ1C4dBtclhiGd}7k%vz>R14M18Gm=f z>xdJ4JYxVE7hU2z{z5=m4vu8Er?q{$|O4sf=f^@`F z=?(jLL=uV}F@zie?WIbtg@Oy(cvl3+CB<)eMTt|0yC&6CH{%xW~Ax~L3N(R;PRWxeD%VV%l^<K$ zF-z!%db|+0Lj(CAHn_RJ)n`+OWB5q*o3_`N7B<>Z0xuK#QW7<)&L0LkE@tlbBaFQ5 zGr@e8O_qMODX!D`MS(y7#Imhb>*r`w-wNCQ{j~^tsRFZ+@nihDmh14t7pU zL)D3uE7wOnSQbcxK3SuH#Wpceo(t9TX$O-Ux-P7%Cb?w6`S=Z_x#DXyZ@F(LTlq3* zoAyGH20kfJKw%V(uEpNL8>{o{K-Y;WM&gvJ-;6_~AhzE#bfB0Z_7BjkLLArVLs#BE zUERq9i~x*vm=b6Nk{y)9B%vXN+}4y%_z#fbOtcqed*wzTe_Gfwumt_2zH-(^gPR)y$hbf_f)_fJ4yBSd_b za%6MYb53}M@@Vby3K;YLZ~s)%GTU0!5+UvgOuxkFm|!8u(nKpH*k3^I^TOmsQ@P#~ zD-EYqHCcX3z{F^!t&dYI^*aPLoCSxs*-VP@-_9U=!Yk9_g9b(*D?%+y6ytg@J6Q_A z>*RBFs7X3h>E#NO(9b*WEU|3y^USra$`Ou05fB8F(t zrJ96I@lNw93@ht=cRxzLgtXqT>(8uNbC8q~hhg*&teks6$k-z;DqVzx0!J#|ImLr(==SPqpAYieOE2-tl6m0(E#uNTIyBx6;zM3uA70^#Ao4^MgT1 zJ>Gtfn^^~ZfjnCiF|v(RCIR@}xsNkV>PMev>l+%W5*fod0Qyt!lhS>bz%WT2zUj|5 zTy})F&%ngxlWKN*9)!N>K(-?0w0td8{l&}``3kKl_@;LoGxK9jB3~Fff1z$ZXiU@| zlq>(ls}@WnlECahS&+BRNJ^k7OfKa9LuJaU`5xZRuQC|d=K5TV;6ibSSE|V0U`H^SI8mZH8VosQA5B%o? zZ_=lbwctd((4v&k#{}+uw;qkgi7~Wuzd}}tb8Ct6-+joIMfSz2Go755@IT}J6yWYn!WHwhfiu- z6gM+g?P2(w3Hh4wGGZra4TwmGRu8h5-VF3s5*ilL{O^R&nH!^?$z!&`vQ=U8a^ z?36c2!i1@yH>(kEKg&IGgGkcl8l;71+C6XAav;nP1%o%(g6i`TS4i1Glm25!Xc(bs z^{|ES7)Ml5WrHNFvV|AWr|TW9J}30hG*#YEwZf%#P`(B%2I)i%@jVK1VXcIfa~%5A z{SGK%qXVNrsIuUiRP*|5Wd?v?umsqcNJSD+Dui%Wlw+l#^Mk=EDw_5rgj|Zg^aJW4 z%M^>SM(-K(O%u3domsKh$dX?(ekcz(1PW`Y*vW*@OH}5(aq;t0!($`&tKEo7jhHkI zt>KUcew3%!HlA5~4vd@W{pQNkMZoQ}@kbd4!Z+H(wc6vA0}5`M*30?bh8+#4GX}cg zd`S*|Ig1(a@8}pw4R-I$JfMw+TsV=myk7y{VLSn+@Yp95Tf6Jd`^DfZWz#}ec$pHe zvGnI(?fjQV760Of@vGZ;EcxYA#?Qm=ZCD#}oO<)t!R%bO{fk=cj!H^K(w(=X<^qM` zN!jkl3N3oJ0>7;^)J1dPRpjQk=YHx3zowfcW+8i}v8qsIWJeHk_fKhT;8TU=W2>y@ zK9k*#J}lgPL3t3&lW;Zc7Vg^J$Inh17WKXuxb*ew*Qg^a=TMJ=Pp`iJFbeLemum$f z_vKn#E>{X);-}x>vLq@)ix zj{mX2+JytqcW+%bWbc#8l*C@^;cUXOBvodulxDI3Ii`ZAsNF{%E+Hft8zy@AGEk?- ziZ_QrlVs4O_1LuRm*9#ldg5T^Y@ztpM?BJyjoe+vDQ`=%=0Fg?*!Gj1c{+5hp!}vB z1{$*j;vT*sAzszPMvAbc78mNI8u(1sq(RwV%E&ihMkw?r`=pxF+T?~IvK0{_Q=y*T z-9Vk*!&zYAdsIq`06@Zk8lGe+Z_6_X57ky-ObUFJcf`|KNH&@m>TvxS8zW}d+c;IgyIgENKE|I-T}wxKQBW5`WeyVWj|HSvRgD67WLh* zVR!#2)pPLqcGpKYu&p-QB@{O{W)#H)BDJzBrw<*wI+OcaQa$AAD2jm+G#m~%b*#8EjXM#sS z#>a8(+&gbvyYEgR3=}rKarX>#Ksk%F-->B>qo-hQy2Pe8dz>~!R$di~&($r9fEe3i z|MtNN H&oloIRMa~G diff --git a/res/drawable/ic_all_apps_bg_hand.xml b/res/drawable/ic_all_apps_bg_hand.xml new file mode 100644 index 0000000000..94af008706 --- /dev/null +++ b/res/drawable/ic_all_apps_bg_hand.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values/colors.xml b/res/values/colors.xml index 52c61e71a6..4f7c1a73d3 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -37,4 +37,6 @@ #E0E0E0 #FFFFFF + + #E5E5E5 From 325b5c7a6640cfe04b382ac39148d2601ccfad44 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Sun, 11 Jun 2017 20:22:08 -0700 Subject: [PATCH 165/446] Some theme fixes > workspaceTextColor was not clearly defined to white and relied on HomeScreenElementTheme > Not all attributes were defined in sw720dp. Created a interm style to avoid such errors > Applying proper tint to resize frame > Fixing shadow colors for homescreen icon Change-Id: If8441011c968291de50b2fd8d7612ce3d5353b95 --- res/layout/app_widget_resize_frame.xml | 21 +++++++++++------- res/values-sw720dp/styles.xml | 10 --------- res/values-v19/styles.xml | 2 +- res/values-v21/styles.xml | 2 +- res/values/styles.xml | 22 ++++++++++--------- src/com/android/launcher3/BubbleTextView.java | 1 - 6 files changed, 27 insertions(+), 31 deletions(-) diff --git a/res/layout/app_widget_resize_frame.xml b/res/layout/app_widget_resize_frame.xml index 91a1e45a08..874fecccf3 100644 --- a/res/layout/app_widget_resize_frame.xml +++ b/res/layout/app_widget_resize_frame.xml @@ -20,38 +20,43 @@ android:layout_height="match_parent" android:background="@drawable/widget_resize_shadow" android:foreground="@drawable/widget_resize_frame" + android:foregroundTint="?attr/workspaceTextColor" android:padding="0dp" > + android:layout_marginLeft="@dimen/widget_handle_margin" + android:src="@drawable/ic_widget_resize_handle" + android:tint="?attr/workspaceTextColor" /> + android:layout_marginTop="@dimen/widget_handle_margin" + android:src="@drawable/ic_widget_resize_handle" + android:tint="?attr/workspaceTextColor" /> + android:layout_marginRight="@dimen/widget_handle_margin" + android:src="@drawable/ic_widget_resize_handle" + android:tint="?attr/workspaceTextColor" /> + android:layout_marginBottom="@dimen/widget_handle_margin" + android:src="@drawable/ic_widget_resize_handle" + android:tint="?attr/workspaceTextColor" /> \ No newline at end of file diff --git a/res/values-sw720dp/styles.xml b/res/values-sw720dp/styles.xml index 5cfe84ffc4..bb0dbc2215 100644 --- a/res/values-sw720dp/styles.xml +++ b/res/values-sw720dp/styles.xml @@ -27,22 +27,12 @@ true ?android:attr/textColorSecondary @layout/all_apps_search_container - #DDFFFFFF - #FFF - #F5F5F5 - #E0E0E0 - false - false - ?android:textColorPrimary - #22000000 - #44000000 diff --git a/res/values-v21/styles.xml b/res/values-v21/styles.xml index 8d3de01533..927719cc1a 100644 --- a/res/values-v21/styles.xml +++ b/res/values-v21/styles.xml @@ -18,7 +18,7 @@ --> - + + - + @@ -123,8 +126,7 @@ diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index b0e8b1e81f..27e190e5d8 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -51,7 +51,6 @@ import com.android.launcher3.graphics.HolographicOutlineHelper; import com.android.launcher3.graphics.IconPalette; import com.android.launcher3.graphics.PreloadIconDrawable; import com.android.launcher3.model.PackageItemInfo; -import com.android.launcher3.util.Themes; import java.text.NumberFormat; From 5cc7bbdbb3cdce3040d2a4f091a4543c2d469579 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 12 Jun 2017 09:50:39 -0700 Subject: [PATCH 166/446] Removing dependency on onAttachedToWindow callback. When resizing in multi-window mode, the system reuses the decorView and may not call onAttachedToWindow. Bug: 62495747 Bug: 38463796 Change-Id: I949f8f8e37b5a4748947024df09097f15c940bf8 --- src/com/android/launcher3/Launcher.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 2de10030d9..ec345a7204 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -266,7 +266,6 @@ public class Launcher extends BaseActivity private Handler mHandler = new Handler(); private boolean mIsResumeFromActionScreenOff; private boolean mHasFocus = false; - private boolean mAttached = false; private PopupDataProvider mPopupDataProvider; @@ -456,6 +455,9 @@ public class Launcher extends BaseActivity if (mLauncherCallbacks != null) { mLauncherCallbacks.onCreate(savedInstanceState); } + + // Listen for broadcasts screen off + registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); } @Override @@ -1592,13 +1594,7 @@ public class Launcher extends BaseActivity public void onAttachedToWindow() { super.onAttachedToWindow(); - // Listen for broadcasts related to user-presence - final IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_SCREEN_OFF); - registerReceiver(mReceiver, filter); FirstFrameAnimatorHelper.initializeDrawListener(getWindow().getDecorView()); - mAttached = true; - if (mLauncherCallbacks != null) { mLauncherCallbacks.onAttachedToWindow(); } @@ -1607,10 +1603,6 @@ public class Launcher extends BaseActivity @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); - if (mAttached) { - unregisterReceiver(mReceiver); - mAttached = false; - } if (mLauncherCallbacks != null) { mLauncherCallbacks.onDetachedFromWindow(); @@ -1851,6 +1843,7 @@ public class Launcher extends BaseActivity public void onDestroy() { super.onDestroy(); + unregisterReceiver(mReceiver); mWorkspace.removeCallbacks(mBuildLayersRunnable); mWorkspace.removeFolderListeners(); From 0a3169bc6652f8cfb0b57ec9d6ac7491b5126bf8 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 12 Jun 2017 11:59:47 -0700 Subject: [PATCH 167/446] 1. Replace use of java.util.HashMap with android.util.ArrayMap in ShortcutCache class 2. Get rid of unused constants from ShortcutCache class 3. Make instance variables final Bug: 62466540 Change-Id: I465da77aa1521790c8359d0f9987d3fc1286b44b --- .../android/launcher3/shortcuts/ShortcutCache.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/com/android/launcher3/shortcuts/ShortcutCache.java b/src/com/android/launcher3/shortcuts/ShortcutCache.java index d4db96d313..5742d1de3f 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutCache.java +++ b/src/com/android/launcher3/shortcuts/ShortcutCache.java @@ -19,9 +19,8 @@ package com.android.launcher3.shortcuts; import android.annotation.TargetApi; import android.os.Build; import android.os.UserHandle; +import android.util.ArrayMap; import android.util.LruCache; - -import java.util.HashMap; import java.util.List; /** @@ -31,18 +30,15 @@ import java.util.List; */ @TargetApi(Build.VERSION_CODES.N) public class ShortcutCache { - private static final String TAG = "ShortcutCache"; - private static final boolean LOGD = false; - private static final int CACHE_SIZE = 30; // Max number shortcuts we cache. - private LruCache mCachedShortcuts; + private final LruCache mCachedShortcuts; // We always keep pinned shortcuts in the cache. - private HashMap mPinnedShortcuts; + private final ArrayMap mPinnedShortcuts; public ShortcutCache() { mCachedShortcuts = new LruCache<>(CACHE_SIZE); - mPinnedShortcuts = new HashMap<>(); + mPinnedShortcuts = new ArrayMap<>(); } /** From 9962dbe671ab04f8f5429e34f60c12113b4ddb4f Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 12 Jun 2017 12:16:20 -0700 Subject: [PATCH 168/446] 1. Replace use of java.util.HashMap with android.util.ArrayMap in CellLayout class 2. Get rid of explicit type arguments that can be inferred 3. Make instance variables final Bug: 62466540 Change-Id: I9acbde25704d62883d174f5573383a2d8b0e1e6e --- src/com/android/launcher3/CellLayout.java | 77 +++++++++++------------ 1 file changed, 37 insertions(+), 40 deletions(-) diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index c2c5c27db1..d0d33a03de 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -35,6 +35,7 @@ import android.graphics.drawable.Drawable; import android.os.Parcelable; import android.support.annotation.IntDef; import android.support.v4.view.ViewCompat; +import android.util.ArrayMap; import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; @@ -44,7 +45,6 @@ import android.view.ViewDebug; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.view.animation.DecelerateInterpolator; - import com.android.launcher3.BubbleTextView.BubbleTextShadowHandler; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.accessibility.DragAndDropAccessibilityDelegate; @@ -59,14 +59,12 @@ import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.ParcelableSparseArray; import com.android.launcher3.util.Themes; import com.android.launcher3.util.Thunk; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.Stack; public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { @@ -76,7 +74,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private static final String TAG = "CellLayout"; private static final boolean LOGD = false; - private Launcher mLauncher; + private final Launcher mLauncher; @ViewDebug.ExportedProperty(category = "launcher") @Thunk int mCellWidth; @ViewDebug.ExportedProperty(category = "launcher") @@ -102,10 +100,10 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private GridOccupancy mTmpOccupied; private OnTouchListener mInterceptTouchListener; - private StylusEventHelper mStylusEventHelper; + private final StylusEventHelper mStylusEventHelper; - private ArrayList mFolderBackgrounds = new ArrayList(); - FolderIcon.PreviewBackground mFolderLeaveBehind = new FolderIcon.PreviewBackground(); + private final ArrayList mFolderBackgrounds = new ArrayList<>(); + final FolderIcon.PreviewBackground mFolderLeaveBehind = new FolderIcon.PreviewBackground(); private float mBackgroundAlpha; @@ -122,9 +120,9 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { // These arrays are used to implement the drag visualization on x-large screens. // They are used as circular arrays, indexed by mDragOutlineCurrent. - @Thunk Rect[] mDragOutlines = new Rect[4]; - @Thunk float[] mDragOutlineAlphas = new float[mDragOutlines.length]; - private InterruptibleInOutAnimator[] mDragOutlineAnims = + @Thunk final Rect[] mDragOutlines = new Rect[4]; + @Thunk final float[] mDragOutlineAlphas = new float[mDragOutlines.length]; + private final InterruptibleInOutAnimator[] mDragOutlineAnims = new InterruptibleInOutAnimator[mDragOutlines.length]; // Used as an index into the above 3 arrays; indicates which is the most current value. @@ -133,8 +131,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private final ClickShadowView mTouchFeedbackView; - @Thunk HashMap mReorderAnimators = new HashMap<>(); - @Thunk HashMap mShakeAnimators = new HashMap<>(); + @Thunk final ArrayMap mReorderAnimators = new ArrayMap<>(); + @Thunk final ArrayMap mShakeAnimators = new ArrayMap<>(); private boolean mItemPlacementDirty = false; @@ -143,8 +141,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private boolean mDragging = false; - private TimeInterpolator mEaseOutInterpolator; - private ShortcutAndWidgetContainer mShortcutsAndWidgets; + private final TimeInterpolator mEaseOutInterpolator; + private final ShortcutAndWidgetContainer mShortcutsAndWidgets; @Retention(RetentionPolicy.SOURCE) @IntDef({WORKSPACE, HOTSEAT, FOLDER}) @@ -169,10 +167,10 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private static final int REORDER_ANIMATION_DURATION = 150; @Thunk final float mReorderPreviewAnimationMagnitude; - private ArrayList mIntersectingViews = new ArrayList(); - private Rect mOccupiedRect = new Rect(); - private int[] mDirectionVector = new int[2]; - int[] mPreviousReorderDirection = new int[2]; + private final ArrayList mIntersectingViews = new ArrayList<>(); + private final Rect mOccupiedRect = new Rect(); + private final int[] mDirectionVector = new int[2]; + final int[] mPreviousReorderDirection = new int[2]; private static final int INVALID_DIRECTION = -100; private final Rect mTempRect = new Rect(); @@ -1100,7 +1098,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { result, resultSpan); } - private final Stack mTempRectStack = new Stack(); + private final Stack mTempRectStack = new Stack<>(); private void lazyInitTempRectStack() { if (mTempRectStack.isEmpty()) { for (int i = 0; i < mCountX * mCountY; i++) { @@ -1145,7 +1143,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { final int[] bestXY = result != null ? result : new int[2]; double bestDistance = Double.MAX_VALUE; final Rect bestRect = new Rect(-1, -1, -1, -1); - final Stack validRegions = new Stack(); + final Stack validRegions = new Stack<>(); final int countX = mCountX; final int countY = mCountY; @@ -1347,14 +1345,14 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { final static int RIGHT = 1 << 2; final static int BOTTOM = 1 << 3; - ArrayList views; - ItemConfiguration config; - Rect boundingRect = new Rect(); + final ArrayList views; + final ItemConfiguration config; + final Rect boundingRect = new Rect(); - int[] leftEdge = new int[mCountY]; - int[] rightEdge = new int[mCountY]; - int[] topEdge = new int[mCountX]; - int[] bottomEdge = new int[mCountX]; + final int[] leftEdge = new int[mCountY]; + final int[] rightEdge = new int[mCountY]; + final int[] topEdge = new int[mCountX]; + final int[] bottomEdge = new int[mCountX]; int dirtyEdges; boolean boundingRectDirty; @@ -1494,7 +1492,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { return boundingRect; } - PositionComparator comparator = new PositionComparator(); + final PositionComparator comparator = new PositionComparator(); class PositionComparator implements Comparator { int whichEdge = 0; public int compare(View left, View right) { @@ -1794,7 +1792,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } } - solution.intersectingViews = new ArrayList(mIntersectingViews); + solution.intersectingViews = new ArrayList<>(mIntersectingViews); // First we try to find a solution which respects the push mechanic. That is, // we try to find a solution such that no displaced item travels through another item @@ -1850,7 +1848,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { int result[] = new int[2]; result = findNearestArea(pixelX, pixelY, spanX, spanY, result); - boolean success = false; + boolean success; // First we try the exact nearest position of the item being dragged, // we will then want to try to move this around to other neighbouring positions success = rearrangementExists(result[0], result[1], spanX, spanY, direction, dragView, @@ -1958,14 +1956,14 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { // Class which represents the reorder preview animations. These animations show that an item is // in a temporary state, and hint at where the item will return to. class ReorderPreviewAnimation { - View child; + final View child; float finalDeltaX; float finalDeltaY; float initDeltaX; float initDeltaY; - float finalScale; + final float finalScale; float initScale; - int mode; + final int mode; boolean repeating = false; private static final int PREVIEW_DURATION = 300; private static final int HINT_DURATION = Workspace.REORDER_TIMEOUT; @@ -2415,9 +2413,9 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } private static class ItemConfiguration extends CellAndSpan { - HashMap map = new HashMap(); - private HashMap savedMap = new HashMap(); - ArrayList sortedViews = new ArrayList(); + final ArrayMap map = new ArrayMap<>(); + private final ArrayMap savedMap = new ArrayMap<>(); + final ArrayList sortedViews = new ArrayList<>(); ArrayList intersectingViews; boolean isSolution = false; @@ -2467,7 +2465,6 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { * @param pixelY The Y location at which you want to search for a vacant area. * @param spanX Horizontal span of the object. * @param spanY Vertical span of the object. - * @param ignoreView Considers space occupied by this view as unoccupied * @param result Previously returned value to possibly recycle. * @return The X, Y cell of a vacant area that can contain this object, * nearest the requested location. @@ -2779,9 +2776,9 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { // cellX and cellY coordinates and which page was clicked. We then set this as a tag on // the CellLayout that was long clicked public static final class CellInfo extends CellAndSpan { - public View cell; - long screenId; - long container; + public final View cell; + final long screenId; + final long container; public CellInfo(View v, ItemInfo info) { cellX = info.cellX; From 4eb823a4cecabc104ce744965a4a929e4cde49ec Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 12 Jun 2017 12:44:43 -0700 Subject: [PATCH 169/446] Fix typo in preferences Bug: 62299923 Change-Id: I6e76a46f9e1fa7acf4b746840c33c914de364417 --- res/xml/launcher_preferences.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/xml/launcher_preferences.xml b/res/xml/launcher_preferences.xml index 876388363f..939fece2ef 100644 --- a/res/xml/launcher_preferences.xml +++ b/res/xml/launcher_preferences.xml @@ -43,7 +43,7 @@ android:name=":settings:fragment_args_key" android:value="notification_badging" /> - /> + Date: Mon, 12 Jun 2017 12:59:47 -0700 Subject: [PATCH 170/446] Some cleanups in Workspace.java class 1. Make instance variables final 2. Get rid of explicit type arguments that can be inferred 3. Get rid of redundant initializer 4. Get rid of unnecessary ; Bug: 62466540 Change-Id: Ia534fb032c20447e604011d466aa3efdfade4027 --- src/com/android/launcher3/Workspace.java | 71 ++++++++++++------------ 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index ce92c8eb07..3fe78757b0 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -53,7 +53,6 @@ import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.widget.TextView; import android.widget.Toast; - import com.android.launcher3.Launcher.CustomContentCallbacks; import com.android.launcher3.Launcher.LauncherOverlay; import com.android.launcher3.UninstallDropTarget.DropTargetSource; @@ -86,7 +85,6 @@ import com.android.launcher3.util.VerticalFlingDetector; import com.android.launcher3.util.WallpaperOffsetInterpolator; import com.android.launcher3.widget.PendingAddShortcutInfo; import com.android.launcher3.widget.PendingAddWidgetInfo; - import java.util.ArrayList; import java.util.HashSet; import java.util.Set; @@ -110,7 +108,7 @@ public class Workspace extends PagedView * {@link #isFinishedSwitchingState()} ()} to return true. */ private static final float FINISHED_SWITCHING_STATE_TRANSITION_PROGRESS = 0.5f; - private static boolean ENFORCE_DRAG_EVENT_ORDER = false; + private static final boolean ENFORCE_DRAG_EVENT_ORDER = false; private static final int SNAP_OFF_EMPTY_SCREEN_DURATION = 400; private static final int FADE_EMPTY_SCREEN_DURATION = 150; @@ -136,8 +134,8 @@ public class Workspace extends PagedView private ShortcutAndWidgetContainer mDragSourceInternal; - @Thunk LongArrayMap mWorkspaceScreens = new LongArrayMap<>(); - @Thunk ArrayList mScreenOrder = new ArrayList(); + @Thunk final LongArrayMap mWorkspaceScreens = new LongArrayMap<>(); + @Thunk final ArrayList mScreenOrder = new ArrayList<>(); @Thunk Runnable mRemoveEmptyScreenRunnable; @Thunk boolean mDeferRemoveExtraEmptyScreen = false; @@ -173,7 +171,7 @@ public class Workspace extends PagedView */ private CellLayout mDropToLayout = null; - @Thunk Launcher mLauncher; + @Thunk final Launcher mLauncher; @Thunk DragController mDragController; // These are temporary variables to prevent having to allocate a new object just to @@ -182,10 +180,10 @@ public class Workspace extends PagedView private final int[] mTempXY = new int[2]; @Thunk float[] mDragViewVisualCenter = new float[2]; - private float[] mTempTouchCoordinates = new float[2]; + private final float[] mTempTouchCoordinates = new float[2]; private SpringLoadedDragController mSpringLoadedDragController; - private float mOverviewModeShrinkFactor; + private final float mOverviewModeShrinkFactor; // State variable that indicates whether the pages are small (ie when you're // in all apps or customize mode) @@ -225,13 +223,13 @@ public class Workspace extends PagedView /** * These values correspond to {@link Direction#X} & {@link Direction#Y} */ - private float[] mPageAlpha = new float[] {1, 1}; + private final float[] mPageAlpha = new float[] {1, 1}; /** * Hotseat alpha can be changed when moving horizontally, vertically, changing states. * The values correspond to {@link Direction#X}, {@link Direction#Y} & * {@link #HOTSEAT_STATE_ALPHA_INDEX} respectively. */ - private float[] mHotseatAlpha = new float[] {1, 1, 1}; + private final float[] mHotseatAlpha = new float[] {1, 1, 1}; @ViewDebug.ExportedProperty(category = "launcher") private State mState = State.NORMAL; @@ -243,7 +241,7 @@ public class Workspace extends PagedView private boolean mStripScreensOnPageStopMoving = false; private DragPreviewProvider mOutlineProvider = null; - private boolean mWorkspaceFadeInAdjacentScreens; + private final boolean mWorkspaceFadeInAdjacentScreens; final WallpaperOffsetInterpolator mWallpaperOffset; private boolean mUnlockWallpaperFromDefaultPageOnLayout; @@ -288,7 +286,7 @@ public class Workspace extends PagedView @Thunk int mLastReorderY = -1; private SparseArray mSavedStates; - private final ArrayList mRestoredPages = new ArrayList(); + private final ArrayList mRestoredPages = new ArrayList<>(); private float mCurrentScale; private float mTransitionProgress; @@ -311,7 +309,7 @@ public class Workspace extends PagedView private boolean mIgnoreQsbScroll; // Handles workspace state transitions - private WorkspaceStateTransitionAnimation mStateTransitionAnimation; + private final WorkspaceStateTransitionAnimation mStateTransitionAnimation; private AccessibilityDelegate mPagesAccessibilityDelegate; @@ -809,7 +807,7 @@ public class Workspace extends PagedView mScreenOrder.add(EXTRA_EMPTY_SCREEN_ID); // Update the model if we have changed any screens - mLauncher.getModel().updateWorkspaceScreenOrder(mLauncher, mScreenOrder); + LauncherModel.updateWorkspaceScreenOrder(mLauncher, mScreenOrder); } } @@ -911,7 +909,6 @@ public class Workspace extends PagedView return -1; } - int index = getPageIndexForScreenId(EXTRA_EMPTY_SCREEN_ID); CellLayout cl = mWorkspaceScreens.get(EXTRA_EMPTY_SCREEN_ID); mWorkspaceScreens.remove(EXTRA_EMPTY_SCREEN_ID); mScreenOrder.remove(EXTRA_EMPTY_SCREEN_ID); @@ -923,7 +920,7 @@ public class Workspace extends PagedView mScreenOrder.add(newId); // Update the model for the new screen - mLauncher.getModel().updateWorkspaceScreenOrder(mLauncher, mScreenOrder); + LauncherModel.updateWorkspaceScreenOrder(mLauncher, mScreenOrder); return newId; } @@ -968,7 +965,7 @@ public class Workspace extends PagedView } int currentPage = getNextPage(); - ArrayList removeScreens = new ArrayList(); + ArrayList removeScreens = new ArrayList<>(); int total = mWorkspaceScreens.size(); for (int i = 0; i < total; i++) { long id = mWorkspaceScreens.keyAt(i); @@ -1012,7 +1009,7 @@ public class Workspace extends PagedView if (!removeScreens.isEmpty()) { // Update the model if we have changed any screens - mLauncher.getModel().updateWorkspaceScreenOrder(mLauncher, mScreenOrder); + LauncherModel.updateWorkspaceScreenOrder(mLauncher, mScreenOrder); } if (pageShift >= 0) { @@ -1037,7 +1034,7 @@ public class Workspace extends PagedView /** * Adds the specified child in the specified screen based on the {@param info} - * See {@link #addInScreen}. + * See {@link #addInScreen(View, long, long, int, int, int, int)}. */ public void addInScreen(View child, ItemInfo info) { addInScreen(child, info.container, info.screenId, info.cellX, info.cellY, @@ -1927,7 +1924,7 @@ public class Workspace extends PagedView mScreenOrder.add(getIdForScreen(cl)); } mLauncher.getUserEventDispatcher().logOverviewReorder(); - mLauncher.getModel().updateWorkspaceScreenOrder(mLauncher, mScreenOrder); + LauncherModel.updateWorkspaceScreenOrder(mLauncher, mScreenOrder); // Re-enable auto layout transitions for page deletion. enableLayoutTransitions(); @@ -2254,8 +2251,8 @@ public class Workspace extends PagedView mapPointFromSelfToChild(dropTargetLayout, mDragViewVisualCenter); } - int spanX = 1; - int spanY = 1; + int spanX; + int spanY; if (mDragInfo != null) { final CellLayout.CellInfo dragCellInfo = mDragInfo; spanX = dragCellInfo.spanX; @@ -3087,11 +3084,11 @@ public class Workspace extends PagedView } class FolderCreationAlarmListener implements OnAlarmListener { - CellLayout layout; - int cellX; - int cellY; + final CellLayout layout; + final int cellX; + final int cellY; - FolderIcon.PreviewBackground bg = new FolderIcon.PreviewBackground(); + final FolderIcon.PreviewBackground bg = new FolderIcon.PreviewBackground(); public FolderCreationAlarmListener(CellLayout layout, int cellX, int cellY) { this.layout = layout; @@ -3114,10 +3111,10 @@ public class Workspace extends PagedView } class ReorderAlarmListener implements OnAlarmListener { - float[] dragViewCenter; - int minSpanX, minSpanY, spanX, spanY; - DragObject dragObject; - View child; + final float[] dragViewCenter; + final int minSpanX, minSpanY, spanX, spanY; + final DragObject dragObject; + final View child; public ReorderAlarmListener(float[] dragViewCenter, int minSpanX, int minSpanY, int spanX, int spanY, DragObject dragObject, View child) { @@ -3209,7 +3206,7 @@ public class Workspace extends PagedView boolean findNearestVacantCell = true; if (pendingInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) { - mTargetCell = findNearestArea((int) touchXY[0], (int) touchXY[1], spanX, spanY, + mTargetCell = findNearestArea(touchXY[0], touchXY[1], spanX, spanY, cellLayout, mTargetCell); float distance = cellLayout.getDistanceFromCell(mDragViewVisualCenter[0], mDragViewVisualCenter[1], mTargetCell); @@ -3275,7 +3272,7 @@ public class Workspace extends PagedView animationStyle, finalView, true); } else { // This is for other drag/drop cases, like dragging from All Apps - View view = null; + View view; switch (info.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: @@ -3299,7 +3296,7 @@ public class Workspace extends PagedView // First we find the cell nearest to point at which the item is // dropped, without any consideration to whether there is an item there. if (touchXY != null) { - mTargetCell = findNearestArea((int) touchXY[0], (int) touchXY[1], spanX, spanY, + mTargetCell = findNearestArea(touchXY[0], touchXY[1], spanX, spanY, cellLayout, mTargetCell); float distance = cellLayout.getDistanceFromCell(mDragViewVisualCenter[0], mDragViewVisualCenter[1], mTargetCell); @@ -3548,7 +3545,7 @@ public class Workspace extends PagedView } else if (FeatureFlags.IS_DOGFOOD_BUILD) { throw new RuntimeException("Invalid state: cellLayout == null in " + "Workspace#onDropCompleted. Please file a bug. "); - }; + } } if ((d.cancelled || (beingCalledAfterUninstall && !mUninstallSuccessful)) && mDragInfo.cell != null) { @@ -3700,7 +3697,7 @@ public class Workspace extends PagedView * Returns a list of all the CellLayouts in the workspace. */ ArrayList getWorkspaceAndHotseatCellLayouts() { - ArrayList layouts = new ArrayList(); + ArrayList layouts = new ArrayList<>(); int screenCount = getChildCount(); for (int screen = 0; screen < screenCount; screen++) { layouts.add(((CellLayout) getChildAt(screen))); @@ -3842,7 +3839,7 @@ public class Workspace extends PagedView * @param view view for the shortcut * @return true if done, false to continue the map */ - public boolean evaluate(ItemInfo info, View view); + boolean evaluate(ItemInfo info, View view); } /** @@ -3884,7 +3881,7 @@ public class Workspace extends PagedView void updateShortcuts(ArrayList shortcuts) { int total = shortcuts.size(); - final HashSet updates = new HashSet(total); + final HashSet updates = new HashSet<>(total); final HashSet folderIds = new HashSet<>(); for (int i = 0; i < total; i++) { From bf3366f0d9d5f3c99907cc3f74d41b3ec628dcd4 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 12 Jun 2017 13:11:29 -0700 Subject: [PATCH 171/446] Fix synchronization on a non-final field 'sInstanceLock' by making it final. Bug: 62466540 Change-Id: I28a1c53435d761089b2ee7742d31a0cb482b8afd --- src/com/android/launcher3/compat/LauncherAppsCompat.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index 26f4ae7216..75a2a5d18d 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -25,11 +25,9 @@ import android.graphics.Rect; import android.os.Bundle; import android.os.UserHandle; import android.support.annotation.Nullable; - import com.android.launcher3.Utilities; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.PackageUserKey; - import java.util.List; public abstract class LauncherAppsCompat { @@ -50,7 +48,7 @@ public abstract class LauncherAppsCompat { } private static LauncherAppsCompat sInstance; - private static Object sInstanceLock = new Object(); + private static final Object sInstanceLock = new Object(); public static LauncherAppsCompat getInstance(Context context) { synchronized (sInstanceLock) { From 83afc9eda7a058baafd0f3fe8f98a2e232d178b9 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 12 Jun 2017 16:20:33 -0700 Subject: [PATCH 172/446] 1. Replace use of java.util.HashMap with android.util.ArrayMap in PackageUpdatedTask class 2. Get rid of explicit type arguments that can be inferred Bug: 62466540 Change-Id: Ifbe4e7d217cea292530f5ced0f4df2ee40c1262c --- .../android/launcher3/model/PackageUpdatedTask.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 46fea218fc..a50bc15160 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -21,8 +21,8 @@ import android.content.Intent; import android.graphics.Bitmap; import android.os.Process; import android.os.UserHandle; +import android.util.ArrayMap; import android.util.Log; - import com.android.launcher3.AllAppsList; import com.android.launcher3.AppInfo; import com.android.launcher3.IconCache; @@ -30,7 +30,6 @@ import com.android.launcher3.InstallShortcutReceiver; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetInfo; -import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.LauncherSettings; @@ -44,14 +43,11 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.ItemInfoMatcher; -import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; /** @@ -153,7 +149,7 @@ public class PackageUpdatedTask extends ExtendedModelTask { ArrayList added = null; ArrayList modified = null; - final ArrayList removedApps = new ArrayList(); + final ArrayList removedApps = new ArrayList<>(); if (appsList.added.size() > 0) { added = new ArrayList<>(appsList.added); @@ -168,7 +164,7 @@ public class PackageUpdatedTask extends ExtendedModelTask { appsList.removed.clear(); } - final HashMap addedOrUpdatedApps = new HashMap<>(); + final ArrayMap addedOrUpdatedApps = new ArrayMap<>(); if (added != null) { final ArrayList addedApps = added; From b38e74160f0e59ca6b5a781bdedb92b9ca69c388 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 12 Jun 2017 18:42:16 -0700 Subject: [PATCH 173/446] Import translations. DO NOT MERGE Change-Id: I2893a3d2bc0d8cfe637594f09d4e16b5cdd5f855 Auto-generated-cl: translation import --- res/values-af/strings.xml | 9 ++++++--- res/values-am/strings.xml | 9 ++++++--- res/values-ar/strings.xml | 9 ++++++--- res/values-az-rAZ/strings.xml | 9 ++++++--- res/values-b+sr+Latn/strings.xml | 9 ++++++--- res/values-be-rBY/strings.xml | 9 ++++++--- res/values-bg/strings.xml | 9 ++++++--- res/values-bn-rBD/strings.xml | 9 ++++++--- res/values-bs-rBA/strings.xml | 9 ++++++--- res/values-ca/strings.xml | 9 ++++++--- res/values-cs/strings.xml | 9 ++++++--- res/values-da/strings.xml | 9 ++++++--- res/values-de/strings.xml | 9 ++++++--- res/values-el/strings.xml | 9 ++++++--- res/values-en-rAU/strings.xml | 9 ++++++--- res/values-en-rGB/strings.xml | 9 ++++++--- res/values-en-rIN/strings.xml | 9 ++++++--- res/values-es-rUS/strings.xml | 9 ++++++--- res/values-es/strings.xml | 9 ++++++--- res/values-et-rEE/strings.xml | 9 ++++++--- res/values-eu-rES/strings.xml | 9 ++++++--- res/values-fa/strings.xml | 9 ++++++--- res/values-fi/strings.xml | 9 ++++++--- res/values-fr-rCA/strings.xml | 9 ++++++--- res/values-fr/strings.xml | 9 ++++++--- res/values-gl-rES/strings.xml | 9 ++++++--- res/values-gu-rIN/strings.xml | 9 ++++++--- res/values-hi/strings.xml | 9 ++++++--- res/values-hr/strings.xml | 9 ++++++--- res/values-hu/strings.xml | 9 ++++++--- res/values-hy-rAM/strings.xml | 9 ++++++--- res/values-in/strings.xml | 9 ++++++--- res/values-is-rIS/strings.xml | 9 ++++++--- res/values-it/strings.xml | 9 ++++++--- res/values-iw/strings.xml | 9 ++++++--- res/values-ja/strings.xml | 9 ++++++--- res/values-ka-rGE/strings.xml | 9 ++++++--- res/values-kk-rKZ/strings.xml | 9 ++++++--- res/values-km-rKH/strings.xml | 9 ++++++--- res/values-kn-rIN/strings.xml | 9 ++++++--- res/values-ko/strings.xml | 9 ++++++--- res/values-ky-rKG/strings.xml | 9 ++++++--- res/values-lo-rLA/strings.xml | 9 ++++++--- res/values-lt/strings.xml | 9 ++++++--- res/values-lv/strings.xml | 9 ++++++--- res/values-mk-rMK/strings.xml | 9 ++++++--- res/values-ml-rIN/strings.xml | 9 ++++++--- res/values-mn-rMN/strings.xml | 9 ++++++--- res/values-mr-rIN/strings.xml | 9 ++++++--- res/values-ms-rMY/strings.xml | 9 ++++++--- res/values-my-rMM/strings.xml | 9 ++++++--- res/values-nb/strings.xml | 9 ++++++--- res/values-ne-rNP/strings.xml | 9 ++++++--- res/values-nl/strings.xml | 9 ++++++--- res/values-pa-rIN/strings.xml | 9 ++++++--- res/values-pl/strings.xml | 9 ++++++--- res/values-pt-rPT/strings.xml | 9 ++++++--- res/values-pt/strings.xml | 9 ++++++--- res/values-ro/strings.xml | 9 ++++++--- res/values-ru/strings.xml | 9 ++++++--- res/values-si-rLK/strings.xml | 9 ++++++--- res/values-sk/strings.xml | 9 ++++++--- res/values-sl/strings.xml | 9 ++++++--- res/values-sq-rAL/strings.xml | 9 ++++++--- res/values-sr/strings.xml | 9 ++++++--- res/values-sv/strings.xml | 9 ++++++--- res/values-sw/strings.xml | 9 ++++++--- res/values-ta-rIN/strings.xml | 9 ++++++--- res/values-te-rIN/strings.xml | 9 ++++++--- res/values-th/strings.xml | 9 ++++++--- res/values-tl/strings.xml | 9 ++++++--- res/values-tr/strings.xml | 9 ++++++--- res/values-uk/strings.xml | 9 ++++++--- res/values-ur-rPK/strings.xml | 9 ++++++--- res/values-uz-rUZ/strings.xml | 9 ++++++--- res/values-vi/strings.xml | 9 ++++++--- res/values-zh-rCN/strings.xml | 9 ++++++--- res/values-zh-rHK/strings.xml | 9 ++++++--- res/values-zh-rTW/strings.xml | 9 ++++++--- res/values-zu/strings.xml | 9 ++++++--- 80 files changed, 480 insertions(+), 240 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 29e27eaa64..ad4c6f0554 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -76,9 +76,12 @@ "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" - "Ikoon-kentekentoekenning" - "Aan vir alle programme" - "Af vir alle programme" + + + + + + "Voeg ikoon by tuisskerm" "Vir nuwe programme" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 59c44e211e..9e37503bd5 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -76,9 +76,12 @@ "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "ስልኩ ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" - "የአዶ ባጅ" - "ለሁሉም መተግበሪያዎች በርቷል" - "ለሁሉም መተግበሪያዎች ጠፍጧል" + + + + + + "አዶ ወደ የመነሻ ማያ ገጽ አክል" "ለአዲስ መተግበሪያዎች" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index d8b1cc93b4..2cfc58b731 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -76,9 +76,12 @@ "السماح بتدوير الشاشة الرئيسية" "عند تدوير الهاتف" "لا يسمح إعداد العرض الحالي بالتدوير" - "وضع شارات على رموز التطبيقات" - "تشغيل لجميع التطبيقات" - "إيقاف لجميع التطبيقات" + + + + + + "إضافة رمز إلى الشاشة الرئيسية" "للتطبيقات الجديدة" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index e5d0a6c340..2e5fac8a06 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -76,9 +76,12 @@ "Əsas ekranın firlanmağına icazə verin" "Telefon çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" - "İkona nişanı" - "Bütün tətbiqlər üçün aktivdir" - "Bütün tətbiqlər üçün deaktivdir" + + + + + + "Əsas ekrana ikona əlavə edin" "Yeni tətbiqlər üçün" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 401fef38ac..0f52465e8d 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -76,9 +76,12 @@ "Dozvoli rotaciju početnog ekrana" "Kada se telefon rotira" "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" - "Dodavanje znački na ikone" - "Uključeno za sve aplikacije" - "Isključeno za sve aplikacije" + + + + + + "Dodaj ikonu na početni ekran" "Za nove aplikacije" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index e3f9ad144b..9884fa1e47 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -76,9 +76,12 @@ "Дазволіць паварот галоўнага экрана" "Пры павароце тэлефона" "Бягучая налада дысплэя не прадугледжвае паварот" - "Паметкі на значку" - "Уключана для ўсіх праграм" - "Адключана для ўсіх праграм" + + + + + + "Дадаць значок на Галоўны экран" "Для новых праграм" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index c19a8b47d8..794a36a3b3 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -76,9 +76,12 @@ "Разрешаване на завъртането на началния екран" "При завъртане на телефона" "Текущата настройка на екрана не разрешава завъртане" - "Означаване със значка на иконите" - "Включено за всички приложения" - "Изключено за всички приложения" + + + + + + "Добавяне на икона към началния екран" "За нови приложения" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 70e2c9be79..544b526aaa 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -76,9 +76,12 @@ "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "যখন ফোনটি ঘোরানো হয়" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" - "আইকনে ব্যাজ দেওয়া" - "সমস্ত অ্যাপের জন্য চালু আছে" - "সমস্ত অ্যাপের জন্য বন্ধ আছে" + + + + + + "হোম স্ক্রিনে আইকন যোগ করুন" "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 37850dbd6f..4473d5111f 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -76,9 +76,12 @@ "Dozvoli rotiranje početnog ekrana" "Kada se telefon zarotira" "Trenutne postavke ekrana ne dozvoljavaju rotiranje" - "Označavanje ikona" - "Uključeno za sve aplikacije" - "Isključeno za sve aplikacije" + + + + + + "Dodajte ikonu na početni ekran" "Za nove aplikacije" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 9913d6d831..399f128529 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -76,9 +76,12 @@ "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" - "Icones encerclades" - "Activades per a totes les aplicacions" - "Desactivades per a totes les aplicacions" + + + + + + "Afegeix la icona a la pantalla d\'inici" "Per a les aplicacions noves" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 03c109d468..f6c1aacc09 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -76,9 +76,12 @@ "Povolit otáčení plochy" "Při otočení telefonu" "Aktuální nastavení displeje neumožňuje otáčení" - "Odznaky na ikonách" - "Zapnuto pro všechny aplikace" - "Vypnuto pro všechny aplikace" + + + + + + "Přidat ikonu na plochu" "Pro nové aplikace" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index c16b8c1668..cb270fc5fe 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -76,9 +76,12 @@ "Tillad rotation af startskærmen" "Når telefonen roteres" "Den aktuelle indstilling for visning tillader ikke rotation" - "Ikonbadges" - "Slået til for alle apps" - "Slået fra for alle apps" + + + + + + "Føj ikon til startskærmen" "For nye apps" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index c627b74a1b..50b425bd9c 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -76,9 +76,12 @@ "Drehung des Startbildschirms zulassen" "Bei Drehung des Smartphones" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" - "Logosymbole" - "Für alle Apps aktiviert" - "Für alle Apps deaktiviert" + + + + + + "Symbol zu Startbildschirm hinzufügen" "Für neue Apps" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 9f5c01ff03..60c2605460 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -76,9 +76,12 @@ "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν το τηλέφωνο περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" - "Σήματα εικονιδίων" - "Ενεργοποιημένα για όλες τις εφαρμογές" - "Απενεργοποιημένα για όλες τις εφαρμογές" + + + + + + "Προσθήκη εικονιδίου στην Αρχική οθόνη" "Για νέες εφαρμογές" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 1a1c1c9744..d3dee61920 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -76,9 +76,12 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - "Icon badging" - "On for all apps" - "Off for all apps" + + + + + + "Add icon to Home screen" "For new apps" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 1a1c1c9744..d3dee61920 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -76,9 +76,12 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - "Icon badging" - "On for all apps" - "Off for all apps" + + + + + + "Add icon to Home screen" "For new apps" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 1a1c1c9744..d3dee61920 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -76,9 +76,12 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - "Icon badging" - "On for all apps" - "Off for all apps" + + + + + + "Add icon to Home screen" "For new apps" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 28d8be3351..2568b5272f 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -76,9 +76,12 @@ "Permitir la rotación de la pantalla principal" "Al girar el teléfono" "La configuración actual no permite la rotación de la pantalla" - "Insignias de íconos" - "Activada para todas las apps" - "Desactivada para todas las apps" + + + + + + "Agregar ícono a la pantalla principal" "Para nuevas apps" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index badb33ec77..4399aeac2b 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -76,9 +76,12 @@ "Permitir rotación de la pantalla de inicio" "Al girar el teléfono" "La configuración de pantalla actual no permite girar la pantalla" - "Insignias de los iconos" - "Activadas para todas las aplicaciones" - "Desactivadas para todas las aplicaciones" + + + + + + "Añadir icono a la pantalla de inicio" "Para nuevas aplicaciones" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index a1747de860..b5d7263b02 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -76,9 +76,12 @@ "Luba avaekraani pööramine" "Kui telefoni pööratakse" "Praegune kuvaseade ei luba pööramist" - "Ikoonimärgi lisamine" - "Sisse lülitatud kõigi rakenduste jaoks" - "Välja lülitatud kõigi rakenduste jaoks" + + + + + + "Lisa ikoon avaekraanile" "Uute rakenduste puhul" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index aa9c7969a5..83f6972fab 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -76,9 +76,12 @@ "Baimendu hasierako pantaila biratzea" "Telefonoa biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" - "Ikonoen bereizgarriak" - "Aktibatuta aplikazio guztietan" - "Desaktibatuta aplikazio guztietan" + + + + + + "Gehitu ikonoa hasierako pantailan" "Aplikazio berrietan" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index e66ea80536..aed95bd386 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -76,9 +76,12 @@ "امکان دادن به چرخش صفحه اصلی" "وقتی تلفن چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" - "برچسب‌گذاری نماد" - "برای همه برنامه‌ها روشن‌ است" - "برای همه برنامه‌ها خاموش است" + + + + + + "افزودن نماد به صفحه اصلی" "برای برنامه‌های جدید" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index a7db2328c8..656710e670 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -76,9 +76,12 @@ "Salli aloitusnäytön kiertäminen" "Kun puhelinta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." - "Kuvakemerkit" - "Käytössä kaikissa sovelluksissa" - "Pois käytöstä kaikissa sovelluksissa" + + + + + + "Lisää kuvake aloitusruutuun" "Uusille sovelluksille" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 03757e01be..cc1b490d23 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -76,9 +76,12 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le mode d\'affichage actuel ne permet pas le pivotement" - "Insignes d\'icône" - "Activé pour toutes les applications" - "Désactivé pour toutes les applications" + + + + + + "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 75a693cf9a..73506e8699 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -76,9 +76,12 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." - "Identification des icônes" - "Activée pour toutes les applications" - "Désactivée pour toutes les applications" + + + + + + "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 4bff56f14d..b7ba27315e 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -76,9 +76,12 @@ "Permitir xirar a pantalla de inicio" "Ao xirar o teléfono" "A configuración de visualización actual non permite xirar a pantalla" - "Insignias de iconas" - "Activado para todas as aplicacións" - "Desactivado para todas as aplicacións" + + + + + + "Engadir icona á pantalla de inicio" "Para novas aplicacións" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index b243da75d3..acce3fc2eb 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -76,9 +76,12 @@ "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" - "આઇકનને બૅજ કરવું" - "બધી ઍપ્લિકેશનો માટે ચાલુ છે" - "બધી ઍપ્લિકેશનો માટે બંધ છે" + + + + + + "હોમ સ્ક્રીન પર આઇકન ઉમેરો" "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 9a14ae0fbf..6db6fd7006 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -76,9 +76,12 @@ "होमस्क्रीन घुमाने की अनुमति दें" "फ़ोन घुुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" - "आइकन बैजिंग" - "सभी ऐप्लिकेशन के लिए चालू है" - "सभी ऐप्लिकेशन के लिए बंद है" + + + + + + "होम स्क्रीन में आइकन जोड़ें" "नए ऐप्लिकेशन के लिए" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 4b6a0bd6eb..b08a817fef 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -76,9 +76,12 @@ "Dopusti zakretanje početnog zaslona" "Kada se telefon zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" - "Dodavanje oznake na ikonu" - "Uključeno za sve aplikacije" - "Isključeno za sve aplikacije" + + + + + + "Dodaj ikonu na početni zaslon" "Za nove aplikacije" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index c5ac9074c2..ea2c266f55 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -76,9 +76,12 @@ "A kezdőképernyő elforgatásának engedélyezése" "A telefon elforgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" - "Ikonjelvények" - "Bekapcsolva az összes alkalmazásnál" - "Kikapcsolva az összes alkalmazásnál" + + + + + + "Ikon hozzáadása a kezdőképernyőhöz" "Új alkalmazásoknál" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 46e5682dcb..20b26e6372 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -76,9 +76,12 @@ "Թույլ տալ հիմնական էկրանի պտտումը" "Հեռախոսը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" - "Պատկերակի նշանակ" - "Միացված է բոլոր հավելվածների համար" - "Անջատված է բոլոր հավելվածների համար" + + + + + + "Ավելացնել պատկերակը Հիմնական էկրանին" "Նոր հավելվածների համար" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index fa7b8780d2..f7e17b5046 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -76,9 +76,12 @@ "Izinkan layar Utama diputar" "Saat ponsel diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" - "Badge ikon" - "Aktif untuk semua aplikasi" - "Nonaktif untuk semua aplikasi" + + + + + + "Tambahkan ikon ke layar Utama" "Untuk aplikasi baru" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index 1d7a511a23..907d3c9e10 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -76,9 +76,12 @@ "Leyfa snúning fyrir heimaskjá" "Þegar símanum er snúið" "Núverandi skjástilling leyfir ekki snúning" - "Merking á skjöldum" - "Virkt fyrir öll forrit" - "Slökkt fyrir öll forrit" + + + + + + "Bæta tákni á heimaskjáinn" "Fyrir ný forrit" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index a63d495cca..2b310e3536 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -76,9 +76,12 @@ "Consenti rotazione della schermata Home" "Con il telefono ruotato" "L\'impostazione corrente del display non consente la rotazione" - "Badge per le icone" - "Impostazione attiva per tutte le app" - "Impostazione non attiva per tutte le app" + + + + + + "Aggiungi icone alla schermata Home" "Per le nuove app" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 7f960f24b0..da97791e26 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -76,9 +76,12 @@ "אפשרות סיבוב של מסך דף הבית" "כאשר הטלפון מסובב" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" - "הצגת תגים על גבי סמלים" - "מופעלת לכל האפליקציות" - "כבויה לכל האפליקציות" + + + + + + "הוספת סמל במסך דף הבית" "לאפליקציות חדשות" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 6182eb5f3c..a6f648da55 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -76,9 +76,12 @@ "ホーム画面の回転を許可" "スマートフォンが回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" - "アイコンバッジ" - "すべてのアプリで ON" - "すべてのアプリで OFF" + + + + + + "ホーム画面にアイコンを追加" "新しいアプリをダウンロードしたときに" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 7ab510e005..e9871fd01a 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -76,9 +76,12 @@ "მთავარი ეკრანის შეტრიალების დაშვება" "ტელეფონის შეტრიალებისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" - "ხატულას ბეჯები" - "ჩართულია ყველა აპისთვის" - "გამორთულია ყველა აპისთვის" + + + + + + "ხატულას მთავარ ეკრანზე დამატება" "ახალი აპებისთვის" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index c49ef3b5d1..8331412f1d 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -76,9 +76,12 @@ "Негізгі экранның бұрылуына рұқсат ету" "Телефон бұрылғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" - "Белгілеу" - "Барлық қолданбалар үшін қосулы" - "Барлық қолданбалар үшін өшірулі" + + + + + + "Негізгі экранға белгіше енгізу" "Жаңа қолданбаларға арналған" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 82bf4bbbb8..15deedc392 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -76,9 +76,12 @@ "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" - "ការដាក់ស្លាក​សញ្ញារូបតំណាង" - "បើក​សម្រាប់​កម្មវិធីទាំងអស់" - "បិទសម្រាប់កម្មវិធីទាំងអស់" + + + + + + "បញ្ចូល​រូបតំណាង​ទៅ​អេក្រង់​ដើម" "សម្រាប់កម្មវិធីថ្មី" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 6e61af554f..acf48468e5 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -76,9 +76,12 @@ "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" - "ಐಕಾನ್ ಬ್ಯಾಡ್ಜ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ" - "ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಆನ್ ಮಾಡಲಾಗಿದೆ" - "ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಆಫ್ ಆಗಿದೆ" + + + + + + "ಮುಖಪುಟದ ಪರದೆಗೆ ಐಕಾನ್ ಸೇರಿಸಿ" "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index d6226d6c1f..1b5bc1d9fa 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -76,9 +76,12 @@ "홈 화면 회전 허용" "휴대전화 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." - "아이콘 배지" - "모든 앱에서 사용 설정됨" - "모든 앱에서 사용 중지됨" + + + + + + "홈 화면에 아이콘 추가" "새로 설치한 앱에 적용" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index bdfd15c39a..f773a660e3 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -76,9 +76,12 @@ "Башкы экранды айлантууга уруксат берүү" "Телефон айланганда" "Экранды айлантуу параметри өчүрүлгөн" - "Бейджик тагуу сүрөтчөсү" - "Бардык колдонмолор үчүн күйүк" - "Бардык колдонмолор үчүн өчүк" + + + + + + "Башкы экранга сүрөтчө кошуу" "Жаңы колдонмолор үчүн" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 799db3c46d..9cc4edd8a9 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -76,9 +76,12 @@ "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນໂທລະສັບ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" - "ປ້າຍໄອຄອນ" - "ເປີດສຳລັບທຸກແອັບ" - "ປິດສຳລັບທຸກແອັບ" + + + + + + "ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ" "ສຳລັບແອັບໃໝ່" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index bbf7f1a176..dcd9cf683f 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -76,9 +76,12 @@ "Leisti pasukti pagrindinį ekraną" "Kai telefonas pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" - "Piktogramos ženklelių informacija" - "Įjungta visoms programoms" - "Išjungta visoms programoms" + + + + + + "Pridėti piktogr. prie pagrindinio ekrano" "Skirta naujoms programoms" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 75e1bef4f2..0c2c475eaa 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -76,9 +76,12 @@ "Atļaut sākuma ekrāna pagriešanu" "Pagriežot tālruni" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." - "Ikonu emblēmas" - "Ieslēgts visām lietotnēm" - "Izslēgts visām lietotnēm" + + + + + + "Pievienot ikonu sākuma ekrānā" "Jaunām lietotnēm" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index f0c1b64b2d..0b4c47a6c6 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -76,9 +76,12 @@ "Дозволете ротација на Почетниот екран" "Кога телефонот се ротира" "Тековната поставка на Екранот не дозволува ротација" - "Ставање значки на икони" - "Вклучено за сите апликации" - "Исклучено за сите апликации" + + + + + + "Додајте икона на почетниот екран" "За нови апликации" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 9dc4bb18bf..f954af3d6e 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -76,9 +76,12 @@ "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" - "ഐക്കൺ ബാഡ്‌ജിംഗ്" - "എല്ലാ ആപ്പുകൾക്കും ഓണാണ്" - "എല്ലാ ആപ്പുകൾക്കും ഓഫാണ്" + + + + + + "ഹോം സ്ക്രീനിലേക്ക് ഐക്കൺ ചേർക്കുക" "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index c1accc56f6..d1f6c38435 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -76,9 +76,12 @@ "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Утсыг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" - "Дүрс тэмдэг" - "Бүх аппад асаасан" - "Бүх аппад унтраасан" + + + + + + "Нүүр хуудаст дүрс тэмдэг нэмэх" "Шинэ аппад зориулсан" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index a7a8c80d5d..e47175e8c8 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -76,9 +76,12 @@ "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "फोन फिरविला जातो तेव्हा" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" - "चिन्ह बॅज करणे" - "सर्व अॅपसाठी चालू आहे" - "सर्व अॅपसाठी बंद आहे" + + + + + + "मुख्य स्क्रीनवर चिन्ह जोडा" "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index b94b8c78da..7a40f4ab5d 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -76,9 +76,12 @@ "Benarkan putaran Skrin Utama" "Apabila telefon diputar" "Tetapan Paparan semasa tidak membenarkan putaran" - "Pelencanaan ikon" - "Dihidupkan untuk semua apl" - "Dimatikan untuk semua apl" + + + + + + "Tambahkan ikon pada Skrin Utama" "Untuk apl baharu" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index c8bad182a7..3357c484bb 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -76,9 +76,12 @@ "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" "ဖုန်းကိုလှည့်ထားစဉ်" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" - "သင်္ကေတ တံဆိပ်" - "အက်ပ်များအားလုံးအတွက် ဖွင့်ထားသည်" - "အက်ပ်များအားလုံးအတွက် ပိတ်ထားသည်" + + + + + + "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" "အက်ပ်အသစ်များအတွက်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index e75e83106f..26265eecf8 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -76,9 +76,12 @@ "Tillat rotasjon av startskjermen" "Når telefonen roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" - "Ikonmerking" - "På for alle apper" - "Av for alle apper" + + + + + + "Legg til ikon på startsiden" "For nye apper" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index dee84e6859..aae7357dfd 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -76,9 +76,12 @@ "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "फोनलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" - "आइकनलाई पदक दिने कार्य" - "सबै अनुप्रयोगहरूमा सक्रिय छ" - "सबै अनुप्रयोगहरूमा निष्क्रिय छ" + + + + + + "गृह स्क्रिनमा आइकन थप्नुहोस्" "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index a712d4805e..920e5dd80c 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -76,9 +76,12 @@ "Draaien van startscherm toestaan" "Wanneer de telefoon gedraaid is" "Huidige scherminstelling staat draaien niet toe" - "Pictogrambadges" - "Ingeschakeld voor alle apps" - "Uitgeschakeld voor alle apps" + + + + + + "Pictogram toevoegen aan startscherm" "Voor nieuwe apps" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 8e51bd3cf0..fdd79b5d13 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -76,9 +76,12 @@ "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" - "ਪ੍ਰਤੀਕ \'ਤੇ ਬੈਜ ਲਗਾਉਣਾ" - "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਚਾਲੂ ਹੈ" - "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਬੰਦ ਹੈ" + + + + + + "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 9192732ed9..99d9b0d8c5 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -76,9 +76,12 @@ "Zezwalaj na obrót ekranu głównego" "Po obróceniu telefonu" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" - "Plakietki na ikonach" - "Włączone dla wszystkich aplikacji" - "Wyłączone dla wszystkich aplikacji" + + + + + + "Dodaj ikonę do ekranu głównego" "W przypadku nowych aplikacji" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 605dff2644..c2311d0034 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -76,9 +76,12 @@ "Permitir rotação do ecrã principal" "Quando o telemóvel é rodado" "A definição de visualização atual não permite a rotação" - "Emblemas dos ícones" - "Ativada para todas as aplicações" - "Desativada para todas as aplicações" + + + + + + "Adicionar ícone ao ecrã principal" "Para novas aplicações" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 7945b0726c..51be10b52d 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -76,9 +76,12 @@ "Permitir rotação da tela inicial" "Quando o smartphone for girado" "A configuração atual de exibição não permite rotação" - "Uso de selo de ícone" - "Ativado para todos os apps" - "Desativado para todos os apps" + + + + + + "Adicionar ícone à tela inicial" "Para novos apps" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index b433029fd7..b146677606 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -76,9 +76,12 @@ "Permiteți rotirea ecranului de pornire" "Când telefonul este rotit" "Setarea actuală a afișajului nu permite rotirea" - "Aplicarea insignelor pentru pictograme" - "Activată pentru toate aplicațiile" - "Dezactivată pentru toate aplicațiile" + + + + + + "Adaugă pictograme în ecranul de pornire" "Pentru aplicații noi" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 6c87042f9b..7e3dfb538b 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -76,9 +76,12 @@ "Разрешить поворачивать главный экран" "Когда телефон повернут" "В настройках отключен поворот экрана" - "Уведомления на значке приложения" - "Включено для всех приложений" - "Отключено для всех приложений" + + + + + + "Добавлять значки" "Добавлять значки установленных приложений на главный экран." diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index f8f8e85f31..75cc339103 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -76,9 +76,12 @@ "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "දුරකථනය කරකවන විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" - "නිරූපක ලාංඡනය" - "සියලු යෙදුම් සඳහා ක්‍රියාත්මකයි" - "සියලු යෙදුම් සඳහා ක්‍රියාවිරහිතයි" + + + + + + "මුල් පිටු තිරය වෙත අයිකනය එක් කරන්න" "නව යෙදුම් සඳහා" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 3d754b21fb..b85e2a192f 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -76,9 +76,12 @@ "Povoliť otáčanie plochy" "Pri otočení telefónu" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" - "Označovanie ikon" - "Zapnuté pre všetky aplikácie" - "Vypnuté pre všetky aplikácie" + + + + + + "Pridať ikonu na plochu" "Pri inštalácii novej aplikácie" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index fddb4452d5..ceb37fd393 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -76,9 +76,12 @@ "Omogočanje sukanja začetnega zaslona" "Ko se telefon zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" - "Označevanje z ikonami" - "Vklopljeno za vse aplikacije" - "Izklopljeno za vse aplikacije" + + + + + + "Dodaj ikono na začetni zaslon" "Za nove aplikacije" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index f300d037e5..de9f4e8944 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -76,9 +76,12 @@ "Lejo rrotullimin e ekranit kryesor" "Kur telefoni rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" - "Caktimi i simbolit të ikonës" - "Aktiv për të gjitha aplikacionet" - "Joaktiv për të gjitha aplikacionet" + + + + + + "Shto ikonë në ekranin bazë" "Për aplikacionet e reja" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 68cb442d1d..0ff2f0ac3b 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -76,9 +76,12 @@ "Дозволи ротацију почетног екрана" "Када се телефон ротира" "Актуелно подешавање приказа не дозвољава ротацију" - "Додавање значки на иконе" - "Укључено за све апликације" - "Искључено за све апликације" + + + + + + "Додај икону на почетни екран" "За нове апликације" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 4dd6f48bff..1d3e97a82f 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -76,9 +76,12 @@ "Tillåt rotering av startskärmen" "När mobilen vrids" "Rotering tillåts inte i de nuvarande skärminställningarna" - "Ikonmärken" - "Aktiverat för alla appar" - "Inaktiverat för alla appar" + + + + + + "Lägg till ikonen på startskärmen" "För nya appar" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index ce06bdb0cb..324edf3ad7 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -78,9 +78,12 @@ "Ruhusu kuzungusha skrini ya Kwanza" "Simu inapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" - "Kuweka beji kwenye aikoni" - "Imewashwa katika programu zote" - "Imezimwa katika programu zote" + + + + + + "Ongeza aikoni kwenye Skrini ya kwanza" "Kwa ajili ya programu mpya" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index eae471c0dd..7020261dbd 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -76,9 +76,12 @@ "முகப்புத் திரை சுழற்சியை அனுமதி" "மொபைலைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" - "ஐகான் பேட்ஜிங்" - "எல்லாப் பயன்பாடுகளுக்கும் இயக்கப்பட்டது" - "எல்லாப் பயன்பாடுகளுக்கும் முடக்கப்பட்டது" + + + + + + "முகப்புத் திரையில் ஐகானைச் சேர்" "புதிய பயன்பாடுகளுக்கு" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index 338c1585c3..13ecda9412 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -76,9 +76,12 @@ "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "ఫోన్‌‌ను తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" - "చిహ్నం బ్యాడ్జ్" - "అన్ని అనువర్తనాలలో ఆన్ చేయబడ్డాయి" - "అన్ని అనువర్తనాలలో ఆఫ్‌ చేయబడ్డాయి" + + + + + + "హోమ్ స్క్రీన్‌కి చిహ్నాన్ని జోడించు" "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 65702a05b1..1651f381a4 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -76,9 +76,12 @@ "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนโทรศัพท์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" - "การติดป้ายไอคอน" - "เปิดสำหรับแอปทั้งหมด" - "ปิดสำหรับแอปทั้งหมด" + + + + + + "เพิ่มไอคอนในหน้าจอหลัก" "สำหรับแอปใหม่" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 827070829e..16864c4408 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -76,9 +76,12 @@ "Payagan ang pag-rotate ng Home screen" "Kailan maro-rotate ang telepono" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" - "Pag-badge ng icon" - "Naka-on para sa lahat ng app" - "Naka-off para sa lahat ng app" + + + + + + "Idagdag ang icon sa Home screen" "Para sa mga bagong app" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index da0aa28f2a..ba37d59bc7 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -76,9 +76,12 @@ "Ana ekranı döndürmeye izin ver" "Telefon döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" - "Simge rozeti ekleme" - "Tüm uygulamalar için açık" - "Tüm uygulamalar için kapalı" + + + + + + "Ana ekrana simge ekle" "Yeni uygulamalar için" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index a9cefaf502..3ff3b3fbda 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -76,9 +76,12 @@ "Дозволити обертання головного екрана" "Коли телефон обертається" "Поточні налаштування дисплея не підтримують обертання" - "Позначення значків" - "Увімкнено для всіх додатків" - "Вимкнено для всіх додатків" + + + + + + "Додати значок на головний екран" "Для нових додатків" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 195a107ad8..4fa88375d5 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -76,9 +76,12 @@ "ہوم اسکرین گھمانے کی اجازت دیں" "جب فون گھمایا جاتا ہے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" - "آئیکن کی بیج سازی" - "سبھی ایپس کیلئے آن ہے" - "تمام ایپس کے لئے بند ہے" + + + + + + "آئیکن کو ہوم اسکرین میں شامل کریں" "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index fbd153b5a6..72900c0c91 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -76,9 +76,12 @@ "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" - "Ikonka ustida nishoncha" - "Barcha ilovalar uchun yoniq" - "Barcha ilovalar uchun o‘chiq" + + + + + + "Bosh ekranga ikonka qo‘shish" "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 626ea99eed..57ae7cdd05 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -76,9 +76,12 @@ "Cho phép xoay Màn hình chính" "Khi xoay điện thoại" "Cài đặt Hiển thị hiện tại không cho phép xoay" - "Gắn huy hiệu biểu tượng" - "Bật cho tất cả ứng dụng" - "Tắt cho tất cả ứng dụng" + + + + + + "Thêm biểu tượng vào màn hình chính" "Cho ứng dụng mới" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index fde198650a..f7faeb8c3f 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -76,9 +76,12 @@ "允许旋转主屏幕" "手机旋转时" "当前的显示设置不允许旋转设备" - "在图标上显示标记" - "已针对所有应用开启" - "已针对所有应用关闭" + + + + + + "将图标添加到主屏幕" "适用于新应用" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index d5cf9971cf..f53eb68bf4 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -76,9 +76,12 @@ "允許主畫面旋轉" "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" - "在圖示上顯示標誌" - "已為所有應用程式開啟" - "已為所有應用程式關閉" + + + + + + "將圖示加到主畫面" "適用於新安裝的應用程式" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 276ddec496..30edaace22 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -76,9 +76,12 @@ "允許旋轉主螢幕" "當手機旋轉時" "目前的顯示設定不允許旋轉畫面" - "在圖示上顯示標記" - "為所有應用程式開啟這項設定" - "為所有應用程式關閉這項設定" + + + + + + "將圖示加到主螢幕" "適用於新安裝的應用程式" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 82fd4cfcca..92ecbb6a6c 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -76,9 +76,12 @@ "Vumela ukuphendukiswa kwesikrini sasekhaya" "Uma ifoni iphendukiswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" - "Ibheji yesithonjana" - "Kuvuliwe kuzo zonke izinhlelo zokusebenza" - "Kuvaliwe kuzo zonke izinhlelo zokusebenza" + + + + + + "Engeza isithonjana eskrinini sasekhaya" "Kwezinhlelo zokusebenza ezintsha" From 5212c88bcdf4f7eecd7ce405d608e9d465880f1d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 12 Jun 2017 18:44:42 -0700 Subject: [PATCH 174/446] Import translations. DO NOT MERGE Change-Id: I40904a0c4db2c9d625aab269988ac34a472487b4 Auto-generated-cl: translation import --- res/values-af/strings.xml | 9 ++++++--- res/values-am/strings.xml | 21 ++++++++++----------- res/values-ar/strings.xml | 9 ++++++--- res/values-az-rAZ/strings.xml | 9 ++++++--- res/values-b+sr+Latn/strings.xml | 9 ++++++--- res/values-be-rBY/strings.xml | 9 ++++++--- res/values-bg/strings.xml | 9 ++++++--- res/values-bn-rBD/strings.xml | 9 ++++++--- res/values-bs-rBA/strings.xml | 9 ++++++--- res/values-ca/strings.xml | 9 ++++++--- res/values-cs/strings.xml | 9 ++++++--- res/values-da/strings.xml | 9 ++++++--- res/values-de/strings.xml | 9 ++++++--- res/values-el/strings.xml | 9 ++++++--- res/values-en-rAU/strings.xml | 9 ++++++--- res/values-en-rGB/strings.xml | 9 ++++++--- res/values-en-rIN/strings.xml | 9 ++++++--- res/values-es-rUS/strings.xml | 9 ++++++--- res/values-es/strings.xml | 9 ++++++--- res/values-et-rEE/strings.xml | 9 ++++++--- res/values-eu-rES/strings.xml | 9 ++++++--- res/values-fa/strings.xml | 9 ++++++--- res/values-fi/strings.xml | 9 ++++++--- res/values-fr-rCA/strings.xml | 9 ++++++--- res/values-fr/strings.xml | 9 ++++++--- res/values-gl-rES/strings.xml | 9 ++++++--- res/values-gu-rIN/strings.xml | 9 ++++++--- res/values-hi/strings.xml | 9 ++++++--- res/values-hr/strings.xml | 9 ++++++--- res/values-hu/strings.xml | 9 ++++++--- res/values-hy-rAM/strings.xml | 9 ++++++--- res/values-in/strings.xml | 9 ++++++--- res/values-is-rIS/strings.xml | 9 ++++++--- res/values-it/strings.xml | 9 ++++++--- res/values-iw/strings.xml | 9 ++++++--- res/values-ja/strings.xml | 9 ++++++--- res/values-ka-rGE/strings.xml | 9 ++++++--- res/values-kk-rKZ/strings.xml | 9 ++++++--- res/values-km-rKH/strings.xml | 9 ++++++--- res/values-kn-rIN/strings.xml | 9 ++++++--- res/values-ko/strings.xml | 9 ++++++--- res/values-ky-rKG/strings.xml | 9 ++++++--- res/values-lo-rLA/strings.xml | 9 ++++++--- res/values-lt/strings.xml | 9 ++++++--- res/values-lv/strings.xml | 9 ++++++--- res/values-mk-rMK/strings.xml | 9 ++++++--- res/values-ml-rIN/strings.xml | 9 ++++++--- res/values-mn-rMN/strings.xml | 9 ++++++--- res/values-mr-rIN/strings.xml | 9 ++++++--- res/values-ms-rMY/strings.xml | 9 ++++++--- res/values-my-rMM/strings.xml | 9 ++++++--- res/values-nb/strings.xml | 9 ++++++--- res/values-ne-rNP/strings.xml | 9 ++++++--- res/values-nl/strings.xml | 9 ++++++--- res/values-pa-rIN/strings.xml | 13 ++++++++----- res/values-pl/strings.xml | 9 ++++++--- res/values-pt-rPT/strings.xml | 9 ++++++--- res/values-pt/strings.xml | 9 ++++++--- res/values-ro/strings.xml | 9 ++++++--- res/values-ru/strings.xml | 9 ++++++--- res/values-si-rLK/strings.xml | 9 ++++++--- res/values-sk/strings.xml | 9 ++++++--- res/values-sl/strings.xml | 9 ++++++--- res/values-sq-rAL/strings.xml | 9 ++++++--- res/values-sr/strings.xml | 9 ++++++--- res/values-sv/strings.xml | 9 ++++++--- res/values-sw/strings.xml | 9 ++++++--- res/values-ta-rIN/strings.xml | 9 ++++++--- res/values-te-rIN/strings.xml | 9 ++++++--- res/values-th/strings.xml | 9 ++++++--- res/values-tl/strings.xml | 9 ++++++--- res/values-tr/strings.xml | 9 ++++++--- res/values-uk/strings.xml | 9 ++++++--- res/values-ur-rPK/strings.xml | 9 ++++++--- res/values-uz-rUZ/strings.xml | 9 ++++++--- res/values-vi/strings.xml | 9 ++++++--- res/values-zh-rCN/strings.xml | 9 ++++++--- res/values-zh-rHK/strings.xml | 9 ++++++--- res/values-zh-rTW/strings.xml | 9 ++++++--- res/values-zu/strings.xml | 9 ++++++--- 80 files changed, 486 insertions(+), 250 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 68b8307790..78873b25d4 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -76,9 +76,12 @@ "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" - "Ikoon-kentekentoekenning" - "Aan vir alle programme" - "Af vir alle programme" + + + + + + "Voeg ikoon by tuisskerm" "Vir nuwe programme" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index ba39963f88..8515625cc8 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -76,22 +76,21 @@ "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "ስልኩ ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" - "የአዶ ባጅ" - "ለሁሉም መተግበሪያዎች በርቷል" - "ለሁሉም መተግበሪያዎች ጠፍጧል" + + + + + + "አዶ ወደ የመነሻ ማያ ገጽ አክል" "ለአዲስ መተግበሪያዎች" "የሥርዓቱን ነባሪ ተጠቀም" - - - - - - - - + "ካሬ" + "Squircle" + "ክብ" + "የእንባ ጠብታ" "የማይታወቅ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index cb2634d27b..dd64a18442 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -76,9 +76,12 @@ "السماح بتدوير الشاشة الرئيسية" "عند تدوير الهاتف" "لا يسمح إعداد العرض الحالي بالتدوير" - "وضع شارات على رموز التطبيقات" - "تشغيل لجميع التطبيقات" - "إيقاف لجميع التطبيقات" + + + + + + "إضافة رمز إلى الشاشة الرئيسية" "للتطبيقات الجديدة" diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml index 1f89f5a229..2a275e51e4 100644 --- a/res/values-az-rAZ/strings.xml +++ b/res/values-az-rAZ/strings.xml @@ -76,9 +76,12 @@ "Əsas ekranın firlanmağına icazə verin" "Telefon çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" - "İkona nişanı" - "Bütün tətbiqlər üçün aktivdir" - "Bütün tətbiqlər üçün deaktivdir" + + + + + + "Əsas ekrana ikona əlavə edin" "Yeni tətbiqlər üçün" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 9f2855d4d5..2484051643 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -76,9 +76,12 @@ "Dozvoli rotaciju početnog ekrana" "Kada se telefon rotira" "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" - "Dodavanje znački na ikone" - "Uključeno za sve aplikacije" - "Isključeno za sve aplikacije" + + + + + + "Dodaj ikonu na početni ekran" "Za nove aplikacije" diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml index a0b7a69273..8a05ff07d8 100644 --- a/res/values-be-rBY/strings.xml +++ b/res/values-be-rBY/strings.xml @@ -76,9 +76,12 @@ "Дазволіць паварот галоўнага экрана" "Пры павароце тэлефона" "Бягучая налада дысплэя не прадугледжвае паварот" - "Паметкі на значку" - "Уключана для ўсіх праграм" - "Адключана для ўсіх праграм" + + + + + + "Дадаць значок на Галоўны экран" "Для новых праграм" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index fc3ba4ba80..591f82316f 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -76,9 +76,12 @@ "Разрешаване на завъртането на началния екран" "При завъртане на телефона" "Текущата настройка на екрана не разрешава завъртане" - "Означаване със значка на иконите" - "Включено за всички приложения" - "Изключено за всички приложения" + + + + + + "Добавяне на икона към началния екран" "За нови приложения" diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml index 1ee4b6b174..4dbdf72539 100644 --- a/res/values-bn-rBD/strings.xml +++ b/res/values-bn-rBD/strings.xml @@ -76,9 +76,12 @@ "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "যখন ফোনটি ঘোরানো হয়" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" - "আইকনে ব্যাজ দেওয়া" - "সমস্ত অ্যাপের জন্য চালু আছে" - "সমস্ত অ্যাপের জন্য বন্ধ আছে" + + + + + + "হোম স্ক্রিনে আইকন যোগ করুন" "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index 259e51617f..17a64c6881 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/strings.xml @@ -76,9 +76,12 @@ "Dozvoli rotiranje početnog ekrana" "Kada se telefon zarotira" "Trenutne postavke ekrana ne dozvoljavaju rotiranje" - "Označavanje ikona" - "Uključeno za sve aplikacije" - "Isključeno za sve aplikacije" + + + + + + "Dodajte ikonu na početni ekran" "Za nove aplikacije" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index feee97d40a..5e26f7286f 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -76,9 +76,12 @@ "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" - "Icones encerclades" - "Activades per a totes les aplicacions" - "Desactivades per a totes les aplicacions" + + + + + + "Afegeix la icona a la pantalla d\'inici" "Per a les aplicacions noves" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 2560de3d59..5b582aa2e9 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -76,9 +76,12 @@ "Povolit otáčení plochy" "Při otočení telefonu" "Aktuální nastavení displeje neumožňuje otáčení" - "Odznaky na ikonách" - "Zapnuto pro všechny aplikace" - "Vypnuto pro všechny aplikace" + + + + + + "Přidat ikonu na plochu" "Pro nové aplikace" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 521f9eab1e..2b33416c37 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -76,9 +76,12 @@ "Tillad rotation af startskærmen" "Når telefonen roteres" "Den aktuelle indstilling for visning tillader ikke rotation" - "Ikonbadges" - "Slået til for alle apps" - "Slået fra for alle apps" + + + + + + "Føj ikon til startskærmen" "For nye apps" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 03eb04801a..78921b1e3b 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -76,9 +76,12 @@ "Drehung des Startbildschirms zulassen" "Bei Drehung des Smartphones" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" - "Logosymbole" - "Für alle Apps aktiviert" - "Für alle Apps deaktiviert" + + + + + + "Symbol zu Startbildschirm hinzufügen" "Für neue Apps" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index a2b44b4bc2..dbb50e27e4 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -76,9 +76,12 @@ "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν το τηλέφωνο περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" - "Σήματα εικονιδίων" - "Ενεργοποιημένα για όλες τις εφαρμογές" - "Απενεργοποιημένα για όλες τις εφαρμογές" + + + + + + "Προσθήκη εικονιδίου στην Αρχική οθόνη" "Για νέες εφαρμογές" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 08ef4f4e32..b19629a072 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -76,9 +76,12 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - "Icon badging" - "On for all apps" - "Off for all apps" + + + + + + "Add icon to Home screen" "For new apps" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 08ef4f4e32..b19629a072 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -76,9 +76,12 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - "Icon badging" - "On for all apps" - "Off for all apps" + + + + + + "Add icon to Home screen" "For new apps" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 08ef4f4e32..b19629a072 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -76,9 +76,12 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - "Icon badging" - "On for all apps" - "Off for all apps" + + + + + + "Add icon to Home screen" "For new apps" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index e4315bba1a..d7059ef987 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -76,9 +76,12 @@ "Permitir la rotación de la pantalla principal" "Al girar el teléfono" "La configuración actual no permite la rotación de la pantalla" - "Insignias de íconos" - "Activada para todas las apps" - "Desactivada para todas las apps" + + + + + + "Agregar ícono a la pantalla principal" "Para nuevas apps" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 3c2691067d..c9765e4b76 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -76,9 +76,12 @@ "Permitir rotación de la pantalla de inicio" "Al girar el teléfono" "La configuración de pantalla actual no permite girar la pantalla" - "Insignias de los iconos" - "Activadas para todas las aplicaciones" - "Desactivadas para todas las aplicaciones" + + + + + + "Añadir icono a la pantalla de inicio" "Para nuevas aplicaciones" diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index 3cd9a9ea44..73420d34f8 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -76,9 +76,12 @@ "Luba avaekraani pööramine" "Kui telefoni pööratakse" "Praegune kuvaseade ei luba pööramist" - "Ikoonimärgi lisamine" - "Sisse lülitatud kõigi rakenduste jaoks" - "Välja lülitatud kõigi rakenduste jaoks" + + + + + + "Lisa ikoon avaekraanile" "Uute rakenduste puhul" diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml index dfb969f364..07ffe7fd7d 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/strings.xml @@ -76,9 +76,12 @@ "Baimendu hasierako pantaila biratzea" "Telefonoa biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" - "Ikonoen bereizgarriak" - "Aktibatuta aplikazio guztietan" - "Desaktibatuta aplikazio guztietan" + + + + + + "Gehitu ikonoa hasierako pantailan" "Aplikazio berrietan" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 7da80a4002..4ed446e41f 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -76,9 +76,12 @@ "امکان دادن به چرخش صفحه اصلی" "وقتی تلفن چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" - "برچسب‌گذاری نماد" - "برای همه برنامه‌ها روشن‌ است" - "برای همه برنامه‌ها خاموش است" + + + + + + "افزودن نماد به صفحه اصلی" "برای برنامه‌های جدید" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index b125d45145..559340ae39 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -76,9 +76,12 @@ "Salli aloitusnäytön kiertäminen" "Kun puhelinta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." - "Kuvakemerkit" - "Käytössä kaikissa sovelluksissa" - "Pois käytöstä kaikissa sovelluksissa" + + + + + + "Lisää kuvake aloitusruutuun" "Uusille sovelluksille" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 3b7a1aebd2..c96381e15b 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -76,9 +76,12 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le mode d\'affichage actuel ne permet pas le pivotement" - "Insignes d\'icône" - "Activé pour toutes les applications" - "Désactivé pour toutes les applications" + + + + + + "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index ca4c7e7ea3..bd1d3de7a2 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -76,9 +76,12 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." - "Identification des icônes" - "Activée pour toutes les applications" - "Désactivée pour toutes les applications" + + + + + + "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index c1d2536cea..68f5a33623 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -76,9 +76,12 @@ "Permitir xirar a pantalla de inicio" "Ao xirar o teléfono" "A configuración de visualización actual non permite xirar a pantalla" - "Insignias de iconas" - "Activado para todas as aplicacións" - "Desactivado para todas as aplicacións" + + + + + + "Engadir icona á pantalla de inicio" "Para novas aplicacións" diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml index 31d92b0161..b037d141d9 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/strings.xml @@ -76,9 +76,12 @@ "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" - "આઇકનને બૅજ કરવું" - "બધી ઍપ્લિકેશનો માટે ચાલુ છે" - "બધી ઍપ્લિકેશનો માટે બંધ છે" + + + + + + "હોમ સ્ક્રીન પર આઇકન ઉમેરો" "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index e5b316c6a0..a234e2af4a 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -76,9 +76,12 @@ "होमस्क्रीन घुमाने की अनुमति दें" "फ़ोन घुुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" - "आइकन बैजिंग" - "सभी ऐप्लिकेशन के लिए चालू है" - "सभी ऐप्लिकेशन के लिए बंद है" + + + + + + "होम स्क्रीन में आइकन जोड़ें" "नए ऐप्लिकेशन के लिए" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index de5f9aea07..8e8283e760 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -76,9 +76,12 @@ "Dopusti zakretanje početnog zaslona" "Kada se telefon zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" - "Dodavanje oznake na ikonu" - "Uključeno za sve aplikacije" - "Isključeno za sve aplikacije" + + + + + + "Dodaj ikonu na početni zaslon" "Za nove aplikacije" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index f0f597cd16..32c86616bb 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -76,9 +76,12 @@ "A kezdőképernyő elforgatásának engedélyezése" "A telefon elforgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" - "Ikonjelvények" - "Bekapcsolva az összes alkalmazásnál" - "Kikapcsolva az összes alkalmazásnál" + + + + + + "Ikon hozzáadása a kezdőképernyőhöz" "Új alkalmazásoknál" diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index f9fa33779b..af75e69b39 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -76,9 +76,12 @@ "Թույլ տալ հիմնական էկրանի պտտումը" "Հեռախոսը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" - "Պատկերակի նշանակ" - "Միացված է բոլոր հավելվածների համար" - "Անջատված է բոլոր հավելվածների համար" + + + + + + "Ավելացնել պատկերակը Հիմնական էկրանին" "Նոր հավելվածների համար" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 3aff82bf37..0d87f26f4b 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -76,9 +76,12 @@ "Izinkan layar Utama diputar" "Saat ponsel diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" - "Badge ikon" - "Aktif untuk semua aplikasi" - "Nonaktif untuk semua aplikasi" + + + + + + "Tambahkan ikon ke layar Utama" "Untuk aplikasi baru" diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml index b672245c2d..0f834dfca9 100644 --- a/res/values-is-rIS/strings.xml +++ b/res/values-is-rIS/strings.xml @@ -76,9 +76,12 @@ "Leyfa snúning fyrir heimaskjá" "Þegar símanum er snúið" "Núverandi skjástilling leyfir ekki snúning" - "Merking á skjöldum" - "Virkt fyrir öll forrit" - "Slökkt fyrir öll forrit" + + + + + + "Bæta tákni á heimaskjáinn" "Fyrir ný forrit" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 9e3fd93d11..f3c8880705 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -76,9 +76,12 @@ "Consenti rotazione della schermata Home" "Con il telefono ruotato" "L\'impostazione corrente del display non consente la rotazione" - "Badge per le icone" - "Impostazione attiva per tutte le app" - "Impostazione non attiva per tutte le app" + + + + + + "Aggiungi icone alla schermata Home" "Per le nuove app" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index f02d15605c..31127603cd 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -76,9 +76,12 @@ "אפשרות סיבוב של מסך דף הבית" "כאשר הטלפון מסובב" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" - "הצגת תגים על גבי סמלים" - "מופעלת לכל האפליקציות" - "כבויה לכל האפליקציות" + + + + + + "הוספת סמל במסך דף הבית" "לאפליקציות חדשות" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index dc6f9bc120..2564372fd5 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -76,9 +76,12 @@ "ホーム画面の回転を許可" "スマートフォンが回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" - "アイコンバッジ" - "すべてのアプリで ON" - "すべてのアプリで OFF" + + + + + + "ホーム画面にアイコンを追加" "新しいアプリをダウンロードしたときに" diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 5544ee1524..7b9c2ddbf5 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -76,9 +76,12 @@ "მთავარი ეკრანის შეტრიალების დაშვება" "ტელეფონის შეტრიალებისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" - "ხატულას ბეჯები" - "ჩართულია ყველა აპისთვის" - "გამორთულია ყველა აპისთვის" + + + + + + "ხატულას მთავარ ეკრანზე დამატება" "ახალი აპებისთვის" diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml index 1507a58992..e04eaa1122 100644 --- a/res/values-kk-rKZ/strings.xml +++ b/res/values-kk-rKZ/strings.xml @@ -76,9 +76,12 @@ "Негізгі экранның бұрылуына рұқсат ету" "Телефон бұрылғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" - "Белгілеу" - "Барлық қолданбалар үшін қосулы" - "Барлық қолданбалар үшін өшірулі" + + + + + + "Негізгі экранға белгіше енгізу" "Жаңа қолданбаларға арналған" diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index 9f0e72dfd7..350672e683 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -76,9 +76,12 @@ "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" - "ការដាក់ស្លាក​សញ្ញារូបតំណាង" - "បើក​សម្រាប់​កម្មវិធីទាំងអស់" - "បិទសម្រាប់កម្មវិធីទាំងអស់" + + + + + + "បញ្ចូល​រូបតំណាង​ទៅ​អេក្រង់​ដើម" "សម្រាប់កម្មវិធីថ្មី" diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml index 2785ad85a7..12fdfbdcdc 100644 --- a/res/values-kn-rIN/strings.xml +++ b/res/values-kn-rIN/strings.xml @@ -76,9 +76,12 @@ "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" - "ಐಕಾನ್ ಬ್ಯಾಡ್ಜ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ" - "ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಆನ್ ಮಾಡಲಾಗಿದೆ" - "ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಆಫ್ ಆಗಿದೆ" + + + + + + "ಮುಖಪುಟದ ಪರದೆಗೆ ಐಕಾನ್ ಸೇರಿಸಿ" "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index f9185e86d2..15ed16adf8 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -76,9 +76,12 @@ "홈 화면 회전 허용" "휴대전화 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." - "아이콘 배지" - "모든 앱에서 사용 설정됨" - "모든 앱에서 사용 중지됨" + + + + + + "홈 화면에 아이콘 추가" "새로 설치한 앱에 적용" diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml index 87d98c5c79..044f76dc5c 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -76,9 +76,12 @@ "Башкы экранды айлантууга уруксат берүү" "Телефон айланганда" "Экранды айлантуу параметри өчүрүлгөн" - "Бейджик тагуу сүрөтчөсү" - "Бардык колдонмолор үчүн күйүк" - "Бардык колдонмолор үчүн өчүк" + + + + + + "Башкы экранга сүрөтчө кошуу" "Жаңы колдонмолор үчүн" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 9530aef2b7..3a0fb8c7c8 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -76,9 +76,12 @@ "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນໂທລະສັບ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" - "ປ້າຍໄອຄອນ" - "ເປີດສຳລັບທຸກແອັບ" - "ປິດສຳລັບທຸກແອັບ" + + + + + + "ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ" "ສຳລັບແອັບໃໝ່" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 517e61137c..98955c062a 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -76,9 +76,12 @@ "Leisti pasukti pagrindinį ekraną" "Kai telefonas pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" - "Piktogramos ženklelių informacija" - "Įjungta visoms programoms" - "Išjungta visoms programoms" + + + + + + "Pridėti piktogr. prie pagrindinio ekrano" "Skirta naujoms programoms" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 0c00bda9c5..0d6be8ecb0 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -76,9 +76,12 @@ "Atļaut sākuma ekrāna pagriešanu" "Pagriežot tālruni" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." - "Ikonu emblēmas" - "Ieslēgts visām lietotnēm" - "Izslēgts visām lietotnēm" + + + + + + "Pievienot ikonu sākuma ekrānā" "Jaunām lietotnēm" diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml index f9948922cb..89649af71a 100644 --- a/res/values-mk-rMK/strings.xml +++ b/res/values-mk-rMK/strings.xml @@ -76,9 +76,12 @@ "Дозволете ротација на Почетниот екран" "Кога телефонот се ротира" "Тековната поставка на Екранот не дозволува ротација" - "Ставање значки на икони" - "Вклучено за сите апликации" - "Исклучено за сите апликации" + + + + + + "Додајте икона на почетниот екран" "За нови апликации" diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml index 5995c5cdca..316dd1f08e 100644 --- a/res/values-ml-rIN/strings.xml +++ b/res/values-ml-rIN/strings.xml @@ -76,9 +76,12 @@ "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" - "ഐക്കൺ ബാഡ്‌ജിംഗ്" - "എല്ലാ ആപ്പുകൾക്കും ഓണാണ്" - "എല്ലാ ആപ്പുകൾക്കും ഓഫാണ്" + + + + + + "ഹോം സ്ക്രീനിലേക്ക് ഐക്കൺ ചേർക്കുക" "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 11e7959197..fd36e80a39 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -76,9 +76,12 @@ "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Утсыг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" - "Дүрс тэмдэг" - "Бүх аппад асаасан" - "Бүх аппад унтраасан" + + + + + + "Нүүр хуудаст дүрс тэмдэг нэмэх" "Шинэ аппад зориулсан" diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index f9443a191a..0a03108ed2 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -76,9 +76,12 @@ "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "फोन फिरविला जातो तेव्हा" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" - "चिन्ह बॅज करणे" - "सर्व अॅपसाठी चालू आहे" - "सर्व अॅपसाठी बंद आहे" + + + + + + "मुख्य स्क्रीनवर चिन्ह जोडा" "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 385a9438d5..ee242e9fd0 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -76,9 +76,12 @@ "Benarkan putaran Skrin Utama" "Apabila telefon diputar" "Tetapan Paparan semasa tidak membenarkan putaran" - "Pelencanaan ikon" - "Dihidupkan untuk semua apl" - "Dimatikan untuk semua apl" + + + + + + "Tambahkan ikon pada Skrin Utama" "Untuk apl baharu" diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml index 0588aaabf2..ae1ba71506 100644 --- a/res/values-my-rMM/strings.xml +++ b/res/values-my-rMM/strings.xml @@ -76,9 +76,12 @@ "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" "ဖုန်းကိုလှည့်ထားစဉ်" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" - "သင်္ကေတ တံဆိပ်" - "အက်ပ်များအားလုံးအတွက် ဖွင့်ထားသည်" - "အက်ပ်များအားလုံးအတွက် ပိတ်ထားသည်" + + + + + + "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" "အက်ပ်အသစ်များအတွက်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index fb7eecdd52..092c5e182f 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -76,9 +76,12 @@ "Tillat rotasjon av startskjermen" "Når telefonen roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" - "Ikonmerking" - "På for alle apper" - "Av for alle apper" + + + + + + "Legg til ikon på startsiden" "For nye apper" diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml index 524e9c6337..e81bedd274 100644 --- a/res/values-ne-rNP/strings.xml +++ b/res/values-ne-rNP/strings.xml @@ -76,9 +76,12 @@ "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "फोनलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" - "आइकनलाई पदक दिने कार्य" - "सबै अनुप्रयोगहरूमा सक्रिय छ" - "सबै अनुप्रयोगहरूमा निष्क्रिय छ" + + + + + + "गृह स्क्रिनमा आइकन थप्नुहोस्" "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index bd99a5c7b4..9a1d38a798 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -76,9 +76,12 @@ "Draaien van startscherm toestaan" "Wanneer de telefoon gedraaid is" "Huidige scherminstelling staat draaien niet toe" - "Pictogrambadges" - "Ingeschakeld voor alle apps" - "Uitgeschakeld voor alle apps" + + + + + + "Pictogram toevoegen aan startscherm" "Voor nieuwe apps" diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml index 97add38bb3..ee0b5d2241 100644 --- a/res/values-pa-rIN/strings.xml +++ b/res/values-pa-rIN/strings.xml @@ -76,16 +76,19 @@ "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" - "ਪ੍ਰਤੀਕ \'ਤੇ ਬੈਜ ਲਗਾਉਣਾ" - "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਚਾਲੂ ਹੈ" - "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਬੰਦ ਹੈ" + + + + + + "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" "ਸਿਸਟਮ ਦੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ" "ਵਰਗ" - "ਵਰਗ ਰੂਪੀ ਗੋਲ-ਚੱਕਰ" - "ਗੋਲ-ਚੱਕਰ" + "ਵਰਗਾਕਾਰ-ਚੱਕਰ" + "ਚੱਕਰ" "ਹੰਝੂ ਦੀ ਬੂੰਦ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 0955d13f5c..23d8833b0f 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -76,9 +76,12 @@ "Zezwalaj na obrót ekranu głównego" "Po obróceniu telefonu" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" - "Plakietki na ikonach" - "Włączone dla wszystkich aplikacji" - "Wyłączone dla wszystkich aplikacji" + + + + + + "Dodaj ikonę do ekranu głównego" "W przypadku nowych aplikacji" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index e9e56cc84b..e03f38c984 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -76,9 +76,12 @@ "Permitir rotação do ecrã principal" "Quando o telemóvel é rodado" "A definição de visualização atual não permite a rotação" - "Emblemas dos ícones" - "Ativada para todas as aplicações" - "Desativada para todas as aplicações" + + + + + + "Adicionar ícone ao ecrã principal" "Para novas aplicações" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 4e178078d2..9e997bd72b 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -76,9 +76,12 @@ "Permitir rotação da tela inicial" "Quando o smartphone for girado" "A configuração atual de exibição não permite rotação" - "Uso de selo de ícone" - "Ativado para todos os apps" - "Desativado para todos os apps" + + + + + + "Adicionar ícone à tela inicial" "Para novos apps" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 953b2c899c..33b06ded56 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -76,9 +76,12 @@ "Permiteți rotirea ecranului de pornire" "Când telefonul este rotit" "Setarea actuală a afișajului nu permite rotirea" - "Aplicarea insignelor pentru pictograme" - "Activată pentru toate aplicațiile" - "Dezactivată pentru toate aplicațiile" + + + + + + "Adaugă pictograme în ecranul de pornire" "Pentru aplicații noi" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 60296aeb63..d3fbcc9f18 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -76,9 +76,12 @@ "Разрешить поворачивать главный экран" "Когда телефон повернут" "В настройках отключен поворот экрана" - "Уведомления на значке приложения" - "Включено для всех приложений" - "Отключено для всех приложений" + + + + + + "Добавлять значки" "Добавлять значки установленных приложений на главный экран." diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml index ff6416f407..eaa2c2ebd7 100644 --- a/res/values-si-rLK/strings.xml +++ b/res/values-si-rLK/strings.xml @@ -76,9 +76,12 @@ "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "දුරකථනය කරකවන විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" - "නිරූපක ලාංඡනය" - "සියලු යෙදුම් සඳහා ක්‍රියාත්මකයි" - "සියලු යෙදුම් සඳහා ක්‍රියාවිරහිතයි" + + + + + + "මුල් පිටු තිරය වෙත අයිකනය එක් කරන්න" "නව යෙදුම් සඳහා" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 1a49d7d44b..f0e11a3eef 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -76,9 +76,12 @@ "Povoliť otáčanie plochy" "Pri otočení telefónu" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" - "Označovanie ikon" - "Zapnuté pre všetky aplikácie" - "Vypnuté pre všetky aplikácie" + + + + + + "Pridať ikonu na plochu" "Pri inštalácii novej aplikácie" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 16cb58cf92..9553eb5303 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -76,9 +76,12 @@ "Omogočanje sukanja začetnega zaslona" "Ko se telefon zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" - "Označevanje z ikonami" - "Vklopljeno za vse aplikacije" - "Izklopljeno za vse aplikacije" + + + + + + "Dodaj ikono na začetni zaslon" "Za nove aplikacije" diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml index 1ad19ce28f..6ced0cdaba 100644 --- a/res/values-sq-rAL/strings.xml +++ b/res/values-sq-rAL/strings.xml @@ -76,9 +76,12 @@ "Lejo rrotullimin e ekranit kryesor" "Kur telefoni rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" - "Caktimi i simbolit të ikonës" - "Aktiv për të gjitha aplikacionet" - "Joaktiv për të gjitha aplikacionet" + + + + + + "Shto ikonë në ekranin bazë" "Për aplikacionet e reja" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index f02a829d36..58dc8810ca 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -76,9 +76,12 @@ "Дозволи ротацију почетног екрана" "Када се телефон ротира" "Актуелно подешавање приказа не дозвољава ротацију" - "Додавање значки на иконе" - "Укључено за све апликације" - "Искључено за све апликације" + + + + + + "Додај икону на почетни екран" "За нове апликације" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 6778bdc83e..4ff17515c2 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -76,9 +76,12 @@ "Tillåt rotering av startskärmen" "När mobilen vrids" "Rotering tillåts inte i de nuvarande skärminställningarna" - "Ikonmärken" - "Aktiverat för alla appar" - "Inaktiverat för alla appar" + + + + + + "Lägg till ikonen på startskärmen" "För nya appar" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 48e8a329f1..32cade6619 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -78,9 +78,12 @@ "Ruhusu kuzungusha skrini ya Kwanza" "Simu inapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" - "Kuweka beji kwenye aikoni" - "Imewashwa katika programu zote" - "Imezimwa katika programu zote" + + + + + + "Ongeza aikoni kwenye Skrini ya kwanza" "Kwa ajili ya programu mpya" diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml index eca34ce9c4..7feab16439 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -76,9 +76,12 @@ "முகப்புத் திரை சுழற்சியை அனுமதி" "மொபைலைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" - "ஐகான் பேட்ஜிங்" - "எல்லாப் பயன்பாடுகளுக்கும் இயக்கப்பட்டது" - "எல்லாப் பயன்பாடுகளுக்கும் முடக்கப்பட்டது" + + + + + + "முகப்புத் திரையில் ஐகானைச் சேர்" "புதிய பயன்பாடுகளுக்கு" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml index e79512e23b..1464347145 100644 --- a/res/values-te-rIN/strings.xml +++ b/res/values-te-rIN/strings.xml @@ -76,9 +76,12 @@ "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "ఫోన్‌‌ను తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" - "చిహ్నం బ్యాడ్జ్" - "అన్ని అనువర్తనాలలో ఆన్ చేయబడ్డాయి" - "అన్ని అనువర్తనాలలో ఆఫ్‌ చేయబడ్డాయి" + + + + + + "హోమ్ స్క్రీన్‌కి చిహ్నాన్ని జోడించు" "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 2adf4b996c..687f7c0b42 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -76,9 +76,12 @@ "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนโทรศัพท์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" - "การติดป้ายไอคอน" - "เปิดสำหรับแอปทั้งหมด" - "ปิดสำหรับแอปทั้งหมด" + + + + + + "เพิ่มไอคอนในหน้าจอหลัก" "สำหรับแอปใหม่" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 4390a3a384..3b68a9e55c 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -76,9 +76,12 @@ "Payagan ang pag-rotate ng Home screen" "Kailan maro-rotate ang telepono" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" - "Pag-badge ng icon" - "Naka-on para sa lahat ng app" - "Naka-off para sa lahat ng app" + + + + + + "Idagdag ang icon sa Home screen" "Para sa mga bagong app" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index cb03f5184d..d6444de8c7 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -76,9 +76,12 @@ "Ana ekranı döndürmeye izin ver" "Telefon döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" - "Simge rozeti ekleme" - "Tüm uygulamalar için açık" - "Tüm uygulamalar için kapalı" + + + + + + "Ana ekrana simge ekle" "Yeni uygulamalar için" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 70a742fe7e..d9c7e1b9a7 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -76,9 +76,12 @@ "Дозволити обертання головного екрана" "Коли телефон обертається" "Поточні налаштування дисплея не підтримують обертання" - "Позначення значків" - "Увімкнено для всіх додатків" - "Вимкнено для всіх додатків" + + + + + + "Додати значок на головний екран" "Для нових додатків" diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml index 0a747e6a33..ed73623c6f 100644 --- a/res/values-ur-rPK/strings.xml +++ b/res/values-ur-rPK/strings.xml @@ -76,9 +76,12 @@ "ہوم اسکرین گھمانے کی اجازت دیں" "جب فون گھمایا جاتا ہے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" - "آئیکن کی بیج سازی" - "سبھی ایپس کیلئے آن ہے" - "تمام ایپس کے لئے بند ہے" + + + + + + "آئیکن کو ہوم اسکرین میں شامل کریں" "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index d11a60d9bf..c5dfc51559 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/strings.xml @@ -76,9 +76,12 @@ "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" - "Ikonka ustida nishoncha" - "Barcha ilovalar uchun yoniq" - "Barcha ilovalar uchun o‘chiq" + + + + + + "Bosh ekranga ikonka qo‘shish" "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index bd7fc450f3..c299c78a64 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -76,9 +76,12 @@ "Cho phép xoay Màn hình chính" "Khi xoay điện thoại" "Cài đặt Hiển thị hiện tại không cho phép xoay" - "Gắn huy hiệu biểu tượng" - "Bật cho tất cả ứng dụng" - "Tắt cho tất cả ứng dụng" + + + + + + "Thêm biểu tượng vào màn hình chính" "Cho ứng dụng mới" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 3ac74fd109..d3bfd1bffb 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -76,9 +76,12 @@ "允许旋转主屏幕" "手机旋转时" "当前的显示设置不允许旋转设备" - "在图标上显示标记" - "已针对所有应用开启" - "已针对所有应用关闭" + + + + + + "将图标添加到主屏幕" "适用于新应用" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 97cee9724c..79355730d5 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -76,9 +76,12 @@ "允許主畫面旋轉" "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" - "在圖示上顯示標誌" - "已為所有應用程式開啟" - "已為所有應用程式關閉" + + + + + + "將圖示加到主畫面" "適用於新安裝的應用程式" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 6a75cce105..283e83edb9 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -76,9 +76,12 @@ "允許旋轉主螢幕" "當手機旋轉時" "目前的顯示設定不允許旋轉畫面" - "在圖示上顯示標記" - "為所有應用程式開啟這項設定" - "為所有應用程式關閉這項設定" + + + + + + "將圖示加到主螢幕" "適用於新安裝的應用程式" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 56d9985fba..8502379051 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -76,9 +76,12 @@ "Vumela ukuphendukiswa kwesikrini sasekhaya" "Uma ifoni iphendukiswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" - "Ibheji yesithonjana" - "Kuvuliwe kuzo zonke izinhlelo zokusebenza" - "Kuvaliwe kuzo zonke izinhlelo zokusebenza" + + + + + + "Engeza isithonjana eskrinini sasekhaya" "Kwezinhlelo zokusebenza ezintsha" From 54cfee2668ef87cf57bdaa61840ad1052ec4d378 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 12 Jun 2017 18:45:36 -0700 Subject: [PATCH 175/446] Import translations. DO NOT MERGE Change-Id: I43d215bdcab111a02a894b7b9d8baae037506ef6 Auto-generated-cl: translation import --- res/values-af/strings.xml | 9 ++++++--- res/values-am/strings.xml | 21 ++++++++++----------- res/values-ar/strings.xml | 9 ++++++--- res/values-az/strings.xml | 9 ++++++--- res/values-b+sr+Latn/strings.xml | 9 ++++++--- res/values-be/strings.xml | 9 ++++++--- res/values-bg/strings.xml | 9 ++++++--- res/values-bn/strings.xml | 9 ++++++--- res/values-bs/strings.xml | 9 ++++++--- res/values-ca/strings.xml | 9 ++++++--- res/values-cs/strings.xml | 9 ++++++--- res/values-da/strings.xml | 9 ++++++--- res/values-de/strings.xml | 9 ++++++--- res/values-el/strings.xml | 9 ++++++--- res/values-en-rAU/strings.xml | 9 ++++++--- res/values-en-rGB/strings.xml | 9 ++++++--- res/values-en-rIN/strings.xml | 9 ++++++--- res/values-es-rUS/strings.xml | 9 ++++++--- res/values-es/strings.xml | 9 ++++++--- res/values-et/strings.xml | 9 ++++++--- res/values-eu/strings.xml | 9 ++++++--- res/values-fa/strings.xml | 9 ++++++--- res/values-fi/strings.xml | 9 ++++++--- res/values-fr-rCA/strings.xml | 9 ++++++--- res/values-fr/strings.xml | 9 ++++++--- res/values-gl/strings.xml | 9 ++++++--- res/values-gu/strings.xml | 9 ++++++--- res/values-hi/strings.xml | 9 ++++++--- res/values-hr/strings.xml | 9 ++++++--- res/values-hu/strings.xml | 9 ++++++--- res/values-hy/strings.xml | 9 ++++++--- res/values-in/strings.xml | 9 ++++++--- res/values-is/strings.xml | 9 ++++++--- res/values-it/strings.xml | 9 ++++++--- res/values-iw/strings.xml | 9 ++++++--- res/values-ja/strings.xml | 9 ++++++--- res/values-ka/strings.xml | 9 ++++++--- res/values-kk/strings.xml | 9 ++++++--- res/values-km/strings.xml | 9 ++++++--- res/values-kn/strings.xml | 9 ++++++--- res/values-ko/strings.xml | 9 ++++++--- res/values-ky/strings.xml | 9 ++++++--- res/values-lo/strings.xml | 9 ++++++--- res/values-lt/strings.xml | 9 ++++++--- res/values-lv/strings.xml | 9 ++++++--- res/values-mk/strings.xml | 9 ++++++--- res/values-ml/strings.xml | 9 ++++++--- res/values-mn/strings.xml | 9 ++++++--- res/values-mr/strings.xml | 9 ++++++--- res/values-ms/strings.xml | 9 ++++++--- res/values-my/strings.xml | 9 ++++++--- res/values-nb/strings.xml | 9 ++++++--- res/values-ne/strings.xml | 9 ++++++--- res/values-nl/strings.xml | 9 ++++++--- res/values-pa/strings.xml | 13 ++++++++----- res/values-pl/strings.xml | 9 ++++++--- res/values-pt-rPT/strings.xml | 9 ++++++--- res/values-pt/strings.xml | 9 ++++++--- res/values-ro/strings.xml | 9 ++++++--- res/values-ru/strings.xml | 9 ++++++--- res/values-si/strings.xml | 9 ++++++--- res/values-sk/strings.xml | 9 ++++++--- res/values-sl/strings.xml | 9 ++++++--- res/values-sq/strings.xml | 9 ++++++--- res/values-sr/strings.xml | 9 ++++++--- res/values-sv/strings.xml | 9 ++++++--- res/values-sw/strings.xml | 9 ++++++--- res/values-ta/strings.xml | 9 ++++++--- res/values-te/strings.xml | 9 ++++++--- res/values-th/strings.xml | 9 ++++++--- res/values-tl/strings.xml | 9 ++++++--- res/values-tr/strings.xml | 9 ++++++--- res/values-uk/strings.xml | 9 ++++++--- res/values-ur/strings.xml | 9 ++++++--- res/values-uz/strings.xml | 9 ++++++--- res/values-vi/strings.xml | 9 ++++++--- res/values-zh-rCN/strings.xml | 9 ++++++--- res/values-zh-rHK/strings.xml | 9 ++++++--- res/values-zh-rTW/strings.xml | 9 ++++++--- res/values-zu/strings.xml | 9 ++++++--- 80 files changed, 486 insertions(+), 250 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 68b8307790..78873b25d4 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -76,9 +76,12 @@ "Laat toe dat tuisskerm gedraai word" "Wanneer foon gedraai word" "Huidige vertooninstelling laat nie rotasie toe nie" - "Ikoon-kentekentoekenning" - "Aan vir alle programme" - "Af vir alle programme" + + + + + + "Voeg ikoon by tuisskerm" "Vir nuwe programme" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index ba39963f88..8515625cc8 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -76,22 +76,21 @@ "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" "ስልኩ ሲዞር" "የአሁኑ የማሳያ ቅንብር ማሽከርከርን አይፈቅድም" - "የአዶ ባጅ" - "ለሁሉም መተግበሪያዎች በርቷል" - "ለሁሉም መተግበሪያዎች ጠፍጧል" + + + + + + "አዶ ወደ የመነሻ ማያ ገጽ አክል" "ለአዲስ መተግበሪያዎች" "የሥርዓቱን ነባሪ ተጠቀም" - - - - - - - - + "ካሬ" + "Squircle" + "ክብ" + "የእንባ ጠብታ" "የማይታወቅ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index cb2634d27b..dd64a18442 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -76,9 +76,12 @@ "السماح بتدوير الشاشة الرئيسية" "عند تدوير الهاتف" "لا يسمح إعداد العرض الحالي بالتدوير" - "وضع شارات على رموز التطبيقات" - "تشغيل لجميع التطبيقات" - "إيقاف لجميع التطبيقات" + + + + + + "إضافة رمز إلى الشاشة الرئيسية" "للتطبيقات الجديدة" diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index 1f89f5a229..2a275e51e4 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -76,9 +76,12 @@ "Əsas ekranın firlanmağına icazə verin" "Telefon çevrilən zaman" "Cari Ekran ayarı fırlatmağa icazə vermir" - "İkona nişanı" - "Bütün tətbiqlər üçün aktivdir" - "Bütün tətbiqlər üçün deaktivdir" + + + + + + "Əsas ekrana ikona əlavə edin" "Yeni tətbiqlər üçün" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 9f2855d4d5..2484051643 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -76,9 +76,12 @@ "Dozvoli rotaciju početnog ekrana" "Kada se telefon rotira" "Aktuelno podešavanje prikaza ne dozvoljava rotaciju" - "Dodavanje znački na ikone" - "Uključeno za sve aplikacije" - "Isključeno za sve aplikacije" + + + + + + "Dodaj ikonu na početni ekran" "Za nove aplikacije" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index a0b7a69273..8a05ff07d8 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -76,9 +76,12 @@ "Дазволіць паварот галоўнага экрана" "Пры павароце тэлефона" "Бягучая налада дысплэя не прадугледжвае паварот" - "Паметкі на значку" - "Уключана для ўсіх праграм" - "Адключана для ўсіх праграм" + + + + + + "Дадаць значок на Галоўны экран" "Для новых праграм" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index fc3ba4ba80..591f82316f 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -76,9 +76,12 @@ "Разрешаване на завъртането на началния екран" "При завъртане на телефона" "Текущата настройка на екрана не разрешава завъртане" - "Означаване със значка на иконите" - "Включено за всички приложения" - "Изключено за всички приложения" + + + + + + "Добавяне на икона към началния екран" "За нови приложения" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 1ee4b6b174..4dbdf72539 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -76,9 +76,12 @@ "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" "যখন ফোনটি ঘোরানো হয়" "বর্তমান প্রদর্শনের সেটিংস ঘোরানোর মঞ্জুরি দেয় না" - "আইকনে ব্যাজ দেওয়া" - "সমস্ত অ্যাপের জন্য চালু আছে" - "সমস্ত অ্যাপের জন্য বন্ধ আছে" + + + + + + "হোম স্ক্রিনে আইকন যোগ করুন" "নতুন অ্যাপ্লিকেশানগুলির জন্যে" "আইকনের আকৃতি পরিবর্তন করুন" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 259e51617f..17a64c6881 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -76,9 +76,12 @@ "Dozvoli rotiranje početnog ekrana" "Kada se telefon zarotira" "Trenutne postavke ekrana ne dozvoljavaju rotiranje" - "Označavanje ikona" - "Uključeno za sve aplikacije" - "Isključeno za sve aplikacije" + + + + + + "Dodajte ikonu na početni ekran" "Za nove aplikacije" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index feee97d40a..5e26f7286f 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -76,9 +76,12 @@ "Permet la rotació de la pantalla d\'inici" "En girar el telèfon" "La configuració actual de la pantalla no permet la rotació" - "Icones encerclades" - "Activades per a totes les aplicacions" - "Desactivades per a totes les aplicacions" + + + + + + "Afegeix la icona a la pantalla d\'inici" "Per a les aplicacions noves" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 2560de3d59..5b582aa2e9 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -76,9 +76,12 @@ "Povolit otáčení plochy" "Při otočení telefonu" "Aktuální nastavení displeje neumožňuje otáčení" - "Odznaky na ikonách" - "Zapnuto pro všechny aplikace" - "Vypnuto pro všechny aplikace" + + + + + + "Přidat ikonu na plochu" "Pro nové aplikace" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 521f9eab1e..2b33416c37 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -76,9 +76,12 @@ "Tillad rotation af startskærmen" "Når telefonen roteres" "Den aktuelle indstilling for visning tillader ikke rotation" - "Ikonbadges" - "Slået til for alle apps" - "Slået fra for alle apps" + + + + + + "Føj ikon til startskærmen" "For nye apps" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 03eb04801a..78921b1e3b 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -76,9 +76,12 @@ "Drehung des Startbildschirms zulassen" "Bei Drehung des Smartphones" "Die aktuelle \"Display\"-Einstellung verhindert eine Drehung der Anzeige" - "Logosymbole" - "Für alle Apps aktiviert" - "Für alle Apps deaktiviert" + + + + + + "Symbol zu Startbildschirm hinzufügen" "Für neue Apps" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index a2b44b4bc2..dbb50e27e4 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -76,9 +76,12 @@ "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" "Όταν το τηλέφωνο περιστρέφεται" "Η τρέχουσα ρύθμιση οθόνης δεν επιτρέπει την περιστροφή" - "Σήματα εικονιδίων" - "Ενεργοποιημένα για όλες τις εφαρμογές" - "Απενεργοποιημένα για όλες τις εφαρμογές" + + + + + + "Προσθήκη εικονιδίου στην Αρχική οθόνη" "Για νέες εφαρμογές" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 08ef4f4e32..b19629a072 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -76,9 +76,12 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - "Icon badging" - "On for all apps" - "Off for all apps" + + + + + + "Add icon to Home screen" "For new apps" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 08ef4f4e32..b19629a072 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -76,9 +76,12 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - "Icon badging" - "On for all apps" - "Off for all apps" + + + + + + "Add icon to Home screen" "For new apps" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 08ef4f4e32..b19629a072 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -76,9 +76,12 @@ "Allow Homescreen rotation" "When phone is rotated" "Current display setting doesn\'t permit rotation" - "Icon badging" - "On for all apps" - "Off for all apps" + + + + + + "Add icon to Home screen" "For new apps" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index e4315bba1a..d7059ef987 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -76,9 +76,12 @@ "Permitir la rotación de la pantalla principal" "Al girar el teléfono" "La configuración actual no permite la rotación de la pantalla" - "Insignias de íconos" - "Activada para todas las apps" - "Desactivada para todas las apps" + + + + + + "Agregar ícono a la pantalla principal" "Para nuevas apps" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 3c2691067d..c9765e4b76 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -76,9 +76,12 @@ "Permitir rotación de la pantalla de inicio" "Al girar el teléfono" "La configuración de pantalla actual no permite girar la pantalla" - "Insignias de los iconos" - "Activadas para todas las aplicaciones" - "Desactivadas para todas las aplicaciones" + + + + + + "Añadir icono a la pantalla de inicio" "Para nuevas aplicaciones" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 3cd9a9ea44..73420d34f8 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -76,9 +76,12 @@ "Luba avaekraani pööramine" "Kui telefoni pööratakse" "Praegune kuvaseade ei luba pööramist" - "Ikoonimärgi lisamine" - "Sisse lülitatud kõigi rakenduste jaoks" - "Välja lülitatud kõigi rakenduste jaoks" + + + + + + "Lisa ikoon avaekraanile" "Uute rakenduste puhul" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index dfb969f364..07ffe7fd7d 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -76,9 +76,12 @@ "Baimendu hasierako pantaila biratzea" "Telefonoa biratzen denean" "Uneko pantaila-ezarpenak ez du onartzen ikuspegia biratzea" - "Ikonoen bereizgarriak" - "Aktibatuta aplikazio guztietan" - "Desaktibatuta aplikazio guztietan" + + + + + + "Gehitu ikonoa hasierako pantailan" "Aplikazio berrietan" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 7da80a4002..4ed446e41f 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -76,9 +76,12 @@ "امکان دادن به چرخش صفحه اصلی" "وقتی تلفن چرخانده می‌شود" "تنظیم نمایشگر کنونی اجازه چرخش نمی‌دهد" - "برچسب‌گذاری نماد" - "برای همه برنامه‌ها روشن‌ است" - "برای همه برنامه‌ها خاموش است" + + + + + + "افزودن نماد به صفحه اصلی" "برای برنامه‌های جدید" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index b125d45145..559340ae39 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -76,9 +76,12 @@ "Salli aloitusnäytön kiertäminen" "Kun puhelinta kierretään" "Nykyiset näyttöasetukset eivät salli näytön kiertämistä." - "Kuvakemerkit" - "Käytössä kaikissa sovelluksissa" - "Pois käytöstä kaikissa sovelluksissa" + + + + + + "Lisää kuvake aloitusruutuun" "Uusille sovelluksille" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 3b7a1aebd2..c96381e15b 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -76,9 +76,12 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le mode d\'affichage actuel ne permet pas le pivotement" - "Insignes d\'icône" - "Activé pour toutes les applications" - "Désactivé pour toutes les applications" + + + + + + "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index ca4c7e7ea3..bd1d3de7a2 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -76,9 +76,12 @@ "Autoriser la rotation de l\'écran d\'accueil" "Lorsque vous faites pivoter le téléphone" "Le paramètre d\'affichage actuel n\'autorise pas la rotation." - "Identification des icônes" - "Activée pour toutes les applications" - "Désactivée pour toutes les applications" + + + + + + "Ajouter l\'icône à l\'écran d\'accueil" "Pour les nouvelles applications" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index c1d2536cea..68f5a33623 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -76,9 +76,12 @@ "Permitir xirar a pantalla de inicio" "Ao xirar o teléfono" "A configuración de visualización actual non permite xirar a pantalla" - "Insignias de iconas" - "Activado para todas as aplicacións" - "Desactivado para todas as aplicacións" + + + + + + "Engadir icona á pantalla de inicio" "Para novas aplicacións" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index 31d92b0161..b037d141d9 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -76,9 +76,12 @@ "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "વર્તમાન પ્રદર્શન સેટિંગ ફેરવવાની પરવાનગી આપતી નથી" - "આઇકનને બૅજ કરવું" - "બધી ઍપ્લિકેશનો માટે ચાલુ છે" - "બધી ઍપ્લિકેશનો માટે બંધ છે" + + + + + + "હોમ સ્ક્રીન પર આઇકન ઉમેરો" "નવી ઍપ્લિકેશનો માટે" "આઇકનનો આકાર બદલો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index e5b316c6a0..a234e2af4a 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -76,9 +76,12 @@ "होमस्क्रीन घुमाने की अनुमति दें" "फ़ोन घुुमाए जाने पर" "वर्तमान प्रदर्शन सेटिंग घुमाने की अनुमति नहीं देती" - "आइकन बैजिंग" - "सभी ऐप्लिकेशन के लिए चालू है" - "सभी ऐप्लिकेशन के लिए बंद है" + + + + + + "होम स्क्रीन में आइकन जोड़ें" "नए ऐप्लिकेशन के लिए" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index de5f9aea07..8e8283e760 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -76,9 +76,12 @@ "Dopusti zakretanje početnog zaslona" "Kada se telefon zakrene" "Trenutačna postavka zaslona ne dopušta zakretanje" - "Dodavanje oznake na ikonu" - "Uključeno za sve aplikacije" - "Isključeno za sve aplikacije" + + + + + + "Dodaj ikonu na početni zaslon" "Za nove aplikacije" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index f0f597cd16..32c86616bb 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -76,9 +76,12 @@ "A kezdőképernyő elforgatásának engedélyezése" "A telefon elforgatásakor" "A jelenlegi kijelzőbeállítások nem teszik lehetővé az elforgatást" - "Ikonjelvények" - "Bekapcsolva az összes alkalmazásnál" - "Kikapcsolva az összes alkalmazásnál" + + + + + + "Ikon hozzáadása a kezdőképernyőhöz" "Új alkalmazásoknál" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index f9fa33779b..af75e69b39 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -76,9 +76,12 @@ "Թույլ տալ հիմնական էկրանի պտտումը" "Հեռախոսը պտտելու դեպքում" "Ցուցադրման ընթացիկ կարգավորումներն արգելում են պտտումը" - "Պատկերակի նշանակ" - "Միացված է բոլոր հավելվածների համար" - "Անջատված է բոլոր հավելվածների համար" + + + + + + "Ավելացնել պատկերակը Հիմնական էկրանին" "Նոր հավելվածների համար" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 3aff82bf37..0d87f26f4b 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -76,9 +76,12 @@ "Izinkan layar Utama diputar" "Saat ponsel diputar" "Setelan Tampilan Saat Ini tidak memungkinkan putaran" - "Badge ikon" - "Aktif untuk semua aplikasi" - "Nonaktif untuk semua aplikasi" + + + + + + "Tambahkan ikon ke layar Utama" "Untuk aplikasi baru" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index b672245c2d..0f834dfca9 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -76,9 +76,12 @@ "Leyfa snúning fyrir heimaskjá" "Þegar símanum er snúið" "Núverandi skjástilling leyfir ekki snúning" - "Merking á skjöldum" - "Virkt fyrir öll forrit" - "Slökkt fyrir öll forrit" + + + + + + "Bæta tákni á heimaskjáinn" "Fyrir ný forrit" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 9e3fd93d11..f3c8880705 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -76,9 +76,12 @@ "Consenti rotazione della schermata Home" "Con il telefono ruotato" "L\'impostazione corrente del display non consente la rotazione" - "Badge per le icone" - "Impostazione attiva per tutte le app" - "Impostazione non attiva per tutte le app" + + + + + + "Aggiungi icone alla schermata Home" "Per le nuove app" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index f02d15605c..31127603cd 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -76,9 +76,12 @@ "אפשרות סיבוב של מסך דף הבית" "כאשר הטלפון מסובב" "הגדרת התצוגה הנוכחית אינה מאפשרת סיבוב" - "הצגת תגים על גבי סמלים" - "מופעלת לכל האפליקציות" - "כבויה לכל האפליקציות" + + + + + + "הוספת סמל במסך דף הבית" "לאפליקציות חדשות" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index dc6f9bc120..2564372fd5 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -76,9 +76,12 @@ "ホーム画面の回転を許可" "スマートフォンが回転したとき" "現在の [ディスプレイ] 設定では回転を使用できません" - "アイコンバッジ" - "すべてのアプリで ON" - "すべてのアプリで OFF" + + + + + + "ホーム画面にアイコンを追加" "新しいアプリをダウンロードしたときに" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 5544ee1524..7b9c2ddbf5 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -76,9 +76,12 @@ "მთავარი ეკრანის შეტრიალების დაშვება" "ტელეფონის შეტრიალებისას" "ბრუნვა დაუშვებელია ჩვენების მიმდინარე პარამეტრებით" - "ხატულას ბეჯები" - "ჩართულია ყველა აპისთვის" - "გამორთულია ყველა აპისთვის" + + + + + + "ხატულას მთავარ ეკრანზე დამატება" "ახალი აპებისთვის" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 1507a58992..e04eaa1122 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -76,9 +76,12 @@ "Негізгі экранның бұрылуына рұқсат ету" "Телефон бұрылғанда" "Экранның ағымдағы параметрі айналуға рұқсат бермейді" - "Белгілеу" - "Барлық қолданбалар үшін қосулы" - "Барлық қолданбалар үшін өшірулі" + + + + + + "Негізгі экранға белгіше енгізу" "Жаңа қолданбаларға арналған" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 9f0e72dfd7..350672e683 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -76,9 +76,12 @@ "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ការកំណត់អេក្រង់បច្ចុប្បន្នមិនអនុញ្ញាតការបង្វិលទេ" - "ការដាក់ស្លាក​សញ្ញារូបតំណាង" - "បើក​សម្រាប់​កម្មវិធីទាំងអស់" - "បិទសម្រាប់កម្មវិធីទាំងអស់" + + + + + + "បញ្ចូល​រូបតំណាង​ទៅ​អេក្រង់​ដើម" "សម្រាប់កម្មវិធីថ្មី" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 2785ad85a7..12fdfbdcdc 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -76,9 +76,12 @@ "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶನ ಸೆಟ್ಟಿಂಗ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" - "ಐಕಾನ್ ಬ್ಯಾಡ್ಜ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ" - "ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಆನ್ ಮಾಡಲಾಗಿದೆ" - "ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಆಫ್ ಆಗಿದೆ" + + + + + + "ಮುಖಪುಟದ ಪರದೆಗೆ ಐಕಾನ್ ಸೇರಿಸಿ" "ಹೊಸ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ" "ಐಕಾನ್ ಆಕಾರವನ್ನು ಬದಲಿಸಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index f9185e86d2..15ed16adf8 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -76,9 +76,12 @@ "홈 화면 회전 허용" "휴대전화 회전 시" "현재 표시 설정에는 회전 기능이 허용되지 않습니다." - "아이콘 배지" - "모든 앱에서 사용 설정됨" - "모든 앱에서 사용 중지됨" + + + + + + "홈 화면에 아이콘 추가" "새로 설치한 앱에 적용" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index 87d98c5c79..044f76dc5c 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -76,9 +76,12 @@ "Башкы экранды айлантууга уруксат берүү" "Телефон айланганда" "Экранды айлантуу параметри өчүрүлгөн" - "Бейджик тагуу сүрөтчөсү" - "Бардык колдонмолор үчүн күйүк" - "Бардык колдонмолор үчүн өчүк" + + + + + + "Башкы экранга сүрөтчө кошуу" "Жаңы колдонмолор үчүн" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 9530aef2b7..3a0fb8c7c8 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -76,9 +76,12 @@ "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" "ເມື່ອໝຸນໂທລະສັບ" "ການຕັ້ງຄ່າສະແດງຜົນປັດຈຸບັນບໍ່ອະນຸຍາດໃຫ້ໝຸນໄດ້" - "ປ້າຍໄອຄອນ" - "ເປີດສຳລັບທຸກແອັບ" - "ປິດສຳລັບທຸກແອັບ" + + + + + + "ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ" "ສຳລັບແອັບໃໝ່" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 517e61137c..98955c062a 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -76,9 +76,12 @@ "Leisti pasukti pagrindinį ekraną" "Kai telefonas pasukamas" "Naudojant dabartinį pateikties nustatymą neleidžiama pasukti" - "Piktogramos ženklelių informacija" - "Įjungta visoms programoms" - "Išjungta visoms programoms" + + + + + + "Pridėti piktogr. prie pagrindinio ekrano" "Skirta naujoms programoms" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 0c00bda9c5..0d6be8ecb0 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -76,9 +76,12 @@ "Atļaut sākuma ekrāna pagriešanu" "Pagriežot tālruni" "Pašreizējā displeja iestatījumā nav atļauta pagriešana." - "Ikonu emblēmas" - "Ieslēgts visām lietotnēm" - "Izslēgts visām lietotnēm" + + + + + + "Pievienot ikonu sākuma ekrānā" "Jaunām lietotnēm" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index f9948922cb..89649af71a 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -76,9 +76,12 @@ "Дозволете ротација на Почетниот екран" "Кога телефонот се ротира" "Тековната поставка на Екранот не дозволува ротација" - "Ставање значки на икони" - "Вклучено за сите апликации" - "Исклучено за сите апликации" + + + + + + "Додајте икона на почетниот екран" "За нови апликации" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index 5995c5cdca..316dd1f08e 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -76,9 +76,12 @@ "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "നിലവിലെ ഡിസ്പ്ലേ ക്രമീകരണം തിരിക്കൽ അനുവദിക്കുന്നില്ല" - "ഐക്കൺ ബാഡ്‌ജിംഗ്" - "എല്ലാ ആപ്പുകൾക്കും ഓണാണ്" - "എല്ലാ ആപ്പുകൾക്കും ഓഫാണ്" + + + + + + "ഹോം സ്ക്രീനിലേക്ക് ഐക്കൺ ചേർക്കുക" "പുതിയ ആപ്പുകൾക്ക്" "ഐക്കണിന്റെ ആകാരം മാറ്റുക" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 11e7959197..fd36e80a39 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -76,9 +76,12 @@ "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" "Утсыг эргүүлсэн үед" "Дэлгэцийн одоогийн тохиргоогоор эргүүлэх боломжгүй" - "Дүрс тэмдэг" - "Бүх аппад асаасан" - "Бүх аппад унтраасан" + + + + + + "Нүүр хуудаст дүрс тэмдэг нэмэх" "Шинэ аппад зориулсан" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index f9443a191a..0a03108ed2 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -76,9 +76,12 @@ "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" "फोन फिरविला जातो तेव्हा" "वर्तमान प्रदर्शन सेटिंग फिरविण्यास परवानगी देत नाही" - "चिन्ह बॅज करणे" - "सर्व अॅपसाठी चालू आहे" - "सर्व अॅपसाठी बंद आहे" + + + + + + "मुख्य स्क्रीनवर चिन्ह जोडा" "नवीन अॅप्ससाठी" "चिन्हाचा आकार बदला" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index 385a9438d5..ee242e9fd0 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -76,9 +76,12 @@ "Benarkan putaran Skrin Utama" "Apabila telefon diputar" "Tetapan Paparan semasa tidak membenarkan putaran" - "Pelencanaan ikon" - "Dihidupkan untuk semua apl" - "Dimatikan untuk semua apl" + + + + + + "Tambahkan ikon pada Skrin Utama" "Untuk apl baharu" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 0588aaabf2..ae1ba71506 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -76,9 +76,12 @@ "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" "ဖုန်းကိုလှည့်ထားစဉ်" "လက်ရှိ မြင်ကွင်းဆက်တင်တွင် မြင်ကွင်းကို လှည့်ခွင့်မပေးပါ" - "သင်္ကေတ တံဆိပ်" - "အက်ပ်များအားလုံးအတွက် ဖွင့်ထားသည်" - "အက်ပ်များအားလုံးအတွက် ပိတ်ထားသည်" + + + + + + "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" "အက်ပ်အသစ်များအတွက်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index fb7eecdd52..092c5e182f 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -76,9 +76,12 @@ "Tillat rotasjon av startskjermen" "Når telefonen roteres" "Med den nåværende skjerminnstillingen støttes ikke rotasjon" - "Ikonmerking" - "På for alle apper" - "Av for alle apper" + + + + + + "Legg til ikon på startsiden" "For nye apper" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 524e9c6337..e81bedd274 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -76,9 +76,12 @@ "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" "फोनलाई घुमाइँदा" "हालको प्रदर्शन सम्बन्धी सेटिङले घुमाउने सुविधालाई अनुमति दिँदैन" - "आइकनलाई पदक दिने कार्य" - "सबै अनुप्रयोगहरूमा सक्रिय छ" - "सबै अनुप्रयोगहरूमा निष्क्रिय छ" + + + + + + "गृह स्क्रिनमा आइकन थप्नुहोस्" "नयाँ अनुप्रयोगका लागि" "आइकनको आकार परिवर्तन गर्नुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index bd99a5c7b4..9a1d38a798 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -76,9 +76,12 @@ "Draaien van startscherm toestaan" "Wanneer de telefoon gedraaid is" "Huidige scherminstelling staat draaien niet toe" - "Pictogrambadges" - "Ingeschakeld voor alle apps" - "Uitgeschakeld voor alle apps" + + + + + + "Pictogram toevoegen aan startscherm" "Voor nieuwe apps" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 97add38bb3..ee0b5d2241 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -76,16 +76,19 @@ "ਮੁੱਖ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਵਰਤਮਾਨ ਡਿਸਪਲੇ ਸੈਟਿੰਗ ਘੁੰਮਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦੀ ਹੈ" - "ਪ੍ਰਤੀਕ \'ਤੇ ਬੈਜ ਲਗਾਉਣਾ" - "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਚਾਲੂ ਹੈ" - "ਸਾਰੀਆਂ ਐਪਾਂ ਦੇ ਲਈ ਬੰਦ ਹੈ" + + + + + + "ਮੁੱਖ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰਤੀਕ ਸ਼ਾਮਲ ਕਰੋ" "ਨਵੀਆਂ ਐਪਾਂ ਲਈ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਬਦਲੋ" "ਸਿਸਟਮ ਦੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ" "ਵਰਗ" - "ਵਰਗ ਰੂਪੀ ਗੋਲ-ਚੱਕਰ" - "ਗੋਲ-ਚੱਕਰ" + "ਵਰਗਾਕਾਰ-ਚੱਕਰ" + "ਚੱਕਰ" "ਹੰਝੂ ਦੀ ਬੂੰਦ" "ਆਈਕਨ ਦੀ ਆਕ੍ਰਿਤੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 0955d13f5c..23d8833b0f 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -76,9 +76,12 @@ "Zezwalaj na obrót ekranu głównego" "Po obróceniu telefonu" "Obecne ustawienia wyświetlania nie pozwalają na obrót ekranu" - "Plakietki na ikonach" - "Włączone dla wszystkich aplikacji" - "Wyłączone dla wszystkich aplikacji" + + + + + + "Dodaj ikonę do ekranu głównego" "W przypadku nowych aplikacji" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index e9e56cc84b..e03f38c984 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -76,9 +76,12 @@ "Permitir rotação do ecrã principal" "Quando o telemóvel é rodado" "A definição de visualização atual não permite a rotação" - "Emblemas dos ícones" - "Ativada para todas as aplicações" - "Desativada para todas as aplicações" + + + + + + "Adicionar ícone ao ecrã principal" "Para novas aplicações" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 4e178078d2..9e997bd72b 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -76,9 +76,12 @@ "Permitir rotação da tela inicial" "Quando o smartphone for girado" "A configuração atual de exibição não permite rotação" - "Uso de selo de ícone" - "Ativado para todos os apps" - "Desativado para todos os apps" + + + + + + "Adicionar ícone à tela inicial" "Para novos apps" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 953b2c899c..33b06ded56 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -76,9 +76,12 @@ "Permiteți rotirea ecranului de pornire" "Când telefonul este rotit" "Setarea actuală a afișajului nu permite rotirea" - "Aplicarea insignelor pentru pictograme" - "Activată pentru toate aplicațiile" - "Dezactivată pentru toate aplicațiile" + + + + + + "Adaugă pictograme în ecranul de pornire" "Pentru aplicații noi" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 60296aeb63..d3fbcc9f18 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -76,9 +76,12 @@ "Разрешить поворачивать главный экран" "Когда телефон повернут" "В настройках отключен поворот экрана" - "Уведомления на значке приложения" - "Включено для всех приложений" - "Отключено для всех приложений" + + + + + + "Добавлять значки" "Добавлять значки установленных приложений на главный экран." diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index ff6416f407..eaa2c2ebd7 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -76,9 +76,12 @@ "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" "දුරකථනය කරකවන විට" "වත්මන් සංදර්ශක සැකසීම් කරකැවීමට සහාය නොදක්වයි" - "නිරූපක ලාංඡනය" - "සියලු යෙදුම් සඳහා ක්‍රියාත්මකයි" - "සියලු යෙදුම් සඳහා ක්‍රියාවිරහිතයි" + + + + + + "මුල් පිටු තිරය වෙත අයිකනය එක් කරන්න" "නව යෙදුම් සඳහා" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 1a49d7d44b..f0e11a3eef 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -76,9 +76,12 @@ "Povoliť otáčanie plochy" "Pri otočení telefónu" "Aktuálne nastavenie obrazovky nepovoľuje otáčanie" - "Označovanie ikon" - "Zapnuté pre všetky aplikácie" - "Vypnuté pre všetky aplikácie" + + + + + + "Pridať ikonu na plochu" "Pri inštalácii novej aplikácie" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 16cb58cf92..9553eb5303 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -76,9 +76,12 @@ "Omogočanje sukanja začetnega zaslona" "Ko se telefon zasuka" "Trenutna nastavitev zaslona ne dovoljuje sukanja" - "Označevanje z ikonami" - "Vklopljeno za vse aplikacije" - "Izklopljeno za vse aplikacije" + + + + + + "Dodaj ikono na začetni zaslon" "Za nove aplikacije" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 1ad19ce28f..6ced0cdaba 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -76,9 +76,12 @@ "Lejo rrotullimin e ekranit kryesor" "Kur telefoni rrotullohet" "Cilësimi aktuali i afishimit nuk lejon rrotullimin" - "Caktimi i simbolit të ikonës" - "Aktiv për të gjitha aplikacionet" - "Joaktiv për të gjitha aplikacionet" + + + + + + "Shto ikonë në ekranin bazë" "Për aplikacionet e reja" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index f02a829d36..58dc8810ca 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -76,9 +76,12 @@ "Дозволи ротацију почетног екрана" "Када се телефон ротира" "Актуелно подешавање приказа не дозвољава ротацију" - "Додавање значки на иконе" - "Укључено за све апликације" - "Искључено за све апликације" + + + + + + "Додај икону на почетни екран" "За нове апликације" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 6778bdc83e..4ff17515c2 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -76,9 +76,12 @@ "Tillåt rotering av startskärmen" "När mobilen vrids" "Rotering tillåts inte i de nuvarande skärminställningarna" - "Ikonmärken" - "Aktiverat för alla appar" - "Inaktiverat för alla appar" + + + + + + "Lägg till ikonen på startskärmen" "För nya appar" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 48e8a329f1..32cade6619 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -78,9 +78,12 @@ "Ruhusu kuzungusha skrini ya Kwanza" "Simu inapozungushwa" "Mipangilio ya sasa ya sehemu ya Onyesho hairuhusu kuzungusha" - "Kuweka beji kwenye aikoni" - "Imewashwa katika programu zote" - "Imezimwa katika programu zote" + + + + + + "Ongeza aikoni kwenye Skrini ya kwanza" "Kwa ajili ya programu mpya" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index eca34ce9c4..7feab16439 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -76,9 +76,12 @@ "முகப்புத் திரை சுழற்சியை அனுமதி" "மொபைலைச் சுழற்றும் போது" "தற்போதைய திரை அமைப்பு சுழற்றுவதை அனுமதிக்கவில்லை" - "ஐகான் பேட்ஜிங்" - "எல்லாப் பயன்பாடுகளுக்கும் இயக்கப்பட்டது" - "எல்லாப் பயன்பாடுகளுக்கும் முடக்கப்பட்டது" + + + + + + "முகப்புத் திரையில் ஐகானைச் சேர்" "புதிய பயன்பாடுகளுக்கு" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index e79512e23b..1464347145 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -76,9 +76,12 @@ "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" "ఫోన్‌‌ను తిప్పినప్పుడు" "ప్రస్తుత డిస్‌ప్లే సెట్టింగ్ భ్రమణాన్ని అనుమతించలేదు" - "చిహ్నం బ్యాడ్జ్" - "అన్ని అనువర్తనాలలో ఆన్ చేయబడ్డాయి" - "అన్ని అనువర్తనాలలో ఆఫ్‌ చేయబడ్డాయి" + + + + + + "హోమ్ స్క్రీన్‌కి చిహ్నాన్ని జోడించు" "కొత్త అనువర్తనాల కోసం" "చిహ్న ఆకారాన్ని మార్చు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 2adf4b996c..687f7c0b42 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -76,9 +76,12 @@ "อนุญาตให้หมุนหน้าจอหลัก" "เมื่อหมุนโทรศัพท์" "การตั้งค่าการแสดงผลปัจจุบันไม่อนุญาตให้มีการหมุน" - "การติดป้ายไอคอน" - "เปิดสำหรับแอปทั้งหมด" - "ปิดสำหรับแอปทั้งหมด" + + + + + + "เพิ่มไอคอนในหน้าจอหลัก" "สำหรับแอปใหม่" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 4390a3a384..3b68a9e55c 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -76,9 +76,12 @@ "Payagan ang pag-rotate ng Home screen" "Kailan maro-rotate ang telepono" "Hindi pinahihintulutan ng kasalukuyang setting ng Display ang pag-rotate" - "Pag-badge ng icon" - "Naka-on para sa lahat ng app" - "Naka-off para sa lahat ng app" + + + + + + "Idagdag ang icon sa Home screen" "Para sa mga bagong app" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index cb03f5184d..d6444de8c7 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -76,9 +76,12 @@ "Ana ekranı döndürmeye izin ver" "Telefon döndürüldüğünde" "Mevcut Ekran ayarı, döndürmeye izin vermiyor" - "Simge rozeti ekleme" - "Tüm uygulamalar için açık" - "Tüm uygulamalar için kapalı" + + + + + + "Ana ekrana simge ekle" "Yeni uygulamalar için" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 70a742fe7e..d9c7e1b9a7 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -76,9 +76,12 @@ "Дозволити обертання головного екрана" "Коли телефон обертається" "Поточні налаштування дисплея не підтримують обертання" - "Позначення значків" - "Увімкнено для всіх додатків" - "Вимкнено для всіх додатків" + + + + + + "Додати значок на головний екран" "Для нових додатків" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 0a747e6a33..ed73623c6f 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -76,9 +76,12 @@ "ہوم اسکرین گھمانے کی اجازت دیں" "جب فون گھمایا جاتا ہے" "موجودہ ڈسپلے ترتیب گھمانے کی اجازت نہیں دیتی" - "آئیکن کی بیج سازی" - "سبھی ایپس کیلئے آن ہے" - "تمام ایپس کے لئے بند ہے" + + + + + + "آئیکن کو ہوم اسکرین میں شامل کریں" "نئی ایپس کیلئے" "آئیکن کی شکل تبدیل کریں" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index d11a60d9bf..c5dfc51559 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -76,9 +76,12 @@ "Asosiy ekranni aylantirishga ruxsat berish" "Telefon burilganda" "Ekran sozlamalariga ko‘ra uni aylantirib bo‘lmaydi" - "Ikonka ustida nishoncha" - "Barcha ilovalar uchun yoniq" - "Barcha ilovalar uchun o‘chiq" + + + + + + "Bosh ekranga ikonka qo‘shish" "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index bd7fc450f3..c299c78a64 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -76,9 +76,12 @@ "Cho phép xoay Màn hình chính" "Khi xoay điện thoại" "Cài đặt Hiển thị hiện tại không cho phép xoay" - "Gắn huy hiệu biểu tượng" - "Bật cho tất cả ứng dụng" - "Tắt cho tất cả ứng dụng" + + + + + + "Thêm biểu tượng vào màn hình chính" "Cho ứng dụng mới" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 3ac74fd109..d3bfd1bffb 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -76,9 +76,12 @@ "允许旋转主屏幕" "手机旋转时" "当前的显示设置不允许旋转设备" - "在图标上显示标记" - "已针对所有应用开启" - "已针对所有应用关闭" + + + + + + "将图标添加到主屏幕" "适用于新应用" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 97cee9724c..79355730d5 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -76,9 +76,12 @@ "允許主畫面旋轉" "當手機旋轉時" "「目前顯示屏」設定不允許旋轉" - "在圖示上顯示標誌" - "已為所有應用程式開啟" - "已為所有應用程式關閉" + + + + + + "將圖示加到主畫面" "適用於新安裝的應用程式" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 6a75cce105..283e83edb9 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -76,9 +76,12 @@ "允許旋轉主螢幕" "當手機旋轉時" "目前的顯示設定不允許旋轉畫面" - "在圖示上顯示標記" - "為所有應用程式開啟這項設定" - "為所有應用程式關閉這項設定" + + + + + + "將圖示加到主螢幕" "適用於新安裝的應用程式" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 56d9985fba..8502379051 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -76,9 +76,12 @@ "Vumela ukuphendukiswa kwesikrini sasekhaya" "Uma ifoni iphendukiswa" "Isilungiselelo sesiboniso samanje asivumeli ukuzungezisa" - "Ibheji yesithonjana" - "Kuvuliwe kuzo zonke izinhlelo zokusebenza" - "Kuvaliwe kuzo zonke izinhlelo zokusebenza" + + + + + + "Engeza isithonjana eskrinini sasekhaya" "Kwezinhlelo zokusebenza ezintsha" From b81db8a3add2ceb31350223ebcdca2e60845cd10 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 12 Jun 2017 19:25:16 -0700 Subject: [PATCH 176/446] 1. Replace use of java.util.HashMap with android.util.ArrayMap in FolderPagedView class 2. Get rid of explicit type arguments that can be inferred Bug: 62466540 Change-Id: I4f6bdc3235326b7f60fad3d29e5657122e6c5e71 --- .../launcher3/folder/FolderPagedView.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index 19a16b18ae..92c6760c51 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,6 +19,7 @@ package com.android.launcher3.folder; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; +import android.util.ArrayMap; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; @@ -26,7 +27,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewDebug; import android.view.animation.DecelerateInterpolator; - import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; @@ -44,9 +44,7 @@ import com.android.launcher3.Workspace.ItemOperator; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.pageindicators.PageIndicator; import com.android.launcher3.util.Thunk; - import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -72,7 +70,7 @@ public class FolderPagedView extends PagedView { private final LayoutInflater mInflater; private final ViewGroupFocusHelper mFocusIndicatorHelper; - @Thunk final HashMap mPendingAnimations = new HashMap<>(); + @Thunk final ArrayMap mPendingAnimations = new ArrayMap<>(); @ViewDebug.ExportedProperty(category = "launcher") private final int mMaxCountX; @@ -111,7 +109,7 @@ public class FolderPagedView extends PagedView { public void setFolder(Folder folder) { mFolder = folder; mKeyListener = new PagedFolderKeyEventListener(folder); - mPageIndicator = (PageIndicator) folder.findViewById(R.id.folder_page_indicator); + mPageIndicator = folder.findViewById(R.id.folder_page_indicator); initParentViews(folder); } @@ -185,8 +183,8 @@ public class FolderPagedView extends PagedView { * @return list of items that could not be bound, probably because we hit the max size limit. */ public ArrayList bindItems(ArrayList items) { - ArrayList icons = new ArrayList(); - ArrayList extra = new ArrayList(); + ArrayList icons = new ArrayList<>(); + ArrayList extra = new ArrayList<>(); for (ShortcutInfo item : items) { if (!ALLOW_FOLDER_SCROLL && icons.size() >= mMaxItemsPerPage) { @@ -319,7 +317,7 @@ public class FolderPagedView extends PagedView { @SuppressLint("RtlHardcoded") private void arrangeChildren(ArrayList list, int itemCount, boolean saveChanges) { - ArrayList pages = new ArrayList(); + ArrayList pages = new ArrayList<>(); for (int i = 0; i < getChildCount(); i++) { CellLayout page = (CellLayout) getChildAt(i); page.removeAllViews(); @@ -526,7 +524,7 @@ public class FolderPagedView extends PagedView { */ public void completePendingPageChanges() { if (!mPendingAnimations.isEmpty()) { - HashMap pendingViews = new HashMap<>(mPendingAnimations); + ArrayMap pendingViews = new ArrayMap<>(mPendingAnimations); for (Map.Entry e : pendingViews.entrySet()) { e.getKey().animate().cancel(); e.getValue().run(); From 747588405264830fcd90b52cbb8ed94be66d2550 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Wed, 14 Jun 2017 01:10:27 -0700 Subject: [PATCH 177/446] Add LAUNCHER3_SPRING_ICONS feature flag b/34841763 Change-Id: Icb1ad68f8f51437e44372edf6a284a3935788354 --- src_flags/com/android/launcher3/config/FeatureFlags.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src_flags/com/android/launcher3/config/FeatureFlags.java b/src_flags/com/android/launcher3/config/FeatureFlags.java index ed169b6f18..40200c5903 100644 --- a/src_flags/com/android/launcher3/config/FeatureFlags.java +++ b/src_flags/com/android/launcher3/config/FeatureFlags.java @@ -42,6 +42,8 @@ public final class FeatureFlags { public static boolean LAUNCHER3_GRADIENT_ALL_APPS = true; // When enabled allows use of physics based motions in the Launcher. public static boolean LAUNCHER3_PHYSICS = true; + // When enabled allows use of spring motions on the icons. + public static boolean LAUNCHER3_SPRING_ICONS = true; // Feature flag to enable moving the QSB on the 0th screen of the workspace. public static final boolean QSB_ON_FIRST_SCREEN = true; From 571e12da665d24ab9a6d26af39432591e7f84f08 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 14 Jun 2017 11:02:27 -0700 Subject: [PATCH 178/446] Fixing FLAG_PROVIDER_NOT_READY not being cleared in LoaderTask If a widget is installed, the provider is always ready. The flag was not being cleared all the time (similar to PackageUpdatedTask). Bug: 62496671 Change-Id: Ia1c0cb3b312a20ed6451baeccb632a5e5f0e3edc --- src/com/android/launcher3/model/LoaderTask.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index b24d68251a..bb2d0b6af9 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -576,7 +576,8 @@ public class LoaderTask implements Runnable { // available or not available. We do not need to track // any future restore updates. int status = c.restoreFlag & - ~LauncherAppWidgetInfo.FLAG_RESTORE_STARTED; + ~LauncherAppWidgetInfo.FLAG_RESTORE_STARTED & + ~LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY; if (!wasProviderReady) { // If provider was not previously ready, update the // status and UI flag. @@ -584,9 +585,6 @@ public class LoaderTask implements Runnable { // Id would be valid only if the widget restore broadcast was received. if (isIdValid) { status |= LauncherAppWidgetInfo.FLAG_UI_NOT_READY; - } else { - status &= ~LauncherAppWidgetInfo - .FLAG_PROVIDER_NOT_READY; } } appWidgetInfo.restoreStatus = status; From f6eb789016fdf56ca6721b4ebed37d2df0a33dfa Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 14 Jun 2017 10:30:54 -0700 Subject: [PATCH 179/446] Extracting search algorithm in an interface to make it easier to change the search behavior Change-Id: I0b1d1387c78d13ef749aac39d5c8167c2909716a --- .../search/AllAppsSearchBarController.java | 24 ++------------ .../search/AppsSearchContainerLayout.java | 4 +-- .../search/DefaultAppSearchAlgorithm.java | 10 +++--- .../allapps/search/SearchAlgorithm.java | 32 +++++++++++++++++++ 4 files changed, 43 insertions(+), 27 deletions(-) create mode 100644 src/com/android/launcher3/allapps/search/SearchAlgorithm.java diff --git a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java index 547d9e1853..63aa7be3a6 100644 --- a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java +++ b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java @@ -31,7 +31,6 @@ import android.widget.TextView.OnEditorActionListener; import com.android.launcher3.ExtendedEditText; import com.android.launcher3.Launcher; import com.android.launcher3.Utilities; -import com.android.launcher3.allapps.AlphabeticalAppsList; import com.android.launcher3.discovery.AppDiscoveryItem; import com.android.launcher3.discovery.AppDiscoveryUpdateState; import com.android.launcher3.util.ComponentKey; @@ -46,12 +45,11 @@ public class AllAppsSearchBarController implements TextWatcher, OnEditorActionListener, ExtendedEditText.OnBackKeyListener { protected Launcher mLauncher; - protected AlphabeticalAppsList mApps; protected Callbacks mCb; protected ExtendedEditText mInput; protected String mQuery; - protected DefaultAppSearchAlgorithm mSearchAlgorithm; + protected SearchAlgorithm mSearchAlgorithm; protected InputMethodManager mInputMethodManager; public void setVisibility(int visibility) { @@ -61,9 +59,8 @@ public class AllAppsSearchBarController * Sets the references to the apps model and the search result callback. */ public final void initialize( - AlphabeticalAppsList apps, ExtendedEditText input, + SearchAlgorithm searchAlgorithm, ExtendedEditText input, Launcher launcher, Callbacks cb) { - mApps = apps; mCb = cb; mLauncher = launcher; @@ -75,22 +72,7 @@ public class AllAppsSearchBarController mInputMethodManager = (InputMethodManager) mInput.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - mSearchAlgorithm = onInitializeSearch(); - - onInitialized(); - } - - /** - * You can override this method to perform custom initialization. - */ - protected void onInitialized() { - } - - /** - * This method will get called when the controller is set. - */ - public DefaultAppSearchAlgorithm onInitializeSearch() { - return new DefaultAppSearchAlgorithm(mApps.getApps()); + mSearchAlgorithm = searchAlgorithm; } @Override diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java index 126a02c735..cb3b066fe6 100644 --- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java +++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java @@ -118,8 +118,8 @@ public class AppsSearchContainerLayout extends FrameLayout mAppsRecyclerView = recyclerView; mAppsRecyclerView.addOnScrollListener(mElevationController); mAdapter = (AllAppsGridAdapter) mAppsRecyclerView.getAdapter(); - - mSearchBarController.initialize(appsList, mSearchInput, mLauncher, this); + mSearchBarController.initialize( + new DefaultAppSearchAlgorithm(appsList.getApps()), mSearchInput, mLauncher, this); } @Override diff --git a/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java b/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java index 06097d0e64..8a0fd46f7c 100644 --- a/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java +++ b/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java @@ -26,7 +26,7 @@ import java.util.List; /** * The default search implementation. */ -public class DefaultAppSearchAlgorithm { +public class DefaultAppSearchAlgorithm implements SearchAlgorithm { private final List mApps; protected final Handler mResultHandler; @@ -36,12 +36,14 @@ public class DefaultAppSearchAlgorithm { mResultHandler = new Handler(); } + @Override public void cancel(boolean interruptActiveRequests) { if (interruptActiveRequests) { mResultHandler.removeCallbacksAndMessages(null); } } + @Override public void doSearch(final String query, final AllAppsSearchBarController.Callbacks callback) { final ArrayList result = getTitleMatchResult(query); @@ -54,7 +56,7 @@ public class DefaultAppSearchAlgorithm { }); } - public ArrayList getTitleMatchResult(String query) { + private ArrayList getTitleMatchResult(String query) { // Do an intersection of the words in the query and each title, and filter out all the // apps that don't match all of the words in the query. final String queryTextLower = query.toLowerCase(); @@ -67,7 +69,7 @@ public class DefaultAppSearchAlgorithm { return result; } - public boolean matches(AppInfo info, String query) { + public static boolean matches(AppInfo info, String query) { int queryLength = query.length(); String title = info.title.toString(); @@ -103,7 +105,7 @@ public class DefaultAppSearchAlgorithm { * 3) Any capital character after a digit or small character * 4) Any capital character before a small character */ - protected boolean isBreak(int thisType, int prevType, int nextType) { + private static boolean isBreak(int thisType, int prevType, int nextType) { switch (thisType) { case Character.UPPERCASE_LETTER: if (nextType == Character.UPPERCASE_LETTER) { diff --git a/src/com/android/launcher3/allapps/search/SearchAlgorithm.java b/src/com/android/launcher3/allapps/search/SearchAlgorithm.java new file mode 100644 index 0000000000..c409b1ce85 --- /dev/null +++ b/src/com/android/launcher3/allapps/search/SearchAlgorithm.java @@ -0,0 +1,32 @@ +/* + * 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. + */ +package com.android.launcher3.allapps.search; + +/** + * An interface for handling search. + */ +public interface SearchAlgorithm { + + /** + * Performs search and sends the result to the callback. + */ + void doSearch(String query, AllAppsSearchBarController.Callbacks callback); + + /** + * Cancels any active request. + */ + void cancel(boolean interruptActiveRequests); +} From 0ce439fc9a2fddd749d9b0c1f6da7958798bf98f Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 12 Jun 2017 17:28:07 -0700 Subject: [PATCH 180/446] 1. Get rid of mWidgetMinSize as the contents of this collection are queried, but never updated. 2. Get rid of explicit type arguments that can be inferred 3. Add type argument to variables of type HashSet Bug: 62466540 Change-Id: Ia7c9f212dcc760dfa7b1ddcd42f1e6328394d3ee --- .../launcher3/model/GridSizeMigrationTask.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/com/android/launcher3/model/GridSizeMigrationTask.java b/src/com/android/launcher3/model/GridSizeMigrationTask.java index 221798b07a..8de0de053f 100644 --- a/src/com/android/launcher3/model/GridSizeMigrationTask.java +++ b/src/com/android/launcher3/model/GridSizeMigrationTask.java @@ -13,7 +13,6 @@ import android.graphics.Point; import android.net.Uri; import android.text.TextUtils; import android.util.Log; - import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; @@ -29,10 +28,8 @@ import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.LongArrayMap; - import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.Locale; @@ -61,7 +58,6 @@ public class GridSizeMigrationTask { private final Context mContext; private final InvariantDeviceProfile mIdp; - private final HashMap mWidgetMinSize = new HashMap<>(); private final ContentValues mTempValues = new ContentValues(); protected final ArrayList mEntryToRemove = new ArrayList<>(); private final ArrayList mUpdateOperations = new ArrayList<>(); @@ -728,8 +724,10 @@ public class GridSizeMigrationTask { int widgetId = c.getInt(indexAppWidgetId); LauncherAppWidgetProviderInfo pInfo = AppWidgetManagerCompat.getInstance( mContext).getLauncherAppWidgetInfo(widgetId); - Point spans = pInfo == null ? - mWidgetMinSize.get(provider) : pInfo.getMinSpans(mIdp, mContext); + Point spans = null; + if (pInfo != null) { + spans = pInfo.getMinSpans(mIdp, mContext); + } if (spans != null) { entry.minSpanX = spans.x > 0 ? spans.x : entry.spanX; entry.minSpanY = spans.y > 0 ? spans.y : entry.spanY; @@ -865,7 +863,7 @@ public class GridSizeMigrationTask { } private static ArrayList deepCopy(ArrayList src) { - ArrayList dup = new ArrayList(src.size()); + ArrayList dup = new ArrayList<>(src.size()); for (DbEntry e : src) { dup.add(e.copy()); } @@ -909,7 +907,7 @@ public class GridSizeMigrationTask { try { boolean dbChanged = false; - HashSet validPackages = getValidPackages(context); + HashSet validPackages = getValidPackages(context); // Hotseat int srcHotseatCount = prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, idp.numHotseatIcons); if (srcHotseatCount != idp.numHotseatIcons) { @@ -962,7 +960,7 @@ public class GridSizeMigrationTask { // this set is removed. // Since the loader removes such items anyway, removing these items here doesn't cause // any extra data loss and gives us more free space on the grid for better migration. - HashSet validPackages = new HashSet<>(); + HashSet validPackages = new HashSet<>(); for (PackageInfo info : context.getPackageManager() .getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES)) { validPackages.add(info.packageName); From fd126aa95ecc8a0b71152d299f903487ca74aeba Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Wed, 14 Jun 2017 15:32:55 -0700 Subject: [PATCH 181/446] Making bitmap of PreloaderIconDrawable smaller so it fits inside the progress circle. Bug: 62270605 Change-Id: Idd3c145303531dbfbe9bd69af68b5c02baf21a93 --- src/com/android/launcher3/graphics/PreloadIconDrawable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/graphics/PreloadIconDrawable.java b/src/com/android/launcher3/graphics/PreloadIconDrawable.java index 22ce0981d0..8f49d27bac 100644 --- a/src/com/android/launcher3/graphics/PreloadIconDrawable.java +++ b/src/com/android/launcher3/graphics/PreloadIconDrawable.java @@ -69,7 +69,7 @@ public class PreloadIconDrawable extends FastBitmapDrawable { private static final int COLOR_TRACK = 0x77EEEEEE; private static final int COLOR_SHADOW = 0x55000000; - private static final float SMALL_SCALE = 0.75f; + private static final float SMALL_SCALE = 0.6f; private static final SparseArray> sShadowCache = new SparseArray<>(); From 44c3ddcf49a63f78faa8d060cc7b105d35937221 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Wed, 14 Jun 2017 17:50:51 -0700 Subject: [PATCH 182/446] Replace use of java.util.HashMap with android.util.ArrayMap in AddWorkspaceItemsTask class Bug: 62466540 Change-Id: Iae1e7a639754d08ad7dbb90b20e2e4e205a078f8 --- .../android/launcher3/model/AddWorkspaceItemsTask.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index b27ccfd017..68012c4ba1 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -20,9 +20,9 @@ import android.content.Intent; import android.content.pm.LauncherActivityInfo; import android.os.Process; import android.os.UserHandle; +import android.util.ArrayMap; import android.util.LongSparseArray; import android.util.Pair; - import com.android.launcher3.AllAppsList; import com.android.launcher3.AppInfo; import com.android.launcher3.FolderInfo; @@ -39,9 +39,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.util.GridOccupancy; import com.android.launcher3.util.ManagedProfileHeuristic.UserFolderInfo; import com.android.launcher3.util.Provider; - import java.util.ArrayList; -import java.util.HashMap; import java.util.List; /** @@ -68,7 +66,7 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { final ArrayList addedItemsFinal = new ArrayList<>(); final ArrayList addedWorkspaceScreensFinal = new ArrayList<>(); - HashMap userFolderMap = new HashMap<>(); + ArrayMap userFolderMap = new ArrayMap<>(); // Get the list of workspace screens. We need to append to this list and // can not use sBgWorkspaceScreens because loadWorkspace() may not have been @@ -146,8 +144,8 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { scheduleCallbackTask(new CallbackTask() { @Override public void execute(Callbacks callbacks) { - final ArrayList addAnimated = new ArrayList(); - final ArrayList addNotAnimated = new ArrayList(); + final ArrayList addAnimated = new ArrayList<>(); + final ArrayList addNotAnimated = new ArrayList<>(); if (!addedItemsFinal.isEmpty()) { ItemInfo info = addedItemsFinal.get(addedItemsFinal.size() - 1); long lastScreenId = info.screenId; From 4bfa466ceffe443a33de2221bab1b0b6caa66979 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Wed, 14 Jun 2017 19:04:10 -0700 Subject: [PATCH 183/446] Add following compile time dependency to packages/apps/Launcher3/build.gradle file compile "com.android.support:support-dynamic-animation:${SUPPORT_LIBS_VERSION}" Change-Id: Iab156fc00837829034f5b9eb9755a83a65546de6 --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index ef782d90d6..c23a29920d 100644 --- a/build.gradle +++ b/build.gradle @@ -68,6 +68,7 @@ repositories { final String SUPPORT_LIBS_VERSION = '26.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.android.support:palette-v7:${SUPPORT_LIBS_VERSION}" compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-2' From 8cae50d8b2b2e8f4d8ee76b6b8e51b66326abe7f Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Wed, 14 Jun 2017 17:33:58 -0700 Subject: [PATCH 184/446] Replace use of java.util.HashMap with android.util.ArrayMap in UserManagerCompatVL class Bug: 62466540 Change-Id: Ia492a9189ae950d2a96b79b786dc447afa982c21 --- src/com/android/launcher3/compat/UserManagerCompatVL.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/compat/UserManagerCompatVL.java b/src/com/android/launcher3/compat/UserManagerCompatVL.java index c7f88f63d1..bb425732c0 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVL.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java @@ -21,13 +21,11 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.UserHandle; import android.os.UserManager; - +import android.util.ArrayMap; import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.ManagedProfileHeuristic; - import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; public class UserManagerCompatVL extends UserManagerCompat { @@ -40,7 +38,7 @@ public class UserManagerCompatVL extends UserManagerCompat { protected LongArrayMap mUsers; // Create a separate reverse map as LongArrayMap.indexOfValue checks if objects are same // and not {@link Object#equals} - protected HashMap mUserToSerialMap; + protected ArrayMap mUserToSerialMap; UserManagerCompatVL(Context context) { mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); @@ -88,7 +86,7 @@ public class UserManagerCompatVL extends UserManagerCompat { public void enableAndResetCache() { synchronized (this) { mUsers = new LongArrayMap<>(); - mUserToSerialMap = new HashMap<>(); + mUserToSerialMap = new ArrayMap<>(); List users = mUserManager.getUserProfiles(); if (users != null) { for (UserHandle user : users) { From 6db41f1c69a6387465f545f42c918e66e751dc84 Mon Sep 17 00:00:00 2001 From: Mario Bertschler Date: Thu, 15 Jun 2017 11:02:39 -0700 Subject: [PATCH 185/446] Fix for clipped promise icon. Bug: 62544596 Change-Id: Iadbd8b27244b6d2ff3f9f0167f90b2a260687bc3 --- .../android/launcher3/graphics/PreloadIconDrawable.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/graphics/PreloadIconDrawable.java b/src/com/android/launcher3/graphics/PreloadIconDrawable.java index 22ce0981d0..39cd401baa 100644 --- a/src/com/android/launcher3/graphics/PreloadIconDrawable.java +++ b/src/com/android/launcher3/graphics/PreloadIconDrawable.java @@ -121,11 +121,11 @@ public class PreloadIconDrawable extends FastBitmapDrawable { protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); mTmpMatrix.setScale( - (bounds.width() - PROGRESS_WIDTH - 2 * PROGRESS_GAP) / PATH_SIZE, - (bounds.height() - PROGRESS_WIDTH - 2 * PROGRESS_GAP) / PATH_SIZE); + (bounds.width() - 2 * PROGRESS_WIDTH - 2 * PROGRESS_GAP) / PATH_SIZE, + (bounds.height() - 2 * PROGRESS_WIDTH - 2 * PROGRESS_GAP) / PATH_SIZE); mTmpMatrix.postTranslate( - bounds.left + PROGRESS_WIDTH / 2 + PROGRESS_GAP, - bounds.top + PROGRESS_WIDTH / 2 + PROGRESS_GAP); + bounds.left + PROGRESS_WIDTH + PROGRESS_GAP, + bounds.top + PROGRESS_WIDTH + PROGRESS_GAP); mProgressPath.transform(mTmpMatrix, mScaledTrackPath); float scale = bounds.width() / PATH_SIZE; From 7fd4bb625d04ec3d6f2b903066c9334c2c7e8bb6 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Thu, 15 Jun 2017 11:30:37 -0700 Subject: [PATCH 186/446] Align widgets labels to view start for RTL Bug: 62593142 Change-Id: I058be62904d0c3a04837331e2da884aca21a598c --- res/layout/widgets_list_row_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/res/layout/widgets_list_row_view.xml b/res/layout/widgets_list_row_view.xml index b6e0a0bd74..1062269b16 100644 --- a/res/layout/widgets_list_row_view.xml +++ b/res/layout/widgets_list_row_view.xml @@ -41,6 +41,7 @@ android:singleLine="true" android:textColor="?android:attr/textColorPrimary" android:textSize="16sp" + android:textAlignment="viewStart" launcher:customShadows="false" launcher:deferShadowGeneration="true" launcher:iconDisplay="widget_section" From 443bfc8600c4d979c62400eafb3f623d9d3a4ed1 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Thu, 15 Jun 2017 13:18:51 -0700 Subject: [PATCH 187/446] 1. Get rid of few unnecessary boxing in BgDataModel class. 2. Get rid of an unnecessary return statment from BgDataModel class. Change-Id: I7be47a75d3754bc621cff4af59d5b03cc3e53f10 --- src/com/android/launcher3/model/BgDataModel.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index d9c5143f2e..816c1d46d6 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -152,7 +152,7 @@ public class BgDataModel { for (ArrayList map : deepShortcutMap.values()) { writer.print(prefix + " "); for (String str : map) { - writer.print(str.toString() + ", "); + writer.print(str + ", "); } writer.println(); } @@ -166,7 +166,7 @@ public class BgDataModel { DumpTargetWrapper hotseat = new DumpTargetWrapper(ContainerType.HOTSEAT, 0); LongArrayMap workspaces = new LongArrayMap<>(); for (int i = 0; i < workspaceScreens.size(); i++) { - workspaces.put(new Long(workspaceScreens.get(i)), + workspaces.put(workspaceScreens.get(i), new DumpTargetWrapper(ContainerType.WORKSPACE, i)); } DumpTargetWrapper dtw; @@ -183,7 +183,7 @@ public class BgDataModel { if (fInfo.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { hotseat.add(dtw); } else if (fInfo.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { - workspaces.get(new Long(fInfo.screenId)).add(dtw); + workspaces.get(fInfo.screenId).add(dtw); } } // Add leaf nodes (L3): *Info @@ -197,7 +197,7 @@ public class BgDataModel { if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { hotseat.add(dtw); } else if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { - workspaces.get(new Long(info.screenId)).add(dtw); + workspaces.get(info.screenId).add(dtw); } } for (int i = 0; i < appWidgets.size(); i++) { @@ -207,7 +207,7 @@ public class BgDataModel { if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { hotseat.add(dtw); } else if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { - workspaces.get(new Long(info.screenId)).add(dtw); + workspaces.get(info.screenId).add(dtw); } } From 5606e070592521c80033381fc0536d4aa1351695 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 15 Jun 2017 14:24:21 -0700 Subject: [PATCH 188/446] Removing long press support from page-indicator Bug: 62445549 Bug: 38163974 Change-Id: Ic0ae44ded7e4755c5401f327ce0d98a9ea96b2ab --- src/com/android/launcher3/Hotseat.java | 1 - src/com/android/launcher3/Launcher.java | 39 +++++-------------- .../LauncherStateTransitionAnimation.java | 9 +---- .../allapps/AllAppsContainerView.java | 11 ------ .../allapps/AllAppsTransitionController.java | 8 +--- .../launcher3/allapps/SearchUiManager.java | 12 ------ .../search/AppsSearchContainerLayout.java | 12 ------ .../PageIndicatorCaretLandscape.java | 1 - .../PageIndicatorLineCaret.java | 1 - 9 files changed, 12 insertions(+), 82 deletions(-) diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index ab82c988e6..af3abebb4c 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -151,7 +151,6 @@ public class Hotseat extends FrameLayout mLauncher.setAllAppsButton(allAppsButton); allAppsButton.setOnTouchListener(mLauncher.getHapticFeedbackTouchListener()); allAppsButton.setOnClickListener(mLauncher); - allAppsButton.setOnLongClickListener(mLauncher); allAppsButton.setOnFocusChangeListener(mLauncher.mFocusHandler); } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index dd0d2b8046..bd006c7185 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -979,8 +979,7 @@ public class Launcher extends BaseActivity // Don't update the predicted apps if the user is returning to launcher in the apps // view after launching an app, as they may be depending on the UI to be static to // switch to another app, otherwise, if it was - showAppsView(false /* animated */, !launchedFromApp /* updatePredictedApps */, - mAppsView.shouldRestoreImeState() /* focusSearchBar */); + showAppsView(false /* animated */, !launchedFromApp /* updatePredictedApps */); } else if (mOnResumeState == State.WIDGETS) { showWidgetsView(false, false); } @@ -2351,18 +2350,7 @@ public class Launcher extends BaseActivity if (!isAppsViewVisible()) { getUserEventDispatcher().logActionOnControl(Action.Touch.TAP, ControlType.ALL_APPS_BUTTON); - showAppsView(true /* animated */, true /* updatePredictedApps */, - false /* focusSearchBar */); - } - } - - protected void onLongClickAllAppsButton(View v) { - if (LOGD) Log.d(TAG, "onLongClickAllAppsButton"); - if (!isAppsViewVisible()) { - getUserEventDispatcher().logActionOnControl(Action.Touch.LONGPRESS, - ControlType.ALL_APPS_BUTTON); - showAppsView(true /* animated */, - true /* updatePredictedApps */, true /* focusSearchBar */); + showAppsView(true /* animated */, true /* updatePredictedApps */); } } @@ -2750,13 +2738,6 @@ public class Launcher extends BaseActivity if (isWorkspaceLocked()) return false; if (mState != State.WORKSPACE) return false; - if ((FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP && v instanceof PageIndicator) || - (v == mAllAppsButton && mAllAppsButton != null)) { - onLongClickAllAppsButton(v); - return true; - } - - boolean ignoreLongPressToOverview = mDeviceProfile.shouldIgnoreLongPressToOverview(mLastDispatchTouchEventX); @@ -2956,13 +2937,12 @@ public class Launcher extends BaseActivity /** * Shows the apps view. */ - public void showAppsView(boolean animated, boolean updatePredictedApps, - boolean focusSearchBar) { + public void showAppsView(boolean animated, boolean updatePredictedApps) { markAppsViewShown(); if (updatePredictedApps) { tryAndUpdatePredictedApps(); } - showAppsOrWidgets(State.APPS, animated, focusSearchBar); + showAppsOrWidgets(State.APPS, animated); } /** @@ -2973,7 +2953,7 @@ public class Launcher extends BaseActivity if (resetPageToZero) { mWidgetsView.scrollToTop(); } - showAppsOrWidgets(State.WIDGETS, animated, false); + showAppsOrWidgets(State.WIDGETS, animated); mWidgetsView.post(new Runnable() { @Override @@ -2990,7 +2970,7 @@ public class Launcher extends BaseActivity */ // TODO: calling method should use the return value so that when {@code false} is returned // the workspace transition doesn't fall into invalid state. - private boolean showAppsOrWidgets(State toState, boolean animated, boolean focusSearchBar) { + private boolean showAppsOrWidgets(State toState, boolean animated) { if (!(mState == State.WORKSPACE || mState == State.APPS_SPRING_LOADED || mState == State.WIDGETS_SPRING_LOADED || @@ -3008,7 +2988,7 @@ public class Launcher extends BaseActivity } if (toState == State.APPS) { - mStateTransitionAnimation.startAnimationToAllApps(animated, focusSearchBar); + mStateTransitionAnimation.startAnimationToAllApps(animated); } else { mStateTransitionAnimation.startAnimationToWidgets(animated); } @@ -3081,8 +3061,7 @@ public class Launcher extends BaseActivity public void exitSpringLoadedDragMode() { if (mState == State.APPS_SPRING_LOADED) { - showAppsView(true /* animated */, - false /* updatePredictedApps */, false /* focusSearchBar */); + showAppsView(true /* animated */, false /* updatePredictedApps */); } else if (mState == State.WIDGETS_SPRING_LOADED) { showWidgetsView(true, false); } else if (mState == State.WORKSPACE_SPRING_LOADED) { @@ -4095,7 +4074,7 @@ public class Launcher extends BaseActivity switch (keyCode) { case KeyEvent.KEYCODE_A: if (mState == State.WORKSPACE) { - showAppsView(true, true, false); + showAppsView(true, true); return true; } break; diff --git a/src/com/android/launcher3/LauncherStateTransitionAnimation.java b/src/com/android/launcher3/LauncherStateTransitionAnimation.java index 85467e06a6..e7349f040d 100644 --- a/src/com/android/launcher3/LauncherStateTransitionAnimation.java +++ b/src/com/android/launcher3/LauncherStateTransitionAnimation.java @@ -127,12 +127,8 @@ public class LauncherStateTransitionAnimation { /** * Starts an animation to the apps view. - * - * @param startSearchAfterTransition Immediately starts app search after the transition to - * All Apps is completed. */ - public void startAnimationToAllApps( - final boolean animated, final boolean startSearchAfterTransition) { + public void startAnimationToAllApps(final boolean animated) { final AllAppsContainerView toView = mLauncher.getAppsView(); final View buttonView = mLauncher.getStartViewForAllAppsRevealAnimation(); PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks(1f) { @@ -156,9 +152,6 @@ public class LauncherStateTransitionAnimation { @Override void onTransitionComplete() { mLauncher.getUserEventDispatcher().resetElapsedContainerMillis(); - if (startSearchAfterTransition) { - toView.startAppsSearch(); - } } }; int animType = CIRCULAR_REVEAL; diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index c3df07360e..051c1612d7 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -195,13 +195,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc return false; } - /** - * Focuses the search field and begins an app search. - */ - public void startAppsSearch() { - mSearchUiManager.startAppsSearch(); - } - /** * Resets the state of AllApps. */ @@ -372,10 +365,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc targetParent.containerType = mAppsRecyclerView.getContainerType(v); } - public boolean shouldRestoreImeState() { - return mSearchUiManager.shouldRestoreImeState(); - } - @Override public void setInsets(Rect insets) { DeviceProfile grid = mLauncher.getDeviceProfile(); diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index d79b0d19d2..2d8310bbe4 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -227,9 +227,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul Action.Direction.UP, containerType); } - mLauncher.showAppsView(true /* animated */, - false /* updatePredictedApps */, - false /* focusSearchBar */); + mLauncher.showAppsView(true /* animated */, false /* updatePredictedApps */); if (hasSpringAnimationHandler()) { mSpringAnimationHandler.animateToFinalPosition(0); } @@ -250,9 +248,7 @@ public class AllAppsTransitionController implements TouchController, VerticalPul Action.Direction.UP, containerType); } - mLauncher.showAppsView(true, /* animated */ - false /* updatePredictedApps */, - false /* focusSearchBar */); + mLauncher.showAppsView(true, /* animated */ false /* updatePredictedApps */); } } } diff --git a/src/com/android/launcher3/allapps/SearchUiManager.java b/src/com/android/launcher3/allapps/SearchUiManager.java index 0d013c73fe..c0d78508fe 100644 --- a/src/com/android/launcher3/allapps/SearchUiManager.java +++ b/src/com/android/launcher3/allapps/SearchUiManager.java @@ -44,18 +44,6 @@ public interface SearchUiManager { */ void preDispatchKeyEvent(KeyEvent keyEvent); - /** - * Returns true if the IME should be brought back. - * TODO: Remove when removing support for opening all-apps in search mode. - */ - boolean shouldRestoreImeState(); - - /** - * Starts the search UI - * TODO: Remove when removing support for opening all-apps in search mode. - */ - void startAppsSearch(); - void addOnScrollRangeChangeListener(OnScrollRangeChangeListener listener); /** diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java index cb3b066fe6..8e5452ee51 100644 --- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java +++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java @@ -152,18 +152,6 @@ public class AppsSearchContainerLayout extends FrameLayout } } - @Override - public boolean shouldRestoreImeState() { - return !TextUtils.isEmpty(mSearchInput.getText()); - } - - @Override - public void startAppsSearch() { - if (mApps != null) { - mSearchBarController.focusSearchField(); - } - } - @Override public void onSearchResult(String query, ArrayList apps) { if (apps != null) { diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorCaretLandscape.java b/src/com/android/launcher3/pageindicators/PageIndicatorCaretLandscape.java index ae10aedee2..8bcb9794a8 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorCaretLandscape.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorCaretLandscape.java @@ -50,7 +50,6 @@ public class PageIndicatorCaretLandscape extends PageIndicator { Launcher l = Launcher.getLauncher(context); setOnTouchListener(l.getHapticFeedbackTouchListener()); setOnClickListener(l); - setOnLongClickListener(l); setOnFocusChangeListener(l.mFocusHandler); } diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorLineCaret.java b/src/com/android/launcher3/pageindicators/PageIndicatorLineCaret.java index 91fc1f04ac..6b992fc226 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorLineCaret.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorLineCaret.java @@ -137,7 +137,6 @@ public class PageIndicatorLineCaret extends PageIndicator { mAllAppsHandle.setImageDrawable(getCaretDrawable()); mAllAppsHandle.setOnTouchListener(mLauncher.getHapticFeedbackTouchListener()); mAllAppsHandle.setOnClickListener(mLauncher); - mAllAppsHandle.setOnLongClickListener(mLauncher); mAllAppsHandle.setOnFocusChangeListener(mLauncher.mFocusHandler); mLauncher.setAllAppsButton(mAllAppsHandle); } From 8b4342c9430580387a1fed2883c3a36a6c7328f9 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 15 Jun 2017 14:50:16 -0700 Subject: [PATCH 189/446] Updating the UI for Add-to-homescreen dialog > Adding scrollView so that the contents are accessible in multi-window mode as well > Updating the padding to be same as an alert-dialog Bug: 36725328 Change-Id: I83d32156aa9cb751daf6589bc226d7cde69e9b53 --- res/layout/add_item_confirmation_activity.xml | 84 +++++++++++-------- 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/res/layout/add_item_confirmation_activity.xml b/res/layout/add_item_confirmation_activity.xml index 35bcac3893..6c316e6ff6 100644 --- a/res/layout/add_item_confirmation_activity.xml +++ b/res/layout/add_item_confirmation_activity.xml @@ -17,57 +17,73 @@ */ --> - - + + android:layout_height="0dp" + android:layout_weight="1" + android:clipToPadding="false"> - - - + android:orientation="vertical"> - + - - + + + + + + + + + + + android:gravity="end" + android:paddingBottom="4dp" + android:paddingEnd="12dp" + android:paddingStart="12dp" + android:paddingTop="4dp" >