From 4f1545ddee5834cab1061b65964207f7f098aa8b Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 20 Sep 2017 11:09:42 -0700 Subject: [PATCH 0001/1301] Clean up span calculations in LauncherAppWidgetProviderInfo. Using the results from DeviceProfile#getCellSize instead of manually computing the cell sizes. Bug: 63850436 Change-Id: I1de3871756a8b0e9bc8c5f9c2c1f386bb8dc31a2 --- .../launcher3/LauncherAppWidgetProviderInfo.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java b/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java index c7139925c8..7f41c3b587 100644 --- a/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java +++ b/src/com/android/launcher3/LauncherAppWidgetProviderInfo.java @@ -53,19 +53,13 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo { public void initSpans(Context context) { InvariantDeviceProfile idp = LauncherAppState.getIDP(context); - Point paddingLand = idp.landscapeProfile.getTotalWorkspacePadding(); - Point paddingPort = idp.portraitProfile.getTotalWorkspacePadding(); + Point landCellSize = idp.landscapeProfile.getCellSize(); + Point portCellSize = idp.portraitProfile.getCellSize(); // Always assume we're working with the smallest span to make sure we // reserve enough space in both orientations. - float smallestCellWidth = DeviceProfile.calculateCellWidth(Math.min( - idp.landscapeProfile.widthPx - paddingLand.x, - idp.portraitProfile.widthPx - paddingPort.x), - idp.numColumns); - float smallestCellHeight = DeviceProfile.calculateCellWidth(Math.min( - idp.landscapeProfile.heightPx - paddingLand.y, - idp.portraitProfile.heightPx - paddingPort.y), - idp.numRows); + float smallestCellWidth = Math.min(landCellSize.x, portCellSize.x); + float smallestCellHeight = Math.min(landCellSize.y, portCellSize.y); // We want to account for the extra amount of padding that we are adding to the widget // to ensure that it gets the full amount of space that it has requested. -- GitLab From c7dc69dc1f537e062bb130a7c6b1663cd61d1329 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 16 Apr 2018 15:43:24 -0700 Subject: [PATCH 0002/1301] Removing accessibility description from page indicators The current page is announced upon switching to it. Is should be done this way for all future page implementations with indicators. Bug: 77827828 Test: Manual Change-Id: I8f2f163a261dd7098939674d39e014236fc66d5d --- src/com/android/launcher3/PagedView.java | 6 ------ .../launcher3/allapps/PersonalWorkSlidingTabStrip.java | 7 +------ .../android/launcher3/pageindicators/PageIndicator.java | 2 -- .../launcher3/pageindicators/PageIndicatorDots.java | 5 ----- .../launcher3/pageindicators/WorkspacePageIndicator.java | 5 ----- 5 files changed, 1 insertion(+), 24 deletions(-) diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 9da5cf07b7..fe953fe538 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -203,7 +203,6 @@ public abstract class PagedView extends ViewGrou if (mPageIndicatorViewId > -1) { mPageIndicator = parent.findViewById(mPageIndicatorViewId); mPageIndicator.setMarkersCount(getChildCount()); - mPageIndicator.setPageDescription(getPageIndicatorDescription()); } } @@ -310,7 +309,6 @@ public abstract class PagedView extends ViewGrou private void updatePageIndicator() { if (mPageIndicator != null) { - mPageIndicator.setPageDescription(getPageIndicatorDescription()); mPageIndicator.setActiveMarker(getNextPage()); } } @@ -1541,10 +1539,6 @@ public abstract class PagedView extends ViewGrou return false; } - protected String getPageIndicatorDescription() { - return getCurrentPageDescription(); - } - protected boolean canAnnouncePageDescription() { return true; } diff --git a/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java b/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java index a069d5d4d3..18a9f82528 100644 --- a/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java +++ b/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java @@ -25,6 +25,7 @@ import android.util.AttributeSet; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; + import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; @@ -167,10 +168,4 @@ public class PersonalWorkSlidingTabStrip extends LinearLayout implements PageInd @Override public void setMarkersCount(int numMarkers) { } - - @Override - public void setPageDescription(CharSequence description) { - // We don't want custom page description as the tab-bar already has two tabs with their - // own descriptions. - } } diff --git a/src/com/android/launcher3/pageindicators/PageIndicator.java b/src/com/android/launcher3/pageindicators/PageIndicator.java index 3ce72917ea..8fafb6fdde 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicator.java +++ b/src/com/android/launcher3/pageindicators/PageIndicator.java @@ -25,6 +25,4 @@ public interface PageIndicator { void setActiveMarker(int activePage); void setMarkersCount(int numMarkers); - - void setPageDescription(CharSequence description); } diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java index 524ec3cb95..709975f02c 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java @@ -227,11 +227,6 @@ public class PageIndicatorDots extends View implements PageIndicator { requestLayout(); } - @Override - public void setPageDescription(CharSequence description) { - setContentDescription(description); - } - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Add extra spacing of mDotRadius on all sides so than entry animation could be run. diff --git a/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java b/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java index 4ad7feb903..3c16cde24f 100644 --- a/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java +++ b/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java @@ -186,11 +186,6 @@ public class WorkspacePageIndicator extends View implements Insettable, PageIndi } } - @Override - public void setPageDescription(CharSequence description) { - setContentDescription(description); - } - public void setShouldAutoHide(boolean shouldAutoHide) { mShouldAutoHide = shouldAutoHide; if (shouldAutoHide && mLinePaint.getAlpha() > 0) { -- GitLab From 291bfd9c952de61290fd5fed81947aeeeb6eaeeb Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 16 Apr 2018 16:31:07 -0700 Subject: [PATCH 0003/1301] Animate thumbnail dim after quick scrub settles We now animate the dim alpha at the same time as the task icon. I also clarified the dim alpha by inverting it where it is used in TaskThumbnailView. Otherwise, we have to pass 1 - dimAlpha everywhere, which is confusing and verbose. Bug: 76170043 Change-Id: If8c01300993a0e5543b0650d44daaa143592b96e --- .../android/quickstep/views/RecentsView.java | 4 +-- .../quickstep/views/TaskThumbnailView.java | 19 +++++++++++- .../com/android/quickstep/views/TaskView.java | 29 +++++++++++++++++-- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 2e70e45da1..597e33368e 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -630,9 +630,9 @@ public abstract class RecentsView TaskView firstTask = (TaskView) getChildAt(0); if (firstTask != null) { if (animate) { - firstTask.animateIconToScale(scale); + firstTask.animateIconToScaleAndDim(scale); } else { - firstTask.setIconScale(scale); + firstTask.setIconScaleAndDim(scale); } } } diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index 326eb9f093..6473d1645b 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -28,6 +28,8 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Shader; import android.util.AttributeSet; +import android.util.FloatProperty; +import android.util.Property; import android.view.View; import com.android.launcher3.BaseActivity; @@ -46,6 +48,19 @@ public class TaskThumbnailView extends View { private static final LightingColorFilter[] sDimFilterCache = new LightingColorFilter[256]; + public static final Property DIM_ALPHA = + new FloatProperty("dimAlpha") { + @Override + public void setValue(TaskThumbnailView thumbnail, float dimAlpha) { + thumbnail.setDimAlpha(dimAlpha); + } + + @Override + public Float get(TaskThumbnailView thumbnailView) { + return thumbnailView.mDimAlpha; + } + }; + private final float mCornerRadius; private final BaseActivity mActivity; @@ -111,6 +126,8 @@ public class TaskThumbnailView extends View { /** * Sets the alpha of the dim layer on top of this view. + * + * If dimAlpha is 0, no dimming is applied; if dimAlpha is 1, the thumbnail will be black. */ public void setDimAlpha(float dimAlpha) { mDimAlpha = dimAlpha; @@ -149,7 +166,7 @@ public class TaskThumbnailView extends View { } private void updateThumbnailPaintFilter() { - int mul = (int) (mDimAlpha * 255); + int mul = (int) ((1 - mDimAlpha) * 255); if (mBitmapShader != null) { LightingColorFilter filter = getLightingColorFilter(mul); mPaint.setColorFilter(filter); diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index f04acaf12e..2c1318c481 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -16,6 +16,11 @@ package com.android.quickstep.views; +import static com.android.quickstep.views.TaskThumbnailView.DIM_ALPHA; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.app.ActivityOptions; import android.content.Context; @@ -75,6 +80,8 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback private TaskThumbnailView mSnapshotView; private ImageView mIconView; private float mCurveScale; + private float mCurveDimAlpha; + private Animator mDimAlphaAnim; public TaskView(Context context) { this(context, null); @@ -166,14 +173,27 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback // Do nothing } - public void animateIconToScale(float scale) { + public void animateIconToScaleAndDim(float scale) { mIconView.animate().scaleX(scale).scaleY(scale).setDuration(SCALE_ICON_DURATION).start(); + mDimAlphaAnim = ObjectAnimator.ofFloat(mSnapshotView, DIM_ALPHA, scale * mCurveDimAlpha); + mDimAlphaAnim.setDuration(SCALE_ICON_DURATION); + mDimAlphaAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mDimAlphaAnim = null; + } + }); + mDimAlphaAnim.start(); } - protected void setIconScale(float iconScale) { + protected void setIconScaleAndDim(float iconScale) { mIconView.animate().cancel(); mIconView.setScaleX(iconScale); mIconView.setScaleY(iconScale); + if (mDimAlphaAnim != null) { + mDimAlphaAnim.cancel(); + } + mSnapshotView.setDimAlpha(iconScale * mCurveDimAlpha); } public void resetVisualProperties() { @@ -190,7 +210,10 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback float curveInterpolation = CURVE_INTERPOLATOR.getInterpolation(scrollState.linearInterpolation); - mSnapshotView.setDimAlpha(1 - curveInterpolation * MAX_PAGE_SCRIM_ALPHA); + mCurveDimAlpha = curveInterpolation * MAX_PAGE_SCRIM_ALPHA; + if (mDimAlphaAnim == null && mIconView.getScaleX() > 0) { + mSnapshotView.setDimAlpha(mCurveDimAlpha); + } mCurveScale = 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR; setScaleX(mCurveScale); -- GitLab From 197808681dafa986b3e5aaf86b06768b94b53a8c Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Mon, 16 Apr 2018 16:09:00 +0200 Subject: [PATCH 0004/1301] Fix jank in launcher The icon grid was reappearing at the end of the animation, causing slower frame draws at the end of the animation, possibly leading to jank. Fix this by waiting with resetting the alpha until the whole animation is done. Test: Open/close apps Bug: 75985430 Change-Id: I8fa62c5f648335ce9d4c4450d52c46465e2d08bf --- .../LauncherAppTransitionManagerImpl.java | 62 +++++++++++++------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 299e7d51c1..42df457509 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -49,7 +49,9 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; import android.os.Looper; +import android.util.ArraySet; import android.util.Log; +import android.util.Pair; import android.view.Surface; import android.view.View; import android.view.ViewGroup; @@ -176,7 +178,15 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag anim.play(getIconAnimator(v)); if (launcherClosing) { - anim.play(getLauncherContentAnimator(false /* show */)); + Pair launcherContentAnimator = + getLauncherContentAnimator(false /* show */); + anim.play(launcherContentAnimator.first); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + launcherContentAnimator.second.run(); + } + }); } anim.play(getWindowAnimators(v, targetCompats)); } @@ -265,8 +275,9 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag * @param show If true: Animate the content so that it moves upwards and fades in. * Else: Animate the content so that it moves downwards and fades out. */ - private AnimatorSet getLauncherContentAnimator(boolean show) { + private Pair getLauncherContentAnimator(boolean show) { AnimatorSet launcherAnimator = new AnimatorSet(); + Runnable endListener; float[] alphas = show ? new float[] {0, 1} @@ -286,6 +297,13 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag ObjectAnimator alpha = ObjectAnimator.ofFloat(appsView, View.ALPHA, alphas); alpha.setDuration(217); alpha.setInterpolator(LINEAR); + appsView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + alpha.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + appsView.setLayerType(View.LAYER_TYPE_NONE, null); + } + }); ObjectAnimator transY = ObjectAnimator.ofFloat(appsView, View.TRANSLATION_Y, trans); transY.setInterpolator(AGGRESSIVE_EASE); transY.setDuration(350); @@ -293,13 +311,11 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag launcherAnimator.play(alpha); launcherAnimator.play(transY); - launcherAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - appsView.setAlpha(startAlpha); - appsView.setTranslationY(startY); - } - }); + endListener = () -> { + appsView.setAlpha(startAlpha); + appsView.setTranslationY(startY); + appsView.setLayerType(View.LAYER_TYPE_NONE, null); + }; } else { mDragLayer.setAlpha(alphas[0]); mDragLayer.setTranslationY(trans[0]); @@ -314,15 +330,14 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag launcherAnimator.play(dragLayerAlpha); launcherAnimator.play(dragLayerTransY); - launcherAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mDragLayer.setAlpha(1); - mDragLayer.setTranslationY(0); - } - }); + mDragLayer.setLayerType(View.LAYER_TYPE_HARDWARE, null); + endListener = () -> { + mDragLayer.setLayerType(View.LAYER_TYPE_NONE, null); + mDragLayer.setAlpha(1); + mDragLayer.setTranslationY(0); + }; } - return launcherAnimator; + return new Pair<>(launcherAnimator, endListener); } /** @@ -647,9 +662,16 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag private void createLauncherResumeAnimation(AnimatorSet anim) { if (mLauncher.isInState(LauncherState.ALL_APPS) || mLauncher.getDeviceProfile().isVerticalBarLayout()) { - AnimatorSet contentAnimator = getLauncherContentAnimator(true /* show */); - contentAnimator.setStartDelay(LAUNCHER_RESUME_START_DELAY); - anim.play(contentAnimator); + Pair contentAnimator = + getLauncherContentAnimator(true /* show */); + contentAnimator.first.setStartDelay(LAUNCHER_RESUME_START_DELAY); + anim.play(contentAnimator.first); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + contentAnimator.second.run(); + } + }); } else { AnimatorSet workspaceAnimator = new AnimatorSet(); -- GitLab From 2020b20cd908d64863474ae53de64e6554fd85c9 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 17 Apr 2018 10:45:24 -0700 Subject: [PATCH 0005/1301] Disabling alpha layer on some views Change-Id: Ide1d5951ea80080f8fea8f32a76487b646b4f958 --- res/layout/all_apps.xml | 2 -- src/com/android/launcher3/FastBitmapDrawable.java | 4 ---- src/com/android/launcher3/allapps/AllAppsPagedView.java | 5 +++++ src/com/android/launcher3/allapps/AllAppsRecyclerView.java | 4 ++++ src/com/android/launcher3/allapps/FloatingHeaderView.java | 5 +++++ .../launcher3/allapps/PersonalWorkSlidingTabStrip.java | 5 +++++ .../android/launcher3/views/RecyclerViewFastScroller.java | 7 +++++++ 7 files changed, 26 insertions(+), 6 deletions(-) diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index 450d1074c9..5e7b117c43 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -31,8 +31,6 @@ - diff --git a/src/com/android/launcher3/FastBitmapDrawable.java b/src/com/android/launcher3/FastBitmapDrawable.java index 3873a819f4..1b91e8804b 100644 --- a/src/com/android/launcher3/FastBitmapDrawable.java +++ b/src/com/android/launcher3/FastBitmapDrawable.java @@ -174,10 +174,6 @@ public class FastBitmapDrawable extends Drawable { return getBounds().height(); } - public Bitmap getBitmap() { - return mBitmap; - } - @Override public boolean isStateful() { return true; diff --git a/src/com/android/launcher3/allapps/AllAppsPagedView.java b/src/com/android/launcher3/allapps/AllAppsPagedView.java index b2e35a4737..69068c6ee6 100644 --- a/src/com/android/launcher3/allapps/AllAppsPagedView.java +++ b/src/com/android/launcher3/allapps/AllAppsPagedView.java @@ -76,4 +76,9 @@ public class AllAppsPagedView extends PagedView { super.determineScrollingStart(ev); } } + + @Override + public boolean hasOverlappingRendering() { + return false; + } } diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index a7447b7b8c..a6c1346f6b 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -415,4 +415,8 @@ public class AllAppsRecyclerView extends BaseRecyclerView implements LogContaine y + mEmptySearchBackground.getIntrinsicHeight()); } + @Override + public boolean hasOverlappingRendering() { + return false; + } } diff --git a/src/com/android/launcher3/allapps/FloatingHeaderView.java b/src/com/android/launcher3/allapps/FloatingHeaderView.java index 461f5b5ba5..378450e76a 100644 --- a/src/com/android/launcher3/allapps/FloatingHeaderView.java +++ b/src/com/android/launcher3/allapps/FloatingHeaderView.java @@ -237,6 +237,11 @@ public class FloatingHeaderView extends LinearLayout implements public boolean hasVisibleContent() { return false; } + + @Override + public boolean hasOverlappingRendering() { + return false; + } } diff --git a/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java b/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java index 18a9f82528..a916697bf0 100644 --- a/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java +++ b/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java @@ -168,4 +168,9 @@ public class PersonalWorkSlidingTabStrip extends LinearLayout implements PageInd @Override public void setMarkersCount(int numMarkers) { } + + @Override + public boolean hasOverlappingRendering() { + return false; + } } diff --git a/src/com/android/launcher3/views/RecyclerViewFastScroller.java b/src/com/android/launcher3/views/RecyclerViewFastScroller.java index 1cd6699868..05bab8b459 100644 --- a/src/com/android/launcher3/views/RecyclerViewFastScroller.java +++ b/src/com/android/launcher3/views/RecyclerViewFastScroller.java @@ -372,4 +372,11 @@ public class RecyclerViewFastScroller extends View { } return sTempRect.contains((int) x, (int) y); } + + @Override + public boolean hasOverlappingRendering() { + // There is actually some overlap between the track and the thumb. But since the track + // alpha is so low, it does not matter. + return false; + } } -- GitLab From 1a96892e4d9ec8f0ee2c1fc876ed5179e22739ee Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 20 Apr 2018 12:02:07 -0700 Subject: [PATCH 0006/1301] Import translations. DO NOT MERGE Change-Id: Ia0bfc5197230fee6c1e5d17665029dfb8e133f2a Auto-generated-cl: translation import --- quickstep/res/values-af/strings.xml | 3 ++- quickstep/res/values-ar/strings.xml | 3 ++- quickstep/res/values-bg/strings.xml | 3 ++- quickstep/res/values-bs/strings.xml | 3 ++- quickstep/res/values-ca/strings.xml | 3 ++- quickstep/res/values-el/strings.xml | 3 ++- quickstep/res/values-es-rUS/strings.xml | 3 ++- quickstep/res/values-es/strings.xml | 3 ++- quickstep/res/values-et/strings.xml | 3 ++- quickstep/res/values-eu/strings.xml | 3 ++- quickstep/res/values-fr/strings.xml | 3 ++- quickstep/res/values-gl/strings.xml | 5 +++-- quickstep/res/values-gu/strings.xml | 3 ++- quickstep/res/values-hi/strings.xml | 3 ++- quickstep/res/values-hu/strings.xml | 3 ++- quickstep/res/values-ky/strings.xml | 3 ++- quickstep/res/values-mr/strings.xml | 3 ++- quickstep/res/values-nl/strings.xml | 3 ++- quickstep/res/values-pt-rPT/strings.xml | 3 ++- quickstep/res/values-ru/strings.xml | 3 ++- quickstep/res/values-sk/strings.xml | 3 ++- quickstep/res/values-ta/strings.xml | 3 ++- quickstep/res/values-uz/strings.xml | 3 ++- quickstep/res/values-vi/strings.xml | 3 ++- quickstep/res/values-zh-rCN/strings.xml | 3 ++- quickstep/res/values-zh-rHK/strings.xml | 3 ++- res/values-af/strings.xml | 2 +- res/values-ar/strings.xml | 2 +- res/values-bg/strings.xml | 2 +- res/values-bs/strings.xml | 2 +- res/values-ca/strings.xml | 4 ++-- res/values-el/strings.xml | 2 +- res/values-es-rUS/strings.xml | 4 ++-- res/values-es/strings.xml | 4 ++-- res/values-et/strings.xml | 2 +- res/values-eu/strings.xml | 6 +++--- res/values-fr/strings.xml | 2 +- res/values-hi/strings.xml | 2 +- res/values-hu/strings.xml | 2 +- res/values-ky/strings.xml | 6 +++--- res/values-mr/strings.xml | 8 ++++---- res/values-nl/strings.xml | 6 +++--- res/values-pt-rPT/strings.xml | 2 +- res/values-ru/strings.xml | 6 +++--- res/values-sk/strings.xml | 2 +- res/values-ta/strings.xml | 2 +- res/values-uz/strings.xml | 4 ++-- res/values-vi/strings.xml | 2 +- res/values-zh-rHK/strings.xml | 2 +- 49 files changed, 91 insertions(+), 65 deletions(-) diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index db15d07a4b..4e1d3271ab 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Verdeelde skerm" "Speld vas" - "Swiep van onder af op om programme te wissel" "Oorsig" "Geen onlangse items nie" "Maak toe" + + diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index 5c3b84c306..ec5f855534 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "تقسيم الشاشة" "تثبيت" - "التمرير سريعًا لأعلى من أسفل للتبديل بين التطبيقات" "نظرة عامة" "ليست هناك عناصر تم استخدامها مؤخرًا" "إغلاق" + + diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml index 05a1dacf6b..db4b96cfc7 100644 --- a/quickstep/res/values-bg/strings.xml +++ b/quickstep/res/values-bg/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Разделен екран" "Фиксиране" - "Прекарайте пръст нагоре от долната част, за да превключите между приложенията" "Общ преглед" "Няма скорошни елементи" "Затваряне" + + diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index fa07794428..95285d2584 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Način rada podijeljenog ekrana" "Zakači" - "Prevucite od dolje prema gore za promjenu aplikacije" "Pregled" "Nema nedavnih stavki" "Zatvaranje" + + diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml index 967fa1f760..7c57b3c769 100644 --- a/quickstep/res/values-ca/strings.xml +++ b/quickstep/res/values-ca/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Divideix la pantalla" "Fixa" - "Llisca cap amunt des de la part inferior per canviar d\'aplicació" "Aplicacions recents" "No hi ha cap element recent" "Tanca" + + diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index 7c5c260630..eeffe8496a 100644 --- a/quickstep/res/values-el/strings.xml +++ b/quickstep/res/values-el/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Διαχωρισμός οθόνης" "Καρφίτσωμα" - "Σύρετε από κάτω προς τα επάνω για εναλλαγή εφαρμογών" "Επισκόπηση" "Δεν υπάρχουν πρόσφατα στοιχεία" "Κλείσιμο" + + diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml index 1b888c0e52..be3c74b784 100644 --- a/quickstep/res/values-es-rUS/strings.xml +++ b/quickstep/res/values-es-rUS/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Pantalla dividida" "Fijar" - "Desliza el dedo hacia arriba para cambiar de app" "Recientes" "No hay elementos recientes" "Cerrar" + + diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml index b0883199f2..859cb2c987 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Dividir pantalla" "Fijar" - "Desliza el dedo hacia arriba desde la parte inferior para cambiar de aplicación" "Aplicaciones recientes" "No hay elementos recientes" "Cerrar" + + diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml index 1b30a0111d..b9cb5872d5 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Jagatud ekraan" "Kinnita" - "Rakenduste vahetamiseks pühkige alaosast üles" "Ülevaade" "Hiljutisi üksusi pole" "Sule" + + diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index e7fc91580b..5c0dd8f7d2 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Zatitu pantaila" "Ainguratu" - "Aplikazioak aldatzeko, pasatu hatza pantailako behealdetik gora" "Ikuspegi orokorra" "Ez dago azkenaldi honetako ezer" "Itxi" + + diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index 5647648541..ff216fab1a 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Écran partagé" "Épingler" - "Balayer l\'écran de bas en haut pour changer d\'application" "Aperçu" "Aucun élément récent" "Fermer" + + diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index 20de491d7d..e2883cbeb0 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Pantalla dividida" "Fixar" - "Pasa o dedo cara arriba desde a parte inferior para cambiar de aplicacións" "Visión xeral" "Non hai elementos recentes" - "Pechar" + "Pecha a aplicación" + + diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index 9337909204..416b361996 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "સ્ક્રીનને વિભાજિત કરો" "પિન કરો" - "ઍપને સ્વિચ કરવા માટે નીચેથી ઉપર સ્વાઇપ કરો" "ઝલક" "તાજેતરની કોઈ આઇટમ નથી" "બંધ કરો" + + diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml index 10dcc30f15..1c1870069a 100644 --- a/quickstep/res/values-hi/strings.xml +++ b/quickstep/res/values-hi/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "स्क्रीन को दो हिस्सों में बाँटना (स्प्लिट स्क्रीन)" "पिन करना" - "ऐप्लिकेशन स्विच करने के लिए सबसे नीचे से ऊपर की ओर स्वाइप करें" "खास जानकारी" "हाल ही में इस्तेमाल किया गया कोई ऐप्लिकेशन नहीं है" "बंद करें" + + diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml index ab5d2fc91e..23786f28e3 100644 --- a/quickstep/res/values-hu/strings.xml +++ b/quickstep/res/values-hu/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Osztott képernyő" "Rögzítés" - "Ha váltani szeretne az alkalmazások között, csúsztassa gyorsan az ujját a képernyő aljától felfelé" "Áttekintés" "Nincsenek mostanában használt elemek" "Bezárás" + + diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml index 44b7abb7da..7924b11e82 100644 --- a/quickstep/res/values-ky/strings.xml +++ b/quickstep/res/values-ky/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Экранды бөлүү" "Кадап коюу" - "Колдонмолорду которуштуруу үчүн экранды төмөндөн жогору карай сүрүңүз" "Сереп салуу" "Акыркы колдонмолор жок" "Жабуу" + + diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index fa80874287..4d941378bb 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "विभाजित स्क्रीन" "पिन करा" - "अ‍ॅप्स स्विच करण्यासाठी तळापासून वर स्वाइप करा" "अवलोकन" "कोणतेही अलीकडील आयटम नाहीत" "बंद" + + diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml index 23f42bffbb..67932b20b5 100644 --- a/quickstep/res/values-nl/strings.xml +++ b/quickstep/res/values-nl/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Gesplitst scherm" "Vastzetten" - "Veeg omhoog vanaf de onderkant om tussen apps te wisselen" "Overzicht" "Geen recente items" "Sluiten" + + diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml index 36ec3eb7ae..e86c147c15 100644 --- a/quickstep/res/values-pt-rPT/strings.xml +++ b/quickstep/res/values-pt-rPT/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Ecrã dividido" "Fixar" - "Deslize rapidamente para cima a partir da parte inferior para alternar entre aplicações." "Vista geral" "Nenhum item recente" "Fechar" + + diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml index 0b0349ad08..f8a38edf03 100644 --- a/quickstep/res/values-ru/strings.xml +++ b/quickstep/res/values-ru/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Разделить экран" "Блокировать" - "Чтобы переключить приложение, проведите по экрану снизу вверх" "Обзор" "Здесь пока ничего нет." "Закрыть" + + diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index 25c6e9eb8b..127d73ae8e 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Rozdeliť obrazovku" "Pripnúť" - "Aplikácie môžete prepínať potiahnutím prstom zdola nahor" "Prehľad" "Žiadne nedávne položky" "Zavrieť" + + diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml index 95d233d625..e372eea4d2 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "திரைப் பிரிப்பு" "பின் செய்தல்" - "ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, கீழிருந்து மேல்நோக்கி ஸ்வைப் செய்க" "மேலோட்டப் பார்வை" "சமீபத்தியவை எதுவுமில்லை" "மூடும்" + + diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index 260798f54b..fe68d74ca1 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Ekranni ikkiga ajratish" "Mahkamlash" - "Ilovalarni almashtirish uchun pastdan yuqoriga suring" "Nazar" "Yaqinda ishlatilgan ilovalar yo‘q" "Yopish" + + diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml index 0254c3390b..6db731c6a0 100644 --- a/quickstep/res/values-vi/strings.xml +++ b/quickstep/res/values-vi/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Chia đôi màn hình" "Ghim" - "Vuốt từ dưới lên để chuyển đổi ứng dụng" "Tổng quan" "Không có mục gần đây nào" "Đóng" + + diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml index 078bc83201..08fdf4ec41 100644 --- a/quickstep/res/values-zh-rCN/strings.xml +++ b/quickstep/res/values-zh-rCN/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "分屏" "固定" - "从屏幕底部向上滑动即可切换应用" "概览" "近期没有任何内容" "关闭" + + diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml index 86fce7b4e6..d3ac3a27bd 100644 --- a/quickstep/res/values-zh-rHK/strings.xml +++ b/quickstep/res/values-zh-rHK/strings.xml @@ -21,8 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "分割畫面" "固定" - "從螢幕底部向上快速滑動,即可切換應用程式" "概覽" "最近沒有任何項目" "關閉" + + diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 02dd1c98a4..8826da8cd6 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -79,7 +79,7 @@ "Vouer: %1$s" "Legstukke" "Muurpapiere" - "Home-instellings" + "Tuis-instellings" "Gedeaktiveer deur jou administrateur" "Kennisgewingkolle" "Aan" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 3163bcb783..f50e5fe8f5 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -87,7 +87,7 @@ "عطَّل المشرف هذه الميزة" "نقاط الإشعارات" "قيد التشغيل" - "قيد الإيقاف" + "غير مفعّل" "يلزم تمكين الوصول إلى الإشعارات" "لعرض نقاط الإشعارات، يجب تشغيل إشعارات التطبيق في %1$s" "تغيير الإعدادات" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 3c04905775..5f61c69a2f 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -79,7 +79,7 @@ "Папка: „%1$s“" "Приспособления" "Тапети" - "Настройки за Google Home" + "Настройки за началния екран" "Деактивирано от администратора ви" "Точки за известия" "Включено" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 7eeb652136..fa88665060 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -80,7 +80,7 @@ "Folder: %1$s" "Dodaci" "Pozadinske slike" - "Postavke za Home" + "Postavke početnog ekrana" "Onemogućio vaš administrator" "Tačke za obavještenja" "Uključeno" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 27b2979e15..de153f420b 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -50,7 +50,7 @@ "Inici" "Suprimeix" "Desinstal·la" - "Dades de l\'aplicació" + "Informació de l\'aplicació" "Instal·la" "instal·la dreceres" "Permet que una aplicació afegeixi dreceres sense la intervenció de l\'usuari." @@ -79,7 +79,7 @@ "Carpeta: %1$s" "Widgets" "Fons de pantalla" - "Configuració de la pantalla d\'inici" + "Configuració de pantalla d\'inici" "Desactivada per l\'administrador" "Punts de notificació" "Activat" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 18eec841fa..c5bae5b745 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -79,7 +79,7 @@ "Φάκελος: %1$s" "Γραφικά στοιχεία" "Ταπετσαρίες" - "Ρυθμίσεις Αρχικής σελίδας" + "Ρυθμίσεις Αρχ. Οθ." "Απενεργοποιήθηκε από τον διαχειριστή σας" "Κουκκίδες ειδοποίησης" "Ενεργή" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 989cd619e7..0410f35243 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -79,7 +79,7 @@ "Carpeta: %1$s" "Widgets" "Fondos de pantalla" - "Configuración de Home" + "Configuración de página principal" "El administrador inhabilitó esta función" "Puntos de notificación" "Activada" @@ -92,7 +92,7 @@ "Para nuevas apps" "Cambiar forma de los íconos" "en la pantalla principal" - "Usar el sistema predeterminado" + "Usar valores predeterminados del sistema" "Cuadrado" "Cuadrado con esquinas redondeadas" "Círculo" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 78f87344fe..6f045e1c7c 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -81,8 +81,8 @@ "Fondos de pantalla" "Ajustes de la pantalla de inicio" "Inhabilitada por el administrador" - "Puntos de notificación" - "Activada" + "Burbujas de notificación" + "Activado" "Desactivada" "Se necesita acceso a las notificaciones" "Para mostrar burbujas de notificación, activa las notificaciones de %1$s" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 2946076f5d..715e396031 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -79,7 +79,7 @@ "Kaust: %1$s" "Vidinad" "Taustapildid" - "Avalehe seaded" + "Avaekraani seaded" "Keelas administraator" "Märguandetäpid" "Sees" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index c3099bd98e..e25af961c7 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -81,13 +81,13 @@ "Horma-paperak" "Hasierako pantailaren ezarpenak" "Administratzaileak desgaitu du" - "Jakinarazteko biribiltxoak" + "Jakinarazpen-biribiltxoak" "Aktibatuta" "Desaktibatuta" "Jakinarazpenetarako sarbidea behar da" - "Jakinarazteko biribiltxoak ikusteko, aktibatu %1$s aplikazioaren jakinarazpenak" + "Jakinarazpen-biribiltxoak ikusteko, aktibatu %1$s aplikazioaren jakinarazpenak" "Aldatu ezarpenak" - "Erakutsi jakinarazteko biribiltxoak" + "Erakutsi jakinarazpen-biribiltxoak" "Gehitu ikonoa hasierako pantailan" "Aplikazio berrietan" "Aldatu ikonoaren forma" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index e1b758124d..283d4b7a23 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -79,7 +79,7 @@ "Dossier \"%1$s\"" "Widgets" "Fonds d\'écran" - "Paramètres de l\'écran d\'accueil" + "Paramètres accueil" "Désactivé par votre administrateur" "Pastilles de notification" "Activé" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index f98859df8c..798c061346 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -89,7 +89,7 @@ "सेटिंग बदलें" "नए नोटिफ़िकेशन बताने वाला गोल निशान दिखाएं" "होम स्क्रीन में आइकॉन जोड़ें" - "नए ऐप के लिए" + "नए ऐप्लिकेशन के लिए" "आइकॉन का आकार बदलें" "होम स्‍क्रीन पर" "सिस्टम डिफ़ॉल्ट का उपयोग करें" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 4972e81924..5f33a99f59 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -79,7 +79,7 @@ "Mappa: %1$s" "Modulok" "Háttérképek" - "A Home beállításai" + "Kezdőoldal beállításai" "A rendszergazda letiltotta" "Értesítési pöttyök" "Bekapcsolva" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index e0e740346a..eedf7fd101 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -39,7 +39,7 @@ "Колдонмолор жүктөлүүдө…" "\"%1$s\" сурамына дал келген колдонмолор табылган жок" "Көбүрөөк колдонмолорду издөө" - "Эскертмелер" + "Билдирмелер" "Кыска жолду тандоо үчүн басып туруңуз." "Кыска жолду тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "Бул Үй экранында бош орун жок." @@ -81,7 +81,7 @@ "Тушкагаздар" "Башкы беттин жөндөөлөрү" "Администраторуңуз өчүрүп койгон" - "Эскертме белгилери" + "Билдирмелер белгилери" "Күйүк" "Өчүк" "Эскертмелерге уруксат берилиши керек" @@ -92,7 +92,7 @@ "Жаңы колдонмолор үчүн" "Сүрөтчөнүн формасын өзгөртүү" "Башкы экранда" - "Тутум сушунтаган демейкисин колдонуу" + "Демейки тутум жөндөөлөрү колдонулат" "Чарчы" "Бурчтары жумуру төрт бурчтук" "Тегерек" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 0e2f9c808c..8506b299a3 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -28,9 +28,9 @@ "विजेट सुरक्षित मोडमध्ये अक्षम झाले" "शॉर्टकट उपलब्ध नाही" "होम स्क्रीन" - "सानुकूल क्रिया" + "कस्टम क्रिया" "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." - "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा सानुकूल क्रिया वापरा." + "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा कस्टम क्रिया वापरा." "%1$d × %2$d" "%1$d रूंद बाय %2$d उंच" "स्वतः ठेवण्यासाठी स्पर्श करा आणि धरून ठेवा" @@ -73,7 +73,7 @@ "नवीन मुख्य स्क्रीन पृष्ठ" "फोल्डर उघडले, %1$d बाय %2$d" "फोल्डर बंद करण्यासाठी टॅप करा" - "पुनर्नामित करणे जतन करण्यासाठी टॅप करा" + "पुनर्नामित करणे सेव्ह करण्यासाठी टॅप करा" "फोल्डर बंद" "फोल्डरचे नाव बदलून %1$s असे ठेवले" "फोल्डर: %1$s" @@ -102,7 +102,7 @@ "काढा" "शोधा" "हा अॅप इंस्टॉल केलेला नाही" - "या चिन्हासाठी अॅप इंस्टॉल केलेला नाही. आपण ते काढू शकता किंवा अॅपचा शोध घेऊ शकता आणि त्यास व्यक्तिचलितपणे इंस्टॉल करू शकता." + "या चिन्हासाठी अॅप इंस्टॉल केलेला नाही. तुम्ही ते काढू शकता किंवा अॅपचा शोध घेऊ शकता आणि त्यास व्यक्तिचलितपणे इंस्टॉल करू शकता." "%1$s डाउनलोड होत आहे , %2$s पूर्ण झाले" "%1$s इंस्टॉल करण्याची प्रतिक्षा करत आहे" "%1$s विजेट" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 458b6dd993..ed24914afd 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -54,9 +54,9 @@ "Installeren" "Snelle links instellen" "Een app toestaan snelkoppelingen toe te voegen zonder tussenkomst van de gebruiker." - "instellingen en snelkoppelingen op de homepage lezen" + "instellingen en snelkoppelingen op startscherm lezen" "De app toestaan de instellingen en snelkoppelingen op de homepage te lezen." - "instellingen en snelkoppelingen op de homepage schrijven" + "instellingen en snelkoppelingen op startscherm zetten" "De app toestaan de instellingen en snelkoppelingen op de homepage te wijzigen." "%1$s mag niet bellen" "Probleem bij het laden van widget" @@ -79,7 +79,7 @@ "Map: %1$s" "Widgets" "Achtergrond" - "Instellingen voor homepage" + "Instellingen voor startscherm" "Uitgeschakeld door je beheerder" "Meldingsstipjes" "Aan" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 0d3224d39d..c17b50cea4 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -50,7 +50,7 @@ "Ecrã principal" "Remover" "Desinstalar" - "Inf. da aplicação" + "Info. da aplicação" "Instalar" "instalar atalhos" "Permite a uma aplicação adicionar atalhos sem a intervenção do utilizador." diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index d04ca5c04a..9aee3c967b 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -84,14 +84,14 @@ "Настройки главного экрана" "Функция отключена администратором" "Значки уведомлений" - "ВКЛ" - "ВЫКЛ" + "Вкл." + "Выкл." "Нет доступа к уведомлениям" "Чтобы показывать значки уведомлений, включите уведомления в приложении \"%1$s\"" "Изменить настройки" "Показывать значки уведомлений" "Добавлять значки" - "Добавлять значки установленных приложений на главный экран." + "Добавлять значки установленных приложений на главный экран" "Изменить форму значков" "на главном экране" "Использовать системные настройки по умолчанию" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 4d90dee09f..77246fba71 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -81,7 +81,7 @@ "Priečinok: %1$s" "Miniaplikácie" "Tapety" - "Nastavenia služby Home" + "Nastavenia plochy" "Zakázané vaším správcom" "Bodky upozornení" "Zapnuté" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 717c80f8ba..d507be46cd 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -50,7 +50,7 @@ "முகப்பு" "அகற்று" "நிறுவல் நீக்கு" - "ஆப்ஸ் தகவல்" + "பயன்பாட்டுத் தகவல்" "நிறுவு" "குறுக்குவழிகளை நிறுவுதல்" "பயனரின் அனுமதி இல்லாமல் குறுக்குவழிகளைச் சேர்க்கப் பயன்பாட்டை அனுமதிக்கிறது." diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index e9f36a842a..72dbd9eb89 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -79,7 +79,7 @@ "Jild: %1$s" "Vidjetlar" "Fon rasmlari" - "Home sozlamalari" + "Bosh ekran sozlamalari" "Administrator tomonidan o‘chirilgan" "Bildirishnoma belgilari" "Yoniq" @@ -88,7 +88,7 @@ "Bildirishnoma belgilarini ko‘rsatish uchun %1$s ilovasida bildirishnomalarni yoqing" "Sozlamalarni o‘zgartirish" "Bildirishnoma belgilarini ko‘rsatish" - "Bosh ekranga ikonka qo‘shish" + "Bosh ekranga ikonka chiqarish" "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" "Ikonka shaklini o‘zgartirish" "Bosh ekranda" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 65a5eccf82..c11c2e6045 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -79,7 +79,7 @@ "Thư mục: %1$s" "Tiện ích con" "Hình nền" - "Cài đặt trang chủ" + "Cài đặt màn hình chính" "Bị tắt bởi quản trị viên của bạn" "Dấu chấm thông báo" "Đang bật" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 4828006cbb..a96e411972 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -79,7 +79,7 @@ "資料夾:%1$s" "小工具" "桌布" - "Home 設定" + "主螢幕設定" "已由您的管理員停用" "通知圓點" "開啟" -- GitLab From 310093d0505570f0239e10bc10aa43686b668d70 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 30 Apr 2018 17:26:40 +0000 Subject: [PATCH 0007/1301] Revert "a11y: disabling accessibility scrolling of the home screen" This reverts commit 52b2b43c5676c43f2ef2cd928281f7d109d2cb76. Reason for revert: Per an email thread, this CL is considered a hack. Change-Id: Id97fc9a398184ba18c2188d858218bc2d9ddc16e --- src/com/android/launcher3/Workspace.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 7ecafdbf72..1e2e3b10bf 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -53,7 +53,6 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Toast; import com.android.launcher3.Launcher.LauncherOverlay; @@ -3478,10 +3477,4 @@ public class Workspace extends PagedView onEndStateTransition(); } } - - @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - info.setScrollable(false); - } } -- GitLab From 1f6eb12763902afd1190378b451bc80af5e4b72f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 30 Apr 2018 10:56:12 -0700 Subject: [PATCH 0008/1301] Import translations. DO NOT MERGE Change-Id: I00c17b6f7d32117a18c1450882068ffa3b61d3c2 Auto-generated-cl: translation import --- go/res/values-as/strings.xml | 26 ++++ go/res/values-or/strings.xml | 26 ++++ quickstep/res/values-af/strings.xml | 3 +- quickstep/res/values-am/strings.xml | 2 +- quickstep/res/values-ar/strings.xml | 3 +- quickstep/res/values-as/strings.xml | 28 ++++ quickstep/res/values-az/strings.xml | 2 +- quickstep/res/values-b+sr+Latn/strings.xml | 2 +- quickstep/res/values-be/strings.xml | 2 +- quickstep/res/values-bg/strings.xml | 3 +- quickstep/res/values-bn/strings.xml | 2 +- quickstep/res/values-bs/strings.xml | 3 +- quickstep/res/values-ca/strings.xml | 3 +- quickstep/res/values-cs/strings.xml | 2 +- quickstep/res/values-da/strings.xml | 2 +- quickstep/res/values-de/strings.xml | 2 +- quickstep/res/values-el/strings.xml | 3 +- quickstep/res/values-en-rAU/strings.xml | 2 +- quickstep/res/values-en-rGB/strings.xml | 2 +- quickstep/res/values-en-rIN/strings.xml | 2 +- quickstep/res/values-es-rUS/strings.xml | 3 +- quickstep/res/values-es/strings.xml | 3 +- quickstep/res/values-et/strings.xml | 3 +- quickstep/res/values-eu/strings.xml | 3 +- quickstep/res/values-fa/strings.xml | 2 +- quickstep/res/values-fi/strings.xml | 2 +- quickstep/res/values-fr-rCA/strings.xml | 2 +- quickstep/res/values-fr/strings.xml | 3 +- quickstep/res/values-gl/strings.xml | 3 +- quickstep/res/values-gu/strings.xml | 3 +- quickstep/res/values-hi/strings.xml | 3 +- quickstep/res/values-hr/strings.xml | 2 +- quickstep/res/values-hu/strings.xml | 3 +- quickstep/res/values-hy/strings.xml | 2 +- quickstep/res/values-in/strings.xml | 2 +- quickstep/res/values-is/strings.xml | 2 +- quickstep/res/values-it/strings.xml | 2 +- quickstep/res/values-iw/strings.xml | 2 +- quickstep/res/values-ja/strings.xml | 2 +- quickstep/res/values-ka/strings.xml | 2 +- quickstep/res/values-kk/strings.xml | 2 +- quickstep/res/values-km/strings.xml | 2 +- quickstep/res/values-kn/strings.xml | 2 +- quickstep/res/values-ko/strings.xml | 2 +- quickstep/res/values-ky/strings.xml | 3 +- quickstep/res/values-lo/strings.xml | 2 +- quickstep/res/values-lt/strings.xml | 2 +- quickstep/res/values-lv/strings.xml | 2 +- quickstep/res/values-mk/strings.xml | 2 +- quickstep/res/values-ml/strings.xml | 2 +- quickstep/res/values-mn/strings.xml | 2 +- quickstep/res/values-mr/strings.xml | 3 +- quickstep/res/values-ms/strings.xml | 2 +- quickstep/res/values-my/strings.xml | 2 +- quickstep/res/values-nb/strings.xml | 2 +- quickstep/res/values-ne/strings.xml | 2 +- quickstep/res/values-nl/strings.xml | 3 +- quickstep/res/values-or/strings.xml | 28 ++++ quickstep/res/values-pa/strings.xml | 2 +- quickstep/res/values-pl/strings.xml | 2 +- quickstep/res/values-pt-rPT/strings.xml | 3 +- quickstep/res/values-pt/strings.xml | 2 +- quickstep/res/values-ro/strings.xml | 2 +- quickstep/res/values-ru/strings.xml | 3 +- quickstep/res/values-si/strings.xml | 2 +- quickstep/res/values-sk/strings.xml | 3 +- quickstep/res/values-sl/strings.xml | 2 +- quickstep/res/values-sq/strings.xml | 2 +- quickstep/res/values-sr/strings.xml | 2 +- quickstep/res/values-sv/strings.xml | 2 +- quickstep/res/values-sw/strings.xml | 2 +- quickstep/res/values-ta/strings.xml | 3 +- quickstep/res/values-te/strings.xml | 2 +- quickstep/res/values-th/strings.xml | 2 +- quickstep/res/values-tl/strings.xml | 2 +- quickstep/res/values-tr/strings.xml | 2 +- quickstep/res/values-uk/strings.xml | 2 +- quickstep/res/values-ur/strings.xml | 2 +- quickstep/res/values-uz/strings.xml | 3 +- quickstep/res/values-vi/strings.xml | 3 +- quickstep/res/values-zh-rCN/strings.xml | 3 +- quickstep/res/values-zh-rHK/strings.xml | 3 +- quickstep/res/values-zh-rTW/strings.xml | 2 +- quickstep/res/values-zu/strings.xml | 2 +- res/values-af/strings.xml | 2 + res/values-am/strings.xml | 2 + res/values-ar/strings.xml | 12 +- res/values-as/strings.xml | 146 +++++++++++++++++++++ res/values-az/strings.xml | 2 + res/values-b+sr+Latn/strings.xml | 2 + res/values-be/strings.xml | 2 + res/values-bg/strings.xml | 2 + res/values-bn/strings.xml | 6 +- res/values-bs/strings.xml | 4 +- res/values-ca/strings.xml | 2 + res/values-cs/strings.xml | 2 + res/values-da/strings.xml | 2 + res/values-de/strings.xml | 2 + res/values-el/strings.xml | 2 + res/values-en-rAU/strings.xml | 2 + res/values-en-rGB/strings.xml | 2 + res/values-en-rIN/strings.xml | 2 + res/values-es-rUS/strings.xml | 2 + res/values-es/strings.xml | 2 + res/values-et/strings.xml | 2 + res/values-eu/strings.xml | 2 + res/values-fa/strings.xml | 2 + res/values-fi/strings.xml | 2 + res/values-fr-rCA/strings.xml | 2 + res/values-fr/strings.xml | 2 + res/values-gl/strings.xml | 2 + res/values-gu/strings.xml | 2 + res/values-hi/strings.xml | 2 + res/values-hr/strings.xml | 4 +- res/values-hu/strings.xml | 2 + res/values-hy/strings.xml | 2 + res/values-in/strings.xml | 8 +- res/values-is/strings.xml | 2 + res/values-it/strings.xml | 2 + res/values-iw/strings.xml | 2 + res/values-ja/strings.xml | 2 + res/values-ka/strings.xml | 2 + res/values-kk/strings.xml | 2 + res/values-km/strings.xml | 2 + res/values-kn/strings.xml | 2 + res/values-ko/strings.xml | 2 + res/values-ky/strings.xml | 2 + res/values-lo/strings.xml | 2 + res/values-lt/strings.xml | 2 + res/values-lv/strings.xml | 2 + res/values-mk/strings.xml | 2 + res/values-ml/strings.xml | 2 + res/values-mn/strings.xml | 2 + res/values-mr/strings.xml | 2 + res/values-ms/strings.xml | 2 + res/values-my/strings.xml | 2 + res/values-nb/strings.xml | 2 + res/values-ne/strings.xml | 2 + res/values-nl/strings.xml | 4 +- res/values-or/strings.xml | 146 +++++++++++++++++++++ res/values-pa/strings.xml | 2 + res/values-pl/strings.xml | 2 + res/values-pt-rPT/strings.xml | 2 + res/values-pt/strings.xml | 4 +- res/values-ro/strings.xml | 2 + res/values-ru/strings.xml | 2 + res/values-si/strings.xml | 2 + res/values-sk/strings.xml | 4 +- res/values-sl/strings.xml | 2 + res/values-sq/strings.xml | 4 +- res/values-sr/strings.xml | 2 + res/values-sv/strings.xml | 4 +- res/values-sw/strings.xml | 4 +- res/values-ta/strings.xml | 2 + res/values-te/strings.xml | 2 + res/values-th/strings.xml | 2 + res/values-tl/strings.xml | 2 + res/values-tr/strings.xml | 2 + res/values-uk/strings.xml | 2 + res/values-ur/strings.xml | 2 + res/values-uz/strings.xml | 2 + res/values-vi/strings.xml | 2 + res/values-zh-rCN/strings.xml | 2 + res/values-zh-rHK/strings.xml | 2 + res/values-zh-rTW/strings.xml | 2 + res/values-zu/strings.xml | 2 + 166 files changed, 658 insertions(+), 124 deletions(-) create mode 100644 go/res/values-as/strings.xml create mode 100644 go/res/values-or/strings.xml create mode 100644 quickstep/res/values-as/strings.xml create mode 100644 quickstep/res/values-or/strings.xml create mode 100644 res/values-as/strings.xml create mode 100644 res/values-or/strings.xml diff --git a/go/res/values-as/strings.xml b/go/res/values-as/strings.xml new file mode 100644 index 0000000000..6b5807f97b --- /dev/null +++ b/go/res/values-as/strings.xml @@ -0,0 +1,26 @@ + + + + + "কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ স্পৰ্শ কৰি ৰাখক।" + "কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ দুবাৰ টিপি ৰাখক বা নিজৰ উপযোগিতা অনুসৰি বনোৱা কাৰ্যসমূহ ব্যৱহাৰ কৰক।" + "শ্বৰ্টকাটসমূহ" + "%1$s শ্বৰ্টকাটসমূহ" + diff --git a/go/res/values-or/strings.xml b/go/res/values-or/strings.xml new file mode 100644 index 0000000000..3ec8a72038 --- /dev/null +++ b/go/res/values-or/strings.xml @@ -0,0 +1,26 @@ + + + + + "ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ଦାବି ଧରନ୍ତୁ।" + "ଡବଲ୍‌-ଟାପ୍‌ କରନ୍ତୁ ଏବଂ ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ଧରି ରଖନ୍ତୁ କିମ୍ୱା କଷ୍ଟମ୍ ପ୍ରକ୍ରିୟା ବ୍ୟବହାର କରନ୍ତୁ।" + "ଶର୍ଟକଟ୍‍" + "%1$sର ଶର୍ଟକଟ୍" + diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index 4e1d3271ab..f9ffe4bba4 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -24,6 +24,5 @@ "Oorsig" "Geen onlangse items nie" "Maak toe" - - + "Vee alles uit" diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml index 8d4444623a..428b46d507 100644 --- a/quickstep/res/values-am/strings.xml +++ b/quickstep/res/values-am/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "የተከፈለ ማያ ገጽ" "ሰካ" - "መተግበሪያዎችን ለመቀያየር ከግርጌ ወደ ላይ በጣት ጠረግ ያድርጉ" "ማጠቃለያ" "ምንም የቅርብ ጊዜ ንጥሎች የሉም" "ዝጋ" + "ሁሉንም አጽዳ" diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index ec5f855534..a6011e74df 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -24,6 +24,5 @@ "نظرة عامة" "ليست هناك عناصر تم استخدامها مؤخرًا" "إغلاق" - - + "محو الكل" diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml new file mode 100644 index 0000000000..dad6102930 --- /dev/null +++ b/quickstep/res/values-as/strings.xml @@ -0,0 +1,28 @@ + + + + + "বিভাজিত স্ক্ৰীণ" + "পিন" + "অৱলোকন" + "কোনো শেহতীয়া বস্তু নাই" + "বন্ধ কৰক" + "সকলো মচক" + diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml index 19d0f6b75c..0546f46508 100644 --- a/quickstep/res/values-az/strings.xml +++ b/quickstep/res/values-az/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Bölünmüş ekran" "Sancın" - "Tətbiqləri dəyişmək üçün aşağıdan yuxarı doğru sürüşdürün" "İcmal" "Son elementlər yoxdur" "Bağlayın" + "Hamısını silin" diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml index 9a5aed02ce..9a6edd1960 100644 --- a/quickstep/res/values-b+sr+Latn/strings.xml +++ b/quickstep/res/values-b+sr+Latn/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Podeljeni ekran" "Zakači" - "Prevucite nagore da biste prešli na drugu aplikaciju" "Pregled" "Nema nedavnih stavki" "Zatvori" + "Obriši sve" diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml index fab5d03d0f..1e60dd36fd 100644 --- a/quickstep/res/values-be/strings.xml +++ b/quickstep/res/values-be/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Падзяліць экран" "Замацаваць" - "Для пераключэння праграм правядзіце па экране пальцам знізу ўверх" "Агляд" "Няма новых элементаў" "Закрыць" + "Ачысціць усё" diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml index db4b96cfc7..cfbc08dbe0 100644 --- a/quickstep/res/values-bg/strings.xml +++ b/quickstep/res/values-bg/strings.xml @@ -24,6 +24,5 @@ "Общ преглед" "Няма скорошни елементи" "Затваряне" - - + "Изчистване на всички" diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml index 4856e90ddb..a0605d8317 100644 --- a/quickstep/res/values-bn/strings.xml +++ b/quickstep/res/values-bn/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "স্ক্রিন স্প্লিট করুন" "পিন করুন" - "অ্যাপগুলির মধ্যে সুইচ করতে উপর থেকে নিচের দিকে সোয়াইপ করুন" "এক নজরে" "কোনো সাম্প্রতিক আইটেম নেই" "বন্ধ করুন" + "সবকিছু খালি করুন" diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index 95285d2584..9ffa84806c 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -24,6 +24,5 @@ "Pregled" "Nema nedavnih stavki" "Zatvaranje" - - + "Obriši sve" diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml index 7c57b3c769..b5f2bf176b 100644 --- a/quickstep/res/values-ca/strings.xml +++ b/quickstep/res/values-ca/strings.xml @@ -24,6 +24,5 @@ "Aplicacions recents" "No hi ha cap element recent" "Tanca" - - + "Esborra-ho tot" diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml index e8d661c577..25c8f81c1e 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Rozdělená obrazovka" "PIN" - "Aplikace můžete přepínat přejetím zdola nahoru" "Přehled" "Žádné nedávné položky" "Zavřít" + "Vymazat vše" diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index 72db09d75a..de5529fd19 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Delt skærm" "Fastgør" - "Stryg opad fra bunden for at skifte apps" "Oversigt" "Ingen nye elementer" "Luk" + "Ryd alt" diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index ddc83c620e..63483d95a2 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Bildschirm teilen" "Fixieren" - "Zum Wechseln zwischen Apps vom unteren Bildschirmrand nach oben wischen" "Übersicht" "Keine kürzlich verwendeten Elemente" "Schließen" + "Alle Apps schließen" diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index eeffe8496a..e5dd604cd8 100644 --- a/quickstep/res/values-el/strings.xml +++ b/quickstep/res/values-el/strings.xml @@ -24,6 +24,5 @@ "Επισκόπηση" "Δεν υπάρχουν πρόσφατα στοιχεία" "Κλείσιμο" - - + "Διαγραφή όλων" diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml index a8cbc3f02a..61d031b5d0 100644 --- a/quickstep/res/values-en-rAU/strings.xml +++ b/quickstep/res/values-en-rAU/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Split screen" "Pin" - "Swipe up from the bottom to switch apps" "Overview" "No recent items" "Close" + "Clear all" diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml index a8cbc3f02a..61d031b5d0 100644 --- a/quickstep/res/values-en-rGB/strings.xml +++ b/quickstep/res/values-en-rGB/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Split screen" "Pin" - "Swipe up from the bottom to switch apps" "Overview" "No recent items" "Close" + "Clear all" diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml index a8cbc3f02a..61d031b5d0 100644 --- a/quickstep/res/values-en-rIN/strings.xml +++ b/quickstep/res/values-en-rIN/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Split screen" "Pin" - "Swipe up from the bottom to switch apps" "Overview" "No recent items" "Close" + "Clear all" diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml index be3c74b784..642fe4c7a4 100644 --- a/quickstep/res/values-es-rUS/strings.xml +++ b/quickstep/res/values-es-rUS/strings.xml @@ -24,6 +24,5 @@ "Recientes" "No hay elementos recientes" "Cerrar" - - + "Borrar todo" diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml index 859cb2c987..4f74a389ff 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -24,6 +24,5 @@ "Aplicaciones recientes" "No hay elementos recientes" "Cerrar" - - + "Borrar todo" diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml index b9cb5872d5..efa68f9c43 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -24,6 +24,5 @@ "Ülevaade" "Hiljutisi üksusi pole" "Sule" - - + "Sule kõik" diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index 5c0dd8f7d2..d22242efab 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -24,6 +24,5 @@ "Ikuspegi orokorra" "Ez dago azkenaldi honetako ezer" "Itxi" - - + "Garbitu guztiak" diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml index b58cdb9da8..fa610a26ea 100644 --- a/quickstep/res/values-fa/strings.xml +++ b/quickstep/res/values-fa/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "تقسیم صفحه" "پین" - "برای تغییر برنامه‌ها،‌ از پایین تند به بالا بکشید" "نمای کلی" "بدون موارد اخیر" "بستن" + "پاک کردن همه" diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml index 9c7375df79..2c4aa04a8e 100644 --- a/quickstep/res/values-fi/strings.xml +++ b/quickstep/res/values-fi/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Jaettu näyttö" "Kiinnitä" - "Vaihda sovellusta pyyhkäisemällä alareunasta ylös." "Viimeisimmät" "Ei viimeaikaisia kohteita" "Sulje" + "Poista kaikki" diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml index cd738227f8..892c43fdf0 100644 --- a/quickstep/res/values-fr-rCA/strings.xml +++ b/quickstep/res/values-fr-rCA/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Écran divisé" "Épingler" - "Balayez l\'écran du bas vers le haut pour changer d\'application" "Aperçu" "Aucun élément récent" "Fermer" + "Tout effacer" diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index ff216fab1a..49304491ed 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -24,6 +24,5 @@ "Aperçu" "Aucun élément récent" "Fermer" - - + "Tout effacer" diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index e2883cbeb0..8efc773f49 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -24,6 +24,5 @@ "Visión xeral" "Non hai elementos recentes" "Pecha a aplicación" - - + "Borrar todo" diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index 416b361996..cdae86feba 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -24,6 +24,5 @@ "ઝલક" "તાજેતરની કોઈ આઇટમ નથી" "બંધ કરો" - - + "બધું સાફ કરો" diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml index 1c1870069a..06d0ab167d 100644 --- a/quickstep/res/values-hi/strings.xml +++ b/quickstep/res/values-hi/strings.xml @@ -24,6 +24,5 @@ "खास जानकारी" "हाल ही में इस्तेमाल किया गया कोई ऐप्लिकेशन नहीं है" "बंद करें" - - + "सभी ऐप्लिकेशन बंद करें" diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml index a1deed3c09..aacc6ddb4f 100644 --- a/quickstep/res/values-hr/strings.xml +++ b/quickstep/res/values-hr/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Podijeljeni zaslon" "Prikvači" - "Prijeđite prstom od dna prema gore da biste promijenili aplikaciju" "Pregled" "Nema nedavnih stavki" "Zatvori" + "Izbriši sve" diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml index 23786f28e3..d03374111f 100644 --- a/quickstep/res/values-hu/strings.xml +++ b/quickstep/res/values-hu/strings.xml @@ -24,6 +24,5 @@ "Áttekintés" "Nincsenek mostanában használt elemek" "Bezárás" - - + "Összes törlése" diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml index 94178da7af..4afae7de7d 100644 --- a/quickstep/res/values-hy/strings.xml +++ b/quickstep/res/values-hy/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Տրոհել էկրանը" "Ամրացնել" - "Սահեցրեք ներքևից վերև՝ մյուս հավելվածին անցնելու համար" "Ընդհանուր տեղեկություններ" "Վերջին տարրեր չկան" "Փակել" + "Փակել բոլորը" diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml index a1b86ec69a..7adc31ecc9 100644 --- a/quickstep/res/values-in/strings.xml +++ b/quickstep/res/values-in/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Layar terpisah" "Pasang pin" - "Geser dari bawah ke atas untuk beralih aplikasi" "Ringkasan" "Tidak ada item yang baru dibuka" "Tutup" + "Hapus semua" diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml index 3f894113a4..88a92ed96e 100644 --- a/quickstep/res/values-is/strings.xml +++ b/quickstep/res/values-is/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Skipta skjá" "Festa" - "Strjúktu upp til að skipta um forrit" "Yfirlit" "Engin nýleg atriði" "Loka" + "Hreinsa allt" diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml index 8af4ea8a90..e95faf84b2 100644 --- a/quickstep/res/values-it/strings.xml +++ b/quickstep/res/values-it/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Schermo diviso" "Blocca" - "Scorri verso l\'alto dalla parte inferiore per cambiare app" "Panoramica" "Nessun elemento recente" "Chiudi" + "Cancella tutto" diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index 662c467191..ee4f040b2e 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "מסך מפוצל" "הצמדה" - "יש להחליק כלפי מעלה מהחלק התחתון כדי לעבור בין אפליקציות" "מסכים אחרונים" "אין פריטים אחרונים" "סגירה" + "ניקוי הכול" diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml index 0dabd3f694..f32e2e62fb 100644 --- a/quickstep/res/values-ja/strings.xml +++ b/quickstep/res/values-ja/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "分割画面" "固定" - "アプリを切り替えるには、下から上にスワイプします" "概要" "最近のアイテムはありません" "閉じる" + "すべてクリア" diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml index 729175a85b..6de8ed9222 100644 --- a/quickstep/res/values-ka/strings.xml +++ b/quickstep/res/values-ka/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ეკრანის გაყოფა" "ჩამაგრება" - "აპების გადასართავად გადაფურცლეთ ქვედა კიდედან ზემოთ" "მიმოხილვა" "ბოლოს გამოყენებული ერთეულები არ არის" "დახურვა" + "ყველას გასუფთავება" diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml index 9894ed33c9..ddd4a77196 100644 --- a/quickstep/res/values-kk/strings.xml +++ b/quickstep/res/values-kk/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Экранды бөлу" "Бекіту" - "Қолданбалар арасында ауысу үшін төменнен жоғары қарай саусақпен сырғытыңыз" "Шолу" "Соңғы элементтер жоқ" "Жабу" + "Барлығын өшіру" diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml index 71cdbe006e..65c1dccee3 100644 --- a/quickstep/res/values-km/strings.xml +++ b/quickstep/res/values-km/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "មុខងារ​បំបែកអេក្រង់" "ដៅ" - "អូស​ពី​ក្រោម​ឡើង​លើ ដើម្បី​ប្ដូរ​កម្មវិធី" "ទិដ្ឋភាពរួម" "មិនមានធាតុថ្មីៗទេ" "បិទ" + "សម្អាត​ទាំងអស់" diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml index ab7506928c..55ccbb0260 100644 --- a/quickstep/res/values-kn/strings.xml +++ b/quickstep/res/values-kn/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ಪರದೆಯನ್ನು ಬೇರ್ಪಡಿಸಿ" "ಪಿನ್ ಮಾಡಿ" - "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಬದಲಿಸಲು ಕೆಳಗಿನಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ" "ಅವಲೋಕನ" "ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ" "ಮುಚ್ಚಿ" + "ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ" diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml index 181314e98b..54b86a8d5e 100644 --- a/quickstep/res/values-ko/strings.xml +++ b/quickstep/res/values-ko/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "화면 분할" "고정" - "아래에서 위로 스와이프하여 앱을 전환합니다." "최근 사용" "최근 항목이 없습니다." "닫기" + "모두 삭제" diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml index 7924b11e82..b788693824 100644 --- a/quickstep/res/values-ky/strings.xml +++ b/quickstep/res/values-ky/strings.xml @@ -24,6 +24,5 @@ "Сереп салуу" "Акыркы колдонмолор жок" "Жабуу" - - + "Баарын тазалоо" diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml index 847dceaf4e..a83743a7e9 100644 --- a/quickstep/res/values-lo/strings.xml +++ b/quickstep/res/values-lo/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ແບ່ງໜ້າຈໍ" "ປັກໝຸດ" - "ປັດຂຶ້ນຈາກລຸ່ມສຸດເພື່ອສະຫຼັບແອັບ" "ພາບຮວມ" "ບໍ່ມີລາຍການຫຼ້າສຸດ" "ປິດ" + "ລຶບລ້າງທັງໝົດ" diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml index c0eeb6fee9..689cf94c5c 100644 --- a/quickstep/res/values-lt/strings.xml +++ b/quickstep/res/values-lt/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Skaidyti ekraną" "Prisegti" - "Perbraukite aukštyn iš apačios, kad perjungtumėte programas" "Apžvalga" "Nėra jokių naujausių elementų" "Uždaryti" + "Išvalyti viską" diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml index d053798510..0aac2222d1 100644 --- a/quickstep/res/values-lv/strings.xml +++ b/quickstep/res/values-lv/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Sadalīt ekrānu" "Piespraust" - "Lai pārslēgtu lietotnes, velciet augšup no apakšdaļas." "Pārskats" "Nav nesenu vienumu." "Aizvērt" + "Notīrīt visu" diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml index 74dc5aa501..e428b4e1f8 100644 --- a/quickstep/res/values-mk/strings.xml +++ b/quickstep/res/values-mk/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Поделен екран" "Прикачување" - "Повлечете нагоре од дното за да ги смените апликациите" "Преглед" "Нема неодамнешни ставки" "Затвори" + "Исчисти ги сите" diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml index b8a4d6ec44..4cca447e7d 100644 --- a/quickstep/res/values-ml/strings.xml +++ b/quickstep/res/values-ml/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "സ്‌ക്രീൻ വിഭജിക്കുക" "പിൻ ചെയ്യുക" - "ആപ്പുകൾ മാറാൻ താഴെ നിന്ന് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക" "അവലോകനം" "സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല" "അവസാനിപ്പിക്കുക" + "എല്ലാം മായ്‌ക്കുക" diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml index 114c050271..f40f69e315 100644 --- a/quickstep/res/values-mn/strings.xml +++ b/quickstep/res/values-mn/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Дэлгэцийг хуваах" "Тогтоох" - "Аппыг сэлгэхийн тулд доороос дээш шударна уу" "Тойм" "Сүүлийн үеийн зүйл алга" "Хаах" + "Бүгдийг устгах" diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index 4d941378bb..938363db0f 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -24,6 +24,5 @@ "अवलोकन" "कोणतेही अलीकडील आयटम नाहीत" "बंद" - - + "सर्व साफ करा" diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml index 0e4fa3f7b9..236fab25c8 100644 --- a/quickstep/res/values-ms/strings.xml +++ b/quickstep/res/values-ms/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Skrin pisah" "Semat" - "Leret ke atas dari bawah untuk menukar apl" "Ikhtisar" "Tiada item terbaharu" "Tutup" + "Kosongkan semua" diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml index e10cd4f545..e44b904beb 100644 --- a/quickstep/res/values-my/strings.xml +++ b/quickstep/res/values-my/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "မျက်နှာပြင် ခွဲ၍ပြသခြင်း" "ပင်ထိုးခြင်း" - "အက်ပ်များပြောင်းရန် အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ" "အနှစ်ချုပ်" "မကြာမီကဖွင့်ထားသည်များ မရှိပါ" "ပိတ်ရန်" + "အားလုံးကို ရှင်းရန်" diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml index 64c47c416c..423b7c1448 100644 --- a/quickstep/res/values-nb/strings.xml +++ b/quickstep/res/values-nb/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Delt skjerm" "Fest" - "Sveip opp fra bunnen for å bytte app" "Oversikt" "Ingen nylige elementer" "Lukk" + "Fjern alt" diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml index 99f90bbbd4..bf52604fd2 100644 --- a/quickstep/res/values-ne/strings.xml +++ b/quickstep/res/values-ne/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "स्क्रिन विभाजन गर्नुहोस्" "पिन गर्नुहोस्" - "अनुप्रयोगहरू बदल्न तलबाट माथितिर स्वाइप गर्नुहोस्" "परिदृश्य" "हालसालैको कुनै पनि वस्तु छैन" "बन्द गर्नुहोस्" + "सबै खाली गर्नुहोस्" diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml index 67932b20b5..96319a40d3 100644 --- a/quickstep/res/values-nl/strings.xml +++ b/quickstep/res/values-nl/strings.xml @@ -24,6 +24,5 @@ "Overzicht" "Geen recente items" "Sluiten" - - + "Alles wissen" diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml new file mode 100644 index 0000000000..08e38c09e6 --- /dev/null +++ b/quickstep/res/values-or/strings.xml @@ -0,0 +1,28 @@ + + + + + "ସ୍କ୍ରୀନ୍‌କୁ ଭାଗ କରନ୍ତୁ" + "ପିନ୍‍" + "ସଂକ୍ଷିପ୍ତ ବିବରଣ" + "କୌଣସି ସାମ୍ପ୍ରତିକ ଆଇଟମ୍ ନାହିଁ" + "ବନ୍ଦ କରନ୍ତୁ" + "ସବୁ ଖାଲି କରନ୍ତୁ" + diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml index 6e0c5a2bb3..bc044c808f 100644 --- a/quickstep/res/values-pa/strings.xml +++ b/quickstep/res/values-pa/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ਸਪਲਿਟ ਸਕ੍ਰੀਨ" "ਪਿੰਨ ਕਰੋ" - "ਐਪਾਂ ਵਿੱਚ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ" "ਰੂਪ-ਰੇਖਾ" "ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ" "ਬੰਦ ਕਰੋ" + "ਸਭ ਕਲੀਅਰ ਕਰੋ" diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml index 5cfdc68eb6..4f865d7ad2 100644 --- a/quickstep/res/values-pl/strings.xml +++ b/quickstep/res/values-pl/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Podziel ekran" "Przypnij" - "Przesuń palcem z dołu ekranu, by przełączać aplikacje" "Przegląd" "Brak ostatnich elementów" "Zamknij" + "Wyczyść wszystko" diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml index e86c147c15..e0a9372336 100644 --- a/quickstep/res/values-pt-rPT/strings.xml +++ b/quickstep/res/values-pt-rPT/strings.xml @@ -24,6 +24,5 @@ "Vista geral" "Nenhum item recente" "Fechar" - - + "Limpar tudo" diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml index 6a5bea904e..d4be22122d 100644 --- a/quickstep/res/values-pt/strings.xml +++ b/quickstep/res/values-pt/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Tela dividida" "Fixar" - "Deslize de baixo para cima para alternar entre apps" "Visão geral" "Nenhum item recente" "Fechar" + "Limpar tudo" diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml index 2c05f908e1..a8889d4b4a 100644 --- a/quickstep/res/values-ro/strings.xml +++ b/quickstep/res/values-ro/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Ecran divizat" "Fixați" - "Glisați de jos în sus pentru a schimba aplicațiile" "Recente" "Niciun element recent" "Închideți" + "Ștergeți tot" diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml index f8a38edf03..2d7fc787db 100644 --- a/quickstep/res/values-ru/strings.xml +++ b/quickstep/res/values-ru/strings.xml @@ -24,6 +24,5 @@ "Обзор" "Здесь пока ничего нет." "Закрыть" - - + "Очистить все" diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml index d81344fe48..61bb8ba81c 100644 --- a/quickstep/res/values-si/strings.xml +++ b/quickstep/res/values-si/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "බෙදුම් තිරය" "අමුණන්න" - "යෙදුම් මාරු කිරීම සඳහා පහළ සිට ස්වයිප් කරන්න" "දළ විශ්ලේෂණය" "මෑත අයිතම නැත" "වසන්න" + "සියල්ල හිස් කරන්න" diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index 127d73ae8e..fc173b718a 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -24,6 +24,5 @@ "Prehľad" "Žiadne nedávne položky" "Zavrieť" - - + "Vymazať všetko" diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml index 9e4b970b3c..b03978c77c 100644 --- a/quickstep/res/values-sl/strings.xml +++ b/quickstep/res/values-sl/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Razdeljen zaslon" "Pripni" - "Če želite preklopiti med aplikacijami, z dna zaslona s prstom povlecite navzgor" "Pregled" "Ni nedavnih elementov" "Zapri" + "Počisti vse" diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml index 62dbf0175a..a0c3d781d0 100644 --- a/quickstep/res/values-sq/strings.xml +++ b/quickstep/res/values-sq/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Ekrani i ndarë" "Gozhdo" - "Rrëshqit larg nga poshtë për të ndryshuar aplikacionet" "Përmbledhja" "Nuk ka asnjë artikull të fundit" "Mbyll" + "Pastroji të gjitha" diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml index ae22cfc2b2..c51ca1c50d 100644 --- a/quickstep/res/values-sr/strings.xml +++ b/quickstep/res/values-sr/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Подељени екран" "Закачи" - "Превуците нагоре да бисте прешли на другу апликацију" "Преглед" "Нема недавних ставки" "Затвори" + "Обриши све" diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml index 1434f27d89..29b4e453ab 100644 --- a/quickstep/res/values-sv/strings.xml +++ b/quickstep/res/values-sv/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Delad skärm" "Fäst" - "Växla mellan appar genom att svepa uppåt från nederkanten" "Översikt" "Listan med de senaste åtgärderna är tom" "Stäng" + "Rensa alla" diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml index 7e311b958d..e41c2bb327 100644 --- a/quickstep/res/values-sw/strings.xml +++ b/quickstep/res/values-sw/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Gawa skrini" "Bandika" - "Telezesha kidole juu kuanzia chini ili ubadilishe programu" "Muhtasari" "Hakuna vipengee vya hivi karibuni" "Funga" + "Ondoa zote" diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml index e372eea4d2..0c800ca720 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -24,6 +24,5 @@ "மேலோட்டப் பார்வை" "சமீபத்தியவை எதுவுமில்லை" "மூடும்" - - + "எல்லாம் அழி" diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml index 7cd88c824e..416fbb848d 100644 --- a/quickstep/res/values-te/strings.xml +++ b/quickstep/res/values-te/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "స్క్రీన్‌ని విభజించు" "పిన్ చేయి" - "యాప్‌లను మార్చడానికి దిగువ నుండి పైకి స్వైప్ చేయండి" "అవలోకనం" "ఇటీవలి అంశాలు ఏవీ లేవు" "మూసివేయండి" + "అన్నీ తీసివేయండి" diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml index 03f77e21ae..ccca5ad1ac 100644 --- a/quickstep/res/values-th/strings.xml +++ b/quickstep/res/values-th/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "แยกหน้าจอ" "ตรึง" - "เลื่อนขึ้นจากด้านล่างเพื่อสลับแอป" "ภาพรวม" "ไม่มีรายการล่าสุด" "ปิด" + "ล้างทั้งหมด" diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml index 368a1d10d9..4b29694a8f 100644 --- a/quickstep/res/values-tl/strings.xml +++ b/quickstep/res/values-tl/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Hatiin ang screen" "I-pin" - "Mag-swipe pataas mula sa ibaba para lumipat ng app" "Overview" "Walang kamakailang item" "Isara" + "I-clear lahat" diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml index a51acc2601..3c7463a796 100644 --- a/quickstep/res/values-tr/strings.xml +++ b/quickstep/res/values-tr/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Bölünmüş ekran" "Sabitle" - "Uygulamaları değiştirmek için alttan yukarı kaydırın" "Genel bakış" "Yeni öğe yok" "Kapat" + "Tümünü temizle" diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml index 0b0ad16113..f11bd6b777 100644 --- a/quickstep/res/values-uk/strings.xml +++ b/quickstep/res/values-uk/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Розділити екран" "Закріпити" - "Щоб переходити між додатками, проводьте пальцем знизу вгору" "Огляд" "Немає нещодавніх додатків" "Закрити" + "Очистити все" diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml index 7285b26c56..0a546fd603 100644 --- a/quickstep/res/values-ur/strings.xml +++ b/quickstep/res/values-ur/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "اسپلٹ اسکرین وضع" "پن کریں" - "ایپس کو سوئچ کرنے کیلئے نیچے سے اوپر سوائپ کریں" "مجموعی جائزہ" "کوئی حالیہ آئٹم نہیں" "بند کریں" + "سبھی کو صاف کریں" diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index fe68d74ca1..efea34117f 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -24,6 +24,5 @@ "Nazar" "Yaqinda ishlatilgan ilovalar yo‘q" "Yopish" - - + "Hammasini tozalash" diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml index 6db731c6a0..d4012f37a4 100644 --- a/quickstep/res/values-vi/strings.xml +++ b/quickstep/res/values-vi/strings.xml @@ -24,6 +24,5 @@ "Tổng quan" "Không có mục gần đây nào" "Đóng" - - + "Xóa tất cả" diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml index 08fdf4ec41..ec0263254d 100644 --- a/quickstep/res/values-zh-rCN/strings.xml +++ b/quickstep/res/values-zh-rCN/strings.xml @@ -24,6 +24,5 @@ "概览" "近期没有任何内容" "关闭" - - + "全部清除" diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml index d3ac3a27bd..152f894faf 100644 --- a/quickstep/res/values-zh-rHK/strings.xml +++ b/quickstep/res/values-zh-rHK/strings.xml @@ -24,6 +24,5 @@ "概覽" "最近沒有任何項目" "關閉" - - + "全部清除" diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml index 53efe9a023..44a16c9ad8 100644 --- a/quickstep/res/values-zh-rTW/strings.xml +++ b/quickstep/res/values-zh-rTW/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "分割畫面" "固定" - "從畫面底部向上滑動以切換應用程式" "總覽" "最近沒有任何項目" "關閉" + "全部清除" diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml index 6e48dc02e9..847c547cd1 100644 --- a/quickstep/res/values-zu/strings.xml +++ b/quickstep/res/values-zu/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Hlukanisa isikrini" "Phina" - "Swayiphela phezulu kusukela phansi ukuze ushintshe izinhlelo zokusebenza" "Buka konke" "Azikho izinto zakamuva" "Vala" + "Sula konke" diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 8826da8cd6..9b0ed4765c 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -81,6 +81,8 @@ "Muurpapiere" "Tuis-instellings" "Gedeaktiveer deur jou administrateur" + "Laat toe dat tuisskerm gedraai word" + "Wanneer foon gedraai word" "Kennisgewingkolle" "Aan" "Af" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 21b01ddb09..0db7a53518 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -81,6 +81,8 @@ "የግድግዳ ወረቀቶች" "የመነሻ ቅንብሮች" "በእርስዎ አስተዳዳሪ የተሰናከለ" + "የመነሻ ማያ ገጽ ማሽከርከርን ይፍቀዱ" + "ስልኩ ሲዞር" "የማሳወቂያ ነጥቦች" "በርቷል" "ጠፍቷል" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index f50e5fe8f5..9962bd75bc 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -24,8 +24,8 @@ "العمل" "لم يتم تثبيت التطبيق." "التطبيق ليس متاحًا" - "تم تعطيل التطبيق الذي تم تنزيله في الوضع الآمن" - "الأدوات معطلة في الوضع الآمن" + "تم إيقاف التطبيق الذي تم تنزيله في الوضع الآمن" + "الأدوات غير مفعّلة في الوضع الآمن" "الاختصار غير متاح" "الشاشة الرئيسية" "الإجراءات المخصّصة" @@ -63,7 +63,7 @@ "الإعداد" "هذا تطبيق نظام وتتعذر إزالته." "مجلد بدون اسم" - "تم تعطيل %1$s" + "تم إيقاف %1$s" %1$s، به %2$d إشعار %1$s، به إشعاران (%2$d) @@ -84,11 +84,13 @@ "الأدوات" "الخلفيات" "إعدادات الصفحة الرئيسية" - "عطَّل المشرف هذه الميزة" + "أوقف المشرف هذه الميزة" + "السماح بتدوير الشاشة الرئيسية" + "عند تدوير الهاتف" "نقاط الإشعارات" "قيد التشغيل" "غير مفعّل" - "يلزم تمكين الوصول إلى الإشعارات" + "يلزم تفعيل الوصول إلى الإشعارات" "لعرض نقاط الإشعارات، يجب تشغيل إشعارات التطبيق في %1$s" "تغيير الإعدادات" "عرض نقاط الإشعارات" diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml new file mode 100644 index 0000000000..6f45c10f2b --- /dev/null +++ b/res/values-as/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "কৰ্মস্থান" + "এপটো ইনষ্টল কৰা নহ\'ল।" + "এপটো নাই" + "ডাউনল\'ড কৰা এপটোক সুৰক্ষিত ম\'ডত অক্ষম কৰা হ\'ল" + "ৱিজেটবোৰক সুৰক্ষিত ম\'ডত অক্ষম কৰা হ\'ল" + "শ্বৰ্টকাট নাই" + "গৃহ স্ক্ৰীণ" + "উপযোগিতা অনুসৰি কৰা কাৰ্যবিলাক" + "কোনো ৱিজেট বাছনি কৰিবলৈ স্পৰ্শ কৰি থাকক।" + "কোনো ৱিজেট বাছনি কৰিবলৈ অথবা উপযোগিতা অনুসৰি কাৰ্যবিলাক ব্য়ৱহাৰ কৰিবলৈ দুবাৰ টিপি থাকক।" + "%1$d × %2$d" + "%1$d বহল x %2$d ওখ" + "মেনুৱেলভাৱে ৰাখিবলৈ স্পৰ্শ কৰি থাকক" + "স্বয়ংক্ৰিয়ভাবে যোগ কৰক" + "এপসমূহ সন্ধান কৰক" + "এপসমূহ ল’ড কৰি থকা হৈছে…" + "\"%1$s\"ৰ সৈতে মিলা কোনো এপ্ বিচাৰি পোৱা নগ\'ল" + "আৰু অধিক এপবোৰ সন্ধান কৰক" + "জাননীসমূহ" + "কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ স্পৰ্শ কৰি হেঁচি ধৰক।" + "কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ দুবাৰ টিপি হেঁচি ধৰক, বা নিজৰ উপযোগিতা অনুসৰি সৃষ্টি কৰা কাৰ্যসমূহ ব্যৱহাৰ কৰক।" + "এই গৃহ স্ক্ৰীণত আৰু বেছি ঠাই নাই।" + "পছন্দৰ ট্ৰে\'ত আৰু বেছি ঠাই নাই" + "এপৰ সূচী" + "ব্যক্তিগত এপৰ তালিকা" + "কৰ্মস্থানৰ এপৰ তালিকা" + "গৃহপৃষ্ঠা" + "আঁতৰাওক" + "আনইনষ্টল কৰক" + "এপ সম্পৰ্কীয় তথ্য" + "ইনষ্টল কৰক" + "শ্বৰ্টকাট ইনষ্টল কৰিব পাৰে" + "ব্য়ৱহাৰকাৰীৰ হস্তক্ষেপ অবিহনেই কোনো এপক শ্বৰ্টকাটবোৰ যোগ কৰাৰ অনুমতি দিয়ে।" + "গৃহ ছেটিং আৰু শ্বৰ্টকাটবোৰ পঢ়িব পাৰে" + "এপটোক গৃহ পৃষ্ঠাত ছেটিং আৰু শ্বৰ্টকাটসমূহ পঢ়াৰ অনুমতি দিয়ে।" + "গৃহ ছেটিং আৰু শ্বৰ্টকাটবোৰ লিখিব পাৰে" + "এপটোক গৃহ পৃষ্ঠাত ছেটিং আৰু শ্বৰ্টকাটসমূহ সলনি কৰাৰ অনুমতি দিয়ে।" + "%1$sক ফ\'ন কলবোৰ কৰাৰ অনুমতি দিয়া হোৱা নাই" + "ৱিজেট ল\'ড কৰাত সমস্য়া" + "ছেটআপ কৰক" + "এইটো এটা ছিষ্টেম এপ আৰু ইয়াক আনইনষ্টল কৰিব নোৱৰি" + "নামবিহীন ফ\'ল্ডাৰ" + "%1$s অক্ষম কৰা হ\'ল" + + %1$s%2$dটা জাননী আছে + %1$s%2$dটা জাননী আছে + + "%2$dৰ %1$d পৃষ্ঠা" + "গৃহ স্ক্ৰীণ %2$dৰ %1$d" + "গৃহ স্ক্ৰীণৰ নতুন পৃষ্ঠা" + "ফ’ল্ডাৰ খোলা হ\'ল, %1$d x %2$d" + "ফ\'ল্ডাৰ বন্ধ কৰিবলৈ টিপক" + "সলনি কৰা নাম ছেভ কৰিবলৈ টিপক" + "ফ\'ল্ডাৰ বন্ধ কৰা হ\'ল" + "ফ\'ল্ডাৰৰ নাম সলনি কৰি %1$s কৰা হৈছে" + "ফ’ল্ডাৰ: %1$s" + "ৱিজেটসমূহ" + "ৱালপেপাৰসমূহ" + "গৃহ ছেটিংসমূহ" + "আপোনাৰ প্ৰশাসকে অক্ষম কৰি ৰাখিছে" + "গৃহ স্ক্ৰীণ ঘূৰোৱাৰ অনুমতি দিয়ক" + "ফ\'নটো যেতিয়া ঘূৰোৱা হয়" + "জাননী সম্পৰ্কীয় বিন্দুবোৰ" + "অন অৱস্থাত আছে" + "অফ অৱস্থাত আছে" + "জাননী চাবলৈ অনুমতিৰ প্ৰয়োজন" + "জাননী সম্পৰ্কীয় বিন্দুবোৰ দেখুৱাবলৈ %1$sৰ বাবে এপৰ জাননীসমূহ অন কৰক" + "ছেটিংসমূহ সলনি কৰক" + "জাননী বিন্দুসমূহ দেখুৱাওক" + "গৃহ স্ক্ৰীণত আইকনটো যোগ কৰক" + "নতুন এপসমূহৰ বাবে" + "আইকনৰ আকৃতি সলনি কৰক" + "গৃহ স্ক্ৰীণত" + "ছিষ্টেম ডিফ\'ল্ট ব্য়ৱহাৰ কৰক" + "বৰ্গাকাৰ" + "বৰ্গবৃত্তাকাৰ" + "পৰিচিত মানুহৰ গোট" + "চকুপানীৰ টোপাল" + "আইকনৰ আকৃতিত কৰা পৰিবৰ্তনবোৰ প্ৰয়োগ কৰি থকা হৈছে" + "অজ্ঞাত" + "আঁতৰাওক" + "সন্ধান কৰক" + "এই এপটো ইনষ্টল কৰা হোৱা নাই" + "এই আইকনৰ এপটো ইনষ্টল কৰা হোৱা নাই। আপুনি এইটো আঁতৰাব পাৰে অথবা এপটো বিচাৰি মেনুৱেলভাৱে ইনষ্টল কৰিব পাৰে।" + "%1$s ডাউনল\'ড কৰি থকা হৈছে, %2$s সম্পূৰ্ণ হ\'ল" + "%1$s ইনষ্টল হোৱালৈ অপেক্ষা কৰি থকা হৈছে" + "%1$s ৱিজেট" + "গৃহ স্ক্ৰীণত যোগ কৰক" + "বস্তুটো ইয়ালৈ স্থানান্তৰ কৰক" + "বস্তুটো গৃহ স্ক্ৰীণত যোগ কৰা হ\'ল" + "বস্তুটো আঁতৰোৱা হ\'ল" + "বস্তু স্থানান্তৰ কৰক" + "শাৰী %1$s স্তম্ভ %2$sলৈ স্থানান্তৰিত কৰক" + "পছন্দৰ অৱস্থান %1$sলৈ স্থানান্তৰিত কৰক" + "পছন্দৰ অৱস্থান %1$sলৈ স্থানান্তৰিত কৰক" + "বস্তুটো স্থানান্তৰ কৰা হ\'ল" + "ফ\'ল্ডাৰত যোগ কৰক: %1$s" + "%1$sসহ ফ\'ল্ডাৰত যোগ কৰক" + "বস্তুটো ফ\'ল্ডাৰত যোগ কৰা হ\'ল" + "%1$s: ৰ জৰিয়তে ফ\'ল্ডাৰ সৃষ্টি কৰক" + "ফ\'ল্ডাৰ সৃষ্টি কৰা হ\'ল" + "হ\'ম স্ক্ৰীণলৈ স্থানান্তৰ কৰক" + "আকাৰ সলনি কৰক" + "প্ৰস্থ বৃদ্ধি কৰক" + "উচ্চতা বৃদ্ধি কৰক" + "প্ৰস্থ হ্ৰাস কৰক" + "উচ্চতা হ্ৰাস কৰক" + "ৱিজেটৰ আকাৰ সলনি কৰি প্ৰস্থ %1$s আৰু উচ্চতা %2$s কৰা হ\'ল" + "শ্বৰ্টকাটসমূহ" + "%2$s%1$dটা শ্বৰ্টকাট" + "%3$s%1$dটা শ্বৰ্টকাট আৰু %2$dটা জাননী" + "অগ্ৰাহ্য কৰক" + "জাননী অগ্ৰাহ্য কৰা হৈছে" + "ব্যক্তিগত" + "কৰ্মস্থান" + "কৰ্মস্থানৰ প্ৰ\'ফাইল" + "ইয়াত কৰ্মস্থানৰ এপ্ বিচাৰি পাওক" + "কৰ্মস্থানৰ প্ৰতিটো এপৰে একোটা প্ৰতীক আছে আৰু তাক আপোনাৰ প্ৰতিষ্ঠানে সুৰক্ষিত কৰি ৰাখে। ব্যৱহাৰ কৰাত সুবিধা হ\'বলৈ এপসমূহ আপোনাৰ গৃহ স্ক্ৰীণলৈ স্থানান্তৰ কৰক।" + "আপোনাৰ প্ৰতিষ্ঠানৰ দ্বাৰা পৰিচালিত" + "জাননী আৰু এপসমূহ অফ হৈ আছে" + "বন্ধ কৰক" + "বন্ধ" + diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index a0a1f57731..ed86f91552 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -81,6 +81,8 @@ "Divar kağızları" "Home ayarları" "Admininiz tərəfindən deaktiv edilib" + "Əsas ekranın firlanmağına icazə verin" + "Telefon çevrilən zaman" "Bildiriş nişanı" "Aktiv" "Deaktiv" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 275cf0f250..b06178e59f 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -82,6 +82,8 @@ "Pozadine" "Podešavanja početnog ekrana" "Administrator je onemogućio" + "Dozvoli rotaciju početnog ekrana" + "Kada se telefon rotira" "Tačke za obaveštenja" "Uključeno" "Isključeno" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index a1f1d8912a..399ae763e7 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -83,6 +83,8 @@ "Шпалеры" "Налады галоўнага экрана" "Адключаная адміністратарам" + "Дазволіць паварот галоўнага экрана" + "Пры павароце тэлефона" "Значкі апавяшчэнняў" "Уключана" "Выключана" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 5f61c69a2f..4eb109a4b5 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -81,6 +81,8 @@ "Тапети" "Настройки за началния екран" "Деактивирано от администратора ви" + "Разрешаване на завъртането на началния екран" + "При завъртане на телефона" "Точки за известия" "Включено" "Изключено" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index a0e4812cc3..ffeeed76ab 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -77,10 +77,12 @@ "ফোল্ডার বন্ধ করা হয়েছে" "ফোল্ডারের নাম পাল্টে %1$s করা হয়েছে" "ফোল্ডার: %1$s" - "উইজেটগুলি" + "উইজেট" "ওয়ালপেপারগুলি" - "হোম এর সেটিংস" + "হোম সেটিংস" "আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে" + "হোমস্ক্রীন ঘোরানোর অনুমতি দিন" + "যখন ফোনটি ঘোরানো হয়" "বিজ্ঞপ্তি ডট" "চালু হয়েছে" "বন্ধ আছে" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index fa88665060..40c886603d 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -82,6 +82,8 @@ "Pozadinske slike" "Postavke početnog ekrana" "Onemogućio vaš administrator" + "Dozvoli rotiranje početnog ekrana" + "Kada se telefon zarotira" "Tačke za obavještenja" "Uključeno" "Isključeno" @@ -101,7 +103,7 @@ "Primjenjivanje promjena oblika ikona" "Nepoznato" "Ukloni" - "Traži" + "Pretraži" "Ova aplikacija nije instalirana" "Aplikacija za ovu ikonu nije instalirana. Možete je ukloniti ili potražiti aplikaciju i ručno je instalirati." "%1$s se preuzima, završeno %2$s" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index de153f420b..2041319823 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -81,6 +81,8 @@ "Fons de pantalla" "Configuració de pantalla d\'inici" "Desactivada per l\'administrador" + "Permet la rotació de la pantalla d\'inici" + "En girar el telèfon" "Punts de notificació" "Activat" "Desactivat" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index eee945c209..7f1a4c6072 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -83,6 +83,8 @@ "Tapety" "Nastavení plochy" "Zakázáno administrátorem" + "Povolit otáčení plochy" + "Při otočení telefonu" "Puntíky s oznámením" "Zapnuto" "Vypnuto" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 203a9da7d4..cff300cefb 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -81,6 +81,8 @@ "Baggrunde" "Indstillinger for startskærmen" "Deaktiveret af din administrator" + "Tillad rotation af startskærmen" + "Når telefonen roteres" "Underretningscirkler" "Til" "Fra" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index f012a9ee63..2ee7c1122e 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -81,6 +81,8 @@ "Hintergründe" "Einstellungen für den Startbildschirm" "Von deinem Administrator deaktiviert" + "Drehung des Startbildschirms zulassen" + "Bei Drehung des Smartphones" "App-Benachrichtigungspunkte" "Aktiviert" "Deaktiviert" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index c5bae5b745..db9ac80f2b 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -81,6 +81,8 @@ "Ταπετσαρίες" "Ρυθμίσεις Αρχ. Οθ." "Απενεργοποιήθηκε από τον διαχειριστή σας" + "Να επιτρέπεται η περιστροφή της αρχικής οθόνης" + "Όταν το τηλέφωνο περιστρέφεται" "Κουκκίδες ειδοποίησης" "Ενεργή" "Ανενεργή" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index c2e37b8e51..cca8e859da 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -81,6 +81,8 @@ "Wallpapers" "Home settings" "Disabled by your admin" + "Allow Homescreen rotation" + "When phone is rotated" "Notification dots" "On" "Off" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index c2e37b8e51..cca8e859da 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -81,6 +81,8 @@ "Wallpapers" "Home settings" "Disabled by your admin" + "Allow Homescreen rotation" + "When phone is rotated" "Notification dots" "On" "Off" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index c2e37b8e51..cca8e859da 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -81,6 +81,8 @@ "Wallpapers" "Home settings" "Disabled by your admin" + "Allow Homescreen rotation" + "When phone is rotated" "Notification dots" "On" "Off" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 0410f35243..7ee1bdd63c 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -81,6 +81,8 @@ "Fondos de pantalla" "Configuración de página principal" "El administrador inhabilitó esta función" + "Permitir la rotación de la pantalla principal" + "Al girar el teléfono" "Puntos de notificación" "Activada" "Desactivada" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 6f045e1c7c..aa30967a54 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -81,6 +81,8 @@ "Fondos de pantalla" "Ajustes de la pantalla de inicio" "Inhabilitada por el administrador" + "Permitir rotación de la pantalla de inicio" + "Al girar el teléfono" "Burbujas de notificación" "Activado" "Desactivada" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 715e396031..1bde8aac13 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -81,6 +81,8 @@ "Taustapildid" "Avaekraani seaded" "Keelas administraator" + "Luba avaekraani pööramine" + "Kui telefoni pööratakse" "Märguandetäpid" "Sees" "Väljas" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index e25af961c7..128c6f42a3 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -81,6 +81,8 @@ "Horma-paperak" "Hasierako pantailaren ezarpenak" "Administratzaileak desgaitu du" + "Baimendu hasierako pantaila biratzea" + "Telefonoa biratzen denean" "Jakinarazpen-biribiltxoak" "Aktibatuta" "Desaktibatuta" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 4843d6d9e4..c30175268f 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -81,6 +81,8 @@ "کاغذدیواری‌ها" "تنظیمات صفحه اصلی" "توسط سرپرست سیستم غیرفعال شده است" + "امکان دادن به چرخش صفحه اصلی" + "وقتی تلفن چرخانده می‌شود" "نقطه‌های اعلان" "روشن" "خاموش" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 5ffc414558..6b568f6786 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -81,6 +81,8 @@ "Taustakuvat" "Kotiasetukset" "Järjestelmänvalvoja on poistanut toiminnon käytöstä." + "Salli aloitusnäytön kiertäminen" + "Kun puhelinta kierretään" "Pistemerkit" "Käytössä" "Pois käytöstä" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index d6903efb1a..cef238c459 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -81,6 +81,8 @@ "Fonds d\'écran" "Paramètres d\'accueil" "Cette fonction est désactivée par votre administrateur" + "Autoriser la rotation de l\'écran d\'accueil" + "Lorsque vous faites pivoter le téléphone" "Points de notification" "Activé" "Désactivé" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 283d4b7a23..0e6ae57d66 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -81,6 +81,8 @@ "Fonds d\'écran" "Paramètres accueil" "Désactivé par votre administrateur" + "Autoriser la rotation de l\'écran d\'accueil" + "Lorsque vous faites pivoter le téléphone" "Pastilles de notification" "Activé" "Désactivé" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 3817f075ea..1efa5ceadd 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -81,6 +81,8 @@ "Fondos de pantalla" "Configuración da pantalla de Inicio" "Función desactivada polo administrador" + "Permitir xirar a pantalla de inicio" + "Ao xirar o teléfono" "Puntos de notificacións" "Activado" "Desactivado" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index efc953c809..234fadafcd 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -81,6 +81,8 @@ "વૉલપેપર્સ" "હોમ સેટિંગ્સ" "તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ" + "હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો" + "જ્યારે ફોન ફેરવવામાં આવે ત્યારે" "સૂચના બિંદુઓ" "ચાલુ" "બંધ" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 798c061346..e4f4dfe118 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -81,6 +81,8 @@ "वॉलपेपर" "होम पेज की सेटिंग" "आपके एडमिन ने बंद किया हुआ है" + "होमस्क्रीन घुमाने की अनुमति दें" + "फ़ोन घुुमाए जाने पर" "सूचना बिंदु" "चालू" "बंद" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 35a7963936..7a8d639d69 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -80,8 +80,10 @@ "Mapa: %1$s" "Widgeti" "Pozadine" - "Postavke Homea" + "Postavke početnog zaslona" "Onemogućio administrator" + "Dopusti zakretanje početnog zaslona" + "Kada se telefon zakrene" "Točke obavijesti" "Uključeno" "Isključeno" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 5f33a99f59..24b29a001f 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -81,6 +81,8 @@ "Háttérképek" "Kezdőoldal beállításai" "A rendszergazda letiltotta" + "A kezdőképernyő elforgatásának engedélyezése" + "A telefon elforgatásakor" "Értesítési pöttyök" "Bekapcsolva" "Kikapcsolva" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 8c3ae2591d..6844a27573 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -81,6 +81,8 @@ "Պաստառներ" "Գլխավոր էջի կարգավորումներ" "Անջատվել է ձեր ադմինիստրատորի կողմից" + "Թույլ տալ հիմնական էկրանի պտտումը" + "Հեռախոսը պտտելու դեպքում" "Ծանուցումների կետիկներ" "Միացված է" "Անջատված է" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index ea0ea4af12..457efce0db 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -30,7 +30,7 @@ "Layar utama" "Tindakan khusus" "Sentuh lama untuk memilih widget." - "Ketuk dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus." + "Tap 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" @@ -72,8 +72,8 @@ "Layar utama %1$d dari %2$d" "Halaman layar utama baru" "Folder dibuka, %1$d x %2$d" - "Ketuk untuk menutup folder" - "Ketuk untuk menyimpan ganti nama" + "Tap untuk menutup folder" + "Tap untuk menyimpan ganti nama" "Folder ditutup" "Folder diganti namanya menjadi %1$s" "Folder: %1$s" @@ -81,6 +81,8 @@ "Wallpaper" "Setelan layar Utama" "Dinonaktifkan oleh admin" + "Izinkan layar Utama diputar" + "Saat ponsel diputar" "Titik notifikasi" "Aktif" "Nonaktif" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 3dc2d22118..3b5dabacce 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -81,6 +81,8 @@ "Veggfóður" "Heimastillingar" "Gert óvirkt af kerfisstjóra" + "Leyfa snúning fyrir heimaskjá" + "Þegar símanum er snúið" "Tilkynningapunktar" "Kveikt" "Slökkt" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 44e12c0e40..5d05f91190 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -81,6 +81,8 @@ "Sfondi" "Impostazioni Home" "Disattivata dall\'amministratore" + "Consenti rotazione della schermata Home" + "Con il telefono ruotato" "Indicatori notifica" "Attiva" "Non attiva" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index bc2061ba28..ad6aec6653 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -83,6 +83,8 @@ "טפטים" "הגדרות דף הבית" "הושבת על ידי מנהל המערכת שלך" + "אפשרות סיבוב של מסך דף הבית" + "כאשר הטלפון מסובב" "סימני הודעות" "מופעלת" "כבויה" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index c5ab31039c..8e3022b65e 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -81,6 +81,8 @@ "壁紙" "ホームの設定" "管理者により無効にされています" + "ホーム画面の回転を許可" + "スマートフォンが回転したとき" "通知ドット" "ON" "OFF" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 02ca8628ed..521ec80f8c 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -81,6 +81,8 @@ "ფონები" "მთავარი გვერდის პარამეტრები" "გათიშულია თქვენი ადმინისტრატორის მიერ" + "მთავარი ეკრანის შეტრიალების დაშვება" + "ტელეფონის შეტრიალებისას" "შეტყობინების ნიშნულები" "ჩართული" "გამორთული" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index b66fe69a39..7ab73d95dd 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -81,6 +81,8 @@ "Тұсқағаздар" "Негізгі экран параметрлері" "Әкімші өшірді" + "Негізгі экранның бұрылуына рұқсат ету" + "Телефон бұрылғанда" "Хабарландыру белгілері" "Қосулы" "Өшірулі" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 6b56372160..582bb33dd2 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -81,6 +81,8 @@ "ផ្ទាំង​រូបភាព" "ការកំណត់​ទំព័រដើម" "បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក" + "អនុញ្ញាតការបងិ្វលអេក្រង់ដើម" + "នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក" "ស្លាកជូនដំណឹង" "បើក" "បិទ" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index d4813b5760..56ebe0a9bb 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -81,6 +81,8 @@ "ವಾಲ್‌ಪೇಪರ್‌ಗಳು" "ಮುಖಪುಟ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ" + "ಮುಖಪುಟ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ" + "ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ" "ಅಧಿಸೂಚನೆ ಡಾಟ್‌ಗಳು" "ಆನ್" "ಆಫ್" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 9275abfe1f..4ec01d85d9 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -81,6 +81,8 @@ "배경화면" "홈 설정" "관리자가 사용 중지함" + "홈 화면 회전 허용" + "휴대전화 회전 시" "알림 표시 점" "사용" "사용 안함" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index eedf7fd101..502a08a3e1 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -81,6 +81,8 @@ "Тушкагаздар" "Башкы беттин жөндөөлөрү" "Администраторуңуз өчүрүп койгон" + "Башкы экранды айлантууга уруксат берүү" + "Телефон айланганда" "Билдирмелер белгилери" "Күйүк" "Өчүк" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 2b73628978..cd2c933c15 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -81,6 +81,8 @@ "ພາບພື້ນຫຼັງ" "ການຕັ້ງຄ່າ Home" "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" + "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" + "ເມື່ອໝຸນໂທລະສັບ" "ຈຸດການແຈ້ງເຕືອນ" "ເປີດ" "ປິດ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index db751dae6a..d6358948b4 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -83,6 +83,8 @@ "Ekrano fonai" "„Home“ nustatymai" "Išjungė administratorius" + "Leisti pasukti pagrindinį ekraną" + "Kai telefonas pasukamas" "Pranešimų taškai" "Įjungta" "Išjungta" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index a6e16deeef..0584affb80 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -82,6 +82,8 @@ "Fona tapetes" "Sākumlapas iestatījumi" "Atspējojis administrators" + "Atļaut sākuma ekrāna pagriešanu" + "Pagriežot tālruni" "Paziņojumu punkti" "Ieslēgts" "Izslēgts" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 29e837b27c..54d9c8054a 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -81,6 +81,8 @@ "Тапети" "Поставки за Home" "Оневозможено од администраторот" + "Дозволете ротација на Почетниот екран" + "Кога телефонот се ротира" "Точки за известување" "Вклучено" "Исклучено" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index 5ccac13e4a..a0609333c9 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -81,6 +81,8 @@ "വാൾപേപ്പർ" "ഹോം ക്രമീകരണം" "അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു" + "ഹോം സ്ക്രീൻ തിരിക്കൽ അനുവദിക്കുക" + "ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ" "അറിയിപ്പ് ഡോട്ടുകൾ" "ഓൺ" "ഓഫ്" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 7c0b00ec7b..a3507c5bb8 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -81,6 +81,8 @@ "Ханын зураг" "Нүүр хуудасны тохиргоо" "Таны админ идэвхгүй болгосон" + "Нүүр дэлгэцийг эргүүлэхийг зөвшөөрөх" + "Утсыг эргүүлсэн үед" "Мэдэгдлийн цэг" "Асаалттай" "Унтраалттай" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 8506b299a3..bf1e188058 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -81,6 +81,8 @@ "वॉलपेपर" "होम सेटिंग्‍ज" "आपल्या प्रशासकाने अक्षम केले" + "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" + "फोन फिरविला जातो तेव्हा" "सूचना बिंदू" "चालू" "बंद" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index 130e008389..3c223b6334 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -81,6 +81,8 @@ "Kertas dinding" "Tetapan laman utama" "Dilumpuhkan oleh pentadbir anda" + "Benarkan putaran Skrin Utama" + "Apabila telefon diputar" "Titik pemberitahuan" "Hidup" "Mati" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 778402ac27..59ac4cad35 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -81,6 +81,8 @@ "နောက်ခံများ" "ပင်မဆက်တင်များ" "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" + "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" + "ဖုန်းကိုလှည့်ထားစဉ်" "အကြောင်းကြားချက်အမှတ်အသားများ" "ဖွင့်ထားသည်" "ပိတ်ထားသည်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 5542079640..04d0b521e9 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -81,6 +81,8 @@ "Bakgrunner" "Startsideinnstillinger" "Administratoren har slått av funksjonen" + "Tillat rotasjon av startskjermen" + "Når telefonen roteres" "Varselsprikker" "På" "Av" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index fa2f9cf0b8..a8a64f1bbc 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -81,6 +81,8 @@ "वालपेपरहरु" "गृहपृष्ठका सेटिङहरू" "तपाईँको प्रशासकद्वारा असक्षम गरिएको" + "गृह स्क्रिनलाई घुम्ने अनुमति दिनुहोस्" + "फोनलाई घुमाइँदा" "सूचनाको प्रतीक जनाउने थोप्लोहरू" "सक्रिय छ" "निष्क्रिय छ" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index ed24914afd..97e576c1c5 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -79,8 +79,10 @@ "Map: %1$s" "Widgets" "Achtergrond" - "Instellingen voor startscherm" + "Instellingen startscherm" "Uitgeschakeld door je beheerder" + "Draaien van startscherm toestaan" + "Wanneer de telefoon gedraaid is" "Meldingsstipjes" "Aan" "Uit" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml new file mode 100644 index 0000000000..3cda2919bd --- /dev/null +++ b/res/values-or/strings.xml @@ -0,0 +1,146 @@ + + + + + "ଲଞ୍ଚର୍3" + + "କାମ" + "ଆପ୍‌ ଇନଷ୍ଟଲ୍‌ ହୋଇନାହିଁ" + "ଆପ୍‌ ଉପଲବ୍ଧ ନାହିଁ" + "ନିରାପଦ ମୋଡରେ ଡାଉନଲୋଡ୍‌ ହେଇଥିବା ଆପ୍‌ ଅକ୍ଷମ କରାଗଲା" + "ନିରାପଦ ମୋଡରେ ୱିଜେଟ୍‌ ଅକ୍ଷମ କରାଗଲା" + "ଶର୍ଟକଟ୍‌ ଉପଲବ୍ଧ ନାହିଁ" + "ହୋମ୍‌ ସ୍କ୍ରୀନ୍‌" + "କାର୍ଯ୍ୟ କଷ୍ଟମ୍ କରନ୍ତୁ" + "ୱିଜେଟ୍‌ ନେବାକୁ ସ୍ପର୍ଶ କରନ୍ତୁ ଏବଂ ଧରି ରଖନ୍ତୁ।" + "ଡବଲ୍‌-ଟାପ୍‌ କରନ୍ତୁ ଏବଂ ଏକ ୱିଜେଟ୍‌ ନେବାକୁ ଧରି ରଖନ୍ତୁ କିମ୍ୱା କଷ୍ଟମ୍ କାର୍ଯ୍ୟପ୍ରକ୍ରିୟା ବ୍ୟବହାର କରନ୍ତୁ।" + "%1$d × %2$d" + "%1$d ଓସାର ଓ %2$d ଉଚ୍ଚ" + "ମାନୁଆଲ୍‌ ଭାବରେ ରଖିବାକୁ ସ୍ପର୍ଶ କରନ୍ତୁ ଏବଂ ଧରି ରଖନ୍ତୁ" + "ସ୍ୱଚାଳିତ ଭାବେ ଯୋଡ଼ନ୍ତୁ" + "ଆପ୍‌ ଖୋଜନ୍ତୁ" + "ଆପ୍‌ ଲୋଡ୍‌ ହେଉଛି..." + "\"%1$s\" ସହିତ ମେଳ ହେଉଥିବା କୌଣସି ଆପ୍‌ ମିଳିଲା ନାହିଁ" + "ଅଧିକ ଆପ୍‌ ଖୋଜନ୍ତୁ" + "ବିଜ୍ଞପ୍ତି" + "ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ।" + "ଡବଲ୍‌-ଟାପ୍‌ କରନ୍ତୁ ଏବଂ ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ଧରି ରଖନ୍ତୁ କିମ୍ୱା କଷ୍ଟମ୍ ପ୍ରକ୍ରିୟା ବ୍ୟବହାର କରନ୍ତୁ।" + "ହୋମ୍‌ ସ୍କ୍ରୀନ ପାଇଁ ଆଉ କୋଠରୀ ନାହିଁ" + "ମନପସନ୍ଦ ଟ୍ରେରେ ଆଉ କୋଠରୀ ନାହିଁ" + "ଆପ୍‌ ତାଲିକା" + "ବ୍ୟକ୍ତିଗତ ଆପ୍ ତାଲିକା" + "କାର୍ଯ୍ୟକାରୀ ଆପ୍‌ ତାଲିକା" + "ହୋମ୍" + "ବାହାର କରନ୍ତୁ" + "ଅନଇନଷ୍ଟଲ୍‌ କରନ୍ତୁ" + "ଆପ୍‌ ସୂଚନା" + "ଇନଷ୍ଟଲ୍‌ କରନ୍ତୁ" + "ଶର୍ଟକଟ୍‍ ଇନଷ୍ଟଲ୍‌ କରନ୍ତୁ" + "ୟୁଜରଙ୍କ ବିନା ହସ୍ତକ୍ଷେପରେ ଶର୍ଟକଟ୍‌ ଯୋଡ଼ିବାକୁ ଆପକୁ ଅନୁମତି ଦିଏ।" + "ହୋମ୍‌ ସେଟିଙ୍ଗ ଏବଂ ଶର୍ଟକଟ୍‌ ପଢ଼ନ୍ତୁ" + "ହୋମରେ ସେଟିଙ୍ଗ ପଢ଼ିବାକୁ ଆପ ଏବଂ ଶର୍ଟକଟକୁ ଅନୁମତି ଦିଏ।" + "ହୋମ୍‌ ସେଟିଙ୍ଗ ଏବଂ ଶର୍ଟକଟ୍‌ ଲେଖନ୍ତୁ" + "ହୋମରେ ସେଟିଙ୍ଗ ଏବଂ ଶର୍ଟକଟ୍‌ ପରିବର୍ତ୍ତନ କରିବାକୁ ଆପକୁ ଅନୁମତି ଦିଏ।" + "ଫୋନ୍‌ କଲ୍‌ କରିବାକୁ %1$sକୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ" + "ୱିଜେଟ୍‌ ଲୋଡ୍‌ ହେବାରେ ସମସ୍ୟା ଅଛି" + "ସେଟ୍ ଅପ୍ କରନ୍ତୁ" + "ଏହା ଏକ ସିଷ୍ଟମ୍‌ ଆପ୍‌ ଅଟେ ଏବଂ ଏହା ଅନଇନଷ୍ଟଲ୍‌ କରାଯାଇ ପାରିବ ନାହିଁ।" + "ବେନାମୀ ଫୋଲ୍ଡର୍‌" + "%1$s ଅକ୍ଷମ କରାଗଲା" + + %1$s, ରେ %2$d ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଅଛି + %1$s, ରେ %2$d ବିଜ୍ଞପ୍ତି ଅଛି + + "ମୋଟ %2$dରୁ %1$d ନମ୍ବର ପୃଷ୍ଠା" + "%2$dରୁ %1$d ହୋମ୍‌ ସ୍କ୍ରୀନ୍" + "ନୂଆ ହୋମ୍‌ ସ୍କ୍ରୀନ୍‌ ପୃଷ୍ଠା" + "%2$d / %1$dର ଫୋଲ୍ଡର ଖୋଲାଗଲା" + "ଫୋଲ୍ଡର୍‌ ବନ୍ଦ କରିବାକୁ ଟାପ୍‌ କରନ୍ତୁ" + "ନାମ ବଦଳାଇବା ସେଭ୍ କରିବାକୁ ଟାପ୍‌ କରନ୍ତୁ" + "ଫୋଲ୍ଡର ବନ୍ଦ କରାଗଲା" + "ଫୋଲ୍ଡରର ନାମ %1$sକୁ ବଦଳାଗଲା" + "ଫୋଲ୍ଡର: %1$s" + "ୱିଜେଟ୍‌" + "ୱାଲପେପର୍‌" + "ହୋମ୍‌ ସେଟିଙ୍ଗ" + "ଆପଣଙ୍କ ଆଡମିନଙ୍କ ଦ୍ୱାରା ଅକ୍ଷମ କରାଯାଇଛି" + "ହୋମ୍‌ ସ୍କ୍ରୀନ୍ ବୁଲାଇବା ଅନୁମତି ଦିଅନ୍ତୁ" + "ଯେତେବେଳେ ଫୋନକୁ ବୁଲାଯାଇଥାଏ" + "ବିଜ୍ଞପ୍ତି ବିନ୍ଦୁଗୁଡ଼ିକ" + "ଅନ୍" + "ଅଫ୍‌" + "ବିଜ୍ଞପ୍ତି ଆକ୍ସେସ୍‌ ଆବଶ୍ୟକ ଅଟେ" + "ବିଜ୍ଞପ୍ତି ବିନ୍ଦୁ ଦେଖାଇବାକୁ, %1$s ପାଇଁ ଆପ୍‌ ବିଜ୍ଞପ୍ତି ଅନ୍‌ କରନ୍ତୁ" + "ସେଟିଙ୍ଗ ପରିବର୍ତ୍ତନ କରନ୍ତୁ" + "ବିଜ୍ଞପ୍ତି ଡଟ୍‌ଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ" + "ହୋମ୍‌ ସ୍କ୍ରୀନରେ ଆଇକନ୍‌କୁ ଯୋଡ଼ନ୍ତୁ" + "ନୂଆ ଆପ୍‌ ପାଇଁ" + "ଆଇକନ୍‌ର ଆକାର ପରିବର୍ତ୍ତନ କରନ୍ତୁ" + "ହୋମ୍ ସ୍କ୍ରୀନ୍ ଉପରେ" + "ସିଷ୍ଟମ ଡିଫଲ୍ଟ ବ୍ୟବହାର କରନ୍ତୁ" + "ବର୍ଗାକାର" + "ବର୍ଗାକାରର ବୃତ୍ତ" + "ବୃତ୍ତ" + "ଟିଅରଡ୍ରପ୍‌" + "ଆଇକନ୍‌ ଆକାର ପରିବର୍ତ୍ତନ ଲାଗୁ କରୁଛି" + "ଅଜଣା" + "ବାହାର କରନ୍ତୁ" + "ସର୍ଚ୍ଚ କରନ୍ତୁ" + "ଏହି ଆପ୍‌ ଇନଷ୍ଟଲ୍‌ ହୋଇନାହିଁ" + "ଏହି ଆଇକନ୍‌ ପାଇଁ ଆପ୍‌ ଇନଷ୍ଟଲ୍‌ ହୋଇନାହିଁ। ଏହାକୁ ଆପଣ ଆପ୍‌ ପାଇଁ ବାହାର କରିପାରିବେ କିମ୍ୱା ସର୍ଚ୍ଚ କରି ପାରିବେ ଏବଂ ଏହାକୁ ମାନୁଆଲ୍‌ ଭାବରେ ଇନଷ୍ଟଲ୍‌ କରିପାରିବେ।" + "%1$s ଡାଉନଲୋଡ୍‌ ହେଉଛି, %2$s ସମ୍ପୂର୍ଣ୍ଣ" + "%1$s ଇନଷ୍ଟଲ୍‌ ହେବାକୁ ଅପେକ୍ଷା କରିଛି" + "%1$s ୱିଜେଟ୍‌" + "ହୋମ୍‌ ସ୍କ୍ରୀନରେ ଯୋଡ଼ନ୍ତୁ" + "ଆଇଟମ୍‌କୁ ଏଠାକୁ ଘୁଞ୍ଚାନ୍ତୁ" + "ହୋମ୍‌ ସ୍କ୍ରୀନରେ ଆଇଟମ୍‌ ଯୋଡ଼ାଗଲା" + "ଆଇଟମ୍‌ ବାହାର କରାଗଲା" + "ଆଇଟମ୍‌ ଘୁଞ୍ଚାନ୍ତୁ" + "ଧାଡ଼ି %1$s ସ୍ତମ୍ଭ %2$sକୁ ନିଅନ୍ତୁ" + "%1$s ସ୍ଥିତିକୁ ନିଅନ୍ତୁ" + "ପସନ୍ଦର ସ୍ଥିତି %1$sକୁ ନିଅନ୍ତୁ" + "ଆଇଟମ୍‌ ଘୁଞ୍ଚେଇ ଦିଆଗଲା" + "ଏହି ଫୋଲ୍ଡରରେ ଯୋଡ଼ନ୍ତୁ: %1$s" + "%1$s ସହିତ ଫୋଲ୍ଡରରେ ଯୋଡ଼ନ୍ତୁ" + "ଫୋଲ୍ଡରରେ ଆଇଟମ୍‌ ଯୋଡ଼ାଗଲା" + "ଏହି ନାମରେ ଫୋଲ୍ଡର ତିଆରି କରନ୍ତୁ: %1$s" + "ଫୋଲ୍ଡର ତିଆରି କରାଗଲା" + "ହାମ୍‌ ସ୍କ୍ରୀନକୁ ଘୁଞ୍ଚାନ୍ତୁ" + "ଆକାର ବଦଳାନ୍ତୁ" + "ଚଉଡ଼ା ବଢ଼ାନ୍ତୁ" + "ଉଚ୍ଚତା ବଢ଼ାନ୍ତୁ" + "ଚଉଡ଼ା କମ୍‌ କରନ୍ତୁ" + "ଉଚ୍ଚତା କମ୍‌ କରନ୍ତୁ" + "ୱିଜେଟକୁ %1$s ଓସାର ଓ %2$s ଉଚ୍ଚରେ ପୁନଃଆକାର ଦିଆଗଲା" + "ଶର୍ଟକଟ୍‍" + "%2$s ପାଇଁ %1$dଟି ଶର୍ଟକଟ୍‌" + "%3$s ପାଇଁ %1$dଟି ଶର୍ଟକଟ୍‌ ଏବଂ %2$dଟି ବିଜ୍ଞପ୍ତି" + "ଖାରଜ କରନ୍ତୁ" + "ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା" + "ବ୍ୟକ୍ତିଗତ" + "କାମ" + "ୱର୍କ ପ୍ରୋଫାଇଲ୍‌" + "ଏଠାରେ କାମ ଆପ୍‌ ଖୋଜନ୍ତୁ" + "ପ୍ରତ୍ୟେକ କାଯ୍ୟକାରୀ ଆପ୍‌ର ଗୋଟିଏ ବ୍ୟାଜ୍ (ଚିହ୍ନ) ଅଛି, ଯାହାକୁ ଆପଣଙ୍କ ସଂସ୍ଥା ସୁରକ୍ଷିତ ରଖିଥାଏ। ସହଜରେ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପ୍‌କୁ ହୋମ୍ ସ୍କ୍ରୀନ୍ ଉପରକୁ ଆଣନ୍ତୁ।" + "ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ" + "ବିଜ୍ଞପ୍ତି ଓ ଆପ୍‌ଗୁଡ଼ିକ ବନ୍ଦ ଅଛି" + "ବନ୍ଦ କରନ୍ତୁ" + "ବନ୍ଦ ହୋଇଯାଇଛି" + diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 02424031bf..c0778690ad 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -81,6 +81,8 @@ "ਵਾਲਪੇਪਰ" "ਹੋਮ ਸੈਟਿੰਗਾਂ" "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ" + "ਹੋਮ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁੰਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ" + "ਜਦੋਂ ਫ਼ੋਨ ਘੁੰਮਾਇਆ ਜਾਂਦਾ ਹੈ" "ਸੂਚਨਾ ਬਿੰਦੂ" "ਚਾਲੂ" "ਬੰਦ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 558fab2590..67630827c0 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -83,6 +83,8 @@ "Tapety" "Ustawienia strony głównej" "Funkcja wyłączona przez administratora" + "Zezwalaj na obrót ekranu głównego" + "Po obróceniu telefonu" "Plakietki z powiadomieniami" "Włączono" "Wyłączono" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index c17b50cea4..8448ae0481 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -81,6 +81,8 @@ "Imagens de fundo" "Definições da página inicial" "Desativada pelo gestor" + "Permitir rotação do ecrã principal" + "Quando o telemóvel é rodado" "Pontos de notificação" "Ativada" "Desativada" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 73dad35bbb..754871e249 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -79,8 +79,10 @@ "Pasta: %1$s" "Widgets" "Planos de fundo" - "Configurações da página inicial" + "Configurações da tela inicial" "Desativado pelo administrador" + "Permitir rotação da tela inicial" + "Quando o smartphone for girado" "Pontos de notificação" "Ativado" "Desativado" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 500512ac31..1af37eb709 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -82,6 +82,8 @@ "Imagini de fundal" "Setări pentru ecranul de pornire" "Dezactivată de administrator" + "Permiteți rotirea ecranului de pornire" + "Când telefonul este rotit" "Puncte de notificare" "Activat" "Dezactivat" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 9aee3c967b..5382a29a02 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -83,6 +83,8 @@ "Обои" "Настройки главного экрана" "Функция отключена администратором" + "Разрешить поворачивать главный экран" + "Когда телефон повернут" "Значки уведомлений" "Вкл." "Выкл." diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 7a4771e611..10835dc5ce 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -81,6 +81,8 @@ "වෝල්පේපර" "Home සැකසීම්" "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" + "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" + "දුරකථනය කරකවන විට" "දැනුම්දීම් තිත්" "ක්‍රියාත්මකයි" "ක්‍රියාවිරහිතයි" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 77246fba71..37881971bd 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -81,8 +81,10 @@ "Priečinok: %1$s" "Miniaplikácie" "Tapety" - "Nastavenia plochy" + "Nastavenia Home" "Zakázané vaším správcom" + "Povoliť otáčanie plochy" + "Pri otočení telefónu" "Bodky upozornení" "Zapnuté" "Vypnuté" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 82b79125b4..6b4e4a5be1 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -83,6 +83,8 @@ "Ozadja" "Nastavitve začetnega zaslona" "Onemogočil skrbnik." + "Omogočanje sukanja začetnega zaslona" + "Ko se telefon zasuka" "Obvestilne pike" "Vklopljeno" "Izklopljeno" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index a4ad7a0543..82cc42a169 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -81,6 +81,8 @@ "Imazhet e sfondit" "Cilësimet e Home" "Çaktivizuar nga administratori" + "Lejo rrotullimin e ekranit kryesor" + "Kur telefoni rrotullohet" "Pikat e njoftimeve" "Aktiv" "Joaktiv" @@ -92,7 +94,7 @@ "Për aplikacionet e reja" "Ndrysho formën e ikonës" "në ekranin bazë" - "Përdor parazgjedhjen e sisteit" + "Përdor parazgjedhjen e sistemit" "Katror" "Katror me kënde të rrumbullakëta" "Rreth" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 3ae87f9e55..9a6081e70e 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -82,6 +82,8 @@ "Позадине" "Подешавања почетног екрана" "Администратор је онемогућио" + "Дозволи ротацију почетног екрана" + "Када се телефон ротира" "Тачке за обавештења" "Укључено" "Искључено" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 3c91c30b66..90f76db089 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -79,8 +79,10 @@ "Mapp: %1$s" "Widgetar" "Bakgrunder" - "Inställningar för startsidan" + "Startinställningar" "Inaktiverat av administratören" + "Tillåt rotering av startskärmen" + "När mobilen vrids" "Aviseringsprickar" "På" "Av" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index f074ed4b91..d23c891390 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -81,8 +81,10 @@ "Folda: %1$s" "Wijeti" "Mandhari" - "Mipangilio ya ukurasa wa mwanzo" + "Mipangilio ya mwanzo" "Imezimwa na msimamizi wako" + "Ruhusu kuzungusha skrini ya Kwanza" + "Simu inapozungushwa" "Vitone vya arifa" "Imewashwa" "Imezimwa" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index d507be46cd..a51247c2de 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -81,6 +81,8 @@ "வால்பேப்பர்கள்" "முகப்பு அமைப்புகள்" "உங்கள் நிர்வாகி முடக்கியுள்ளார்" + "முகப்புத் திரை சுழற்சியை அனுமதி" + "மொபைலைச் சுழற்றும் போது" "அறிவிப்புப் புள்ளிகள்" "ஆன்" "முடக்கப்பட்டுள்ளது" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 3f1762d00d..bffb1a8700 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -81,6 +81,8 @@ "వాల్‌పేపర్‌లు" "హోమ్ సెట్టింగ్‌లు" "మీ నిర్వాహకులు నిలిపివేసారు" + "హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి" + "ఫోన్‌‌ను తిప్పినప్పుడు" "నోటిఫికేషన్ డాట్‌లు" "ఆన్" "ఆఫ్" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index cac2333509..e4ac9989a4 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -81,6 +81,8 @@ "วอลเปเปอร์" "การตั้งค่าหน้าแรก" "ปิดใช้โดยผู้ดูแลระบบ" + "อนุญาตให้หมุนหน้าจอหลัก" + "เมื่อหมุนโทรศัพท์" "จุดแจ้งเตือน" "เปิด" "ปิด" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 0b90214225..5f0ba6f0da 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -81,6 +81,8 @@ "Mga Wallpaper" "Mga setting ng Home" "Na-disable ng iyong admin" + "Payagan ang pag-rotate ng Home screen" + "Kailan maro-rotate ang telepono" "Mga notification dot" "Naka-on" "Naka-off" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 972554424c..3cae0d6c6e 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -81,6 +81,8 @@ "Duvar Kağıtları" "Ana ekran ayarları" "Yöneticiniz tarafından devre dışı bırakıldı" + "Ana ekranı döndürmeye izin ver" + "Telefon döndürüldüğünde" "Bildirim noktaları" "Açık" "Kapalı" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 47ddc7c944..e510192d91 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -83,6 +83,8 @@ "Фонові малюнки" "Налаштування Home" "Вимкнув адміністратор" + "Дозволити обертання головного екрана" + "Коли телефон обертається" "Значки сповіщень" "Увімкнено" "Вимкнено" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 2558076469..77aa0a1eb5 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -81,6 +81,8 @@ "وال پیپرز" "ہوم ترتیبات" "آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا" + "ہوم اسکرین گھمانے کی اجازت دیں" + "جب فون گھمایا جاتا ہے" "اطلاعاتی ڈاٹس" "آن" "آف" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 72dbd9eb89..0360a7132a 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -81,6 +81,8 @@ "Fon rasmlari" "Bosh ekran sozlamalari" "Administrator tomonidan o‘chirilgan" + "Asosiy ekranni aylantirishga ruxsat berish" + "Telefon burilganda" "Bildirishnoma belgilari" "Yoniq" "O‘chiq" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index c11c2e6045..52d396e99f 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -81,6 +81,8 @@ "Hình nền" "Cài đặt màn hình chính" "Bị tắt bởi quản trị viên của bạn" + "Cho phép xoay Màn hình chính" + "Khi xoay điện thoại" "Dấu chấm thông báo" "Đang bật" "Đã tắt" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index f8dd3cd05f..dc3bc1faf6 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -81,6 +81,8 @@ "壁纸" "主屏幕设置" "已被您的管理员停用" + "允许旋转主屏幕" + "手机旋转时" "通知圆点" "开启" "关闭" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index a96e411972..b1a8d9d5fb 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -81,6 +81,8 @@ "桌布" "主螢幕設定" "已由您的管理員停用" + "允許主畫面旋轉" + "當手機旋轉時" "通知圓點" "開啟" "關閉" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 1a8d515348..d8473b61a6 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -81,6 +81,8 @@ "桌布" "Home 設定" "已由你的管理員停用" + "允許旋轉主螢幕" + "當手機旋轉時" "通知圓點" "已啟用" "已停用" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 126145eac5..852441f32b 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -81,6 +81,8 @@ "Izithombe zangemuva" "Izilungiselelo zasekhaya" "Kukhutshazwe umlawuli wakho" + "Vumela ukuphendukiswa kwesikrini sasekhaya" + "Uma ifoni iphendukiswa" "Amachashazi esaziso" "Kuvuliwe" "Kuvaliwe" -- GitLab From 4602e5c26146bb96026a95bc37b17d1769a377d5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 7 May 2018 16:40:49 -0700 Subject: [PATCH 0009/1301] Import translations. DO NOT MERGE Change-Id: I22d1469557a142df3e48e44eb140932edd80b85c Auto-generated-cl: translation import --- go/res/values-ar/strings.xml | 2 +- quickstep/res/values-af/strings.xml | 2 ++ quickstep/res/values-am/strings.xml | 2 ++ quickstep/res/values-ar/strings.xml | 2 ++ quickstep/res/values-as/strings.xml | 2 ++ quickstep/res/values-az/strings.xml | 2 ++ quickstep/res/values-b+sr+Latn/strings.xml | 2 ++ quickstep/res/values-be/strings.xml | 2 ++ quickstep/res/values-bg/strings.xml | 2 ++ quickstep/res/values-bn/strings.xml | 2 ++ quickstep/res/values-bs/strings.xml | 2 ++ quickstep/res/values-ca/strings.xml | 2 ++ quickstep/res/values-cs/strings.xml | 2 ++ quickstep/res/values-da/strings.xml | 2 ++ quickstep/res/values-de/strings.xml | 2 ++ quickstep/res/values-el/strings.xml | 2 ++ quickstep/res/values-es-rUS/strings.xml | 2 ++ quickstep/res/values-es/strings.xml | 2 ++ quickstep/res/values-et/strings.xml | 2 ++ quickstep/res/values-eu/strings.xml | 2 ++ quickstep/res/values-fa/strings.xml | 2 ++ quickstep/res/values-fi/strings.xml | 2 ++ quickstep/res/values-fr-rCA/strings.xml | 2 ++ quickstep/res/values-fr/strings.xml | 2 ++ quickstep/res/values-gl/strings.xml | 2 ++ quickstep/res/values-gu/strings.xml | 2 ++ quickstep/res/values-hi/strings.xml | 2 ++ quickstep/res/values-hr/strings.xml | 2 ++ quickstep/res/values-hu/strings.xml | 2 ++ quickstep/res/values-hy/strings.xml | 2 ++ quickstep/res/values-in/strings.xml | 2 ++ quickstep/res/values-is/strings.xml | 2 ++ quickstep/res/values-it/strings.xml | 2 ++ quickstep/res/values-iw/strings.xml | 2 ++ quickstep/res/values-ja/strings.xml | 2 ++ quickstep/res/values-ka/strings.xml | 2 ++ quickstep/res/values-kk/strings.xml | 2 ++ quickstep/res/values-km/strings.xml | 2 ++ quickstep/res/values-kn/strings.xml | 2 ++ quickstep/res/values-ko/strings.xml | 2 ++ quickstep/res/values-ky/strings.xml | 2 ++ quickstep/res/values-lo/strings.xml | 2 ++ quickstep/res/values-lt/strings.xml | 2 ++ quickstep/res/values-lv/strings.xml | 2 ++ quickstep/res/values-mk/strings.xml | 2 ++ quickstep/res/values-ml/strings.xml | 2 ++ quickstep/res/values-mn/strings.xml | 2 ++ quickstep/res/values-mr/strings.xml | 2 ++ quickstep/res/values-ms/strings.xml | 2 ++ quickstep/res/values-my/strings.xml | 2 ++ quickstep/res/values-nb/strings.xml | 2 ++ quickstep/res/values-ne/strings.xml | 2 ++ quickstep/res/values-nl/strings.xml | 2 ++ quickstep/res/values-or/strings.xml | 2 ++ quickstep/res/values-pa/strings.xml | 2 ++ quickstep/res/values-pl/strings.xml | 2 ++ quickstep/res/values-pt-rPT/strings.xml | 2 ++ quickstep/res/values-pt/strings.xml | 2 ++ quickstep/res/values-ru/strings.xml | 2 ++ quickstep/res/values-sk/strings.xml | 2 ++ quickstep/res/values-sl/strings.xml | 2 ++ quickstep/res/values-sq/strings.xml | 2 ++ quickstep/res/values-sr/strings.xml | 2 ++ quickstep/res/values-sv/strings.xml | 2 ++ quickstep/res/values-sw/strings.xml | 2 ++ quickstep/res/values-ta/strings.xml | 2 ++ quickstep/res/values-te/strings.xml | 2 ++ quickstep/res/values-th/strings.xml | 2 ++ quickstep/res/values-tl/strings.xml | 2 ++ quickstep/res/values-tr/strings.xml | 2 ++ quickstep/res/values-uk/strings.xml | 2 ++ quickstep/res/values-ur/strings.xml | 2 ++ quickstep/res/values-uz/strings.xml | 2 ++ quickstep/res/values-vi/strings.xml | 2 ++ quickstep/res/values-zh-rCN/strings.xml | 2 ++ quickstep/res/values-zh-rHK/strings.xml | 2 ++ quickstep/res/values-zh-rTW/strings.xml | 2 ++ quickstep/res/values-zu/strings.xml | 2 ++ res/values-af/strings.xml | 4 ++-- res/values-am/strings.xml | 4 ++-- res/values-ar/strings.xml | 8 ++++---- res/values-as/strings.xml | 4 ++-- res/values-az/strings.xml | 4 ++-- res/values-b+sr+Latn/strings.xml | 4 ++-- res/values-be/strings.xml | 4 ++-- res/values-bg/strings.xml | 4 ++-- res/values-bn/strings.xml | 4 ++-- res/values-bs/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-es-rUS/strings.xml | 4 ++-- res/values-es/strings.xml | 6 +++--- res/values-et/strings.xml | 4 ++-- res/values-eu/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/strings.xml | 4 ++-- res/values-gu/strings.xml | 4 ++-- res/values-hi/strings.xml | 4 ++-- res/values-hr/strings.xml | 4 ++-- res/values-hu/strings.xml | 4 ++-- res/values-hy/strings.xml | 4 ++-- res/values-in/strings.xml | 4 ++-- res/values-is/strings.xml | 4 ++-- res/values-it/strings.xml | 4 ++-- res/values-iw/strings.xml | 4 ++-- res/values-ja/strings.xml | 4 ++-- res/values-ka/strings.xml | 4 ++-- res/values-kk/strings.xml | 4 ++-- res/values-km/strings.xml | 4 ++-- res/values-kn/strings.xml | 4 ++-- res/values-ko/strings.xml | 4 ++-- res/values-ky/strings.xml | 4 ++-- res/values-lo/strings.xml | 4 ++-- res/values-lt/strings.xml | 4 ++-- res/values-lv/strings.xml | 4 ++-- res/values-mk/strings.xml | 4 ++-- res/values-ml/strings.xml | 4 ++-- res/values-mn/strings.xml | 4 ++-- res/values-mr/strings.xml | 4 ++-- res/values-ms/strings.xml | 4 ++-- res/values-my/strings.xml | 4 ++-- res/values-nb/strings.xml | 4 ++-- res/values-ne/strings.xml | 4 ++-- res/values-nl/strings.xml | 4 ++-- res/values-or/strings.xml | 4 ++-- res/values-pa/strings.xml | 4 ++-- res/values-pl/strings.xml | 4 ++-- res/values-pt-rPT/strings.xml | 4 ++-- res/values-pt/strings.xml | 4 ++-- res/values-ru/strings.xml | 4 ++-- res/values-sk/strings.xml | 4 ++-- res/values-sl/strings.xml | 4 ++-- res/values-sq/strings.xml | 4 ++-- res/values-sr/strings.xml | 4 ++-- res/values-sv/strings.xml | 4 ++-- res/values-sw/strings.xml | 4 ++-- res/values-ta/strings.xml | 4 ++-- res/values-te/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/strings.xml | 4 ++-- res/values-uz/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 ++-- 155 files changed, 312 insertions(+), 158 deletions(-) diff --git a/go/res/values-ar/strings.xml b/go/res/values-ar/strings.xml index 2b3b80746f..9888d0f7ca 100644 --- a/go/res/values-ar/strings.xml +++ b/go/res/values-ar/strings.xml @@ -20,7 +20,7 @@ "المس مع الاستمرار لاختيار اختصار." - "يمكنك النقر نقرًا مزدوجًا مع الاستمرار لاختيار اختصار أو استخدام الإجراءات المخصصة." + "يمكنك النقر مرّتين مع الاستمرار لاختيار اختصار أو استخدام الإجراءات المخصصة." "الاختصارات" "اختصارات %1$s" diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index f9ffe4bba4..b33456d31c 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -25,4 +25,6 @@ "Geen onlangse items nie" "Maak toe" "Vee alles uit" + + diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml index 428b46d507..2f303c078b 100644 --- a/quickstep/res/values-am/strings.xml +++ b/quickstep/res/values-am/strings.xml @@ -25,4 +25,6 @@ "ምንም የቅርብ ጊዜ ንጥሎች የሉም" "ዝጋ" "ሁሉንም አጽዳ" + + diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index a6011e74df..e22bef47e5 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -25,4 +25,6 @@ "ليست هناك عناصر تم استخدامها مؤخرًا" "إغلاق" "محو الكل" + + diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml index dad6102930..7294f142dd 100644 --- a/quickstep/res/values-as/strings.xml +++ b/quickstep/res/values-as/strings.xml @@ -25,4 +25,6 @@ "কোনো শেহতীয়া বস্তু নাই" "বন্ধ কৰক" "সকলো মচক" + + diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml index 0546f46508..4c2f8ec717 100644 --- a/quickstep/res/values-az/strings.xml +++ b/quickstep/res/values-az/strings.xml @@ -25,4 +25,6 @@ "Son elementlər yoxdur" "Bağlayın" "Hamısını silin" + + diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml index 9a6edd1960..bf66aef80e 100644 --- a/quickstep/res/values-b+sr+Latn/strings.xml +++ b/quickstep/res/values-b+sr+Latn/strings.xml @@ -25,4 +25,6 @@ "Nema nedavnih stavki" "Zatvori" "Obriši sve" + + diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml index 1e60dd36fd..48ed4c579b 100644 --- a/quickstep/res/values-be/strings.xml +++ b/quickstep/res/values-be/strings.xml @@ -25,4 +25,6 @@ "Няма новых элементаў" "Закрыць" "Ачысціць усё" + + diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml index cfbc08dbe0..30308ad0ca 100644 --- a/quickstep/res/values-bg/strings.xml +++ b/quickstep/res/values-bg/strings.xml @@ -25,4 +25,6 @@ "Няма скорошни елементи" "Затваряне" "Изчистване на всички" + + diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml index a0605d8317..80eb639056 100644 --- a/quickstep/res/values-bn/strings.xml +++ b/quickstep/res/values-bn/strings.xml @@ -25,4 +25,6 @@ "কোনো সাম্প্রতিক আইটেম নেই" "বন্ধ করুন" "সবকিছু খালি করুন" + + diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index 9ffa84806c..201f46144b 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -25,4 +25,6 @@ "Nema nedavnih stavki" "Zatvaranje" "Obriši sve" + + diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml index b5f2bf176b..c6b93e3712 100644 --- a/quickstep/res/values-ca/strings.xml +++ b/quickstep/res/values-ca/strings.xml @@ -25,4 +25,6 @@ "No hi ha cap element recent" "Tanca" "Esborra-ho tot" + + diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml index 25c8f81c1e..023244c554 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -25,4 +25,6 @@ "Žádné nedávné položky" "Zavřít" "Vymazat vše" + + diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index de5529fd19..5d1e763732 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -25,4 +25,6 @@ "Ingen nye elementer" "Luk" "Ryd alt" + + diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index 63483d95a2..cf2f1940ac 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -25,4 +25,6 @@ "Keine kürzlich verwendeten Elemente" "Schließen" "Alle Apps schließen" + + diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index e5dd604cd8..9cf05763d6 100644 --- a/quickstep/res/values-el/strings.xml +++ b/quickstep/res/values-el/strings.xml @@ -25,4 +25,6 @@ "Δεν υπάρχουν πρόσφατα στοιχεία" "Κλείσιμο" "Διαγραφή όλων" + + diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml index 642fe4c7a4..320892abae 100644 --- a/quickstep/res/values-es-rUS/strings.xml +++ b/quickstep/res/values-es-rUS/strings.xml @@ -25,4 +25,6 @@ "No hay elementos recientes" "Cerrar" "Borrar todo" + + diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml index 4f74a389ff..abccec881b 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -25,4 +25,6 @@ "No hay elementos recientes" "Cerrar" "Borrar todo" + + diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml index efa68f9c43..5143406ce1 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -25,4 +25,6 @@ "Hiljutisi üksusi pole" "Sule" "Sule kõik" + + diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index d22242efab..879aa28ceb 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -25,4 +25,6 @@ "Ez dago azkenaldi honetako ezer" "Itxi" "Garbitu guztiak" + + diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml index fa610a26ea..b76e9a5656 100644 --- a/quickstep/res/values-fa/strings.xml +++ b/quickstep/res/values-fa/strings.xml @@ -25,4 +25,6 @@ "بدون موارد اخیر" "بستن" "پاک کردن همه" + + diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml index 2c4aa04a8e..bbfaa11e10 100644 --- a/quickstep/res/values-fi/strings.xml +++ b/quickstep/res/values-fi/strings.xml @@ -25,4 +25,6 @@ "Ei viimeaikaisia kohteita" "Sulje" "Poista kaikki" + + diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml index 892c43fdf0..7cad9fca95 100644 --- a/quickstep/res/values-fr-rCA/strings.xml +++ b/quickstep/res/values-fr-rCA/strings.xml @@ -25,4 +25,6 @@ "Aucun élément récent" "Fermer" "Tout effacer" + + diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index 49304491ed..078ab2b5cd 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -25,4 +25,6 @@ "Aucun élément récent" "Fermer" "Tout effacer" + + diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index 8efc773f49..549d804771 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -25,4 +25,6 @@ "Non hai elementos recentes" "Pecha a aplicación" "Borrar todo" + + diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index cdae86feba..27235f2bcf 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -25,4 +25,6 @@ "તાજેતરની કોઈ આઇટમ નથી" "બંધ કરો" "બધું સાફ કરો" + + diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml index 06d0ab167d..46b404f529 100644 --- a/quickstep/res/values-hi/strings.xml +++ b/quickstep/res/values-hi/strings.xml @@ -25,4 +25,6 @@ "हाल ही में इस्तेमाल किया गया कोई ऐप्लिकेशन नहीं है" "बंद करें" "सभी ऐप्लिकेशन बंद करें" + + diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml index aacc6ddb4f..b8682608f2 100644 --- a/quickstep/res/values-hr/strings.xml +++ b/quickstep/res/values-hr/strings.xml @@ -25,4 +25,6 @@ "Nema nedavnih stavki" "Zatvori" "Izbriši sve" + + diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml index d03374111f..60cd6a1ddc 100644 --- a/quickstep/res/values-hu/strings.xml +++ b/quickstep/res/values-hu/strings.xml @@ -25,4 +25,6 @@ "Nincsenek mostanában használt elemek" "Bezárás" "Összes törlése" + + diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml index 4afae7de7d..c908263b6d 100644 --- a/quickstep/res/values-hy/strings.xml +++ b/quickstep/res/values-hy/strings.xml @@ -25,4 +25,6 @@ "Վերջին տարրեր չկան" "Փակել" "Փակել բոլորը" + + diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml index 7adc31ecc9..ff6267c9b3 100644 --- a/quickstep/res/values-in/strings.xml +++ b/quickstep/res/values-in/strings.xml @@ -25,4 +25,6 @@ "Tidak ada item yang baru dibuka" "Tutup" "Hapus semua" + + diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml index 88a92ed96e..bbb460729c 100644 --- a/quickstep/res/values-is/strings.xml +++ b/quickstep/res/values-is/strings.xml @@ -25,4 +25,6 @@ "Engin nýleg atriði" "Loka" "Hreinsa allt" + + diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml index e95faf84b2..6175a4720c 100644 --- a/quickstep/res/values-it/strings.xml +++ b/quickstep/res/values-it/strings.xml @@ -25,4 +25,6 @@ "Nessun elemento recente" "Chiudi" "Cancella tutto" + + diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index ee4f040b2e..9afb842e32 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -25,4 +25,6 @@ "אין פריטים אחרונים" "סגירה" "ניקוי הכול" + + diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml index f32e2e62fb..e478d4acc1 100644 --- a/quickstep/res/values-ja/strings.xml +++ b/quickstep/res/values-ja/strings.xml @@ -25,4 +25,6 @@ "最近のアイテムはありません" "閉じる" "すべてクリア" + + diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml index 6de8ed9222..3d9726c790 100644 --- a/quickstep/res/values-ka/strings.xml +++ b/quickstep/res/values-ka/strings.xml @@ -25,4 +25,6 @@ "ბოლოს გამოყენებული ერთეულები არ არის" "დახურვა" "ყველას გასუფთავება" + + diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml index ddd4a77196..80cab46bbd 100644 --- a/quickstep/res/values-kk/strings.xml +++ b/quickstep/res/values-kk/strings.xml @@ -25,4 +25,6 @@ "Соңғы элементтер жоқ" "Жабу" "Барлығын өшіру" + + diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml index 65c1dccee3..36a9ad98db 100644 --- a/quickstep/res/values-km/strings.xml +++ b/quickstep/res/values-km/strings.xml @@ -25,4 +25,6 @@ "មិនមានធាតុថ្មីៗទេ" "បិទ" "សម្អាត​ទាំងអស់" + + diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml index 55ccbb0260..314638cab2 100644 --- a/quickstep/res/values-kn/strings.xml +++ b/quickstep/res/values-kn/strings.xml @@ -25,4 +25,6 @@ "ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ" "ಮುಚ್ಚಿ" "ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ" + + diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml index 54b86a8d5e..557ee4a01c 100644 --- a/quickstep/res/values-ko/strings.xml +++ b/quickstep/res/values-ko/strings.xml @@ -25,4 +25,6 @@ "최근 항목이 없습니다." "닫기" "모두 삭제" + + diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml index b788693824..1575af6506 100644 --- a/quickstep/res/values-ky/strings.xml +++ b/quickstep/res/values-ky/strings.xml @@ -25,4 +25,6 @@ "Акыркы колдонмолор жок" "Жабуу" "Баарын тазалоо" + + diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml index a83743a7e9..3e332be0b2 100644 --- a/quickstep/res/values-lo/strings.xml +++ b/quickstep/res/values-lo/strings.xml @@ -25,4 +25,6 @@ "ບໍ່ມີລາຍການຫຼ້າສຸດ" "ປິດ" "ລຶບລ້າງທັງໝົດ" + + diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml index 689cf94c5c..4dd2680230 100644 --- a/quickstep/res/values-lt/strings.xml +++ b/quickstep/res/values-lt/strings.xml @@ -25,4 +25,6 @@ "Nėra jokių naujausių elementų" "Uždaryti" "Išvalyti viską" + + diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml index 0aac2222d1..7eb385fa8d 100644 --- a/quickstep/res/values-lv/strings.xml +++ b/quickstep/res/values-lv/strings.xml @@ -25,4 +25,6 @@ "Nav nesenu vienumu." "Aizvērt" "Notīrīt visu" + + diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml index e428b4e1f8..9e959d3170 100644 --- a/quickstep/res/values-mk/strings.xml +++ b/quickstep/res/values-mk/strings.xml @@ -25,4 +25,6 @@ "Нема неодамнешни ставки" "Затвори" "Исчисти ги сите" + + diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml index 4cca447e7d..1d7b927a9c 100644 --- a/quickstep/res/values-ml/strings.xml +++ b/quickstep/res/values-ml/strings.xml @@ -25,4 +25,6 @@ "സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല" "അവസാനിപ്പിക്കുക" "എല്ലാം മായ്‌ക്കുക" + + diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml index f40f69e315..5031388f96 100644 --- a/quickstep/res/values-mn/strings.xml +++ b/quickstep/res/values-mn/strings.xml @@ -25,4 +25,6 @@ "Сүүлийн үеийн зүйл алга" "Хаах" "Бүгдийг устгах" + + diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index 938363db0f..939963e46e 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -25,4 +25,6 @@ "कोणतेही अलीकडील आयटम नाहीत" "बंद" "सर्व साफ करा" + + diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml index 236fab25c8..0e93bf6c1a 100644 --- a/quickstep/res/values-ms/strings.xml +++ b/quickstep/res/values-ms/strings.xml @@ -25,4 +25,6 @@ "Tiada item terbaharu" "Tutup" "Kosongkan semua" + + diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml index e44b904beb..ebffc3c3b4 100644 --- a/quickstep/res/values-my/strings.xml +++ b/quickstep/res/values-my/strings.xml @@ -25,4 +25,6 @@ "မကြာမီကဖွင့်ထားသည်များ မရှိပါ" "ပိတ်ရန်" "အားလုံးကို ရှင်းရန်" + + diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml index 423b7c1448..97870b15cc 100644 --- a/quickstep/res/values-nb/strings.xml +++ b/quickstep/res/values-nb/strings.xml @@ -25,4 +25,6 @@ "Ingen nylige elementer" "Lukk" "Fjern alt" + + diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml index bf52604fd2..c9a6c6b894 100644 --- a/quickstep/res/values-ne/strings.xml +++ b/quickstep/res/values-ne/strings.xml @@ -25,4 +25,6 @@ "हालसालैको कुनै पनि वस्तु छैन" "बन्द गर्नुहोस्" "सबै खाली गर्नुहोस्" + + diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml index 96319a40d3..e3acf0dc36 100644 --- a/quickstep/res/values-nl/strings.xml +++ b/quickstep/res/values-nl/strings.xml @@ -25,4 +25,6 @@ "Geen recente items" "Sluiten" "Alles wissen" + + diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml index 08e38c09e6..5e5e420ff6 100644 --- a/quickstep/res/values-or/strings.xml +++ b/quickstep/res/values-or/strings.xml @@ -25,4 +25,6 @@ "କୌଣସି ସାମ୍ପ୍ରତିକ ଆଇଟମ୍ ନାହିଁ" "ବନ୍ଦ କରନ୍ତୁ" "ସବୁ ଖାଲି କରନ୍ତୁ" + + diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml index bc044c808f..fec9f03fbe 100644 --- a/quickstep/res/values-pa/strings.xml +++ b/quickstep/res/values-pa/strings.xml @@ -25,4 +25,6 @@ "ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ" "ਬੰਦ ਕਰੋ" "ਸਭ ਕਲੀਅਰ ਕਰੋ" + + diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml index 4f865d7ad2..54196e8465 100644 --- a/quickstep/res/values-pl/strings.xml +++ b/quickstep/res/values-pl/strings.xml @@ -25,4 +25,6 @@ "Brak ostatnich elementów" "Zamknij" "Wyczyść wszystko" + + diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml index e0a9372336..afc6295373 100644 --- a/quickstep/res/values-pt-rPT/strings.xml +++ b/quickstep/res/values-pt-rPT/strings.xml @@ -25,4 +25,6 @@ "Nenhum item recente" "Fechar" "Limpar tudo" + + diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml index d4be22122d..9e43cd7c0a 100644 --- a/quickstep/res/values-pt/strings.xml +++ b/quickstep/res/values-pt/strings.xml @@ -25,4 +25,6 @@ "Nenhum item recente" "Fechar" "Limpar tudo" + + diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml index 2d7fc787db..832aa0aa19 100644 --- a/quickstep/res/values-ru/strings.xml +++ b/quickstep/res/values-ru/strings.xml @@ -25,4 +25,6 @@ "Здесь пока ничего нет." "Закрыть" "Очистить все" + + diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index fc173b718a..da4585bf1d 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -25,4 +25,6 @@ "Žiadne nedávne položky" "Zavrieť" "Vymazať všetko" + + diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml index b03978c77c..6a25e9d834 100644 --- a/quickstep/res/values-sl/strings.xml +++ b/quickstep/res/values-sl/strings.xml @@ -25,4 +25,6 @@ "Ni nedavnih elementov" "Zapri" "Počisti vse" + + diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml index a0c3d781d0..521b8c75cc 100644 --- a/quickstep/res/values-sq/strings.xml +++ b/quickstep/res/values-sq/strings.xml @@ -25,4 +25,6 @@ "Nuk ka asnjë artikull të fundit" "Mbyll" "Pastroji të gjitha" + + diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml index c51ca1c50d..054cda5945 100644 --- a/quickstep/res/values-sr/strings.xml +++ b/quickstep/res/values-sr/strings.xml @@ -25,4 +25,6 @@ "Нема недавних ставки" "Затвори" "Обриши све" + + diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml index 29b4e453ab..1a0ecc13e1 100644 --- a/quickstep/res/values-sv/strings.xml +++ b/quickstep/res/values-sv/strings.xml @@ -25,4 +25,6 @@ "Listan med de senaste åtgärderna är tom" "Stäng" "Rensa alla" + + diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml index e41c2bb327..be26e8bc66 100644 --- a/quickstep/res/values-sw/strings.xml +++ b/quickstep/res/values-sw/strings.xml @@ -25,4 +25,6 @@ "Hakuna vipengee vya hivi karibuni" "Funga" "Ondoa zote" + + diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml index 0c800ca720..886b017a8f 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -25,4 +25,6 @@ "சமீபத்தியவை எதுவுமில்லை" "மூடும்" "எல்லாம் அழி" + + diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml index 416fbb848d..a0a818cf61 100644 --- a/quickstep/res/values-te/strings.xml +++ b/quickstep/res/values-te/strings.xml @@ -25,4 +25,6 @@ "ఇటీవలి అంశాలు ఏవీ లేవు" "మూసివేయండి" "అన్నీ తీసివేయండి" + + diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml index ccca5ad1ac..5a162b729d 100644 --- a/quickstep/res/values-th/strings.xml +++ b/quickstep/res/values-th/strings.xml @@ -25,4 +25,6 @@ "ไม่มีรายการล่าสุด" "ปิด" "ล้างทั้งหมด" + + diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml index 4b29694a8f..af7ff97fa7 100644 --- a/quickstep/res/values-tl/strings.xml +++ b/quickstep/res/values-tl/strings.xml @@ -25,4 +25,6 @@ "Walang kamakailang item" "Isara" "I-clear lahat" + + diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml index 3c7463a796..760a61ffd5 100644 --- a/quickstep/res/values-tr/strings.xml +++ b/quickstep/res/values-tr/strings.xml @@ -25,4 +25,6 @@ "Yeni öğe yok" "Kapat" "Tümünü temizle" + + diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml index f11bd6b777..41babaa879 100644 --- a/quickstep/res/values-uk/strings.xml +++ b/quickstep/res/values-uk/strings.xml @@ -25,4 +25,6 @@ "Немає нещодавніх додатків" "Закрити" "Очистити все" + + diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml index 0a546fd603..9dd7b8d33c 100644 --- a/quickstep/res/values-ur/strings.xml +++ b/quickstep/res/values-ur/strings.xml @@ -25,4 +25,6 @@ "کوئی حالیہ آئٹم نہیں" "بند کریں" "سبھی کو صاف کریں" + + diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index efea34117f..c78f000ca5 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -25,4 +25,6 @@ "Yaqinda ishlatilgan ilovalar yo‘q" "Yopish" "Hammasini tozalash" + + diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml index d4012f37a4..4b1d1c0257 100644 --- a/quickstep/res/values-vi/strings.xml +++ b/quickstep/res/values-vi/strings.xml @@ -25,4 +25,6 @@ "Không có mục gần đây nào" "Đóng" "Xóa tất cả" + + diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml index ec0263254d..17cf6c31a1 100644 --- a/quickstep/res/values-zh-rCN/strings.xml +++ b/quickstep/res/values-zh-rCN/strings.xml @@ -25,4 +25,6 @@ "近期没有任何内容" "关闭" "全部清除" + + diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml index 152f894faf..1203cf01fc 100644 --- a/quickstep/res/values-zh-rHK/strings.xml +++ b/quickstep/res/values-zh-rHK/strings.xml @@ -25,4 +25,6 @@ "最近沒有任何項目" "關閉" "全部清除" + + diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml index 44a16c9ad8..ed708b4950 100644 --- a/quickstep/res/values-zh-rTW/strings.xml +++ b/quickstep/res/values-zh-rTW/strings.xml @@ -25,4 +25,6 @@ "最近沒有任何項目" "關閉" "全部清除" + + diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml index 847c547cd1..1aa34b6b6d 100644 --- a/quickstep/res/values-zu/strings.xml +++ b/quickstep/res/values-zu/strings.xml @@ -25,4 +25,6 @@ "Azikho izinto zakamuva" "Vala" "Sula konke" + + diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 9b0ed4765c..87924e79b3 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -130,8 +130,8 @@ "Verminder hoogte" "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" "Persoonlik" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 0db7a53518..46647c62d9 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -130,8 +130,8 @@ "ቁመት ይቀንሱ" "የመግብር መጠን ወደ ስፋት %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 9962bd75bc..c094c3ad8b 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -30,7 +30,7 @@ "الشاشة الرئيسية" "الإجراءات المخصّصة" "المس مع الاستمرار لاختيار إحدى الأدوات." - "انقر نقرًا مزدوجًا مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." + "انقر مرّتين مع الاستمرار لاختيار أداة أو استخدم الإجراءات المخصصة." "%1$d × %2$d" "‏العرض %1$d الطول %2$d" "انقر مع الاستمرار لإضافة العنصر يدويًا" @@ -41,7 +41,7 @@ "البحث عن مزيد من التطبيقات" "الإشعارات" "انقر مع الاستمرار لاختيار اختصار." - "يمكنك النقر نقرًا مزدوجًا مع الاستمرار لاختيار اختصار أو استخدام الإجراءات المخصصة." + "يمكنك النقر مرّتين مع الاستمرار لاختيار اختصار أو استخدام الإجراءات المخصصة." "ليس هناك مساحة أخرى في هذه الشاشة الرئيسية." "لا يوجد المزيد من الحقول في علبة المفضلة" "قائمة التطبيقات" @@ -134,8 +134,8 @@ "تقليل الارتفاع" "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" "الاختصارات" - "%1$d اختصار لتطبيق %2$s" - "هناك %1$d اختصار و%2$d إشعار عن %3$s" + + "تجاهل" "تم تجاهل الإشعار" "شخصية" diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index 6f45c10f2b..41deec31ec 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -130,8 +130,8 @@ "উচ্চতা হ্ৰাস কৰক" "ৱিজেটৰ আকাৰ সলনি কৰি প্ৰস্থ %1$s আৰু উচ্চতা %2$s কৰা হ\'ল" "শ্বৰ্টকাটসমূহ" - "%2$s%1$dটা শ্বৰ্টকাট" - "%3$s%1$dটা শ্বৰ্টকাট আৰু %2$dটা জাননী" + + "অগ্ৰাহ্য কৰক" "জাননী অগ্ৰাহ্য কৰা হৈছে" "ব্যক্তিগত" diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index ed86f91552..dd0f022a1b 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -130,8 +130,8 @@ "Hündürlüyü azaldın" "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" "Şəxsi" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index b06178e59f..9a2062f84f 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -131,8 +131,8 @@ "Smanji visinu" "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" "Lične" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 399ae763e7..ea312e7b18 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -132,8 +132,8 @@ "Паменшыць вышыню" "Памеры віджэта зменены на: шырыня %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 4eb109a4b5..92000496d7 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -130,8 +130,8 @@ "Намаляване на височината" "Приспособлението е преоразмерено към ширина %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 ffeeed76ab..b11fae9ad9 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -130,8 +130,8 @@ "উচ্চতা কমান" "উইজেটের আকার প্রস্থ %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 40c886603d..94d3ca0676 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -131,8 +131,8 @@ "Smanji visinu" "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" "Lične" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 2041319823..2364e722e0 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -130,8 +130,8 @@ "Redueix l\'alçada" "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ó" "Personal" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 7f1a4c6072..f84e437c1c 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -132,8 +132,8 @@ "Snížit výšku" "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" "Osobní" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index cff300cefb..1d6984c757 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -130,8 +130,8 @@ "Reducer højden" "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" "Personlige" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 2ee7c1122e..af07f1c8f0 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -130,8 +130,8 @@ "Höhe verringern" "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" "Privat" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index db9ac80f2b..3de0aaf5ac 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -130,8 +130,8 @@ "Μείωση του ύψους" "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" "Συντομεύσεις" - "%1$d συντομεύσεις για %2$s" - "%1$d συντομεύσεις και %2$d ειδοποιήσεις για την εφαρμογή %3$s" + + "Παράβλεψη" "Η ειδοποίηση παραβλέφθηκε" "Προσωπικές" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 7ee1bdd63c..f991da7f86 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -130,8 +130,8 @@ "Reducir la altura" "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" "Personales" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index aa30967a54..1dbe8e904d 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -85,7 +85,7 @@ "Al girar el teléfono" "Burbujas de notificación" "Activado" - "Desactivada" + "Desactivado" "Se necesita acceso a las notificaciones" "Para mostrar burbujas de notificación, activa las notificaciones de %1$s" "Cambiar ajustes" @@ -130,8 +130,8 @@ "Reducir altura" "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" "Personal" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 1bde8aac13..94b0103e61 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -130,8 +130,8 @@ "Vähenda kõrgust" "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" "Isiklik" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 128c6f42a3..a13c49325a 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -130,8 +130,8 @@ "Txikitu altuera" "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" "Pertsonalak" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index c30175268f..da12ebe7b3 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -130,8 +130,8 @@ "کاهش ارتفاع" "اندازه ابزارک به عرض %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 6b568f6786..96214d30ad 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -130,8 +130,8 @@ "Vähennä korkeutta" "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" "Henkilökohtaiset" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index cef238c459..aebb42df2f 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -130,8 +130,8 @@ "Diminuer la hauteur" "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" "Personnel" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 0e6ae57d66..6c5c120690 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -130,8 +130,8 @@ "Diminuer la hauteur" "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" "Personnelles" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 1efa5ceadd..4dd7ae71b1 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -130,8 +130,8 @@ "Reducir altura" "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" "Persoal" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index 234fadafcd..aa0b3af1f0 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -130,8 +130,8 @@ "ઊંચાઈ ઘટાડો" "વિજેટનો આકાર બદલીને %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 e4f4dfe118..1b47fcbbea 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -130,8 +130,8 @@ "ऊंचाई घटाएं" "विजेट का आकार बदलकर उसकी चौड़ाई %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 7a8d639d69..077da67e25 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -131,8 +131,8 @@ "Smanjenje visine" "Š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" "Osobno" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 24b29a001f..797bde44ad 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -130,8 +130,8 @@ "Magasság csökkentése" "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" "Személyes" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 6844a27573..79210f3a77 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -130,8 +130,8 @@ "Նվազեցնել բարձրությունը" "Վիջեթի լայնությունը փոխվել է %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 457efce0db..6e8f46a2cd 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -130,8 +130,8 @@ "Kurangi tinggi" "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" "Pribadi" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 3b5dabacce..49843b668c 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -130,8 +130,8 @@ "Minnka hæð" "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ð" "Persónulegt" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 5d05f91190..5fc68a51b5 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -130,8 +130,8 @@ "Riduci altezza" "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" "Personali" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index ad6aec6653..806aeefb5c 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -132,8 +132,8 @@ "הקטן גובה" "גודל הווידג\'ט שונה - רוחב %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 8e3022b65e..baa59ab94e 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -130,8 +130,8 @@ "高さを低くする" "ウィジェットのサイズを幅%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 521ec80f8c..64c8573e12 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -130,8 +130,8 @@ "სიმაღლის შემცირება" "ვიჯეტის ზომები შეიცვალა: სიგანე %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 7ab73d95dd..2ad595458d 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -130,8 +130,8 @@ "Биіктігін азайту" "Виджет өлшемінің ені %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 582bb33dd2..e3659c99ff 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -130,8 +130,8 @@ "បន្ថយកម្ពស់" "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %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 56ebe0a9bb..7a68378d2a 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -130,8 +130,8 @@ "ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ" "ವಿಜೆಟ್ ಅನ್ನು %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 4ec01d85d9..4a6f3faa10 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -130,8 +130,8 @@ "높이 줄이기" "폭 %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 502a08a3e1..ce0dc3f866 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -130,8 +130,8 @@ "Жапыздатуу" "Виджеттин кеңдиги %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 cd2c933c15..a195eaf97f 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -130,8 +130,8 @@ "ຫຼຸດ​ລວງ​ສູງ​ລົງ" "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %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 d6358948b4..ac8684c012 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -132,8 +132,8 @@ "Sumažinti aukštį" "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" "Asmeninės" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 0584affb80..0ed4093184 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -131,8 +131,8 @@ "Samazināt augstumu" "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" "Personīgās lietotnes" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 54d9c8054a..3a033153e4 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -130,8 +130,8 @@ "Намали висина" "Големината на виџетот е променета на ширина %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 a0609333c9..7ad2803df9 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -130,8 +130,8 @@ "ഉയരം കുറയ്‌ക്കുക" "വീതി %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 a3507c5bb8..3dcc49542b 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -130,8 +130,8 @@ "Намсгах" "Виджэтийн өргөн %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 bf1e188058..7b9aebd8a8 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -130,8 +130,8 @@ "उंची कमी करा" "विजेटचा आकार रुंदी %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 3c223b6334..ea178b89d7 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -130,8 +130,8 @@ "Kurangkan ketinggian" "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" "Peribadi" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 59ac4cad35..315ebf5700 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -130,8 +130,8 @@ "အမြင့်အား လျှော့ပါ" "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 04d0b521e9..d5beead867 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -130,8 +130,8 @@ "Reduser høyden" "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" "Personlig" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index a8a64f1bbc..f44c47bd90 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -130,8 +130,8 @@ "उँचाइ घटाउनुहोस्" "विजेट चौडाइ %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 97e576c1c5..e1c059ad48 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -130,8 +130,8 @@ "Hoogte verkleinen" "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" "Privé" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index 3cda2919bd..9152b43c45 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -130,8 +130,8 @@ "ଉଚ୍ଚତା କମ୍‌ କରନ୍ତୁ" "ୱିଜେଟକୁ %1$s ଓସାର ଓ %2$s ଉଚ୍ଚରେ ପୁନଃଆକାର ଦିଆଗଲା" "ଶର୍ଟକଟ୍‍" - "%2$s ପାଇଁ %1$dଟି ଶର୍ଟକଟ୍‌" - "%3$s ପାଇଁ %1$dଟି ଶର୍ଟକଟ୍‌ ଏବଂ %2$dଟି ବିଜ୍ଞପ୍ତି" + + "ଖାରଜ କରନ୍ତୁ" "ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା" "ବ୍ୟକ୍ତିଗତ" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index c0778690ad..237e5190af 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -130,8 +130,8 @@ "ਉਂਚਾਈ ਘਟਾਓ" "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %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 67630827c0..65de77703c 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -132,8 +132,8 @@ "Zmniejsz wysokość" "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" "Osobiste" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 8448ae0481..48dcebb425 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -130,8 +130,8 @@ "Diminuir altura" "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" "Pessoal" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 754871e249..25bde0add8 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -130,8 +130,8 @@ "Diminuir altura" "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" "Pessoais" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 5382a29a02..74809dde43 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -132,8 +132,8 @@ "Уменьшить высоту" "Изменен размер виджета: до %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 37881971bd..cbffd1b25b 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -132,8 +132,8 @@ "Znížiť výšku" "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é" "Osobné" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 6b4e4a5be1..df934cd2fd 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -132,8 +132,8 @@ "Zmanjšanje višine" "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" "Osebno" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 82cc42a169..ef7cde70e5 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -130,8 +130,8 @@ "Zvogëlo lartësinë" "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" "Personale" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 9a6081e70e..d4223a8a1e 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -131,8 +131,8 @@ "Смањи висину" "Величина виџета је промењена на ширину %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 90f76db089..2fda5e24a6 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -130,8 +130,8 @@ "Minska höjden" "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" "Privat" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index d23c891390..5981b8684f 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -132,8 +132,8 @@ "Punguza urefu" "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" "Binafsi" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index a51247c2de..5ff5ecc44b 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -130,8 +130,8 @@ "உயரத்தைக் குறை" "அகலம் %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 bffb1a8700..0967119eae 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -130,8 +130,8 @@ "ఎత్తును తగ్గించు" "విడ్జెట్ పరిమాణం వెడల్పు %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 e4ac9989a4..52ea7521ed 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -130,8 +130,8 @@ "ลดความสูง" "ปรับขนาดของวิดเจ็ตเป็นกว้าง %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 5f0ba6f0da..0047aaeb30 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -130,8 +130,8 @@ "Bawasan ang taas" "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" "Personal" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 3cae0d6c6e..cfa9f9eaf3 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -130,8 +130,8 @@ "Yüksekliği azalt" "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ı" "Kişisel" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index e510192d91..aa5c676b1a 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -132,8 +132,8 @@ "Зменшити висоту" "Розміри віджета змінено на %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 77aa0a1eb5..d8e339df07 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -130,8 +130,8 @@ "اونچائی کم کریں" "ویجیٹ کے سائز کو چوڑائی %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 0360a7132a..6b53e9657f 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -130,8 +130,8 @@ "Bo‘yini kichraytirish" "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" "Shaxsiy" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 52d396e99f..ab88cfec6e 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -130,8 +130,8 @@ "Giảm chiều cao" "Đã đổ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" "Cá nhân" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index dc3bc1faf6..a92208c83d 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -130,8 +130,8 @@ "减小高度" "微件尺寸已调整为:宽度 %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 b1a8d9d5fb..0f253003b5 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -130,8 +130,8 @@ "減少高度" "已調整小工具的大小至闊 %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 d8473b61a6..c187b968b7 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -130,8 +130,8 @@ "減少高度" "已將小工具的寬度和高度分別調整為 %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 852441f32b..6f92847c1c 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -130,8 +130,8 @@ "Nciphisa ubude" "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" "Okomuntu siqu" -- GitLab From ff94b044cf221df0b1cc4087a0dd171225ae9ed5 Mon Sep 17 00:00:00 2001 From: Tony Mak Date: Mon, 9 Apr 2018 17:54:13 +0100 Subject: [PATCH 0010/1301] Show discovery bounce after work profile is created BUG: 72804698 Change-Id: Ifa59ed5d82d12eb65323e86af9c8db2c3e9920a3 --- .../android/launcher3/allapps/DiscoveryBounce.java | 12 ++++++++++-- .../allapps/PersonalWorkSlidingTabStrip.java | 2 +- .../android/launcher3/compat/UserManagerCompat.java | 2 ++ .../launcher3/compat/UserManagerCompatVL.java | 10 ++++++++++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/allapps/DiscoveryBounce.java b/src/com/android/launcher3/allapps/DiscoveryBounce.java index e8c5f15df9..48fdd73bee 100644 --- a/src/com/android/launcher3/allapps/DiscoveryBounce.java +++ b/src/com/android/launcher3/allapps/DiscoveryBounce.java @@ -111,7 +111,8 @@ public class DiscoveryBounce extends AbstractFloatingView { private static void showForHomeIfNeeded(Launcher launcher, boolean withDelay) { if (!launcher.isInState(NORMAL) - || launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false) + || (launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false) + && !shouldShowForWorkProfile(launcher)) || AbstractFloatingView.getTopOpenView(launcher) != null || UserManagerCompat.getInstance(launcher).isDemoUser() || ActivityManager.isRunningInTestHarness()) { @@ -138,7 +139,8 @@ public class DiscoveryBounce extends AbstractFloatingView { || !launcher.hasBeenResumed() || launcher.isForceInvisible() || launcher.getDeviceProfile().isVerticalBarLayout() - || launcher.getSharedPrefs().getBoolean(SHELF_BOUNCE_SEEN, false) + || (launcher.getSharedPrefs().getBoolean(SHELF_BOUNCE_SEEN, false) + && !shouldShowForWorkProfile(launcher)) || UserManagerCompat.getInstance(launcher).isDemoUser() || ActivityManager.isRunningInTestHarness()) { return; @@ -174,4 +176,10 @@ public class DiscoveryBounce extends AbstractFloatingView { view.mIsOpen = true; launcher.getDragLayer().addView(view); } + + private static boolean shouldShowForWorkProfile(Launcher launcher) { + return !launcher.getSharedPrefs().getBoolean( + PersonalWorkSlidingTabStrip.KEY_SHOWED_PEEK_WORK_TAB, false) + && UserManagerCompat.getInstance(launcher).hasWorkProfile(); + } } diff --git a/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java b/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java index a916697bf0..31c5914b81 100644 --- a/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java +++ b/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java @@ -39,7 +39,7 @@ public class PersonalWorkSlidingTabStrip extends LinearLayout implements PageInd private static final int POSITION_PERSONAL = 0; private static final int POSITION_WORK = 1; - private static final String KEY_SHOWED_PEEK_WORK_TAB = "showed_peek_work_tab"; + public static final String KEY_SHOWED_PEEK_WORK_TAB = "showed_peek_work_tab"; private final Paint mSelectedIndicatorPaint; private final Paint mDividerPaint; diff --git a/src/com/android/launcher3/compat/UserManagerCompat.java b/src/com/android/launcher3/compat/UserManagerCompat.java index 03e3861eae..ad5147734e 100644 --- a/src/com/android/launcher3/compat/UserManagerCompat.java +++ b/src/com/android/launcher3/compat/UserManagerCompat.java @@ -64,4 +64,6 @@ public abstract class UserManagerCompat { public abstract boolean isDemoUser(); public abstract boolean requestQuietModeEnabled(boolean enableQuietMode, UserHandle user); public abstract boolean isAnyProfileQuietModeEnabled(); + + public abstract boolean hasWorkProfile(); } diff --git a/src/com/android/launcher3/compat/UserManagerCompatVL.java b/src/com/android/launcher3/compat/UserManagerCompatVL.java index 1ff69818a9..eec3438496 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVL.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java @@ -119,6 +119,16 @@ public class UserManagerCompatVL extends UserManagerCompat { return users == null ? Collections.emptyList() : users; } + @Override + public boolean hasWorkProfile() { + synchronized (this) { + if (mUsers != null) { + return mUsers.size() > 1; + } + } + return getUserProfiles().size() > 1; + } + @Override public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) { if (user == null) { -- GitLab From 1117bdd7c24169481c57c756a8beadcca511b958 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 23 May 2018 14:00:26 -0700 Subject: [PATCH 0011/1301] Import translations. DO NOT MERGE Change-Id: I14967d93f4762c4efdaf689bb2e3ca42423140bb Auto-generated-cl: translation import --- quickstep/res/values-af/strings.xml | 3 +-- quickstep/res/values-am/strings.xml | 3 +-- quickstep/res/values-ar/strings.xml | 3 +-- quickstep/res/values-as/strings.xml | 3 +-- quickstep/res/values-az/strings.xml | 3 +-- quickstep/res/values-b+sr+Latn/strings.xml | 3 +-- quickstep/res/values-be/strings.xml | 3 +-- quickstep/res/values-bg/strings.xml | 3 +-- quickstep/res/values-bn/strings.xml | 3 +-- quickstep/res/values-bs/strings.xml | 3 +-- quickstep/res/values-ca/strings.xml | 3 +-- quickstep/res/values-cs/strings.xml | 3 +-- quickstep/res/values-da/strings.xml | 3 +-- quickstep/res/values-de/strings.xml | 3 +-- quickstep/res/values-el/strings.xml | 3 +-- quickstep/res/values-en-rAU/strings.xml | 1 + quickstep/res/values-en-rGB/strings.xml | 1 + quickstep/res/values-en-rIN/strings.xml | 1 + quickstep/res/values-es-rUS/strings.xml | 3 +-- quickstep/res/values-es/strings.xml | 3 +-- quickstep/res/values-et/strings.xml | 3 +-- quickstep/res/values-eu/strings.xml | 3 +-- quickstep/res/values-fa/strings.xml | 3 +-- quickstep/res/values-fi/strings.xml | 3 +-- quickstep/res/values-fr-rCA/strings.xml | 3 +-- quickstep/res/values-fr/strings.xml | 3 +-- quickstep/res/values-gl/strings.xml | 3 +-- quickstep/res/values-gu/strings.xml | 3 +-- quickstep/res/values-hi/strings.xml | 3 +-- quickstep/res/values-hr/strings.xml | 3 +-- quickstep/res/values-hu/strings.xml | 3 +-- quickstep/res/values-hy/strings.xml | 3 +-- quickstep/res/values-in/strings.xml | 3 +-- quickstep/res/values-is/strings.xml | 3 +-- quickstep/res/values-it/strings.xml | 3 +-- quickstep/res/values-iw/strings.xml | 3 +-- quickstep/res/values-ja/strings.xml | 3 +-- quickstep/res/values-ka/strings.xml | 3 +-- quickstep/res/values-kk/strings.xml | 3 +-- quickstep/res/values-km/strings.xml | 3 +-- quickstep/res/values-kn/strings.xml | 3 +-- quickstep/res/values-ko/strings.xml | 3 +-- quickstep/res/values-ky/strings.xml | 3 +-- quickstep/res/values-lo/strings.xml | 3 +-- quickstep/res/values-lt/strings.xml | 3 +-- quickstep/res/values-lv/strings.xml | 3 +-- quickstep/res/values-mk/strings.xml | 3 +-- quickstep/res/values-ml/strings.xml | 3 +-- quickstep/res/values-mn/strings.xml | 3 +-- quickstep/res/values-mr/strings.xml | 3 +-- quickstep/res/values-ms/strings.xml | 3 +-- quickstep/res/values-my/strings.xml | 3 +-- quickstep/res/values-nb/strings.xml | 3 +-- quickstep/res/values-ne/strings.xml | 3 +-- quickstep/res/values-nl/strings.xml | 3 +-- quickstep/res/values-or/strings.xml | 3 +-- quickstep/res/values-pa/strings.xml | 3 +-- quickstep/res/values-pl/strings.xml | 3 +-- quickstep/res/values-pt-rPT/strings.xml | 3 +-- quickstep/res/values-pt/strings.xml | 3 +-- quickstep/res/values-ro/strings.xml | 1 + quickstep/res/values-ru/strings.xml | 3 +-- quickstep/res/values-si/strings.xml | 1 + quickstep/res/values-sk/strings.xml | 3 +-- quickstep/res/values-sl/strings.xml | 3 +-- quickstep/res/values-sq/strings.xml | 3 +-- quickstep/res/values-sr/strings.xml | 3 +-- quickstep/res/values-sv/strings.xml | 3 +-- quickstep/res/values-sw/strings.xml | 3 +-- quickstep/res/values-ta/strings.xml | 3 +-- quickstep/res/values-te/strings.xml | 3 +-- quickstep/res/values-th/strings.xml | 3 +-- quickstep/res/values-tl/strings.xml | 3 +-- quickstep/res/values-tr/strings.xml | 3 +-- quickstep/res/values-uk/strings.xml | 3 +-- quickstep/res/values-ur/strings.xml | 3 +-- quickstep/res/values-uz/strings.xml | 3 +-- quickstep/res/values-vi/strings.xml | 3 +-- quickstep/res/values-zh-rCN/strings.xml | 3 +-- quickstep/res/values-zh-rHK/strings.xml | 3 +-- quickstep/res/values-zh-rTW/strings.xml | 3 +-- quickstep/res/values-zu/strings.xml | 3 +-- res/values-af/strings.xml | 5 +++-- res/values-am/strings.xml | 5 +++-- res/values-ar/strings.xml | 5 +++-- res/values-as/strings.xml | 7 +++++-- res/values-az/strings.xml | 5 +++-- res/values-b+sr+Latn/strings.xml | 5 +++-- res/values-be/strings.xml | 5 +++-- res/values-bg/strings.xml | 5 +++-- res/values-bn/strings.xml | 7 +++++-- res/values-bs/strings.xml | 5 +++-- res/values-ca/strings.xml | 5 +++-- res/values-cs/strings.xml | 5 +++-- res/values-da/strings.xml | 5 +++-- res/values-de/strings.xml | 5 +++-- res/values-el/strings.xml | 5 +++-- res/values-en-rAU/strings.xml | 5 +++-- res/values-en-rGB/strings.xml | 5 +++-- res/values-en-rIN/strings.xml | 5 +++-- res/values-es-rUS/strings.xml | 5 +++-- res/values-es/strings.xml | 5 +++-- res/values-et/strings.xml | 5 +++-- res/values-eu/strings.xml | 5 +++-- res/values-fa/strings.xml | 5 +++-- res/values-fi/strings.xml | 5 +++-- res/values-fr-rCA/strings.xml | 5 +++-- res/values-fr/strings.xml | 5 +++-- res/values-gl/strings.xml | 5 +++-- res/values-gu/strings.xml | 7 +++++-- res/values-hi/strings.xml | 7 +++++-- res/values-hr/strings.xml | 5 +++-- res/values-hu/strings.xml | 5 +++-- res/values-hy/strings.xml | 5 +++-- res/values-in/strings.xml | 5 +++-- res/values-is/strings.xml | 5 +++-- res/values-it/strings.xml | 5 +++-- res/values-iw/strings.xml | 5 +++-- res/values-ja/strings.xml | 5 +++-- res/values-ka/strings.xml | 5 +++-- res/values-kk/strings.xml | 5 +++-- res/values-km/strings.xml | 5 +++-- res/values-kn/strings.xml | 7 +++++-- res/values-ko/strings.xml | 5 +++-- res/values-ky/strings.xml | 5 +++-- res/values-lo/strings.xml | 5 +++-- res/values-lt/strings.xml | 5 +++-- res/values-lv/strings.xml | 5 +++-- res/values-mk/strings.xml | 5 +++-- res/values-ml/strings.xml | 7 +++++-- res/values-mn/strings.xml | 5 +++-- res/values-mr/strings.xml | 5 +++-- res/values-ms/strings.xml | 5 +++-- res/values-my/strings.xml | 5 +++-- res/values-nb/strings.xml | 5 +++-- res/values-ne/strings.xml | 7 +++++-- res/values-nl/strings.xml | 5 +++-- res/values-or/strings.xml | 7 +++++-- res/values-pa/strings.xml | 7 +++++-- res/values-pl/strings.xml | 5 +++-- res/values-pt-rPT/strings.xml | 5 +++-- res/values-pt/strings.xml | 5 +++-- res/values-ro/strings.xml | 5 +++-- res/values-ru/strings.xml | 5 +++-- res/values-si/strings.xml | 5 +++-- res/values-sk/strings.xml | 5 +++-- res/values-sl/strings.xml | 5 +++-- res/values-sq/strings.xml | 5 +++-- res/values-sr/strings.xml | 5 +++-- res/values-sv/strings.xml | 5 +++-- res/values-sw/strings.xml | 5 +++-- res/values-ta/strings.xml | 7 +++++-- res/values-te/strings.xml | 7 +++++-- res/values-th/strings.xml | 5 +++-- res/values-tl/strings.xml | 5 +++-- res/values-tr/strings.xml | 5 +++-- res/values-uk/strings.xml | 5 +++-- res/values-ur/strings.xml | 7 +++++-- res/values-uz/strings.xml | 5 +++-- res/values-vi/strings.xml | 5 +++-- res/values-zh-rCN/strings.xml | 5 +++-- res/values-zh-rHK/strings.xml | 5 +++-- res/values-zh-rTW/strings.xml | 7 ++++--- res/values-zu/strings.xml | 5 +++-- 164 files changed, 353 insertions(+), 319 deletions(-) diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index b33456d31c..8ae493fb6e 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -25,6 +25,5 @@ "Geen onlangse items nie" "Maak toe" "Vee alles uit" - - + "Onlangse programme" diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml index 2f303c078b..4ca0c67979 100644 --- a/quickstep/res/values-am/strings.xml +++ b/quickstep/res/values-am/strings.xml @@ -25,6 +25,5 @@ "ምንም የቅርብ ጊዜ ንጥሎች የሉም" "ዝጋ" "ሁሉንም አጽዳ" - - + "የቅርብ ጊዜ መተግበሪያዎች" diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index e22bef47e5..c04b618699 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -25,6 +25,5 @@ "ليست هناك عناصر تم استخدامها مؤخرًا" "إغلاق" "محو الكل" - - + "التطبيقات التي تمّ استخدامها مؤخرًا" diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml index 7294f142dd..812a24649a 100644 --- a/quickstep/res/values-as/strings.xml +++ b/quickstep/res/values-as/strings.xml @@ -25,6 +25,5 @@ "কোনো শেহতীয়া বস্তু নাই" "বন্ধ কৰক" "সকলো মচক" - - + "শেহতীয়া এপসমূহ" diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml index 4c2f8ec717..832ed8c5f6 100644 --- a/quickstep/res/values-az/strings.xml +++ b/quickstep/res/values-az/strings.xml @@ -25,6 +25,5 @@ "Son elementlər yoxdur" "Bağlayın" "Hamısını silin" - - + "Son tətbiqlər" diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml index bf66aef80e..fc4c8c0d08 100644 --- a/quickstep/res/values-b+sr+Latn/strings.xml +++ b/quickstep/res/values-b+sr+Latn/strings.xml @@ -25,6 +25,5 @@ "Nema nedavnih stavki" "Zatvori" "Obriši sve" - - + "Nedavne aplikacije" diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml index 48ed4c579b..c5d03d47a5 100644 --- a/quickstep/res/values-be/strings.xml +++ b/quickstep/res/values-be/strings.xml @@ -25,6 +25,5 @@ "Няма новых элементаў" "Закрыць" "Ачысціць усё" - - + "Нядаўнія праграмы" diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml index 30308ad0ca..2672b83653 100644 --- a/quickstep/res/values-bg/strings.xml +++ b/quickstep/res/values-bg/strings.xml @@ -25,6 +25,5 @@ "Няма скорошни елементи" "Затваряне" "Изчистване на всички" - - + "Скорошни приложения" diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml index 80eb639056..0a824c2dd1 100644 --- a/quickstep/res/values-bn/strings.xml +++ b/quickstep/res/values-bn/strings.xml @@ -25,6 +25,5 @@ "কোনো সাম্প্রতিক আইটেম নেই" "বন্ধ করুন" "সবকিছু খালি করুন" - - + "সম্প্রতি ব্যবহৃত অ্যাপ" diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index 201f46144b..6bf38eba15 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -25,6 +25,5 @@ "Nema nedavnih stavki" "Zatvaranje" "Obriši sve" - - + "Nedavne aplikacije" diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml index c6b93e3712..2d51703ae4 100644 --- a/quickstep/res/values-ca/strings.xml +++ b/quickstep/res/values-ca/strings.xml @@ -25,6 +25,5 @@ "No hi ha cap element recent" "Tanca" "Esborra-ho tot" - - + "Aplicacions recents" diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml index 023244c554..a178df08b4 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -25,6 +25,5 @@ "Žádné nedávné položky" "Zavřít" "Vymazat vše" - - + "Poslední aplikace" diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index 5d1e763732..d0d629f5a1 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -25,6 +25,5 @@ "Ingen nye elementer" "Luk" "Ryd alt" - - + "Seneste apps" diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index cf2f1940ac..aee8b85b8c 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -25,6 +25,5 @@ "Keine kürzlich verwendeten Elemente" "Schließen" "Alle Apps schließen" - - + "Zuletzt aktive Apps" diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index 9cf05763d6..7364b82823 100644 --- a/quickstep/res/values-el/strings.xml +++ b/quickstep/res/values-el/strings.xml @@ -25,6 +25,5 @@ "Δεν υπάρχουν πρόσφατα στοιχεία" "Κλείσιμο" "Διαγραφή όλων" - - + "Πρόσφατες εφαρμογές" diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml index 61d031b5d0..d0dc1e8cb8 100644 --- a/quickstep/res/values-en-rAU/strings.xml +++ b/quickstep/res/values-en-rAU/strings.xml @@ -25,4 +25,5 @@ "No recent items" "Close" "Clear all" + "Recent apps" diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml index 61d031b5d0..d0dc1e8cb8 100644 --- a/quickstep/res/values-en-rGB/strings.xml +++ b/quickstep/res/values-en-rGB/strings.xml @@ -25,4 +25,5 @@ "No recent items" "Close" "Clear all" + "Recent apps" diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml index 61d031b5d0..d0dc1e8cb8 100644 --- a/quickstep/res/values-en-rIN/strings.xml +++ b/quickstep/res/values-en-rIN/strings.xml @@ -25,4 +25,5 @@ "No recent items" "Close" "Clear all" + "Recent apps" diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml index 320892abae..83e9d96aa1 100644 --- a/quickstep/res/values-es-rUS/strings.xml +++ b/quickstep/res/values-es-rUS/strings.xml @@ -25,6 +25,5 @@ "No hay elementos recientes" "Cerrar" "Borrar todo" - - + "Apps recientes" diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml index abccec881b..e076df56ef 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -25,6 +25,5 @@ "No hay elementos recientes" "Cerrar" "Borrar todo" - - + "Aplicaciones recientes" diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml index 5143406ce1..85de9c0ab7 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -25,6 +25,5 @@ "Hiljutisi üksusi pole" "Sule" "Sule kõik" - - + "Hiljutised rakendused" diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index 879aa28ceb..60943ccc4f 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -25,6 +25,5 @@ "Ez dago azkenaldi honetako ezer" "Itxi" "Garbitu guztiak" - - + "Azken aplikazioak" diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml index b76e9a5656..4a30daa30c 100644 --- a/quickstep/res/values-fa/strings.xml +++ b/quickstep/res/values-fa/strings.xml @@ -25,6 +25,5 @@ "بدون موارد اخیر" "بستن" "پاک کردن همه" - - + "برنامه‌های اخیر" diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml index bbfaa11e10..8f4135001f 100644 --- a/quickstep/res/values-fi/strings.xml +++ b/quickstep/res/values-fi/strings.xml @@ -25,6 +25,5 @@ "Ei viimeaikaisia kohteita" "Sulje" "Poista kaikki" - - + "Viimeisimmät sovellukset" diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml index 7cad9fca95..7177996415 100644 --- a/quickstep/res/values-fr-rCA/strings.xml +++ b/quickstep/res/values-fr-rCA/strings.xml @@ -25,6 +25,5 @@ "Aucun élément récent" "Fermer" "Tout effacer" - - + "Applications récentes" diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index 078ab2b5cd..0deb00bc35 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -25,6 +25,5 @@ "Aucun élément récent" "Fermer" "Tout effacer" - - + "Applications récentes" diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index 549d804771..8c217eb7bb 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -25,6 +25,5 @@ "Non hai elementos recentes" "Pecha a aplicación" "Borrar todo" - - + "Aplicacións recentes" diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index 27235f2bcf..8b9a538ed1 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -25,6 +25,5 @@ "તાજેતરની કોઈ આઇટમ નથી" "બંધ કરો" "બધું સાફ કરો" - - + "તાજેતરની ઍપ" diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml index 46b404f529..83c31e78da 100644 --- a/quickstep/res/values-hi/strings.xml +++ b/quickstep/res/values-hi/strings.xml @@ -25,6 +25,5 @@ "हाल ही में इस्तेमाल किया गया कोई ऐप्लिकेशन नहीं है" "बंद करें" "सभी ऐप्लिकेशन बंद करें" - - + "हाल ही में इस्तेमाल किए गए एेप्लिकेशन" diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml index b8682608f2..baa8d85acb 100644 --- a/quickstep/res/values-hr/strings.xml +++ b/quickstep/res/values-hr/strings.xml @@ -25,6 +25,5 @@ "Nema nedavnih stavki" "Zatvori" "Izbriši sve" - - + "Nedavne aplikacije" diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml index 60cd6a1ddc..d971374774 100644 --- a/quickstep/res/values-hu/strings.xml +++ b/quickstep/res/values-hu/strings.xml @@ -25,6 +25,5 @@ "Nincsenek mostanában használt elemek" "Bezárás" "Összes törlése" - - + "Legutóbbi alkalmazások" diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml index c908263b6d..b4b9b98095 100644 --- a/quickstep/res/values-hy/strings.xml +++ b/quickstep/res/values-hy/strings.xml @@ -25,6 +25,5 @@ "Վերջին տարրեր չկան" "Փակել" "Փակել բոլորը" - - + "Վերջին օգտագործած հավելվածները" diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml index ff6267c9b3..787c14338e 100644 --- a/quickstep/res/values-in/strings.xml +++ b/quickstep/res/values-in/strings.xml @@ -25,6 +25,5 @@ "Tidak ada item yang baru dibuka" "Tutup" "Hapus semua" - - + "Aplikasi baru-baru ini" diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml index bbb460729c..1aface0c90 100644 --- a/quickstep/res/values-is/strings.xml +++ b/quickstep/res/values-is/strings.xml @@ -25,6 +25,5 @@ "Engin nýleg atriði" "Loka" "Hreinsa allt" - - + "Nýleg forrit" diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml index 6175a4720c..192ec44c72 100644 --- a/quickstep/res/values-it/strings.xml +++ b/quickstep/res/values-it/strings.xml @@ -25,6 +25,5 @@ "Nessun elemento recente" "Chiudi" "Cancella tutto" - - + "App recenti" diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index 9afb842e32..64c35ec116 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -25,6 +25,5 @@ "אין פריטים אחרונים" "סגירה" "ניקוי הכול" - - + "אפליקציות אחרונות" diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml index e478d4acc1..558112cded 100644 --- a/quickstep/res/values-ja/strings.xml +++ b/quickstep/res/values-ja/strings.xml @@ -25,6 +25,5 @@ "最近のアイテムはありません" "閉じる" "すべてクリア" - - + "最近使ったアプリ" diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml index 3d9726c790..5f061debb8 100644 --- a/quickstep/res/values-ka/strings.xml +++ b/quickstep/res/values-ka/strings.xml @@ -25,6 +25,5 @@ "ბოლოს გამოყენებული ერთეულები არ არის" "დახურვა" "ყველას გასუფთავება" - - + "ბოლოდროინდელი აპები" diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml index 80cab46bbd..3e72130f1f 100644 --- a/quickstep/res/values-kk/strings.xml +++ b/quickstep/res/values-kk/strings.xml @@ -25,6 +25,5 @@ "Соңғы элементтер жоқ" "Жабу" "Барлығын өшіру" - - + "Соңғы пайдаланылған қолданбалар" diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml index 36a9ad98db..6ae948258b 100644 --- a/quickstep/res/values-km/strings.xml +++ b/quickstep/res/values-km/strings.xml @@ -25,6 +25,5 @@ "មិនមានធាតុថ្មីៗទេ" "បិទ" "សម្អាត​ទាំងអស់" - - + "កម្មវិធី​ថ្មីៗ" diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml index 314638cab2..591418b9c2 100644 --- a/quickstep/res/values-kn/strings.xml +++ b/quickstep/res/values-kn/strings.xml @@ -25,6 +25,5 @@ "ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ" "ಮುಚ್ಚಿ" "ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ" - - + "ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು" diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml index 557ee4a01c..5b1ecbd2e7 100644 --- a/quickstep/res/values-ko/strings.xml +++ b/quickstep/res/values-ko/strings.xml @@ -25,6 +25,5 @@ "최근 항목이 없습니다." "닫기" "모두 삭제" - - + "최근 앱" diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml index 1575af6506..9f84037f7b 100644 --- a/quickstep/res/values-ky/strings.xml +++ b/quickstep/res/values-ky/strings.xml @@ -25,6 +25,5 @@ "Акыркы колдонмолор жок" "Жабуу" "Баарын тазалоо" - - + "Акыркы колдонмолор" diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml index 3e332be0b2..ed1cb6e849 100644 --- a/quickstep/res/values-lo/strings.xml +++ b/quickstep/res/values-lo/strings.xml @@ -25,6 +25,5 @@ "ບໍ່ມີລາຍການຫຼ້າສຸດ" "ປິດ" "ລຶບລ້າງທັງໝົດ" - - + "ແອັບຫຼ້າສຸດ" diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml index 4dd2680230..c16fc56bbd 100644 --- a/quickstep/res/values-lt/strings.xml +++ b/quickstep/res/values-lt/strings.xml @@ -25,6 +25,5 @@ "Nėra jokių naujausių elementų" "Uždaryti" "Išvalyti viską" - - + "Naujausios programos" diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml index 7eb385fa8d..2dee41c43a 100644 --- a/quickstep/res/values-lv/strings.xml +++ b/quickstep/res/values-lv/strings.xml @@ -25,6 +25,5 @@ "Nav nesenu vienumu." "Aizvērt" "Notīrīt visu" - - + "Pēdējās izmantotās lietotnes" diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml index 9e959d3170..ff16cea8cb 100644 --- a/quickstep/res/values-mk/strings.xml +++ b/quickstep/res/values-mk/strings.xml @@ -25,6 +25,5 @@ "Нема неодамнешни ставки" "Затвори" "Исчисти ги сите" - - + "Неодамнешни апликации" diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml index 1d7b927a9c..624aded2a3 100644 --- a/quickstep/res/values-ml/strings.xml +++ b/quickstep/res/values-ml/strings.xml @@ -25,6 +25,5 @@ "സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല" "അവസാനിപ്പിക്കുക" "എല്ലാം മായ്‌ക്കുക" - - + "സമീപകാല ആപ്പുകൾ" diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml index 5031388f96..f9021252bd 100644 --- a/quickstep/res/values-mn/strings.xml +++ b/quickstep/res/values-mn/strings.xml @@ -25,6 +25,5 @@ "Сүүлийн үеийн зүйл алга" "Хаах" "Бүгдийг устгах" - - + "Саяхны аппууд" diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index 939963e46e..7a669dd647 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -25,6 +25,5 @@ "कोणतेही अलीकडील आयटम नाहीत" "बंद" "सर्व साफ करा" - - + "अलीकडील अॅप्स" diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml index 0e93bf6c1a..699586373c 100644 --- a/quickstep/res/values-ms/strings.xml +++ b/quickstep/res/values-ms/strings.xml @@ -25,6 +25,5 @@ "Tiada item terbaharu" "Tutup" "Kosongkan semua" - - + "Apl terbaharu" diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml index ebffc3c3b4..ae6dc7d0a0 100644 --- a/quickstep/res/values-my/strings.xml +++ b/quickstep/res/values-my/strings.xml @@ -25,6 +25,5 @@ "မကြာမီကဖွင့်ထားသည်များ မရှိပါ" "ပိတ်ရန်" "အားလုံးကို ရှင်းရန်" - - + "လတ်တလောသုံး အက်ပ်များ" diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml index 97870b15cc..cb8ee10f8e 100644 --- a/quickstep/res/values-nb/strings.xml +++ b/quickstep/res/values-nb/strings.xml @@ -25,6 +25,5 @@ "Ingen nylige elementer" "Lukk" "Fjern alt" - - + "Nylige apper" diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml index c9a6c6b894..4efae7b080 100644 --- a/quickstep/res/values-ne/strings.xml +++ b/quickstep/res/values-ne/strings.xml @@ -25,6 +25,5 @@ "हालसालैको कुनै पनि वस्तु छैन" "बन्द गर्नुहोस्" "सबै खाली गर्नुहोस्" - - + "हालसालैका अनुप्रयोगहरू" diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml index e3acf0dc36..8ef2a5d5ce 100644 --- a/quickstep/res/values-nl/strings.xml +++ b/quickstep/res/values-nl/strings.xml @@ -25,6 +25,5 @@ "Geen recente items" "Sluiten" "Alles wissen" - - + "Recente apps" diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml index 5e5e420ff6..6895ef5f5f 100644 --- a/quickstep/res/values-or/strings.xml +++ b/quickstep/res/values-or/strings.xml @@ -25,6 +25,5 @@ "କୌଣସି ସାମ୍ପ୍ରତିକ ଆଇଟମ୍ ନାହିଁ" "ବନ୍ଦ କରନ୍ତୁ" "ସବୁ ଖାଲି କରନ୍ତୁ" - - + "ସାମ୍ପ୍ରତିକ ଆପ୍‌" diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml index fec9f03fbe..4159c30b3f 100644 --- a/quickstep/res/values-pa/strings.xml +++ b/quickstep/res/values-pa/strings.xml @@ -25,6 +25,5 @@ "ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ" "ਬੰਦ ਕਰੋ" "ਸਭ ਕਲੀਅਰ ਕਰੋ" - - + "ਹਾਲੀਆ ਐਪਾਂ" diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml index 54196e8465..cf15abd171 100644 --- a/quickstep/res/values-pl/strings.xml +++ b/quickstep/res/values-pl/strings.xml @@ -25,6 +25,5 @@ "Brak ostatnich elementów" "Zamknij" "Wyczyść wszystko" - - + "Ostatnie aplikacje" diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml index afc6295373..36c7e3c455 100644 --- a/quickstep/res/values-pt-rPT/strings.xml +++ b/quickstep/res/values-pt-rPT/strings.xml @@ -25,6 +25,5 @@ "Nenhum item recente" "Fechar" "Limpar tudo" - - + "Aplicações recentes" diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml index 9e43cd7c0a..41f53f0e98 100644 --- a/quickstep/res/values-pt/strings.xml +++ b/quickstep/res/values-pt/strings.xml @@ -25,6 +25,5 @@ "Nenhum item recente" "Fechar" "Limpar tudo" - - + "Apps recentes" diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml index a8889d4b4a..032d886fb1 100644 --- a/quickstep/res/values-ro/strings.xml +++ b/quickstep/res/values-ro/strings.xml @@ -25,4 +25,5 @@ "Niciun element recent" "Închideți" "Ștergeți tot" + "Aplicații recente" diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml index 832aa0aa19..6a218fc6b8 100644 --- a/quickstep/res/values-ru/strings.xml +++ b/quickstep/res/values-ru/strings.xml @@ -25,6 +25,5 @@ "Здесь пока ничего нет." "Закрыть" "Очистить все" - - + "Недавние приложения" diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml index 61bb8ba81c..c01211ac51 100644 --- a/quickstep/res/values-si/strings.xml +++ b/quickstep/res/values-si/strings.xml @@ -25,4 +25,5 @@ "මෑත අයිතම නැත" "වසන්න" "සියල්ල හිස් කරන්න" + "මෑත යෙදුම්" diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index da4585bf1d..2cd394208e 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -25,6 +25,5 @@ "Žiadne nedávne položky" "Zavrieť" "Vymazať všetko" - - + "Nedávne aplikácie" diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml index 6a25e9d834..06eb95d863 100644 --- a/quickstep/res/values-sl/strings.xml +++ b/quickstep/res/values-sl/strings.xml @@ -25,6 +25,5 @@ "Ni nedavnih elementov" "Zapri" "Počisti vse" - - + "Nedavne aplikacije" diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml index 521b8c75cc..00231e1340 100644 --- a/quickstep/res/values-sq/strings.xml +++ b/quickstep/res/values-sq/strings.xml @@ -25,6 +25,5 @@ "Nuk ka asnjë artikull të fundit" "Mbyll" "Pastroji të gjitha" - - + "Aplikacionet e fundit" diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml index 054cda5945..0077ee244c 100644 --- a/quickstep/res/values-sr/strings.xml +++ b/quickstep/res/values-sr/strings.xml @@ -25,6 +25,5 @@ "Нема недавних ставки" "Затвори" "Обриши све" - - + "Недавне апликације" diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml index 1a0ecc13e1..f05d79f2af 100644 --- a/quickstep/res/values-sv/strings.xml +++ b/quickstep/res/values-sv/strings.xml @@ -25,6 +25,5 @@ "Listan med de senaste åtgärderna är tom" "Stäng" "Rensa alla" - - + "Senaste apparna" diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml index be26e8bc66..e6ce953dbd 100644 --- a/quickstep/res/values-sw/strings.xml +++ b/quickstep/res/values-sw/strings.xml @@ -25,6 +25,5 @@ "Hakuna vipengee vya hivi karibuni" "Funga" "Ondoa zote" - - + "Programu za hivi karibuni" diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml index 886b017a8f..19518e1810 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -25,6 +25,5 @@ "சமீபத்தியவை எதுவுமில்லை" "மூடும்" "எல்லாம் அழி" - - + "சமீபத்திய ஆப்ஸ்" diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml index a0a818cf61..4c0e5ac563 100644 --- a/quickstep/res/values-te/strings.xml +++ b/quickstep/res/values-te/strings.xml @@ -25,6 +25,5 @@ "ఇటీవలి అంశాలు ఏవీ లేవు" "మూసివేయండి" "అన్నీ తీసివేయండి" - - + "ఇటీవలి యాప్‌లు" diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml index 5a162b729d..8dfda248c3 100644 --- a/quickstep/res/values-th/strings.xml +++ b/quickstep/res/values-th/strings.xml @@ -25,6 +25,5 @@ "ไม่มีรายการล่าสุด" "ปิด" "ล้างทั้งหมด" - - + "แอปล่าสุด" diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml index af7ff97fa7..ab3cac9dc2 100644 --- a/quickstep/res/values-tl/strings.xml +++ b/quickstep/res/values-tl/strings.xml @@ -25,6 +25,5 @@ "Walang kamakailang item" "Isara" "I-clear lahat" - - + "Mga kamakailang app" diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml index 760a61ffd5..9693413034 100644 --- a/quickstep/res/values-tr/strings.xml +++ b/quickstep/res/values-tr/strings.xml @@ -25,6 +25,5 @@ "Yeni öğe yok" "Kapat" "Tümünü temizle" - - + "Son uygulamalar" diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml index 41babaa879..2afcb31865 100644 --- a/quickstep/res/values-uk/strings.xml +++ b/quickstep/res/values-uk/strings.xml @@ -25,6 +25,5 @@ "Немає нещодавніх додатків" "Закрити" "Очистити все" - - + "Нещодавні додатки" diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml index 9dd7b8d33c..f493a2f64d 100644 --- a/quickstep/res/values-ur/strings.xml +++ b/quickstep/res/values-ur/strings.xml @@ -25,6 +25,5 @@ "کوئی حالیہ آئٹم نہیں" "بند کریں" "سبھی کو صاف کریں" - - + "حالیہ ایپس" diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index c78f000ca5..4911925984 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -25,6 +25,5 @@ "Yaqinda ishlatilgan ilovalar yo‘q" "Yopish" "Hammasini tozalash" - - + "Yaqinda ishlatilgan ilovalar" diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml index 4b1d1c0257..406faf5f8c 100644 --- a/quickstep/res/values-vi/strings.xml +++ b/quickstep/res/values-vi/strings.xml @@ -25,6 +25,5 @@ "Không có mục gần đây nào" "Đóng" "Xóa tất cả" - - + "Ứng dụng gần đây" diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml index 17cf6c31a1..71ac114979 100644 --- a/quickstep/res/values-zh-rCN/strings.xml +++ b/quickstep/res/values-zh-rCN/strings.xml @@ -25,6 +25,5 @@ "近期没有任何内容" "关闭" "全部清除" - - + "最近用过的应用" diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml index 1203cf01fc..ab29a91bfe 100644 --- a/quickstep/res/values-zh-rHK/strings.xml +++ b/quickstep/res/values-zh-rHK/strings.xml @@ -25,6 +25,5 @@ "最近沒有任何項目" "關閉" "全部清除" - - + "最近使用的應用程式" diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml index ed708b4950..1a9448c59f 100644 --- a/quickstep/res/values-zh-rTW/strings.xml +++ b/quickstep/res/values-zh-rTW/strings.xml @@ -25,6 +25,5 @@ "最近沒有任何項目" "關閉" "全部清除" - - + "最近使用的應用程式" diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml index 1aa34b6b6d..3d4f37250a 100644 --- a/quickstep/res/values-zu/strings.xml +++ b/quickstep/res/values-zu/strings.xml @@ -25,6 +25,5 @@ "Azikho izinto zakamuva" "Vala" "Sula konke" - - + "Izinhlelo zokusebenza zakamuva" diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 87924e79b3..35539e3608 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -108,6 +108,8 @@ "%1$s laai tans af, %2$s voltooid" "%1$s wag tans om te installeer" "%1$s-legstukke" + "Legstukkelys" + "Legstukkelys is toegemaak" "Voeg by tuisskerm" "Skuif item hierheen" "Item is by tuisskerm gevoeg" @@ -130,8 +132,7 @@ "Verminder hoogte" "Legstukgrootte is verander na breedte %1$s hoogte %2$s" "Kortpaaie" - - + "Kortpaaie en kennisgewings" "Maak toe" "Kennisgewing is toegemaak" "Persoonlik" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 46647c62d9..921fbd9162 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -108,6 +108,8 @@ "%1$s በመውረድ ላይ፣ %2$s ተጠናቋል" "%1$s ለመጫን በመጠበቅ ላይ" "%1$s ንዑስ ፕሮግራሞች" + "የመግብሮች ዝርዝር" + "የመግብሮች ዝርዝር ተዘግቷል" "ወደ መነሻ ማያ ገጽ ያክሉ" "ንጥልን ወደዚህ ውሰድ" "ወደ መነሻ ማያ ገጽ ንጥል ታክሏል" @@ -130,8 +132,7 @@ "ቁመት ይቀንሱ" "የመግብር መጠን ወደ ስፋት %1$s ቁመት %2$s ተለውጧል" "አቋራጮች" - - + "አቋራጮች እና ማሳወቂያዎች" "አሰናብት" "ማሳወቂያ ተሰናብቷል" "የግል" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index c094c3ad8b..ecf32d4f77 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -112,6 +112,8 @@ "جارٍ تنزيل %1$s، اكتمل %2$s" "%1$s في انتظار التثبيت" "أدوات %1$s" + "قائمة الأدوات" + "تم إغلاق قائمة الأدوات." "إضافة إلى الشاشة الرئيسية" "نقل العنصر إلى هنا" "تمت إضافة العنصر إلى الشاشة الرئيسية" @@ -134,8 +136,7 @@ "تقليل الارتفاع" "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" "الاختصارات" - - + "الاختصارات والإشعارات" "تجاهل" "تم تجاهل الإشعار" "شخصية" diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index 41deec31ec..5c896e4f24 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -108,6 +108,10 @@ "%1$s ডাউনল\'ড কৰি থকা হৈছে, %2$s সম্পূৰ্ণ হ\'ল" "%1$s ইনষ্টল হোৱালৈ অপেক্ষা কৰি থকা হৈছে" "%1$s ৱিজেট" + + + + "গৃহ স্ক্ৰীণত যোগ কৰক" "বস্তুটো ইয়ালৈ স্থানান্তৰ কৰক" "বস্তুটো গৃহ স্ক্ৰীণত যোগ কৰা হ\'ল" @@ -130,8 +134,7 @@ "উচ্চতা হ্ৰাস কৰক" "ৱিজেটৰ আকাৰ সলনি কৰি প্ৰস্থ %1$s আৰু উচ্চতা %2$s কৰা হ\'ল" "শ্বৰ্টকাটসমূহ" - - + "শ্বৰ্টকাট আৰু জাননীসমূহ" "অগ্ৰাহ্য কৰক" "জাননী অগ্ৰাহ্য কৰা হৈছে" "ব্যক্তিগত" diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index dd0f022a1b..3b36f37b25 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -108,6 +108,8 @@ "%1$s endirilir, %2$s tamamlandı" "%1$s yüklənmək üçün gözləyir" "%1$s vidcetləri" + "Vidcet siyahısı" + "Vidcet siyahısı bağlandı" "Əsas ekrana əlavə edin" "Elementi bura köçürün" "Element əsas ekrana əlavə edildi" @@ -130,8 +132,7 @@ "Hündürlüyü azaldın" "Vidcetin eni %1$s hündürlüyü %2$s kimi ölçüləndirildi" "Qısa yollar" - - + "Qısayol və bildirişlər" "Rədd edin" "Bildiriş rədd edildi" "Şəxsi" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 9a2062f84f..3fb8bf50c5 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -109,6 +109,8 @@ "%1$s se preuzima, završeno je %2$s" "%1$s čeka na instaliranje" "Vidžeti za %1$s" + "Lista vidžeta" + "Lista vidžeta je zatvorena" "Dodaj na početni ekran" "Premesti stavku ovde" "Stavka je dodata na početni ekran" @@ -131,8 +133,7 @@ "Smanji visinu" "Veličina vidžeta je promenjena na širinu %1$s i visinu %2$s" "Prečice" - - + "Prečice i obaveštenja" "Odbaci" "Obaveštenje je odbačeno" "Lične" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index ea312e7b18..59a8f1fa2b 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -110,6 +110,8 @@ "Ідзе спампоўка %1$s, %2$s завершана" "%1$s чакае ўсталёўкі" "Віджэты %1$s" + "Спіс віджэтаў" + "Спіс віджэтаў закрыты" "Дадаць на Галоўны экран" "Перамясціць элемент сюды" "Элемент дададзены на галоўны экран" @@ -132,8 +134,7 @@ "Паменшыць вышыню" "Памеры віджэта зменены на: шырыня %1$s, вышыня %2$s" "Ярлыкі" - - + "Ярлыкі і апавяшчэнні" "Адхіліць" "Апавяшчэнне адхілена" "Асабістыя" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 92000496d7..47825f6bd0 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -108,6 +108,8 @@ "%1$s се изтегля. Завършено: %2$s" "%1$s изчаква инсталиране" "Приспособления за %1$s" + "Списък с приспособления" + "Списъкът с приспособления е затворен" "Добавяне към началния екран" "Преместване на елемента тук" "Елементът е добавен към началния екран" @@ -130,8 +132,7 @@ "Намаляване на височината" "Приспособлението е преоразмерено към ширина %1$s и височина %2$s" "Преки пътища" - - + "Преки пътища и известия" "Отхвърляне" "Известието е отхвърлено" "Лични" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index b11fae9ad9..651f400ef6 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -108,6 +108,10 @@ "%1$s ডাউনলোড হচ্ছে %2$s সম্পন্ন হয়েছে" "%1$s ইনস্টলের অপেক্ষায় রয়েছে" "%1$s উইজেট" + + + + "হোম স্ক্রীনে যোগ করুন" "এখানে আইটেম সরান" "হোম স্ক্রীনে আইটেম যোগ করা হয়েছে" @@ -130,8 +134,7 @@ "উচ্চতা কমান" "উইজেটের আকার প্রস্থ %1$s উচ্চতা %2$s তে পরিবর্তন করা হয়েছে" "শর্টকাট" - - + "শর্টকাট এবং বিজ্ঞপ্তি" "খারিজ করুন" "বিজ্ঞপ্তি খারিজ করা হয়েছে" "ব্যক্তিগত" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 94d3ca0676..848176df02 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -109,6 +109,8 @@ "%1$s se preuzima, završeno %2$s" "%1$s čeka da se instalira" "Vidžeti za aplikaciju %1$s" + "Spisak vidžeta" + "Spisak vidžeta je zatvoren" "Dodaj na početni ekran" "Premjesti stavku ovdje" "Stavka je dodana na Početni ekran." @@ -131,8 +133,7 @@ "Smanji visinu" "Veličina vidžeta je promijenjena na širinu %1$s visinu %2$s" "Prečice" - - + "Prečice i obavještenja" "Odbaci" "Obavještenje je odbačeno" "Lične" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 2364e722e0..27f9c3132a 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -108,6 +108,8 @@ "S\'està baixant %1$s, %2$s completat" "S\'està esperant per instal·lar %1$s" "Widgets de: %1$s" + "Llista de widgets" + "S\'ha tancat la llista de widgets" "Afegeix a la pantalla d\'inici" "Mou l\'element aquí" "S\'ha afegit l\'element a la pantalla d\'inici" @@ -130,8 +132,7 @@ "Redueix l\'alçada" "S\'ha canviat la mida del widget a l\'amplada %1$s i l\'alçada %2$s" "Dreceres" - - + "Dreceres i notificacions" "Ignora" "S\'ha ignorat la notificació" "Personal" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index f84e437c1c..48adf44be5 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -110,6 +110,8 @@ "Stahování aplikace %1$s (dokončeno %2$s)" "Instalace aplikace %1$s čeká na zahájení" "Widgety %1$s" + "Seznam widgetů" + "Seznam widgetů zavřen" "Přidat na plochu" "Přesunout položku sem" "Položka byla přidána na plochu" @@ -132,8 +134,7 @@ "Snížit výšku" "Velikost widgetu upravena: šířka %1$s, výška %2$s" "Zkratky" - - + "Zkratky a oznámení" "Zavřít" "Oznámení bylo zavřeno" "Osobní" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 1d6984c757..d141ad9ff9 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -108,6 +108,8 @@ "%1$s downloades. %2$s er gennemført" "%1$s venter på at installere" "%1$s-widgets" + "Liste med widgets" + "Listen med widgets blev lukket" "Føj til startskærm" "Flyt elementet hertil" "Elementet er føjet til startskærmen" @@ -130,8 +132,7 @@ "Reducer højden" "Størrelsen for widgetten er ændret til bredde %1$s og højde %2$s" "Genveje" - - + "Genveje og underretninger" "Afvis" "Underretningen blev afvist" "Personlige" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index af07f1c8f0..c309a55689 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -108,6 +108,8 @@ "%1$s wird heruntergeladen, %2$s abgeschlossen" "Warten auf Installation von %1$s" "%1$s-Widgets" + "Widgetliste" + "Widgetliste geschlossen" "Zum Startbildschirm hinzufügen" "Element hierhin verschieben" "Element zum Startbildschirm hinzugefügt" @@ -130,8 +132,7 @@ "Höhe verringern" "Größe des Widgets zu Breite %1$s und Höhe %2$s geändert" "Verknüpfungen" - - + "Verknüpfungen und Benachrichtigungen" "Schließen" "Benachrichtigung geschlossen" "Privat" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 3de0aaf5ac..3208fcbd10 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -108,6 +108,8 @@ "Λήψη %1$s, ολοκληρώθηκε %2$s" "%1$s σε αναμονή για εγκατάσταση" "Γραφικά στοιχεία %1$s" + "Λίστα γραφικών στοιχείων" + "Η λίστα γραφικών στοιχείων έκλεισε" "Προσθήκη στην αρχική οθόνη" "Μετακίνηση στοιχείου εδώ" "Το στοιχείο προστέθηκε στην αρχική οθόνη" @@ -130,8 +132,7 @@ "Μείωση του ύψους" "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" "Συντομεύσεις" - - + "Συντομεύσεις και ειδοποιήσεις" "Παράβλεψη" "Η ειδοποίηση παραβλέφθηκε" "Προσωπικές" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index cca8e859da..245ee43580 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -108,6 +108,8 @@ "%1$s downloading, %2$s complete" "%1$s waiting to install" "%1$s widgets" + "Widgets list" + "Widgets list closed" "Add to Home screen" "Move item here" "Item added to home screen" @@ -130,8 +132,7 @@ "Decrease height" "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" + "Shortcuts and notifications" "Dismiss" "Notification dismissed" "Personal" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index cca8e859da..245ee43580 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -108,6 +108,8 @@ "%1$s downloading, %2$s complete" "%1$s waiting to install" "%1$s widgets" + "Widgets list" + "Widgets list closed" "Add to Home screen" "Move item here" "Item added to home screen" @@ -130,8 +132,7 @@ "Decrease height" "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" + "Shortcuts and notifications" "Dismiss" "Notification dismissed" "Personal" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index cca8e859da..245ee43580 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -108,6 +108,8 @@ "%1$s downloading, %2$s complete" "%1$s waiting to install" "%1$s widgets" + "Widgets list" + "Widgets list closed" "Add to Home screen" "Move item here" "Item added to home screen" @@ -130,8 +132,7 @@ "Decrease height" "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" + "Shortcuts and notifications" "Dismiss" "Notification dismissed" "Personal" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index f991da7f86..368e4ba633 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -108,6 +108,8 @@ "Se completó el %2$s de la descarga de %1$s" "Instalación de %1$s en espera" "Widgets de %1$s" + "Lista de widgets" + "Se cerró la lista de widgets" "Agregar a la pantalla principal" "Mover elemento aquí" "Se agregó el elemento a la pantalla principal." @@ -130,8 +132,7 @@ "Reducir la altura" "Se cambió la dimensión del widget a %1$s de ancho y %2$s de alto." "Accesos directos" - - + "Accesos directos y notificaciones" "Descartar" "Se descartó la notificación" "Personales" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 1dbe8e904d..0829533282 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -108,6 +108,8 @@ "Descargando %1$s (%2$s completado)" "Esperando para instalar %1$s" "Widgets de %1$s" + "Lista de widgets" + "Lista de widgets cerrada" "Añadir a la pantalla de inicio" "Mover elemento aquí" "Elemento añadido a la pantalla de inicio" @@ -130,8 +132,7 @@ "Reducir altura" "Se ha modificado el tamaño del widget a %1$s de ancho y %2$s de alto" "Accesos directos" - - + "Accesos directos y notificaciones" "Ignorar" "Notificación ignorada" "Personal" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 94b0103e61..1e5caa6427 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -108,6 +108,8 @@ "Rakenduse %1$s allalaadimine, %2$s on valmis" "%1$s on installimise ootel" "Teenuse %1$s vidinad" + "Vidinate loend" + "Vidinate loend on suletud" "Lisa avaekraanile" "Teisalda üksus siia" "Üksus lisati avaekraanile" @@ -130,8 +132,7 @@ "Vähenda kõrgust" "Vidina suurust muudeti. Laius: %1$s. Kõrgus: %2$s" "Otseteed" - - + "Otseteed ja märguanded" "Loobu" "Märguandest loobuti" "Isiklik" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index a13c49325a..b69228a294 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -108,6 +108,8 @@ "%1$s deskargatzen, %2$s osatuta" "%1$s instalatzeko zain" "%1$s widgetak" + "Widget-zerrenda" + "Itxi da widget-zerrenda" "Gehitu hasierako pantailan" "Ekarri elementua hona" "Gehitu da elementua hasierako pantailan" @@ -130,8 +132,7 @@ "Txikitu altuera" "Aldatu da widgetaren tamaina. Zabalera: %1$s. Altuera: %2$s." "Lasterbideak" - - + "Lasterbideak eta jakinarazpenak" "Baztertu" "Baztertu egin da jakinarazpena" "Pertsonalak" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index da12ebe7b3..aa06188f21 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -108,6 +108,8 @@ "درحال بارگیری %1$s، %2$s کامل شد" "%1$s درانتظار نصب" "ابزارک‌های %1$s" + "فهرست ابزارک‌ها" + "فهرست ابزارک‌ها بسته شد" "افزودن به صفحه اصلی" "انتقال مورد به اینجا" "مورد به صفحه اصلی اضافه شد" @@ -130,8 +132,7 @@ "کاهش ارتفاع" "اندازه ابزارک به عرض %1$s ارتفاع %2$s تغییر کرد" "میان‌برها" - - + "میان‌برها و اعلان‌ها" "رد کردن" "اعلان رد شد" "شخصی" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 96214d30ad..4b361ac3c4 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -108,6 +108,8 @@ "%1$s latautuu, valmiina %2$s" "%1$s odottaa asennusta" "Widgetit: %1$s" + "Widget-luettelo" + "Widget-luettelo suljettu" "Lisää aloitusnäytölle" "Siirrä kohde tänne" "Kohde lisättiin aloitusnäytölle." @@ -130,8 +132,7 @@ "Vähennä korkeutta" "Widgetin kokoa muutettiin. Sen leveys on nyt %1$s ja korkeus %2$s." "Pikakuvakkeet" - - + "Pikakuvakkeet ja ilmoitukset" "Hylkää" "Ilmoitus hylätty" "Henkilökohtaiset" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index aebb42df2f..29b003e081 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -108,6 +108,8 @@ "Téléchargement de %1$s : %2$s" "%1$s en attente d\'installation" "Widgets pour %1$s" + "Liste des widgets" + "Liste des widgets fermée" "Ajouter à l\'écran d\'accueil" "Déplacer l\'élément ici" "Élément ajouté à l\'écran d\'accueil" @@ -130,8 +132,7 @@ "Diminuer la hauteur" "Le widget a été redimensionné (largeur : %1$s, hauteur : %2$s)" "Raccourcis" - - + "Raccourcis et notifications" "Ignorer" "Notification ignorée" "Personnel" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 6c5c120690..d47ab427ca 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -108,6 +108,8 @@ "%1$s en cours de téléchargement, %2$s effectué(s)" "%1$s en attente d\'installation" "Widgets %1$s" + "Liste des widgets" + "La liste des widgets est fermée" "Ajouter à l\'écran d\'accueil" "Déplacer l\'élément ici" "L\'élément a bien été ajouté à l\'écran d\'accueil." @@ -130,8 +132,7 @@ "Diminuer la hauteur" "Le widget a bien été redimensionné (largeur : %1$s, hauteur : %2$s)." "Raccourcis" - - + "Raccourcis et notifications" "Ignorer" "Notification ignorée" "Personnelles" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 4dd7ae71b1..b94d693511 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -108,6 +108,8 @@ "Descargando %1$s (%2$s completado)" "Esperando para instalar %1$s" "Widgets de: %1$s" + "Lista de widgets" + "Pechouse a lista de widgets" "Engadir á pantalla de inicio" "Mover elemento aquí" "Engadiuse o elemento á pantalla de inicio" @@ -130,8 +132,7 @@ "Reducir altura" "Cambiouse o tamaño do widget polo ancho %1$s e a altura %2$s" "Atallos" - - + "Atallos e notificacións" "Ignorar" "Ignorouse a notificación" "Persoal" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index aa0b3af1f0..6468d8b753 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -108,6 +108,10 @@ "%1$s ડાઉનલોડ કરી રહ્યાં છે, %2$s પૂર્ણ" "%1$s, ઇન્સ્ટૉલ થવાની રાહ જોઈ રહ્યું છે" "%1$s વિજેટ" + + + + "હોમ સ્ક્રીન પર ઉમેરો" "આઇટમ અહીં ખસેડો" "હોમ સ્ક્રીનમાં આઇટમ ઉમેરી" @@ -130,8 +134,7 @@ "ઊંચાઈ ઘટાડો" "વિજેટનો આકાર બદલીને %1$s પહોળાઈ %2$s ઊંચાઈ કર્યો" "શૉર્ટકટ્સ" - - + "શૉર્ટકટ અને નોટિફિકેશનો" "છોડી દો" "સૂચના છોડી દીધી" "મનગમતી ઍપ" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 1b47fcbbea..1b5ce26794 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -108,6 +108,10 @@ "%1$s डाउनलोड हो रहा है, %2$s पूर्ण" "%1$s के इंस्टॉल होने की प्रतीक्षा की जा रही है" "%1$s विजेट" + + + + "होम स्‍क्रीन में जोड़ें" "आइटम यहां ले जाएं" "होम स्क्रीन में आइटम जोड़ा गया" @@ -130,8 +134,7 @@ "ऊंचाई घटाएं" "विजेट का आकार बदलकर उसकी चौड़ाई %1$s और ऊंचाई %2$s कर दी गई" "शॉर्टकट" - - + "शॉर्टकट और सूचनाएं" "खारिज करें" "सूचना को खारिज किया गया" "निजी ऐप" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 077da67e25..ea340d68a7 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -109,6 +109,8 @@ "Preuzimanje aplikacije %1$s, dovršeno %2$s" "Čekanje na instaliranje aplikacije %1$s" "%1$s widgeti" + "Popis widgeta" + "Popis widgeta zatvoren" "Dodavanje na početni zaslon" "Premjesti stavku ovdje" "Stavka je dodana na početni zaslon" @@ -131,8 +133,7 @@ "Smanjenje visine" "Širina widgeta promijenjena je na %1$s, a visina na %2$s" "Prečaci" - - + "Prečaci i obavijesti" "Odbaci" "Obavijest je odbačena" "Osobno" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 797bde44ad..7b8738186e 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -108,6 +108,8 @@ "A(z) %1$s letöltése, %2$s kész" "A(z) %1$s telepítésre vár" "%1$s-modulok" + "Widgetlista" + "Widgetlista bezárva" "Hozzáadás a kezdőképernyőhöz" "Elem áthelyezése ide" "Elem hozzáadva a kezdőképernyőhöz" @@ -130,8 +132,7 @@ "Magasság csökkentése" "Modul átméretezve %1$s szélességre és %2$s magasságra" "Gyorsparancsok" - - + "Parancsikonok és értesítések" "Elvetés" "Értesítés elvetve" "Személyes" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 79210f3a77..2b4a38bd7b 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -108,6 +108,8 @@ "%1$s–ի ներբեռնում (%2$s)" "%1$s-ի տեղադրման սպասում" "%1$s վիջեթներ" + "Վիջեթների ցանկ" + "Վիջեթների ցանկը փակվեց" "Ավելացնել Հիմնական էկրանին" "Տեղափոխել տարրն այստեղ" "Տարրն ավելացվեց հիմնական էկրանին" @@ -130,8 +132,7 @@ "Նվազեցնել բարձրությունը" "Վիջեթի լայնությունը փոխվել է %1$s-ի, իսկ բարձրությունը՝ %2$s-ի" "Դյուրանցումներ" - - + "Դյուրանցումներ և ծանուցումներ" "Անտեսել" "Ծանուցումը մերժված է" "Անձնական" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 6e8f46a2cd..78ffc96845 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -108,6 +108,8 @@ "%1$s sedang didownload, %2$s selesai" "%1$s menunggu dipasang" "Widget %1$s" + "Daftar widget" + "Daftar widget ditutup" "Tambahkan ke Layar Utama" "Pindahkan item ke sini" "Item ditambahkan ke layar utama" @@ -130,8 +132,7 @@ "Kurangi tinggi" "Widget diubah ukurannya menjadi lebar %1$s tinggi %2$s" "Pintasan" - - + "Pintasan dan notifikasi" "Tutup" "Notifikasi ditutup" "Pribadi" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 49843b668c..04842e4f4b 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -108,6 +108,8 @@ "%1$s í niðurhali, %2$s lokið" "%1$s bíður uppsetningar" "%1$s-græjur" + "Græjulisti" + "Græjulista lokað" "Bæta á heimaskjá" "Færa atriði hingað" "Atriði bætt á heimaskjáinn" @@ -130,8 +132,7 @@ "Minnka hæð" "Stærð græju breytt í %1$s á breidd og %2$s á hæð" "Flýtileiðir" - - + "Flýtileiðir og tilkynningar" "Hunsa" "Tilkynningu lokað" "Persónulegt" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 5fc68a51b5..28a8f93564 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -108,6 +108,8 @@ "Download di %1$s in corso, %2$s completato" "%1$s in attesa di installazione" "Widget di %1$s" + "Elenco di widget" + "Elenco di widget chiuso" "Aggiungi a schermata Home" "Sposta elemento qui" "Elemento aggiunto alla schermata Home" @@ -130,8 +132,7 @@ "Riduci altezza" "Widget ridimensionato a larghezza %1$s, altezza %2$s" "Scorciatoie" - - + "Scorciatoie e notifiche" "Ignora" "Notifica ignorata" "Personali" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 806aeefb5c..d4302c66c3 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -110,6 +110,8 @@ "מוריד את %1$s, %2$s הושלמו" "מחכה להתקנה של %1$s" "ווידג\'טים של %1$s" + "רשימת ווידג\'טים" + "רשימת הווידג\'טים נסגרה" "הוסף למסך דף הבית" "העבר את הפריט לכאן" "הפריט הועבר אל מסך דף הבית" @@ -132,8 +134,7 @@ "הקטן גובה" "גודל הווידג\'ט שונה - רוחב %1$s גובה %2$s" "קיצורי דרך" - - + "קיצורי דרך והודעות" "סגור" "ההודעה נסגרה" "אישיות" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index baa59ab94e..2598d1839e 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -108,6 +108,8 @@ "%1$sをダウンロード中、%2$s完了" "%1$sのインストール待ち" "%1$sのウィジェット" + "ウィジェット リスト" + "ウィジェット リストを閉じました" "ホーム画面に追加" "アイテムをここに移動" "アイテムをホーム画面に追加しました" @@ -130,8 +132,7 @@ "高さを低くする" "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" "ショートカット" - - + "ショートカットと通知" "表示しない" "通知を非表示にしました" "個人用" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 64c8573e12..3bdbab7423 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -108,6 +108,8 @@ "მიმდინარეობს %1$s-ის ჩამოტვირთვა, %2$s დასრულდა" "%1$s ელოდება ინსტალაციას" "%1$s-ის ვიჯეტები" + "ვიჯეტების სია" + "ვიჯეტების სია დაიხურა" "მთავარ ეკრანზე დამატება" "ერთეულის გადაადგილება აქ" "ერთეული დაემატა მთავარ ეკრანს" @@ -130,8 +132,7 @@ "სიმაღლის შემცირება" "ვიჯეტის ზომები შეიცვალა: სიგანე %1$s სიმაღლე %2$s" "მალსახმობები" - - + "მალსახმობები და შეტყობინებები" "დახურვა" "შეტყობინება დაიხურა" "პირადი" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 2ad595458d..98afcccfe0 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -108,6 +108,8 @@ "%1$s жүктелуде, %2$s аяқталды" "%1$s орнату күтілуде" "%1$s виджеті" + "Виджеттер тізімі" + "Видджеттер тізімі жабылды" "Негізгі экранға қосу" "Элементті мұнда жылжыту" "Элемент негізгі экранға қосылды" @@ -130,8 +132,7 @@ "Биіктігін азайту" "Виджет өлшемінің ені %1$s, биіктігі %2$s болып өзгертілді" "Таңбашалар" - - + "Таңбашалар мен хабарландырулар" "Бас тарту" "Хабарландырудан бас тартылды" "Жеке" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index e3659c99ff..ba8d775a62 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -108,6 +108,8 @@ "កំពុងដោនឡូត %1$s បានបញ្ចប់ %2$s" "%1$s កំពុងរង់ចាំការដំឡើង" "ធាតុ​ក្រាហ្វិក %1$s" + "បញ្ជីធាតុ​ក្រាហ្វិក" + "បាន​បិទ​បញ្ជីធាតុ​ក្រាហ្វិក" "បន្ថែមទៅអេក្រង់ដើម" "ផ្លាស់ធាតុមកទីនេះ" "ធាតុដែលត្រូវបានបន្ថែមទៅអេក្រង់ដើម" @@ -130,8 +132,7 @@ "បន្ថយកម្ពស់" "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %1$s កម្ពស់ប្រវែង %2$s" "ផ្លូវកាត់" - - + "ផ្លូវកាត់ និង​ការជូនដំណឹង" "បដិសេធ" "បាន​បដិសេធ​ការជូនដំណឹង" "ផ្ទាល់ខ្លួន" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 7a68378d2a..e73ff39da0 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -108,6 +108,10 @@ "%1$s ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ, %2$s ಪೂರ್ಣಗೊಂಡಿದೆ" "%1$s ಸ್ಥಾಪಿಸಲು ಕಾಯಲಾಗುತ್ತಿದೆ" "%1$s ವಿಜೆಟ್‌ಗಳು" + + + + "ಮುಖಪುಟಕ್ಕೆ ಸೇರಿಸು" "ಐಟಂ ಇಲ್ಲಿಗೆ ಸರಿಸಿ" "ಮುಖಪುಟ ಪರದೆಗೆ ಐಟಂ ಸೇರಿಸಲಾಗಿದೆ" @@ -130,8 +134,7 @@ "ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ" "ವಿಜೆಟ್ ಅನ್ನು %1$s ಅಗಲ %2$s ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ" "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" - - + "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು" "ವಜಾಗೊಳಿಸಿ" "ಅಧಿಸೂಚನೆಯನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ" "ವೈಯಕ್ತಿಕ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 4a6f3faa10..5e68b1733e 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -108,6 +108,8 @@ "%1$s 다운로드 중, %2$s 완료" "%1$s 설치 대기 중" "%1$s 위젯" + "위젯 목록" + "위젯 목록 닫힘" "홈 화면에 추가" "여기에 항목을 이동" "홈 화면에 항목 추가됨" @@ -130,8 +132,7 @@ "높이 줄이기" "폭 %1$s, 높이 %2$s로 위젯 크기 조정됨" "바로가기" - - + "바로가기 및 알림" "닫기" "알림이 해제되었습니다." "개인" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index ce0dc3f866..da7813e741 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -108,6 +108,8 @@ "%1$s жүктөлүп алынууда, %2$s аяктады" "%1$s орнотулушу күтүлүүдө" "%1$s виджеттери" + "Виджеттердин тизмеси" + "Виджеттердин тизмеси жабык" "Башкы экранга кошуу" "Бул нерсени бул жерге жылдыруу" "Башкы экранга кошулду" @@ -130,8 +132,7 @@ "Жапыздатуу" "Виджеттин кеңдиги %1$s бийиктиги %2$s болду" "Кыска жолдор" - - + "Кыска жолдор жана билдирмелер" "Этибарга албоо" "Эскертме көз жаздымда калтырылды" "Жеке колдонмолор" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index a195eaf97f..d0d127f996 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -108,6 +108,8 @@ "%1$s ກຳ​ລັງ​ດາວ​ໂຫຼດ, %2$s ສຳ​ເລັດ" "%1$s ກຳ​ລັງ​ລໍ​ຖ້າ​ຕິດ​ຕັ້ງ" "ວິດເຈັດ %1$s" + "ລາຍຊື່ວິດເຈັດ" + "ປິດລາຍຊື່ວິດເຈັດແລ້ວ" "ເພີ່ມໃສ່ໜ້າຈໍຫຼັກ" "Move item here" "ເພີ່ມ​ລາຍ​ການ​ໃສ່​ໜ້າ​ຈໍ​ຫຼັກ​ແລ້ວ" @@ -130,8 +132,7 @@ "ຫຼຸດ​ລວງ​ສູງ​ລົງ" "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %1$s ລວງ​ສູງ %2$s ແລ້ວ" "ທາງລັດ" - - + "ປຸ່ມລັດ ແລະ ການແຈ້ງເຕືອນ" "ປິດໄວ້" "ປິດການແຈ້ງເຕືອນແລ້ວ" "ສ່ວນຕົວ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index ac8684c012..c323fd838f 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -110,6 +110,8 @@ "Atsisiunčiama programa „%1$s“, %2$s baigta" "Laukiama, kol bus įdiegta programa „%1$s“" "„%1$s“ valdikliai" + "Valdiklių sąrašas" + "Valdiklių sąrašas uždarytas" "Pridėti prie pagrind. ekrano" "Perkelti elementą čia" "Elementas pridėtas prie pagrindinio ekrano" @@ -132,8 +134,7 @@ "Sumažinti aukštį" "Valdiklio dydis pakeistas: plotis – %1$s, aukštis – %2$s" "Spartieji klavišai" - - + "Spartieji klavišai ir pranešimai" "Atsisakyti" "Pranešimo atsisakyta" "Asmeninės" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 0ed4093184..be03811c9a 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -109,6 +109,8 @@ "Lietotnes %1$s lejupielāde (%2$s pabeigti)" "Notiek %1$s instalēšana" "%1$s logrīki" + "Logrīku saraksts" + "Logrīku saraksts aizvērts" "Pievienot sākuma ekrānam" "Pārvietot vienumu šeit" "Vienums pievienots sākuma ekrānam" @@ -131,8 +133,7 @@ "Samazināt augstumu" "Logrīka lielums mainīts — platums: %1$s, augstums: %2$s." "Saīsnes" - - + "Saīsnes un paziņojumi" "Nerādīt" "Paziņojums netiek rādīts" "Personīgās lietotnes" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 3a033153e4..e5dd02776b 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -108,6 +108,8 @@ "Се презема %1$s, %2$s завршено" "%1$s чека да се инсталира" "Виџети за %1$s" + "Список со виџети" + "Списокот со виџети е затворен" "Додај на Почетен екран" "Премести ја ставката овде" "Ставката е додадена на почетниот екран" @@ -130,8 +132,7 @@ "Намали висина" "Големината на виџетот е променета на ширина %1$s висина %2$s" "Кратенки" - - + "Кратенки и известувања" "Отфрли" "Известувањето е отфрлено" "Лично" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index 7ad2803df9..d6a2fd1a92 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -108,6 +108,10 @@ "%1$s ഡൗൺലോഡ് ചെയ്യുന്നു, %2$s പൂർത്തിയായി" "ഇൻസ്റ്റാൾ ചെയ്യാൻ %1$s കാക്കുന്നു" "%1$s വിജറ്റുകൾ" + + + + "ഹോം സ്ക്രീനിൽ ചേർക്കുക" "ഇനം ഇവിടേക്ക് നീക്കുക" "ഹോം സ്‌ക്രീനിൽ ഇനം ചേർത്തു" @@ -130,8 +134,7 @@ "ഉയരം കുറയ്‌ക്കുക" "വീതി %1$s ഉയരം %2$s-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി" "കുറുക്കുവഴികൾ" - - + "കുറുക്കുവഴികളും അറിയിപ്പുകളും" "നിരസിക്കുക" "അറിയിപ്പ് നിരസിച്ചു" "വ്യക്തിപരം" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 3dcc49542b..9fbb1e51e4 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -108,6 +108,8 @@ "%1$s-г татаж байна, %2$s татсан" "%1$s нь суулгахыг хүлээж байна" "%1$s жижиг хэрэгсэл" + "Жижиг хэрэгслийн жагсаалт" + "Жижиг хэрэгслийн жагсаалтыг хаасан" "Нүүр дэлгэц нэмэх" "Энд байршуулах" "Нүүр дэлгэцэнд нэмсэн зүйл" @@ -130,8 +132,7 @@ "Намсгах" "Виджэтийн өргөн %1$s, өндөр %2$s болсон" "Товчлол" - - + "Товчлол болон мэдэгдэл" "Хаах" "Мэдэгдлийг хаасан" "Хувийн" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 7b9aebd8a8..a297e06491 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -108,6 +108,8 @@ "%1$s डाउनलोड होत आहे , %2$s पूर्ण झाले" "%1$s इंस्टॉल करण्याची प्रतिक्षा करत आहे" "%1$s विजेट" + "विजेट सूची" + "विजेट सूची बंद केली" "होम स्क्रीनवर जोडा" "आयटम येथे हलवा" "आयटम मुख्य स्क्रीनवर जोडला" @@ -130,8 +132,7 @@ "उंची कमी करा" "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" "शॉर्टकट" - - + "शॉर्टकट आणि सूचना" "डिसमिस करा" "सूचना डिसमिस केली" "वैयक्तिक" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index ea178b89d7..71047fbc50 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -108,6 +108,8 @@ "%1$s memuat turun, %2$s selesai" "%1$s menunggu untuk dipasang" "Widget %1$s" + "Senarai widget" + "Senarai widget ditutup" "Tambahkan pada Skrin Utama" "Alihkan item ke sini" "Item ditambahkan pada skrin utama" @@ -130,8 +132,7 @@ "Kurangkan ketinggian" "Saiz widget diubah menjadi %1$s lebar %2$s tinggi" "Pintasan" - - + "Pintasan dan pemberitahuan" "Ketepikan" "Pemberitahuan diketepikan" "Peribadi" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 315ebf5700..6c261853a4 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -108,6 +108,8 @@ "%1$s ဒေါင်းလုဒ်လုပ်နေသည်၊ %2$s ပြီးပါပြီ" "%1$s ကိုထည့်သွင်းရန်စောင့်နေသည်" "%1$s ဝိဂျက်များ" + "ဝိဂျက်စာရင်း" + "ဝိဂျက်စာရင်းကို ပိတ်ထားသည်" "ပင်မမျက်နှာစာသို့ ထည့်ပါ" "၎င်းအား ဤသို့ ရွှေ့ပါ" "ပင်မ ဖန်မျက်နှာပြင်သို့ ထည့်ပြီး၏" @@ -130,8 +132,7 @@ "အမြင့်အား လျှော့ပါ" "Widget အား အကျယ် %1$s အမြင့် %2$s အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏" "ဖြတ်လမ်းများ" - - + "ဖြတ်လမ်းလင့်ခ်နှင့် အကြောင်းကြားချက်များ" "ပယ်ရန်" "အသိပေးချက်ကို ဖယ်ထုတ်ပြီးပါပြီ" "ကိုယ်ပိုင်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index d5beead867..67a912b08a 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -108,6 +108,8 @@ "Laster ned %1$s, %2$s er fullført" "Venter på å installere %1$s" "%1$s-moduler" + "Modulliste" + "Modullisten er lukket" "Legg til på startskjermen" "Flytt elementet hit" "Elementet er lagt til på startskjermen" @@ -130,8 +132,7 @@ "Reduser høyden" "Størrelsen på modulen er endret til bredde %1$s og høyde %2$s" "Snarveier" - - + "Snarveier og varsler" "Avvis" "Varselet ble avvist" "Personlig" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index f44c47bd90..50c427969c 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -108,6 +108,10 @@ "%1$s डाउनलोड गर्दै, %2$s सम्पन्‍न" "%1$s स्थापना गर्न प्रतीक्षा गर्दै" "%1$s विजेटहरू" + + + + "गृह स्क्रिनमा थप्नुहोस्" "वस्तु यहाँ सार्नुहोस्" "वस्तु गृह स्क्रिनमा थपियो" @@ -130,8 +134,7 @@ "उँचाइ घटाउनुहोस्" "विजेट चौडाइ %1$s उचाइ %2$s मा पुनः आकार मिलाइयो" "सर्टकटहरू" - - + "सर्टकट तथा सूचनाहरू" "खारेज गर्नुहोस्" "सूचना खारेज गरियो" "व्यक्तिगत" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e1c059ad48..64f4d7912b 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -108,6 +108,8 @@ "%1$s wordt gedownload, %2$s voltooid" "%1$s wacht op installatie" "%1$s-widgets" + "Lijst met widgets" + "Lijst met widgets gesloten" "Toevoegen aan startscherm" "Item hier naartoe verplaatsen" "Item toegevoegd aan startscherm" @@ -130,8 +132,7 @@ "Hoogte verkleinen" "Formaat van widget gewijzigd in breedte %1$s en hoogte %2$s" "Snelkoppelingen" - - + "Snelkoppelingen en meldingen" "Sluiten" "Melding gesloten" "Privé" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index 9152b43c45..5fa6607bf9 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -108,6 +108,10 @@ "%1$s ଡାଉନଲୋଡ୍‌ ହେଉଛି, %2$s ସମ୍ପୂର୍ଣ୍ଣ" "%1$s ଇନଷ୍ଟଲ୍‌ ହେବାକୁ ଅପେକ୍ଷା କରିଛି" "%1$s ୱିଜେଟ୍‌" + + + + "ହୋମ୍‌ ସ୍କ୍ରୀନରେ ଯୋଡ଼ନ୍ତୁ" "ଆଇଟମ୍‌କୁ ଏଠାକୁ ଘୁଞ୍ଚାନ୍ତୁ" "ହୋମ୍‌ ସ୍କ୍ରୀନରେ ଆଇଟମ୍‌ ଯୋଡ଼ାଗଲା" @@ -130,8 +134,7 @@ "ଉଚ୍ଚତା କମ୍‌ କରନ୍ତୁ" "ୱିଜେଟକୁ %1$s ଓସାର ଓ %2$s ଉଚ୍ଚରେ ପୁନଃଆକାର ଦିଆଗଲା" "ଶର୍ଟକଟ୍‍" - - + "ଶର୍ଟକଟ୍ ଓ ବିଜ୍ଞପ୍ତି" "ଖାରଜ କରନ୍ତୁ" "ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା" "ବ୍ୟକ୍ତିଗତ" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 237e5190af..3400e7bdcf 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -108,6 +108,10 @@ "%1$s ਡਾਉਨਲੋਡ ਹੋਰ ਰਿਹਾ ਹੈ, %2$s ਸੰਪੂਰਣ" "%1$s ਸਥਾਪਤ ਕਰਨ ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ" "%1$s ਵਿਜੇਟ" + + + + "ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" "ਆਈਟਮ ਨੂੰ ਇੱਥੇ ਮੂਵ ਕਰੋ" "ਆਈਟਮ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਜੋੜਿਆ ਗਿਆ" @@ -130,8 +134,7 @@ "ਉਂਚਾਈ ਘਟਾਓ" "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %1$s ਉਂਚਾਈ %2$s ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ" "ਸ਼ਾਰਟਕੱਟ" - - + "ਸ਼ਾਰਟਕੱਟ ਅਤੇ ਸੂਚਨਾਵਾਂ" "ਖਾਰਜ ਕਰੋ" "ਸੂਚਨਾ ਖਾਰਜ ਕੀਤੀ ਗਈ" "ਨਿੱਜੀ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 65de77703c..776f39dce4 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -110,6 +110,8 @@ "Pobieranie elementu %1$s, ukończono: %2$s" "%1$s oczekuje na instalację" "%1$s – widżety" + "Lista widgetów" + "Lista widgetów zamknięta" "Dodaj do strony głównej" "Przenieś element tutaj" "Element został dodany do ekranu głównego" @@ -132,8 +134,7 @@ "Zmniejsz wysokość" "Szerokość i wysokość widżetu zmieniła się na %1$s x %2$s" "Skróty" - - + "Skróty i powiadomienia" "Odrzuć" "Powiadomienie odrzucone" "Osobiste" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 48dcebb425..40105915ce 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -108,6 +108,8 @@ "A transferir o %1$s, %2$s concluído" "A aguardar a instalação do %1$s" "Widgets de %1$s" + "Lista de widgets" + "Lista de widgets fechada." "Adicionar ao Ecrã principal" "Mover o item para aqui" "Item adicionado ao ecrã principal" @@ -130,8 +132,7 @@ "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" - - + "Atalhos e notificações" "Ignorar" "Notificação ignorada" "Pessoal" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 25bde0add8..6238e7aefc 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -108,6 +108,8 @@ "Fazendo download de %1$s, %2$s concluído" "Aguardando instalação de %1$s" "Widgets do %1$s" + "Lista de widgets" + "Lista de widgets fechada" "Adicionar à tela inicial" "Mover item para cá" "Item adicionado à tela inicial" @@ -130,8 +132,7 @@ "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" - - + "Atalhos e notificações" "Dispensar" "Notificação dispensada" "Pessoais" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 1af37eb709..fb5fb96232 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -109,6 +109,8 @@ "%1$s se descarcă (finalizat %2$s)" "%1$s așteaptă instalarea" "Widgeturi %1$s" + "Listă de widgeturi" + "Lista de widgeturi este închisă" "Adăugați pe ecranul de pornire" "Mutați elementul aici" "Element adăugat pe ecranul de pornire" @@ -131,8 +133,7 @@ "Reduceți înălțimea" "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" + "Comenzi rapide și notificări" "Închideți" "Notificare închisă" "Personale" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 74809dde43..dd70521a8f 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -110,6 +110,8 @@ "Скачивается \"%1$s\" (%2$s)" "Ожидание установки \"%1$s\"" "%1$s: виджеты" + "Список виджетов" + "Список виджетов закрыт" "Добавить на главный экран" "Переместить элемент сюда" "Элемент добавлен на главный экран" @@ -132,8 +134,7 @@ "Уменьшить высоту" "Изменен размер виджета: до %1$s в ширину и %2$s в высоту" "Ярлыки" - - + "Ярлыки и уведомления" "Закрыть" "Уведомление закрыто" "Личные" diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 10835dc5ce..ee6112488c 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -108,6 +108,8 @@ "%1$s බාගත කරමින්, %2$s සම්පූර්ණයි" "%1$s ස්ථාපනය කිරීමට බලා සිටිමින්" "%1$s විජට්" + "විජට් ලැයිස්තුව" + "විජට් ලැයිස්තුව වසා ඇත" "මුල් තිරය වෙත එක් කරන්න" "මෙතනට අයිතමය ගෙන එන්න" "අයිතමය මුල් තිරය වෙත එකතු කරන ලදි" @@ -130,8 +132,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 cbffd1b25b..649aecc8a8 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -110,6 +110,8 @@ "Sťahuje sa aplikácia %1$s. Stiahnuté: %2$s" "Aplikácia %1$s čaká na inštaláciu" "Miniaplikácie %1$s" + "Zoznam miniaplikácií" + "Zoznam miniaplikácií je zavretý" "Pridať na plochu" "Presunúť položku sem" "Položka bola pridaná na plochu" @@ -132,8 +134,7 @@ "Znížiť výšku" "Veľkosť miniaplikácie bola zmenená na %1$s x %2$s (šírka x výška)" "Skratky" - - + "Odkazy a upozornenia" "Zavrieť" "Upozornenie bolo zavreté" "Osobné" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index df934cd2fd..aa3bc4fc57 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -110,6 +110,8 @@ "Prenašanje aplikacije %1$s; preneseno %2$s" "Aplikacija %1$s čaka na namestitev" "Pripomočki za %1$s" + "Seznam pripomočkov" + "Seznam pripomočkov se je zaprl" "Dodajanje na začetni zaslon" "Premik elementa sem" "Element je bil dodan na začetni zaslon" @@ -132,8 +134,7 @@ "Zmanjšanje višine" "Velikost pripomočka je bila spremenjena na %1$s širine in %2$s višine" "Bližnjice" - - + "Bližnjice in obvestila" "Opusti" "Obvestilo je bilo opuščeno" "Osebno" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index ef7cde70e5..8cf0a8198f 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -108,6 +108,8 @@ "%1$s po shkarkohet, %2$s të përfunduara" "%1$s po pret të instalohet" "Miniaplikacionet e %1$s" + "Lista e miniaplikacioneve" + "Lista e miniaplikacioneve u mbyll" "Shto në Ekranin bazë" "Zhvendose artikullin këtu" "Artikulli u shtua tek ekrani bazë" @@ -130,8 +132,7 @@ "Zvogëlo lartësinë" "Madhësia e miniaplikacionit u ndryshua me gjerësinë %1$s dhe lartësinë %2$s" "Shkurtoret" - - + "Shkurtoret dhe njoftimet" "Hiqe" "Njoftimi u hoq" "Personale" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index d4223a8a1e..42522a579b 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -109,6 +109,8 @@ "%1$s се преузима, завршено је %2$s" "%1$s чека на инсталирање" "Виџети за %1$s" + "Листа виџета" + "Листа виџета је затворена" "Додај на почетни екран" "Премести ставку овде" "Ставка је додата на почетни екран" @@ -131,8 +133,7 @@ "Смањи висину" "Величина виџета је промењена на ширину %1$s и висину %2$s" "Пречице" - - + "Пречице и обавештења" "Одбаци" "Обавештење је одбачено" "Личне" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 2fda5e24a6..957a4cb2d4 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -108,6 +108,8 @@ "%1$s laddas ned, %2$s klart" "%1$s väntar på installation" "%1$s widgetar" + "Widgetlista" + "Widgetslistan har stängts" "Lägg till på startskärmen" "Flytta objekt hit" "Objektet har lagts till på startskärmen" @@ -130,8 +132,7 @@ "Minska höjden" "Widgetens storlek har ändrats till: bredd %1$s, höjd %2$s" "Genvägar" - - + "Genvägar och aviseringar" "Ignorera" "Aviseringen togs bort" "Privat" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 5981b8684f..faa40a71c2 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -110,6 +110,8 @@ "%1$s inapakuliwa, %2$s imekamilika" "%1$s inasubiri kusakinisha" "Wijeti za %1$s" + "Orodha ya wijeti" + "Orodha ya wijeti imefungwa" "Ongeza kwenye skrini ya Kwanza" "Hamishia kipengee hapa" "Kipengee kimeongezwa kwenye skrini ya kwanza" @@ -132,8 +134,7 @@ "Punguza urefu" "Wijeti imepunguzwa hadi upana %1$s urefu %2$s" "Njia za mkato" - - + "Arifa na njia za mkato" "Ondoa" "Arifa imeondolewa" "Binafsi" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 5ff5ecc44b..983a0d1f2d 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -108,6 +108,10 @@ "%1$sஐப் பதிவிறக்குகிறது, %2$s முடிந்தது" "%1$sஐ நிறுவுவதற்காகக் காத்திருக்கிறது" "%1$s விட்ஜெட்டுகள்" + + + + "முகப்புத் திரையில் சேர்" "இங்கு நகர்த்து" "முகப்புத் திரையில் சேர்க்கப்பட்டது" @@ -130,8 +134,7 @@ "உயரத்தைக் குறை" "அகலம் %1$s மற்றும் உயரம் %2$sக்கு விட்ஜெட் அளவு மாற்றப்பட்டது" "குறுக்குவழிகள்" - - + "ஷார்ட்கட்கள் மற்றும் அறிவிப்புகள்" "நிராகரி" "அறிவிப்பு நிராகரிக்கப்பட்டது" "தனிப்பட்டவை" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 0967119eae..a18d6496a6 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -108,6 +108,10 @@ "%1$s డౌన్‌లోడ్ అవుతోంది, %2$s పూర్తయింది" "%1$s ఇన్‌స్టాల్ కావడానికి వేచి ఉంది" "%1$s విడ్జెట్‌లు" + + + + "హోమ్ స్క్రీన్‌కు జోడించు" "అంశాన్ని ఇక్కడికి తరలించు" "అంశం హోమ్‌స్క్రీన్‌కి జోడించబడింది" @@ -130,8 +134,7 @@ "ఎత్తును తగ్గించు" "విడ్జెట్ పరిమాణం వెడల్పు %1$sకి, ఎత్తు %2$sకి మార్చబడింది" "సత్వరమార్గాలు" - - + "షార్ట్‌కట్‌లు మరియు నోటిఫికేషన్‌లు" "తీసివేయి" "నోటిఫికేషన్ తీసివేయబడింది" "వ్యక్తిగతం" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 52ea7521ed..2da32de6fd 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -108,6 +108,8 @@ "กำลังดาวน์โหลด %1$s เสร็จแล้ว %2$s" "%1$s กำลังรอติดตั้ง" "วิดเจ็ตของ %1$s" + "รายการวิดเจ็ต" + "ปิดรายการวิดเจ็ตแล้ว" "เพิ่มลงในหน้าแรก" "ย้ายรายการมาที่นี่" "เพิ่มรายการไปยังหน้าจอหลักแล้ว" @@ -130,8 +132,7 @@ "ลดความสูง" "ปรับขนาดของวิดเจ็ตเป็นกว้าง %1$s สูง %2$s แล้ว" "ทางลัด" - - + "ทางลัดและการแจ้งเตือน" "ปิด" "ปิดการแจ้งเตือนแล้ว" "ส่วนตัว" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 0047aaeb30..68d52591f0 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -108,6 +108,8 @@ "Dina-download na ang %1$s, tapos na ang %2$s" "Hinihintay nang mag-install ang %1$s" "Mga widget ng %1$s" + "Listahan ng mga widget" + "Nakasara ang listahan ng mga widget" "Idagdag sa Home screen" "Ilipat ang item dito" "Naidagdag sa home screen ang item" @@ -130,8 +132,7 @@ "Bawasan ang taas" "Na-resize ang widget sa lapad %1$s taas %2$s" "Mga Shortcut" - - + "Mga shortcut at notification" "I-dismiss" "Na-dismiss ang notification" "Personal" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index cfa9f9eaf3..af121f237f 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -108,6 +108,8 @@ "%1$s indiriliyor, %2$s tamamlandı" "%1$s uygulaması yüklenmek için bekliyor" "%1$s widget\'ları" + "Widget listesi" + "Widget listesi kapalı" "Ana ekrana ekle" "Öğeyi buraya taşı" "Öğe ana ekrana eklendi" @@ -130,8 +132,7 @@ "Yüksekliği azalt" "Widget, %1$s genişlik ve %2$s yükseklik değerine yeniden boyutlandırıldı" "Kısayollar" - - + "Kısayollar ve bildirimler" "Kapat" "Bildirim kapatıldı" "Kişisel" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index aa5c676b1a..305c9aaef7 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -110,6 +110,8 @@ "%1$s завантажується, %2$s" "%1$s очікує на завантаження" "Віджети додатка %1$s" + "Список віджетів" + "Список віджектів закрито" "Додати на головний екран" "Перемістити елемент сюди" "Елемент додано на головний екран" @@ -132,8 +134,7 @@ "Зменшити висоту" "Розміри віджета змінено на %1$s завширшки та %2$s заввишки" "Ярлики" - - + "Ярлики та сповіщення" "Закрити" "Сповіщення закрито" "Особисті додатки" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index d8e339df07..7853fd4b36 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -108,6 +108,10 @@ "%1$s ڈاؤن لوڈ ہو رہا ہے، %2$s مکمل ہو گیا" "%1$s انسٹال ہونے کا انتظار کر رہی ہے" "%1$s ویجیٹس" + + + + "ہوم اسکرین میں شامل کریں" "آئٹم یہاں منتقل کریں" "آئٹم کو ہوم اسکرین میں شامل کر دیا گیا" @@ -130,8 +134,7 @@ "اونچائی کم کریں" "ویجیٹ کے سائز کو چوڑائی %1$s اونچائی %2$s میں تبدیل کر دیا گیا" "شارٹ کٹس" - - + "شارٹ کٹس اور اطلاعات" "برخاست کریں" "اطلاع مسترد ہو گئی" "ذاتی" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 6b53e9657f..287ec09f76 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -108,6 +108,8 @@ "%1$s yuklab olinmoqda, %2$s bajarildi" "%1$s ilovasi o‘rnatilishi kutilmoqda" "%1$s vidjetlari" + "Vidjetlar ro‘yxati" + "Vidjetlar ro‘yxati yopildi" "Bosh ekranga qo‘shish" "Obyektni bu yerga ko‘chirish" "Obyekt bosh ekranga qo‘shildi" @@ -130,8 +132,7 @@ "Bo‘yini kichraytirish" "Vidjetning eni %1$s, bo‘yi %2$s qilib o‘zgartirildi" "Tezkor tugmalar" - - + "Yorliqlar va bildirishnomalar" "Yopish" "Bildirishnoma yopildi" "Shaxsiy" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index ab88cfec6e..06278f5cf7 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -108,6 +108,8 @@ "Đang tải xuống %1$s, %2$s hoàn tất" "Đang chờ cài đặt %1$s" "Tiện ích của %1$s" + "Danh sách tiện ích" + "Đã đóng danh sách tiện ích" "Thêm vào màn hình chính" "Di chuyển mục vào đây" "Đã thêm mục vào màn hình chính" @@ -130,8 +132,7 @@ "Giảm chiều cao" "Đã đổ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" - - + "Phím tắt và thông báo" "Loại bỏ" "Đã loại bỏ thông báo" "Cá nhân" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index a92208c83d..640aa0e2f0 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -108,6 +108,8 @@ "正在下载%1$s,已完成 %2$s" "%1$s正在等待安装" "%1$s微件" + "微件列表" + "微件列表已关闭" "添加到主屏幕" "将项目移至此处" "已将项目添加到主屏幕" @@ -130,8 +132,7 @@ "减小高度" "微件尺寸已调整为:宽度 %1$s,高度 %2$s" "快捷方式" - - + "快捷方式和通知" "关闭" "已关闭通知" "个人" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 0f253003b5..5a8c6caec6 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -108,6 +108,8 @@ "正在下載 %1$s,已完成 %2$s" "正在等待安裝 %1$s" "%1$s小工具" + "小工具清單" + "已經關閉嘅小工具清單" "新增至主畫面" "移動項目至這裡" "已將項目加入至主畫面" @@ -130,8 +132,7 @@ "減少高度" "已調整小工具的大小至闊 %1$s%2$s" "捷徑" - - + "捷徑同通知" "關閉" "關閉咗通知" "個人" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index c187b968b7..4d37cdd20a 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -108,6 +108,8 @@ "正在下載「%1$s」,已完成 %2$s" "正在等待安裝「%1$s」" "「%1$s」小工具" + "小工具清單" + "已關閉小工具清單" "新增至主畫面" "將項目移至這裡" "已將項目新增到主畫面" @@ -130,13 +132,12 @@ "減少高度" "已將小工具的寬度和高度分別調整為 %1$s%2$s" "捷徑" - - + "捷徑和通知" "關閉" "已關閉通知" "個人" "公司" - "Work 設定檔" + "工作資料夾" "在這裡尋找辦公應用程式" "每個辦公應用程式都有徽章,並由貴機構負責管理及確保其安全。請將辦公應用程式移至主螢幕以便輕鬆存取。" "由貴機構所管理" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 6f92847c1c..8e3e5abc60 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -108,6 +108,8 @@ "I-%1$s iyalandwa, %2$s kuqediwe" "%1$s ilinde ukufakwa" "%1$s amawijethi" + "Uhlu lwamawijethi" + "Uhlu lwamawijethi luvaliwe" "Faka kusikrini sasekhaya" "Hambisa into lapha" "Into ingezwe kusikrini sasekhaya" @@ -130,8 +132,7 @@ "Nciphisa ubude" "Iwijethi inikezwe usayizi omusha ngobubanzi obungu-%1$s ubude obungu-%2$s" "Izinqamuleli" - - + "Izinqamuleli nezaziso" "Cashisa" "Isaziso sicashisiwe" "Okomuntu siqu" -- GitLab From 3f90a2dcf62fcef1287913a85bf091accafab882 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 31 May 2018 17:30:53 -0700 Subject: [PATCH 0012/1301] Import translations. DO NOT MERGE Change-Id: I2078cff13794d2802f91dbce3ac92994af8fcfa1 Auto-generated-cl: translation import --- res/values-as/strings.xml | 6 ++---- res/values-bn/strings.xml | 6 ++---- res/values-gu/strings.xml | 6 ++---- res/values-hi/strings.xml | 6 ++---- res/values-kn/strings.xml | 6 ++---- res/values-ml/strings.xml | 6 ++---- res/values-ne/strings.xml | 6 ++---- res/values-or/strings.xml | 6 ++---- res/values-pa/strings.xml | 6 ++---- res/values-ta/strings.xml | 6 ++---- res/values-te/strings.xml | 6 ++---- res/values-ur/strings.xml | 6 ++---- 12 files changed, 24 insertions(+), 48 deletions(-) diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index 5c896e4f24..b8e71a14bc 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -108,10 +108,8 @@ "%1$s ডাউনল\'ড কৰি থকা হৈছে, %2$s সম্পূৰ্ণ হ\'ল" "%1$s ইনষ্টল হোৱালৈ অপেক্ষা কৰি থকা হৈছে" "%1$s ৱিজেট" - - - - + "ৱিজেটৰ তালিকা" + "ৱিজেটৰ তালিকা বন্ধ কৰা হ\'ল" "গৃহ স্ক্ৰীণত যোগ কৰক" "বস্তুটো ইয়ালৈ স্থানান্তৰ কৰক" "বস্তুটো গৃহ স্ক্ৰীণত যোগ কৰা হ\'ল" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 651f400ef6..70f0863058 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -108,10 +108,8 @@ "%1$s ডাউনলোড হচ্ছে %2$s সম্পন্ন হয়েছে" "%1$s ইনস্টলের অপেক্ষায় রয়েছে" "%1$s উইজেট" - - - - + "উইজেটের তালিকা" + "উইজেটের তালিকা বন্ধ করা হয়েছে" "হোম স্ক্রীনে যোগ করুন" "এখানে আইটেম সরান" "হোম স্ক্রীনে আইটেম যোগ করা হয়েছে" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index 6468d8b753..d4f6bbb8c8 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -108,10 +108,8 @@ "%1$s ડાઉનલોડ કરી રહ્યાં છે, %2$s પૂર્ણ" "%1$s, ઇન્સ્ટૉલ થવાની રાહ જોઈ રહ્યું છે" "%1$s વિજેટ" - - - - + "વિજેટની સૂચિ" + "વિજેટની સૂચિ બંધ કરવામાં આવી છે" "હોમ સ્ક્રીન પર ઉમેરો" "આઇટમ અહીં ખસેડો" "હોમ સ્ક્રીનમાં આઇટમ ઉમેરી" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 1b5ce26794..44526b9ac1 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -108,10 +108,8 @@ "%1$s डाउनलोड हो रहा है, %2$s पूर्ण" "%1$s के इंस्टॉल होने की प्रतीक्षा की जा रही है" "%1$s विजेट" - - - - + "विजेट की सूची" + "विजेट की सूची बंद हो गई है" "होम स्‍क्रीन में जोड़ें" "आइटम यहां ले जाएं" "होम स्क्रीन में आइटम जोड़ा गया" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index e73ff39da0..5182fd29a2 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -108,10 +108,8 @@ "%1$s ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ, %2$s ಪೂರ್ಣಗೊಂಡಿದೆ" "%1$s ಸ್ಥಾಪಿಸಲು ಕಾಯಲಾಗುತ್ತಿದೆ" "%1$s ವಿಜೆಟ್‌ಗಳು" - - - - + "ವಿಜೆಟ್ ಪಟ್ಟಿ" + "ವಿಜೆಟ್ ಪಟ್ಟಿಯನ್ನು ಮುಚ್ಚಲಾಗಿದೆ" "ಮುಖಪುಟಕ್ಕೆ ಸೇರಿಸು" "ಐಟಂ ಇಲ್ಲಿಗೆ ಸರಿಸಿ" "ಮುಖಪುಟ ಪರದೆಗೆ ಐಟಂ ಸೇರಿಸಲಾಗಿದೆ" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index d6a2fd1a92..ed3bde6c32 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -108,10 +108,8 @@ "%1$s ഡൗൺലോഡ് ചെയ്യുന്നു, %2$s പൂർത്തിയായി" "ഇൻസ്റ്റാൾ ചെയ്യാൻ %1$s കാക്കുന്നു" "%1$s വിജറ്റുകൾ" - - - - + "വിജറ്റുകളുടെ ലിസ്‌റ്റ്" + "വിജറ്റുകളുടെ ലിസ്‌റ്റ് അവസാനിപ്പിച്ചു" "ഹോം സ്ക്രീനിൽ ചേർക്കുക" "ഇനം ഇവിടേക്ക് നീക്കുക" "ഹോം സ്‌ക്രീനിൽ ഇനം ചേർത്തു" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 50c427969c..708a9918a3 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -108,10 +108,8 @@ "%1$s डाउनलोड गर्दै, %2$s सम्पन्‍न" "%1$s स्थापना गर्न प्रतीक्षा गर्दै" "%1$s विजेटहरू" - - - - + "विजेटहरूको सूची" + "विजेटहरूको सूची बन्द गरियो" "गृह स्क्रिनमा थप्नुहोस्" "वस्तु यहाँ सार्नुहोस्" "वस्तु गृह स्क्रिनमा थपियो" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index 5fa6607bf9..cb1cea988b 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -108,10 +108,8 @@ "%1$s ଡାଉନଲୋଡ୍‌ ହେଉଛି, %2$s ସମ୍ପୂର୍ଣ୍ଣ" "%1$s ଇନଷ୍ଟଲ୍‌ ହେବାକୁ ଅପେକ୍ଷା କରିଛି" "%1$s ୱିଜେଟ୍‌" - - - - + "ୱିଜେଟ୍ ତାଲିକା" + "ୱିଜେଟ୍ ତାଲିକା ବନ୍ଦ ହୋଇଛି" "ହୋମ୍‌ ସ୍କ୍ରୀନରେ ଯୋଡ଼ନ୍ତୁ" "ଆଇଟମ୍‌କୁ ଏଠାକୁ ଘୁଞ୍ଚାନ୍ତୁ" "ହୋମ୍‌ ସ୍କ୍ରୀନରେ ଆଇଟମ୍‌ ଯୋଡ଼ାଗଲା" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 3400e7bdcf..1ca7cc8e4f 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -108,10 +108,8 @@ "%1$s ਡਾਉਨਲੋਡ ਹੋਰ ਰਿਹਾ ਹੈ, %2$s ਸੰਪੂਰਣ" "%1$s ਸਥਾਪਤ ਕਰਨ ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ" "%1$s ਵਿਜੇਟ" - - - - + "ਵਿਜੇਟਾਂ ਦੀ ਸੂਚੀ" + "ਵਿਜੇਟਾਂ ਦੀ ਸੂਚੀ ਬੰਦ ਕੀਤੀ ਗਈ" "ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" "ਆਈਟਮ ਨੂੰ ਇੱਥੇ ਮੂਵ ਕਰੋ" "ਆਈਟਮ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਜੋੜਿਆ ਗਿਆ" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 983a0d1f2d..fedb0fd371 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -108,10 +108,8 @@ "%1$sஐப் பதிவிறக்குகிறது, %2$s முடிந்தது" "%1$sஐ நிறுவுவதற்காகக் காத்திருக்கிறது" "%1$s விட்ஜெட்டுகள்" - - - - + "விட்ஜெட்கள் பட்டியல்" + "விட்ஜெட்கள் பட்டியல் மூடப்பட்டது" "முகப்புத் திரையில் சேர்" "இங்கு நகர்த்து" "முகப்புத் திரையில் சேர்க்கப்பட்டது" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index a18d6496a6..3cc97612e8 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -108,10 +108,8 @@ "%1$s డౌన్‌లోడ్ అవుతోంది, %2$s పూర్తయింది" "%1$s ఇన్‌స్టాల్ కావడానికి వేచి ఉంది" "%1$s విడ్జెట్‌లు" - - - - + "విడ్జెట్‌ల జాబితా" + "విడ్జెట్‌ల జాబితా మూసివేయబడింది" "హోమ్ స్క్రీన్‌కు జోడించు" "అంశాన్ని ఇక్కడికి తరలించు" "అంశం హోమ్‌స్క్రీన్‌కి జోడించబడింది" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 7853fd4b36..c06c943ab8 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -108,10 +108,8 @@ "%1$s ڈاؤن لوڈ ہو رہا ہے، %2$s مکمل ہو گیا" "%1$s انسٹال ہونے کا انتظار کر رہی ہے" "%1$s ویجیٹس" - - - - + "ویجیٹس کی فہرست" + "ویجیٹس کی فہرست بند کر دی گئی" "ہوم اسکرین میں شامل کریں" "آئٹم یہاں منتقل کریں" "آئٹم کو ہوم اسکرین میں شامل کر دیا گیا" -- GitLab From 79f581516b231f7fe1830966a73e79e74dadce8d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 18 Jun 2018 11:58:04 -0700 Subject: [PATCH 0013/1301] Import translations. DO NOT MERGE Change-Id: Ib9eb56eaa3740d8848d71d8a7a960af61c100e12 Auto-generated-cl: translation import --- go/res/values-pl/strings.xml | 2 +- res/values-bn/strings.xml | 4 ++-- res/values-hi/strings.xml | 2 +- res/values-ne/strings.xml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go/res/values-pl/strings.xml b/go/res/values-pl/strings.xml index 45a1dc2cac..0861daaa57 100644 --- a/go/res/values-pl/strings.xml +++ b/go/res/values-pl/strings.xml @@ -19,7 +19,7 @@ - "Kliknij i przytrzymaj, by wybrać skrót." + "Naciśnij i przytrzymaj, by wybrać skrót." "Kliknij dwukrotnie i przytrzymaj, by wybrać skrót lub użyć działań niestandardowych." "Skróty" "%1$s – skróty" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 70f0863058..8fb906f8e4 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -102,9 +102,9 @@ "আইকনের আকৃতি পরিবর্তন করা হচ্ছে" "অজানা" "সরান" - "অনুসন্ধান" + "সার্চ" "এই অ্যাপ্লিকেশানটি ইন্সটল করা নাই" - "এই আইকনের অ্যাপ্লিকেশানটি ইন্সটল করা নাই। আপনি এটি সরাতে পারেন বা অ্যাপ্লিকেশানটি অনুসন্ধান করে এটি নিজে ইন্সটল করতে পারেন।" + "এই আইকনের অ্যাপ্লিকেশানটি ইন্সটল করা নাই। আপনি এটি সরাতে পারেন বা অ্যাপ্লিকেশানটি সার্চ করে এটি নিজে ইন্সটল করতে পারেন।" "%1$s ডাউনলোড হচ্ছে %2$s সম্পন্ন হয়েছে" "%1$s ইনস্টলের অপেক্ষায় রয়েছে" "%1$s উইজেট" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 44526b9ac1..ee8e6e3fe4 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -89,7 +89,7 @@ "सूचना के एक्सेस की ज़रूरत है" "सूचना बिंदु दिखाने के लिए, %1$s के ऐप्लिकेशन सूचना चालू करें" "सेटिंग बदलें" - "नए नोटिफ़िकेशन बताने वाला गोल निशान दिखाएं" + "नई सूचनाएं बताने वाला गोल निशान दिखाएं" "होम स्क्रीन में आइकॉन जोड़ें" "नए ऐप्लिकेशन के लिए" "आइकॉन का आकार बदलें" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 708a9918a3..139ac59289 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -43,7 +43,7 @@ "कुनै सर्टकट छनौट गर्न छोइराख्नुहोस्।" "कुनै सर्टकट छनौट गर्न वा रोजेका कारबाहीहरू प्रयोग गर्न डबल ट्याप गरेर छोइराख्नुहोस्।" "यो गृह स्क्रिनमा कुनै थप ठाउँ छैन।" - "मनपर्ने ट्रे अब कुनै ठाँउ छैन" + "मन पर्ने ट्रे अब कुनै ठाँउ छैन" "अनुप्रयोगको सूची" "व्यक्तिगत अनुप्रयोगहरूको सूची" "कार्यसम्बन्धी अनुप्रयोगहरूको सूची" @@ -117,7 +117,7 @@ "वस्तु सार्नुहोस्" "पङ्क्ति %1$s स्तम्भ %2$s मा सार्नुहोस्" "स्थिति %1$s मा सार्नुहोस्" - "मनपर्ने स्थिति %1$s मा सार्नुहोस्" + "मन पर्ने स्थिति %1$s मा सार्नुहोस्" "वस्तु सारियो" "फोल्डर: %1$s मा थप्नुहोस्" "फोल्डरमा %1$s सँग थप्नुहोस्" -- GitLab From 5d4eb1d5aba14294a418ec8c8804084cf4b0a17f Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Thu, 7 Jun 2018 16:24:09 -0700 Subject: [PATCH 0014/1301] Fix duplicate elements in Launcher3Tests PackageManager is probably ignoring the first one. Bug: 78447299 Test: m Launcher3Tests Change-Id: I359beac6819ec3f0d856e8e3c909765ea521e487 Merged-In: I359beac6819ec3f0d856e8e3c909765ea521e487 (cherry picked from commit d219bc1923413f3cc9e881e9e95130395a8e177d) --- tests/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml index 43030aec94..ec89f9c020 100644 --- a/tests/AndroidManifest.xml +++ b/tests/AndroidManifest.xml @@ -18,8 +18,8 @@ xmlns:tools="http://schemas.android.com/tools" package="com.android.launcher3.tests"> - - + -- GitLab From 93ea9517fcea1a88ac9213dc1d98ed77159445b0 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Mon, 25 Jun 2018 11:10:12 -0700 Subject: [PATCH 0015/1301] Dismiss pip will fade task in and snap to it Test: pip maps and dismiss when on overview Fixes: 73097187 Change-Id: I6eedb8c2a57963f29d5655dd8f2bcdd350ed4792 --- .../android/quickstep/views/RecentsView.java | 58 ++++++++++++++++--- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index e18708b193..b763099e0c 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -27,6 +27,8 @@ import static com.android.quickstep.WindowTransformSwipeHandler.MIN_PROGRESS_FOR import android.animation.Animator; import android.animation.AnimatorSet; +import android.animation.LayoutTransition; +import android.animation.LayoutTransition.TransitionListener; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; @@ -57,6 +59,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewDebug; +import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.ListView; @@ -117,6 +120,7 @@ public abstract class RecentsView extends PagedView impl private final Rect mTempRect = new Rect(); private static final int DISMISS_TASK_DURATION = 300; + private static final int ADDITION_TASK_DURATION = 200; // The threshold at which we update the SystemUI flags when animating from the task into the app public static final float UPDATE_SYSUI_FLAGS_THRESHOLD = 0.85f; @@ -169,8 +173,9 @@ public abstract class RecentsView extends PagedView impl if (!mHandleTaskStackChanges) { return; } - // TODO: Re-enable layout transitions for addition of the unpinned task + reloadIfNeeded(); + enableLayoutTransitions(); } @Override @@ -239,6 +244,7 @@ public abstract class RecentsView extends PagedView impl private int mDownY; private PendingAnimation mPendingAnimation; + private LayoutTransition mLayoutTransition; @ViewDebug.ExportedProperty(category = "launcher") private float mContentAlpha = 1; @@ -355,7 +361,7 @@ public abstract class RecentsView extends PagedView impl public TaskView getTaskView(int taskId) { for (int i = 0; i < getTaskViewCount(); i++) { TaskView tv = (TaskView) getChildAt(i); - if (tv.getTask().key.id == taskId) { + if (tv.getTask().key != null && tv.getTask().key.id == taskId) { return tv; } } @@ -448,6 +454,9 @@ public abstract class RecentsView extends PagedView impl final LayoutInflater inflater = LayoutInflater.from(getContext()); final ArrayList tasks = new ArrayList<>(stack.getTasks()); + // Unload existing visible task data + unloadVisibleTaskData(); + final int requiredTaskCount = tasks.size(); if (getTaskViewCount() != requiredTaskCount) { if (oldChildCount > 0) { @@ -455,7 +464,7 @@ public abstract class RecentsView extends PagedView impl } for (int i = getChildCount(); i < requiredTaskCount; i++) { final TaskView taskView = (TaskView) inflater.inflate(R.layout.task, this, false); - addView(taskView); + addView(taskView, 0); } while (getChildCount() > requiredTaskCount) { final TaskView taskView = (TaskView) getChildAt(getChildCount() - 1); @@ -466,9 +475,6 @@ public abstract class RecentsView extends PagedView impl } } - // Unload existing visible task data - unloadVisibleTaskData(); - // Rebind and reset all task views for (int i = requiredTaskCount - 1; i >= 0; i--) { final int pageIndex = requiredTaskCount - i - 1; @@ -635,9 +641,11 @@ public abstract class RecentsView extends PagedView impl for (int i = 0; i < mHasVisibleTaskData.size(); i++) { if (mHasVisibleTaskData.valueAt(i)) { TaskView taskView = getTaskView(mHasVisibleTaskData.keyAt(i)); - Task task = taskView.getTask(); - loader.unloadTaskData(task); - loader.getHighResThumbnailLoader().onTaskInvisible(task); + if (taskView != null) { + Task task = taskView.getTask(); + loader.unloadTaskData(task); + loader.getHighResThumbnailLoader().onTaskInvisible(task); + } } } mHasVisibleTaskData.clear(); @@ -766,6 +774,38 @@ public abstract class RecentsView extends PagedView impl } } + private void enableLayoutTransitions() { + if (mLayoutTransition == null) { + mLayoutTransition = new LayoutTransition(); + mLayoutTransition.enableTransitionType(LayoutTransition.APPEARING); + mLayoutTransition.setDuration(ADDITION_TASK_DURATION); + mLayoutTransition.setStartDelay(LayoutTransition.APPEARING, 0); + + mLayoutTransition.addTransitionListener(new TransitionListener() { + @Override + public void startTransition(LayoutTransition transition, ViewGroup viewGroup, + View view, int i) { + } + + @Override + public void endTransition(LayoutTransition transition, ViewGroup viewGroup, + View view, int i) { + // When the unpinned task is added, snap to first page and disable transitions + if (view instanceof TaskView) { + snapToPage(0); + disableLayoutTransitions(); + } + + } + }); + } + setLayoutTransition(mLayoutTransition); + } + + private void disableLayoutTransitions() { + setLayoutTransition(null); + } + public void setSwipeDownShouldLaunchApp(boolean swipeDownShouldLaunchApp) { mSwipeDownShouldLaunchApp = swipeDownShouldLaunchApp; } -- GitLab From 74a7e6a3d80d6c2e3bd9f3db42905486419596a3 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 27 Jun 2018 13:05:55 -0700 Subject: [PATCH 0016/1301] Using platform implementation of Scroller instead of maintaining a copy Bug: 109828536 Change-Id: Ief98c96e0c39a2ea70ed32e59aff71e6c45b176a --- .../android/launcher3/LauncherScroller.java | 536 +----------------- 1 file changed, 16 insertions(+), 520 deletions(-) diff --git a/src/com/android/launcher3/LauncherScroller.java b/src/com/android/launcher3/LauncherScroller.java index a9b49556bb..e5042c4e2e 100644 --- a/src/com/android/launcher3/LauncherScroller.java +++ b/src/com/android/launcher3/LauncherScroller.java @@ -18,541 +18,37 @@ package com.android.launcher3; import android.animation.TimeInterpolator; import android.content.Context; -import android.hardware.SensorManager; -import android.os.Build; -import android.view.ViewConfiguration; -import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; +import android.widget.Scroller; /** - * This class differs from the framework {@link android.widget.Scroller} in that - * you can modify the Interpolator post-construction. + * Extension of {@link android.widget.Scroller} with the ability to modify the + * Interpolator post-construction. */ -public class LauncherScroller { - private int mMode; +public class LauncherScroller extends Scroller { - private int mStartX; - private int mStartY; - private int mFinalX; - private int mFinalY; + private final InterpolatorWrapper mInterpolatorWrapper; - private int mMinX; - private int mMaxX; - private int mMinY; - private int mMaxY; - - private int mCurrX; - private int mCurrY; - private long mStartTime; - private int mDuration; - private float mDurationReciprocal; - private float mDeltaX; - private float mDeltaY; - private boolean mFinished; - private TimeInterpolator mInterpolator; - private boolean mFlywheel; - - private float mVelocity; - private float mCurrVelocity; - private int mDistance; - - private float mFlingFriction = ViewConfiguration.getScrollFriction(); - - private static final int DEFAULT_DURATION = 250; - private static final int SCROLL_MODE = 0; - private static final int FLING_MODE = 1; - - private static float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9)); - private static final float INFLEXION = 0.35f; // Tension lines cross at (INFLEXION, 1) - private static final float START_TENSION = 0.5f; - private static final float END_TENSION = 1.0f; - private static final float P1 = START_TENSION * INFLEXION; - private static final float P2 = 1.0f - END_TENSION * (1.0f - INFLEXION); - - private static final int NB_SAMPLES = 100; - private static final float[] SPLINE_POSITION = new float[NB_SAMPLES + 1]; - private static final float[] SPLINE_TIME = new float[NB_SAMPLES + 1]; - - private float mDeceleration; - private final float mPpi; - - // A context-specific coefficient adjusted to physical values. - private float mPhysicalCoeff; - - static { - float x_min = 0.0f; - float y_min = 0.0f; - for (int i = 0; i < NB_SAMPLES; i++) { - final float alpha = (float) i / NB_SAMPLES; - - float x_max = 1.0f; - float x, tx, coef; - while (true) { - x = x_min + (x_max - x_min) / 2.0f; - coef = 3.0f * x * (1.0f - x); - tx = coef * ((1.0f - x) * P1 + x * P2) + x * x * x; - if (Math.abs(tx - alpha) < 1E-5) break; - if (tx > alpha) x_max = x; - else x_min = x; - } - SPLINE_POSITION[i] = coef * ((1.0f - x) * START_TENSION + x) + x * x * x; - - float y_max = 1.0f; - float y, dy; - while (true) { - y = y_min + (y_max - y_min) / 2.0f; - coef = 3.0f * y * (1.0f - y); - dy = coef * ((1.0f - y) * START_TENSION + y) + y * y * y; - if (Math.abs(dy - alpha) < 1E-5) break; - if (dy > alpha) y_max = y; - else y_min = y; - } - SPLINE_TIME[i] = coef * ((1.0f - y) * P1 + y * P2) + y * y * y; - } - SPLINE_POSITION[NB_SAMPLES] = SPLINE_TIME[NB_SAMPLES] = 1.0f; - - // This controls the viscous fluid effect (how much of it) - sViscousFluidScale = 8.0f; - // must be set to 1.0 (used in viscousFluid()) - sViscousFluidNormalize = 1.0f; - sViscousFluidNormalize = 1.0f / viscousFluid(1.0f); - - } - - private static float sViscousFluidScale; - private static float sViscousFluidNormalize; - - public void setInterpolator(TimeInterpolator interpolator) { - mInterpolator = interpolator; - } - - /** - * Create a Scroller with the default duration and interpolator. - */ public LauncherScroller(Context context) { - this(context, null); - } - - /** - * Create a Scroller with the specified interpolator. If the interpolator is - * null, the default (viscous) interpolator will be used. "Flywheel" behavior will - * be in effect for apps targeting Honeycomb or newer. - */ - public LauncherScroller(Context context, Interpolator interpolator) { - this(context, interpolator, - context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB); - } - - /** - * Create a Scroller with the specified interpolator. If the interpolator is - * null, the default (viscous) interpolator will be used. Specify whether or - * not to support progressive "flywheel" behavior in flinging. - */ - public LauncherScroller(Context context, Interpolator interpolator, boolean flywheel) { - mFinished = true; - mInterpolator = interpolator; - mPpi = context.getResources().getDisplayMetrics().density * 160.0f; - mDeceleration = computeDeceleration(ViewConfiguration.getScrollFriction()); - mFlywheel = flywheel; - - mPhysicalCoeff = computeDeceleration(0.84f); // look and feel tuning - } - - /** - * The amount of friction applied to flings. The default value - * is {@link ViewConfiguration#getScrollFriction}. - * - * @param friction A scalar dimension-less value representing the coefficient of - * friction. - */ - public final void setFriction(float friction) { - mDeceleration = computeDeceleration(friction); - mFlingFriction = friction; - } - - private float computeDeceleration(float friction) { - return SensorManager.GRAVITY_EARTH // g (m/s^2) - * 39.37f // inch/meter - * mPpi // pixels per inch - * friction; - } - - /** - * - * Returns whether the scroller has finished scrolling. - * - * @return True if the scroller has finished scrolling, false otherwise. - */ - public final boolean isFinished() { - return mFinished; - } - - /** - * Force the finished field to a particular value. - * - * @param finished The new finished value. - */ - public final void forceFinished(boolean finished) { - mFinished = finished; - } - - /** - * Returns how long the scroll event will take, in milliseconds. - * - * @return The duration of the scroll in milliseconds. - */ - public final int getDuration() { - return mDuration; - } - - /** - * Returns the current X offset in the scroll. - * - * @return The new X offset as an absolute distance from the origin. - */ - public final int getCurrX() { - return mCurrX; - } - - /** - * Returns the current Y offset in the scroll. - * - * @return The new Y offset as an absolute distance from the origin. - */ - public final int getCurrY() { - return mCurrY; - } - - /** - * Returns the current velocity. - * - * @return The original velocity less the deceleration. Result may be - * negative. - */ - public float getCurrVelocity() { - return mMode == FLING_MODE ? - mCurrVelocity : mVelocity - mDeceleration * timePassed() / 2000.0f; - } - - /** - * Returns the start X offset in the scroll. - * - * @return The start X offset as an absolute distance from the origin. - */ - public final int getStartX() { - return mStartX; - } - - /** - * Returns the start Y offset in the scroll. - * - * @return The start Y offset as an absolute distance from the origin. - */ - public final int getStartY() { - return mStartY; - } - - /** - * Returns where the scroll will end. Valid only for "fling" scrolls. - * - * @return The final X offset as an absolute distance from the origin. - */ - public final int getFinalX() { - return mFinalX; + this(context, new InterpolatorWrapper()); } - /** - * Returns where the scroll will end. Valid only for "fling" scrolls. - * - * @return The final Y offset as an absolute distance from the origin. - */ - public final int getFinalY() { - return mFinalY; + private LauncherScroller(Context context, InterpolatorWrapper interpolatorWrapper) { + super(context, interpolatorWrapper); + mInterpolatorWrapper = interpolatorWrapper; } - /** - * Call this when you want to know the new location. If it returns true, - * the animation is not yet finished. - */ - public boolean computeScrollOffset() { - if (mFinished) { - return false; - } - - int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime); - - if (timePassed < mDuration) { - switch (mMode) { - case SCROLL_MODE: - float x = timePassed * mDurationReciprocal; - - if (mInterpolator == null) - x = viscousFluid(x); - else - x = mInterpolator.getInterpolation(x); - - mCurrX = mStartX + Math.round(x * mDeltaX); - mCurrY = mStartY + Math.round(x * mDeltaY); - break; - case FLING_MODE: - final float t = (float) timePassed / mDuration; - final int index = (int) (NB_SAMPLES * t); - float distanceCoef = 1.f; - float velocityCoef = 0.f; - if (index < NB_SAMPLES) { - final float t_inf = (float) index / NB_SAMPLES; - final float t_sup = (float) (index + 1) / NB_SAMPLES; - final float d_inf = SPLINE_POSITION[index]; - final float d_sup = SPLINE_POSITION[index + 1]; - velocityCoef = (d_sup - d_inf) / (t_sup - t_inf); - distanceCoef = d_inf + (t - t_inf) * velocityCoef; - } - - mCurrVelocity = velocityCoef * mDistance / mDuration * 1000.0f; - - mCurrX = mStartX + Math.round(distanceCoef * (mFinalX - mStartX)); - // Pin to mMinX <= mCurrX <= mMaxX - mCurrX = Math.min(mCurrX, mMaxX); - mCurrX = Math.max(mCurrX, mMinX); - - mCurrY = mStartY + Math.round(distanceCoef * (mFinalY - mStartY)); - // Pin to mMinY <= mCurrY <= mMaxY - mCurrY = Math.min(mCurrY, mMaxY); - mCurrY = Math.max(mCurrY, mMinY); - - if (mCurrX == mFinalX && mCurrY == mFinalY) { - mFinished = true; - } - - break; - } - } - else { - mCurrX = mFinalX; - mCurrY = mFinalY; - mFinished = true; - } - return true; - } - - /** - * Start scrolling by providing a starting point and the distance to travel. - * The scroll will use the default value of 250 milliseconds for the - * duration. - * - * @param startX Starting horizontal scroll offset in pixels. Positive - * numbers will scroll the content to the left. - * @param startY Starting vertical scroll offset in pixels. Positive numbers - * will scroll the content up. - * @param dx Horizontal distance to travel. Positive numbers will scroll the - * content to the left. - * @param dy Vertical distance to travel. Positive numbers will scroll the - * content up. - */ - public void startScroll(int startX, int startY, int dx, int dy) { - startScroll(startX, startY, dx, dy, DEFAULT_DURATION); - } - - /** - * Start scrolling by providing a starting point, the distance to travel, - * and the duration of the scroll. - * - * @param startX Starting horizontal scroll offset in pixels. Positive - * numbers will scroll the content to the left. - * @param startY Starting vertical scroll offset in pixels. Positive numbers - * will scroll the content up. - * @param dx Horizontal distance to travel. Positive numbers will scroll the - * content to the left. - * @param dy Vertical distance to travel. Positive numbers will scroll the - * content up. - * @param duration Duration of the scroll in milliseconds. - */ - public void startScroll(int startX, int startY, int dx, int dy, int duration) { - mMode = SCROLL_MODE; - mFinished = false; - mDuration = duration; - mStartTime = AnimationUtils.currentAnimationTimeMillis(); - mStartX = startX; - mStartY = startY; - mFinalX = startX + dx; - mFinalY = startY + dy; - mDeltaX = dx; - mDeltaY = dy; - mDurationReciprocal = 1.0f / (float) mDuration; - } - - /** - * Start scrolling based on a fling gesture. The distance travelled will - * depend on the initial velocity of the fling. - * - * @param startX Starting point of the scroll (X) - * @param startY Starting point of the scroll (Y) - * @param velocityX Initial velocity of the fling (X) measured in pixels per - * second. - * @param velocityY Initial velocity of the fling (Y) measured in pixels per - * second - * @param minX Minimum X value. The scroller will not scroll past this - * point. - * @param maxX Maximum X value. The scroller will not scroll past this - * point. - * @param minY Minimum Y value. The scroller will not scroll past this - * point. - * @param maxY Maximum Y value. The scroller will not scroll past this - * point. - */ - public void fling(int startX, int startY, int velocityX, int velocityY, - int minX, int maxX, int minY, int maxY) { - // Continue a scroll or fling in progress - if (mFlywheel && !mFinished) { - float oldVel = getCurrVelocity(); - - float dx = (float) (mFinalX - mStartX); - float dy = (float) (mFinalY - mStartY); - float hyp = (float) Math.hypot(dx, dy); - - float ndx = dx / hyp; - float ndy = dy / hyp; - - float oldVelocityX = ndx * oldVel; - float oldVelocityY = ndy * oldVel; - if (Math.signum(velocityX) == Math.signum(oldVelocityX) && - Math.signum(velocityY) == Math.signum(oldVelocityY)) { - velocityX += oldVelocityX; - velocityY += oldVelocityY; - } - } - - mMode = FLING_MODE; - mFinished = false; - - float velocity = (float) Math.hypot(velocityX, velocityY); - - mVelocity = velocity; - mDuration = getSplineFlingDuration(velocity); - mStartTime = AnimationUtils.currentAnimationTimeMillis(); - mStartX = startX; - mStartY = startY; - - float coeffX = velocity == 0 ? 1.0f : velocityX / velocity; - float coeffY = velocity == 0 ? 1.0f : velocityY / velocity; - - double totalDistance = getSplineFlingDistance(velocity); - mDistance = (int) (totalDistance * Math.signum(velocity)); - - mMinX = minX; - mMaxX = maxX; - mMinY = minY; - mMaxY = maxY; - - mFinalX = startX + (int) Math.round(totalDistance * coeffX); - // Pin to mMinX <= mFinalX <= mMaxX - mFinalX = Math.min(mFinalX, mMaxX); - mFinalX = Math.max(mFinalX, mMinX); - - mFinalY = startY + (int) Math.round(totalDistance * coeffY); - // Pin to mMinY <= mFinalY <= mMaxY - mFinalY = Math.min(mFinalY, mMaxY); - mFinalY = Math.max(mFinalY, mMinY); - } - - private double getSplineDeceleration(float velocity) { - return Math.log(INFLEXION * Math.abs(velocity) / (mFlingFriction * mPhysicalCoeff)); + public void setInterpolator(TimeInterpolator interpolator) { + mInterpolatorWrapper.interpolator = interpolator; } - private int getSplineFlingDuration(float velocity) { - final double l = getSplineDeceleration(velocity); - final double decelMinusOne = DECELERATION_RATE - 1.0; - return (int) (1000.0 * Math.exp(l / decelMinusOne)); - } + private static class InterpolatorWrapper implements Interpolator { - private double getSplineFlingDistance(float velocity) { - final double l = getSplineDeceleration(velocity); - final double decelMinusOne = DECELERATION_RATE - 1.0; - return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l); - } + public TimeInterpolator interpolator; - static float viscousFluid(float x) - { - x *= sViscousFluidScale; - if (x < 1.0f) { - x -= (1.0f - (float)Math.exp(-x)); - } else { - float start = 0.36787944117f; // 1/e == exp(-1) - x = 1.0f - (float)Math.exp(1.0f - x); - x = start + x * (1.0f - start); + @Override + public float getInterpolation(float v) { + return interpolator == null ? v : interpolator.getInterpolation(v); } - x *= sViscousFluidNormalize; - return x; - } - - /** - * Stops the animation. Contrary to {@link #forceFinished(boolean)}, - * aborting the animating cause the scroller to move to the final x and y - * position - * - * @see #forceFinished(boolean) - */ - public void abortAnimation() { - mCurrX = mFinalX; - mCurrY = mFinalY; - mFinished = true; - } - - /** - * Extend the scroll animation. This allows a running animation to scroll - * further and longer, when used with {@link #setFinalX(int)} or {@link #setFinalY(int)}. - * - * @param extend Additional time to scroll in milliseconds. - * @see #setFinalX(int) - * @see #setFinalY(int) - */ - public void extendDuration(int extend) { - int passed = timePassed(); - mDuration = passed + extend; - mDurationReciprocal = 1.0f / mDuration; - mFinished = false; - } - - /** - * Returns the time elapsed since the beginning of the scrolling. - * - * @return The elapsed time in milliseconds. - */ - public int timePassed() { - return (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime); - } - - /** - * Sets the final position (X) for this scroller. - * - * @param newX The new X offset as an absolute distance from the origin. - * @see #extendDuration(int) - * @see #setFinalY(int) - */ - public void setFinalX(int newX) { - mFinalX = newX; - mDeltaX = mFinalX - mStartX; - mFinished = false; - } - - /** - * Sets the final position (Y) for this scroller. - * - * @param newY The new Y offset as an absolute distance from the origin. - * @see #extendDuration(int) - * @see #setFinalX(int) - */ - public void setFinalY(int newY) { - mFinalY = newY; - mDeltaY = mFinalY - mStartY; - mFinished = false; - } - - /** - * @hide - */ - public boolean isScrollingInDirection(float xvel, float yvel) { - return !mFinished && Math.signum(xvel) == Math.signum(mFinalX - mStartX) && - Math.signum(yvel) == Math.signum(mFinalY - mStartY); } } -- GitLab From 1e819d5ae593cc1933f854f9eb572bc63b3f3960 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 28 Jun 2018 12:11:30 -0700 Subject: [PATCH 0017/1301] Import translations. DO NOT MERGE Change-Id: Ib5c08722b8ccc9194894bf7b007cd5d59a74829a Auto-generated-cl: translation import --- res/values-zh-rHK/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 5a8c6caec6..2677b21295 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -41,7 +41,7 @@ "搜尋更多應用程式" "通知" "按住捷徑即可選取。" - "撳兩下之後撳住,就可以揀選捷徑或者用自訂嘅操作。" + "連㩒兩下之後繼續㩒住,就可以揀選捷徑或者用自訂嘅操作。" "主畫面已無空間。" "我的收藏寄存區沒有足夠空間" "應用程式清單" -- GitLab From 7f920b8d5ed41375641cc991a037499443dc9098 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 27 Jun 2018 15:47:49 -0700 Subject: [PATCH 0018/1301] Cleaning up build rules to simplify customizing derivative projects > Using {packageName} instead of hardcoding com.android.launcher3 in AndroidManifest.xml for strings which are dependent on packageName > Adding proguard rule to prevent obfuscating any overridable class > Making it easier to extend SettingsActivity by overriding the fragment class Change-Id: I5668c3f33b4cf20ad01d7f54b3d79cc0d268d391 --- AndroidManifest-common.xml | 48 +++++++++++++++++ AndroidManifest.xml | 49 ----------------- proguard.flags | 19 ++----- quickstep/AndroidManifest.xml | 6 +-- .../android/quickstep/OverviewCallbacks.java | 6 +-- .../android/quickstep/TaskOverlayFactory.java | 6 +-- res/values/config.xml | 6 +-- src/com/android/launcher3/AppFilter.java | 6 ++- src/com/android/launcher3/IconProvider.java | 6 ++- .../LauncherAppTransitionManager.java | 6 ++- .../launcher3/MainProcessInitializer.java | 5 +- .../android/launcher3/SettingsActivity.java | 23 +++++++- src/com/android/launcher3/Utilities.java | 20 ------- .../launcher3/graphics/DrawableFactory.java | 5 +- .../logging/UserEventDispatcher.java | 5 +- .../launcher3/util/InstantAppResolver.java | 5 +- .../launcher3/util/ResourceBasedOverride.java | 54 +++++++++++++++++++ .../uioverrides/WallpaperColorInfo.java | 2 +- .../dynamicui/ColorExtractionAlgorithm.java | 7 --- 19 files changed, 163 insertions(+), 121 deletions(-) create mode 100644 src/com/android/launcher3/util/ResourceBasedOverride.java diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml index 211e1ff37f..8f4d5bece5 100644 --- a/AndroidManifest-common.xml +++ b/AndroidManifest-common.xml @@ -44,6 +44,28 @@ + + + + + + + + + + + + + + + + + + + diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 3212980a05..4ac51ab788 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -26,29 +26,6 @@ Refer comments around specific entries on how to extend individual components. --> - - - - - - - - - - - - - - - - - - - - diff --git a/proguard.flags b/proguard.flags index e4011165e1..ddae07e0d9 100644 --- a/proguard.flags +++ b/proguard.flags @@ -97,30 +97,19 @@ # support jar. -keep class android.support.v7.widget.RecyclerView { *; } -# LauncherAppTransitionManager --keep class com.android.launcher3.LauncherAppTransitionManagerImpl { +# Preference fragments +-keep class ** extends android.preference.PreferenceFragment { public (...); } -# InstantAppResolver --keep class com.android.quickstep.InstantAppResolverImpl { - public (...); -} - -# MainProcessInitializer --keep class com.android.quickstep.QuickstepProcessInitializer { - public (...); -} - -# UserEventDispatcherExtension --keep class com.android.quickstep.logging.UserEventDispatcherExtension { +## Prevent obfuscating various overridable objects +-keep class ** implements com.android.launcher3.util.ResourceBasedOverride { public (...); } -keep interface com.android.launcher3.userevent.nano.LauncherLogProto.** { *; } - -keep interface com.android.launcher3.model.nano.LauncherDumpProto.** { *; } diff --git a/quickstep/AndroidManifest.xml b/quickstep/AndroidManifest.xml index cb7485587d..74e0b1e777 100644 --- a/quickstep/AndroidManifest.xml +++ b/quickstep/AndroidManifest.xml @@ -24,6 +24,7 @@ + - + - diff --git a/quickstep/src/com/android/quickstep/OverviewCallbacks.java b/quickstep/src/com/android/quickstep/OverviewCallbacks.java index ac4a40b983..ef9c5c0d94 100644 --- a/quickstep/src/com/android/quickstep/OverviewCallbacks.java +++ b/quickstep/src/com/android/quickstep/OverviewCallbacks.java @@ -18,20 +18,20 @@ package com.android.quickstep; import android.content.Context; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.util.Preconditions; +import com.android.launcher3.util.ResourceBasedOverride; /** * Callbacks related to overview/quicksteps. */ -public class OverviewCallbacks { +public class OverviewCallbacks implements ResourceBasedOverride { private static OverviewCallbacks sInstance; public static OverviewCallbacks get(Context context) { Preconditions.assertUIThread(); if (sInstance == null) { - sInstance = Utilities.getOverrideObject(OverviewCallbacks.class, + sInstance = Overrides.getObject(OverviewCallbacks.class, context.getApplicationContext(), R.string.overview_callbacks_class); } return sInstance; diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java index 9d3ac6af6f..c272b1a7ef 100644 --- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java +++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java @@ -22,22 +22,22 @@ import android.support.annotation.AnyThread; import android.view.View; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.util.Preconditions; +import com.android.launcher3.util.ResourceBasedOverride; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; /** * Factory class to create and add an overlays on the TaskView */ -public class TaskOverlayFactory { +public class TaskOverlayFactory implements ResourceBasedOverride { private static TaskOverlayFactory sInstance; public static TaskOverlayFactory get(Context context) { Preconditions.assertUIThread(); if (sInstance == null) { - sInstance = Utilities.getOverrideObject(TaskOverlayFactory.class, + sInstance = Overrides.getObject(TaskOverlayFactory.class, context.getApplicationContext(), R.string.task_overlay_factory_class); } return sInstance; diff --git a/res/values/config.xml b/res/values/config.xml index f2d6c21816..f462b9c534 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -18,6 +18,9 @@ #Intent;action=android.intent.action.DELETE;launchFlags=0x10800000;end + + com.android.launcher3.SettingsActivity$LauncherSettingsFragment + @@ -92,9 +95,6 @@ - - - diff --git a/src/com/android/launcher3/AppFilter.java b/src/com/android/launcher3/AppFilter.java index 923835a679..9b6166ffcf 100644 --- a/src/com/android/launcher3/AppFilter.java +++ b/src/com/android/launcher3/AppFilter.java @@ -3,10 +3,12 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.Context; -public class AppFilter { +import com.android.launcher3.util.ResourceBasedOverride; + +public class AppFilter implements ResourceBasedOverride { public static AppFilter newInstance(Context context) { - return Utilities.getOverrideObject(AppFilter.class, context, R.string.app_filter_class); + return Overrides.getObject(AppFilter.class, context, R.string.app_filter_class); } public boolean shouldShowApp(ComponentName app) { diff --git a/src/com/android/launcher3/IconProvider.java b/src/com/android/launcher3/IconProvider.java index b469a8f454..ed8d03c47a 100644 --- a/src/com/android/launcher3/IconProvider.java +++ b/src/com/android/launcher3/IconProvider.java @@ -5,14 +5,16 @@ import android.content.pm.LauncherActivityInfo; import android.graphics.drawable.Drawable; import android.os.Build; +import com.android.launcher3.util.ResourceBasedOverride; + import java.util.Locale; -public class IconProvider { +public class IconProvider implements ResourceBasedOverride { protected String mSystemState; public static IconProvider newInstance(Context context) { - IconProvider provider = Utilities.getOverrideObject( + IconProvider provider = Overrides.getObject( IconProvider.class, context, R.string.icon_provider_class); provider.updateSystemStateString(context); return provider; diff --git a/src/com/android/launcher3/LauncherAppTransitionManager.java b/src/com/android/launcher3/LauncherAppTransitionManager.java index 4037a23ff4..970e558786 100644 --- a/src/com/android/launcher3/LauncherAppTransitionManager.java +++ b/src/com/android/launcher3/LauncherAppTransitionManager.java @@ -23,13 +23,15 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.view.View; +import com.android.launcher3.util.ResourceBasedOverride; + /** * Manages the opening and closing app transitions from Launcher. */ -public class LauncherAppTransitionManager { +public class LauncherAppTransitionManager implements ResourceBasedOverride { public static LauncherAppTransitionManager newInstance(Context context) { - return Utilities.getOverrideObject(LauncherAppTransitionManager.class, + return Overrides.getObject(LauncherAppTransitionManager.class, context, R.string.app_transition_manager_class); } diff --git a/src/com/android/launcher3/MainProcessInitializer.java b/src/com/android/launcher3/MainProcessInitializer.java index 462eadb344..0028f97cd7 100644 --- a/src/com/android/launcher3/MainProcessInitializer.java +++ b/src/com/android/launcher3/MainProcessInitializer.java @@ -20,14 +20,15 @@ import android.content.Context; import com.android.launcher3.graphics.IconShapeOverride; import com.android.launcher3.logging.FileLog; +import com.android.launcher3.util.ResourceBasedOverride; /** * Utility class to handle one time initializations of the main process */ -public class MainProcessInitializer { +public class MainProcessInitializer implements ResourceBasedOverride { public static void initialize(Context context) { - Utilities.getOverrideObject( + Overrides.getObject( MainProcessInitializer.class, context, R.string.main_process_initializer_class) .init(context); } diff --git a/src/com/android/launcher3/SettingsActivity.java b/src/com/android/launcher3/SettingsActivity.java index 32c198ab0a..8589b7ee63 100644 --- a/src/com/android/launcher3/SettingsActivity.java +++ b/src/com/android/launcher3/SettingsActivity.java @@ -24,6 +24,7 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; +import android.app.Fragment; import android.app.FragmentManager; import android.content.ComponentName; import android.content.ContentResolver; @@ -53,7 +54,8 @@ import java.util.Objects; /** * Settings activity for Launcher. Currently implements the following setting: Allow rotation */ -public class SettingsActivity extends Activity { +public class SettingsActivity extends Activity + implements PreferenceFragment.OnPreferenceStartFragmentCallback { private static final String ICON_BADGING_PREFERENCE_KEY = "pref_icon_badging"; /** Hidden field Settings.Secure.NOTIFICATION_BADGING */ @@ -71,9 +73,10 @@ public class SettingsActivity extends Activity { super.onCreate(savedInstanceState); if (savedInstanceState == null) { + Fragment f = Fragment.instantiate(this, getString(R.string.settings_fragment_name)); // Display the fragment as the main content. getFragmentManager().beginTransaction() - .replace(android.R.id.content, getNewFragment()) + .replace(android.R.id.content, f) .commit(); } } @@ -82,6 +85,22 @@ public class SettingsActivity extends Activity { return new LauncherSettingsFragment(); } + @Override + public boolean onPreferenceStartFragment( + PreferenceFragment preferenceFragment, Preference pref) { + Fragment f = Fragment.instantiate(this, pref.getFragment(), pref.getExtras()); + if (f instanceof DialogFragment) { + ((DialogFragment) f).show(getFragmentManager(), pref.getKey()); + } else { + getFragmentManager() + .beginTransaction() + .replace(android.R.id.content, f) + .addToBackStack(pref.getKey()) + .commit(); + } + return true; + } + /** * This fragment shows the launcher preferences. */ diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 7fe8d35cb6..8683b2103b 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -55,7 +55,6 @@ import com.android.launcher3.config.FeatureFlags; import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collection; import java.util.HashSet; @@ -581,25 +580,6 @@ public final class Utilities { || e.getCause() instanceof DeadObjectException; } - public static T getOverrideObject(Class clazz, Context context, int resId) { - String className = context.getString(resId); - if (!TextUtils.isEmpty(className)) { - try { - Class cls = Class.forName(className); - return (T) cls.getDeclaredConstructor(Context.class).newInstance(context); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException - | ClassCastException | NoSuchMethodException | InvocationTargetException e) { - Log.e(TAG, "Bad overriden class", e); - } - } - - try { - return clazz.newInstance(); - } catch (InstantiationException|IllegalAccessException e) { - throw new RuntimeException(e); - } - } - /** * Returns a HashSet with a single element. We use this instead of Collections.singleton() * because HashSet ensures all operations, such as remove, are supported. diff --git a/src/com/android/launcher3/graphics/DrawableFactory.java b/src/com/android/launcher3/graphics/DrawableFactory.java index 34a4e2d771..bbc013d506 100644 --- a/src/com/android/launcher3/graphics/DrawableFactory.java +++ b/src/com/android/launcher3/graphics/DrawableFactory.java @@ -36,11 +36,12 @@ import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.allapps.AllAppsBackgroundDrawable; +import com.android.launcher3.util.ResourceBasedOverride; /** * Factory for creating new drawables. */ -public class DrawableFactory { +public class DrawableFactory implements ResourceBasedOverride { private static final String TAG = "DrawableFactory"; @@ -52,7 +53,7 @@ public class DrawableFactory { public static DrawableFactory get(Context context) { synchronized (LOCK) { if (sInstance == null) { - sInstance = Utilities.getOverrideObject(DrawableFactory.class, + sInstance = Overrides.getObject(DrawableFactory.class, context.getApplicationContext(), R.string.drawable_factory_class); } return sInstance; diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index d1e1051eee..d9d3f6821d 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -51,6 +51,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.InstantAppResolver; import com.android.launcher3.util.LogConfig; +import com.android.launcher3.util.ResourceBasedOverride; import java.util.Locale; import java.util.UUID; @@ -61,7 +62,7 @@ import java.util.UUID; * * $ adb shell setprop log.tag.UserEvent VERBOSE */ -public class UserEventDispatcher { +public class UserEventDispatcher implements ResourceBasedOverride { private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5; @@ -78,7 +79,7 @@ public class UserEventDispatcher { uuidStr = UUID.randomUUID().toString(); sharedPrefs.edit().putString(UUID_STORAGE, uuidStr).apply(); } - UserEventDispatcher ued = Utilities.getOverrideObject(UserEventDispatcher.class, + UserEventDispatcher ued = Overrides.getObject(UserEventDispatcher.class, context.getApplicationContext(), R.string.user_event_dispatcher_class); ued.mDelegate = delegate; ued.mIsInLandscapeMode = dp.isVerticalBarLayout(); diff --git a/src/com/android/launcher3/util/InstantAppResolver.java b/src/com/android/launcher3/util/InstantAppResolver.java index 4485427f57..5dc7af855b 100644 --- a/src/com/android/launcher3/util/InstantAppResolver.java +++ b/src/com/android/launcher3/util/InstantAppResolver.java @@ -23,7 +23,6 @@ import android.util.Log; import com.android.launcher3.AppInfo; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import java.util.Collections; import java.util.List; @@ -31,10 +30,10 @@ import java.util.List; /** * A wrapper class to access instant app related APIs. */ -public class InstantAppResolver { +public class InstantAppResolver implements ResourceBasedOverride { public static InstantAppResolver newInstance(Context context) { - return Utilities.getOverrideObject( + return Overrides.getObject( InstantAppResolver.class, context, R.string.instant_app_resolver_class); } diff --git a/src/com/android/launcher3/util/ResourceBasedOverride.java b/src/com/android/launcher3/util/ResourceBasedOverride.java new file mode 100644 index 0000000000..e2c4992a44 --- /dev/null +++ b/src/com/android/launcher3/util/ResourceBasedOverride.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.util; + +import android.content.Context; +import android.text.TextUtils; +import android.util.Log; + +import java.lang.reflect.InvocationTargetException; + +/** + * An interface to indicate that a class is dynamically loaded using resource overlay, hence its + * class name and constructor should be preserved by proguard + */ +public interface ResourceBasedOverride { + + class Overrides { + + private static final String TAG = "Overrides"; + + public static T getObject( + Class clazz, Context context, int resId) { + String className = context.getString(resId); + if (!TextUtils.isEmpty(className)) { + try { + Class cls = Class.forName(className); + return (T) cls.getDeclaredConstructor(Context.class).newInstance(context); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | ClassCastException | NoSuchMethodException | InvocationTargetException e) { + Log.e(TAG, "Bad overriden class", e); + } + } + + try { + return clazz.newInstance(); + } catch (InstantiationException|IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/WallpaperColorInfo.java b/src_ui_overrides/com/android/launcher3/uioverrides/WallpaperColorInfo.java index 21070941bc..56e326002a 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/WallpaperColorInfo.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/WallpaperColorInfo.java @@ -56,7 +56,7 @@ public class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChange private WallpaperColorInfo(Context context) { mWallpaperManager = WallpaperManagerCompat.getInstance(context); mWallpaperManager.addOnColorsChangedListener(this); - mExtractionType = ColorExtractionAlgorithm.newInstance(context); + mExtractionType = new ColorExtractionAlgorithm(); update(mWallpaperManager.getWallpaperColors(FLAG_SYSTEM)); } diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/ColorExtractionAlgorithm.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/ColorExtractionAlgorithm.java index 0444212b85..21b324f07a 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/ColorExtractionAlgorithm.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/ColorExtractionAlgorithm.java @@ -16,7 +16,6 @@ package com.android.launcher3.uioverrides.dynamicui; -import android.content.Context; import android.graphics.Color; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -25,7 +24,6 @@ import android.util.Log; import android.util.Pair; import android.util.Range; -import com.android.launcher3.R; import com.android.launcher3.Utilities; import java.util.Arrays; @@ -37,11 +35,6 @@ import java.util.List; **/ 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 -- GitLab From 87555c56dc464186219538c2b530bd275f8a8d1d Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Thu, 28 Jun 2018 14:23:32 -0700 Subject: [PATCH 0019/1301] Fixed small line that may appear opening task menu with decimal position Round the y and x values to get correct position without showing a small line when opening the task menu. Test: increase the display and font size to large, go to overview and tap icon Fixes: 110415497 Change-Id: Ia41378863fb08fc72f5cd14b40f45769ab612d22 --- quickstep/src/com/android/quickstep/views/TaskMenuView.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java index 6eb685479b..098349a7ba 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java +++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java @@ -175,9 +175,9 @@ public class TaskMenuView extends AbstractFloatingView { params.width = sTempRect.width(); params.gravity = Gravity.LEFT; setLayoutParams(params); - setX(sTempRect.left - insets.left); - setY(sTempRect.top + getResources().getDimension(R.dimen.task_thumbnail_top_margin) - - insets.top); + setX(Math.round(sTempRect.left - insets.left)); + setY(Math.round(sTempRect.top - insets.top + + getResources().getDimension(R.dimen.task_thumbnail_top_margin))); } private void animateOpen() { -- GitLab From d0e360a8586f17268d57eb6c4dc01d21f1883f32 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 29 Jun 2018 14:40:18 -0700 Subject: [PATCH 0020/1301] Lazy loading LauncherAppState Separating InvarantDeviceProfile out of LauncherAppState and creating LauncherAppState only when it is actually used Change-Id: I2ee55f53cae01f11203f94675bb5f70c65ad2b9d --- .../quickstep/OverviewCommandHelper.java | 10 +--- .../android/quickstep/RecentsActivity.java | 21 ++----- .../WindowTransformSwipeHandler.java | 6 +- .../launcher3/InvariantDeviceProfile.java | 12 +++- .../android/launcher3/LauncherAppState.java | 38 +++--------- .../util/MainThreadInitializedObject.java | 60 +++++++++++++++++++ 6 files changed, 88 insertions(+), 59 deletions(-) create mode 100644 src/com/android/launcher3/util/MainThreadInitializedObject.java diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index eff94fcb5c..7094a53dbd 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -197,14 +197,10 @@ public class OverviewCommandHelper { } public void onTip(int actionType, int viewType) { - mMainThreadExecutor.execute(new Runnable() { - @Override - public void run() { + mMainThreadExecutor.execute(() -> UserEventDispatcher.newInstance(mContext, - new InvariantDeviceProfile(mContext).getDeviceProfile(mContext)) - .logActionTip(actionType, viewType); - } - }); + InvariantDeviceProfile.INSTANCE.get(mContext).getDeviceProfile(mContext)) + .logActionTip(actionType, viewType)); } public ActivityControlHelper getActivityControlHelper() { diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index ed8b4d2b1a..32079bf13a 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -42,7 +42,6 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAnimationRunner; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.badge.BadgeInfo; @@ -131,21 +130,13 @@ public class RecentsActivity extends BaseDraggingActivity { } private void initDeviceProfile() { - // In case we are reusing IDP, create a copy so that we dont conflict with Launcher + DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(this).getDeviceProfile(this); + + // In case we are reusing IDP, create a copy so that we don't conflict with Launcher // activity. - LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); - if (isInMultiWindowModeCompat()) { - InvariantDeviceProfile idp = appState == null - ? new InvariantDeviceProfile(this) : appState.getInvariantDeviceProfile(); - DeviceProfile dp = idp.getDeviceProfile(this); - mDeviceProfile = mRecentsRootView == null ? dp.copy(this) - : dp.getMultiWindowProfile(this, mRecentsRootView.getLastKnownSize()); - } else { - // If we are reusing the Invariant device profile, make a copy. - mDeviceProfile = appState == null - ? new InvariantDeviceProfile(this).getDeviceProfile(this) - : appState.getInvariantDeviceProfile().getDeviceProfile(this).copy(this); - } + mDeviceProfile = (mRecentsRootView != null) && isInMultiWindowModeCompat() + ? dp.getMultiWindowProfile(this, mRecentsRootView.getLastKnownSize()) + : dp.copy(this); onDeviceProfileInitiated(); } diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 15ff19e260..366263309b 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -57,7 +57,6 @@ import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.DeviceProfile; import com.android.launcher3.InvariantDeviceProfile; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; @@ -611,10 +610,7 @@ public class WindowTransformSwipeHandler { public void onRecentsAnimationStart(RecentsAnimationControllerCompat controller, RemoteAnimationTargetSet targets, Rect homeContentInsets, Rect minimizedHomeBounds) { - LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); - InvariantDeviceProfile idp = appState == null ? - new InvariantDeviceProfile(mContext) : appState.getInvariantDeviceProfile(); - DeviceProfile dp = idp.getDeviceProfile(mContext); + DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(mContext).getDeviceProfile(mContext); final Rect overviewStackBounds; RemoteAnimationTargetCompat runningTaskTarget = targets.findTask(mRunningTaskId); diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index f63cce58d2..22bc162b65 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -29,6 +29,8 @@ import android.view.Display; import android.view.WindowManager; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.util.ConfigMonitor; +import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.Thunk; import org.xmlpull.v1.XmlPullParser; @@ -41,8 +43,12 @@ import java.util.Comparator; public class InvariantDeviceProfile { - // This is a static that we use for the default icon size on a 4/5-inch phone - private static float DEFAULT_ICON_SIZE_DP = 60; + // We do not need any synchronization for this variable as its only written on UI thread. + public static final MainThreadInitializedObject INSTANCE = + new MainThreadInitializedObject<>((c) -> { + new ConfigMonitor(c).register(); + return new InvariantDeviceProfile(c); + }); private static final float ICON_SIZE_DEFINED_IN_APP_DP = 48; @@ -118,7 +124,7 @@ public class InvariantDeviceProfile { } @TargetApi(23) - public InvariantDeviceProfile(Context context) { + private InvariantDeviceProfile(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); DisplayMetrics dm = new DisplayMetrics(); diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index a46692b0b5..5159de17af 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -16,12 +16,13 @@ package com.android.launcher3; +import static com.android.launcher3.SettingsActivity.NOTIFICATION_BADGING; + import android.content.ComponentName; import android.content.ContentProviderClient; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.os.Looper; import android.util.Log; import com.android.launcher3.compat.LauncherAppsCompat; @@ -29,21 +30,17 @@ import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.notification.NotificationListener; -import com.android.launcher3.util.ConfigMonitor; +import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.SettingsObserver; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; - -import static com.android.launcher3.SettingsActivity.NOTIFICATION_BADGING; - public class LauncherAppState { public static final String ACTION_FORCE_ROLOAD = "force-reload-launcher"; // We do not need any synchronization for this variable as its only written on UI thread. - private static LauncherAppState INSTANCE; + private static final MainThreadInitializedObject INSTANCE = + new MainThreadInitializedObject<>((c) -> new LauncherAppState(c)); private final Context mContext; private final LauncherModel mModel; @@ -53,27 +50,11 @@ public class LauncherAppState { private final SettingsObserver mNotificationBadgingObserver; public static LauncherAppState getInstance(final Context context) { - if (INSTANCE == null) { - if (Looper.myLooper() == Looper.getMainLooper()) { - INSTANCE = new LauncherAppState(context.getApplicationContext()); - } else { - try { - return new MainThreadExecutor().submit(new Callable() { - @Override - public LauncherAppState call() throws Exception { - return LauncherAppState.getInstance(context); - } - }).get(); - } catch (InterruptedException|ExecutionException e) { - throw new RuntimeException(e); - } - } - } - return INSTANCE; + return INSTANCE.get(context); } public static LauncherAppState getInstanceNoCreate() { - return INSTANCE; + return INSTANCE.getNoCreate(); } public Context getContext() { @@ -89,7 +70,7 @@ public class LauncherAppState { Preconditions.assertUIThread(); mContext = context; - mInvariantDeviceProfile = new InvariantDeviceProfile(mContext); + mInvariantDeviceProfile = InvariantDeviceProfile.INSTANCE.get(mContext); mIconCache = new IconCache(mContext, mInvariantDeviceProfile); mWidgetCache = new WidgetPreviewLoader(mContext, mIconCache); mModel = new LauncherModel(this, mIconCache, AppFilter.newInstance(mContext)); @@ -112,7 +93,6 @@ public class LauncherAppState { mContext.registerReceiver(mModel, filter); UserManagerCompat.getInstance(mContext).enableAndResetCache(); - new ConfigMonitor(mContext).register(); if (!mContext.getResources().getBoolean(R.bool.notification_badging_enabled)) { mNotificationBadgingObserver = null; @@ -171,7 +151,7 @@ public class LauncherAppState { * Shorthand for {@link #getInvariantDeviceProfile()} */ public static InvariantDeviceProfile getIDP(Context context) { - return LauncherAppState.getInstance(context).getInvariantDeviceProfile(); + return InvariantDeviceProfile.INSTANCE.get(context); } private static LauncherProvider getLocalProvider(Context context) { diff --git a/src/com/android/launcher3/util/MainThreadInitializedObject.java b/src/com/android/launcher3/util/MainThreadInitializedObject.java new file mode 100644 index 0000000000..5747db1c1c --- /dev/null +++ b/src/com/android/launcher3/util/MainThreadInitializedObject.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.util; + +import android.content.Context; +import android.os.Looper; + +import com.android.launcher3.MainThreadExecutor; + +import java.util.concurrent.ExecutionException; + +/** + * Utility class for defining singletons which are initiated on main thread. + */ +public class MainThreadInitializedObject { + + private final ObjectProvider mProvider; + private T mValue; + + public MainThreadInitializedObject(ObjectProvider provider) { + mProvider = provider; + } + + public T get(Context context) { + if (mValue == null) { + if (Looper.myLooper() == Looper.getMainLooper()) { + mValue = mProvider.get(context.getApplicationContext()); + } else { + try { + return new MainThreadExecutor().submit(() -> get(context)).get(); + } catch (InterruptedException|ExecutionException e) { + throw new RuntimeException(e); + } + } + } + return mValue; + } + + public T getNoCreate() { + return mValue; + } + + public interface ObjectProvider { + + T get(Context context); + } +} -- GitLab From ce368154cebf4ab5da9976aa4897317abc55ab1d Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 8 Jun 2018 15:52:53 -0700 Subject: [PATCH 0021/1301] Prevent extra call to set activity orientation. - We can request the locked orientation for quickscrub only when we start quickscrub Bug: 80500702 Change-Id: I2e83ff916f92959fccf79f1d6b987806338512f5 --- .../src/com/android/quickstep/ActivityControlHelper.java | 5 +++++ .../com/android/quickstep/views/LauncherLayoutListener.java | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 275075f27a..8fa6c4909c 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -23,6 +23,7 @@ import static com.android.launcher3.LauncherState.FAST_OVERVIEW; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK; import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL; import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB; import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA; @@ -156,6 +157,10 @@ public interface ActivityControlHelper { QuickScrubController controller = activity.getOverviewPanel() .getQuickScrubController(); controller.onQuickScrubStart(activityVisible && !fromState.overviewUi, this); + + // For the duration of the gesture, lock the screen orientation to ensure that we do not + // rotate mid-quickscrub + activity.getRotationHelper().setStateHandlerRequest(REQUEST_LOCK); } @Override diff --git a/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java b/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java index c149de54f0..61740d729b 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java +++ b/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java @@ -40,10 +40,6 @@ public class LauncherLayoutListener extends AbstractFloatingView super(launcher, null); mLauncher = launcher; setVisibility(INVISIBLE); - - // For the duration of the gesture, lock the screen orientation to ensure that we do not - // rotate mid-quickscrub - launcher.getRotationHelper().setStateHandlerRequest(REQUEST_LOCK); } @Override -- GitLab From 7edf3d3f9ae83ac72ee73bc4ebb63aea18a2b7d7 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 9 Jul 2018 15:08:03 -0700 Subject: [PATCH 0022/1301] Only call requestUnbind if we are connected. Somethimes onSettingChanged can come after the connected has disconnected because of posting message on the different thread. Bug: 110929527 Change-Id: I09f503c2f2f437c8656d491a7fdec3ce4e82257b --- .../android/launcher3/notification/NotificationListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/notification/NotificationListener.java b/src/com/android/launcher3/notification/NotificationListener.java index b527b6a8d2..ac5aaf8538 100644 --- a/src/com/android/launcher3/notification/NotificationListener.java +++ b/src/com/android/launcher3/notification/NotificationListener.java @@ -197,7 +197,7 @@ public class NotificationListener extends NotificationListenerService { mNotificationBadgingObserver = new SettingsObserver.Secure(getContentResolver()) { @Override public void onSettingChanged(boolean isNotificationBadgingEnabled) { - if (!isNotificationBadgingEnabled) { + if (!isNotificationBadgingEnabled && sIsConnected) { requestUnbind(); } } -- GitLab From 83fd25e3af387325eb99ddd05b4601af9ad3de03 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 9 Jul 2018 16:47:01 -0700 Subject: [PATCH 0023/1301] Moving some abstract classes to interfaces, to better use java-8 features Change-Id: I862af4931c95cbde052130d8b7d4ac3375db782f --- src/com/android/launcher3/IconCache.java | 19 +---- .../launcher3/InstallShortcutReceiver.java | 12 +-- src/com/android/launcher3/Launcher.java | 8 +- src/com/android/launcher3/LauncherModel.java | 15 ++-- .../OverviewButtonClickListener.java | 51 ----------- src/com/android/launcher3/Workspace.java | 10 --- .../launcher3/graphics/BitmapRenderer.java | 54 ++++++------ .../android/launcher3/model/LoaderTask.java | 14 ++-- .../android/launcher3/util/FloatRange.java | 39 --------- .../launcher3/util/ItemInfoMatcher.java | 84 +++++-------------- src/com/android/launcher3/util/Provider.java | 13 +-- 11 files changed, 67 insertions(+), 252 deletions(-) delete mode 100644 src/com/android/launcher3/OverviewButtonClickListener.java delete mode 100644 src/com/android/launcher3/util/FloatRange.java diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index c5ca183f7d..f496600c7a 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -478,7 +478,8 @@ public class IconCache { info.contentDescription = ""; info.usingLowResIcon = false; } else { - getTitleAndIcon(info, new ActivityInfoProvider(info.getIntent(), info.user), + Intent intent = info.getIntent(); + getTitleAndIcon(info, () -> mLauncherApps.resolveActivity(intent, info.user), true, useLowResIcon); } } @@ -869,22 +870,6 @@ public class IconCache { } } - private class ActivityInfoProvider extends Provider { - - private final Intent mIntent; - private final UserHandle mUser; - - public ActivityInfoProvider(Intent intent, UserHandle user) { - mIntent = intent; - mUser = user; - } - - @Override - public LauncherActivityInfo get() { - return mLauncherApps.resolveActivity(mIntent, mUser); - } - } - /** * Interface for receiving itemInfo with high-res icon. */ diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index fe8a841be9..b9d45fb02e 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -47,7 +47,6 @@ import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.Preconditions; -import com.android.launcher3.util.Provider; import com.android.launcher3.util.Thunk; import org.json.JSONException; @@ -486,13 +485,10 @@ public class InstallShortcutReceiver extends BroadcastReceiver { if (Looper.myLooper() == LauncherModel.getWorkerLooper()) { app.getIconCache().getTitleAndIcon(si, activityInfo, false /* useLowResIcon */); } else { - app.getModel().updateAndBindShortcutInfo(new Provider() { - @Override - public ShortcutInfo get() { - app.getIconCache().getTitleAndIcon( - si, activityInfo, false /* useLowResIcon */); - return si; - } + app.getModel().updateAndBindShortcutInfo(() -> { + app.getIconCache().getTitleAndIcon( + si, activityInfo, false /* useLowResIcon */); + return si; }); } return Pair.create((ItemInfo) si, (Object) activityInfo); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index c3c4f5e5ed..9f16857b6d 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -74,7 +74,6 @@ import android.view.animation.OvershootInterpolator; import android.widget.Toast; import com.android.launcher3.DropTarget.DragObject; -import com.android.launcher3.Workspace.ItemOperator; import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsTransitionController; @@ -1052,12 +1051,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } public FolderIcon findFolderIcon(final long folderIconId) { - return (FolderIcon) mWorkspace.getFirstMatch(new ItemOperator() { - @Override - public boolean evaluate(ItemInfo info, View view) { - return info != null && info.id == folderIconId; - } - }); + return (FolderIcon) mWorkspace.getHomescreenIconByItemId(folderIconId); } /** diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 37538ae0d0..19aa795fec 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -620,15 +620,12 @@ public class LauncherModel extends BroadcastReceiver } public void updateAndBindShortcutInfo(final ShortcutInfo si, final ShortcutInfoCompat info) { - updateAndBindShortcutInfo(new Provider() { - @Override - public ShortcutInfo get() { - si.updateFromDeepShortcutInfo(info, mApp.getContext()); - LauncherIcons li = LauncherIcons.obtain(mApp.getContext()); - li.createShortcutIcon(info).applyTo(si); - li.recycle(); - return si; - } + updateAndBindShortcutInfo(() -> { + si.updateFromDeepShortcutInfo(info, mApp.getContext()); + LauncherIcons li = LauncherIcons.obtain(mApp.getContext()); + li.createShortcutIcon(info).applyTo(si); + li.recycle(); + return si; }); } diff --git a/src/com/android/launcher3/OverviewButtonClickListener.java b/src/com/android/launcher3/OverviewButtonClickListener.java deleted file mode 100644 index dd670d2a7b..0000000000 --- a/src/com/android/launcher3/OverviewButtonClickListener.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.android.launcher3; - -import android.view.View; - -import com.android.launcher3.userevent.nano.LauncherLogProto.Action; - -/** - * A specialized listener for Overview buttons where both clicks and long clicks are logged - * handled the same via {@link #handleViewClick(View)}. - */ -public abstract class OverviewButtonClickListener implements View.OnClickListener, - View.OnLongClickListener { - - private int mControlType; /** ControlType enum as defined in {@link Action.Touch} */ - - public OverviewButtonClickListener(int controlType) { - mControlType = controlType; - } - - public void attachTo(View v) { - v.setOnClickListener(this); - v.setOnLongClickListener(this); - } - - @Override - public void onClick(View view) { - if (shouldPerformClick(view)) { - handleViewClick(view, Action.Touch.TAP); - } - } - - @Override - public boolean onLongClick(View view) { - if (shouldPerformClick(view)) { - handleViewClick(view, Action.Touch.LONGPRESS); - } - return true; - } - - private boolean shouldPerformClick(View view) { - return !Launcher.getLauncher(view.getContext()).getWorkspace().isSwitchingState(); - } - - private void handleViewClick(View view, int action) { - handleViewClick(view); - Launcher.getLauncher(view.getContext()).getUserEventDispatcher() - .logActionOnControl(action, mControlType); - } - - public abstract void handleViewClick(View view); -} \ No newline at end of file diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index abba9c490c..67bdd3bdde 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -3034,16 +3034,6 @@ public class Workspace extends PagedView }); } - public View getViewForTag(final Object tag) { - return getFirstMatch(new ItemOperator() { - - @Override - public boolean evaluate(ItemInfo info, View v) { - return info == tag; - } - }); - } - public LauncherAppWidgetHostView getWidgetForAppWidgetId(final int appWidgetId) { return (LauncherAppWidgetHostView) getFirstMatch(new ItemOperator() { diff --git a/src/com/android/launcher3/graphics/BitmapRenderer.java b/src/com/android/launcher3/graphics/BitmapRenderer.java index 3d11c448a2..2a7f20ea33 100644 --- a/src/com/android/launcher3/graphics/BitmapRenderer.java +++ b/src/com/android/launcher3/graphics/BitmapRenderer.java @@ -23,32 +23,30 @@ import android.os.Build; import com.android.launcher3.Utilities; -public class BitmapRenderer { - - public static final boolean USE_HARDWARE_BITMAP = Utilities.ATLEAST_P; - - public static Bitmap createSoftwareBitmap(int width, int height, Renderer renderer) { - Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - renderer.draw(new Canvas(result)); - return result; - } - - @TargetApi(Build.VERSION_CODES.P) - public static Bitmap createHardwareBitmap(int width, int height, Renderer renderer) { - if (!USE_HARDWARE_BITMAP) { - return createSoftwareBitmap(width, height, renderer); - } - - Picture picture = new Picture(); - renderer.draw(picture.beginRecording(width, height)); - picture.endRecording(); - return Bitmap.createBitmap(picture); - } - - /** - * Interface representing a bitmap draw operation. - */ - public interface Renderer { - void draw(Canvas out); - } +/** + * Interface representing a bitmap draw operation. + */ +public interface BitmapRenderer { + + boolean USE_HARDWARE_BITMAP = Utilities.ATLEAST_P; + + static Bitmap createSoftwareBitmap(int width, int height, BitmapRenderer renderer) { + Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + renderer.draw(new Canvas(result)); + return result; + } + + @TargetApi(Build.VERSION_CODES.P) + static Bitmap createHardwareBitmap(int width, int height, BitmapRenderer renderer) { + if (!USE_HARDWARE_BITMAP) { + return createSoftwareBitmap(width, height, renderer); + } + + Picture picture = new Picture(); + renderer.draw(picture.beginRecording(width, height)); + picture.endRecording(); + return Bitmap.createBitmap(picture); + } + + void draw(Canvas out); } diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index 06da843f7f..e82c8f1004 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -478,15 +478,11 @@ public class LoaderTask implements Runnable { } info = new ShortcutInfo(pinnedShortcut, context); final ShortcutInfo finalInfo = info; - Provider fallbackIconProvider = new Provider() { - @Override - public Bitmap get() { - // If the pinned deep shortcut is no longer published, - // use the last saved icon instead of the default. - return c.loadIcon(finalInfo) - ? finalInfo.iconBitmap : null; - } - }; + // If the pinned deep shortcut is no longer published, + // use the last saved icon instead of the default. + Provider fallbackIconProvider = () -> + c.loadIcon(finalInfo) ? finalInfo.iconBitmap : null; + LauncherIcons li = LauncherIcons.obtain(context); li.createShortcutIcon(pinnedShortcut, true /* badged */, fallbackIconProvider).applyTo(info); diff --git a/src/com/android/launcher3/util/FloatRange.java b/src/com/android/launcher3/util/FloatRange.java deleted file mode 100644 index 12772f3654..0000000000 --- a/src/com/android/launcher3/util/FloatRange.java +++ /dev/null @@ -1,39 +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.util; - -/** - * A mutable class for describing the range of two int values. - */ -public class FloatRange { - - public float start, end; - - public FloatRange() { } - - public FloatRange(float s, float e) { - set(s, e); - } - - public void set(float s, float e) { - start = s; - end = e; - } - - public boolean contains(float value) { - return value >= start && value <= end; - } -} diff --git a/src/com/android/launcher3/util/ItemInfoMatcher.java b/src/com/android/launcher3/util/ItemInfoMatcher.java index daedaef911..19cf6c1e54 100644 --- a/src/com/android/launcher3/util/ItemInfoMatcher.java +++ b/src/com/android/launcher3/util/ItemInfoMatcher.java @@ -18,7 +18,6 @@ package com.android.launcher3.util; import android.content.ComponentName; import android.os.UserHandle; -import android.util.SparseLongArray; import com.android.launcher3.FolderInfo; import com.android.launcher3.ItemInfo; @@ -32,14 +31,14 @@ import java.util.HashSet; /** * A utility class to check for {@link ItemInfo} */ -public abstract class ItemInfoMatcher { +public interface ItemInfoMatcher { - public abstract boolean matches(ItemInfo info, ComponentName cn); + boolean matches(ItemInfo info, ComponentName cn); /** * Filters {@param infos} to those satisfying the {@link #matches(ItemInfo, ComponentName)}. */ - public final HashSet filterItemInfos(Iterable infos) { + default HashSet filterItemInfos(Iterable infos) { HashSet filtered = new HashSet<>(); for (ItemInfo i : infos) { if (i instanceof ShortcutInfo) { @@ -70,88 +69,43 @@ public abstract class ItemInfoMatcher { /** * Returns a new matcher with returns true if either this or {@param matcher} returns true. */ - public ItemInfoMatcher or(final ItemInfoMatcher matcher) { - final ItemInfoMatcher that = this; - return new ItemInfoMatcher() { - @Override - public boolean matches(ItemInfo info, ComponentName cn) { - return that.matches(info, cn) || matcher.matches(info, cn); - } - }; + default ItemInfoMatcher or(ItemInfoMatcher matcher) { + return (info, cn) -> matches(info, cn) || matcher.matches(info, cn); } /** * Returns a new matcher with returns true if both this and {@param matcher} returns true. */ - public ItemInfoMatcher and(final ItemInfoMatcher matcher) { - final ItemInfoMatcher that = this; - return new ItemInfoMatcher() { - @Override - public boolean matches(ItemInfo info, ComponentName cn) { - return that.matches(info, cn) && matcher.matches(info, cn); - } - }; + default ItemInfoMatcher and(ItemInfoMatcher matcher) { + return (info, cn) -> matches(info, cn) && matcher.matches(info, cn); } /** * Returns a new matcher which returns the opposite boolean value of the provided * {@param matcher}. */ - public static ItemInfoMatcher not(final ItemInfoMatcher matcher) { - return new ItemInfoMatcher() { - @Override - public boolean matches(ItemInfo info, ComponentName cn) { - return !matcher.matches(info, cn); - } - }; + static ItemInfoMatcher not(ItemInfoMatcher matcher) { + return (info, cn) -> !matcher.matches(info, cn); } - public static ItemInfoMatcher ofUser(final UserHandle user) { - return new ItemInfoMatcher() { - @Override - public boolean matches(ItemInfo info, ComponentName cn) { - return info.user.equals(user); - } - }; + static ItemInfoMatcher ofUser(UserHandle user) { + return (info, cn) -> info.user.equals(user); } - public static ItemInfoMatcher ofComponents( - final HashSet components, final UserHandle user) { - return new ItemInfoMatcher() { - @Override - public boolean matches(ItemInfo info, ComponentName cn) { - return components.contains(cn) && info.user.equals(user); - } - }; + static ItemInfoMatcher ofComponents(HashSet components, UserHandle user) { + return (info, cn) -> components.contains(cn) && info.user.equals(user); } - public static ItemInfoMatcher ofPackages( - final HashSet packageNames, final UserHandle user) { - return new ItemInfoMatcher() { - @Override - public boolean matches(ItemInfo info, ComponentName cn) { - return packageNames.contains(cn.getPackageName()) && info.user.equals(user); - } - }; + static ItemInfoMatcher ofPackages(HashSet packageNames, UserHandle user) { + return (info, cn) -> packageNames.contains(cn.getPackageName()) && info.user.equals(user); } - public static ItemInfoMatcher ofShortcutKeys(final HashSet keys) { - return new ItemInfoMatcher() { - @Override - public boolean matches(ItemInfo info, ComponentName cn) { - return info.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT && + static ItemInfoMatcher ofShortcutKeys(HashSet keys) { + return (info, cn) -> info.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT && keys.contains(ShortcutKey.fromItemInfo(info)); - } - }; } - public static ItemInfoMatcher ofItemIds( - final LongArrayMap ids, final Boolean matchDefault) { - return new ItemInfoMatcher() { - @Override - public boolean matches(ItemInfo info, ComponentName cn) { - return ids.get(info.id, matchDefault); - } - }; + static ItemInfoMatcher ofItemIds(LongArrayMap ids, Boolean matchDefault) { + return (info, cn) -> ids.get(info.id, matchDefault); } } diff --git a/src/com/android/launcher3/util/Provider.java b/src/com/android/launcher3/util/Provider.java index 1cdd8d6aa0..4a54c0f05f 100644 --- a/src/com/android/launcher3/util/Provider.java +++ b/src/com/android/launcher3/util/Provider.java @@ -19,20 +19,15 @@ package com.android.launcher3.util; /** * Utility class to allow lazy initialization of objects. */ -public abstract class Provider { +public interface Provider { /** * Initializes and returns the object. This may contain expensive operations not suitable * to UI thread. */ - public abstract T get(); + T get(); - public static Provider of (final T value) { - return new Provider() { - @Override - public T get() { - return value; - } - }; + static Provider of (T value) { + return() -> value; } } -- GitLab From d7e217abb309c50517945d84435f62011d419fc9 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 10 Jul 2018 11:37:14 -0700 Subject: [PATCH 0024/1301] Animating task icon scale when using long swipe > Separating the task icon animation and setter into 2 separate methods and calling each appropriately > Using taskId instead of TaskView for ignoreSet as taskView can be reassigned Bug: 110893730 Change-Id: I7bc958e53becffdf633766373b257ead2eeef2ad --- .../quickstep/ActivityControlHelper.java | 10 ++- .../android/quickstep/LongSwipeHelper.java | 16 +++-- .../quickstep/OverviewCommandHelper.java | 5 +- .../android/quickstep/TaskSystemShortcut.java | 4 +- .../WindowTransformSwipeHandler.java | 10 +-- .../android/quickstep/views/RecentsView.java | 69 +++++++++++-------- .../quickstep/views/TaskThumbnailView.java | 13 ---- .../com/android/quickstep/views/TaskView.java | 56 ++++++++++----- 8 files changed, 105 insertions(+), 78 deletions(-) diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 8fa6c4909c..d37ac49020 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -134,7 +134,7 @@ public interface ActivityControlHelper { /** * Must return a non-null controller is supportsLongSwipe was true. */ - LongSwipeHelper getLongSwipeController(T activity, RemoteAnimationTargetSet targetSet); + LongSwipeHelper getLongSwipeController(T activity, int runningTaskId); /** * Used for containerType in {@link com.android.launcher3.logging.UserEventDispatcher} @@ -384,12 +384,11 @@ public interface ActivityControlHelper { } @Override - public LongSwipeHelper getLongSwipeController(Launcher activity, - RemoteAnimationTargetSet targetSet) { + public LongSwipeHelper getLongSwipeController(Launcher activity, int runningTaskId) { if (activity.getDeviceProfile().isVerticalBarLayout()) { return null; } - return new LongSwipeHelper(activity, targetSet); + return new LongSwipeHelper(activity, runningTaskId); } @Override @@ -571,8 +570,7 @@ public interface ActivityControlHelper { } @Override - public LongSwipeHelper getLongSwipeController(RecentsActivity activity, - RemoteAnimationTargetSet targetSet) { + public LongSwipeHelper getLongSwipeController(RecentsActivity activity, int runningTaskId) { return null; } diff --git a/quickstep/src/com/android/quickstep/LongSwipeHelper.java b/quickstep/src/com/android/quickstep/LongSwipeHelper.java index 6b66ec8db5..2fe7a11845 100644 --- a/quickstep/src/com/android/quickstep/LongSwipeHelper.java +++ b/quickstep/src/com/android/quickstep/LongSwipeHelper.java @@ -26,7 +26,6 @@ import android.animation.ValueAnimator; import android.view.animation.Interpolator; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.LauncherStateManager; import com.android.launcher3.R; import com.android.launcher3.Utilities; @@ -41,7 +40,6 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.FlingBlockCheck; -import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; @@ -56,15 +54,15 @@ public class LongSwipeHelper { Math.min(1 / MIN_PROGRESS_TO_ALL_APPS, 1 / (1 - MIN_PROGRESS_TO_ALL_APPS)); private final Launcher mLauncher; - private final RemoteAnimationTargetSet mTargetSet; + private final int mRunningTaskId; private float mMaxSwipeDistance = 1; private AnimatorPlaybackController mAnimator; private FlingBlockCheck mFlingBlockCheck = new FlingBlockCheck(); - LongSwipeHelper(Launcher launcher, RemoteAnimationTargetSet targetSet) { + LongSwipeHelper(Launcher launcher, int runningTaskId) { mLauncher = launcher; - mTargetSet = targetSet; + mRunningTaskId = runningTaskId; init(); } @@ -151,10 +149,16 @@ public class LongSwipeHelper { } private void onSwipeAnimationComplete(boolean toAllApps, boolean isFling, Runnable callback) { + RecentsView rv = mLauncher.getOverviewPanel(); + if (!toAllApps) { + rv.setIgnoreResetTask(mRunningTaskId); + } + mLauncher.getStateManager().goToState(toAllApps ? ALL_APPS : OVERVIEW, false); if (!toAllApps) { DiscoveryBounce.showForOverviewIfNeeded(mLauncher); - mLauncher.getOverviewPanel().setSwipeDownShouldLaunchApp(true); + rv.animateUpRunningTaskIconScale(); + rv.setSwipeDownShouldLaunchApp(true); } mLauncher.getUserEventDispatcher().logStateChangeAction( diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index 7094a53dbd..5d4d2c8f3d 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -285,7 +285,7 @@ public class OverviewCommandHelper { } mActivity = activity; mRecentsView = mActivity.getOverviewPanel(); - mRecentsView.setRunningTaskIconScaledDown(true /* isScaledDown */, false /* animate */); + mRecentsView.setRunningTaskIconScaledDown(true); if (!mUserEventLogged) { activity.getUserEventDispatcher().logActionCommand(Action.Command.RECENTS_BUTTON, mHelper.getContainerType(), ContainerType.TASKSWITCHER); @@ -308,8 +308,7 @@ public class OverviewCommandHelper { @Override public void onAnimationSuccess(Animator animator) { if (mRecentsView != null) { - mRecentsView.setRunningTaskIconScaledDown(false /* isScaledDown */, - true /* animate */); + mRecentsView.animateUpRunningTaskIconScale(); } } }); diff --git a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java index 5a6312d4e1..d9da002891 100644 --- a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java +++ b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java @@ -133,7 +133,7 @@ public class TaskSystemShortcut extends SystemShortcut public void onLayoutChange(View v, int l, int t, int r, int b, int oldL, int oldT, int oldR, int oldB) { taskView.getRootView().removeOnLayoutChangeListener(this); - recentsView.removeIgnoreResetTask(taskView); + recentsView.clearIgnoreResetTask(taskId); // Start animating in the side pages once launcher has been resized recentsView.dismissTask(taskView, false, false); @@ -178,7 +178,7 @@ public class TaskSystemShortcut extends SystemShortcut // Hide the task view and wait for the window to be resized // TODO: Consider animating in launcher and do an in-place start activity // afterwards - recentsView.addIgnoreResetTask(taskView); + recentsView.setIgnoreResetTask(taskId); taskView.setAlpha(0f); }; diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 366263309b..793def99f8 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -436,7 +436,7 @@ public class WindowTransformSwipeHandler { mRecentsView.showTask(mRunningTaskId); mRecentsView.setRunningTaskHidden(true); - mRecentsView.setRunningTaskIconScaledDown(true /* isScaledDown */, false /* animate */); + mRecentsView.setRunningTaskIconScaledDown(true); mLayoutListener.open(); mStateCallback.setState(STATE_LAUNCHER_STARTED); } @@ -841,7 +841,7 @@ public class WindowTransformSwipeHandler { mActivityControlHelper.getAlphaProperty(mActivity).setValue(1); mRecentsView.setRunningTaskHidden(false); - mRecentsView.setRunningTaskIconScaledDown(false /* isScaledDown */, false /* animate */); + mRecentsView.setRunningTaskIconScaledDown(false); mQuickScrubController.cancelActiveQuickscrub(); } @@ -907,7 +907,7 @@ public class WindowTransformSwipeHandler { mActivityControlHelper.onSwipeUpComplete(mActivity); // Animate the first icon. - mRecentsView.setRunningTaskIconScaledDown(false /* isScaledDown */, true /* animate */); + mRecentsView.animateUpRunningTaskIconScale(); mRecentsView.setSwipeDownShouldLaunchApp(true); RecentsModel.getInstance(mContext).onOverviewShown(false, TAG); @@ -939,7 +939,7 @@ public class WindowTransformSwipeHandler { } mQuickScrubController.onFinishedTransitionToQuickScrub(); - mRecentsView.setRunningTaskIconScaledDown(false /* isScaledDown */, true /* animate */); + mRecentsView.animateUpRunningTaskIconScale(); RecentsModel.getInstance(mContext).onOverviewShown(false, TAG); } @@ -1044,7 +1044,7 @@ public class WindowTransformSwipeHandler { } mLongSwipeController = mActivityControlHelper.getLongSwipeController( - mActivity, mRecentsAnimationWrapper.targetSet); + mActivity, mRunningTaskId); onLongSwipeDisplacementUpdated(); setTargetAlphaProvider(mLongSwipeController::getTargetAlpha); } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index b763099e0c..2680a2695e 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -48,7 +48,6 @@ import android.support.annotation.Nullable; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; -import android.util.ArraySet; import android.util.AttributeSet; import android.util.FloatProperty; import android.util.SparseBooleanArray; @@ -249,8 +248,8 @@ public abstract class RecentsView extends PagedView impl @ViewDebug.ExportedProperty(category = "launcher") private float mContentAlpha = 1; - // Keeps track of task views whose visual state should not be reset - private ArraySet mIgnoreResetTaskViews = new ArraySet<>(); + // Keeps track of task id whose visual state should not be reset + private int mIgnoreResetTaskId = -1; // Variables for empty state private final Drawable mEmptyIcon; @@ -457,18 +456,19 @@ public abstract class RecentsView extends PagedView impl // Unload existing visible task data unloadVisibleTaskData(); + TaskView ignoreRestTaskView = + mIgnoreResetTaskId == -1 ? null : getTaskView(mIgnoreResetTaskId); + final int requiredTaskCount = tasks.size(); if (getTaskViewCount() != requiredTaskCount) { if (oldChildCount > 0) { removeView(mClearAllButton); } for (int i = getChildCount(); i < requiredTaskCount; i++) { - final TaskView taskView = (TaskView) inflater.inflate(R.layout.task, this, false); - addView(taskView, 0); + addView(inflater.inflate(R.layout.task, this, false)); } while (getChildCount() > requiredTaskCount) { - final TaskView taskView = (TaskView) getChildAt(getChildCount() - 1); - removeView(taskView); + removeView(getChildAt(getChildCount() - 1)); } if (requiredTaskCount > 0) { addView(mClearAllButton); @@ -482,6 +482,12 @@ public abstract class RecentsView extends PagedView impl final TaskView taskView = (TaskView) getChildAt(pageIndex); taskView.bind(task); } + if (mIgnoreResetTaskId != -1 && getTaskView(mIgnoreResetTaskId) != ignoreRestTaskView) { + // If the taskView mapping is changing, do not preserve the visuals. Since we are + // mostly preserving the first task, and new taskViews are added to the end, it should + // generally map to the same task. + mIgnoreResetTaskId = -1; + } resetTaskVisuals(); if (oldChildCount != getChildCount()) { @@ -501,14 +507,18 @@ public abstract class RecentsView extends PagedView impl public void resetTaskVisuals() { for (int i = getTaskViewCount() - 1; i >= 0; i--) { TaskView taskView = (TaskView) getChildAt(i); - if (!mIgnoreResetTaskViews.contains(taskView)) { + if (mIgnoreResetTaskId != taskView.getTask().key.id) { taskView.resetVisualProperties(); } } if (mRunningTaskTileHidden) { setRunningTaskHidden(mRunningTaskTileHidden); } - applyIconScale(false /* animate */); + + // Force apply the scale. + if (mIgnoreResetTaskId != mRunningTaskId) { + applyRunningTaskIconScale(); + } updateCurveProperties(); // Update the set of visible task's data @@ -660,6 +670,7 @@ public abstract class RecentsView extends PagedView impl public void reset() { mRunningTaskId = -1; mRunningTaskTileHidden = false; + mIgnoreResetTaskId = -1; unloadVisibleTaskData(); setCurrentPage(0); @@ -721,10 +732,10 @@ public abstract class RecentsView extends PagedView impl boolean runningTaskTileHidden = mRunningTaskTileHidden; boolean runningTaskIconScaledDown = mRunningTaskIconScaledDown; - setRunningTaskIconScaledDown(false, false); + setRunningTaskIconScaledDown(false); setRunningTaskHidden(false); mRunningTaskId = runningTaskId; - setRunningTaskIconScaledDown(runningTaskIconScaledDown, false); + setRunningTaskIconScaledDown(runningTaskIconScaledDown); setRunningTaskHidden(runningTaskTileHidden); setCurrentPage(0); @@ -754,23 +765,25 @@ public abstract class RecentsView extends PagedView impl return mQuickScrubController; } - public void setRunningTaskIconScaledDown(boolean isScaledDown, boolean animate) { - if (mRunningTaskIconScaledDown == isScaledDown) { - return; + public void setRunningTaskIconScaledDown(boolean isScaledDown) { + if (mRunningTaskIconScaledDown != isScaledDown) { + mRunningTaskIconScaledDown = isScaledDown; + applyRunningTaskIconScale(); } - mRunningTaskIconScaledDown = isScaledDown; - applyIconScale(animate); } - private void applyIconScale(boolean animate) { - float scale = mRunningTaskIconScaledDown ? 0 : 1; + private void applyRunningTaskIconScale() { TaskView firstTask = getTaskView(mRunningTaskId); if (firstTask != null) { - if (animate) { - firstTask.animateIconToScaleAndDim(scale); - } else { - firstTask.setIconScaleAndDim(scale); - } + firstTask.setIconScaleAndDim(mRunningTaskIconScaledDown ? 0 : 1); + } + } + + public void animateUpRunningTaskIconScale() { + mRunningTaskIconScaledDown = false; + TaskView firstTask = getTaskView(mRunningTaskId); + if (firstTask != null) { + firstTask.animateIconScaleAndDimIntoView(); } } @@ -836,12 +849,14 @@ public abstract class RecentsView extends PagedView impl public float scrollFromEdge; } - public void addIgnoreResetTask(TaskView taskView) { - mIgnoreResetTaskViews.add(taskView); + public void setIgnoreResetTask(int taskId) { + mIgnoreResetTaskId = taskId; } - public void removeIgnoreResetTask(TaskView taskView) { - mIgnoreResetTaskViews.remove(taskView); + public void clearIgnoreResetTask(int taskId) { + if (mIgnoreResetTaskId == taskId) { + mIgnoreResetTaskId = -1; + } } private void addDismissedTaskAnimations(View taskView, AnimatorSet anim, long duration) { diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index fb653cfacd..7223f97f44 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -54,19 +54,6 @@ public class TaskThumbnailView extends View { private static final LightingColorFilter[] sDimFilterCache = new LightingColorFilter[256]; private static final LightingColorFilter[] sHighlightFilterCache = new LightingColorFilter[256]; - public static final Property DIM_ALPHA_MULTIPLIER = - new FloatProperty("dimAlphaMultiplier") { - @Override - public void setValue(TaskThumbnailView thumbnail, float dimAlphaMultiplier) { - thumbnail.setDimAlphaMultipler(dimAlphaMultiplier); - } - - @Override - public Float get(TaskThumbnailView thumbnailView) { - return thumbnailView.mDimAlphaMultiplier; - } - }; - public static final Property DIM_ALPHA = new FloatProperty("dimAlpha") { @Override diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 508e5bb3e9..88c81cfb57 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -18,7 +18,8 @@ package com.android.quickstep.views; import static android.widget.Toast.LENGTH_SHORT; -import static com.android.quickstep.views.TaskThumbnailView.DIM_ALPHA_MULTIPLIER; +import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; +import static com.android.launcher3.anim.Interpolators.LINEAR; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -43,6 +44,7 @@ import android.widget.Toast; import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.quickstep.TaskSystemShortcut; @@ -94,12 +96,27 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback } }; + private static FloatProperty FOCUS_TRANSITION = + new FloatProperty("focusTransition") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setIconAndDimTransitionProgress(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mFocusTransitionProgress; + } + }; + private Task mTask; private TaskThumbnailView mSnapshotView; private IconView mIconView; private float mCurveScale; private float mZoomScale; - private Animator mDimAlphaAnim; + + private Animator mIconAndDimAnimator; + private float mFocusTransitionProgress = 1; public TaskView(Context context) { this(context, null); @@ -201,28 +218,35 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback // Do nothing } - public void animateIconToScaleAndDim(float scale) { - mIconView.animate().scaleX(scale).scaleY(scale).setDuration(SCALE_ICON_DURATION).start(); - mDimAlphaAnim = ObjectAnimator.ofFloat(mSnapshotView, DIM_ALPHA_MULTIPLIER, 1 - scale, - scale); - mDimAlphaAnim.setDuration(DIM_ANIM_DURATION); - mDimAlphaAnim.addListener(new AnimatorListenerAdapter() { + private void setIconAndDimTransitionProgress(float progress) { + mFocusTransitionProgress = progress; + mSnapshotView.setDimAlphaMultipler(progress); + float scale = FAST_OUT_SLOW_IN.getInterpolation(Utilities.boundToRange( + progress * DIM_ANIM_DURATION / SCALE_ICON_DURATION, 0, 1)); + mIconView.setScaleX(scale); + mIconView.setScaleY(scale); + } + + public void animateIconScaleAndDimIntoView() { + if (mIconAndDimAnimator != null) { + mIconAndDimAnimator.cancel(); + } + mIconAndDimAnimator = ObjectAnimator.ofFloat(this, FOCUS_TRANSITION, 1); + mIconAndDimAnimator.setDuration(DIM_ANIM_DURATION).setInterpolator(LINEAR); + mIconAndDimAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - mDimAlphaAnim = null; + mIconAndDimAnimator = null; } }); - mDimAlphaAnim.start(); + mIconAndDimAnimator.start(); } protected void setIconScaleAndDim(float iconScale) { - mIconView.animate().cancel(); - mIconView.setScaleX(iconScale); - mIconView.setScaleY(iconScale); - if (mDimAlphaAnim != null) { - mDimAlphaAnim.cancel(); + if (mIconAndDimAnimator != null) { + mIconAndDimAnimator.cancel(); } - mSnapshotView.setDimAlphaMultipler(iconScale); + setIconAndDimTransitionProgress(iconScale); } public void resetVisualProperties() { -- GitLab From 7068f56922be6ee73529ada841eb879dec58ca87 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Mon, 9 Jul 2018 16:25:09 -0700 Subject: [PATCH 0025/1301] Touch up/cancel over navigation bar will send down event to drag layer There is no events from nav bar to send to drag layer until crossing the touch slop on move. If up occurs, sending the touch down event will clear floating objects such as the folders. Change-Id: I6095506f505535e04d59c403e539f37e27295470 Fixes: 111008382 Test: open folder, touch an empty space on nav bar --- .../quickstep/TouchInteractionService.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 6c542628e8..c555bc6f76 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -299,17 +299,15 @@ public class TouchInteractionService extends Service { mInvalidated = true; } break; + case ACTION_CANCEL: + case ACTION_UP: + startTouchTracking(ev); + break; case ACTION_MOVE: { float displacement = ev.getY() - mDownPos.y; if (Math.abs(displacement) >= mTouchSlop) { - mTarget.getLocationOnScreen(mLocationOnScreen); - - // Send a down event only when mTouchSlop is crossed. - MotionEvent down = MotionEvent.obtain(ev); - down.setAction(ACTION_DOWN); - sendEvent(down); - down.recycle(); - mTrackingStarted = true; + // Start tracking only when mTouchSlop is crossed. + startTouchTracking(ev); } } } @@ -324,6 +322,18 @@ public class TouchInteractionService extends Service { } } + private void startTouchTracking(MotionEvent ev) { + mTarget.getLocationOnScreen(mLocationOnScreen); + + // Send down touch event + MotionEvent down = MotionEvent.obtain(ev); + down.setAction(ACTION_DOWN); + sendEvent(down); + down.recycle(); + + mTrackingStarted = true; + } + private void sendEvent(MotionEvent ev) { int flags = ev.getEdgeFlags(); ev.setEdgeFlags(flags | EDGE_NAV_BAR); -- GitLab From 36b54228fcb9599be91119e671cb0a4c6064e033 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 10 Jul 2018 13:50:50 -0700 Subject: [PATCH 0026/1301] Retiring some feature flags Change-Id: I80a00ecaec0785ce2ba6a5f14a54c8a76f555d43 --- res/drawable-hdpi/ic_allapps.png | Bin 2956 -> 0 bytes res/drawable-hdpi/ic_allapps_pressed.png | Bin 3231 -> 0 bytes res/drawable-mdpi/ic_allapps.png | Bin 1488 -> 0 bytes res/drawable-mdpi/ic_allapps_pressed.png | Bin 1997 -> 0 bytes res/drawable-xhdpi/ic_allapps.png | Bin 3598 -> 0 bytes res/drawable-xhdpi/ic_allapps_pressed.png | Bin 3961 -> 0 bytes res/drawable-xxhdpi/ic_allapps.png | Bin 6398 -> 0 bytes res/drawable-xxhdpi/ic_allapps_pressed.png | Bin 7039 -> 0 bytes res/drawable/all_apps_button_icon.xml | 21 -------- res/layout/all_apps_button.xml | 17 ------- res/values-sw720dp/dimens.xml | 1 - res/values/dimens.xml | 1 - res/xml/dw_phone_hotseat.xml | 11 +++- res/xml/dw_tablet_hotseat.xml | 10 +++- .../android/launcher3/AutoInstallsLayout.java | 13 +++-- src/com/android/launcher3/Hotseat.java | 47 ------------------ .../launcher3/InvariantDeviceProfile.java | 12 ----- src/com/android/launcher3/Workspace.java | 18 +------ .../android/launcher3/config/BaseFlags.java | 4 -- .../android/launcher3/dragndrop/DragView.java | 8 ++- .../model/GridSizeMigrationTask.java | 8 +-- .../android/launcher3/model/LoaderCursor.java | 10 ---- .../launcher3/provider/ImportDataTask.java | 3 -- .../android/launcher3/util/FocusLogic.java | 29 +---------- .../views/RecyclerViewFastScroller.java | 3 +- .../model/GridSizeMigrationTaskTest.java | 19 ++----- .../launcher3/ui/AbstractLauncherUiTest.java | 21 +++----- 27 files changed, 41 insertions(+), 215 deletions(-) delete mode 100644 res/drawable-hdpi/ic_allapps.png delete mode 100644 res/drawable-hdpi/ic_allapps_pressed.png delete mode 100644 res/drawable-mdpi/ic_allapps.png delete mode 100644 res/drawable-mdpi/ic_allapps_pressed.png delete mode 100644 res/drawable-xhdpi/ic_allapps.png delete mode 100644 res/drawable-xhdpi/ic_allapps_pressed.png delete mode 100644 res/drawable-xxhdpi/ic_allapps.png delete mode 100644 res/drawable-xxhdpi/ic_allapps_pressed.png delete mode 100644 res/drawable/all_apps_button_icon.xml delete mode 100644 res/layout/all_apps_button.xml diff --git a/res/drawable-hdpi/ic_allapps.png b/res/drawable-hdpi/ic_allapps.png deleted file mode 100644 index 253755ffe22319920c545a85c67a7722fa1b0ccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2956 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 RrnmqA002ovPDHLkV1f>B659X( diff --git a/res/drawable-mdpi/ic_allapps.png b/res/drawable-mdpi/ic_allapps.png deleted file mode 100644 index 6936b2079195461405640261db66eaf7a1c153c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1488 zcmV;>1uy!EP)|(Z+BoX|SEETp%E98zeQUn(Qi4;5174kM|sesVZ zl&qs&WDsyFncEi~ReDtE_C+h10S@URucJ)~LO};Ioqj9ewevlajMz_b3e34*NQW9{n-z{GXpK? zPziaZ0qHEaB>Cxuubih@STB?CxbL~|v!C9F=3!U&*iZJVsyR194rGDn<#FU!28U!AdLAjZ}-I} zz+m}hF;{YJWRT=Bs>VmA1#f($TJji>w!usOMTlW?sneO`}^$gn`z~xrT5a!W5!w@IY2@M zU}+_n&F%k`_p`K9BSHI_K~Ig$V%I)7TXOsQkRi9PZ%gKq*}VK#q~@|Ms|3sxpl2-w z&VQ!r+?Bfv8^g5B4Aa8K%3a_3Qng#NAda_8ut2;ui+7{!US9t(UichXN1K44B9s4KH-U1x^r=mR&Oj{3pk?-?-K-xO)ulMpd=6`b>kFKXL1=16AGw5OSwY_&4 z2))W=Zs*m@cg3?&kRY9n;xp#W?)CI6rYC@~=(_O{h_Kks=-hdUxRPxt3EK_>-U)G~Q`+f=t1mbsBw2qe_7=1%K8P zh=|k`je$<1E1F1%>-7C}IE9$1+n5Y@8on&jk{}MF(6faCS0*y|dm-&K_p-Dr6M1w! z+a=)W*SeG%?=)2N1!Sieg_N>EHwVT#4V&GR z4UkymK*USHp)YkwHP&g^*bjfjBL|{CfmE_c=1DFYf=EA(E#AnlA207Bs za9UY9kF*CFAme#Z(!>Olbqen}c|FXq{$ia1Q zQts1cP>U~Kol zen&eiU43(YI%lPCMvKYT|3$cGeLzuU0SLfAHRFG$L*lshma$&!RP9KhAn##k41lDv^V@IO%3J6#dY* z?^nluA6TWA@mgz~z=gD251MhTBR5R(4dF(J<-1H*-x_xIgTVENH(*d z?%Td6`jBqWU8C(~V^j3nvr`&jLBsfELG#y@?uvE0F7-2qrjEd;G(o5*Avgo%jQ7MUg6ptVpfjk?lCz0UmSllgyu4T*`%hV1{*%zd%0 zDJOiH>UeIJXEi0o0o$=k0C4<-@8TkYXZ2UJ>iCzG5?C%_9b2I-WR6+35OTcV?}{P`CSl|SFnD8V+EDC~P~<>~oFa5*!= zsMx5ZHFP zoW&Ask@tE0WGjQthsml~dxLt`!Hr!Qqa1yYK zwlH$E8A(8)*i*UhME@W6o%B?yktZV2q6Ys7|A|EnL;%R`N(9PcMpz+Di#Qwk0};Gi2T2@>QMxO`4Ez)yk^Is@GRN6>zm&*|oqJ0P~6UP&QXW0ux zZv6ue&`FvcEgd;d()eRZGiCmigWdjk(zsj+K@SXfjm#P*Bqa?q@UJ!o#F&yM*dH8I z(g;RR+ih?X@S+X zQ?6GGAs)><#VtRq+|3GNl9EP|Xnp3}`u|f+xlk(i-lBP_7xa6sH7&p{_-| z+M08pZYDrsB2t7;Us-d`t6hr-g;9WDCCtl#lJu&kOK(WY);OnRwxqoDM%CVu^veNZ zDg`719il?i7tGh^ZSFd(YixtZfwOh3>+rnI`MNKNs8Zn3fq){*3uR`O3H;S#}OB?^sSpLk^8D-UaivH_woz!a1w?eOW%OB#x` zo8fSPqV65Jfea8^DvIeDji1ozd9$-i35ubJFdCLw0g|NX|D<8nPmj$=>kmePahw8D z0o_oxIlzS(ExkLAe*J2ZH$7hxh!qr=5GOM!)YmLUnJCS;zsM_# zk&kQ`~b diff --git a/res/drawable-xhdpi/ic_allapps.png b/res/drawable-xhdpi/ic_allapps.png deleted file mode 100644 index c11c1038b99612ef955316a8d8fc27a07d5c45cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3598 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 UMX(^4xBvhE07*qoM6N<$g2Ms9L;wH) diff --git a/res/drawable-xhdpi/ic_allapps_pressed.png b/res/drawable-xhdpi/ic_allapps_pressed.png deleted file mode 100644 index f319bf1e6d77309b67183c84c8ba9bf5d0840665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3961 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 diff --git a/res/drawable/all_apps_button_icon.xml b/res/drawable/all_apps_button_icon.xml deleted file mode 100644 index 7c69cad3ac..0000000000 --- a/res/drawable/all_apps_button_icon.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - diff --git a/res/layout/all_apps_button.xml b/res/layout/all_apps_button.xml deleted file mode 100644 index 4bc780a708..0000000000 --- a/res/layout/all_apps_button.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml index b211207587..691219af63 100644 --- a/res/values-sw720dp/dimens.xml +++ b/res/values-sw720dp/dimens.xml @@ -16,7 +16,6 @@ - 8dp 64dp 180dp diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 3bb7a797a7..58fce34826 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -76,7 +76,6 @@ -26dp - 0dp 48dp 30dp 40dp diff --git a/res/xml/dw_phone_hotseat.xml b/res/xml/dw_phone_hotseat.xml index b58994d1d7..c691ebc3da 100644 --- a/res/xml/dw_phone_hotseat.xml +++ b/res/xml/dw_phone_hotseat.xml @@ -16,7 +16,7 @@ - + - + + + + - + - + + + { - if (!mLauncher.isInState(ALL_APPS)) { - mLauncher.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP, - ControlType.ALL_APPS_BUTTON); - mLauncher.getStateManager().goToState(ALL_APPS); - } - }); - allAppsButton.setOnFocusChangeListener(mLauncher.mFocusHandler); - } - - // Note: We do this to ensure that the hotseat is always laid out in the orientation of - // the hotseat in order regardless of which orientation they were added - int x = getCellXFromOrder(allAppsButtonRank); - int y = getCellYFromOrder(allAppsButtonRank); - CellLayout.LayoutParams lp = new CellLayout.LayoutParams(x, y, 1, 1); - lp.canReorder = false; - mContent.addViewToCellLayout(allAppsButton, -1, allAppsButton.getId(), lp, true); - } } @Override diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index 22bc162b65..70845541b8 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -28,7 +28,6 @@ import android.util.Xml; import android.view.Display; import android.view.WindowManager; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.ConfigMonitor; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.Thunk; @@ -314,17 +313,6 @@ public class InvariantDeviceProfile { return this; } - public int getAllAppsButtonRank() { - 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; - } - - public boolean isAllAppsButtonRank(int rank) { - return rank == getAllAppsButtonRank(); - } - public DeviceProfile getDeviceProfile(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? landscapeProfile : portraitProfile; diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 67bdd3bdde..98d650d378 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -2019,22 +2019,8 @@ public class Workspace extends PagedView } public void onNoCellFound(View dropTargetLayout) { - if (mLauncher.isHotseatLayout(dropTargetLayout)) { - Hotseat hotseat = mLauncher.getHotseat(); - boolean droppedOnAllAppsIcon = !FeatureFlags.NO_ALL_APPS_ICON - && mTargetCell != null && !mLauncher.getDeviceProfile().inv.isAllAppsButtonRank( - hotseat.getOrderInHotseat(mTargetCell[0], mTargetCell[1])); - if (!droppedOnAllAppsIcon) { - // Only show message when hotseat is full and drop target was not AllApps button - showOutOfSpaceMessage(true); - } - } else { - showOutOfSpaceMessage(false); - } - } - - private void showOutOfSpaceMessage(boolean isHotseatLayout) { - int strId = (isHotseatLayout ? R.string.hotseat_out_of_space : R.string.out_of_space); + int strId = mLauncher.isHotseatLayout(dropTargetLayout) + ? R.string.hotseat_out_of_space : R.string.out_of_space; Toast.makeText(mLauncher, mLauncher.getString(strId), Toast.LENGTH_SHORT).show(); } diff --git a/src/com/android/launcher3/config/BaseFlags.java b/src/com/android/launcher3/config/BaseFlags.java index f4c6380b74..05fc33f35e 100644 --- a/src/com/android/launcher3/config/BaseFlags.java +++ b/src/com/android/launcher3/config/BaseFlags.java @@ -31,12 +31,8 @@ abstract class BaseFlags { public static final boolean IS_DOGFOOD_BUILD = false; public static final String AUTHORITY = "com.android.launcher3.settings".intern(); - // When enabled allows to use any point on the fast scrollbar to start dragging. - public static final boolean LAUNCHER3_DIRECT_SCROLL = true; // When enabled the promise icon is visible in all apps while installation an app. public static final boolean LAUNCHER3_PROMISE_APPS_IN_ALL_APPS = false; - // When enabled allows use of spring motions on the icons. - public static final 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; diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index 551567ae78..b3d9bdd72d 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -16,6 +16,8 @@ package com.android.launcher3.dragndrop; +import static com.android.launcher3.ItemInfoWithIcon.FLAG_ICON_BADGED; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.FloatArrayEvaluator; @@ -57,8 +59,6 @@ import com.android.launcher3.Utilities; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.ShortcutConfigActivityInfo; -import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.graphics.IconNormalizer; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -70,8 +70,6 @@ import com.android.launcher3.widget.PendingAddShortcutInfo; import java.util.Arrays; import java.util.List; -import static com.android.launcher3.ItemInfoWithIcon.FLAG_ICON_BADGED; - public class DragView extends View { private static final ColorMatrix sTempMatrix1 = new ColorMatrix(); private static final ColorMatrix sTempMatrix2 = new ColorMatrix(); @@ -198,7 +196,7 @@ public class DragView extends View { */ @TargetApi(Build.VERSION_CODES.O) public void setItemInfo(final ItemInfo info) { - if (!(FeatureFlags.LAUNCHER3_SPRING_ICONS && Utilities.ATLEAST_OREO)) { + if (!Utilities.ATLEAST_OREO) { return; } if (info.itemType != LauncherSettings.Favorites.ITEM_TYPE_APPLICATION && diff --git a/src/com/android/launcher3/model/GridSizeMigrationTask.java b/src/com/android/launcher3/model/GridSizeMigrationTask.java index d9b1a3f9e7..12daea50fd 100644 --- a/src/com/android/launcher3/model/GridSizeMigrationTask.java +++ b/src/com/android/launcher3/model/GridSizeMigrationTask.java @@ -138,10 +138,7 @@ public class GridSizeMigrationTask { */ protected boolean migrateHotseat() throws Exception { ArrayList items = loadHotseatEntries(); - - int requiredCount = FeatureFlags.NO_ALL_APPS_ICON ? mDestHotseatSize : mDestHotseatSize - 1; - - while (items.size() > requiredCount) { + while (items.size() > mDestHotseatSize) { // Pick the center item by default. DbEntry toRemove = items.get(items.size() / 2); @@ -171,9 +168,6 @@ public class GridSizeMigrationTask { } newScreenId++; - if (!FeatureFlags.NO_ALL_APPS_ICON && mIdp.isAllAppsButtonRank(newScreenId)) { - newScreenId++; - } } return applyOperations(); diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java index 6378ea1804..744e98aeaa 100644 --- a/src/com/android/launcher3/model/LoaderCursor.java +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -24,7 +24,6 @@ import android.content.Intent.ShortcutIconResource; import android.content.pm.LauncherActivityInfo; import android.database.Cursor; import android.database.CursorWrapper; -import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.UserHandle; import android.provider.BaseColumns; @@ -387,15 +386,6 @@ public class LoaderCursor extends CursorWrapper { protected boolean checkItemPlacement(ItemInfo item, ArrayList workspaceScreens) { long containerIndex = item.screenId; if (item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - // Return early if we detect that an item is under the hotseat button - if (!FeatureFlags.NO_ALL_APPS_ICON && - mIDP.isAllAppsButtonRank((int) item.screenId)) { - Log.e(TAG, "Error loading shortcut into hotseat " + item - + " into position (" + item.screenId + ":" + item.cellX + "," - + item.cellY + ") occupied by all apps"); - return false; - } - final GridOccupancy hotseatOccupancy = occupied.get((long) LauncherSettings.Favorites.CONTAINER_HOTSEAT); diff --git a/src/com/android/launcher3/provider/ImportDataTask.java b/src/com/android/launcher3/provider/ImportDataTask.java index b1dd003f81..16c7417aa5 100644 --- a/src/com/android/launcher3/provider/ImportDataTask.java +++ b/src/com/android/launcher3/provider/ImportDataTask.java @@ -308,9 +308,6 @@ public class ImportDataTask { LongArrayMap hotseatItems = GridSizeMigrationTask.removeBrokenHotseatItems(mContext); int myHotseatCount = LauncherAppState.getIDP(mContext).numHotseatIcons; - if (!FeatureFlags.NO_ALL_APPS_ICON) { - myHotseatCount--; - } if (hotseatItems.size() < myHotseatCount) { // Insufficient hotseat items. Add a few more. HotseatParserCallback parserCallback = new HotseatParserCallback( diff --git a/src/com/android/launcher3/util/FocusLogic.java b/src/com/android/launcher3/util/FocusLogic.java index b793f5481f..4f4cccd7a9 100644 --- a/src/com/android/launcher3/util/FocusLogic.java +++ b/src/com/android/launcher3/util/FocusLogic.java @@ -201,10 +201,6 @@ public class FocusLogic { ViewGroup hotseatParent = hotseatLayout.getShortcutsAndWidgets(); boolean isHotseatHorizontal = !dp.isVerticalBarLayout(); - boolean moreIconsInHotseatThanWorkspace = !FeatureFlags.NO_ALL_APPS_ICON && - (isHotseatHorizontal - ? hotseatLayout.getCountX() > iconLayout.getCountX() - : hotseatLayout.getCountY() > iconLayout.getCountY()); int m, n; if (isHotseatHorizontal) { @@ -215,19 +211,7 @@ public class FocusLogic { n = hotseatLayout.getCountY(); } int[][] matrix = createFullMatrix(m, n); - if (moreIconsInHotseatThanWorkspace) { - int allappsiconRank = dp.inv.getAllAppsButtonRank(); - if (isHotseatHorizontal) { - for (int j = 0; j < n; j++) { - matrix[allappsiconRank][j] = ALL_APPS_COLUMN; - } - } else { - for (int j = 0; j < m; j++) { - matrix[j][allappsiconRank] = ALL_APPS_COLUMN; - } - } - } - // Iterate thru the children of the workspace. + // Iterate through the children of the workspace. for (int i = 0; i < iconParent.getChildCount(); i++) { View cell = iconParent.getChildAt(i); if (!cell.isFocusable()) { @@ -235,17 +219,6 @@ public class FocusLogic { } int cx = ((CellLayout.LayoutParams) cell.getLayoutParams()).cellX; int cy = ((CellLayout.LayoutParams) cell.getLayoutParams()).cellY; - if (moreIconsInHotseatThanWorkspace) { - int allappsiconRank = dp.inv.getAllAppsButtonRank(); - if (isHotseatHorizontal && cx >= allappsiconRank) { - // Add 1 to account for the All Apps button. - cx++; - } - if (!isHotseatHorizontal && cy >= allappsiconRank) { - // Add 1 to account for the All Apps button. - cy++; - } - } matrix[cx][cy] = i; } diff --git a/src/com/android/launcher3/views/RecyclerViewFastScroller.java b/src/com/android/launcher3/views/RecyclerViewFastScroller.java index 05bab8b459..ed1cf4f1ed 100644 --- a/src/com/android/launcher3/views/RecyclerViewFastScroller.java +++ b/src/com/android/launcher3/views/RecyclerViewFastScroller.java @@ -224,8 +224,7 @@ public class RecyclerViewFastScroller extends View { } if (isNearThumb(x, y)) { mTouchOffsetY = mDownY - mThumbOffsetY; - } else if (FeatureFlags.LAUNCHER3_DIRECT_SCROLL - && mRv.supportsFastScrolling() + } else if (mRv.supportsFastScrolling() && isNearScrollBar(mDownX)) { calcTouchOffsetAndPrepToFastScroll(mDownY, mLastY); updateFastScrollSectionNameAndThumbOffset(mLastY, y); diff --git a/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java b/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java index b92f61205c..031909fe12 100644 --- a/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java +++ b/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java @@ -16,7 +16,6 @@ import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherProvider; import com.android.launcher3.LauncherSettings; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.model.GridSizeMigrationTask.MultiStepMigrationTask; import com.android.launcher3.util.TestLauncherProvider; @@ -87,13 +86,8 @@ public class GridSizeMigrationTaskTest { mIdp.numHotseatIcons = 3; new GridSizeMigrationTask(mContext, mIdp, mValidPackages, 5, 3) .migrateHotseat(); - if (FeatureFlags.NO_ALL_APPS_ICON) { - // First item is dropped as it has the least weight. - verifyHotseat(hotseatItems[1], hotseatItems[3], hotseatItems[4]); - } else { - // First & last items are dropped as they have the least weight. - verifyHotseat(hotseatItems[1], -1, hotseatItems[3]); - } + // First item is dropped as it has the least weight. + verifyHotseat(hotseatItems[1], hotseatItems[3], hotseatItems[4]); } @Test @@ -109,13 +103,8 @@ public class GridSizeMigrationTaskTest { mIdp.numHotseatIcons = 3; new GridSizeMigrationTask(mContext, mIdp, mValidPackages, 5, 3) .migrateHotseat(); - if (FeatureFlags.NO_ALL_APPS_ICON) { - // First item is dropped as it has the least weight. - verifyHotseat(hotseatItems[1], hotseatItems[3], hotseatItems[4]); - } else { - // First & third items are dropped as they have the least weight. - verifyHotseat(hotseatItems[1], -1, hotseatItems[4]); - } + // First item is dropped as it has the least weight. + verifyHotseat(hotseatItems[1], hotseatItems[3], hotseatItems[4]); } private void verifyHotseat(long... sortedIds) { diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index f16f514cd1..dd91fe86d2 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -43,13 +43,11 @@ import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.R; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.testcomponent.AppWidgetNoConfig; import com.android.launcher3.testcomponent.AppWidgetWithConfig; import org.junit.Before; -import java.util.Locale; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -101,19 +99,12 @@ public abstract class AbstractLauncherUiTest { */ protected UiObject2 openAllApps() { mDevice.waitForIdle(); - if (FeatureFlags.NO_ALL_APPS_ICON) { - UiObject2 hotseat = mDevice.wait( - Until.findObject(getSelectorForId(R.id.hotseat)), 2500); - Point start = hotseat.getVisibleCenter(); - int endY = (int) (mDevice.getDisplayHeight() * 0.1f); - // 100 px/step - mDevice.swipe(start.x, start.y, start.x, endY, (start.y - endY) / 100); - - } else { - mDevice.wait(Until.findObject( - By.desc(mTargetContext.getString(R.string.all_apps_button_label))), - DEFAULT_UI_TIMEOUT).click(); - } + UiObject2 hotseat = mDevice.wait( + Until.findObject(getSelectorForId(R.id.hotseat)), 2500); + Point start = hotseat.getVisibleCenter(); + int endY = (int) (mDevice.getDisplayHeight() * 0.1f); + // 100 px/step + mDevice.swipe(start.x, start.y, start.x, endY, (start.y - endY) / 100); return findViewById(R.id.apps_list_view); } -- GitLab From 87b5eb689b49cc121961e95f0a5c929ee8ad6618 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 3 Jul 2018 15:53:39 -0700 Subject: [PATCH 0027/1301] Exposing some private methods to easily customize arrow popup Change-Id: I6f6dc0604a616f26c0879732a0237767ddbfdccc --- .../com/android/quickstep/views/TaskView.java | 9 ++-- .../launcher3/AbstractFloatingView.java | 17 ++++---- src/com/android/launcher3/BaseActivity.java | 18 +++++--- .../launcher3/BaseDraggingActivity.java | 16 ++----- src/com/android/launcher3/Launcher.java | 5 +-- .../dragndrop/BaseItemDragListener.java | 8 +++- .../launcher3/logging/LoggerUtils.java | 2 +- .../android/launcher3/popup/ArrowPopup.java | 28 +++++++----- .../popup/PopupContainerWithArrow.java | 13 ++++-- .../launcher3/shortcuts/DeepShortcutView.java | 2 +- .../launcher3/touch/ItemClickHandler.java | 2 +- .../launcher3/views/ActivityContext.java | 43 +++++++++++++++++++ .../launcher3/views/BaseDragLayer.java | 7 ++- .../launcher3/views/OptionsPopupView.java | 2 +- 14 files changed, 112 insertions(+), 60 deletions(-) create mode 100644 src/com/android/launcher3/views/ActivityContext.java diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 88c81cfb57..1653038808 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -18,6 +18,7 @@ package com.android.quickstep.views; import static android.widget.Toast.LENGTH_SHORT; +import static com.android.launcher3.BaseActivity.fromContext; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.LINEAR; @@ -133,7 +134,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback return; } launchTask(true /* animate */); - BaseActivity.fromContext(context).getUserEventDispatcher().logTaskLaunchOrDismiss( + fromContext(context).getUserEventDispatcher().logTaskLaunchOrDismiss( Touch.TAP, Direction.NONE, getRecentsView().indexOfChild(this), TaskUtils.getLaunchComponentKeyForTask(getTask().key)); }); @@ -185,7 +186,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback if (mTask != null) { final ActivityOptions opts; if (animate) { - opts = BaseDraggingActivity.fromContext(getContext()) + opts = ((BaseDraggingActivity) fromContext(getContext())) .getActivityLaunchOptions(this); } else { opts = ActivityOptions.makeCustomAnimation(getContext(), 0, 0); @@ -335,7 +336,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback getContext().getText(R.string.accessibility_close_task))); final Context context = getContext(); - final BaseDraggingActivity activity = BaseDraggingActivity.fromContext(context); + final BaseDraggingActivity activity = fromContext(context); for (TaskSystemShortcut menuOption : TaskMenuView.MENU_OPTIONS) { OnClickListener onClickListener = menuOption.getOnClickListener(activity, this); if (onClickListener != null) { @@ -363,7 +364,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback for (TaskSystemShortcut menuOption : TaskMenuView.MENU_OPTIONS) { if (action == menuOption.labelResId) { OnClickListener onClickListener = menuOption.getOnClickListener( - BaseDraggingActivity.fromContext(getContext()), this); + fromContext(getContext()), this); if (onClickListener != null) { onClickListener.onClick(this); } diff --git a/src/com/android/launcher3/AbstractFloatingView.java b/src/com/android/launcher3/AbstractFloatingView.java index daf20323d0..4f03bf00b8 100644 --- a/src/com/android/launcher3/AbstractFloatingView.java +++ b/src/com/android/launcher3/AbstractFloatingView.java @@ -34,6 +34,7 @@ import android.widget.LinearLayout; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.util.TouchController; +import com.android.launcher3.views.ActivityContext; import com.android.launcher3.views.BaseDragLayer; import java.lang.annotation.Retention; @@ -151,7 +152,7 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch if (mIsOpen) { sendAccessibilityEvent(TYPE_VIEW_FOCUSED); } - BaseDraggingActivity.fromContext(getContext()).getDragLayer() + ActivityContext.lookupContext(getContext()).getDragLayer() .sendAccessibilityEvent(TYPE_WINDOW_CONTENT_CHANGED); } @@ -160,7 +161,7 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch } protected static T getOpenView( - BaseDraggingActivity activity, @FloatingViewType int type) { + ActivityContext activity, @FloatingViewType int type) { BaseDragLayer dragLayer = activity.getDragLayer(); // Iterate in reverse order. AbstractFloatingView is added later to the dragLayer, // and will be one of the last views. @@ -176,7 +177,7 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch return null; } - public static void closeOpenContainer(BaseDraggingActivity activity, + public static void closeOpenContainer(ActivityContext activity, @FloatingViewType int type) { AbstractFloatingView view = getOpenView(activity, type); if (view != null) { @@ -184,7 +185,7 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch } } - public static void closeOpenViews(BaseDraggingActivity activity, boolean animate, + public static void closeOpenViews(ActivityContext activity, boolean animate, @FloatingViewType int type) { BaseDragLayer dragLayer = activity.getDragLayer(); // Iterate in reverse order. AbstractFloatingView is added later to the dragLayer, @@ -200,20 +201,20 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch } } - public static void closeAllOpenViews(BaseDraggingActivity activity, boolean animate) { + public static void closeAllOpenViews(ActivityContext activity, boolean animate) { closeOpenViews(activity, animate, TYPE_ALL); activity.finishAutoCancelActionMode(); } - public static void closeAllOpenViews(BaseDraggingActivity activity) { + public static void closeAllOpenViews(ActivityContext activity) { closeAllOpenViews(activity, true); } - public static AbstractFloatingView getTopOpenView(BaseDraggingActivity activity) { + public static AbstractFloatingView getTopOpenView(ActivityContext activity) { return getTopOpenViewWithType(activity, TYPE_ALL); } - public static AbstractFloatingView getTopOpenViewWithType(BaseDraggingActivity activity, + public static AbstractFloatingView getTopOpenViewWithType(ActivityContext activity, @FloatingViewType int type) { return getOpenView(activity, type); } diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index a4b6f5b056..eca280bfd7 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -26,6 +26,7 @@ import android.content.ContextWrapper; import android.content.Intent; import android.content.res.Configuration; import android.support.annotation.IntDef; +import android.view.ContextThemeWrapper; import android.view.View.AccessibilityDelegate; import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; @@ -116,13 +117,6 @@ public abstract class BaseActivity extends Activity implements UserEventDelegate return Utilities.ATLEAST_NOUGAT && isInMultiWindowMode(); } - public static BaseActivity fromContext(Context context) { - if (context instanceof BaseActivity) { - return (BaseActivity) context; - } - return ((BaseActivity) ((ContextWrapper) context).getBaseContext()); - } - public SystemUiController getSystemUiController() { if (mSystemUiController == null) { mSystemUiController = new SystemUiController(getWindow()); @@ -259,4 +253,14 @@ public abstract class BaseActivity extends Activity implements UserEventDelegate writer.println(" mActivityFlags: " + mActivityFlags); writer.println(" mForceInvisible: " + mForceInvisible); } + + public static T fromContext(Context context) { + if (context instanceof BaseActivity) { + return (T) context; + } else if (context instanceof ContextThemeWrapper) { + return fromContext(((ContextWrapper) context).getBaseContext()); + } else { + throw new IllegalArgumentException("Cannot find BaseActivity in parent tree"); + } + } } diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java index eec196e1e0..d6635dc136 100644 --- a/src/com/android/launcher3/BaseDraggingActivity.java +++ b/src/com/android/launcher3/BaseDraggingActivity.java @@ -18,8 +18,6 @@ package com.android.launcher3; import android.app.ActivityOptions; import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.ContextWrapper; import android.content.Intent; import android.graphics.Rect; import android.os.Bundle; @@ -28,23 +26,23 @@ import android.os.StrictMode; import android.os.UserHandle; import android.util.Log; import android.view.ActionMode; -import android.view.Surface; import android.view.View; import android.widget.Toast; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.uioverrides.DisplayRotationListener; import com.android.launcher3.uioverrides.WallpaperColorInfo; -import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.views.BaseDragLayer; +import com.android.launcher3.views.ActivityContext; /** * Extension of BaseActivity allowing support for drag-n-drop */ public abstract class BaseDraggingActivity extends BaseActivity - implements WallpaperColorInfo.OnChangeListener { + implements WallpaperColorInfo.OnChangeListener, ActivityContext { private static final String TAG = "BaseDraggingActivity"; @@ -110,6 +108,7 @@ public abstract class BaseDraggingActivity extends BaseActivity mCurrentActionMode = null; } + @Override public boolean finishAutoCancelActionMode() { if (mCurrentActionMode != null && AUTO_CANCEL_ACTION_MODE == mCurrentActionMode.getTag()) { mCurrentActionMode.finish(); @@ -128,13 +127,6 @@ public abstract class BaseDraggingActivity extends BaseActivity public abstract void invalidateParent(ItemInfo info); - public static BaseDraggingActivity fromContext(Context context) { - if (context instanceof BaseDraggingActivity) { - return (BaseDraggingActivity) context; - } - return ((BaseDraggingActivity) ((ContextWrapper) context).getBaseContext()); - } - public Rect getViewBounds(View v) { int[] pos = new int[2]; v.getLocationOnScreen(pos); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 9f16857b6d..7ab97688c2 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2405,10 +2405,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } public static Launcher getLauncher(Context context) { - if (context instanceof Launcher) { - return (Launcher) context; - } - return ((Launcher) ((ContextWrapper) context).getBaseContext()); + return (Launcher) fromContext(context); } /** diff --git a/src/com/android/launcher3/dragndrop/BaseItemDragListener.java b/src/com/android/launcher3/dragndrop/BaseItemDragListener.java index 1e84b416b3..e204c63017 100644 --- a/src/com/android/launcher3/dragndrop/BaseItemDragListener.java +++ b/src/com/android/launcher3/dragndrop/BaseItemDragListener.java @@ -106,6 +106,10 @@ public abstract class BaseItemDragListener extends InternalStateHandler implemen } protected boolean onDragStart(DragEvent event) { + return onDragStart(event, this); + } + + protected boolean onDragStart(DragEvent event, DragOptions.PreDragCondition preDragCondition) { ClipDescription desc = event.getClipDescription(); if (desc == null || !desc.hasMimeType(getMimeType())) { Log.e(TAG, "Someone started a dragAndDrop before us."); @@ -115,7 +119,7 @@ public abstract class BaseItemDragListener extends InternalStateHandler implemen Point downPos = new Point((int) event.getX(), (int) event.getY()); DragOptions options = new DragOptions(); options.systemDndStartPoint = downPos; - options.preDragCondition = this; + options.preDragCondition = preDragCondition; // We use drag event position as the screenPos for the preview image. Since mPreviewRect // already includes the view position relative to the drag event on the source window, @@ -123,7 +127,7 @@ public abstract class BaseItemDragListener extends InternalStateHandler implemen // across windows, using drag position here give a good estimate for relative position // to source window. createDragHelper().startDrag(new Rect(mPreviewRect), - mPreviewBitmapWidth, mPreviewViewWidth, downPos, this, options); + mPreviewBitmapWidth, mPreviewViewWidth, downPos, this, options); mDragStartTime = SystemClock.uptimeMillis(); return true; } diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index 83593aaa02..1c4327c499 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -144,7 +144,7 @@ public class LoggerUtils { } public static Target newItemTarget(View v, InstantAppResolver instantAppResolver) { - return (v.getTag() instanceof ItemInfo) + return (v != null) && (v.getTag() instanceof ItemInfo) ? newItemTarget((ItemInfo) v.getTag(), instantAppResolver) : newTarget(Target.Type.ITEM); } diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java index be666a6e25..e157482c68 100644 --- a/src/com/android/launcher3/popup/ArrowPopup.java +++ b/src/com/android/launcher3/popup/ArrowPopup.java @@ -36,8 +36,10 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.view.animation.AccelerateDecelerateInterpolator; +import android.widget.FrameLayout; import com.android.launcher3.AbstractFloatingView; +import com.android.launcher3.InsettableFrameLayout; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; @@ -47,6 +49,7 @@ import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.graphics.TriangleShape; import com.android.launcher3.util.Themes; +import com.android.launcher3.views.BaseDragLayer; import java.util.ArrayList; import java.util.Collections; @@ -134,7 +137,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { protected void reorderAndShow(int viewsToFlip) { setVisibility(View.INVISIBLE); mIsOpen = true; - mLauncher.getDragLayer().addView(this); + getPopupContainer().addView(this); orientAboutObject(); boolean reverseOrder = mIsAboveIcon; @@ -163,7 +166,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { ? R.dimen.popup_arrow_horizontal_center_start : R.dimen.popup_arrow_horizontal_center_end); final int halfArrowWidth = res.getDimensionPixelSize(R.dimen.popup_arrow_width) / 2; - mLauncher.getDragLayer().addView(mArrow); + getPopupContainer().addView(mArrow); DragLayer.LayoutParams arrowLp = (DragLayer.LayoutParams) mArrow.getLayoutParams(); if (mIsLeftAligned) { mArrow.setX(getX() + arrowCenterOffset - halfArrowWidth); @@ -179,7 +182,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { ShapeDrawable arrowDrawable = new ShapeDrawable(TriangleShape.create( arrowLp.width, arrowLp.height, !mIsAboveIcon)); Paint arrowPaint = arrowDrawable.getPaint(); - arrowPaint.setColor(Themes.getAttrColor(mLauncher, R.attr.popupColorPrimary)); + arrowPaint.setColor(Themes.getAttrColor(getContext(), 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)); @@ -222,7 +225,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { int height = getMeasuredHeight() + extraVerticalSpace; getTargetObjectLocation(mTempRect); - DragLayer dragLayer = mLauncher.getDragLayer(); + InsettableFrameLayout dragLayer = getPopupContainer(); Rect insets = dragLayer.getInsets(); // Align left (right in RTL) if there is room. @@ -301,12 +304,11 @@ public abstract class ArrowPopup extends AbstractFloatingView { return; } - DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams(); - DragLayer.LayoutParams arrowLp = (DragLayer.LayoutParams) mArrow.getLayoutParams(); + FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); + FrameLayout.LayoutParams arrowLp = (FrameLayout.LayoutParams) mArrow.getLayoutParams(); if (mIsAboveIcon) { arrowLp.gravity = lp.gravity = Gravity.BOTTOM; - lp.bottomMargin = - mLauncher.getDragLayer().getHeight() - y - getMeasuredHeight() - insets.top; + lp.bottomMargin = getPopupContainer().getHeight() - y - getMeasuredHeight() - insets.top; arrowLp.bottomMargin = lp.bottomMargin - arrowLp.height - mArrayOffset - insets.bottom; } else { arrowLp.gravity = lp.gravity = Gravity.TOP; @@ -320,7 +322,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { super.onLayout(changed, l, t, r, b); // enforce contained is within screen - DragLayer dragLayer = mLauncher.getDragLayer(); + ViewGroup dragLayer = getPopupContainer(); if (getTranslationX() + l < 0 || getTranslationX() + r > dragLayer.getWidth()) { // If we are still off screen, center horizontally too. mGravity |= Gravity.CENTER_HORIZONTAL; @@ -454,7 +456,11 @@ public abstract class ArrowPopup extends AbstractFloatingView { } mIsOpen = false; mDeferContainerRemoval = false; - mLauncher.getDragLayer().removeView(this); - mLauncher.getDragLayer().removeView(mArrow); + getPopupContainer().removeView(this); + getPopupContainer().removeView(mArrow); + } + + protected BaseDragLayer getPopupContainer() { + return mLauncher.getDragLayer(); } } diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index 172cf41e08..635e043712 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -55,7 +55,6 @@ import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.accessibility.ShortcutMenuAccessibilityDelegate; import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.dragndrop.DragController; -import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.logging.LoggerUtils; @@ -65,8 +64,10 @@ import com.android.launcher3.notification.NotificationKeyData; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider; +import com.android.launcher3.touch.ItemClickHandler; import com.android.launcher3.touch.ItemLongClickListener; import com.android.launcher3.util.PackageUserKey; +import com.android.launcher3.views.BaseDragLayer; import java.util.ArrayList; import java.util.List; @@ -146,10 +147,14 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, command, mOriginalIcon, ContainerType.DEEPSHORTCUTS); } + public OnClickListener getItemClickListener() { + return ItemClickHandler.INSTANCE; + } + @Override public boolean onControllerInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { - DragLayer dl = mLauncher.getDragLayer(); + BaseDragLayer dl = getPopupContainer(); if (!dl.isEventOverView(this, ev)) { mLauncher.getUserEventDispatcher().logActionTapOutside( LoggerUtils.newContainerTarget(ContainerType.DEEPSHORTCUTS)); @@ -215,7 +220,7 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, } @TargetApi(Build.VERSION_CODES.P) - private void populateAndShow(final BubbleTextView originalIcon, final List shortcutIds, + protected void populateAndShow(final BubbleTextView originalIcon, final List shortcutIds, final List notificationKeys, List systemShortcuts) { mNumNotifications = notificationKeys.size(); mOriginalIcon = originalIcon; @@ -293,7 +298,7 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, @Override protected void getTargetObjectLocation(Rect outPos) { - mLauncher.getDragLayer().getDescendantRectRelativeToSelf(mOriginalIcon, outPos); + getPopupContainer().getDescendantRectRelativeToSelf(mOriginalIcon, outPos); outPos.top += mOriginalIcon.getPaddingTop(); outPos.left += mOriginalIcon.getPaddingLeft(); outPos.right -= mOriginalIcon.getPaddingRight(); diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutView.java b/src/com/android/launcher3/shortcuts/DeepShortcutView.java index 9ad266bbc7..7d0ea7bb9e 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutView.java @@ -121,7 +121,7 @@ public class DeepShortcutView extends FrameLayout { mBubbleText.setText(usingLongLabel ? longLabel : mDetail.getShortLabel()); // TODO: Add the click handler to this view directly and not the child view. - mBubbleText.setOnClickListener(ItemClickHandler.INSTANCE); + mBubbleText.setOnClickListener(container.getItemClickListener()); mBubbleText.setOnLongClickListener(container); mBubbleText.setOnTouchListener(container); } diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java index f2f5592e53..97f836f4dd 100644 --- a/src/com/android/launcher3/touch/ItemClickHandler.java +++ b/src/com/android/launcher3/touch/ItemClickHandler.java @@ -162,7 +162,7 @@ public class ItemClickHandler { * * @param v The view that was clicked. Must be a tagged with a {@link ShortcutInfo}. */ - private static void onClickAppShortcut(View v, ShortcutInfo shortcut, Launcher launcher) { + public static void onClickAppShortcut(View v, ShortcutInfo shortcut, Launcher launcher) { if (shortcut.isDisabled()) { final int disabledFlags = shortcut.runtimeStatusFlags & ShortcutInfo.FLAG_DISABLED_MASK; if ((disabledFlags & diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java new file mode 100644 index 0000000000..04100af7f2 --- /dev/null +++ b/src/com/android/launcher3/views/ActivityContext.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.views; + +import android.content.Context; +import android.content.ContextWrapper; +import android.view.ContextThemeWrapper; + +/** + * An interface to be used along with a context. This allows a generic class to depend on Context + * subclass instead of an Activity. + */ +public interface ActivityContext { + + default boolean finishAutoCancelActionMode() { + return false; + } + + BaseDragLayer getDragLayer(); + + static ActivityContext lookupContext(Context context) { + if (context instanceof ActivityContext) { + return (ActivityContext) context; + } else if (context instanceof ContextThemeWrapper) { + return lookupContext(((ContextWrapper) context).getBaseContext()); + } else { + throw new IllegalArgumentException("Cannot find ActivityContext in parent tree"); + } + } +} diff --git a/src/com/android/launcher3/views/BaseDragLayer.java b/src/com/android/launcher3/views/BaseDragLayer.java index 8457b2bcda..e8a879fccb 100644 --- a/src/com/android/launcher3/views/BaseDragLayer.java +++ b/src/com/android/launcher3/views/BaseDragLayer.java @@ -28,8 +28,6 @@ import android.view.accessibility.AccessibilityEvent; import android.widget.FrameLayout; import com.android.launcher3.AbstractFloatingView; -import com.android.launcher3.BaseActivity; -import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.InsettableFrameLayout; import com.android.launcher3.Utilities; import com.android.launcher3.util.MultiValueAlpha; @@ -41,7 +39,8 @@ import java.util.ArrayList; /** * A viewgroup with utility methods for drag-n-drop and touch interception */ -public abstract class BaseDragLayer extends InsettableFrameLayout { +public abstract class BaseDragLayer + extends InsettableFrameLayout { protected final int[] mTmpXY = new int[2]; protected final Rect mHitRect = new Rect(); @@ -55,7 +54,7 @@ public abstract class BaseDragLayer extends Inse public BaseDragLayer(Context context, AttributeSet attrs, int alphaChannelCount) { super(context, attrs); - mActivity = (T) BaseActivity.fromContext(context); + mActivity = (T) ActivityContext.lookupContext(context); mMultiValueAlpha = new MultiValueAlpha(this, alphaChannelCount); } diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index db4c492263..5046639361 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -94,7 +94,7 @@ public class OptionsPopupView extends ArrowPopup if (ev.getAction() != MotionEvent.ACTION_DOWN) { return false; } - if (mLauncher.getDragLayer().isEventOverView(this, ev)) { + if (getPopupContainer().isEventOverView(this, ev)) { return false; } close(true); -- GitLab From 956ec4b0e53c95e3464468c01d6e9b7fe2faf0cb Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 2 Jul 2018 13:17:32 -0700 Subject: [PATCH 0028/1301] Remove device profile dependency from UserEventDispatcher Bug: 110122682 Change-Id: I31ba61e60e31f1cc84e6d0cf115193e45d9fcfdb --- protos/launcher_log.proto | 4 ++-- .../android/quickstep/OverviewCommandHelper.java | 5 +---- .../quickstep/WindowTransformSwipeHandler.java | 2 +- src/com/android/launcher3/BaseActivity.java | 2 +- .../launcher3/logging/UserEventDispatcher.java | 15 +++------------ 5 files changed, 8 insertions(+), 20 deletions(-) diff --git a/protos/launcher_log.proto b/protos/launcher_log.proto index 06e6a923d4..41dd0bda4f 100644 --- a/protos/launcher_log.proto +++ b/protos/launcher_log.proto @@ -184,8 +184,8 @@ message LauncherEvent { optional int64 elapsed_container_millis = 5; optional int64 elapsed_session_millis = 6; - optional bool is_in_multi_window_mode = 7; - optional bool is_in_landscape_mode = 8; + optional bool is_in_multi_window_mode = 7 [deprecated = true]; + optional bool is_in_landscape_mode = 8 [deprecated = true]; optional LauncherEventExtension extension = 9; } diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index 5d4d2c8f3d..7c6eb32591 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -49,7 +49,6 @@ import android.view.ViewConfiguration; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; -import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.logging.UserEventDispatcher; @@ -198,9 +197,7 @@ public class OverviewCommandHelper { public void onTip(int actionType, int viewType) { mMainThreadExecutor.execute(() -> - UserEventDispatcher.newInstance(mContext, - InvariantDeviceProfile.INSTANCE.get(mContext).getDeviceProfile(mContext)) - .logActionTip(actionType, viewType)); + UserEventDispatcher.newInstance(mContext).logActionTip(actionType, viewType)); } public ActivityControlHelper getActivityControlHelper() { diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 793def99f8..f5202d096c 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -754,7 +754,7 @@ public class WindowTransformSwipeHandler { } int dstContainerType = toLauncher ? ContainerType.TASKSWITCHER : ContainerType.APP; - UserEventDispatcher.newInstance(mContext, dp).logStateChangeAction( + UserEventDispatcher.newInstance(mContext).logStateChangeAction( mLogAction, direction, ContainerType.NAVBAR, ContainerType.APP, dstContainerType, diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index a4b6f5b056..fd69377b61 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -107,7 +107,7 @@ public abstract class BaseActivity extends Activity implements UserEventDelegate public final UserEventDispatcher getUserEventDispatcher() { if (mUserEventDispatcher == null) { - mUserEventDispatcher = UserEventDispatcher.newInstance(this, mDeviceProfile, this); + mUserEventDispatcher = UserEventDispatcher.newInstance(this, this); } return mUserEventDispatcher; } diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index d9d3f6821d..7087fdb786 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -37,7 +37,6 @@ import android.util.Log; import android.view.View; import android.view.ViewParent; -import com.android.launcher3.DeviceProfile; import com.android.launcher3.DropTarget; import com.android.launcher3.ItemInfo; import com.android.launcher3.R; @@ -71,7 +70,7 @@ public class UserEventDispatcher implements ResourceBasedOverride { FeatureFlags.IS_DOGFOOD_BUILD && Utilities.isPropertyEnabled(LogConfig.USEREVENT); private static final String UUID_STORAGE = "uuid"; - public static UserEventDispatcher newInstance(Context context, DeviceProfile dp, + public static UserEventDispatcher newInstance(Context context, UserEventDelegate delegate) { SharedPreferences sharedPrefs = Utilities.getDevicePrefs(context); String uuidStr = sharedPrefs.getString(UUID_STORAGE, null); @@ -82,15 +81,13 @@ public class UserEventDispatcher implements ResourceBasedOverride { UserEventDispatcher ued = Overrides.getObject(UserEventDispatcher.class, context.getApplicationContext(), R.string.user_event_dispatcher_class); ued.mDelegate = delegate; - ued.mIsInLandscapeMode = dp.isVerticalBarLayout(); - ued.mIsInMultiWindowMode = dp.isMultiWindowMode; ued.mUuidStr = uuidStr; ued.mInstantAppResolver = InstantAppResolver.newInstance(context); return ued; } - public static UserEventDispatcher newInstance(Context context, DeviceProfile dp) { - return newInstance(context, dp, null); + public static UserEventDispatcher newInstance(Context context) { + return newInstance(context, null); } public interface UserEventDelegate { @@ -140,8 +137,6 @@ public class UserEventDispatcher implements ResourceBasedOverride { private long mElapsedContainerMillis; private long mElapsedSessionMillis; private long mActionDurationMillis; - private boolean mIsInMultiWindowMode; - private boolean mIsInLandscapeMode; private String mUuidStr; protected InstantAppResolver mInstantAppResolver; private boolean mAppOrTaskLaunch; @@ -435,8 +430,6 @@ public class UserEventDispatcher implements ResourceBasedOverride { public void dispatchUserEvent(LauncherEvent ev, Intent intent) { mAppOrTaskLaunch = false; - ev.isInLandscapeMode = mIsInLandscapeMode; - ev.isInMultiWindowMode = mIsInMultiWindowMode; ev.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis; ev.elapsedSessionMillis = SystemClock.uptimeMillis() - mElapsedSessionMillis; @@ -456,8 +449,6 @@ public class UserEventDispatcher implements ResourceBasedOverride { ev.elapsedContainerMillis, ev.elapsedSessionMillis, ev.actionDurationMillis); - log += "\n isInLandscapeMode " + ev.isInLandscapeMode; - log += "\n isInMultiWindowMode " + ev.isInMultiWindowMode; log += "\n\n"; Log.d(TAG, log); } -- GitLab From aeb4dd026cc1bc21ee8d35e9805e30dae6b65f27 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 11 Jul 2018 14:16:23 -0700 Subject: [PATCH 0029/1301] Fix bug where default folder name doesn't change when locale changes. Bug: 78611156 Change-Id: I25c67fc5ebc3edc2d6090f0da0e37bf2e4c07cbf --- src/com/android/launcher3/Launcher.java | 7 +++++++ src/com/android/launcher3/folder/Folder.java | 19 ++++++++++++------- .../android/launcher3/folder/FolderIcon.java | 7 ------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 9f16857b6d..0917827197 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -16,6 +16,7 @@ package com.android.launcher3; +import static android.content.pm.ActivityInfo.CONFIG_LOCALE; import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE; @@ -85,6 +86,7 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragView; +import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.folder.FolderIconPreviewVerifier; import com.android.launcher3.keyboard.CustomActionsPopup; @@ -349,6 +351,11 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, @Override public void onConfigurationChanged(Configuration newConfig) { int diff = newConfig.diff(mOldConfig); + + if ((diff & CONFIG_LOCALE) != 0) { + Folder.setLocaleDependentFields(getResources(), true /* force */); + } + if ((diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0) { mUserEventDispatcher = null; initDeviceProfile(mDeviceProfile.inv); diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 6b13da70cb..6a3ebcfb00 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -25,6 +25,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.annotation.SuppressLint; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Rect; import android.text.InputType; @@ -191,14 +192,9 @@ public class Folder extends AbstractFloatingView implements DragSource, public Folder(Context context, AttributeSet attrs) { super(context, attrs); setAlwaysDrawnWithCacheEnabled(false); - Resources res = getResources(); - if (sDefaultFolderName == null) { - sDefaultFolderName = res.getString(R.string.folder_name); - } - if (sHintText == null) { - sHintText = res.getString(R.string.folder_hint_text); - } + setLocaleDependentFields(getResources(), false /* force */); + mLauncher = Launcher.getLauncher(context); // We need this view to be focusable in touch mode so that when text editing of the folder // name is complete, we have something to focus on, thus hiding the cursor and giving @@ -1473,4 +1469,13 @@ public class Folder extends AbstractFloatingView implements DragSource, } return false; } + + public static void setLocaleDependentFields(Resources res, boolean force) { + if (sDefaultFolderName == null || force) { + sDefaultFolderName = res.getString(R.string.folder_name); + } + if (sHintText == null || force) { + sHintText = res.getString(R.string.folder_hint_text); + } + } } diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index cb5d872ab6..95a6bbd206 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -77,7 +77,6 @@ public class FolderIcon extends FrameLayout implements FolderListener { @Thunk Launcher mLauncher; @Thunk Folder mFolder; private FolderInfo mInfo; - @Thunk static boolean sStaticValuesDirty = true; private CheckLongPressHelper mLongPressHelper; private StylusEventHelper mStylusEventHelper; @@ -185,12 +184,6 @@ public class FolderIcon extends FrameLayout implements FolderListener { return icon; } - @Override - protected Parcelable onSaveInstanceState() { - sStaticValuesDirty = true; - return super.onSaveInstanceState(); - } - public Folder getFolder() { return mFolder; } -- GitLab From 32f91ab991dd2a1c6c0054c86b8700f2b966fd36 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 28 Jun 2018 15:52:35 -0700 Subject: [PATCH 0030/1301] Proxying touch events from RecentsTouchConsumer to Launcher While swipe-up animation is running, the user can quickly start another touch gesture. In that case we keep the recents transtion active and proxy all touch events to launcher. Bug: 110901700 Change-Id: Ie3b448dfea00473082dc9143423d3596504a3fcc --- .../PortraitStatesTouchController.java | 3 +- .../uioverrides/TaskViewTouchController.java | 3 +- .../android/quickstep/LongSwipeHelper.java | 8 -- .../quickstep/RecentsAnimationWrapper.java | 110 ++++++++++++++++-- .../com/android/quickstep/TouchConsumer.java | 2 + .../quickstep/TouchInteractionService.java | 67 ++++++----- .../WindowTransformSwipeHandler.java | 39 +++++-- .../launcher3/AbstractFloatingView.java | 3 +- 8 files changed, 177 insertions(+), 58 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java index 0eead88832..1d1b7dac96 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.uioverrides; +import static com.android.launcher3.AbstractFloatingView.TYPE_ACCESSIBLE; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; @@ -109,7 +110,7 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr return false; } } - if (AbstractFloatingView.getTopOpenView(mLauncher) != null) { + if (AbstractFloatingView.getTopOpenViewWithType(mLauncher, TYPE_ACCESSIBLE) != null) { return false; } return true; diff --git a/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java index cfd41191fa..9a920c843e 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.uioverrides; +import static com.android.launcher3.AbstractFloatingView.TYPE_ACCESSIBLE; import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity; @@ -79,7 +80,7 @@ public abstract class TaskViewTouchController // If we are already animating from a previous state, we can intercept. return true; } - if (AbstractFloatingView.getTopOpenView(mActivity) != null) { + if (AbstractFloatingView.getTopOpenViewWithType(mActivity, TYPE_ACCESSIBLE) != null) { return false; } return isRecentsInteractive(); diff --git a/quickstep/src/com/android/quickstep/LongSwipeHelper.java b/quickstep/src/com/android/quickstep/LongSwipeHelper.java index 2fe7a11845..16214dd6ea 100644 --- a/quickstep/src/com/android/quickstep/LongSwipeHelper.java +++ b/quickstep/src/com/android/quickstep/LongSwipeHelper.java @@ -169,12 +169,4 @@ public class LongSwipeHelper { callback.run(); } - - public float getTargetAlpha(RemoteAnimationTargetCompat app, Float expectedAlpha) { - if (!(app.isNotInRecents - || app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME)) { - return 0; - } - return expectedAlpha; - } } diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java b/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java index b0313fc2bb..eea3971f40 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java @@ -15,14 +15,23 @@ */ package com.android.quickstep; +import static android.view.MotionEvent.ACTION_CANCEL; +import static android.view.MotionEvent.ACTION_DOWN; +import static android.view.MotionEvent.ACTION_UP; + +import android.view.MotionEvent; + +import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.util.UiThreadHelper; import com.android.quickstep.util.RemoteAnimationTargetSet; +import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; import java.util.ArrayList; import java.util.concurrent.ExecutorService; +import java.util.function.Supplier; /** * Wrapper around RecentsAnimationController to help with some synchronization @@ -43,6 +52,27 @@ public class RecentsAnimationWrapper { private final ExecutorService mExecutorService = new LooperExecutor(UiThreadHelper.getBackgroundLooper()); + private final MainThreadExecutor mMainThreadExecutor = new MainThreadExecutor(); + private InputConsumerController mInputConsumer = + InputConsumerController.getRecentsAnimationInputConsumer(); + private final Supplier mTouchProxySupplier; + + private boolean mInputConsumerUnregistered; + private boolean mTouchProxyEnabled; + + private TouchConsumer mTouchConsumer; + private boolean mTouchInProgress; + private boolean mInputConsumerUnregisterPending; + + private boolean mFinishPending; + + public RecentsAnimationWrapper(Supplier touchProxySupplier) { + // Register the input consumer on the UI thread, to ensure that it runs after any pending + // unregister calls + mTouchProxySupplier = touchProxySupplier; + mMainThreadExecutor.execute(mInputConsumer::registerInputConsumer); + } + public synchronized void setController( RecentsAnimationControllerCompat controller, RemoteAnimationTargetSet targetSet) { TraceHelper.partitionSection("RecentsController", "Set controller " + controller); @@ -77,21 +107,37 @@ public class RecentsAnimationWrapper { * on the background thread. */ public void finish(boolean toHome, Runnable onFinishComplete) { - mExecutorService.submit(() -> { - RecentsAnimationControllerCompat controller = mController; - mController = null; - TraceHelper.endSection("RecentsController", - "Finish " + controller + ", toHome=" + toHome); - if (controller != null) { - controller.setInputConsumerEnabled(false); - controller.finish(toHome); + if (!toHome) { + mExecutorService.submit(() -> finishBg(false, onFinishComplete)); + } + + mMainThreadExecutor.execute(() -> { + if (mTouchInProgress) { + mFinishPending = true; + // Execute the callback if (onFinishComplete != null) { onFinishComplete.run(); } + } else { + mExecutorService.submit(() -> finishBg(true, onFinishComplete)); } }); } + protected void finishBg(boolean toHome, Runnable onFinishComplete) { + RecentsAnimationControllerCompat controller = mController; + mController = null; + TraceHelper.endSection("RecentsController", "Finish " + controller + ", toHome=" + toHome); + if (controller != null) { + controller.setInputConsumerEnabled(false); + controller.finish(toHome); + + if (onFinishComplete != null) { + onFinishComplete.run(); + } + } + } + public void enableInputConsumer() { mInputConsumerEnabled = true; if (mInputConsumerEnabled) { @@ -106,6 +152,54 @@ public class RecentsAnimationWrapper { } } + public void unregisterInputConsumer() { + mMainThreadExecutor.execute(this::unregisterInputConsumerUi); + } + + private void unregisterInputConsumerUi() { + if (mTouchProxyEnabled && mTouchInProgress) { + mInputConsumerUnregisterPending = true; + } else { + mInputConsumerUnregistered = true; + mInputConsumer.unregisterInputConsumer(); + } + } + + public void enableTouchProxy() { + mMainThreadExecutor.execute(this::enableTouchProxyUi); + } + + private void enableTouchProxyUi() { + if (!mInputConsumerUnregistered) { + mTouchProxyEnabled = true; + mInputConsumer.setTouchListener(this::onInputConsumerTouch); + } + } + + private boolean onInputConsumerTouch(MotionEvent ev) { + int action = ev.getAction(); + if (action == ACTION_DOWN) { + mTouchInProgress = true; + mTouchConsumer = mTouchProxySupplier.get(); + } else if (action == ACTION_CANCEL || action == ACTION_UP) { + // Finish any pending actions + mTouchInProgress = false; + if (mInputConsumerUnregisterPending) { + mInputConsumerUnregisterPending = false; + mInputConsumer.unregisterInputConsumer(); + } + if (mFinishPending) { + mFinishPending = false; + mExecutorService.submit(() -> finishBg(true, null)); + } + } + if (mTouchConsumer != null) { + mTouchConsumer.accept(ev); + } + + return true; + } + public void setAnimationTargetsBehindSystemBars(boolean behindSystemBars) { if (mBehindSystemBars == behindSystemBars) { return; diff --git a/quickstep/src/com/android/quickstep/TouchConsumer.java b/quickstep/src/com/android/quickstep/TouchConsumer.java index 4cecffa2be..42e9aee1bf 100644 --- a/quickstep/src/com/android/quickstep/TouchConsumer.java +++ b/quickstep/src/com/android/quickstep/TouchConsumer.java @@ -29,6 +29,8 @@ import java.util.function.Consumer; @FunctionalInterface public interface TouchConsumer extends Consumer { + TouchConsumer NO_OP = (ev) -> {}; + @IntDef(flag = true, value = { INTERACTION_NORMAL, INTERACTION_QUICK_SCRUB diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index c555bc6f76..5a1f523391 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -21,7 +21,9 @@ import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_POINTER_DOWN; import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; -import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; + +import static com.android.systemui.shared.system.ActivityManagerWrapper + .CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_NONE; import android.annotation.TargetApi; @@ -33,7 +35,6 @@ import android.os.Build; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; -import android.os.RemoteException; import android.util.Log; import android.util.SparseArray; import android.view.Choreographer; @@ -79,7 +80,7 @@ public class TouchInteractionService extends Service { private final IBinder mMyBinder = new IOverviewProxy.Stub() { @Override - public void onPreMotionEvent(@HitTarget int downHitTarget) throws RemoteException { + public void onPreMotionEvent(@HitTarget int downHitTarget) { TraceHelper.beginSection("SysUiBinder"); setupTouchConsumer(downHitTarget); TraceHelper.partitionSection("SysUiBinder", "Down target " + downHitTarget); @@ -155,8 +156,6 @@ public class TouchInteractionService extends Service { } }; - private final TouchConsumer mNoOpTouchConsumer = (ev) -> {}; - private static boolean sConnected = false; public static boolean isConnected() { @@ -185,7 +184,7 @@ public class TouchInteractionService extends Service { mMainThreadExecutor = new MainThreadExecutor(); mOverviewCommandHelper = new OverviewCommandHelper(this); mMainThreadChoreographer = Choreographer.getInstance(); - mEventQueue = new MotionEventQueue(mMainThreadChoreographer, mNoOpTouchConsumer); + mEventQueue = new MotionEventQueue(mMainThreadChoreographer, TouchConsumer.NO_OP); mOverviewInteractionState = OverviewInteractionState.getInstance(this); mOverviewCallbacks = OverviewCallbacks.get(this); mTaskOverlayFactory = TaskOverlayFactory.get(this); @@ -229,10 +228,11 @@ public class TouchInteractionService extends Service { RunningTaskInfo runningTaskInfo = mAM.getRunningTask(0); if (runningTaskInfo == null && !forceToLauncher) { - return mNoOpTouchConsumer; + return TouchConsumer.NO_OP; } else if (forceToLauncher || runningTaskInfo.topActivity.equals(mOverviewCommandHelper.overviewComponent)) { - return getOverviewConsumer(); + return OverviewTouchConsumer.newInstance( + mOverviewCommandHelper.getActivityControlHelper(), false); } else { if (tracker == null) { tracker = VelocityTracker.obtain(); @@ -245,16 +245,16 @@ public class TouchInteractionService extends Service { } } - private TouchConsumer getOverviewConsumer() { - ActivityControlHelper activityHelper = mOverviewCommandHelper.getActivityControlHelper(); - BaseDraggingActivity activity = activityHelper.getCreatedActivity(); - if (activity == null) { - return mNoOpTouchConsumer; + private void initBackgroundChoreographer() { + if (sRemoteUiThread == null) { + sRemoteUiThread = new HandlerThread("remote-ui"); + sRemoteUiThread.start(); } - return new OverviewTouchConsumer(activityHelper, activity); + new Handler(sRemoteUiThread.getLooper()).post(() -> + mBackgroundThreadChoreographer = ChoreographerCompat.getSfInstance()); } - private static class OverviewTouchConsumer + public static class OverviewTouchConsumer implements TouchConsumer { private final ActivityControlHelper mActivityHelper; @@ -265,6 +265,8 @@ public class TouchInteractionService extends Service { private final int mTouchSlop; private final QuickScrubController mQuickScrubController; + private final boolean mStartingInActivityBounds; + private boolean mTrackingStarted = false; private boolean mInvalidated = false; @@ -272,11 +274,13 @@ public class TouchInteractionService extends Service { private boolean mStartPending = false; private boolean mEndPending = false; - OverviewTouchConsumer(ActivityControlHelper activityHelper, T activity) { + OverviewTouchConsumer(ActivityControlHelper activityHelper, T activity, + boolean startingInActivityBounds) { mActivityHelper = activityHelper; mActivity = activity; mTarget = activity.getDragLayer(); mTouchSlop = ViewConfiguration.get(mTarget.getContext()).getScaledTouchSlop(); + mStartingInActivityBounds = startingInActivityBounds; mQuickScrubController = mActivity.getOverviewPanel() .getQuickScrubController(); @@ -289,6 +293,10 @@ public class TouchInteractionService extends Service { } int action = ev.getActionMasked(); if (action == ACTION_DOWN) { + if (mStartingInActivityBounds) { + startTouchTracking(ev, false /* updateLocationOffset */); + return; + } mTrackingStarted = false; mDownPos.set(ev.getX(), ev.getY()); } else if (!mTrackingStarted) { @@ -301,13 +309,13 @@ public class TouchInteractionService extends Service { break; case ACTION_CANCEL: case ACTION_UP: - startTouchTracking(ev); + startTouchTracking(ev, true /* updateLocationOffset */); break; case ACTION_MOVE: { float displacement = ev.getY() - mDownPos.y; if (Math.abs(displacement) >= mTouchSlop) { // Start tracking only when mTouchSlop is crossed. - startTouchTracking(ev); + startTouchTracking(ev, true /* updateLocationOffset */); } } } @@ -322,8 +330,10 @@ public class TouchInteractionService extends Service { } } - private void startTouchTracking(MotionEvent ev) { - mTarget.getLocationOnScreen(mLocationOnScreen); + private void startTouchTracking(MotionEvent ev, boolean updateLocationOffset) { + if (updateLocationOffset) { + mTarget.getLocationOnScreen(mLocationOnScreen); + } // Send down touch event MotionEvent down = MotionEvent.obtain(ev); @@ -336,7 +346,7 @@ public class TouchInteractionService extends Service { private void sendEvent(MotionEvent ev) { int flags = ev.getEdgeFlags(); - ev.setEdgeFlags(flags | EDGE_NAV_BAR); + ev.setEdgeFlags(flags | TouchInteractionService.EDGE_NAV_BAR); ev.offsetLocation(-mLocationOnScreen[0], -mLocationOnScreen[1]); if (!mTrackingStarted) { mTarget.onInterceptTouchEvent(ev); @@ -411,14 +421,13 @@ public class TouchInteractionService extends Service { mQuickScrubController.onQuickScrubProgress(progress); } - } - - private void initBackgroundChoreographer() { - if (sRemoteUiThread == null) { - sRemoteUiThread = new HandlerThread("remote-ui"); - sRemoteUiThread.start(); + public static TouchConsumer newInstance( + ActivityControlHelper activityHelper, boolean startingInActivityBounds) { + BaseDraggingActivity activity = activityHelper.getCreatedActivity(); + if (activity == null) { + return TouchConsumer.NO_OP; + } + return new OverviewTouchConsumer(activityHelper, activity, startingInActivityBounds); } - new Handler(sRemoteUiThread.getLooper()).post(() -> - mBackgroundThreadChoreographer = ChoreographerCompat.getSfInstance()); } } diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 0ce522adf9..d3d38af463 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -73,6 +73,7 @@ import com.android.quickstep.ActivityControlHelper.ActivityInitListener; import com.android.quickstep.ActivityControlHelper.AnimationFactory; import com.android.quickstep.ActivityControlHelper.LayoutListener; import com.android.quickstep.TouchConsumer.InteractionType; +import com.android.quickstep.TouchInteractionService.OverviewTouchConsumer; import com.android.quickstep.util.ClipAnimationHelper; import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.util.TransformedRect; @@ -80,7 +81,6 @@ import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.LatencyTrackerCompat; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; @@ -220,10 +220,8 @@ public class WindowTransformSwipeHandler { private @InteractionType int mInteractionType = INTERACTION_NORMAL; - private InputConsumerController mInputConsumer = - InputConsumerController.getRecentsAnimationInputConsumer(); - - private final RecentsAnimationWrapper mRecentsAnimationWrapper = new RecentsAnimationWrapper(); + private final RecentsAnimationWrapper mRecentsAnimationWrapper = + new RecentsAnimationWrapper(this::createNewTouchProxyHandler); private final long mTouchTimeMs; private long mLauncherFrameDrawnTime; @@ -247,9 +245,6 @@ public class WindowTransformSwipeHandler { .createActivityInitListener(this::onActivityInit); initStateCallbacks(); - // Register the input consumer on the UI thread, to ensure that it runs after any pending - // unregister calls - executeOnUiThread(mInputConsumer::registerInputConsumer); } private void initStateCallbacks() { @@ -695,6 +690,18 @@ public class WindowTransformSwipeHandler { } } + @UiThread + private TouchConsumer createNewTouchProxyHandler() { + mCurrentShift.finishAnimation(); + if (mLauncherTransitionController != null) { + mLauncherTransitionController.getAnimationPlayer().end(); + } + // Hide the task view, if not already hidden + setTargetAlphaProvider(WindowTransformSwipeHandler::getHiddenTargetAlpha); + + return OverviewTouchConsumer.newInstance(mActivityControlHelper, true); + } + private void handleNormalGestureEnd(float endVelocity, boolean isFling) { float velocityPxPerMs = endVelocity / 1000; long duration = MAX_SWIPE_DURATION; @@ -737,6 +744,10 @@ public class WindowTransformSwipeHandler { } } } + if (goingToHome) { + mRecentsAnimationWrapper.enableTouchProxy(); + } + animateToProgress(startShift, endShift, duration, interpolator, goingToHome); } @@ -831,7 +842,7 @@ public class WindowTransformSwipeHandler { } mActivityInitListener.unregister(); - mInputConsumer.unregisterInputConsumer(); + mRecentsAnimationWrapper.unregisterInputConsumer(); mTaskSnapshot = null; } @@ -1059,7 +1070,7 @@ public class WindowTransformSwipeHandler { mLongSwipeController = mActivityControlHelper.getLongSwipeController( mActivity, mRunningTaskId); onLongSwipeDisplacementUpdated(); - setTargetAlphaProvider(mLongSwipeController::getTargetAlpha); + setTargetAlphaProvider(WindowTransformSwipeHandler::getHiddenTargetAlpha); } private void onLongSwipeGestureFinishUi(float velocity, boolean isFling) { @@ -1089,4 +1100,12 @@ public class WindowTransformSwipeHandler { private void preloadAssistData() { RecentsModel.getInstance(mContext).preloadAssistData(mRunningTaskId, mAssistData); } + + public static float getHiddenTargetAlpha(RemoteAnimationTargetCompat app, Float expectedAlpha) { + if (!(app.isNotInRecents + || app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME)) { + return 0; + } + return expectedAlpha; + } } diff --git a/src/com/android/launcher3/AbstractFloatingView.java b/src/com/android/launcher3/AbstractFloatingView.java index 4f03bf00b8..3223837782 100644 --- a/src/com/android/launcher3/AbstractFloatingView.java +++ b/src/com/android/launcher3/AbstractFloatingView.java @@ -85,7 +85,8 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch // Usually we show the back button when a floating view is open. Instead, hide for these types. public static final int TYPE_HIDE_BACK_BUTTON = TYPE_ON_BOARD_POPUP | TYPE_DISCOVERY_BOUNCE; - public static final int TYPE_ACCESSIBLE = TYPE_ALL & ~TYPE_DISCOVERY_BOUNCE; + public static final int TYPE_ACCESSIBLE = TYPE_ALL + & ~TYPE_DISCOVERY_BOUNCE & ~TYPE_QUICKSTEP_PREVIEW; protected boolean mIsOpen; -- GitLab From 379e8e0fa227a9b0327126b0b68302ee3458b694 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 12 Jul 2018 14:59:09 -0700 Subject: [PATCH 0031/1301] Preventing state change duing the swipe up animation when the previous app transition is not complete > This state change causes the RecentsView to get reset making the first task visible Bug: 111404703 Change-Id: I8ff2577bf965fb4cdf736fb18683ded63ade1872 --- .../quickstep/WindowTransformSwipeHandler.java | 13 +++++++++++-- src/com/android/launcher3/LauncherStateManager.java | 6 ++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index d3d38af463..6491aec068 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -256,6 +256,11 @@ public class WindowTransformSwipeHandler { } }; + // Re-setup the recents UI when gesture starts, as the state could have been changed during + // that time by a previous window transition. + mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_GESTURE_STARTED_QUICKSTEP, + this::setupRecentsViewUi); + mStateCallback.addCallback(STATE_LAUNCHER_DRAWN | STATE_GESTURE_STARTED_QUICKSCRUB, this::initializeLauncherAnimationController); mStateCallback.addCallback(STATE_LAUNCHER_DRAWN | STATE_GESTURE_STARTED_QUICKSTEP, @@ -429,11 +434,15 @@ public class WindowTransformSwipeHandler { }); } + setupRecentsViewUi(); + mLayoutListener.open(); + mStateCallback.setState(STATE_LAUNCHER_STARTED); + } + + private void setupRecentsViewUi() { mRecentsView.showTask(mRunningTaskId); mRecentsView.setRunningTaskHidden(true); mRecentsView.setRunningTaskIconScaledDown(true); - mLayoutListener.open(); - mStateCallback.setState(STATE_LAUNCHER_STARTED); } public void setLauncherOnDrawCallback(Runnable callback) { diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index 3c7c1aa079..5bbfc1d79e 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -306,7 +306,13 @@ public class LauncherStateManager { */ public AnimatorPlaybackController createAnimationToNewWorkspace( LauncherState fromState, LauncherState state, long duration) { + // Since we are creating a state animation to a different state, temporarily prevent state + // change as part of config reset. + LauncherState originalRestState = mRestState; + mRestState = state; mConfig.reset(); + mRestState = originalRestState; + for (StateHandler handler : getStateHandlers()) { handler.setState(fromState); } -- GitLab From c487b365194f36351e15bcfa98b775b074eac678 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 13 Jul 2018 17:03:34 +0000 Subject: [PATCH 0032/1301] Revert "Create new ShortcutInfo when dropping predicted deep shortcuts." This reverts commit 4685965355577c3d08f3d9f4bd4d9cdff1245679. Reason for revert: Bug: 111435256 Change-Id: I4baf35dcc944915acad9b62d6e36a6858f89af85 --- src/com/android/launcher3/Workspace.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 11523a516f..0b117075a7 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -2716,16 +2716,10 @@ public class Workspace extends PagedView case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT: - if (info.container == NO_ID) { + if (info.container == NO_ID && info instanceof AppInfo) { // Came from all apps -- make a copy - if (info instanceof AppInfo) { - info = ((AppInfo) info).makeShortcut(); - d.dragInfo = info; - } else if (info instanceof ShortcutInfo) { - info = new ShortcutInfo((ShortcutInfo) info); - d.dragInfo = info; - } - + info = ((AppInfo) info).makeShortcut(); + d.dragInfo = info; } view = mLauncher.createShortcut(cellLayout, (ShortcutInfo) info); break; -- GitLab From eb9cc9dbd5d173ed55f97105bb2dda9daaaf7c7d Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Mon, 25 Jun 2018 15:32:24 -0700 Subject: [PATCH 0033/1301] Animate the long press icon scale for task menu to match task view Use scale listeners to track each other's icon scale to match them. Test: go to recents and long press icon Fixes: 110789415 Change-Id: I9bba3130ecf1d099db9708c84e709d16f5906c36 --- quickstep/res/layout/task_menu.xml | 12 +++- .../com/android/quickstep/views/IconView.java | 39 ++++++++++++ .../android/quickstep/views/TaskMenuView.java | 63 +++++++++++++++---- .../android/launcher3/FastBitmapDrawable.java | 15 ++++- 4 files changed, 115 insertions(+), 14 deletions(-) diff --git a/quickstep/res/layout/task_menu.xml b/quickstep/res/layout/task_menu.xml index bf55ece44b..098b34fcbf 100644 --- a/quickstep/res/layout/task_menu.xml +++ b/quickstep/res/layout/task_menu.xml @@ -24,11 +24,19 @@ android:orientation="vertical" android:visibility="invisible"> + + diff --git a/quickstep/src/com/android/quickstep/views/IconView.java b/quickstep/src/com/android/quickstep/views/IconView.java index c359966df4..8659949153 100644 --- a/quickstep/src/com/android/quickstep/views/IconView.java +++ b/quickstep/src/com/android/quickstep/views/IconView.java @@ -18,8 +18,11 @@ package com.android.quickstep.views; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; import android.util.AttributeSet; import android.view.View; +import com.android.launcher3.FastBitmapDrawable; +import java.util.ArrayList; /** * A view which draws a drawable stretched to fit its size. Unlike ImageView, it avoids relayout @@ -27,8 +30,14 @@ import android.view.View; */ public class IconView extends View { + public interface OnScaleUpdateListener { + public void onScaleUpdate(float scale); + } + private Drawable mDrawable; + private ArrayList mScaleListeners; + public IconView(Context context) { super(context); } @@ -53,6 +62,10 @@ public class IconView extends View { invalidate(); } + public Drawable getDrawable() { + return mDrawable; + } + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); @@ -77,6 +90,16 @@ public class IconView extends View { } } + @Override + public void invalidateDrawable(@NonNull Drawable drawable) { + super.invalidateDrawable(drawable); + if (drawable instanceof FastBitmapDrawable && mScaleListeners != null) { + for (OnScaleUpdateListener listener : mScaleListeners) { + listener.onScaleUpdate(((FastBitmapDrawable) drawable).getScale()); + } + } + } + @Override protected void onDraw(Canvas canvas) { if (mDrawable != null) { @@ -88,4 +111,20 @@ public class IconView extends View { public boolean hasOverlappingRendering() { return false; } + + public void addUpdateScaleListener(OnScaleUpdateListener listener) { + if (mScaleListeners == null) { + mScaleListeners = new ArrayList<>(); + } + mScaleListeners.add(listener); + if (mDrawable instanceof FastBitmapDrawable) { + listener.onScaleUpdate(((FastBitmapDrawable) mDrawable).getScale()); + } + } + + public void removeUpdateScaleListener(OnScaleUpdateListener listener) { + if (mScaleListeners != null) { + mScaleListeners.remove(listener); + } + } } diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java index 098349a7ba..e609a404f9 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java +++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java @@ -22,7 +22,6 @@ import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; -import android.content.res.Configuration; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.AttributeSet; @@ -34,15 +33,16 @@ import android.widget.TextView; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; +import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.TaskSystemShortcut; import com.android.quickstep.TaskUtils; +import com.android.quickstep.views.IconView.OnScaleUpdateListener; /** * Contains options for a recent task when long-pressing its icon. @@ -59,14 +59,41 @@ public class TaskMenuView extends AbstractFloatingView { new TaskSystemShortcut.Install(), }; + private final OnScaleUpdateListener mTaskViewIconScaleListener = new OnScaleUpdateListener() { + @Override + public void onScaleUpdate(float scale) { + final Drawable drawable = mTaskIcon.getDrawable(); + if (drawable instanceof FastBitmapDrawable) { + if (scale != ((FastBitmapDrawable) drawable).getScale()) { + mMenuIconDrawable.setScale(scale); + } + } + } + }; + + private final OnScaleUpdateListener mMenuIconScaleListener = new OnScaleUpdateListener() { + @Override + public void onScaleUpdate(float scale) { + final Drawable taskViewDrawable = mTaskView.getIconView().getDrawable(); + if (taskViewDrawable instanceof FastBitmapDrawable) { + final float currentScale = ((FastBitmapDrawable) taskViewDrawable).getScale(); + if (currentScale != scale) { + ((FastBitmapDrawable) taskViewDrawable).setScale(scale); + } + } + } + }; + private static final int REVEAL_OPEN_DURATION = 150; private static final int REVEAL_CLOSE_DURATION = 100; private BaseDraggingActivity mActivity; - private TextView mTaskIconAndName; + private TextView mTaskName; + private IconView mTaskIcon; private AnimatorSet mOpenCloseAnimator; private TaskView mTaskView; private LinearLayout mOptionLayout; + private FastBitmapDrawable mMenuIconDrawable; public TaskMenuView(Context context, AttributeSet attrs) { this(context, attrs, 0); @@ -81,7 +108,8 @@ public class TaskMenuView extends AbstractFloatingView { @Override protected void onFinishInflate() { super.onFinishInflate(); - mTaskIconAndName = findViewById(R.id.task_icon_and_name); + mTaskName = findViewById(R.id.task_name); + mTaskIcon = findViewById(R.id.task_icon); mOptionLayout = findViewById(R.id.menu_option_layout); } @@ -112,6 +140,15 @@ public class TaskMenuView extends AbstractFloatingView { // TODO } + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + // Remove all scale listeners when menu is removed + mTaskView.getIconView().removeUpdateScaleListener(mTaskViewIconScaleListener); + mTaskIcon.removeUpdateScaleListener(mMenuIconScaleListener); + } + @Override protected boolean isOfType(int type) { return (type & TYPE_TASK_MENU) != 0; @@ -138,17 +175,21 @@ public class TaskMenuView extends AbstractFloatingView { private void addMenuOptions(TaskView taskView) { Drawable icon = taskView.getTask().icon.getConstantState().newDrawable(); - int iconSize = getResources().getDimensionPixelSize(R.dimen.task_thumbnail_icon_size); - icon.setBounds(0, 0, iconSize, iconSize); - mTaskIconAndName.setCompoundDrawables(null, icon, null, null); - mTaskIconAndName.setText(TaskUtils.getTitle(getContext(), taskView.getTask())); - mTaskIconAndName.setOnClickListener(v -> close(true)); + mTaskIcon.setDrawable(icon); + mTaskIcon.setOnClickListener(v -> close(true)); + mTaskName.setText(TaskUtils.getTitle(getContext(), taskView.getTask())); + mTaskName.setOnClickListener(v -> close(true)); + + // Set the icons to match scale by listening to each other's changes + mMenuIconDrawable = icon instanceof FastBitmapDrawable ? (FastBitmapDrawable) icon : null; + taskView.getIconView().addUpdateScaleListener(mTaskViewIconScaleListener); + mTaskIcon.addUpdateScaleListener(mMenuIconScaleListener); // Move the icon and text up half an icon size to lay over the TaskView LinearLayout.LayoutParams params = - (LinearLayout.LayoutParams) mTaskIconAndName.getLayoutParams(); + (LinearLayout.LayoutParams) mTaskIcon.getLayoutParams(); params.topMargin = (int) -getResources().getDimension(R.dimen.task_thumbnail_top_margin); - mTaskIconAndName.setLayoutParams(params); + mTaskIcon.setLayoutParams(params); for (TaskSystemShortcut menuOption : MENU_OPTIONS) { OnClickListener onClickListener = menuOption.getOnClickListener(mActivity, taskView); diff --git a/src/com/android/launcher3/FastBitmapDrawable.java b/src/com/android/launcher3/FastBitmapDrawable.java index 9217ca9876..7efb6ec945 100644 --- a/src/com/android/launcher3/FastBitmapDrawable.java +++ b/src/com/android/launcher3/FastBitmapDrawable.java @@ -109,7 +109,7 @@ public class FastBitmapDrawable extends Drawable { @Override public final void draw(Canvas canvas) { - if (mScaleAnimation != null) { + if (mScale != 1f) { int count = canvas.save(); Rect bounds = getBounds(); canvas.scale(mScale, mScale, bounds.exactCenterX(), bounds.exactCenterY()); @@ -150,10 +150,23 @@ public class FastBitmapDrawable extends Drawable { return mAlpha; } + public void setScale(float scale) { + if (mScaleAnimation != null) { + mScaleAnimation.cancel(); + mScaleAnimation = null; + } + mScale = scale; + invalidateSelf(); + } + public float getAnimatedScale() { return mScaleAnimation == null ? 1 : mScale; } + public float getScale() { + return mScale; + } + @Override public int getIntrinsicWidth() { return mBitmap.getWidth(); -- GitLab From 484c643f7e849ca8a4d29ddf855d50bc1f76164b Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Wed, 18 Jul 2018 17:30:29 -0700 Subject: [PATCH 0034/1301] Delete unnecessary line to trigger build Change-Id: I905560cb3bb461ff44b76d782b370ea9b8bff320 --- tests/AndroidManifest-common.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/AndroidManifest-common.xml b/tests/AndroidManifest-common.xml index af8b15cefd..89ca7f337d 100644 --- a/tests/AndroidManifest-common.xml +++ b/tests/AndroidManifest-common.xml @@ -31,7 +31,6 @@ android:resource="@xml/appwidget_no_config" /> - -- GitLab From 2ce6a13f6096ed5e08b252e7e53255ef1027f65e Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 18 Jun 2018 19:14:44 -0700 Subject: [PATCH 0035/1301] Tapl library The public API of the library has finalized; flakiness has been removed; code polished. Bug: 110103162 Test: TaplTests suite Change-Id: Ic156bbfeedb1cb9c4a48ef907f97e396e8e81936 --- .../quickstep/ActivityControlHelper.java | 3 + src/com/android/launcher3/Utilities.java | 4 + src/com/android/launcher3/Workspace.java | 2 +- .../compat/AccessibilityManagerCompat.java | 18 ++ .../AbstractStateChangeTouchController.java | 3 + .../launcher3/views/OptionsPopupView.java | 6 + .../launcher3/widget/WidgetsFullSheet.java | 6 + .../{AllAppsFromHome.java => AllApps.java} | 58 ++--- .../launcher3/tapl/AllAppsFromOverview.java | 25 +- .../com/android/launcher3/tapl/AppIcon.java | 16 +- .../android/launcher3/tapl/Background.java | 32 +++ .../tapl/com/android/launcher3/tapl/Home.java | 152 +----------- ...cher.java => LauncherInstrumentation.java} | 225 ++++++++++-------- .../com/android/launcher3/tapl/Overview.java | 43 ++-- .../android/launcher3/tapl/OverviewTask.java | 31 ++- .../com/android/launcher3/tapl/Widgets.java | 33 +-- .../com/android/launcher3/tapl/Workspace.java | 155 ++++++++++++ 17 files changed, 463 insertions(+), 349 deletions(-) rename tests/tapl/com/android/launcher3/tapl/{AllAppsFromHome.java => AllApps.java} (73%) create mode 100644 tests/tapl/com/android/launcher3/tapl/Background.java rename tests/tapl/com/android/launcher3/tapl/{Launcher.java => LauncherInstrumentation.java} (54%) create mode 100644 tests/tapl/com/android/launcher3/tapl/Workspace.java diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index d37ac49020..6300ed3e27 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -57,6 +57,7 @@ import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; +import com.android.launcher3.compat.AccessibilityManagerCompat; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.uioverrides.FastOverviewState; import com.android.launcher3.userevent.nano.LauncherLogProto; @@ -230,6 +231,8 @@ public interface ActivityControlHelper { // Optimization, hide the all apps view to prevent layout while initializing activity.getAppsView().getContentView().setVisibility(View.GONE); + + AccessibilityManagerCompat.sendEventToTest(activity, "TAPL_WENT_TO_STATE"); } return new AnimationFactory() { diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 8683b2103b..7c5bb1af8f 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -16,6 +16,7 @@ package com.android.launcher3; +import android.app.ActivityManager; import android.app.WallpaperManager; import android.content.ComponentName; import android.content.Context; @@ -130,6 +131,9 @@ public final class Utilities { CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, new LinkedBlockingQueue()); + public static final boolean IS_RUNNING_IN_TEST_HARNESS = + ActivityManager.isRunningInTestHarness(); + public static boolean isPropertyEnabled(String propertyName) { return Log.isLoggable(propertyName, Log.VERBOSE); } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 67bdd3bdde..00527018a8 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1034,7 +1034,7 @@ public class Workspace extends PagedView } protected void onScrollInteractionBegin() { - super.onScrollInteractionEnd(); + super.onScrollInteractionBegin(); mScrollInteractionBegan = true; } diff --git a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java index 0c78381ea7..29fc2bc60d 100644 --- a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java +++ b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java @@ -16,11 +16,14 @@ package com.android.launcher3.compat; +import android.accessibilityservice.AccessibilityServiceInfo; import android.content.Context; import android.view.View; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; +import com.android.launcher3.Utilities; + public class AccessibilityManagerCompat { public static boolean isAccessibilityEnabled(Context context) { @@ -44,4 +47,19 @@ public class AccessibilityManagerCompat { private static AccessibilityManager getManager(Context context) { return (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE); } + + public static void sendEventToTest(Context context, String eventTag) { + if (!Utilities.IS_RUNNING_IN_TEST_HARNESS) return; + + final AccessibilityManager accessibilityManager = getManager(context); + if (accessibilityManager.isEnabled() && + accessibilityManager.getEnabledAccessibilityServiceList( + AccessibilityServiceInfo.FEEDBACK_ALL_MASK).size() == 0) { + + final AccessibilityEvent e = AccessibilityEvent.obtain( + AccessibilityEvent.TYPE_ANNOUNCEMENT); + e.setClassName(eventTag); + accessibilityManager.sendAccessibilityEvent(e); + } + } } diff --git a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java index 55f850c8d4..0e277eabcd 100644 --- a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java +++ b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java @@ -43,6 +43,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.AnimatorSetBuilder; +import com.android.launcher3.compat.AccessibilityManagerCompat; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; @@ -515,6 +516,8 @@ public abstract class AbstractStateChangeTouchController logReachedState(logAction, targetState); } mLauncher.getStateManager().goToState(targetState, false /* animated */); + + AccessibilityManagerCompat.sendEventToTest(mLauncher, "TAPL_WENT_TO_STATE"); } } diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index 5046639361..dc6d2ff099 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.graphics.Rect; import android.graphics.RectF; +import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import android.util.ArrayMap; import android.util.AttributeSet; @@ -133,6 +134,11 @@ public class OptionsPopupView extends ArrowPopup popup.reorderAndShow(popup.getChildCount()); } + @VisibleForTesting + public static OptionsPopupView getOptionsPopup(Launcher launcher) { + return launcher.findViewById(R.id.deep_shortcuts_container); + } + public static void showDefaultOptions(Launcher launcher, float x, float y) { float halfSize = launcher.getResources().getDimension(R.dimen.options_menu_thumb_size) / 2; if (x < 0 || y < 0) { diff --git a/src/com/android/launcher3/widget/WidgetsFullSheet.java b/src/com/android/launcher3/widget/WidgetsFullSheet.java index e94d81d75b..b493228324 100644 --- a/src/com/android/launcher3/widget/WidgetsFullSheet.java +++ b/src/com/android/launcher3/widget/WidgetsFullSheet.java @@ -20,6 +20,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.PropertyValuesHolder; import android.content.Context; import android.graphics.Rect; +import android.support.annotation.VisibleForTesting; import android.util.AttributeSet; import android.util.Pair; import android.view.LayoutInflater; @@ -224,6 +225,11 @@ public class WidgetsFullSheet extends BaseWidgetSheet return sheet; } + @VisibleForTesting + public static WidgetsRecyclerView getWidgetsView(Launcher launcher) { + return launcher.findViewById(R.id.widgets_list_view); + } + @Override protected int getElementsRowCount() { return mAdapter.getItemCount(); diff --git a/tests/tapl/com/android/launcher3/tapl/AllAppsFromHome.java b/tests/tapl/com/android/launcher3/tapl/AllApps.java similarity index 73% rename from tests/tapl/com/android/launcher3/tapl/AllAppsFromHome.java rename to tests/tapl/com/android/launcher3/tapl/AllApps.java index 02f8183c8d..d849e2d809 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllAppsFromHome.java +++ b/tests/tapl/com/android/launcher3/tapl/AllApps.java @@ -16,36 +16,32 @@ package com.android.launcher3.tapl; +import static org.junit.Assert.assertTrue; + import android.support.annotation.NonNull; import android.support.test.uiautomator.BySelector; import android.support.test.uiautomator.Direction; import android.support.test.uiautomator.UiObject2; /** - * Operations on AllApps opened from Home. + * Operations on AllApps opened from Home. Also a parent for All Apps opened from Overview. */ -public final class AllAppsFromHome { +public class AllApps extends LauncherInstrumentation.VisibleContainer { private static final int MAX_SCROLL_ATTEMPTS = 40; private static final int MIN_INTERACT_SIZE = 100; private static final int FLING_SPEED = 12000; - private final Launcher mLauncher; private final int mHeight; - AllAppsFromHome(Launcher launcher) { - mLauncher = launcher; - final UiObject2 allAppsContainer = assertState(); + AllApps(LauncherInstrumentation launcher) { + super(launcher); + final UiObject2 allAppsContainer = verifyActiveContainer(); mHeight = allAppsContainer.getVisibleBounds().height(); } - /** - * Asserts that we are in all apps. - * - * @return All apps container. - */ - @NonNull - private UiObject2 assertState() { - return mLauncher.assertState(Launcher.State.ALL_APPS); + @Override + protected LauncherInstrumentation.ContainerType getContainerType() { + return LauncherInstrumentation.ContainerType.ALL_APPS; } /** @@ -57,41 +53,45 @@ public final class AllAppsFromHome { */ @NonNull public AppIcon getAppIcon(String appName) { - final UiObject2 allAppsContainer = assertState(); + final UiObject2 allAppsContainer = verifyActiveContainer(); final BySelector appIconSelector = AppIcon.getAppIconSelector(appName); if (!allAppsContainer.hasObject(appIconSelector)) { scrollBackToBeginning(); int attempts = 0; while (!allAppsContainer.hasObject(appIconSelector) && allAppsContainer.scroll(Direction.DOWN, 0.8f)) { - mLauncher.assertTrue("Exceeded max scroll attempts: " + MAX_SCROLL_ATTEMPTS, + assertTrue("Exceeded max scroll attempts: " + MAX_SCROLL_ATTEMPTS, ++attempts <= MAX_SCROLL_ATTEMPTS); - assertState(); + verifyActiveContainer(); } } - assertState(); + verifyActiveContainer(); final UiObject2 appIcon = mLauncher.getObjectInContainer(allAppsContainer, appIconSelector); ensureIconVisible(appIcon, allAppsContainer); return new AppIcon(mLauncher, appIcon); } + protected int getBottomMarginForSwipeUp() { + return 5; + } + private void scrollBackToBeginning() { - final UiObject2 allAppsContainer = assertState(); + final UiObject2 allAppsContainer = verifyActiveContainer(); int attempts = 0; - allAppsContainer.setGestureMargins(5, 500, 5, 5); + allAppsContainer.setGestureMargins(5, 600, 5, getBottomMarginForSwipeUp()); while (allAppsContainer.scroll(Direction.UP, 0.5f)) { mLauncher.waitForIdle(); - assertState(); + verifyActiveContainer(); - mLauncher.assertTrue("Exceeded max scroll attempts: " + MAX_SCROLL_ATTEMPTS, + assertTrue("Exceeded max scroll attempts: " + MAX_SCROLL_ATTEMPTS, ++attempts <= MAX_SCROLL_ATTEMPTS); } mLauncher.waitForIdle(); - assertState(); + verifyActiveContainer(); } private void ensureIconVisible(UiObject2 appIcon, UiObject2 allAppsContainer) { @@ -102,7 +102,7 @@ public final class AllAppsFromHome { final float pct = Math.max(((float) (MIN_INTERACT_SIZE - appHeight)) / mHeight, 0.2f); allAppsContainer.scroll(Direction.DOWN, pct); mLauncher.waitForIdle(); - assertState(); + verifyActiveContainer(); } } @@ -110,22 +110,22 @@ public final class AllAppsFromHome { * Flings forward (down) and waits the fling's end. */ public void flingForward() { - final UiObject2 allAppsContainer = assertState(); + final UiObject2 allAppsContainer = verifyActiveContainer(); // Start the gesture in the center to avoid starting at elements near the top. allAppsContainer.setGestureMargins(0, 0, 0, mHeight / 2); allAppsContainer.fling(Direction.DOWN, FLING_SPEED); - assertState(); + verifyActiveContainer(); } /** * Flings backward (up) and waits the fling's end. */ public void flingBackward() { - final UiObject2 allAppsContainer = assertState(); + final UiObject2 allAppsContainer = verifyActiveContainer(); // Start the gesture in the center, for symmetry with forward. allAppsContainer.setGestureMargins(0, mHeight / 2, 0, 0); allAppsContainer.fling(Direction.UP, FLING_SPEED); - assertState(); + verifyActiveContainer(); } /** @@ -137,6 +137,6 @@ public final class AllAppsFromHome { @Deprecated @NonNull public UiObject2 getObjectDeprecated() { - return assertState(); + return verifyActiveContainer(); } } diff --git a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java index cba708621c..bc0dfc6462 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java +++ b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java @@ -22,24 +22,17 @@ import android.support.test.uiautomator.UiObject2; /** * Operations on AllApps opened from Overview. - * Scroll gestures that are OK for {@link AllAppsFromHome} may close it, so they are not supported. */ -public final class AllAppsFromOverview { - private final Launcher mLauncher; +public final class AllAppsFromOverview extends AllApps { - AllAppsFromOverview(Launcher launcher) { - mLauncher = launcher; - assertState(); + AllAppsFromOverview(LauncherInstrumentation launcher) { + super(launcher); + verifyActiveContainer(); } - /** - * Asserts that we are in all apps. - * - * @return All apps container. - */ - @NonNull - private UiObject2 assertState() { - return mLauncher.assertState(Launcher.State.ALL_APPS); + @Override + protected int getBottomMarginForSwipeUp() { + return 600; } /** @@ -49,13 +42,13 @@ public final class AllAppsFromOverview { */ @NonNull public Overview switchBackToOverview() { - final UiObject2 allAppsContainer = assertState(); + final UiObject2 allAppsContainer = verifyActiveContainer(); // Swipe from the search box to the bottom. final UiObject2 qsb = mLauncher.waitForObjectInContainer( allAppsContainer, "search_container_all_apps"); final Point start = qsb.getVisibleCenter(); final int endY = (int) (mLauncher.getDevice().getDisplayHeight() * 0.6); - mLauncher.swipe(start.x, start.y, start.x, endY, (endY - start.y) / 100); // 100 px/step + mLauncher.swipe(start.x, start.y, start.x, endY); return new Overview(mLauncher); } diff --git a/tests/tapl/com/android/launcher3/tapl/AppIcon.java b/tests/tapl/com/android/launcher3/tapl/AppIcon.java index 73a74f2dd9..721f7a8ef8 100644 --- a/tests/tapl/com/android/launcher3/tapl/AppIcon.java +++ b/tests/tapl/com/android/launcher3/tapl/AppIcon.java @@ -16,6 +16,8 @@ package com.android.launcher3.tapl; +import static org.junit.Assert.assertTrue; + import android.support.test.uiautomator.By; import android.support.test.uiautomator.BySelector; import android.support.test.uiautomator.UiObject2; @@ -26,25 +28,25 @@ import android.widget.TextView; * App icon, whether in all apps or in workspace/ */ public final class AppIcon { - private final Launcher mLauncher; + private final LauncherInstrumentation mLauncher; private final UiObject2 mIcon; - AppIcon(Launcher launcher, UiObject2 icon) { + AppIcon(LauncherInstrumentation launcher, UiObject2 icon) { mLauncher = launcher; mIcon = icon; } static BySelector getAppIconSelector(String appName) { - return By.clazz(TextView.class).text(appName).pkg(Launcher.LAUNCHER_PKG); + return By.clazz(TextView.class).text(appName).pkg(LauncherInstrumentation.LAUNCHER_PKG); } /** * Clicks the icon to launch its app. */ - public void launch() { - mLauncher.assertTrue("Launching an app didn't open a new window: " + mIcon.getText(), - mIcon.clickAndWait(Until.newWindow(), Launcher.APP_LAUNCH_TIMEOUT_MS)); - mLauncher.assertState(Launcher.State.BACKGROUND); + public Background launch() { + assertTrue("Launching an app didn't open a new window: " + mIcon.getText(), + mIcon.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS)); + return new Background(mLauncher); } UiObject2 getIcon() { diff --git a/tests/tapl/com/android/launcher3/tapl/Background.java b/tests/tapl/com/android/launcher3/tapl/Background.java new file mode 100644 index 0000000000..1aef9791d8 --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/Background.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.tapl; + +/** + * Operations on a state when Launcher is inactive because some other app is active. + */ +public final class Background extends Home { + + Background(LauncherInstrumentation launcher) { + super(launcher); + } + + @Override + protected LauncherInstrumentation.ContainerType getContainerType() { + return LauncherInstrumentation.ContainerType.BACKGROUND; + } +} diff --git a/tests/tapl/com/android/launcher3/tapl/Home.java b/tests/tapl/com/android/launcher3/tapl/Home.java index 0ec1a644e7..436e5ff6b9 100644 --- a/tests/tapl/com/android/launcher3/tapl/Home.java +++ b/tests/tapl/com/android/launcher3/tapl/Home.java @@ -16,38 +16,22 @@ package com.android.launcher3.tapl; -import static junit.framework.TestCase.assertTrue; - -import android.graphics.Point; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.test.uiautomator.Direction; import android.support.test.uiautomator.UiObject2; -import android.view.KeyEvent; /** * Operations on the home screen. + * + * Launcher can be invoked both when its activity is in the foreground and when it is in the + * background. This class is a parent of the two classes {@link Background} and {@link Workspace} + * that essentially represents these two activity states. Any gestures (e.g., switchToOverview) that + * can be performed in both of these states can be defined here. */ -public final class Home { +public abstract class Home extends LauncherInstrumentation.VisibleContainer { - private final Launcher mLauncher; - private final UiObject2 mHotseat; - private final int ICON_DRAG_SPEED = 2000; - - Home(Launcher launcher) { - mLauncher = launcher; - assertState(); - mHotseat = launcher.waitForLauncherObject("hotseat"); - } - - /** - * Asserts that we are in home. - * - * @return Workspace. - */ - @NonNull - private UiObject2 assertState() { - return mLauncher.assertState(Launcher.State.HOME); + protected Home(LauncherInstrumentation launcher) { + super(launcher); + verifyActiveContainer(); } /** @@ -57,131 +41,19 @@ public final class Home { */ @NonNull public Overview switchToOverview() { - assertState(); + verifyActiveContainer(); if (mLauncher.isSwipeUpEnabled()) { final int height = mLauncher.getDevice().getDisplayHeight(); final UiObject2 navBar = mLauncher.getSystemUiObject("navigation_bar_frame"); - // Swipe from nav bar to 2/3rd down the screen. mLauncher.swipe( navBar.getVisibleBounds().centerX(), navBar.getVisibleBounds().centerY(), - navBar.getVisibleBounds().centerX(), height * 2 / 3, - (navBar.getVisibleBounds().centerY() - height * 2 / 3) / 100); // 100 px/step + navBar.getVisibleBounds().centerX(), height - 300 + ); } else { mLauncher.getSystemUiObject("recent_apps").click(); } return new Overview(mLauncher); } - - /** - * Swipes up to All Apps. - * - * @return the App Apps object. - */ - @NonNull - public AllAppsFromHome switchToAllApps() { - assertState(); - if (mLauncher.isSwipeUpEnabled()) { - int midX = mLauncher.getDevice().getDisplayWidth() / 2; - int height = mLauncher.getDevice().getDisplayHeight(); - // Swipe from 6/7ths down the screen to 1/7th down the screen. - mLauncher.swipe( - midX, - height * 6 / 7, - midX, - height / 7, - (height * 2 / 3) / 100); // 100 px/step - } else { - // Swipe from the hotseat to near the top, e.g. 10% of the screen. - final UiObject2 hotseat = mHotseat; - final Point start = hotseat.getVisibleCenter(); - final int endY = (int) (mLauncher.getDevice().getDisplayHeight() * 0.1f); - mLauncher.swipe( - start.x, - start.y, - start.x, - endY, - (start.y - endY) / 100); // 100 px/step - } - - return new AllAppsFromHome(mLauncher); - } - - /** - * Returns an icon for the app, if currently visible. - * - * @param appName name of the app - * @return app icon, if found, null otherwise. - */ - @Nullable - public AppIcon tryGetWorkspaceAppIcon(String appName) { - final UiObject2 workspace = assertState(); - final UiObject2 icon = workspace.findObject(AppIcon.getAppIconSelector(appName)); - return icon != null ? new AppIcon(mLauncher, icon) : null; - } - - /** - * Ensures that workspace is scrollable. If it's not, drags an icon icons from hotseat to the - * second screen. - */ - public void ensureWorkspaceIsScrollable() { - final UiObject2 workspace = assertState(); - if (!isWorkspaceScrollable(workspace)) { - dragIconToNextScreen(getHotseatAppIcon("Messages"), workspace); - } - assertTrue("Home screen workspace didn't become scrollable", - isWorkspaceScrollable(workspace)); - } - - private boolean isWorkspaceScrollable(UiObject2 workspace) { - return workspace.isScrollable(); - } - - @NonNull - private AppIcon getHotseatAppIcon(String appName) { - return new AppIcon(mLauncher, mLauncher.getObjectInContainer( - mHotseat, AppIcon.getAppIconSelector(appName))); - } - - private void dragIconToNextScreen(AppIcon app, UiObject2 workspace) { - final Point dest = new Point( - mLauncher.getDevice().getDisplayWidth(), workspace.getVisibleBounds().centerY()); - app.getIcon().drag(dest, ICON_DRAG_SPEED); - assertState(); - } - - /** - * Flings to get to screens on the right. Waits for scrolling and a possible overscroll - * recoil to complete. - */ - public void flingForward() { - final UiObject2 workspace = assertState(); - workspace.fling(Direction.RIGHT); - mLauncher.waitForIdle(); - assertState(); - } - - /** - * Flings to get to screens on the left. Waits for scrolling and a possible overscroll - * recoil to complete. - */ - public void flingBackward() { - final UiObject2 workspace = assertState(); - workspace.fling(Direction.LEFT); - mLauncher.waitForIdle(); - assertState(); - } - - /** - * Opens widgets container by pressing Ctrl+W. - * - * @return the widgets container. - */ - @NonNull - public Widgets openAllWidgets() { - assertState(); - mLauncher.getDevice().pressKeyCode(KeyEvent.KEYCODE_W, KeyEvent.META_CTRL_ON); - return new Widgets(mLauncher); - } } \ No newline at end of file diff --git a/tests/tapl/com/android/launcher3/tapl/Launcher.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java similarity index 54% rename from tests/tapl/com/android/launcher3/tapl/Launcher.java rename to tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 5201dc8bae..fc32fed2cc 100644 --- a/tests/tapl/com/android/launcher3/tapl/Launcher.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -16,10 +16,13 @@ package com.android.launcher3.tapl; -import static com.android.systemui.shared.system.SettingsCompat.SWIPE_UP_SETTING_NAME; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import android.app.ActivityManager; +import android.app.UiAutomation; import android.content.res.Resources; -import android.os.RemoteException; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -29,50 +32,76 @@ import android.support.test.uiautomator.BySelector; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject2; import android.support.test.uiautomator.Until; -import android.util.Log; import org.junit.Assert; -import java.io.ByteArrayOutputStream; -import java.io.IOException; +import java.lang.ref.WeakReference; +import java.util.concurrent.TimeoutException; /** * The main tapl object. The only object that can be explicitly constructed by the using code. It * produces all other objects. */ -public final class Launcher { +public final class LauncherInstrumentation { + + // Types for launcher containers that the user is interacting with. "Background" is a + // pseudo-container corresponding to inactive launcher covered by another app. + enum ContainerType { + WORKSPACE, ALL_APPS, OVERVIEW, WIDGETS, BACKGROUND + } + + // Base class for launcher containers. + static abstract class VisibleContainer { + protected final LauncherInstrumentation mLauncher; + + protected VisibleContainer(LauncherInstrumentation launcher) { + mLauncher = launcher; + launcher.setActiveContainer(this); + } + + protected abstract ContainerType getContainerType(); + + /** + * Asserts that the launcher is in the mode matching 'this' object. + * + * @return UI object for the container. + */ + final UiObject2 verifyActiveContainer() { + assertTrue("Attempt to use a stale container", this == sActiveContainer.get()); + return mLauncher.verifyContainerType(getContainerType()); + } + } private static final String WORKSPACE_RES_ID = "workspace"; private static final String APPS_RES_ID = "apps_view"; private static final String OVERVIEW_RES_ID = "overview_panel"; private static final String WIDGETS_RES_ID = "widgets_list_view"; - - enum State {HOME, ALL_APPS, OVERVIEW, WIDGETS, BACKGROUND} - static final String LAUNCHER_PKG = "com.google.android.apps.nexuslauncher"; - static final int APP_LAUNCH_TIMEOUT_MS = 10000; - private static final int UI_OBJECT_WAIT_TIMEOUT_MS = 10000; + static final int WAIT_TIME_MS = 10000; private static final String SWIPE_UP_SETTING_AVAILABLE_RES_NAME = "config_swipe_up_gesture_setting_available"; private static final String SWIPE_UP_ENABLED_DEFAULT_RES_NAME = "config_swipe_up_gesture_default"; private static final String SYSTEMUI_PACKAGE = "com.android.systemui"; - private static final String TAG = "tapl.Launcher"; + + private static WeakReference sActiveContainer = new WeakReference<>(null); + private final UiDevice mDevice; private final boolean mSwipeUpEnabled; /** - * Constructs the root of TAPL hierarchy. You get all other object from it. + * Constructs the root of TAPL hierarchy. You get all other objects from it. */ - public Launcher(UiDevice device) { + public LauncherInstrumentation(UiDevice device) { mDevice = device; final boolean swipeUpEnabledDefault = !getSystemBooleanRes(SWIPE_UP_SETTING_AVAILABLE_RES_NAME) || getSystemBooleanRes(SWIPE_UP_ENABLED_DEFAULT_RES_NAME); mSwipeUpEnabled = Settings.Secure.getInt( InstrumentationRegistry.getTargetContext().getContentResolver(), - SWIPE_UP_SETTING_NAME, + "swipe_up_to_switch_apps_enabled", swipeUpEnabledDefault ? 1 : 0) == 1; + assertTrue("Device must run in a test harness", ActivityManager.isRunningInTestHarness()); } private boolean getSystemBooleanRes(String resName) { @@ -82,59 +111,18 @@ public final class Launcher { return res.getBoolean(resId); } - private void dumpViewHierarchy() { - final ByteArrayOutputStream stream = new ByteArrayOutputStream(); - try { - mDevice.dumpWindowHierarchy(stream); - stream.flush(); - stream.close(); - for (String line : stream.toString().split("\\r?\\n")) { - Log.e(TAG, line.trim()); - } - } catch (IOException e) { - Log.e(TAG, "error dumping XML to logcat", e); - } - } - - void fail(String message) { - dumpViewHierarchy(); - Assert.fail(message); - } - - void assertTrue(String message, boolean condition) { - if (!condition) { - fail(message); - } - } - - void assertNotNull(String message, Object object) { - assertTrue(message, object != null); - } - - private void failEquals(String message, Object actual) { - String formatted = "Values should be different. "; - if (message != null) { - formatted = message + ". "; - } - - formatted += "Actual: " + actual; - fail(formatted); - } - - void assertNotEquals(String message, int unexpected, int actual) { - if (unexpected == actual) { - failEquals(message, actual); - } + void setActiveContainer(VisibleContainer container) { + sActiveContainer = new WeakReference<>(container); } boolean isSwipeUpEnabled() { return mSwipeUpEnabled; } - UiObject2 assertState(State state) { - switch (state) { - case HOME: { - //waitUntilGone(APPS_RES_ID); + private UiObject2 verifyContainerType(ContainerType containerType) { + switch (containerType) { + case WORKSPACE: { + waitUntilGone(APPS_RES_ID); waitUntilGone(OVERVIEW_RES_ID); waitUntilGone(WIDGETS_RES_ID); return waitForLauncherObject(WORKSPACE_RES_ID); @@ -147,13 +135,11 @@ public final class Launcher { } case ALL_APPS: { waitUntilGone(OVERVIEW_RES_ID); - waitUntilGone(WORKSPACE_RES_ID); waitUntilGone(WIDGETS_RES_ID); return waitForLauncherObject(APPS_RES_ID); } case OVERVIEW: { - //waitForLauncherObject(APPS_RES_ID); - waitUntilGone(WORKSPACE_RES_ID); + waitForLauncherObject(APPS_RES_ID); waitUntilGone(WIDGETS_RES_ID); return waitForLauncherObject(OVERVIEW_RES_ID); } @@ -165,30 +151,62 @@ public final class Launcher { return null; } default: - fail("Invalid state: " + state); + fail("Invalid state: " + containerType); return null; } } + private void executeAndWaitForEvent(Runnable command, + UiAutomation.AccessibilityEventFilter eventFilter, String message) { + try { + assertNotNull("executeAndWaitForEvent returned null (this can't happen)", + InstrumentationRegistry.getInstrumentation().getUiAutomation() + .executeAndWaitForEvent( + command, eventFilter, WAIT_TIME_MS)); + } catch (TimeoutException e) { + fail(message); + } + } + /** * Presses nav bar home button. * - * @return the Home object. + * @return the Workspace object. */ - public Home pressHome() { - getSystemUiObject("home").click(); - return getHome(); + public Workspace pressHome() { + // Click home, then wait for any accessibility event, then wait until accessibility events + // stop. + // We need waiting for any accessibility event generated after pressing Home because + // otherwise waitForIdle may return immediately in case when there was a big enough pause in + // accessibility events prior to pressing Home. + executeAndWaitForEvent( + () -> getSystemUiObject("home").click(), + event -> true, + "Pressing Home didn't produce any events"); + mDevice.waitForIdle(); + return getWorkspace(); } /** - * Gets the Home object if the current state is "active home", i.e. workspace. Fails if the + * Gets the Workspace object if the current state is "active home", i.e. workspace. Fails if the * launcher is not in that state. * - * @return Home object. + * @return Workspace object. + */ + @NonNull + public Workspace getWorkspace() { + return new Workspace(this); + } + + /** + * Gets the Workspace object if the current state is "background home", i.e. some other app is + * active. Fails if the launcher is not in that state. + * + * @return Background object. */ @NonNull - public Home getHome() { - return new Home(this); + public Background getBackground() { + return new Background(this); } /** @@ -214,40 +232,52 @@ public final class Launcher { } /** - * Gets the All Apps object if the current state is showing the all apps panel. Fails if the - * launcher is not in that state. + * Gets the All Apps object if the current state is showing the all apps panel opened by swiping + * from workspace. Fails if the launcher is not in that state. Please don't call this method if + * App Apps was opened by swiping up from Overview, as it won't fail and will return an + * incorrect object. + * + * @return All Aps object. + */ + @NonNull + public AllApps getAllApps() { + return new AllApps(this); + } + + /** + * Gets the All Apps object if the current state is showing the all apps panel opened by swiping + * from overview. Fails if the launcher is not in that state. Please don't call this method if + * App Apps was opened by swiping up from home, as it won't fail and will return an + * incorrect object. * * @return All Aps object. */ @NonNull - public AllAppsFromHome getAllApps() { - return new AllAppsFromHome(this); + public AllAppsFromOverview getAllAppsFromOverview() { + return new AllAppsFromOverview(this); } /** - * Gets the All Apps object if the current state is showing the all apps panel. Returns null if - * the launcher is not in that state. + * Gets the All Apps object if the current state is showing the all apps panel opened by swiping + * from workspace. Returns null if launcher is not in that state. Please don't call this method + * if App Apps was opened by swiping up from Overview, as it won't fail and will return an + * incorrect object. * * @return All Aps object or null. */ @Nullable - public AllAppsFromHome tryGetAllApps() { + public AllApps tryGetAllApps() { return tryGetLauncherObject(APPS_RES_ID) != null ? getAllApps() : null; } private void waitUntilGone(String resId) { -// assertTrue("Unexpected launcher object visible: " + resId, -// mDevice.wait(Until.gone(getLauncherObjectSelector(resId)), -// UI_OBJECT_WAIT_TIMEOUT_MS)); + assertTrue("Unexpected launcher object visible: " + resId, + mDevice.wait(Until.gone(getLauncherObjectSelector(resId)), + WAIT_TIME_MS)); } @NonNull UiObject2 getSystemUiObject(String resId) { - try { - mDevice.wakeUp(); - } catch (RemoteException e) { - fail("Failed to wake up the device: " + e); - } final UiObject2 object = mDevice.findObject(By.res(SYSTEMUI_PACKAGE, resId)); assertNotNull("Can't find a systemui object with id: " + resId, object); return object; @@ -269,8 +299,8 @@ public final class Launcher { UiObject2 waitForObjectInContainer(UiObject2 container, String resName) { final UiObject2 object = container.wait( Until.findObject(getLauncherObjectSelector(resName)), - UI_OBJECT_WAIT_TIMEOUT_MS); - assertNotNull("Can find a launcher object id: " + resName + " in container: " + + WAIT_TIME_MS); + assertNotNull("Can't find a launcher object id: " + resName + " in container: " + container.getResourceName(), object); return object; } @@ -278,8 +308,8 @@ public final class Launcher { @NonNull UiObject2 waitForLauncherObject(String resName) { final UiObject2 object = mDevice.wait(Until.findObject(getLauncherObjectSelector(resName)), - UI_OBJECT_WAIT_TIMEOUT_MS); - assertNotNull("Can find a launcher object; id: " + resName, object); + WAIT_TIME_MS); + assertNotNull("Can't find a launcher object; id: " + resName, object); return object; } @@ -292,9 +322,12 @@ public final class Launcher { return mDevice; } - void swipe(int startX, int startY, int endX, int endY, int steps) { - mDevice.swipe(startX, startY, endX, endY, steps); - waitForIdle(); + void swipe(int startX, int startY, int endX, int endY) { + executeAndWaitForEvent( + () -> mDevice.swipe(startX, startY, endX, endY, 60), + event -> "TAPL_WENT_TO_STATE".equals(event.getClassName()), + "Swipe failed to receive an event for the swipe end: " + startX + ", " + startY + + ", " + endX + ", " + endY); } void waitForIdle() { diff --git a/tests/tapl/com/android/launcher3/tapl/Overview.java b/tests/tapl/com/android/launcher3/tapl/Overview.java index 225165571e..3d504c45e5 100644 --- a/tests/tapl/com/android/launcher3/tapl/Overview.java +++ b/tests/tapl/com/android/launcher3/tapl/Overview.java @@ -16,6 +16,8 @@ package com.android.launcher3.tapl; +import static org.junit.Assert.assertNotEquals; + import android.graphics.Point; import android.support.annotation.NonNull; import android.support.test.uiautomator.Direction; @@ -27,44 +29,37 @@ import java.util.List; /** * Overview pane. */ -public final class Overview { +public final class Overview extends LauncherInstrumentation.VisibleContainer { private static final int DEFAULT_FLING_SPEED = 15000; - private final Launcher mLauncher; - - Overview(Launcher launcher) { - mLauncher = launcher; - assertState(); + Overview(LauncherInstrumentation launcher) { + super(launcher); + verifyActiveContainer(); } - /** - * Asserts that we are in overview. - * - * @return Overview panel. - */ - @NonNull - private UiObject2 assertState() { - return mLauncher.assertState(Launcher.State.OVERVIEW); + @Override + protected LauncherInstrumentation.ContainerType getContainerType() { + return LauncherInstrumentation.ContainerType.OVERVIEW; } /** * Flings forward (left) and waits the fling's end. */ public void flingForward() { - final UiObject2 overview = assertState(); + final UiObject2 overview = verifyActiveContainer(); overview.fling(Direction.LEFT, DEFAULT_FLING_SPEED); mLauncher.waitForIdle(); - assertState(); + verifyActiveContainer(); } /** * Flings backward (right) and waits the fling's end. */ public void flingBackward() { - final UiObject2 overview = assertState(); + final UiObject2 overview = verifyActiveContainer(); overview.fling(Direction.RIGHT, DEFAULT_FLING_SPEED); mLauncher.waitForIdle(); - assertState(); + verifyActiveContainer(); } /** @@ -74,10 +69,10 @@ public final class Overview { */ @NonNull public OverviewTask getCurrentTask() { - assertState(); + verifyActiveContainer(); final List taskViews = mLauncher.getDevice().findObjects( - Launcher.getLauncherObjectSelector("snapshot")); - mLauncher.assertNotEquals("Unable to find a task", 0, taskViews.size()); + LauncherInstrumentation.getLauncherObjectSelector("snapshot")); + assertNotEquals("Unable to find a task", 0, taskViews.size()); // taskViews contains up to 3 task views: the 'main' (having the widest visible // part) one in the center, and parts of its right and left siblings. Find the @@ -86,7 +81,7 @@ public final class Overview { (t1, t2) -> Integer.compare(t1.getVisibleBounds().width(), t2.getVisibleBounds().width())); - return new OverviewTask(mLauncher, widestTask); + return new OverviewTask(mLauncher, widestTask, this); } /** @@ -96,7 +91,7 @@ public final class Overview { */ @NonNull public AllAppsFromOverview switchToAllApps() { - assertState(); + verifyActiveContainer(); // Swipe from the hotseat to near the top, e.g. 10% of the screen. final UiObject2 predictionRow = mLauncher.waitForLauncherObject( @@ -104,7 +99,7 @@ public final class Overview { final Point start = predictionRow.getVisibleCenter(); final int endY = (int) (mLauncher.getDevice().getDisplayHeight() * 0.1f); mLauncher.swipe( - start.x, start.y, start.x, endY, (start.y - endY) / 100); // 100 px/step + start.x, start.y, start.x, endY); return new AllAppsFromOverview(mLauncher); } diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java index 68d308251b..0b3a26492e 100644 --- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java +++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java @@ -16,6 +16,8 @@ package com.android.launcher3.tapl; +import static org.junit.Assert.assertTrue; + import android.support.test.uiautomator.Direction; import android.support.test.uiautomator.UiObject2; import android.support.test.uiautomator.Until; @@ -24,29 +26,26 @@ import android.support.test.uiautomator.Until; * A recent task in the overview panel carousel. */ public final class OverviewTask { - private final Launcher mLauncher; + private final LauncherInstrumentation mLauncher; private final UiObject2 mTask; + private final Overview mOverview; - OverviewTask(Launcher launcher, UiObject2 task) { + OverviewTask(LauncherInstrumentation launcher, UiObject2 task, Overview overview) { mLauncher = launcher; - assertState(); mTask = task; + mOverview = overview; + verifyActiveContainer(); } - /** - * Asserts that we are in overview. - * - * @return Overview panel. - */ - private void assertState() { - mLauncher.assertState(Launcher.State.OVERVIEW); + private void verifyActiveContainer() { + mOverview.verifyActiveContainer(); } /** * Swipes the task up. */ public void dismiss() { - assertState(); + verifyActiveContainer(); // Dismiss the task via flinging it up. mTask.fling(Direction.DOWN); mLauncher.waitForIdle(); @@ -55,11 +54,11 @@ public final class OverviewTask { /** * Clicks at the task. */ - public void open() { - assertState(); - mLauncher.assertTrue("Launching task didn't open a new window: " + + public Background open() { + verifyActiveContainer(); + assertTrue("Launching task didn't open a new window: " + mTask.getParent().getContentDescription(), - mTask.clickAndWait(Until.newWindow(), Launcher.APP_LAUNCH_TIMEOUT_MS)); - mLauncher.assertState(Launcher.State.BACKGROUND); + mTask.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS)); + return new Background(mLauncher); } } diff --git a/tests/tapl/com/android/launcher3/tapl/Widgets.java b/tests/tapl/com/android/launcher3/tapl/Widgets.java index 7a5198a80b..f67ef4c774 100644 --- a/tests/tapl/com/android/launcher3/tapl/Widgets.java +++ b/tests/tapl/com/android/launcher3/tapl/Widgets.java @@ -16,50 +16,43 @@ package com.android.launcher3.tapl; -import android.support.annotation.NonNull; import android.support.test.uiautomator.Direction; import android.support.test.uiautomator.UiObject2; /** * All widgets container. */ -public final class Widgets { +public final class Widgets extends LauncherInstrumentation.VisibleContainer { private static final int FLING_SPEED = 12000; - private final Launcher mLauncher; - - Widgets(Launcher launcher) { - mLauncher = launcher; - assertState(); + Widgets(LauncherInstrumentation launcher) { + super(launcher); + verifyActiveContainer(); } /** * Flings forward (down) and waits the fling's end. */ public void flingForward() { - final UiObject2 widgetsContainer = assertState(); + final UiObject2 widgetsContainer = verifyActiveContainer(); + widgetsContainer.setGestureMargin(100); widgetsContainer.fling(Direction.DOWN, FLING_SPEED); - mLauncher.waitForIdle(); - assertState(); + verifyActiveContainer(); } /** * Flings backward (up) and waits the fling's end. */ public void flingBackward() { - final UiObject2 widgetsContainer = assertState(); + final UiObject2 widgetsContainer = verifyActiveContainer(); + widgetsContainer.setGestureMargin(100); widgetsContainer.fling(Direction.UP, FLING_SPEED); mLauncher.waitForIdle(); - assertState(); + verifyActiveContainer(); } - /** - * Asserts that we are in widgets. - * - * @return Widgets container. - */ - @NonNull - private UiObject2 assertState() { - return mLauncher.assertState(Launcher.State.WIDGETS); + @Override + protected LauncherInstrumentation.ContainerType getContainerType() { + return LauncherInstrumentation.ContainerType.WIDGETS; } } diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java new file mode 100644 index 0000000000..045ab5fcf2 --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.tapl; + +import static junit.framework.TestCase.assertTrue; + +import android.graphics.Point; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.test.uiautomator.Direction; +import android.support.test.uiautomator.UiObject2; +import android.view.KeyEvent; + +/** + * Operations on the workspace screen. + */ +public final class Workspace extends Home { + private final UiObject2 mHotseat; + private final int ICON_DRAG_SPEED = 2000; + + Workspace(LauncherInstrumentation launcher) { + super(launcher); + mHotseat = launcher.waitForLauncherObject("hotseat"); + } + + @Override + protected LauncherInstrumentation.ContainerType getContainerType() { + return LauncherInstrumentation.ContainerType.WORKSPACE; + } + + /** + * Swipes up to All Apps. + * + * @return the App Apps object. + */ + @NonNull + public AllApps switchToAllApps() { + verifyActiveContainer(); + if (mLauncher.isSwipeUpEnabled()) { + int midX = mLauncher.getDevice().getDisplayWidth() / 2; + int height = mLauncher.getDevice().getDisplayHeight(); + // Swipe from 6/7ths down the screen to 1/7th down the screen. + mLauncher.swipe( + midX, + height * 6 / 7, + midX, + height / 7 + ); + } else { + // Swipe from the hotseat to near the top, e.g. 10% of the screen. + final UiObject2 hotseat = mHotseat; + final Point start = hotseat.getVisibleCenter(); + final int endY = (int) (mLauncher.getDevice().getDisplayHeight() * 0.1f); + mLauncher.swipe( + start.x, + start.y, + start.x, + endY + ); + } + + return new AllApps(mLauncher); + } + + /** + * Returns an icon for the app, if currently visible. + * + * @param appName name of the app + * @return app icon, if found, null otherwise. + */ + @Nullable + public AppIcon tryGetWorkspaceAppIcon(String appName) { + final UiObject2 workspace = verifyActiveContainer(); + final UiObject2 icon = workspace.findObject(AppIcon.getAppIconSelector(appName)); + return icon != null ? new AppIcon(mLauncher, icon) : null; + } + + /** + * Ensures that workspace is scrollable. If it's not, drags an icon icons from hotseat to the + * second screen. + */ + public void ensureWorkspaceIsScrollable() { + final UiObject2 workspace = verifyActiveContainer(); + if (!isWorkspaceScrollable(workspace)) { + dragIconToNextScreen(getHotseatAppIcon("Messages"), workspace); + } + assertTrue("Home screen workspace didn't become scrollable", + isWorkspaceScrollable(workspace)); + } + + private boolean isWorkspaceScrollable(UiObject2 workspace) { + return workspace.isScrollable(); + } + + @NonNull + private AppIcon getHotseatAppIcon(String appName) { + return new AppIcon(mLauncher, mLauncher.getObjectInContainer( + mHotseat, AppIcon.getAppIconSelector(appName))); + } + + private void dragIconToNextScreen(AppIcon app, UiObject2 workspace) { + final Point dest = new Point( + mLauncher.getDevice().getDisplayWidth(), workspace.getVisibleBounds().centerY()); + app.getIcon().drag(dest, ICON_DRAG_SPEED); + verifyActiveContainer(); + } + + /** + * Flings to get to screens on the right. Waits for scrolling and a possible overscroll + * recoil to complete. + */ + public void flingForward() { + final UiObject2 workspace = verifyActiveContainer(); + workspace.fling(Direction.RIGHT); + mLauncher.waitForIdle(); + verifyActiveContainer(); + } + + /** + * Flings to get to screens on the left. Waits for scrolling and a possible overscroll + * recoil to complete. + */ + public void flingBackward() { + final UiObject2 workspace = verifyActiveContainer(); + workspace.fling(Direction.LEFT); + mLauncher.waitForIdle(); + verifyActiveContainer(); + } + + /** + * Opens widgets container by pressing Ctrl+W. + * + * @return the widgets container. + */ + @NonNull + public Widgets openAllWidgets() { + verifyActiveContainer(); + mLauncher.getDevice().pressKeyCode(KeyEvent.KEYCODE_W, KeyEvent.META_CTRL_ON); + return new Widgets(mLauncher); + } +} \ No newline at end of file -- GitLab From 402cf4c0cf973ef83cf76fbdef77e272631a77a8 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Mon, 23 Jul 2018 11:41:57 -0700 Subject: [PATCH 0036/1301] Stop DiscoveryBounce when user drags to home from Hotseat in Overview. Change-Id: I9f1ba2eef149565e6aab314a4a8376c1cb08cb60 Fixes: 111330609 Test: Manual test --- src/com/android/launcher3/dragndrop/DragController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java index 8a216fc173..47bbbcb0d3 100644 --- a/src/com/android/launcher3/dragndrop/DragController.java +++ b/src/com/android/launcher3/dragndrop/DragController.java @@ -16,6 +16,7 @@ package com.android.launcher3.dragndrop; +import static com.android.launcher3.AbstractFloatingView.TYPE_DISCOVERY_BOUNCE; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; import static com.android.launcher3.LauncherState.NORMAL; @@ -31,6 +32,7 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget; import com.android.launcher3.ItemInfo; @@ -145,6 +147,7 @@ public class DragController implements DragDriver.EventListener, TouchController // Hide soft keyboard, if visible UiThreadHelper.hideKeyboardAsync(mLauncher, mWindowToken); + AbstractFloatingView.closeOpenViews(mLauncher, false, TYPE_DISCOVERY_BOUNCE); mOptions = options; if (mOptions.systemDndStartPoint != null) { -- GitLab From 05d98c246b05d86531d2734efdddbfa50c08a9bb Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 23 Jul 2018 08:01:15 -0700 Subject: [PATCH 0037/1301] Adjust notification dots - Use consistent bounds for folders as other icons, to ensure dot has a consistent placement (moved right+up a bit) - Strengthen the ambient shadow to improve contrast - Increased blur size and opacity - Use a dark gray rather than black for dots on dark folders Bug: 73331123 Change-Id: I888f4645d3a48465af93f5003dda8f8b7c3129f3 --- res/values/attrs.xml | 1 + res/values/styles.xml | 2 ++ src/com/android/launcher3/BubbleTextView.java | 12 ++++++++---- src/com/android/launcher3/badge/BadgeRenderer.java | 1 + src/com/android/launcher3/folder/FolderIcon.java | 6 +----- .../android/launcher3/folder/PreviewBackground.java | 5 ++++- .../android/launcher3/graphics/ShadowGenerator.java | 2 +- 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 30091a5f77..045e4e98c8 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -33,6 +33,7 @@ + diff --git a/res/values/styles.xml b/res/values/styles.xml index 07bd80071f..7ea28ccf08 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -42,6 +42,7 @@ #44000000 @drawable/workspace_bg @style/WidgetContainerTheme + ?android:attr/colorPrimary @@ -70,6 +71,7 @@ #424242 #757575 @style/WidgetContainerTheme.Dark + #FF464646 true diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index fb7c0ced4a..fae199259e 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -386,10 +386,14 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } public void getIconBounds(Rect outBounds) { - int top = getPaddingTop(); - int left = (getWidth() - mIconSize) / 2; - int right = left + mIconSize; - int bottom = top + mIconSize; + getIconBounds(this, outBounds, mIconSize); + } + + public static void getIconBounds(View iconView, Rect outBounds, int iconSize) { + int top = iconView.getPaddingTop(); + int left = (iconView.getWidth() - iconSize) / 2; + int right = left + iconSize; + int bottom = top + iconSize; outBounds.set(left, top, right, bottom); } diff --git a/src/com/android/launcher3/badge/BadgeRenderer.java b/src/com/android/launcher3/badge/BadgeRenderer.java index 948742727c..8998b24ede 100644 --- a/src/com/android/launcher3/badge/BadgeRenderer.java +++ b/src/com/android/launcher3/badge/BadgeRenderer.java @@ -60,6 +60,7 @@ public class BadgeRenderer { int size = (int) (DOT_SCALE * mDotCenterOffset); ShadowGenerator.Builder builder = new ShadowGenerator.Builder(Color.TRANSPARENT); + builder.ambientShadowAlpha = 88; mBackgroundWithShadow = builder.setupBlurForSize(size).createPill(size, size); mCircleRadius = builder.radius; diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index cb5d872ab6..bdc40d7383 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -25,7 +25,6 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; -import android.graphics.Region; import android.graphics.drawable.Drawable; import android.os.Parcelable; import android.support.annotation.NonNull; @@ -490,10 +489,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { public void drawBadge(Canvas canvas) { if ((mBadgeInfo != null && mBadgeInfo.hasBadge()) || mBadgeScale > 0) { - int offsetX = mBackground.getOffsetX(); - int offsetY = mBackground.getOffsetY(); - int previewSize = (int) (mBackground.previewSize * mBackground.mScale); - mTempBounds.set(offsetX, offsetY, offsetX + previewSize, offsetY + previewSize); + BubbleTextView.getIconBounds(this, mTempBounds, mLauncher.getDeviceProfile().iconSizePx); // If we are animating to the accepting state, animate the badge out. float badgeScale = Math.max(0, mBadgeScale - mBackground.getScaleProgress()); diff --git a/src/com/android/launcher3/folder/PreviewBackground.java b/src/com/android/launcher3/folder/PreviewBackground.java index 069ec4ba11..b162fcf32c 100644 --- a/src/com/android/launcher3/folder/PreviewBackground.java +++ b/src/com/android/launcher3/folder/PreviewBackground.java @@ -38,6 +38,7 @@ import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; +import com.android.launcher3.R; import com.android.launcher3.util.Themes; /** @@ -70,6 +71,7 @@ public class PreviewBackground { float mScale = 1f; private float mColorMultiplier = 1f; private int mBgColor; + private int mBadgeColor; private float mStrokeWidth; private int mStrokeAlpha = MAX_BG_OPACITY; private int mShadowAlpha = 255; @@ -132,6 +134,7 @@ public class PreviewBackground { int availableSpaceX, int topPadding) { mInvalidateDelegate = invalidateDelegate; mBgColor = Themes.getAttrColor(launcher, android.R.attr.colorPrimary); + mBadgeColor = Themes.getAttrColor(launcher, R.attr.folderBadgeColor); DeviceProfile grid = launcher.getDeviceProfile(); previewSize = grid.folderIconSizePx; @@ -198,7 +201,7 @@ public class PreviewBackground { } public int getBadgeColor() { - return mBgColor; + return mBadgeColor; } public void drawBackground(Canvas canvas) { diff --git a/src/com/android/launcher3/graphics/ShadowGenerator.java b/src/com/android/launcher3/graphics/ShadowGenerator.java index 5fbf502aab..e12095bd75 100644 --- a/src/com/android/launcher3/graphics/ShadowGenerator.java +++ b/src/com/android/launcher3/graphics/ShadowGenerator.java @@ -120,7 +120,7 @@ public class ShadowGenerator { } public Builder setupBlurForSize(int height) { - shadowBlur = height * 1f / 32; + shadowBlur = height * 1f / 24; keyShadowDistance = height * 1f / 16; return this; } -- GitLab From 4a2b9d5e369cc764f4a3093f4ee8b4b2b4ce2f1c Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 24 Jul 2018 14:50:56 -0700 Subject: [PATCH 0038/1301] Fix bug where icon appears large until transluscent activity finishes. It appears large because the pressed state of the view increases the scale, and we want to leave the pressed state until the activity is launched. With the remote app transitions, we now have a callback for when the activity is done launching so we then cancel the "stayPressed" state. Bug: 111742067 Change-Id: I25725e908b12f4dd1256294a26232b289db2d057 --- .../android/launcher3/LauncherAppTransitionManagerImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 14633afa52..37d0b12bdc 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -537,6 +537,9 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag @Override public void onAnimationEnd(Animator animation) { // Reset launcher to normal state + if (isBubbleTextView) { + ((BubbleTextView) v).setStayPressed(false); + } v.setVisibility(View.VISIBLE); ((ViewGroup) mDragLayer.getParent()).removeView(mFloatingView); } -- GitLab From a279b2ea3e06a749fe70df948b3c1ffa0f978b7e Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 18 Jun 2018 19:14:44 -0700 Subject: [PATCH 0039/1301] Adding a build rule for Tapl static library Bug: 110103162 Test: TaplTests suite Change-Id: Ibff017b68b1a31728d3a8d0c1ede2da6ebfecbb1 --- tests/Android.mk | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/Android.mk b/tests/Android.mk index f6f02feab5..8ca84f87b9 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -30,3 +30,16 @@ LOCAL_PACKAGE_NAME := Launcher3Tests LOCAL_INSTRUMENTATION_FOR := Launcher3 include $(BUILD_PACKAGE) + +# +# Build rule for Tapl library. +# +include $(CLEAR_VARS) +LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator + +LOCAL_SRC_FILES := $(call all-java-files-under, tapl) + +LOCAL_SDK_VERSION := current +LOCAL_MODULE := ub-launcher-tapl + +include $(BUILD_STATIC_JAVA_LIBRARY) -- GitLab From 90646a5dd472fc4041f2c81dc29434374ad65f51 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Thu, 21 Jun 2018 14:33:38 -0700 Subject: [PATCH 0040/1301] Tapping task icon in overview with scroll to it and open Smaller devices or landscape with splitscreen can show more than one task icon in overview. Tapping the icon when not in the middle will scroll the task into the middle and open at the same time. Change-Id: I0fe261e9a1b8ab6ad7e6c6ea64125a9c7b38da39 Fixes: 110371874 Fixes: 111446332 Test: splitscreen, overview in landscape, tap non-centered task icon --- .../android/quickstep/views/TaskMenuView.java | 25 ++++++++----- .../com/android/quickstep/views/TaskView.java | 35 +++++++++++++++++-- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java index e609a404f9..41626c6be0 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java +++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java @@ -87,6 +87,7 @@ public class TaskMenuView extends AbstractFloatingView { private static final int REVEAL_OPEN_DURATION = 150; private static final int REVEAL_CLOSE_DURATION = 100; + private final float mThumbnailTopMargin; private BaseDraggingActivity mActivity; private TextView mTaskName; private IconView mTaskIcon; @@ -103,6 +104,7 @@ public class TaskMenuView extends AbstractFloatingView { super(context, attrs, defStyleAttr); mActivity = BaseDraggingActivity.fromContext(context); + mThumbnailTopMargin = getResources().getDimension(R.dimen.task_thumbnail_top_margin); } @Override @@ -154,11 +156,16 @@ public class TaskMenuView extends AbstractFloatingView { return (type & TYPE_TASK_MENU) != 0; } - public static boolean showForTask(TaskView taskView) { + public void setPosition(float x, float y) { + setX(x); + setY(y + mThumbnailTopMargin); + } + + public static TaskMenuView showForTask(TaskView taskView) { BaseDraggingActivity activity = BaseDraggingActivity.fromContext(taskView.getContext()); final TaskMenuView taskMenuView = (TaskMenuView) activity.getLayoutInflater().inflate( R.layout.task_menu, activity.getDragLayer(), false); - return taskMenuView.populateAndShowForTask(taskView); + return taskMenuView.populateAndShowForTask(taskView) ? taskMenuView : null; } private boolean populateAndShowForTask(TaskView taskView) { @@ -188,7 +195,7 @@ public class TaskMenuView extends AbstractFloatingView { // Move the icon and text up half an icon size to lay over the TaskView LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mTaskIcon.getLayoutParams(); - params.topMargin = (int) -getResources().getDimension(R.dimen.task_thumbnail_top_margin); + params.topMargin = (int) -mThumbnailTopMargin; mTaskIcon.setLayoutParams(params); for (TaskSystemShortcut menuOption : MENU_OPTIONS) { @@ -213,12 +220,12 @@ public class TaskMenuView extends AbstractFloatingView { mActivity.getDragLayer().getDescendantRectRelativeToSelf(taskView, sTempRect); Rect insets = mActivity.getDragLayer().getInsets(); BaseDragLayer.LayoutParams params = (BaseDragLayer.LayoutParams) getLayoutParams(); - params.width = sTempRect.width(); - params.gravity = Gravity.LEFT; + params.width = taskView.getMeasuredWidth(); + params.gravity = Gravity.START; setLayoutParams(params); - setX(Math.round(sTempRect.left - insets.left)); - setY(Math.round(sTempRect.top - insets.top - + getResources().getDimension(R.dimen.task_thumbnail_top_margin))); + setScaleX(taskView.getScaleX()); + setScaleY(taskView.getScaleY()); + setPosition(sTempRect.left - insets.left, sTempRect.top - insets.top); } private void animateOpen() { @@ -232,7 +239,7 @@ public class TaskMenuView extends AbstractFloatingView { private void animateOpenOrClosed(boolean closing) { if (mOpenCloseAnimator != null && mOpenCloseAnimator.isRunning()) { - return; + mOpenCloseAnimator.end(); } mOpenCloseAnimator = LauncherAnimUtils.createAnimatorSet(); diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 1653038808..ee542d57ed 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -110,8 +110,24 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback } }; + private final OnAttachStateChangeListener mTaskMenuStateListener = + new OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) { + } + + @Override + public void onViewDetachedFromWindow(View view) { + if (mMenuView != null) { + mMenuView.removeOnAttachStateChangeListener(this); + mMenuView = null; + } + } + }; + private Task mTask; private TaskThumbnailView mSnapshotView; + private TaskMenuView mMenuView; private IconView mIconView; private float mCurveScale; private float mZoomScale; @@ -200,13 +216,22 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback public void onTaskDataLoaded(Task task, ThumbnailData thumbnailData) { mSnapshotView.setThumbnail(task, thumbnailData); mIconView.setDrawable(task.icon); - mIconView.setOnClickListener(icon -> TaskMenuView.showForTask(this)); + mIconView.setOnClickListener(icon -> showTaskMenu()); mIconView.setOnLongClickListener(icon -> { requestDisallowInterceptTouchEvent(true); - return TaskMenuView.showForTask(this); + return showTaskMenu(); }); } + private boolean showTaskMenu() { + getRecentsView().snapToPage(getRecentsView().indexOfChild(this)); + mMenuView = TaskMenuView.showForTask(this); + if (mMenuView != null) { + mMenuView.addOnAttachStateChangeListener(mTaskMenuStateListener); + } + return mMenuView != null; + } + @Override public void onTaskDataUnloaded() { mSnapshotView.setThumbnail(null, null); @@ -266,6 +291,12 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback mSnapshotView.setDimAlpha(curveInterpolation * MAX_PAGE_SCRIM_ALPHA); setCurveScale(getCurveScaleForCurveInterpolation(curveInterpolation)); + + if (mMenuView != null) { + mMenuView.setPosition(getX() - getRecentsView().getScrollX(), getY()); + mMenuView.setScaleX(getScaleX()); + mMenuView.setScaleY(getScaleY()); + } } @Override -- GitLab From 44780bad8f05092caeb719695abc5baea850d4fc Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 1 Aug 2018 13:08:19 -0700 Subject: [PATCH 0041/1301] Adding AOSP into the tapl library name. The idea is to prevent accidentally adding non-AOSP code to it, which would make it wrong to drop it to AOSP parts of the platform. Bug: 110103162 Test: Building TaplTests suite Change-Id: Ide68f469d59fefb72b5195c7916bd1515a9bbed2 --- tests/Android.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Android.mk b/tests/Android.mk index 8ca84f87b9..c8e554d734 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -40,6 +40,6 @@ LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator LOCAL_SRC_FILES := $(call all-java-files-under, tapl) LOCAL_SDK_VERSION := current -LOCAL_MODULE := ub-launcher-tapl +LOCAL_MODULE := ub-launcher-aosp-tapl include $(BUILD_STATIC_JAVA_LIBRARY) -- GitLab From dbcb8674fd3f38b9850a836fceaf8de459c623a9 Mon Sep 17 00:00:00 2001 From: Stan Iliev Date: Tue, 31 Jul 2018 11:50:01 -0400 Subject: [PATCH 0042/1301] Fix All-apps search box background pixelation Enable bitmap filter for search box background. This avoids jagged line, when bitmap is translated by half screen pixel. Bug: 77841258 Test: Ran launcher on a device Change-Id: I9293669da5db8be16ebe55ce01ab0e9735932c12 --- src/com/android/launcher3/graphics/NinePatchDrawHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/graphics/NinePatchDrawHelper.java b/src/com/android/launcher3/graphics/NinePatchDrawHelper.java index fc209260ad..587268968b 100644 --- a/src/com/android/launcher3/graphics/NinePatchDrawHelper.java +++ b/src/com/android/launcher3/graphics/NinePatchDrawHelper.java @@ -33,7 +33,9 @@ public class NinePatchDrawHelper { private final Rect mSrc = new Rect(); private final RectF mDst = new RectF(); - public final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + // Enable filtering to always get a nice edge. This avoids jagged line, when bitmap is + // translated by half pixel. + public final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); /** * Draws the bitmap split into three parts horizontally, with the middle part having width -- GitLab From e39690b2183e7d60f268b9af4eaeb36c1c1e2fb4 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 2 Aug 2018 13:35:07 -0700 Subject: [PATCH 0043/1301] Launching last task when back button is pressed in overview Bug: 111158326 Change-Id: Ib38f12f177780d15dbee69e4a27c21aaa9a3e087 --- .../android/launcher3/uioverrides/OverviewState.java | 11 +++++++++++ .../src/com/android/quickstep/views/RecentsView.java | 12 ++++++++---- src/com/android/launcher3/Launcher.java | 8 +------- src/com/android/launcher3/LauncherState.java | 11 +++++++++++ src/com/android/launcher3/Workspace.java | 6 ------ 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java index 7f956f8a29..cf3eee6b24 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java @@ -31,6 +31,7 @@ import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.quickstep.RecentsModel; import com.android.quickstep.views.RecentsView; +import com.android.quickstep.views.TaskView; /** * Definition for overview state @@ -130,4 +131,14 @@ public class OverviewState extends LauncherState { DeviceProfile dp = launcher.getDeviceProfile(); return dp.allAppsCellHeightPx - dp.allAppsIconTextSizePx; } + + @Override + public void onBackPressed(Launcher launcher) { + TaskView taskView = launcher.getOverviewPanel().getRunningTaskView(); + if (taskView != null) { + taskView.launchTask(true); + } else { + super.onBackPressed(launcher); + } + } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 2680a2695e..181d3c59ec 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -714,12 +714,16 @@ public abstract class RecentsView extends PagedView impl setCurrentTask(runningTaskId); } + public TaskView getRunningTaskView() { + return getTaskView(mRunningTaskId); + } + /** * Hides the tile associated with {@link #mRunningTaskId} */ public void setRunningTaskHidden(boolean isHidden) { mRunningTaskTileHidden = isHidden; - TaskView runningTask = getTaskView(mRunningTaskId); + TaskView runningTask = getRunningTaskView(); if (runningTask != null) { runningTask.setAlpha(isHidden ? 0 : mContentAlpha); } @@ -745,7 +749,7 @@ public abstract class RecentsView extends PagedView impl } public void showNextTask() { - TaskView runningTaskView = getTaskView(mRunningTaskId); + TaskView runningTaskView = getRunningTaskView(); if (runningTaskView == null) { // Launch the first task if (getTaskViewCount() > 0) { @@ -773,7 +777,7 @@ public abstract class RecentsView extends PagedView impl } private void applyRunningTaskIconScale() { - TaskView firstTask = getTaskView(mRunningTaskId); + TaskView firstTask = getRunningTaskView(); if (firstTask != null) { firstTask.setIconScaleAndDim(mRunningTaskIconScaledDown ? 0 : 1); } @@ -781,7 +785,7 @@ public abstract class RecentsView extends PagedView impl public void animateUpRunningTaskIconScale() { mRunningTaskIconScaledDown = false; - TaskView firstTask = getTaskView(mRunningTaskId); + TaskView firstTask = getRunningTaskView(); if (firstTask != null) { firstTask.animateIconScaleAndDimIntoView(); } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 44d3d53739..408ee2eeb4 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1606,14 +1606,8 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(this); if (topView != null && topView.onBackPressed()) { // Handled by the floating view. - } else if (!isInState(NORMAL)) { - LauncherState lastState = mStateManager.getLastState(); - ued.logActionCommand(Action.Command.BACK, mStateManager.getState().containerType, - lastState.containerType); - mStateManager.goToState(lastState); } else { - // Back button is a no-op here, but give at least some feedback for the button press - mWorkspace.showOutlinesTemporarily(); + mStateManager.getState().onBackPressed(this); } } diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java index 8a15b24f18..bbe44c005e 100644 --- a/src/com/android/launcher3/LauncherState.java +++ b/src/com/android/launcher3/LauncherState.java @@ -30,6 +30,7 @@ import com.android.launcher3.uioverrides.AllAppsState; import com.android.launcher3.uioverrides.FastOverviewState; import com.android.launcher3.uioverrides.OverviewState; import com.android.launcher3.uioverrides.UiFactory; +import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import java.util.Arrays; @@ -251,6 +252,16 @@ public class LauncherState { } } + public void onBackPressed(Launcher launcher) { + if (this != NORMAL) { + LauncherStateManager lsm = launcher.getStateManager(); + LauncherState lastState = lsm.getLastState(); + launcher.getUserEventDispatcher().logActionCommand(Action.Command.BACK, + containerType, lastState.containerType); + lsm.goToState(lastState); + } + } + protected static void dispatchWindowStateChanged(Launcher launcher) { launcher.getWindow().getDecorView().sendAccessibilityEvent(TYPE_WINDOW_STATE_CHANGED); } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 37d00561b8..a98c3cbc00 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1291,12 +1291,6 @@ public class Workspace extends PagedView } } - public void showOutlinesTemporarily() { - if (!mIsPageInTransition && !isTouchActive()) { - snapToPage(mCurrentPage); - } - } - private void updatePageAlphaValues() { // We need to check the isDragging case because updatePageAlphaValues is called between // goToState(SPRING_LOADED) and onStartStateTransition. -- GitLab From ff3fa34a7ab5feb0bbe11893022a832be73536d5 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 25 Jul 2018 16:29:06 -0700 Subject: [PATCH 0044/1301] Fixing scrolling up in App Apps. Done by scrolling only when scroll position is not zero. This way, the scroll gesture can't close All Apps. Bug: 110103162 Test: TaplTests suite Change-Id: Icfe47d2bcc0210ae221df169d6c35cd1be10ff86 --- src/com/android/launcher3/Utilities.java | 4 ++ .../allapps/AllAppsContainerView.java | 14 +++++ .../compat/AccessibilityManagerCompat.java | 59 ++++++++++++++++--- .../com/android/launcher3/tapl/AllApps.java | 23 +++++--- .../launcher3/tapl/AllAppsFromOverview.java | 5 -- .../tapl/LauncherInstrumentation.java | 22 +++++-- 6 files changed, 101 insertions(+), 26 deletions(-) diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 7c5bb1af8f..a8513185e5 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -602,4 +602,8 @@ public final class Utilities { msg.setAsynchronous(true); handler.sendMessage(msg); } + + public interface Consumer { + void accept(T var1); + } } diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index fdf32af6d2..40cf0f3d07 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -21,6 +21,7 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; +import android.os.Bundle; import android.os.Process; import android.support.animation.DynamicAnimation; import android.support.annotation.NonNull; @@ -48,6 +49,7 @@ import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.compat.AccessibilityManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.keyboard.FocusedItemDecorator; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; @@ -549,4 +551,16 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo && verticalFadingEdge); } } + + @Override + public boolean performAccessibilityAction(int action, Bundle arguments) { + if (AccessibilityManagerCompat.processTestRequest( + mLauncher, "TAPL_GET_SCROLL", action, arguments, + response -> + response.putInt("scrollY", getActiveRecyclerView().getCurrentScrollY()))) { + return true; + } + + return super.performAccessibilityAction(action, arguments); + } } diff --git a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java index 29fc2bc60d..32fb5332c0 100644 --- a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java +++ b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java @@ -18,9 +18,11 @@ package com.android.launcher3.compat; import android.accessibilityservice.AccessibilityServiceInfo; import android.content.Context; +import android.os.Bundle; import android.view.View; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityNodeInfo; import com.android.launcher3.Utilities; @@ -49,17 +51,60 @@ public class AccessibilityManagerCompat { } public static void sendEventToTest(Context context, String eventTag) { - if (!Utilities.IS_RUNNING_IN_TEST_HARNESS) return; + final AccessibilityManager accessibilityManager = getAccessibilityManagerForTest(context); + if (accessibilityManager == null) return; + sendEventToTest(accessibilityManager, eventTag, null); + } + + private static void sendEventToTest( + AccessibilityManager accessibilityManager, String eventTag, Bundle data) { + final AccessibilityEvent e = AccessibilityEvent.obtain( + AccessibilityEvent.TYPE_ANNOUNCEMENT); + e.setClassName(eventTag); + e.setParcelableData(data); + accessibilityManager.sendAccessibilityEvent(e); + } + + /** + * Returns accessibility manager to be used for communication with UI Automation tests. + * The tests may exchange custom accessibility messages with the launcher; the accessibility + * manager is used in these communications. + * + * If the launcher runs not under a test, the return is null, and no attempt to process or send + * custom accessibility messages should be made. + */ + private static AccessibilityManager getAccessibilityManagerForTest(Context context) { + // If not running in a test harness, don't participate in test exchanges. + if (!Utilities.IS_RUNNING_IN_TEST_HARNESS) return null; + + // Additional safety check: when running under UI Automation, accessibility is enabled, + // but the list of accessibility services is empty. Return null if this is not the case. final AccessibilityManager accessibilityManager = getManager(context); - if (accessibilityManager.isEnabled() && + if (!accessibilityManager.isEnabled() || accessibilityManager.getEnabledAccessibilityServiceList( - AccessibilityServiceInfo.FEEDBACK_ALL_MASK).size() == 0) { + AccessibilityServiceInfo.FEEDBACK_ALL_MASK).size() > 0) { + return null; + } + + return accessibilityManager; + } + + public static boolean processTestRequest(Context context, String eventTag, int action, + Bundle request, Utilities.Consumer responseFiller) { + final AccessibilityManager accessibilityManager = getAccessibilityManagerForTest(context); + if (accessibilityManager == null) return false; - final AccessibilityEvent e = AccessibilityEvent.obtain( - AccessibilityEvent.TYPE_ANNOUNCEMENT); - e.setClassName(eventTag); - accessibilityManager.sendAccessibilityEvent(e); + // The test sends a request via a ACTION_SET_TEXT. + if (action == AccessibilityNodeInfo.ACTION_SET_TEXT && + eventTag.equals(request.getCharSequence( + AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE))) { + final Bundle response = new Bundle(); + responseFiller.accept(response); + AccessibilityManagerCompat.sendEventToTest( + accessibilityManager, eventTag + "_RESPONSE", response); + return true; } + return false; } } diff --git a/tests/tapl/com/android/launcher3/tapl/AllApps.java b/tests/tapl/com/android/launcher3/tapl/AllApps.java index d849e2d809..e270b46056 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllApps.java +++ b/tests/tapl/com/android/launcher3/tapl/AllApps.java @@ -72,28 +72,33 @@ public class AllApps extends LauncherInstrumentation.VisibleContainer { return new AppIcon(mLauncher, appIcon); } - protected int getBottomMarginForSwipeUp() { - return 5; - } - private void scrollBackToBeginning() { final UiObject2 allAppsContainer = verifyActiveContainer(); + final UiObject2 searchBox = + mLauncher.waitForObjectInContainer(allAppsContainer, "search_container_all_apps"); int attempts = 0; - allAppsContainer.setGestureMargins(5, 600, 5, getBottomMarginForSwipeUp()); + allAppsContainer.setGestureMargins(0, searchBox.getVisibleBounds().bottom + 1, 0, 5); - while (allAppsContainer.scroll(Direction.UP, 0.5f)) { - mLauncher.waitForIdle(); - verifyActiveContainer(); + for (int scroll = getScroll(allAppsContainer); + scroll != 0; + scroll = getScroll(allAppsContainer)) { + assertTrue("Negative scroll position", scroll > 0); assertTrue("Exceeded max scroll attempts: " + MAX_SCROLL_ATTEMPTS, ++attempts <= MAX_SCROLL_ATTEMPTS); + + allAppsContainer.scroll(Direction.UP, 1); } - mLauncher.waitForIdle(); verifyActiveContainer(); } + private int getScroll(UiObject2 allAppsContainer) { + return mLauncher.getAnswerFromLauncher(allAppsContainer, "TAPL_GET_SCROLL"). + getInt("scrollY", -1); + } + private void ensureIconVisible(UiObject2 appIcon, UiObject2 allAppsContainer) { final int appHeight = appIcon.getVisibleBounds().height(); if (appHeight < MIN_INTERACT_SIZE) { diff --git a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java index bc0dfc6462..7ed2dc2f6d 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java +++ b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java @@ -30,11 +30,6 @@ public final class AllAppsFromOverview extends AllApps { verifyActiveContainer(); } - @Override - protected int getBottomMarginForSwipeUp() { - return 600; - } - /** * Swipes down to switch back to Overview whence we came from. * diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index fc32fed2cc..0be09f0d9d 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -23,6 +23,7 @@ import static org.junit.Assert.fail; import android.app.ActivityManager; import android.app.UiAutomation; import android.content.res.Resources; +import android.os.Bundle; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -32,8 +33,7 @@ import android.support.test.uiautomator.BySelector; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject2; import android.support.test.uiautomator.Until; - -import org.junit.Assert; +import android.view.accessibility.AccessibilityEvent; import java.lang.ref.WeakReference; import java.util.concurrent.TimeoutException; @@ -156,18 +156,30 @@ public final class LauncherInstrumentation { } } - private void executeAndWaitForEvent(Runnable command, + private Bundle executeAndWaitForEvent(Runnable command, UiAutomation.AccessibilityEventFilter eventFilter, String message) { try { - assertNotNull("executeAndWaitForEvent returned null (this can't happen)", + final AccessibilityEvent event = InstrumentationRegistry.getInstrumentation().getUiAutomation() .executeAndWaitForEvent( - command, eventFilter, WAIT_TIME_MS)); + command, eventFilter, WAIT_TIME_MS); + assertNotNull("executeAndWaitForEvent returned null (this can't happen)", event); + return (Bundle) event.getParcelableData(); } catch (TimeoutException e) { fail(message); + return null; } } + Bundle getAnswerFromLauncher(UiObject2 view, String requestTag) { + // Send a fake set-text request to Launcher to initiate a response with requested data. + final String responseTag = requestTag + "_RESPONSE"; + return executeAndWaitForEvent( + () -> view.setText(requestTag), + event -> responseTag.equals(event.getClassName()), + "Launcher didn't respond to request: " + requestTag); + } + /** * Presses nav bar home button. * -- GitLab From db6cdb07e859e64edaee4d92dccfe1d0af5b232a Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 13 Jul 2018 11:03:04 -0700 Subject: [PATCH 0045/1301] Exposing some private methods to easily customize widgets popup Change-Id: Ie7bd879200b1f14d472ff03fd64429930651a39f --- .../notification/NotificationFooterLayout.java | 2 +- .../launcher3/popup/PopupContainerWithArrow.java | 2 +- .../launcher3/shortcuts/DeepShortcutView.java | 4 ++++ .../launcher3/views/AbstractSlideInView.java | 13 ++++++++----- .../android/launcher3/widget/BaseWidgetSheet.java | 13 ++++++++----- .../launcher3/widget/WidgetsBottomSheet.java | 4 ++-- .../android/launcher3/widget/WidgetsFullSheet.java | 10 +++++----- 7 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/com/android/launcher3/notification/NotificationFooterLayout.java b/src/com/android/launcher3/notification/NotificationFooterLayout.java index 1216a27be0..66f525cb44 100644 --- a/src/com/android/launcher3/notification/NotificationFooterLayout.java +++ b/src/com/android/launcher3/notification/NotificationFooterLayout.java @@ -157,7 +157,7 @@ public class NotificationFooterLayout extends FrameLayout { Rect fromBounds = sTempRect; firstNotification.getGlobalVisibleRect(fromBounds); float scale = (float) toBounds.height() / fromBounds.height(); - Animator moveAndScaleIcon = LauncherAnimUtils.ofPropertyValuesHolder(firstNotification, + Animator moveAndScaleIcon = ObjectAnimator.ofPropertyValuesHolder(firstNotification, new PropertyListBuilder().scale(scale).translationY(toBounds.top - fromBounds.top + (fromBounds.height() * scale - fromBounds.height()) / 2).build()); moveAndScaleIcon.addListener(new AnimatorListenerAdapter() { diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index 635e043712..10be925516 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -84,7 +84,7 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, private final List mShortcuts = new ArrayList<>(); private final PointF mInterceptTouchDown = new PointF(); - private final Point mIconLastTouchPos = new Point(); + protected final Point mIconLastTouchPos = new Point(); private final int mStartDragThreshold; private final LauncherAccessibilityDelegate mAccessibilityDelegate; diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutView.java b/src/com/android/launcher3/shortcuts/DeepShortcutView.java index 7d0ea7bb9e..c856cdbe53 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutView.java @@ -141,4 +141,8 @@ public class DeepShortcutView extends FrameLayout { public View getIconView() { return mIconView; } + + public ShortcutInfoCompat getDetail() { + return mDetail; + } } diff --git a/src/com/android/launcher3/views/AbstractSlideInView.java b/src/com/android/launcher3/views/AbstractSlideInView.java index c8d14572eb..59bea48c8c 100644 --- a/src/com/android/launcher3/views/AbstractSlideInView.java +++ b/src/com/android/launcher3/views/AbstractSlideInView.java @@ -30,7 +30,6 @@ import android.view.animation.Interpolator; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.Utilities; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.touch.SwipeDetector; @@ -76,7 +75,7 @@ public abstract class AbstractSlideInView extends AbstractFloatingView mScrollInterpolator = Interpolators.SCROLL_CUBIC; mSwipeDetector = new SwipeDetector(context, this, SwipeDetector.VERTICAL); - mOpenCloseAnimator = LauncherAnimUtils.ofPropertyValuesHolder(this); + mOpenCloseAnimator = ObjectAnimator.ofPropertyValuesHolder(this); mOpenCloseAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { @@ -103,7 +102,7 @@ public abstract class AbstractSlideInView extends AbstractFloatingView directionsToDetectScroll, false); mSwipeDetector.onTouchEvent(ev); return mSwipeDetector.isDraggingOrSettling() - || !mLauncher.getDragLayer().isEventOverView(mContent, ev); + || !getPopupContainer().isEventOverView(mContent, ev); } @Override @@ -111,7 +110,7 @@ public abstract class AbstractSlideInView extends AbstractFloatingView mSwipeDetector.onTouchEvent(ev); if (ev.getAction() == MotionEvent.ACTION_UP && mSwipeDetector.isIdleState()) { // If we got ACTION_UP without ever starting swipe, close the panel. - if (!mLauncher.getDragLayer().isEventOverView(mContent, ev)) { + if (!getPopupContainer().isEventOverView(mContent, ev)) { close(true); } } @@ -178,6 +177,10 @@ public abstract class AbstractSlideInView extends AbstractFloatingView protected void onCloseComplete() { mIsOpen = false; - mLauncher.getDragLayer().removeView(this); + getPopupContainer().removeView(this); + } + + protected BaseDragLayer getPopupContainer() { + return mLauncher.getDragLayer(); } } diff --git a/src/com/android/launcher3/widget/BaseWidgetSheet.java b/src/com/android/launcher3/widget/BaseWidgetSheet.java index 10708d6004..20c8876d29 100644 --- a/src/com/android/launcher3/widget/BaseWidgetSheet.java +++ b/src/com/android/launcher3/widget/BaseWidgetSheet.java @@ -71,7 +71,7 @@ abstract class BaseWidgetSheet extends AbstractSlideInView } @Override - public final boolean onLongClick(View v) { + public boolean onLongClick(View v) { if (!ItemLongClickListener.canStartDrag(mLauncher)) return false; if (v instanceof WidgetCell) { @@ -96,7 +96,7 @@ abstract class BaseWidgetSheet extends AbstractSlideInView } int[] loc = new int[2]; - mLauncher.getDragLayer().getLocationInDragLayer(image, loc); + getPopupContainer().getLocationInDragLayer(image, loc); new PendingItemDragHelper(v).startDrag( image.getBitmapBounds(), image.getBitmap().getWidth(), image.getWidth(), @@ -119,13 +119,13 @@ abstract class BaseWidgetSheet extends AbstractSlideInView } protected void clearNavBarColor() { - mLauncher.getSystemUiController().updateUiState( + getSystemUiController().updateUiState( SystemUiController.UI_STATE_WIDGET_BOTTOM_SHEET, 0); } protected void setupNavBarColor() { - boolean isSheetDark = Themes.getAttrBoolean(mLauncher, R.attr.isMainColorDark); - mLauncher.getSystemUiController().updateUiState( + boolean isSheetDark = Themes.getAttrBoolean(getContext(), R.attr.isMainColorDark); + getSystemUiController().updateUiState( SystemUiController.UI_STATE_WIDGET_BOTTOM_SHEET, isSheetDark ? SystemUiController.FLAG_DARK_NAV : SystemUiController.FLAG_LIGHT_NAV); } @@ -145,4 +145,7 @@ abstract class BaseWidgetSheet extends AbstractSlideInView protected abstract int getElementsRowCount(); + protected SystemUiController getSystemUiController() { + return mLauncher.getSystemUiController(); + } } diff --git a/src/com/android/launcher3/widget/WidgetsBottomSheet.java b/src/com/android/launcher3/widget/WidgetsBottomSheet.java index 5ce7e0453b..4ba6b5b123 100644 --- a/src/com/android/launcher3/widget/WidgetsBottomSheet.java +++ b/src/com/android/launcher3/widget/WidgetsBottomSheet.java @@ -71,7 +71,7 @@ public class WidgetsBottomSheet extends BaseWidgetSheet implements Insettable { onWidgetsBound(); - mLauncher.getDragLayer().addView(this); + getPopupContainer().addView(this); mIsOpen = false; animateOpen(); } @@ -118,7 +118,7 @@ public class WidgetsBottomSheet extends BaseWidgetSheet implements Insettable { LayoutInflater.from(getContext()).inflate(R.layout.widget_list_divider, parent, true); } - private WidgetCell addItemCell(ViewGroup parent) { + protected WidgetCell addItemCell(ViewGroup parent) { WidgetCell widget = (WidgetCell) LayoutInflater.from(getContext()).inflate( R.layout.widget_cell, parent, false); diff --git a/src/com/android/launcher3/widget/WidgetsFullSheet.java b/src/com/android/launcher3/widget/WidgetsFullSheet.java index b493228324..2a7bb03aa1 100644 --- a/src/com/android/launcher3/widget/WidgetsFullSheet.java +++ b/src/com/android/launcher3/widget/WidgetsFullSheet.java @@ -160,7 +160,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet private void open(boolean animate) { if (animate) { - if (mLauncher.getDragLayer().getInsets().bottom > 0) { + if (getPopupContainer().getInsets().bottom > 0) { mContent.setAlpha(0); setTranslationShift(VERTICAL_START_POSITION); } @@ -207,10 +207,10 @@ public class WidgetsFullSheet extends BaseWidgetSheet mNoIntercept = false; RecyclerViewFastScroller scroller = mRecyclerView.getScrollbar(); if (scroller.getThumbOffsetY() >= 0 && - mLauncher.getDragLayer().isEventOverView(scroller, ev)) { + getPopupContainer().isEventOverView(scroller, ev)) { mNoIntercept = true; - } else if (mLauncher.getDragLayer().isEventOverView(mContent, ev)) { - mNoIntercept = !mRecyclerView.shouldContainerScroll(ev, mLauncher.getDragLayer()); + } else if (getPopupContainer().isEventOverView(mContent, ev)) { + mNoIntercept = !mRecyclerView.shouldContainerScroll(ev, getPopupContainer()); } } return super.onControllerInterceptTouchEvent(ev); @@ -220,7 +220,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet WidgetsFullSheet sheet = (WidgetsFullSheet) launcher.getLayoutInflater() .inflate(R.layout.widgets_full_sheet, launcher.getDragLayer(), false); sheet.mIsOpen = true; - launcher.getDragLayer().addView(sheet); + sheet.getPopupContainer().addView(sheet); sheet.open(animate); return sheet; } -- GitLab From 7acde489553d3edb213908dcce93e465a07e9032 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Thu, 31 May 2018 14:33:09 -0700 Subject: [PATCH 0046/1301] Enabling more checks in TAPL tests. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hiding workspace from tests when in AllApps or Overview. Also, we don’t need workspace_page_container. Bug: 110103162 Test: Running TaplTests suite Change-Id: I10875a1ce5d41a015c63034160676578f52d2e98 --- res/values/config.xml | 2 -- src/com/android/launcher3/Workspace.java | 14 +++++++++++++- .../launcher3/tapl/LauncherInstrumentation.java | 2 ++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index f462b9c534..8d31bd271f 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -148,6 +148,4 @@ 6 12 - - diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index a9979a218b..5cca2fb6ff 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -54,6 +54,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Toast; import com.android.launcher3.Launcher.LauncherOverlay; @@ -549,7 +550,6 @@ public class Workspace extends PagedView // created CellLayout. CellLayout newScreen = (CellLayout) LayoutInflater.from(getContext()).inflate( R.layout.workspace_screen, this, false /* attachToRoot */); - newScreen.getShortcutsAndWidgets().setId(R.id.workspace_page_container); int paddingLeftRight = mLauncher.getDeviceProfile().cellLayoutPaddingLeftRightPx; int paddingBottom = mLauncher.getDeviceProfile().cellLayoutBottomPaddingPx; newScreen.setPadding(paddingLeftRight, 0, paddingLeftRight, paddingBottom); @@ -1495,6 +1495,18 @@ public class Workspace extends PagedView } } + @Override + public AccessibilityNodeInfo createAccessibilityNodeInfo() { + if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS) { + // TAPL tests verify that workspace is not present in Overview and AllApps states. + // TAPL can work only if UIDevice is set up as setCompressedLayoutHeirarchy(false). + // Hiding workspace from the tests when it's + // IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS. + return null; + } + return super.createAccessibilityNodeInfo(); + } + private void updateAccessibilityFlags(int accessibilityFlag, CellLayout page) { page.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); page.getShortcutsAndWidgets().setImportantForAccessibility(accessibilityFlag); diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 0be09f0d9d..bf8f64efcd 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -134,12 +134,14 @@ public final class LauncherInstrumentation { return waitForLauncherObject(WIDGETS_RES_ID); } case ALL_APPS: { + waitUntilGone(WORKSPACE_RES_ID); waitUntilGone(OVERVIEW_RES_ID); waitUntilGone(WIDGETS_RES_ID); return waitForLauncherObject(APPS_RES_ID); } case OVERVIEW: { waitForLauncherObject(APPS_RES_ID); + waitUntilGone(WORKSPACE_RES_ID); waitUntilGone(WIDGETS_RES_ID); return waitForLauncherObject(OVERVIEW_RES_ID); } -- GitLab From 88a2391f1d72e94916f5e2fc3c53c72c055df80c Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Thu, 2 Aug 2018 16:30:51 -0700 Subject: [PATCH 0047/1301] Make AsyncTask static to prevent memory leak in WorkModeSwitch class Bug: 112163931 Test: Manual testing Change-Id: I17d0cb871103693d9e901758fba2abb2b73874fb --- .../launcher3/allapps/WorkModeSwitch.java | 66 +++++++++++++------ 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/src/com/android/launcher3/allapps/WorkModeSwitch.java b/src/com/android/launcher3/allapps/WorkModeSwitch.java index e7cf092093..d766398ff7 100644 --- a/src/com/android/launcher3/allapps/WorkModeSwitch.java +++ b/src/com/android/launcher3/allapps/WorkModeSwitch.java @@ -24,6 +24,7 @@ import android.widget.Switch; import com.android.launcher3.compat.UserManagerCompat; +import java.lang.ref.WeakReference; import java.util.List; public class WorkModeSwitch extends Switch { @@ -61,34 +62,57 @@ public class WorkModeSwitch extends Switch { } private void trySetQuietModeEnabledToAllProfilesAsync(boolean enabled) { - new AsyncTask() { + new SetQuietModeEnabledAsyncTask(enabled, new WeakReference<>(this)).execute(); + } + + private static final class SetQuietModeEnabledAsyncTask + extends AsyncTask { + + private final boolean enabled; + private final WeakReference switchWeakReference; - @Override - protected void onPreExecute() { - super.onPreExecute(); - setEnabled(false); + SetQuietModeEnabledAsyncTask(boolean enabled, + WeakReference switchWeakReference) { + this.enabled = enabled; + this.switchWeakReference = switchWeakReference; + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + WorkModeSwitch workModeSwitch = switchWeakReference.get(); + if (workModeSwitch != null) { + workModeSwitch.setEnabled(false); } + } - @Override - protected Boolean doInBackground(Void... voids) { - UserManagerCompat userManager = UserManagerCompat.getInstance(getContext()); - List userProfiles = userManager.getUserProfiles(); - boolean showConfirm = false; - for (UserHandle userProfile : userProfiles) { - if (Process.myUserHandle().equals(userProfile)) { - continue; - } - showConfirm |= !userManager.requestQuietModeEnabled(enabled, userProfile); + @Override + protected Boolean doInBackground(Void... voids) { + WorkModeSwitch workModeSwitch = switchWeakReference.get(); + if (workModeSwitch == null) { + return false; + } + UserManagerCompat userManager = + UserManagerCompat.getInstance(workModeSwitch.getContext()); + List userProfiles = userManager.getUserProfiles(); + boolean showConfirm = false; + for (UserHandle userProfile : userProfiles) { + if (Process.myUserHandle().equals(userProfile)) { + continue; } - return showConfirm; + showConfirm |= !userManager.requestQuietModeEnabled(enabled, userProfile); } + return showConfirm; + } - @Override - protected void onPostExecute(Boolean showConfirm) { - if (showConfirm) { - setEnabled(true); + @Override + protected void onPostExecute(Boolean showConfirm) { + if (showConfirm) { + WorkModeSwitch workModeSwitch = switchWeakReference.get(); + if (workModeSwitch != null) { + workModeSwitch.setEnabled(true); } } - }.execute(); + } } } -- GitLab From 02c33da4d2e255df7908ce7c2225f2c1cf55746f Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Tue, 31 Jul 2018 12:44:09 -0700 Subject: [PATCH 0048/1301] Enable code shrinking (dead code removal) on Launcher3QuickStepGo app Bug: 112042795 Test: Manual testing I found following effect of shrinking on the apk: Launcher3QuickStepGo.apk 4925099 bytes Launcher3QuickStepGo_Proguard.apk 2619051 bytes We get total saving of 2306048 bytes in apk size. Change-Id: I75abedc05e5d04967928e73f02bcc78608f52ac0 --- Android.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Android.mk b/Android.mk index 3945746556..3bda3095b3 100644 --- a/Android.mk +++ b/Android.mk @@ -193,7 +193,7 @@ LOCAL_RESOURCE_DIR := \ $(LOCAL_PATH)/quickstep/res \ $(LOCAL_PATH)/go/res -LOCAL_PROGUARD_ENABLED := disabled +LOCAL_PROGUARD_ENABLED := full LOCAL_SDK_VERSION := system_current LOCAL_MIN_SDK_VERSION := 26 -- GitLab From 7d0cf2a748076cedd64f65592c29bfd6ebe5cce3 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Fri, 3 Aug 2018 10:23:58 -0700 Subject: [PATCH 0049/1301] Increasing wait time. Extremely rarely starting an app takes more than 10 sec. Bug: 110103162 Test: TaplTests suite Change-Id: Ic6127e373b76c610eea5126e53e6048ba0f9bd3e --- .../com/android/launcher3/tapl/LauncherInstrumentation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index bf8f64efcd..19fa391df3 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -77,7 +77,7 @@ public final class LauncherInstrumentation { private static final String OVERVIEW_RES_ID = "overview_panel"; private static final String WIDGETS_RES_ID = "widgets_list_view"; static final String LAUNCHER_PKG = "com.google.android.apps.nexuslauncher"; - static final int WAIT_TIME_MS = 10000; + static final int WAIT_TIME_MS = 60000; private static final String SWIPE_UP_SETTING_AVAILABLE_RES_NAME = "config_swipe_up_gesture_setting_available"; private static final String SWIPE_UP_ENABLED_DEFAULT_RES_NAME = -- GitLab From dedecd8cf370f314bad6e25dcf5b6879b25b7bc3 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 6 Aug 2018 14:32:26 -0700 Subject: [PATCH 0050/1301] Specify proguard.flags file explicitly in the Launcher3QuickStepGo make rule This change makes sure that following build command doesn't error out: tapas Launcher3QuickStepGo make -j45 Bug: 112274857 Test: Built source with tapas Launcher3QuickStepGo and it built successfully. Change-Id: Icd788e4e119efd386bec6646627c2d9dd485af60 --- Android.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/Android.mk b/Android.mk index 3bda3095b3..2a32857488 100644 --- a/Android.mk +++ b/Android.mk @@ -193,6 +193,7 @@ LOCAL_RESOURCE_DIR := \ $(LOCAL_PATH)/quickstep/res \ $(LOCAL_PATH)/go/res +LOCAL_PROGUARD_FLAG_FILES := proguard.flags LOCAL_PROGUARD_ENABLED := full LOCAL_SDK_VERSION := system_current -- GitLab From 719fcb1561cf3d64320168d0edb3f0f19860412b Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 6 Aug 2018 17:00:44 -0700 Subject: [PATCH 0051/1301] Using proper checks for hardware bitmap usage Change-Id: Ic8efef8ac54ee4c7887860c404060da3c00f4024 --- src/com/android/launcher3/graphics/ShadowDrawable.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/android/launcher3/graphics/ShadowDrawable.java b/src/com/android/launcher3/graphics/ShadowDrawable.java index b40bf78280..19e2768ccb 100644 --- a/src/com/android/launcher3/graphics/ShadowDrawable.java +++ b/src/com/android/launcher3/graphics/ShadowDrawable.java @@ -32,7 +32,6 @@ import android.os.Build; import android.util.AttributeSet; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -146,7 +145,7 @@ public class ShadowDrawable extends Drawable { d.draw(canvas); } - if (Utilities.ATLEAST_OREO) { + if (BitmapRenderer.USE_HARDWARE_BITMAP) { bitmap = bitmap.copy(Bitmap.Config.HARDWARE, false); } mState.mLastDrawnBitmap = bitmap; -- GitLab From 7244d459984b0ffc91f6a5e9576d83f7633ca4b8 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 7 Aug 2018 09:26:11 -0700 Subject: [PATCH 0052/1301] Unifying multiple definitions of MainThreadInitializedObject Change-Id: I0e5addfe0353f971c76ffba8a0e2fbbce0f7e58e --- .../uioverrides/BackButtonAlphaHandler.java | 2 +- .../LandscapeEdgeSwipeController.java | 2 +- .../launcher3/uioverrides/OverviewState.java | 2 +- .../PortraitStatesTouchController.java | 2 +- .../uioverrides/TaskViewTouchController.java | 2 +- .../launcher3/uioverrides/UiFactory.java | 14 +++++------ .../quickstep/OverviewCommandHelper.java | 2 +- .../quickstep/OverviewInteractionState.java | 24 +++---------------- .../com/android/quickstep/RecentsModel.java | 22 +++-------------- .../android/quickstep/TaskSystemShortcut.java | 4 ++-- .../quickstep/TouchInteractionService.java | 4 ++-- .../WindowTransformSwipeHandler.java | 8 +++---- .../quickstep/util/ClipAnimationHelper.java | 4 +--- .../quickstep/views/LauncherRecentsView.java | 2 +- .../android/quickstep/views/RecentsView.java | 2 +- 15 files changed, 30 insertions(+), 66 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/BackButtonAlphaHandler.java b/quickstep/src/com/android/launcher3/uioverrides/BackButtonAlphaHandler.java index 722f51ba76..693ae60f22 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/BackButtonAlphaHandler.java +++ b/quickstep/src/com/android/launcher3/uioverrides/BackButtonAlphaHandler.java @@ -35,7 +35,7 @@ public class BackButtonAlphaHandler implements LauncherStateManager.StateHandler public BackButtonAlphaHandler(Launcher launcher) { mLauncher = launcher; - mOverviewInteractionState = OverviewInteractionState.getInstance(mLauncher); + mOverviewInteractionState = OverviewInteractionState.INSTANCE.get(mLauncher); } @Override diff --git a/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java b/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java index 6d1061990b..fd4bf9b8fc 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java @@ -73,7 +73,7 @@ public class LandscapeEdgeSwipeController extends AbstractStateChangeTouchContro protected void onSwipeInteractionCompleted(LauncherState targetState, int logAction) { super.onSwipeInteractionCompleted(targetState, logAction); if (mStartState == NORMAL && targetState == OVERVIEW) { - RecentsModel.getInstance(mLauncher).onOverviewShown(true, TAG); + RecentsModel.INSTANCE.get(mLauncher).onOverviewShown(true, TAG); } } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java index 7f956f8a29..543336e970 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java @@ -77,7 +77,7 @@ public class OverviewState extends LauncherState { public void onStateDisabled(Launcher launcher) { RecentsView rv = launcher.getOverviewPanel(); rv.setOverviewStateEnabled(false); - RecentsModel.getInstance(launcher).resetAssistCache(); + RecentsModel.INSTANCE.get(launcher).resetAssistCache(); } @Override diff --git a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java index 1d1b7dac96..a1ae99eae9 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java @@ -256,7 +256,7 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr protected void onSwipeInteractionCompleted(LauncherState targetState, int logAction) { super.onSwipeInteractionCompleted(targetState, logAction); if (mStartState == NORMAL && targetState == OVERVIEW) { - RecentsModel.getInstance(mLauncher).onOverviewShown(true, TAG); + RecentsModel.INSTANCE.get(mLauncher).onOverviewShown(true, TAG); } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java index 9a920c843e..88f2315757 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java @@ -121,7 +121,7 @@ public abstract class TaskViewTouchController if (mRecentsView.isTaskViewVisible(view) && mActivity.getDragLayer() .isEventOverView(view, ev)) { mTaskBeingDragged = view; - if (!OverviewInteractionState.getInstance(mActivity) + if (!OverviewInteractionState.INSTANCE.get(mActivity) .isSwipeUpGestureEnabled()) { // Don't allow swipe down to open if we don't support swipe up // to enter overview. diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index 2d0946b890..b42e118a90 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -57,7 +57,7 @@ import java.util.zip.Deflater; public class UiFactory { public static TouchController[] createTouchControllers(Launcher launcher) { - boolean swipeUpEnabled = OverviewInteractionState.getInstance(launcher) + boolean swipeUpEnabled = OverviewInteractionState.INSTANCE.get(launcher) .isSwipeUpGestureEnabled(); if (!swipeUpEnabled) { return new TouchController[] { @@ -80,7 +80,7 @@ public class UiFactory { } public static void setOnTouchControllersChangedListener(Context context, Runnable listener) { - OverviewInteractionState.getInstance(context).setOnSwipeUpSettingChangedListener(listener); + OverviewInteractionState.INSTANCE.get(context).setOnSwipeUpSettingChangedListener(listener); } public static StateHandler[] getStateHandler(Launcher launcher) { @@ -100,7 +100,7 @@ public class UiFactory { shouldBackButtonBeHidden = AbstractFloatingView.getTopOpenViewWithType(launcher, TYPE_ALL & ~TYPE_HIDE_BACK_BUTTON) == null; } - OverviewInteractionState.getInstance(launcher) + OverviewInteractionState.INSTANCE.get(launcher) .setBackButtonAlpha(shouldBackButtonBeHidden ? 0 : 1, true /* animate */); } @@ -122,7 +122,7 @@ public class UiFactory { @Override public void onStateTransitionComplete(LauncherState finalState) { - boolean swipeUpEnabled = OverviewInteractionState.getInstance(launcher) + boolean swipeUpEnabled = OverviewInteractionState.INSTANCE.get(launcher) .isSwipeUpGestureEnabled(); LauncherState prevState = launcher.getStateManager().getLastState(); @@ -159,7 +159,7 @@ public class UiFactory { } public static void onStart(Context context) { - RecentsModel model = RecentsModel.getInstance(context); + RecentsModel model = RecentsModel.INSTANCE.get(context); if (model != null) { model.onStart(); } @@ -169,7 +169,7 @@ public class UiFactory { // After the transition to home, enable the high-res thumbnail loader if it wasn't enabled // as a part of quickstep/scrub, so that high-res thumbnails can load the next time we // enter overview - RecentsModel.getInstance(context).getRecentsTaskLoader() + RecentsModel.INSTANCE.get(context).getRecentsTaskLoader() .getHighResThumbnailLoader().setVisible(true); } @@ -187,7 +187,7 @@ public class UiFactory { } public static void onTrimMemory(Context context, int level) { - RecentsModel model = RecentsModel.getInstance(context); + RecentsModel model = RecentsModel.INSTANCE.get(context); if (model != null) { model.onTrimMemory(level); } diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index 7c6eb32591..3d54b82d18 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -111,7 +111,7 @@ public class OverviewCommandHelper { mContext = context; mAM = ActivityManagerWrapper.getInstance(); mMainThreadExecutor = new MainThreadExecutor(); - mRecentsModel = RecentsModel.getInstance(mContext); + mRecentsModel = RecentsModel.INSTANCE.get(mContext); Intent myHomeIntent = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME) diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index 922a7ff295..ed4e2cc859 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -25,21 +25,18 @@ import android.content.Context; import android.content.res.Resources; import android.database.ContentObserver; import android.os.Handler; -import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.provider.Settings; import android.support.annotation.WorkerThread; import android.util.Log; -import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.Utilities; import com.android.launcher3.allapps.DiscoveryBounce; +import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.UiThreadHelper; import com.android.systemui.shared.recents.ISystemUiProxy; -import java.util.concurrent.ExecutionException; - /** * Sets overview interaction flags, such as: * @@ -60,23 +57,8 @@ public class OverviewInteractionState { "config_swipe_up_gesture_default"; // We do not need any synchronization for this variable as its only written on UI thread. - private static OverviewInteractionState INSTANCE; - - public static OverviewInteractionState getInstance(final Context context) { - if (INSTANCE == null) { - if (Looper.myLooper() == Looper.getMainLooper()) { - INSTANCE = new OverviewInteractionState(context.getApplicationContext()); - } else { - try { - return new MainThreadExecutor().submit( - () -> OverviewInteractionState.getInstance(context)).get(); - } catch (InterruptedException|ExecutionException e) { - throw new RuntimeException(e); - } - } - } - return INSTANCE; - } + public static final MainThreadInitializedObject INSTANCE = + new MainThreadInitializedObject<>((c) -> new OverviewInteractionState(c)); private static final int MSG_SET_PROXY = 200; private static final int MSG_SET_BACK_BUTTON_ALPHA = 201; diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index 0b97f0119f..fa4e016db4 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -27,7 +27,6 @@ import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; -import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; import android.support.annotation.WorkerThread; @@ -38,6 +37,7 @@ import android.view.accessibility.AccessibilityManager; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.R; +import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.Preconditions; import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.recents.model.IconLoader; @@ -50,7 +50,6 @@ import com.android.systemui.shared.system.BackgroundExecutor; import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; -import java.util.concurrent.ExecutionException; import java.util.function.Consumer; /** @@ -59,23 +58,8 @@ import java.util.function.Consumer; @TargetApi(Build.VERSION_CODES.O) public class RecentsModel extends TaskStackChangeListener { // We do not need any synchronization for this variable as its only written on UI thread. - private static RecentsModel INSTANCE; - - public static RecentsModel getInstance(final Context context) { - if (INSTANCE == null) { - if (Looper.myLooper() == Looper.getMainLooper()) { - INSTANCE = new RecentsModel(context.getApplicationContext()); - } else { - try { - return new MainThreadExecutor().submit( - () -> RecentsModel.getInstance(context)).get(); - } catch (InterruptedException|ExecutionException e) { - throw new RuntimeException(e); - } - } - } - return INSTANCE; - } + public static final MainThreadInitializedObject INSTANCE = + new MainThreadInitializedObject<>(c -> new RecentsModel(c)); private final SparseArray mCachedAssistData = new SparseArray<>(1); private final ArrayList mAssistDataListeners = new ArrayList<>(); diff --git a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java index 24e199b977..e64d04afd8 100644 --- a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java +++ b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java @@ -160,7 +160,7 @@ public class TaskSystemShortcut extends SystemShortcut boolean dockTopOrLeft = navBarPosition != WindowManagerWrapper.NAV_BAR_POS_LEFT; if (ActivityManagerWrapper.getInstance().startActivityFromRecents(taskId, ActivityOptionsCompat.makeSplitScreenOptions(dockTopOrLeft))) { - ISystemUiProxy sysUiProxy = RecentsModel.getInstance(activity).getSystemUiProxy(); + ISystemUiProxy sysUiProxy = RecentsModel.INSTANCE.get(activity).getSystemUiProxy(); try { sysUiProxy.onSplitScreenInvoked(); } catch (RemoteException e) { @@ -225,7 +225,7 @@ public class TaskSystemShortcut extends SystemShortcut @Override public View.OnClickListener getOnClickListener( BaseDraggingActivity activity, TaskView taskView) { - ISystemUiProxy sysUiProxy = RecentsModel.getInstance(activity).getSystemUiProxy(); + ISystemUiProxy sysUiProxy = RecentsModel.INSTANCE.get(activity).getSystemUiProxy(); if (sysUiProxy == null) { return null; } diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 5a1f523391..9fe6f8b4b8 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -179,13 +179,13 @@ public class TouchInteractionService extends Service { public void onCreate() { super.onCreate(); mAM = ActivityManagerWrapper.getInstance(); - mRecentsModel = RecentsModel.getInstance(this); + mRecentsModel = RecentsModel.INSTANCE.get(this); mRecentsModel.setPreloadTasksInBackground(true); mMainThreadExecutor = new MainThreadExecutor(); mOverviewCommandHelper = new OverviewCommandHelper(this); mMainThreadChoreographer = Choreographer.getInstance(); mEventQueue = new MotionEventQueue(mMainThreadChoreographer, TouchConsumer.NO_OP); - mOverviewInteractionState = OverviewInteractionState.getInstance(this); + mOverviewInteractionState = OverviewInteractionState.INSTANCE.get(this); mOverviewCallbacks = OverviewCallbacks.get(this); mTaskOverlayFactory = TaskOverlayFactory.get(this); diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 95dcf48e48..a04fe61646 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -490,7 +490,7 @@ public class WindowTransformSwipeHandler { // This method is only called when STATE_GESTURE_STARTED_QUICKSTEP/ // STATE_GESTURE_STARTED_QUICKSCRUB is set, so we can enable the high-res thumbnail loader // here once we are sure that we will end up in an overview state - RecentsModel.getInstance(mContext).getRecentsTaskLoader() + RecentsModel.INSTANCE.get(mContext).getRecentsTaskLoader() .getHighResThumbnailLoader().setVisible(true); } @@ -949,7 +949,7 @@ public class WindowTransformSwipeHandler { mRecentsView.animateUpRunningTaskIconScale(); mRecentsView.setSwipeDownShouldLaunchApp(true); - RecentsModel.getInstance(mContext).onOverviewShown(false, TAG); + RecentsModel.INSTANCE.get(mContext).onOverviewShown(false, TAG); doLogGesture(true /* toLauncher */); reset(); @@ -979,7 +979,7 @@ public class WindowTransformSwipeHandler { mQuickScrubController.onFinishedTransitionToQuickScrub(); mRecentsView.animateUpRunningTaskIconScale(); - RecentsModel.getInstance(mContext).onOverviewShown(false, TAG); + RecentsModel.INSTANCE.get(mContext).onOverviewShown(false, TAG); } public void onQuickScrubProgress(float progress) { @@ -1113,7 +1113,7 @@ public class WindowTransformSwipeHandler { } private void preloadAssistData() { - RecentsModel.getInstance(mContext).preloadAssistData(mRunningTaskId, mAssistData); + RecentsModel.INSTANCE.get(mContext).preloadAssistData(mRunningTaskId, mAssistData); } public static float getHiddenTargetAlpha(RemoteAnimationTargetCompat app, Float expectedAlpha) { diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index df70a8a394..0597a2ebdf 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -30,7 +30,6 @@ import android.graphics.RectF; import android.os.Build; import android.os.RemoteException; import android.support.annotation.Nullable; -import android.view.Surface; import android.view.animation.Interpolator; import com.android.launcher3.BaseDraggingActivity; @@ -50,7 +49,6 @@ import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier.Surfac import com.android.systemui.shared.system.TransactionCompat; import com.android.systemui.shared.system.WindowManagerWrapper; -import java.util.function.BiConsumer; import java.util.function.BiFunction; /** @@ -260,7 +258,7 @@ public class ClipAnimationHelper { } private void updateStackBoundsToMultiWindowTaskSize(BaseDraggingActivity activity) { - ISystemUiProxy sysUiProxy = RecentsModel.getInstance(activity).getSystemUiProxy(); + ISystemUiProxy sysUiProxy = RecentsModel.INSTANCE.get(activity).getSystemUiProxy(); if (sysUiProxy != null) { try { mSourceStackBounds.set(sysUiProxy.getNonMinimizedSplitScreenSecondaryBounds()); diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 7c5828b440..697bb4f1ca 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -124,7 +124,7 @@ public class LauncherRecentsView extends RecentsView { ClipAnimationHelper helper) { AnimatorSet anim = super.createAdjacentPageAnimForTaskLaunch(tv, helper); - if (!OverviewInteractionState.getInstance(mActivity).isSwipeUpGestureEnabled()) { + if (!OverviewInteractionState.INSTANCE.get(mActivity).isSwipeUpGestureEnabled()) { // Hotseat doesn't move when opening recents with the button, // so don't animate it here either. return anim; diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 72ab26156a..fc0975a709 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -277,7 +277,7 @@ public abstract class RecentsView extends PagedView impl .getDimensionPixelSize(R.dimen.recents_fast_fling_velocity); mActivity = (T) BaseActivity.fromContext(context); mQuickScrubController = new QuickScrubController(mActivity, this); - mModel = RecentsModel.getInstance(context); + mModel = RecentsModel.INSTANCE.get(context); mClearAllButton = (ClearAllButton) LayoutInflater.from(context) .inflate(R.layout.overview_clear_all_button, this, false); -- GitLab From 147320e64e8c29ec1513e4d41c4ee87d75f5ea68 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Tue, 7 Aug 2018 15:20:23 -0700 Subject: [PATCH 0053/1301] Use equals for string comparison in ItemClickHandler. Bug: 112325801 Test: Manual test Change-Id: I1b57dadac392d5c7f5a7fb367ddbaf79beb7faed --- src/com/android/launcher3/touch/ItemClickHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java index 97f836f4dd..52fef9f7df 100644 --- a/src/com/android/launcher3/touch/ItemClickHandler.java +++ b/src/com/android/launcher3/touch/ItemClickHandler.java @@ -218,7 +218,7 @@ public class ItemClickHandler { if (item instanceof ShortcutInfo) { ShortcutInfo si = (ShortcutInfo) item; if (si.hasStatusFlag(ShortcutInfo.FLAG_SUPPORTS_WEB_UI) - && intent.getAction() == Intent.ACTION_VIEW) { + && Intent.ACTION_VIEW.equals(intent.getAction())) { // make a copy of the intent that has the package set to null // we do this because the platform sometimes disables instant // apps temporarily (triggered by the user) and fallbacks to the -- GitLab From b02bcd4c76e4a11e99851e9d98a1d5a04021700b Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Tue, 7 Aug 2018 13:16:40 -0700 Subject: [PATCH 0054/1301] Removing code duplication for getting swipe-up setting This is between Tapl and Launcher Bug: 110103162 Test: TaplTests suite Change-Id: I5b458438834204ca257f45c707577b4d2793fb4e --- .../quickstep/OverviewInteractionState.java | 23 ++------- .../com/android/quickstep/SwipeUpSetting.java | 50 +++++++++++++++++++ tests/Android.mk | 3 +- .../tapl/LauncherInstrumentation.java | 18 ++----- 4 files changed, 59 insertions(+), 35 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/SwipeUpSetting.java diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index 922a7ff295..aa318be8df 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -22,7 +22,6 @@ import static com.android.systemui.shared.system.SettingsCompat.SWIPE_UP_SETTING import android.content.ContentResolver; import android.content.Context; -import android.content.res.Resources; import android.database.ContentObserver; import android.os.Handler; import android.os.Looper; @@ -54,10 +53,6 @@ public class OverviewInteractionState { private static final String TAG = "OverviewFlags"; private static final String HAS_ENABLED_QUICKSTEP_ONCE = "launcher.has_enabled_quickstep_once"; - private static final String SWIPE_UP_SETTING_AVAILABLE_RES_NAME = - "config_swipe_up_gesture_setting_available"; - private static final String SWIPE_UP_ENABLED_DEFAULT_RES_NAME = - "config_swipe_up_gesture_default"; // We do not need any synchronization for this variable as its only written on UI thread. private static OverviewInteractionState INSTANCE; @@ -104,13 +99,13 @@ public class OverviewInteractionState { mUiHandler = new Handler(this::handleUiMessage); mBgHandler = new Handler(UiThreadHelper.getBackgroundLooper(), this::handleBgMessage); - if (getSystemBooleanRes(SWIPE_UP_SETTING_AVAILABLE_RES_NAME)) { + if (SwipeUpSetting.isSwipeUpSettingAvailable()) { mSwipeUpSettingObserver = new SwipeUpGestureEnabledSettingObserver(mUiHandler, context.getContentResolver()); mSwipeUpSettingObserver.register(); } else { mSwipeUpSettingObserver = null; - mSwipeUpEnabled = getSystemBooleanRes(SWIPE_UP_ENABLED_DEFAULT_RES_NAME); + mSwipeUpEnabled = SwipeUpSetting.isSwipeUpEnabledDefaultValue(); } } @@ -206,7 +201,7 @@ public class OverviewInteractionState { super(handler); mHandler = handler; mResolver = resolver; - defaultValue = getSystemBooleanRes(SWIPE_UP_ENABLED_DEFAULT_RES_NAME) ? 1 : 0; + defaultValue = SwipeUpSetting.isSwipeUpEnabledDefaultValue() ? 1 : 0; } public void register() { @@ -228,18 +223,6 @@ public class OverviewInteractionState { } } - private boolean getSystemBooleanRes(String resName) { - Resources res = Resources.getSystem(); - int resId = res.getIdentifier(resName, "bool", "android"); - - if (resId != 0) { - return res.getBoolean(resId); - } else { - Log.e(TAG, "Failed to get system resource ID. Incompatible framework version?"); - return false; - } - } - private void resetHomeBounceSeenOnQuickstepEnabledFirstTime() { if (mSwipeUpEnabled && !Utilities.getPrefs(mContext).getBoolean( HAS_ENABLED_QUICKSTEP_ONCE, true)) { diff --git a/quickstep/src/com/android/quickstep/SwipeUpSetting.java b/quickstep/src/com/android/quickstep/SwipeUpSetting.java new file mode 100644 index 0000000000..0f91f97755 --- /dev/null +++ b/quickstep/src/com/android/quickstep/SwipeUpSetting.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.quickstep; + +import android.content.res.Resources; +import android.util.Log; + +public final class SwipeUpSetting { + private static final String TAG = "SwipeUpSetting"; + + private static final String SWIPE_UP_SETTING_AVAILABLE_RES_NAME = + "config_swipe_up_gesture_setting_available"; + + private static final String SWIPE_UP_ENABLED_DEFAULT_RES_NAME = + "config_swipe_up_gesture_default"; + + private static boolean getSystemBooleanRes(String resName) { + Resources res = Resources.getSystem(); + int resId = res.getIdentifier(resName, "bool", "android"); + + if (resId != 0) { + return res.getBoolean(resId); + } else { + Log.e(TAG, "Failed to get system resource ID. Incompatible framework version?"); + return false; + } + } + + public static boolean isSwipeUpSettingAvailable() { + return getSystemBooleanRes(SWIPE_UP_SETTING_AVAILABLE_RES_NAME); + } + + public static boolean isSwipeUpEnabledDefaultValue() { + return getSystemBooleanRes(SWIPE_UP_ENABLED_DEFAULT_RES_NAME); + } +} diff --git a/tests/Android.mk b/tests/Android.mk index c8e554d734..c7a222a96e 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -37,7 +37,8 @@ include $(BUILD_PACKAGE) include $(CLEAR_VARS) LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator -LOCAL_SRC_FILES := $(call all-java-files-under, tapl) +LOCAL_SRC_FILES := $(call all-java-files-under, tapl) \ + ../quickstep/src/com/android/quickstep/SwipeUpSetting.java LOCAL_SDK_VERSION := current LOCAL_MODULE := ub-launcher-aosp-tapl diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 19fa391df3..c3f27eeeb6 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -22,7 +22,6 @@ import static org.junit.Assert.fail; import android.app.ActivityManager; import android.app.UiAutomation; -import android.content.res.Resources; import android.os.Bundle; import android.provider.Settings; import android.support.annotation.NonNull; @@ -35,6 +34,8 @@ import android.support.test.uiautomator.UiObject2; import android.support.test.uiautomator.Until; import android.view.accessibility.AccessibilityEvent; +import com.android.quickstep.SwipeUpSetting; + import java.lang.ref.WeakReference; import java.util.concurrent.TimeoutException; @@ -78,10 +79,6 @@ public final class LauncherInstrumentation { private static final String WIDGETS_RES_ID = "widgets_list_view"; static final String LAUNCHER_PKG = "com.google.android.apps.nexuslauncher"; static final int WAIT_TIME_MS = 60000; - private static final String SWIPE_UP_SETTING_AVAILABLE_RES_NAME = - "config_swipe_up_gesture_setting_available"; - private static final String SWIPE_UP_ENABLED_DEFAULT_RES_NAME = - "config_swipe_up_gesture_default"; private static final String SYSTEMUI_PACKAGE = "com.android.systemui"; private static WeakReference sActiveContainer = new WeakReference<>(null); @@ -95,8 +92,8 @@ public final class LauncherInstrumentation { public LauncherInstrumentation(UiDevice device) { mDevice = device; final boolean swipeUpEnabledDefault = - !getSystemBooleanRes(SWIPE_UP_SETTING_AVAILABLE_RES_NAME) || - getSystemBooleanRes(SWIPE_UP_ENABLED_DEFAULT_RES_NAME); + !SwipeUpSetting.isSwipeUpSettingAvailable() || + SwipeUpSetting.isSwipeUpEnabledDefaultValue(); mSwipeUpEnabled = Settings.Secure.getInt( InstrumentationRegistry.getTargetContext().getContentResolver(), "swipe_up_to_switch_apps_enabled", @@ -104,13 +101,6 @@ public final class LauncherInstrumentation { assertTrue("Device must run in a test harness", ActivityManager.isRunningInTestHarness()); } - private boolean getSystemBooleanRes(String resName) { - final Resources res = Resources.getSystem(); - final int resId = res.getIdentifier(resName, "bool", "android"); - assertTrue("Resource not found: " + resName, resId != 0); - return res.getBoolean(resId); - } - void setActiveContainer(VisibleContainer container) { sActiveContainer = new WeakReference<>(container); } -- GitLab From 7b5834d9b1f09d42cea4d8f052e18ce87fea8187 Mon Sep 17 00:00:00 2001 From: Tobias Dubois Date: Mon, 11 Jun 2018 16:25:55 +0200 Subject: [PATCH 0055/1301] Fix overlapping FloatingViewType IntDef TYPE_DISCOVERY_BOUNCE and TYPE_QUICKSTEP_PREVIEW have the same value. Make sure each flag has a unique value. Test: manual Change-Id: I0fec3f27ffc31bad80d3af7b3baa3631b61b2567 --- src/com/android/launcher3/AbstractFloatingView.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/AbstractFloatingView.java b/src/com/android/launcher3/AbstractFloatingView.java index 3223837782..e58e73d28c 100644 --- a/src/com/android/launcher3/AbstractFloatingView.java +++ b/src/com/android/launcher3/AbstractFloatingView.java @@ -69,9 +69,9 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch public static final int TYPE_DISCOVERY_BOUNCE = 1 << 6; // Popups related to quickstep UI - public static final int TYPE_QUICKSTEP_PREVIEW = 1 << 6; - public static final int TYPE_TASK_MENU = 1 << 7; - public static final int TYPE_OPTIONS_POPUP = 1 << 8; + public static final int TYPE_QUICKSTEP_PREVIEW = 1 << 7; + public static final int TYPE_TASK_MENU = 1 << 8; + public static final int TYPE_OPTIONS_POPUP = 1 << 9; public static final int TYPE_ALL = TYPE_FOLDER | TYPE_ACTION_POPUP | TYPE_WIDGETS_BOTTOM_SHEET | TYPE_WIDGET_RESIZE_FRAME | TYPE_WIDGETS_FULL_SHEET -- GitLab From 30ac987c56b0b0b2b811895ad6fbd06d31b9d065 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 8 Aug 2018 11:46:19 -0700 Subject: [PATCH 0056/1301] Removing requirement for no enabled accessibility services Now Launcher will talk to TAPL even if there are enabled accessibility services. This should fix some lab tests that presumably run with some accessibility services enabled. Bug: 110103162 Test: will check on lab tests Change-Id: Ie11896441c2b2b7c16150cd3f2df28a5a5095d88 --- .../launcher3/compat/AccessibilityManagerCompat.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java index 32fb5332c0..3b0226e1c7 100644 --- a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java +++ b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java @@ -16,7 +16,6 @@ package com.android.launcher3.compat; -import android.accessibilityservice.AccessibilityServiceInfo; import android.content.Context; import android.os.Bundle; import android.view.View; @@ -78,14 +77,8 @@ public class AccessibilityManagerCompat { // If not running in a test harness, don't participate in test exchanges. if (!Utilities.IS_RUNNING_IN_TEST_HARNESS) return null; - // Additional safety check: when running under UI Automation, accessibility is enabled, - // but the list of accessibility services is empty. Return null if this is not the case. final AccessibilityManager accessibilityManager = getManager(context); - if (!accessibilityManager.isEnabled() || - accessibilityManager.getEnabledAccessibilityServiceList( - AccessibilityServiceInfo.FEEDBACK_ALL_MASK).size() > 0) { - return null; - } + if (!accessibilityManager.isEnabled()) return null; return accessibilityManager; } -- GitLab From aad3359e8eb3e5d28954f88bda8147bcb1d74236 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 7 Aug 2018 17:20:35 -0700 Subject: [PATCH 0057/1301] Removing unused touch handling in PagedView so that it is similar to various platform class Bug: 109828536 Change-Id: Ibaba3fb4298f2dc055d125acea5f4c47403bbef0 --- .../android/quickstep/views/RecentsView.java | 4 +- src/com/android/launcher3/Launcher.java | 3 +- src/com/android/launcher3/PagedView.java | 64 +++++-------------- src/com/android/launcher3/Workspace.java | 4 -- .../touch/WorkspaceTouchListener.java | 2 +- 5 files changed, 20 insertions(+), 57 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 9ddc6b66a3..814d02d5a1 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -415,7 +415,7 @@ public abstract class RecentsView extends PagedView impl case MotionEvent.ACTION_DOWN: // Touch down anywhere but the deadzone around the visible clear all button and // between the task views will start home on touch up - if (mTouchState == TOUCH_STATE_REST) { + if (!isHandlingTouch()) { updateDeadZoneRects(); final boolean clearAllButtonDeadZoneConsumed = mClearAllButton.getAlpha() == 1 && mClearAllButtonDeadZoneRect.contains(x, y); @@ -560,7 +560,7 @@ public abstract class RecentsView extends PagedView impl boolean scrolling = super.computeScrollHelper(); boolean isFlingingFast = false; updateCurveProperties(); - if (scrolling || (mTouchState == TOUCH_STATE_SCROLLING)) { + if (scrolling || isHandlingTouch()) { if (scrolling) { // Check if we are flinging quickly to disable high res thumbnail loading isFlingingFast = mScroller.getCurrVelocity() > mFastFlingVelocity; diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 408ee2eeb4..a545122056 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -40,7 +40,6 @@ import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; import android.content.Context; -import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentSender; @@ -1247,7 +1246,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, mAppsView.reset(isStarted() /* animate */); } - if (shouldMoveToDefaultScreen && !mWorkspace.isTouchActive()) { + if (shouldMoveToDefaultScreen && !mWorkspace.isHandlingTouch()) { mWorkspace.post(mWorkspace::moveToDefaultScreen); } } diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index db5dc6635b..c81f679d00 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -63,7 +63,6 @@ public abstract class PagedView extends ViewGrou protected static final ComputePageScrollsLogic SIMPLE_SCROLL_LOGIC = (v) -> v.getVisibility() != GONE; public static final int PAGE_SNAP_ANIMATION_DURATION = 750; - public static final int SLOW_PAGE_SNAP_ANIMATION_DURATION = 950; // OverScroll constants private final static int OVERSCROLL_PAGE_SNAP_ANIMATION_DURATION = 270; @@ -109,13 +108,7 @@ public abstract class PagedView extends ViewGrou private float mTotalMotionX; protected int[] mPageScrolls; - - protected final static int TOUCH_STATE_REST = 0; - protected final static int TOUCH_STATE_SCROLLING = 1; - protected final static int TOUCH_STATE_PREV_PAGE = 2; - protected final static int TOUCH_STATE_NEXT_PAGE = 3; - - protected int mTouchState = TOUCH_STATE_REST; + private boolean mIsBeingDragged; protected int mTouchSlop; private int mMaximumVelocity; @@ -451,7 +444,7 @@ public abstract class PagedView extends ViewGrou // We don't want to trigger a page end moving unless the page has settled // and the user has stopped scrolling - if (mTouchState == TOUCH_STATE_REST) { + if (!mIsBeingDragged) { pageEndTransition(); } @@ -812,9 +805,9 @@ public abstract class PagedView extends ViewGrou } /** Returns whether x and y originated within the buffered viewport */ - private boolean isTouchPointInViewportWithBuffer(int x, int y) { + private boolean isTouchPointInViewportWithBuffer(float x, float y) { sTmpRect.set(-getMeasuredWidth() / 2, 0, 3 * getMeasuredWidth() / 2, getMeasuredHeight()); - return sTmpRect.contains(x, y); + return sTmpRect.contains((int) x, (int) y); } @Override @@ -835,8 +828,7 @@ public abstract class PagedView extends ViewGrou * motion. */ final int action = ev.getAction(); - if ((action == MotionEvent.ACTION_MOVE) && - (mTouchState == TOUCH_STATE_SCROLLING)) { + if ((action == MotionEvent.ACTION_MOVE) && mIsBeingDragged) { return true; } @@ -877,17 +869,13 @@ public abstract class PagedView extends ViewGrou final boolean finishedScrolling = (mScroller.isFinished() || xDist < mTouchSlop / 3); if (finishedScrolling) { - mTouchState = TOUCH_STATE_REST; + mIsBeingDragged = false; if (!mScroller.isFinished() && !mFreeScroll) { setCurrentPage(getNextPage()); pageEndTransition(); } } else { - if (isTouchPointInViewportWithBuffer((int) mDownMotionX, (int) mDownMotionY)) { - mTouchState = TOUCH_STATE_SCROLLING; - } else { - mTouchState = TOUCH_STATE_REST; - } + mIsBeingDragged = isTouchPointInViewportWithBuffer(mDownMotionX, mDownMotionY); } break; @@ -908,11 +896,11 @@ public abstract class PagedView extends ViewGrou * The only time we want to intercept motion events is if we are in the * drag mode. */ - return mTouchState != TOUCH_STATE_REST; + return mIsBeingDragged; } public boolean isHandlingTouch() { - return mTouchState != TOUCH_STATE_REST; + return mIsBeingDragged; } protected void determineScrollingStart(MotionEvent ev) { @@ -931,7 +919,7 @@ public abstract class PagedView extends ViewGrou // Disallow scrolling if we started the gesture from outside the viewport final float x = ev.getX(pointerIndex); final float y = ev.getY(pointerIndex); - if (!isTouchPointInViewportWithBuffer((int) x, (int) y)) return; + if (!isTouchPointInViewportWithBuffer(x, y)) return; final int xDiff = (int) Math.abs(x - mLastMotionX); @@ -940,7 +928,7 @@ public abstract class PagedView extends ViewGrou if (xMoved) { // Scroll if the user moved far enough along the X axis - mTouchState = TOUCH_STATE_SCROLLING; + mIsBeingDragged = true; mTotalMotionX += Math.abs(mLastMotionX - x); mLastMotionX = x; mLastMotionXRemainder = 0; @@ -1077,14 +1065,14 @@ public abstract class PagedView extends ViewGrou mTotalMotionX = 0; mActivePointerId = ev.getPointerId(0); - if (mTouchState == TOUCH_STATE_SCROLLING) { + if (mIsBeingDragged) { onScrollInteractionBegin(); pageBeginTransition(); } break; case MotionEvent.ACTION_MOVE: - if (mTouchState == TOUCH_STATE_SCROLLING) { + if (mIsBeingDragged) { // Scroll to follow the motion event final int pointerIndex = ev.findPointerIndex(mActivePointerId); @@ -1111,7 +1099,7 @@ public abstract class PagedView extends ViewGrou break; case MotionEvent.ACTION_UP: - if (mTouchState == TOUCH_STATE_SCROLLING) { + if (mIsBeingDragged) { final int activePointerId = mActivePointerId; final int pointerIndex = ev.findPointerIndex(activePointerId); final float x = ev.getX(pointerIndex); @@ -1193,26 +1181,6 @@ public abstract class PagedView extends ViewGrou invalidate(); } onScrollInteractionEnd(); - } else if (mTouchState == TOUCH_STATE_PREV_PAGE) { - // at this point we have not moved beyond the touch slop - // (otherwise mTouchState would be TOUCH_STATE_SCROLLING), so - // we can just page - int nextPage = Math.max(0, mCurrentPage - 1); - if (nextPage != mCurrentPage) { - snapToPage(nextPage); - } else { - snapToDestination(); - } - } else if (mTouchState == TOUCH_STATE_NEXT_PAGE) { - // at this point we have not moved beyond the touch slop - // (otherwise mTouchState would be TOUCH_STATE_SCROLLING), so - // we can just page - int nextPage = Math.min(getChildCount() - 1, mCurrentPage + 1); - if (nextPage != mCurrentPage) { - snapToPage(nextPage); - } else { - snapToDestination(); - } } // End any intermediate reordering states @@ -1220,7 +1188,7 @@ public abstract class PagedView extends ViewGrou break; case MotionEvent.ACTION_CANCEL: - if (mTouchState == TOUCH_STATE_SCROLLING) { + if (mIsBeingDragged) { snapToDestination(); onScrollInteractionEnd(); } @@ -1242,7 +1210,7 @@ public abstract class PagedView extends ViewGrou private void resetTouchState() { releaseVelocityTracker(); - mTouchState = TOUCH_STATE_REST; + mIsBeingDragged = false; mActivePointerId = INVALID_POINTER; } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index f5968825e1..28783fa2b7 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -474,10 +474,6 @@ public class Workspace extends PagedView super.onViewAdded(child); } - public boolean isTouchActive() { - return mTouchState != TOUCH_STATE_REST; - } - /** * Initializes and binds the first page * @param qsb an existing qsb to recycle or null. diff --git a/src/com/android/launcher3/touch/WorkspaceTouchListener.java b/src/com/android/launcher3/touch/WorkspaceTouchListener.java index f59f14e587..668892791c 100644 --- a/src/com/android/launcher3/touch/WorkspaceTouchListener.java +++ b/src/com/android/launcher3/touch/WorkspaceTouchListener.java @@ -125,7 +125,7 @@ public class WorkspaceTouchListener implements OnTouchListener, Runnable { } if (action == ACTION_UP || action == ACTION_POINTER_UP) { - if (!mWorkspace.isTouchActive()) { + if (!mWorkspace.isHandlingTouch()) { final CellLayout currentPage = (CellLayout) mWorkspace.getChildAt(mWorkspace.getCurrentPage()); if (currentPage != null) { -- GitLab From af82a882d77842a028d68d486ad2d49ddd0bb98b Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Mon, 6 Aug 2018 11:41:51 -0700 Subject: [PATCH 0058/1301] Fix PIP window moving during quick scrub. Bug: 110799409 Test: Manual Change-Id: Ib7c7d87ddb5aee3149127415bfc31b9cd24dd16b --- .../com/android/launcher3/uioverrides/UiFactory.java | 12 +++++++----- .../android/quickstep/OverviewInteractionState.java | 11 +++++++++++ .../android/quickstep/TouchInteractionService.java | 12 ++++++++++-- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index b42e118a90..c9393306f4 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -175,11 +175,13 @@ public class UiFactory { public static void onLauncherStateOrResumeChanged(Launcher launcher) { LauncherState state = launcher.getStateManager().getState(); - DeviceProfile profile = launcher.getDeviceProfile(); - WindowManagerWrapper.getInstance().setShelfHeight( - (state == NORMAL || state == OVERVIEW) && launcher.isUserActive() - && !profile.isVerticalBarLayout(), - profile.hotseatBarSizePx); + if (!OverviewInteractionState.INSTANCE.get(launcher).swipeGestureInitializing()) { + DeviceProfile profile = launcher.getDeviceProfile(); + WindowManagerWrapper.getInstance().setShelfHeight( + (state == NORMAL || state == OVERVIEW) && launcher.isUserActive() + && !profile.isVerticalBarLayout(), + profile.hotseatBarSizePx); + } if (state == NORMAL) { launcher.getOverviewPanel().setSwipeDownShouldLaunchApp(false); diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index ed4e2cc859..99fffd8fff 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -70,6 +70,8 @@ public class OverviewInteractionState { private final Handler mUiHandler; private final Handler mBgHandler; + private boolean mSwipeGestureInitializing = false; + // These are updated on the background thread private ISystemUiProxy mISystemUiProxy; private boolean mSwipeUpEnabled = true; @@ -179,6 +181,15 @@ public class OverviewInteractionState { } } + @WorkerThread + public void setSwipeGestureInitializing(boolean swipeGestureInitializing) { + mSwipeGestureInitializing = swipeGestureInitializing; + } + + public boolean swipeGestureInitializing() { + return mSwipeGestureInitializing; + } + private class SwipeUpGestureEnabledSettingObserver extends ContentObserver { private Handler mHandler; private ContentResolver mResolver; diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 9fe6f8b4b8..bd79301113 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -90,7 +90,14 @@ public class TouchInteractionService extends Service { public void onMotionEvent(MotionEvent ev) { mEventQueue.queue(ev); - String name = sMotionEventNames.get(ev.getActionMasked()); + int action = ev.getActionMasked(); + if (action == ACTION_DOWN) { + mOverviewInteractionState.setSwipeGestureInitializing(true); + } else if (action == ACTION_UP || action == ACTION_CANCEL) { + mOverviewInteractionState.setSwipeGestureInitializing(false); + } + + String name = sMotionEventNames.get(action); if (name != null){ TraceHelper.partitionSection("SysUiBinder", name); } @@ -106,6 +113,7 @@ public class TouchInteractionService extends Service { @Override public void onQuickScrubStart() { mEventQueue.onQuickScrubStart(); + mOverviewInteractionState.setSwipeGestureInitializing(false); TraceHelper.partitionSection("SysUiBinder", "onQuickScrubStart"); } @@ -146,8 +154,8 @@ public class TouchInteractionService extends Service { @Override public void onQuickStep(MotionEvent motionEvent) { mEventQueue.onQuickStep(motionEvent); + mOverviewInteractionState.setSwipeGestureInitializing(false); TraceHelper.endSection("SysUiBinder", "onQuickStep"); - } @Override -- GitLab From 9756df45646246fa09cf3c82d6cd676e601927b8 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 8 Aug 2018 17:39:15 -0700 Subject: [PATCH 0059/1301] Use default animation when launching a TaskView that's off screen Now that pressing back launches the previously running task, it's possible to get TaskView#launch() when the TaskView is not on the screen (i.e. user scrolled before pressing back). In this case, we shouldn't use the launch-from-recents animation, as that animation assumes the task view is the current page or an adjacent one. Change-Id: I7bec91c9437954061affdedc8cd9e48820ce7357 --- quickstep/src/com/android/quickstep/TaskUtils.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TaskUtils.java b/quickstep/src/com/android/quickstep/TaskUtils.java index f9b5e30e10..5cae2b9199 100644 --- a/quickstep/src/com/android/quickstep/TaskUtils.java +++ b/quickstep/src/com/android/quickstep/TaskUtils.java @@ -18,8 +18,6 @@ package com.android.quickstep; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR; -import static com.android.systemui.shared.recents.utilities.Utilities.getNextFrameNumber; -import static com.android.systemui.shared.recents.utilities.Utilities.getSurface; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING; import android.animation.ValueAnimator; @@ -30,7 +28,6 @@ import android.content.pm.PackageManager; import android.graphics.RectF; import android.os.UserHandle; import android.util.Log; -import android.view.Surface; import android.view.View; import com.android.launcher3.BaseDraggingActivity; @@ -92,10 +89,11 @@ public class TaskUtils { */ public static TaskView findTaskViewToLaunch( BaseDraggingActivity activity, View v, RemoteAnimationTargetCompat[] targets) { + RecentsView recentsView = activity.getOverviewPanel(); if (v instanceof TaskView) { - return (TaskView) v; + TaskView taskView = (TaskView) v; + return recentsView.isTaskViewVisible(taskView) ? taskView : null; } - RecentsView recentsView = activity.getOverviewPanel(); // It's possible that the launched view can still be resolved to a visible task view, check // the task id of the opening task and see if we can find a match. -- GitLab From ad830cd2dcc73a1ecd092eedcfc2703197c33ecf Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 3 Aug 2018 16:31:57 -0700 Subject: [PATCH 0060/1301] Use provided home content insets - They should be correct now immediately after rotation Bug: 112205777 Change-Id: I12c5b791b7115408bb34b5d0ae1e3023ce79c1bf --- .../com/android/quickstep/WindowTransformSwipeHandler.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index a04fe61646..f8ef49b311 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -641,10 +641,8 @@ public class WindowTransformSwipeHandler { overviewStackBounds = new Rect(0, 0, dp.widthPx, dp.heightPx); } // If we are not in multi-window mode, home insets should be same as system insets. - Rect insets = new Rect(); - WindowManagerWrapper.getInstance().getStableInsets(insets); dp = dp.copy(mContext); - dp.updateInsets(insets); + dp.updateInsets(homeContentInsets); } dp.updateIsSeascape(mContext.getSystemService(WindowManager.class)); -- GitLab From 92526e27c39840ac2803c6c150338e6e0597ba81 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 9 Aug 2018 12:03:57 -0700 Subject: [PATCH 0061/1301] Importing OverScroller.java from platform Bug: 109828536 Change-Id: Idf33fcbc765a83d72503f1428af0d5414bde3ef3 --- .../android/launcher3/util/OverScroller.java | 963 ++++++++++++++++++ 1 file changed, 963 insertions(+) create mode 100644 src/com/android/launcher3/util/OverScroller.java diff --git a/src/com/android/launcher3/util/OverScroller.java b/src/com/android/launcher3/util/OverScroller.java new file mode 100644 index 0000000000..ec9abceab5 --- /dev/null +++ b/src/com/android/launcher3/util/OverScroller.java @@ -0,0 +1,963 @@ +/* + * Copyright (C) 2010 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 static com.android.launcher3.anim.Interpolators.SCROLL; + +import android.content.Context; +import android.hardware.SensorManager; +import android.util.Log; +import android.view.ViewConfiguration; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; + +/** + * This class encapsulates scrolling with the ability to overshoot the bounds + * of a scrolling operation. This class is a drop-in replacement for + * {@link android.widget.Scroller} in most cases. + */ +public class OverScroller { + private int mMode; + + private final SplineOverScroller mScrollerX; + private final SplineOverScroller mScrollerY; + + private Interpolator mInterpolator; + + private final boolean mFlywheel; + + private static final int DEFAULT_DURATION = 250; + private static final int SCROLL_MODE = 0; + private static final int FLING_MODE = 1; + + /** + * Creates an OverScroller with a viscous fluid scroll interpolator and flywheel. + * @param context + */ + public OverScroller(Context context) { + this(context, null); + } + + /** + * Creates an OverScroller with flywheel enabled. + * @param context The context of this application. + * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will + * be used. + */ + public OverScroller(Context context, Interpolator interpolator) { + this(context, interpolator, true); + } + + /** + * Creates an OverScroller. + * @param context The context of this application. + * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will + * be used. + * @param flywheel If true, successive fling motions will keep on increasing scroll speed. + * @hide + */ + public OverScroller(Context context, Interpolator interpolator, boolean flywheel) { + if (interpolator == null) { + mInterpolator = SCROLL; + } else { + mInterpolator = interpolator; + } + mFlywheel = flywheel; + mScrollerX = new SplineOverScroller(context); + mScrollerY = new SplineOverScroller(context); + } + + /** + * Creates an OverScroller with flywheel enabled. + * @param context The context of this application. + * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will + * be used. + * @param bounceCoefficientX A value between 0 and 1 that will determine the proportion of the + * velocity which is preserved in the bounce when the horizontal edge is reached. A null value + * means no bounce. This behavior is no longer supported and this coefficient has no effect. + * @param bounceCoefficientY Same as bounceCoefficientX but for the vertical direction. This + * behavior is no longer supported and this coefficient has no effect. + * @deprecated Use {@link #OverScroller(Context, Interpolator)} instead. + */ + @Deprecated + public OverScroller(Context context, Interpolator interpolator, + float bounceCoefficientX, float bounceCoefficientY) { + this(context, interpolator, true); + } + + /** + * Creates an OverScroller. + * @param context The context of this application. + * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will + * be used. + * @param bounceCoefficientX A value between 0 and 1 that will determine the proportion of the + * velocity which is preserved in the bounce when the horizontal edge is reached. A null value + * means no bounce. This behavior is no longer supported and this coefficient has no effect. + * @param bounceCoefficientY Same as bounceCoefficientX but for the vertical direction. This + * behavior is no longer supported and this coefficient has no effect. + * @param flywheel If true, successive fling motions will keep on increasing scroll speed. + * @deprecated Use {@link #OverScroller(Context, Interpolator)} instead. + */ + @Deprecated + public OverScroller(Context context, Interpolator interpolator, + float bounceCoefficientX, float bounceCoefficientY, boolean flywheel) { + this(context, interpolator, flywheel); + } + + void setInterpolator(Interpolator interpolator) { + if (interpolator == null) { + mInterpolator = SCROLL; + } else { + mInterpolator = interpolator; + } + } + + /** + * The amount of friction applied to flings. The default value + * is {@link ViewConfiguration#getScrollFriction}. + * + * @param friction A scalar dimension-less value representing the coefficient of + * friction. + */ + public final void setFriction(float friction) { + mScrollerX.setFriction(friction); + mScrollerY.setFriction(friction); + } + + /** + * + * Returns whether the scroller has finished scrolling. + * + * @return True if the scroller has finished scrolling, false otherwise. + */ + public final boolean isFinished() { + return mScrollerX.mFinished && mScrollerY.mFinished; + } + + /** + * Force the finished field to a particular value. Contrary to + * {@link #abortAnimation()}, forcing the animation to finished + * does NOT cause the scroller to move to the final x and y + * position. + * + * @param finished The new finished value. + */ + public final void forceFinished(boolean finished) { + mScrollerX.mFinished = mScrollerY.mFinished = finished; + } + + /** + * Returns the current X offset in the scroll. + * + * @return The new X offset as an absolute distance from the origin. + */ + public final int getCurrX() { + return mScrollerX.mCurrentPosition; + } + + /** + * Returns the current Y offset in the scroll. + * + * @return The new Y offset as an absolute distance from the origin. + */ + public final int getCurrY() { + return mScrollerY.mCurrentPosition; + } + + /** + * Returns the absolute value of the current velocity. + * + * @return The original velocity less the deceleration, norm of the X and Y velocity vector. + */ + public float getCurrVelocity() { + return (float) Math.hypot(mScrollerX.mCurrVelocity, mScrollerY.mCurrVelocity); + } + + /** + * Returns the start X offset in the scroll. + * + * @return The start X offset as an absolute distance from the origin. + */ + public final int getStartX() { + return mScrollerX.mStart; + } + + /** + * Returns the start Y offset in the scroll. + * + * @return The start Y offset as an absolute distance from the origin. + */ + public final int getStartY() { + return mScrollerY.mStart; + } + + /** + * Returns where the scroll will end. Valid only for "fling" scrolls. + * + * @return The final X offset as an absolute distance from the origin. + */ + public final int getFinalX() { + return mScrollerX.mFinal; + } + + /** + * Returns where the scroll will end. Valid only for "fling" scrolls. + * + * @return The final Y offset as an absolute distance from the origin. + */ + public final int getFinalY() { + return mScrollerY.mFinal; + } + + /** + * Returns how long the scroll event will take, in milliseconds. + * + * @return The duration of the scroll in milliseconds. + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScrollers don't necessarily have a fixed duration. + * This function will lie to the best of its ability. + */ + @Deprecated + public final int getDuration() { + return Math.max(mScrollerX.mDuration, mScrollerY.mDuration); + } + + /** + * Extend the scroll animation. This allows a running animation to scroll + * further and longer, when used with {@link #setFinalX(int)} or {@link #setFinalY(int)}. + * + * @param extend Additional time to scroll in milliseconds. + * @see #setFinalX(int) + * @see #setFinalY(int) + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScrollers don't necessarily have a fixed duration. + * Instead of setting a new final position and extending + * the duration of an existing scroll, use startScroll + * to begin a new animation. + */ + @Deprecated + public void extendDuration(int extend) { + mScrollerX.extendDuration(extend); + mScrollerY.extendDuration(extend); + } + + /** + * Sets the final position (X) for this scroller. + * + * @param newX The new X offset as an absolute distance from the origin. + * @see #extendDuration(int) + * @see #setFinalY(int) + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScroller's final position may change during an animation. + * Instead of setting a new final position and extending + * the duration of an existing scroll, use startScroll + * to begin a new animation. + */ + @Deprecated + public void setFinalX(int newX) { + mScrollerX.setFinalPosition(newX); + } + + /** + * Sets the final position (Y) for this scroller. + * + * @param newY The new Y offset as an absolute distance from the origin. + * @see #extendDuration(int) + * @see #setFinalX(int) + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScroller's final position may change during an animation. + * Instead of setting a new final position and extending + * the duration of an existing scroll, use startScroll + * to begin a new animation. + */ + @Deprecated + public void setFinalY(int newY) { + mScrollerY.setFinalPosition(newY); + } + + /** + * Call this when you want to know the new location. If it returns true, the + * animation is not yet finished. + */ + public boolean computeScrollOffset() { + if (isFinished()) { + return false; + } + + switch (mMode) { + case SCROLL_MODE: + long time = AnimationUtils.currentAnimationTimeMillis(); + // Any scroller can be used for time, since they were started + // together in scroll mode. We use X here. + final long elapsedTime = time - mScrollerX.mStartTime; + + final int duration = mScrollerX.mDuration; + if (elapsedTime < duration) { + final float q = mInterpolator.getInterpolation(elapsedTime / (float) duration); + mScrollerX.updateScroll(q); + mScrollerY.updateScroll(q); + } else { + abortAnimation(); + } + break; + + case FLING_MODE: + if (!mScrollerX.mFinished) { + if (!mScrollerX.update()) { + if (!mScrollerX.continueWhenFinished()) { + mScrollerX.finish(); + } + } + } + + if (!mScrollerY.mFinished) { + if (!mScrollerY.update()) { + if (!mScrollerY.continueWhenFinished()) { + mScrollerY.finish(); + } + } + } + + break; + } + + return true; + } + + /** + * Start scrolling by providing a starting point and the distance to travel. + * The scroll will use the default value of 250 milliseconds for the + * duration. + * + * @param startX Starting horizontal scroll offset in pixels. Positive + * numbers will scroll the content to the left. + * @param startY Starting vertical scroll offset in pixels. Positive numbers + * will scroll the content up. + * @param dx Horizontal distance to travel. Positive numbers will scroll the + * content to the left. + * @param dy Vertical distance to travel. Positive numbers will scroll the + * content up. + */ + public void startScroll(int startX, int startY, int dx, int dy) { + startScroll(startX, startY, dx, dy, DEFAULT_DURATION); + } + + /** + * Start scrolling by providing a starting point and the distance to travel. + * + * @param startX Starting horizontal scroll offset in pixels. Positive + * numbers will scroll the content to the left. + * @param startY Starting vertical scroll offset in pixels. Positive numbers + * will scroll the content up. + * @param dx Horizontal distance to travel. Positive numbers will scroll the + * content to the left. + * @param dy Vertical distance to travel. Positive numbers will scroll the + * content up. + * @param duration Duration of the scroll in milliseconds. + */ + public void startScroll(int startX, int startY, int dx, int dy, int duration) { + mMode = SCROLL_MODE; + mScrollerX.startScroll(startX, dx, duration); + mScrollerY.startScroll(startY, dy, duration); + } + + /** + * Call this when you want to 'spring back' into a valid coordinate range. + * + * @param startX Starting X coordinate + * @param startY Starting Y coordinate + * @param minX Minimum valid X value + * @param maxX Maximum valid X value + * @param minY Minimum valid Y value + * @param maxY Minimum valid Y value + * @return true if a springback was initiated, false if startX and startY were + * already within the valid range. + */ + public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) { + mMode = FLING_MODE; + + // Make sure both methods are called. + final boolean spingbackX = mScrollerX.springback(startX, minX, maxX); + final boolean spingbackY = mScrollerY.springback(startY, minY, maxY); + return spingbackX || spingbackY; + } + + public void fling(int startX, int startY, int velocityX, int velocityY, + int minX, int maxX, int minY, int maxY) { + fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, 0, 0); + } + + /** + * Start scrolling based on a fling gesture. The distance traveled will + * depend on the initial velocity of the fling. + * + * @param startX Starting point of the scroll (X) + * @param startY Starting point of the scroll (Y) + * @param velocityX Initial velocity of the fling (X) measured in pixels per + * second. + * @param velocityY Initial velocity of the fling (Y) measured in pixels per + * second + * @param minX Minimum X value. The scroller will not scroll past this point + * unless overX > 0. If overfling is allowed, it will use minX as + * a springback boundary. + * @param maxX Maximum X value. The scroller will not scroll past this point + * unless overX > 0. If overfling is allowed, it will use maxX as + * a springback boundary. + * @param minY Minimum Y value. The scroller will not scroll past this point + * unless overY > 0. If overfling is allowed, it will use minY as + * a springback boundary. + * @param maxY Maximum Y value. The scroller will not scroll past this point + * unless overY > 0. If overfling is allowed, it will use maxY as + * a springback boundary. + * @param overX Overfling range. If > 0, horizontal overfling in either + * direction will be possible. + * @param overY Overfling range. If > 0, vertical overfling in either + * direction will be possible. + */ + public void fling(int startX, int startY, int velocityX, int velocityY, + int minX, int maxX, int minY, int maxY, int overX, int overY) { + // Continue a scroll or fling in progress + if (mFlywheel && !isFinished()) { + float oldVelocityX = mScrollerX.mCurrVelocity; + float oldVelocityY = mScrollerY.mCurrVelocity; + if (Math.signum(velocityX) == Math.signum(oldVelocityX) && + Math.signum(velocityY) == Math.signum(oldVelocityY)) { + velocityX += oldVelocityX; + velocityY += oldVelocityY; + } + } + + mMode = FLING_MODE; + mScrollerX.fling(startX, velocityX, minX, maxX, overX); + mScrollerY.fling(startY, velocityY, minY, maxY, overY); + } + + /** + * Notify the scroller that we've reached a horizontal boundary. + * Normally the information to handle this will already be known + * when the animation is started, such as in a call to one of the + * fling functions. However there are cases where this cannot be known + * in advance. This function will transition the current motion and + * animate from startX to finalX as appropriate. + * + * @param startX Starting/current X position + * @param finalX Desired final X position + * @param overX Magnitude of overscroll allowed. This should be the maximum + * desired distance from finalX. Absolute value - must be positive. + */ + public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) { + mScrollerX.notifyEdgeReached(startX, finalX, overX); + } + + /** + * Notify the scroller that we've reached a vertical boundary. + * Normally the information to handle this will already be known + * when the animation is started, such as in a call to one of the + * fling functions. However there are cases where this cannot be known + * in advance. This function will animate a parabolic motion from + * startY to finalY. + * + * @param startY Starting/current Y position + * @param finalY Desired final Y position + * @param overY Magnitude of overscroll allowed. This should be the maximum + * desired distance from finalY. Absolute value - must be positive. + */ + public void notifyVerticalEdgeReached(int startY, int finalY, int overY) { + mScrollerY.notifyEdgeReached(startY, finalY, overY); + } + + /** + * Returns whether the current Scroller is currently returning to a valid position. + * Valid bounds were provided by the + * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method. + * + * One should check this value before calling + * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress + * to restore a valid position will then be stopped. The caller has to take into account + * the fact that the started scroll will start from an overscrolled position. + * + * @return true when the current position is overscrolled and in the process of + * interpolating back to a valid value. + */ + public boolean isOverScrolled() { + return ((!mScrollerX.mFinished && + mScrollerX.mState != SplineOverScroller.SPLINE) || + (!mScrollerY.mFinished && + mScrollerY.mState != SplineOverScroller.SPLINE)); + } + + /** + * Stops the animation. Contrary to {@link #forceFinished(boolean)}, + * aborting the animating causes the scroller to move to the final x and y + * positions. + * + * @see #forceFinished(boolean) + */ + public void abortAnimation() { + mScrollerX.finish(); + mScrollerY.finish(); + } + + /** + * Returns the time elapsed since the beginning of the scrolling. + * + * @return The elapsed time in milliseconds. + * + * @hide + */ + public int timePassed() { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final long startTime = Math.min(mScrollerX.mStartTime, mScrollerY.mStartTime); + return (int) (time - startTime); + } + + /** + * @hide + */ + public boolean isScrollingInDirection(float xvel, float yvel) { + final int dx = mScrollerX.mFinal - mScrollerX.mStart; + final int dy = mScrollerY.mFinal - mScrollerY.mStart; + return !isFinished() && Math.signum(xvel) == Math.signum(dx) && + Math.signum(yvel) == Math.signum(dy); + } + + static class SplineOverScroller { + // Initial position + private int mStart; + + // Current position + private int mCurrentPosition; + + // Final position + private int mFinal; + + // Initial velocity + private int mVelocity; + + // Current velocity + private float mCurrVelocity; + + // Constant current deceleration + private float mDeceleration; + + // Animation starting time, in system milliseconds + private long mStartTime; + + // Animation duration, in milliseconds + private int mDuration; + + // Duration to complete spline component of animation + private int mSplineDuration; + + // Distance to travel along spline animation + private int mSplineDistance; + + // Whether the animation is currently in progress + private boolean mFinished; + + // The allowed overshot distance before boundary is reached. + private int mOver; + + // Fling friction + private float mFlingFriction = ViewConfiguration.getScrollFriction(); + + // Current state of the animation. + private int mState = SPLINE; + + // Constant gravity value, used in the deceleration phase. + private static final float GRAVITY = 2000.0f; + + // A context-specific coefficient adjusted to physical values. + private float mPhysicalCoeff; + + private static float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9)); + private static final float INFLEXION = 0.35f; // Tension lines cross at (INFLEXION, 1) + private static final float START_TENSION = 0.5f; + private static final float END_TENSION = 1.0f; + private static final float P1 = START_TENSION * INFLEXION; + private static final float P2 = 1.0f - END_TENSION * (1.0f - INFLEXION); + + private static final int NB_SAMPLES = 100; + private static final float[] SPLINE_POSITION = new float[NB_SAMPLES + 1]; + private static final float[] SPLINE_TIME = new float[NB_SAMPLES + 1]; + + private static final int SPLINE = 0; + private static final int CUBIC = 1; + private static final int BALLISTIC = 2; + + static { + float x_min = 0.0f; + float y_min = 0.0f; + for (int i = 0; i < NB_SAMPLES; i++) { + final float alpha = (float) i / NB_SAMPLES; + + float x_max = 1.0f; + float x, tx, coef; + while (true) { + x = x_min + (x_max - x_min) / 2.0f; + coef = 3.0f * x * (1.0f - x); + tx = coef * ((1.0f - x) * P1 + x * P2) + x * x * x; + if (Math.abs(tx - alpha) < 1E-5) break; + if (tx > alpha) x_max = x; + else x_min = x; + } + SPLINE_POSITION[i] = coef * ((1.0f - x) * START_TENSION + x) + x * x * x; + + float y_max = 1.0f; + float y, dy; + while (true) { + y = y_min + (y_max - y_min) / 2.0f; + coef = 3.0f * y * (1.0f - y); + dy = coef * ((1.0f - y) * START_TENSION + y) + y * y * y; + if (Math.abs(dy - alpha) < 1E-5) break; + if (dy > alpha) y_max = y; + else y_min = y; + } + SPLINE_TIME[i] = coef * ((1.0f - y) * P1 + y * P2) + y * y * y; + } + SPLINE_POSITION[NB_SAMPLES] = SPLINE_TIME[NB_SAMPLES] = 1.0f; + } + + void setFriction(float friction) { + mFlingFriction = friction; + } + + SplineOverScroller(Context context) { + mFinished = true; + final float ppi = context.getResources().getDisplayMetrics().density * 160.0f; + mPhysicalCoeff = SensorManager.GRAVITY_EARTH // g (m/s^2) + * 39.37f // inch/meter + * ppi + * 0.84f; // look and feel tuning + } + + void updateScroll(float q) { + mCurrentPosition = mStart + Math.round(q * (mFinal - mStart)); + } + + /* + * Get a signed deceleration that will reduce the velocity. + */ + static private float getDeceleration(int velocity) { + return velocity > 0 ? -GRAVITY : GRAVITY; + } + + /* + * Modifies mDuration to the duration it takes to get from start to newFinal using the + * spline interpolation. The previous duration was needed to get to oldFinal. + */ + private void adjustDuration(int start, int oldFinal, int newFinal) { + final int oldDistance = oldFinal - start; + final int newDistance = newFinal - start; + final float x = Math.abs((float) newDistance / oldDistance); + final int index = (int) (NB_SAMPLES * x); + if (index < NB_SAMPLES) { + final float x_inf = (float) index / NB_SAMPLES; + final float x_sup = (float) (index + 1) / NB_SAMPLES; + final float t_inf = SPLINE_TIME[index]; + final float t_sup = SPLINE_TIME[index + 1]; + final float timeCoef = t_inf + (x - x_inf) / (x_sup - x_inf) * (t_sup - t_inf); + mDuration *= timeCoef; + } + } + + void startScroll(int start, int distance, int duration) { + mFinished = false; + + mCurrentPosition = mStart = start; + mFinal = start + distance; + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = duration; + + // Unused + mDeceleration = 0.0f; + mVelocity = 0; + } + + void finish() { + mCurrentPosition = mFinal; + // Not reset since WebView relies on this value for fast fling. + // TODO: restore when WebView uses the fast fling implemented in this class. + // mCurrVelocity = 0.0f; + mFinished = true; + } + + void setFinalPosition(int position) { + mFinal = position; + mFinished = false; + } + + void extendDuration(int extend) { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final int elapsedTime = (int) (time - mStartTime); + mDuration = elapsedTime + extend; + mFinished = false; + } + + boolean springback(int start, int min, int max) { + mFinished = true; + + mCurrentPosition = mStart = mFinal = start; + mVelocity = 0; + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = 0; + + if (start < min) { + startSpringback(start, min, 0); + } else if (start > max) { + startSpringback(start, max, 0); + } + + return !mFinished; + } + + private void startSpringback(int start, int end, int velocity) { + // mStartTime has been set + mFinished = false; + mState = CUBIC; + mCurrentPosition = mStart = start; + mFinal = end; + final int delta = start - end; + mDeceleration = getDeceleration(delta); + // TODO take velocity into account + mVelocity = -delta; // only sign is used + mOver = Math.abs(delta); + mDuration = (int) (1000.0 * Math.sqrt(-2.0 * delta / mDeceleration)); + } + + void fling(int start, int velocity, int min, int max, int over) { + mOver = over; + mFinished = false; + mCurrVelocity = mVelocity = velocity; + mDuration = mSplineDuration = 0; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mCurrentPosition = mStart = start; + + if (start > max || start < min) { + startAfterEdge(start, min, max, velocity); + return; + } + + mState = SPLINE; + double totalDistance = 0.0; + + if (velocity != 0) { + mDuration = mSplineDuration = getSplineFlingDuration(velocity); + totalDistance = getSplineFlingDistance(velocity); + } + + mSplineDistance = (int) (totalDistance * Math.signum(velocity)); + mFinal = start + mSplineDistance; + + // Clamp to a valid final position + if (mFinal < min) { + adjustDuration(mStart, mFinal, min); + mFinal = min; + } + + if (mFinal > max) { + adjustDuration(mStart, mFinal, max); + mFinal = max; + } + } + + private double getSplineDeceleration(int velocity) { + return Math.log(INFLEXION * Math.abs(velocity) / (mFlingFriction * mPhysicalCoeff)); + } + + private double getSplineFlingDistance(int velocity) { + final double l = getSplineDeceleration(velocity); + final double decelMinusOne = DECELERATION_RATE - 1.0; + return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l); + } + + /* Returns the duration, expressed in milliseconds */ + private int getSplineFlingDuration(int velocity) { + final double l = getSplineDeceleration(velocity); + final double decelMinusOne = DECELERATION_RATE - 1.0; + return (int) (1000.0 * Math.exp(l / decelMinusOne)); + } + + private void fitOnBounceCurve(int start, int end, int velocity) { + // Simulate a bounce that started from edge + final float durationToApex = - velocity / mDeceleration; + // The float cast below is necessary to avoid integer overflow. + final float velocitySquared = (float) velocity * velocity; + final float distanceToApex = velocitySquared / 2.0f / Math.abs(mDeceleration); + final float distanceToEdge = Math.abs(end - start); + final float totalDuration = (float) Math.sqrt( + 2.0 * (distanceToApex + distanceToEdge) / Math.abs(mDeceleration)); + mStartTime -= (int) (1000.0f * (totalDuration - durationToApex)); + mCurrentPosition = mStart = end; + mVelocity = (int) (- mDeceleration * totalDuration); + } + + private void startBounceAfterEdge(int start, int end, int velocity) { + mDeceleration = getDeceleration(velocity == 0 ? start - end : velocity); + fitOnBounceCurve(start, end, velocity); + onEdgeReached(); + } + + private void startAfterEdge(int start, int min, int max, int velocity) { + if (start > min && start < max) { + Log.e("OverScroller", "startAfterEdge called from a valid position"); + mFinished = true; + return; + } + final boolean positive = start > max; + final int edge = positive ? max : min; + final int overDistance = start - edge; + boolean keepIncreasing = overDistance * velocity >= 0; + if (keepIncreasing) { + // Will result in a bounce or a to_boundary depending on velocity. + startBounceAfterEdge(start, edge, velocity); + } else { + final double totalDistance = getSplineFlingDistance(velocity); + if (totalDistance > Math.abs(overDistance)) { + fling(start, velocity, positive ? min : start, positive ? start : max, mOver); + } else { + startSpringback(start, edge, velocity); + } + } + } + + void notifyEdgeReached(int start, int end, int over) { + // mState is used to detect successive notifications + if (mState == SPLINE) { + mOver = over; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + // We were in fling/scroll mode before: current velocity is such that distance to + // edge is increasing. This ensures that startAfterEdge will not start a new fling. + startAfterEdge(start, end, end, (int) mCurrVelocity); + } + } + + private void onEdgeReached() { + // mStart, mVelocity and mStartTime were adjusted to their values when edge was reached. + // The float cast below is necessary to avoid integer overflow. + final float velocitySquared = (float) mVelocity * mVelocity; + float distance = velocitySquared / (2.0f * Math.abs(mDeceleration)); + final float sign = Math.signum(mVelocity); + + if (distance > mOver) { + // Default deceleration is not sufficient to slow us down before boundary + mDeceleration = - sign * velocitySquared / (2.0f * mOver); + distance = mOver; + } + + mOver = (int) distance; + mState = BALLISTIC; + mFinal = mStart + (int) (mVelocity > 0 ? distance : -distance); + mDuration = - (int) (1000.0f * mVelocity / mDeceleration); + } + + boolean continueWhenFinished() { + switch (mState) { + case SPLINE: + // Duration from start to null velocity + if (mDuration < mSplineDuration) { + // If the animation was clamped, we reached the edge + mCurrentPosition = mStart = mFinal; + // TODO Better compute speed when edge was reached + mVelocity = (int) mCurrVelocity; + mDeceleration = getDeceleration(mVelocity); + mStartTime += mDuration; + onEdgeReached(); + } else { + // Normal stop, no need to continue + return false; + } + break; + case BALLISTIC: + mStartTime += mDuration; + startSpringback(mFinal, mStart, 0); + break; + case CUBIC: + return false; + } + + update(); + return true; + } + + /* + * Update the current position and velocity for current time. Returns + * true if update has been done and false if animation duration has been + * reached. + */ + boolean update() { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final long currentTime = time - mStartTime; + + if (currentTime == 0) { + // Skip work but report that we're still going if we have a nonzero duration. + return mDuration > 0; + } + if (currentTime > mDuration) { + return false; + } + + double distance = 0.0; + switch (mState) { + case SPLINE: { + final float t = (float) currentTime / mSplineDuration; + final int index = (int) (NB_SAMPLES * t); + float distanceCoef = 1.f; + float velocityCoef = 0.f; + if (index < NB_SAMPLES) { + final float t_inf = (float) index / NB_SAMPLES; + final float t_sup = (float) (index + 1) / NB_SAMPLES; + final float d_inf = SPLINE_POSITION[index]; + final float d_sup = SPLINE_POSITION[index + 1]; + velocityCoef = (d_sup - d_inf) / (t_sup - t_inf); + distanceCoef = d_inf + (t - t_inf) * velocityCoef; + } + + distance = distanceCoef * mSplineDistance; + mCurrVelocity = velocityCoef * mSplineDistance / mSplineDuration * 1000.0f; + break; + } + + case BALLISTIC: { + final float t = currentTime / 1000.0f; + mCurrVelocity = mVelocity + mDeceleration * t; + distance = mVelocity * t + mDeceleration * t * t / 2.0f; + break; + } + + case CUBIC: { + final float t = (float) (currentTime) / mDuration; + final float t2 = t * t; + final float sign = Math.signum(mVelocity); + distance = sign * mOver * (3.0f * t2 - 2.0f * t * t2); + mCurrVelocity = sign * mOver * 6.0f * (- t + t2); + break; + } + } + + mCurrentPosition = mStart + (int) Math.round(distance); + + return true; + } + } +} \ No newline at end of file -- GitLab From 846718a79ac2c0572965658d0dc2531d6c0602c5 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Fri, 3 Aug 2018 19:15:46 -0700 Subject: [PATCH 0062/1301] Removing magic constant 0.1f from Overview Bug: 110103162 Test: TaplTests suite Change-Id: If3af510360158a2c2b1c3d13c75321c49ece67e2 --- tests/tapl/com/android/launcher3/tapl/Overview.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tests/tapl/com/android/launcher3/tapl/Overview.java b/tests/tapl/com/android/launcher3/tapl/Overview.java index 3d504c45e5..9493990746 100644 --- a/tests/tapl/com/android/launcher3/tapl/Overview.java +++ b/tests/tapl/com/android/launcher3/tapl/Overview.java @@ -93,13 +93,10 @@ public final class Overview extends LauncherInstrumentation.VisibleContainer { public AllAppsFromOverview switchToAllApps() { verifyActiveContainer(); - // Swipe from the hotseat to near the top, e.g. 10% of the screen. - final UiObject2 predictionRow = mLauncher.waitForLauncherObject( - "prediction_row"); - final Point start = predictionRow.getVisibleCenter(); - final int endY = (int) (mLauncher.getDevice().getDisplayHeight() * 0.1f); - mLauncher.swipe( - start.x, start.y, start.x, endY); + // Swipe from navbar to the top. + final UiObject2 navBar = mLauncher.getSystemUiObject("navigation_bar_frame"); + final Point start = navBar.getVisibleCenter(); + mLauncher.swipe(start.x, start.y, start.x, 0); return new AllAppsFromOverview(mLauncher); } -- GitLab From 849c6a2b1815ffc8dfeb6c64e16e85e11a99d179 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 8 Aug 2018 16:33:46 -0700 Subject: [PATCH 0063/1301] Removing Launcher activity dependency on various animations (This cl reverts change-Id: I455edcd17bda83ab51c2c04fa40e66097a4d6975) Various animations were marked for cancellation when launcher activity is destroyed. This this does not work with multiple activities (Launcher, fallback recents, shortcut confirmation). Also since launcher activity handles configuration changes, the activity is not destroyed often. Instead associating a target with various animations which automatically cancels the animations when that target goes away. Change-Id: I64cd095a28075561a9e20c9dcdeb9f90c18e1047 --- .../android/quickstep/views/TaskMenuView.java | 3 +- .../launcher3/AppWidgetResizeFrame.java | 24 ++--- src/com/android/launcher3/CellLayout.java | 49 ++++++---- .../launcher3/FirstFrameAnimatorHelper.java | 30 ++---- .../launcher3/InterruptibleInOutAnimator.java | 25 ++++- src/com/android/launcher3/Launcher.java | 11 ++- .../android/launcher3/LauncherAnimUtils.java | 94 ------------------- .../launcher3/anim/AnimatorSetBuilder.java | 4 +- .../android/launcher3/dragndrop/DragView.java | 35 +++---- .../folder/FolderAnimationManager.java | 4 +- .../folder/FolderPreviewItemAnim.java | 81 +++++++++------- .../launcher3/folder/PreviewBackground.java | 35 ++----- .../folder/PreviewItemDrawingParams.java | 4 +- .../NotificationFooterLayout.java | 3 +- .../android/launcher3/popup/ArrowPopup.java | 4 +- 15 files changed, 149 insertions(+), 257 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java index 41626c6be0..28928a8e5a 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java +++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java @@ -34,7 +34,6 @@ import android.widget.TextView; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.FastBitmapDrawable; -import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.Interpolators; @@ -241,7 +240,7 @@ public class TaskMenuView extends AbstractFloatingView { if (mOpenCloseAnimator != null && mOpenCloseAnimator.isRunning()) { mOpenCloseAnimator.end(); } - mOpenCloseAnimator = LauncherAnimUtils.createAnimatorSet(); + mOpenCloseAnimator = new AnimatorSet(); final Animator revealAnimator = createOpenCloseOutlineProvider() .createRevealAnimator(this, closing); diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index 7648e30375..b2d5a3f4f3 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -433,22 +433,18 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O } requestLayout(); } else { - PropertyValuesHolder width = PropertyValuesHolder.ofInt("width", lp.width, newWidth); - PropertyValuesHolder height = PropertyValuesHolder.ofInt("height", lp.height, - newHeight); - PropertyValuesHolder x = PropertyValuesHolder.ofInt("x", lp.x, newX); - PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", lp.y, newY); - ObjectAnimator oa = - LauncherAnimUtils.ofPropertyValuesHolder(lp, this, width, height, x, y); - oa.addUpdateListener(new AnimatorUpdateListener() { - public void onAnimationUpdate(ValueAnimator animation) { - requestLayout(); - } - }); - AnimatorSet set = LauncherAnimUtils.createAnimatorSet(); + ObjectAnimator oa = LauncherAnimUtils.ofPropertyValuesHolder(lp, this, + PropertyValuesHolder.ofInt("width", lp.width, newWidth), + PropertyValuesHolder.ofInt("height", lp.height, newHeight), + PropertyValuesHolder.ofInt("x", lp.x, newX), + PropertyValuesHolder.ofInt("y", lp.y, newY)); + oa.addUpdateListener(a -> requestLayout()); + + AnimatorSet set = new AnimatorSet(); set.play(oa); for (int i = 0; i < HANDLE_COUNT; i++) { - set.play(LauncherAnimUtils.ofFloat(mDragHandles[i], ALPHA, 1.0f)); + set.play(LauncherAnimUtils.ofPropertyValuesHolder(mDragHandles[i], + PropertyValuesHolder.ofFloat(ALPHA, 1f))); } set.setDuration(SNAP_DURATION); diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 6c2fd8e53d..260abd1aa2 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -18,6 +18,7 @@ package com.android.launcher3; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; @@ -34,11 +35,13 @@ import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Parcelable; +import android.os.SystemClock; 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.Property; import android.util.SparseArray; import android.view.MotionEvent; import android.view.View; @@ -243,7 +246,7 @@ public class CellLayout extends ViewGroup { for (int i = 0; i < mDragOutlineAnims.length; i++) { final InterruptibleInOutAnimator anim = - new InterruptibleInOutAnimator(this, duration, fromAlphaValue, toAlphaValue); + new InterruptibleInOutAnimator(duration, fromAlphaValue, toAlphaValue); anim.getAnimator().setInterpolator(mEaseOutInterpolator); final int thisIndex = i; anim.getAnimator().addUpdateListener(new AnimatorUpdateListener() { @@ -877,7 +880,7 @@ public class CellLayout extends ViewGroup { return true; } - ValueAnimator va = LauncherAnimUtils.ofFloat(0f, 1f); + ValueAnimator va = ValueAnimator.ofFloat(0f, 1f); va.setDuration(duration); mReorderAnimators.put(lp, va); @@ -1884,6 +1887,19 @@ public class CellLayout extends ViewGroup { } } + private static final Property ANIMATION_PROGRESS = + new Property(float.class, "animationProgress") { + @Override + public Float get(ReorderPreviewAnimation anim) { + return anim.animationProgress; + } + + @Override + public void set(ReorderPreviewAnimation anim, Float progress) { + anim.setAnimationProgress(progress); + } + }; + // 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 { @@ -1904,6 +1920,7 @@ public class CellLayout extends ViewGroup { public static final int MODE_HINT = 0; public static final int MODE_PREVIEW = 1; + float animationProgress = 0; Animator a; public ReorderPreviewAnimation(View child, int mode, int cellX0, int cellY0, int cellX1, @@ -1974,7 +1991,7 @@ public class CellLayout extends ViewGroup { if (noMovement) { return; } - ValueAnimator va = LauncherAnimUtils.ofFloat(0f, 1f); + ValueAnimator va = ObjectAnimator.ofFloat(this, ANIMATION_PROGRESS, 0, 1); a = va; // Animations are disabled in power save mode, causing the repeated animation to jump @@ -1987,20 +2004,6 @@ public class CellLayout extends ViewGroup { va.setDuration(mode == MODE_HINT ? HINT_DURATION : PREVIEW_DURATION); va.setStartDelay((int) (Math.random() * 60)); - va.addUpdateListener(new AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - float r = (Float) animation.getAnimatedValue(); - float r1 = (mode == MODE_HINT && repeating) ? 1.0f : r; - float x = r1 * finalDeltaX + (1 - r1) * initDeltaX; - float y = r1 * finalDeltaY + (1 - r1) * initDeltaY; - child.setTranslationX(x); - child.setTranslationY(y); - float s = r * finalScale + (1 - r) * initScale; - child.setScaleX(s); - child.setScaleY(s); - } - }); va.addListener(new AnimatorListenerAdapter() { public void onAnimationRepeat(Animator animation) { // We make sure to end only after a full period @@ -2012,6 +2015,18 @@ public class CellLayout extends ViewGroup { va.start(); } + private void setAnimationProgress(float progress) { + animationProgress = progress; + float r1 = (mode == MODE_HINT && repeating) ? 1.0f : animationProgress; + float x = r1 * finalDeltaX + (1 - r1) * initDeltaX; + float y = r1 * finalDeltaY + (1 - r1) * initDeltaY; + child.setTranslationX(x); + child.setTranslationY(y); + float s = animationProgress * finalScale + (1 - animationProgress) * initScale; + child.setScaleX(s); + child.setScaleY(s); + } + private void cancel() { if (a != null) { a.cancel(); diff --git a/src/com/android/launcher3/FirstFrameAnimatorHelper.java b/src/com/android/launcher3/FirstFrameAnimatorHelper.java index e7ca12148d..48c1059891 100644 --- a/src/com/android/launcher3/FirstFrameAnimatorHelper.java +++ b/src/com/android/launcher3/FirstFrameAnimatorHelper.java @@ -16,24 +16,21 @@ package com.android.launcher3; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; +import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; + import android.animation.ValueAnimator; import android.util.Log; import android.view.View; -import android.view.ViewPropertyAnimator; import android.view.ViewTreeObserver; -import com.android.launcher3.util.Thunk; -import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; +import com.android.launcher3.util.Thunk; /* * This is a helper class that listens to updates from the corresponding animation. * For the first two frames, it adjusts the current play time of the animation to * prevent jank at the beginning of the animation */ -public class FirstFrameAnimatorHelper extends AnimatorListenerAdapter - implements ValueAnimator.AnimatorUpdateListener { +public class FirstFrameAnimatorHelper implements ValueAnimator.AnimatorUpdateListener { private static final String TAG = "FirstFrameAnimatorHlpr"; private static final boolean DEBUG = false; private static final int MAX_DELAY = 1000; @@ -52,18 +49,6 @@ public class FirstFrameAnimatorHelper extends AnimatorListenerAdapter animator.addUpdateListener(this); } - public FirstFrameAnimatorHelper(ViewPropertyAnimator vpa, View target) { - mTarget = target; - vpa.setListener(this); - } - - // only used for ViewPropertyAnimators - public void onAnimationStart(Animator animation) { - final ValueAnimator va = (ValueAnimator) animation; - va.addUpdateListener(FirstFrameAnimatorHelper.this); - onAnimationUpdate(va); - } - public static void setIsVisible(boolean visible) { sVisible = visible; } @@ -78,6 +63,7 @@ public class FirstFrameAnimatorHelper extends AnimatorListenerAdapter sVisible = true; } + @Override public void onAnimationUpdate(final ValueAnimator animation) { final long currentTime = System.currentTimeMillis(); if (mStartTime == -1) { @@ -115,11 +101,7 @@ public class FirstFrameAnimatorHelper extends AnimatorListenerAdapter mAdjustedSecondFrameTime = true; } else { if (frameNum > 1) { - mTarget.post(new Runnable() { - public void run() { - animation.removeUpdateListener(FirstFrameAnimatorHelper.this); - } - }); + mTarget.post(() -> animation.removeUpdateListener(this)); } if (DEBUG) print(animation); } diff --git a/src/com/android/launcher3/InterruptibleInOutAnimator.java b/src/com/android/launcher3/InterruptibleInOutAnimator.java index 8501e2429b..f4395ca63f 100644 --- a/src/com/android/launcher3/InterruptibleInOutAnimator.java +++ b/src/com/android/launcher3/InterruptibleInOutAnimator.java @@ -18,7 +18,9 @@ package com.android.launcher3; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.animation.ValueAnimator; +import android.util.Property; import android.view.View; import com.android.launcher3.util.Thunk; @@ -31,11 +33,27 @@ import com.android.launcher3.util.Thunk; * interpolator in the same direction. */ public class InterruptibleInOutAnimator { + + private static final Property VALUE = + new Property(Float.TYPE, "value") { + @Override + public Float get(InterruptibleInOutAnimator anim) { + return anim.mValue; + } + + @Override + public void set(InterruptibleInOutAnimator anim, Float value) { + anim.mValue = value; + } + }; + private long mOriginalDuration; private float mOriginalFromValue; private float mOriginalToValue; private ValueAnimator mAnimator; + private float mValue; + private boolean mFirstRun = true; private Object mTag = null; @@ -47,8 +65,8 @@ public class InterruptibleInOutAnimator { // TODO: This isn't really necessary, but is here to help diagnose a bug in the drag viz @Thunk int mDirection = STOPPED; - public InterruptibleInOutAnimator(View view, long duration, float fromValue, float toValue) { - mAnimator = LauncherAnimUtils.ofFloat(fromValue, toValue).setDuration(duration); + public InterruptibleInOutAnimator(long duration, float fromValue, float toValue) { + mAnimator = ObjectAnimator.ofFloat(this, VALUE, fromValue, toValue).setDuration(duration); mOriginalDuration = duration; mOriginalFromValue = fromValue; mOriginalToValue = toValue; @@ -64,8 +82,7 @@ public class InterruptibleInOutAnimator { private void animate(int direction) { final long currentPlayTime = mAnimator.getCurrentPlayTime(); final float toValue = (direction == IN) ? mOriginalToValue : mOriginalFromValue; - final float startValue = mFirstRun ? mOriginalFromValue : - ((Float) mAnimator.getAnimatedValue()).floatValue(); + final float startValue = mFirstRun ? mOriginalFromValue : mValue; // Make sure it's stopped before we modify any values cancel(); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index a545122056..9650e4eb7a 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -31,6 +31,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.app.ActivityOptions; @@ -1332,9 +1333,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } TextKeyListener.getInstance().release(); - - LauncherAnimUtils.onDestroyActivity(); - clearPendingBinds(); if (mLauncherCallbacks != null) { @@ -1841,7 +1839,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, @Override public void bindItems(final List items, final boolean forceAnimateIcons) { // Get the list of added items and intersect them with the set of items here - final AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); + final AnimatorSet anim = new AnimatorSet(); final Collection bounceAnims = new ArrayList<>(); final boolean animateIcons = forceAnimateIcons && canRunNewAppsAnimation(); Workspace workspace = mWorkspace; @@ -2163,7 +2161,10 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } private ValueAnimator createNewAppBounceAnimation(View v, int i) { - ValueAnimator bounceAnim = LauncherAnimUtils.ofViewAlphaAndScale(v, 1, 1, 1); + ValueAnimator bounceAnim = LauncherAnimUtils.ofPropertyValuesHolder(v, + PropertyValuesHolder.ofFloat(View.ALPHA, 1f), + PropertyValuesHolder.ofFloat(View.SCALE_X, 1f), + PropertyValuesHolder.ofFloat(View.SCALE_Y, 1f)); bounceAnim.setDuration(InstallShortcutReceiver.NEW_SHORTCUT_BOUNCE_DURATION); bounceAnim.setStartDelay(i * InstallShortcutReceiver.NEW_SHORTCUT_STAGGER_DELAY); bounceAnim.setInterpolator(new OvershootInterpolator(BOUNCE_ANIMATION_TENSION)); diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java index 03ffded720..7944ec59b8 100644 --- a/src/com/android/launcher3/LauncherAnimUtils.java +++ b/src/com/android/launcher3/LauncherAnimUtils.java @@ -16,18 +16,11 @@ package com.android.launcher3; -import android.animation.Animator; -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; - -import java.util.HashSet; -import java.util.WeakHashMap; public class LauncherAnimUtils { /** @@ -42,92 +35,6 @@ public class LauncherAnimUtils { // The progress of an animation to all apps must be at least this far along to snap to all apps. public static final float MIN_PROGRESS_TO_ALL_APPS = 0.5f; - static WeakHashMap sAnimators = new WeakHashMap(); - static Animator.AnimatorListener sEndAnimListener = new Animator.AnimatorListener() { - public void onAnimationStart(Animator animation) { - sAnimators.put(animation, null); - } - - public void onAnimationRepeat(Animator animation) { - } - - public void onAnimationEnd(Animator animation) { - sAnimators.remove(animation); - } - - public void onAnimationCancel(Animator animation) { - sAnimators.remove(animation); - } - }; - - public static void cancelOnDestroyActivity(Animator a) { - a.addListener(sEndAnimListener); - } - - // Helper method. Assumes a draw is pending, and that if the animation's duration is 0 - // it should be cancelled - public static void startAnimationAfterNextDraw(final Animator animator, final View view) { - view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() { - private boolean mStarted = false; - - public void onDraw() { - if (mStarted) return; - mStarted = true; - // Use this as a signal that the animation was cancelled - if (animator.getDuration() == 0) { - return; - } - animator.start(); - - final ViewTreeObserver.OnDrawListener listener = this; - view.post(new Runnable() { - public void run() { - view.getViewTreeObserver().removeOnDrawListener(listener); - } - }); - } - }); - } - - public static void onDestroyActivity() { - HashSet animators = new HashSet(sAnimators.keySet()); - for (Animator a : animators) { - if (a.isRunning()) { - a.cancel(); - } - sAnimators.remove(a); - } - } - - public static AnimatorSet createAnimatorSet() { - AnimatorSet anim = new AnimatorSet(); - cancelOnDestroyActivity(anim); - return anim; - } - - public static ValueAnimator ofFloat(float... values) { - ValueAnimator anim = new ValueAnimator(); - anim.setFloatValues(values); - cancelOnDestroyActivity(anim); - return anim; - } - - public static ObjectAnimator ofFloat(View target, Property property, - float... values) { - ObjectAnimator anim = ObjectAnimator.ofFloat(target, property, values); - cancelOnDestroyActivity(anim); - new FirstFrameAnimatorHelper(anim, target); - return anim; - } - - public static ObjectAnimator ofViewAlphaAndScale(View target, - float alpha, float scaleX, float scaleY) { - return ofPropertyValuesHolder(target, - PropertyValuesHolder.ofFloat(View.ALPHA, alpha), - PropertyValuesHolder.ofFloat(View.SCALE_X, scaleX), - PropertyValuesHolder.ofFloat(View.SCALE_Y, scaleY)); - } - public static ObjectAnimator ofPropertyValuesHolder(View target, PropertyValuesHolder... values) { return ofPropertyValuesHolder(target, target, values); @@ -136,7 +43,6 @@ public class LauncherAnimUtils { public static ObjectAnimator ofPropertyValuesHolder(Object target, View view, PropertyValuesHolder... values) { ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(target, values); - cancelOnDestroyActivity(anim); new FirstFrameAnimatorHelper(anim, view); return anim; } diff --git a/src/com/android/launcher3/anim/AnimatorSetBuilder.java b/src/com/android/launcher3/anim/AnimatorSetBuilder.java index 307f258564..fdac5c85fb 100644 --- a/src/com/android/launcher3/anim/AnimatorSetBuilder.java +++ b/src/com/android/launcher3/anim/AnimatorSetBuilder.java @@ -20,8 +20,6 @@ import android.animation.AnimatorSet; import android.util.SparseArray; import android.view.animation.Interpolator; -import com.android.launcher3.LauncherAnimUtils; - import java.util.ArrayList; import java.util.List; @@ -56,7 +54,7 @@ public class AnimatorSetBuilder { } public AnimatorSet build() { - AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); + AnimatorSet anim = new AnimatorSet(); anim.playTogether(mAnims); if (!mOnFinishRunnables.isEmpty()) { anim.addListener(new AnimationSuccessListener() { diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index b3d9bdd72d..998de99a5f 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -77,8 +77,6 @@ public class DragView extends View { public static final int COLOR_CHANGE_DURATION = 120; public static final int VIEW_ZOOM_DURATION = 150; - @Thunk static float sDragAlpha = 1f; - private boolean mDrawBitmap = true; private Bitmap mBitmap; private Bitmap mCrossFadeBitmap; @@ -143,22 +141,14 @@ public class DragView extends View { setScaleY(initialScale); // Animate the view into the correct position - mAnim = LauncherAnimUtils.ofFloat(0f, 1f); + mAnim = ValueAnimator.ofFloat(0f, 1f); mAnim.setDuration(VIEW_ZOOM_DURATION); - mAnim.addUpdateListener(new AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - final float value = (Float) animation.getAnimatedValue(); - - setScaleX(initialScale + (value * (scale - initialScale))); - setScaleY(initialScale + (value * (scale - initialScale))); - if (sDragAlpha != 1f) { - setAlpha(sDragAlpha * value + (1f - value)); - } - - if (getParent() == null) { - animation.cancel(); - } + mAnim.addUpdateListener(animation -> { + final float value = (Float) animation.getAnimatedValue(); + setScaleX(initialScale + (value * (scale - initialScale))); + setScaleY(initialScale + (value * (scale - initialScale))); + if (!isAttachedToWindow()) { + animation.cancel(); } }); @@ -479,15 +469,12 @@ public class DragView extends View { } public void crossFade(int duration) { - ValueAnimator va = LauncherAnimUtils.ofFloat(0f, 1f); + ValueAnimator va = ValueAnimator.ofFloat(0f, 1f); va.setDuration(duration); va.setInterpolator(Interpolators.DEACCEL_1_5); - va.addUpdateListener(new AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - mCrossFadeProgress = animation.getAnimatedFraction(); - invalidate(); - } + va.addUpdateListener(a -> { + mCrossFadeProgress = a.getAnimatedFraction(); + invalidate(); }); va.start(); } diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index 9ae3775356..0c77f9ed1e 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -27,7 +27,6 @@ import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.content.Context; import android.content.res.Resources; -import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.GradientDrawable; import android.support.v4.graphics.ColorUtils; @@ -38,7 +37,6 @@ 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; @@ -170,7 +168,7 @@ public class FolderAnimationManager { float finalRadius = Utilities.pxFromDp(2, mContext.getResources().getDisplayMetrics()); // Create the animators. - AnimatorSet a = LauncherAnimUtils.createAnimatorSet(); + AnimatorSet a = new AnimatorSet(); // Initialize the Folder items' text. PropertyResetListener colorResetListener = diff --git a/src/com/android/launcher3/folder/FolderPreviewItemAnim.java b/src/com/android/launcher3/folder/FolderPreviewItemAnim.java index be075bc9a5..1e56f7d150 100644 --- a/src/com/android/launcher3/folder/FolderPreviewItemAnim.java +++ b/src/com/android/launcher3/folder/FolderPreviewItemAnim.java @@ -17,22 +17,41 @@ package com.android.launcher3.folder; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.animation.ValueAnimator; +import android.animation.FloatArrayEvaluator; +import android.animation.ObjectAnimator; +import android.util.Property; -import com.android.launcher3.LauncherAnimUtils; +import java.util.Arrays; /** * Animates a Folder preview item. */ class FolderPreviewItemAnim { + private static final Property PARAMS = + new Property(float[].class, "params") { + @Override + public float[] get(FolderPreviewItemAnim anim) { + sTempParamsArray[0] = anim.mParams.scale; + sTempParamsArray[1] = anim.mParams.transX; + sTempParamsArray[2] = anim.mParams.transY; + return sTempParamsArray; + } + + @Override + public void set(FolderPreviewItemAnim anim, float[] value) { + anim.setParams(value); + } + }; + private static PreviewItemDrawingParams sTmpParams = new PreviewItemDrawingParams(0, 0, 0, 0); + private static final float[] sTempParamsArray = new float[3]; - private ValueAnimator mValueAnimator; + private final ObjectAnimator mAnimator; + private final PreviewItemManager mItemManager; + private final PreviewItemDrawingParams mParams; - float finalScale; - float finalTransX; - float finalTransY; + public final float[] finalState; /** * @param params layout params to animate @@ -43,33 +62,21 @@ class FolderPreviewItemAnim { * @param duration duration in ms of the animation * @param onCompleteRunnable runnable to execute upon animation completion */ - FolderPreviewItemAnim(final PreviewItemManager previewItemManager, - final PreviewItemDrawingParams params, int index0, int items0, int index1, int items1, + FolderPreviewItemAnim(PreviewItemManager itemManager, + PreviewItemDrawingParams params, int index0, int items0, int index1, int items1, int duration, final Runnable onCompleteRunnable) { - previewItemManager.computePreviewItemDrawingParams(index1, items1, sTmpParams); - - finalScale = sTmpParams.scale; - finalTransX = sTmpParams.transX; - finalTransY = sTmpParams.transY; + mItemManager = itemManager; + mParams = params; - previewItemManager.computePreviewItemDrawingParams(index0, items0, sTmpParams); + mItemManager.computePreviewItemDrawingParams(index1, items1, sTmpParams); + finalState = new float[] {sTmpParams.scale, sTmpParams.transX, sTmpParams.transY}; - final float scale0 = sTmpParams.scale; - final float transX0 = sTmpParams.transX; - final float transY0 = sTmpParams.transY; + mItemManager.computePreviewItemDrawingParams(index0, items0, sTmpParams); + float[] startState = new float[] {sTmpParams.scale, sTmpParams.transX, sTmpParams.transY}; - mValueAnimator = LauncherAnimUtils.ofFloat(0f, 1.0f); - mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){ - public void onAnimationUpdate(ValueAnimator animation) { - float progress = animation.getAnimatedFraction(); - - params.transX = transX0 + progress * (finalTransX - transX0); - params.transY = transY0 + progress * (finalTransY - transY0); - params.scale = scale0 + progress * (finalScale - scale0); - previewItemManager.onParamsChanged(); - } - }); - mValueAnimator.addListener(new AnimatorListenerAdapter() { + mAnimator = ObjectAnimator.ofObject(this, PARAMS, new FloatArrayEvaluator(), + startState, finalState); + mAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (onCompleteRunnable != null) { @@ -78,20 +85,26 @@ class FolderPreviewItemAnim { params.anim = null; } }); - mValueAnimator.setDuration(duration); + mAnimator.setDuration(duration); + } + + private void setParams(float[] values) { + mParams.scale = values[0]; + mParams.transX = values[1]; + mParams.transY = values[2]; + mItemManager.onParamsChanged(); } public void start() { - mValueAnimator.start(); + mAnimator.start(); } public void cancel() { - mValueAnimator.cancel(); + mAnimator.cancel(); } public boolean hasEqualFinalState(FolderPreviewItemAnim anim) { - return finalTransY == anim.finalTransY && finalTransX == anim.finalTransX && - finalScale == anim.finalScale; + return Arrays.equals(finalState, anim.finalState); } } diff --git a/src/com/android/launcher3/folder/PreviewBackground.java b/src/com/android/launcher3/folder/PreviewBackground.java index b162fcf32c..86266e6255 100644 --- a/src/com/android/launcher3/folder/PreviewBackground.java +++ b/src/com/android/launcher3/folder/PreviewBackground.java @@ -37,7 +37,6 @@ import android.view.View; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; import com.android.launcher3.util.Themes; @@ -368,7 +367,7 @@ public class PreviewBackground { mScaleAnimator.cancel(); } - mScaleAnimator = LauncherAnimUtils.ofFloat(0f, 1.0f); + mScaleAnimator = ValueAnimator.ofFloat(0f, 1.0f); mScaleAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override @@ -400,37 +399,19 @@ public class PreviewBackground { mScaleAnimator.start(); } - public void animateToAccept(final CellLayout cl, final int cellX, final int cellY) { - Runnable onStart = new Runnable() { - @Override - public void run() { - delegateDrawing(cl, cellX, cellY); - } - }; - animateScale(ACCEPT_SCALE_FACTOR, ACCEPT_COLOR_MULTIPLIER, onStart, null); + public void animateToAccept(CellLayout cl, int cellX, int cellY) { + animateScale(ACCEPT_SCALE_FACTOR, ACCEPT_COLOR_MULTIPLIER, + () -> delegateDrawing(cl, cellX, cellY), null); } public void animateToRest() { // This can be called multiple times -- we need to make sure the drawing delegate // is saved and restored at the beginning of the animation, since cancelling the // existing animation can clear the delgate. - final CellLayout cl = mDrawingDelegate; - final int cellX = delegateCellX; - final int cellY = delegateCellY; - - Runnable onStart = new Runnable() { - @Override - public void run() { - delegateDrawing(cl, cellX, cellY); - } - }; - Runnable onEnd = new Runnable() { - @Override - public void run() { - clearDrawingDelegate(); - } - }; - animateScale(1f, 1f, onStart, onEnd); + CellLayout cl = mDrawingDelegate; + int cellX = delegateCellX; + int cellY = delegateCellY; + animateScale(1f, 1f, () -> delegateDrawing(cl, cellX, cellY), this::clearDrawingDelegate); } public int getBackgroundAlpha() { diff --git a/src/com/android/launcher3/folder/PreviewItemDrawingParams.java b/src/com/android/launcher3/folder/PreviewItemDrawingParams.java index 607b7caec1..c818462560 100644 --- a/src/com/android/launcher3/folder/PreviewItemDrawingParams.java +++ b/src/com/android/launcher3/folder/PreviewItemDrawingParams.java @@ -40,8 +40,8 @@ class PreviewItemDrawingParams { // We ensure the update will not interfere with an animation on the layout params // If the final values differ, we cancel the animation. if (anim != null) { - if (anim.finalTransX == transX || anim.finalTransY == transY - || anim.finalScale == scale) { + if (anim.finalState[1] == transX || anim.finalState[2] == transY + || anim.finalState[0] == scale) { return; } anim.cancel(); diff --git a/src/com/android/launcher3/notification/NotificationFooterLayout.java b/src/com/android/launcher3/notification/NotificationFooterLayout.java index 66f525cb44..3cc9365604 100644 --- a/src/com/android/launcher3/notification/NotificationFooterLayout.java +++ b/src/com/android/launcher3/notification/NotificationFooterLayout.java @@ -29,7 +29,6 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.LinearLayout; -import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.PropertyListBuilder; @@ -151,7 +150,7 @@ public class NotificationFooterLayout extends FrameLayout { public void animateFirstNotificationTo(Rect toBounds, final IconAnimationEndListener callback) { - AnimatorSet animation = LauncherAnimUtils.createAnimatorSet(); + AnimatorSet animation = new AnimatorSet(); final View firstNotification = mIconRow.getChildAt(mIconRow.getChildCount() - 1); Rect fromBounds = sTempRect; diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java index e157482c68..3bf8bef1b6 100644 --- a/src/com/android/launcher3/popup/ArrowPopup.java +++ b/src/com/android/launcher3/popup/ArrowPopup.java @@ -340,7 +340,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { private void animateOpen() { setVisibility(View.VISIBLE); - final AnimatorSet openAnim = LauncherAnimUtils.createAnimatorSet(); + final AnimatorSet openAnim = new AnimatorSet(); final Resources res = getResources(); final long revealDuration = (long) res.getInteger(R.integer.config_popupOpenCloseDuration); final TimeInterpolator revealInterpolator = new AccelerateDecelerateInterpolator(); @@ -388,7 +388,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { } mIsOpen = false; - final AnimatorSet closeAnim = LauncherAnimUtils.createAnimatorSet(); + final AnimatorSet closeAnim = new AnimatorSet(); // Hide the arrow closeAnim.play(ObjectAnimator.ofFloat(mArrow, LauncherAnimUtils.SCALE_PROPERTY, 0)); closeAnim.play(ObjectAnimator.ofFloat(mArrow, ALPHA, 0)); -- GitLab From 309053fff9925eca6ce6f69ab0aa15381c92fd7f Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Fri, 10 Aug 2018 14:30:59 -0700 Subject: [PATCH 0064/1301] Using SWIPE_UP_SETTING_NAME in TAPL Bug: 110103162 Test: TaplTests suite Change-Id: Ia62207773a156aca1e226307ccc462c252cc9227 --- tests/Android.mk | 2 +- .../com/android/launcher3/tapl/LauncherInstrumentation.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/Android.mk b/tests/Android.mk index c7a222a96e..7a7d203994 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -35,7 +35,7 @@ include $(BUILD_PACKAGE) # Build rule for Tapl library. # include $(CLEAR_VARS) -LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator +LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator libSharedSystemUI LOCAL_SRC_FILES := $(call all-java-files-under, tapl) \ ../quickstep/src/com/android/quickstep/SwipeUpSetting.java diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index c3f27eeeb6..884a6cb589 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -16,6 +16,8 @@ package com.android.launcher3.tapl; +import static com.android.systemui.shared.system.SettingsCompat.SWIPE_UP_SETTING_NAME; + import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -96,7 +98,7 @@ public final class LauncherInstrumentation { SwipeUpSetting.isSwipeUpEnabledDefaultValue(); mSwipeUpEnabled = Settings.Secure.getInt( InstrumentationRegistry.getTargetContext().getContentResolver(), - "swipe_up_to_switch_apps_enabled", + SWIPE_UP_SETTING_NAME, swipeUpEnabledDefault ? 1 : 0) == 1; assertTrue("Device must run in a test harness", ActivityManager.isRunningInTestHarness()); } -- GitLab From b7b0135c9334e311e836651779c9a0bb7c5ef7a8 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 9 Aug 2018 12:31:20 -0700 Subject: [PATCH 0065/1301] Adding overscroll in recents view Bug: 109828536 Change-Id: I4fe94bd157c2b65f80604751e6f0f7d5d81d058d --- .../android/quickstep/views/RecentsView.java | 2 +- .../android/launcher3/LauncherScroller.java | 54 --- src/com/android/launcher3/PagedView.java | 140 ++++--- src/com/android/launcher3/Workspace.java | 4 +- .../launcher3/folder/FolderPagedView.java | 2 +- .../android/launcher3/touch/OverScroll.java | 2 +- .../android/launcher3/util/OverScroller.java | 342 ++++-------------- 7 files changed, 149 insertions(+), 397 deletions(-) delete mode 100644 src/com/android/launcher3/LauncherScroller.java diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 814d02d5a1..aa51e523e1 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -271,7 +271,7 @@ public abstract class RecentsView extends PagedView impl public RecentsView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setPageSpacing(getResources().getDimensionPixelSize(R.dimen.recents_page_spacing)); - enableFreeScroll(true); + setEnableFreeScroll(true); mFastFlingVelocity = getResources() .getDimensionPixelSize(R.dimen.recents_fast_fling_velocity); diff --git a/src/com/android/launcher3/LauncherScroller.java b/src/com/android/launcher3/LauncherScroller.java deleted file mode 100644 index e5042c4e2e..0000000000 --- a/src/com/android/launcher3/LauncherScroller.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2006 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.animation.TimeInterpolator; -import android.content.Context; -import android.view.animation.Interpolator; -import android.widget.Scroller; - -/** - * Extension of {@link android.widget.Scroller} with the ability to modify the - * Interpolator post-construction. - */ -public class LauncherScroller extends Scroller { - - private final InterpolatorWrapper mInterpolatorWrapper; - - public LauncherScroller(Context context) { - this(context, new InterpolatorWrapper()); - } - - private LauncherScroller(Context context, InterpolatorWrapper interpolatorWrapper) { - super(context, interpolatorWrapper); - mInterpolatorWrapper = interpolatorWrapper; - } - - public void setInterpolator(TimeInterpolator interpolator) { - mInterpolatorWrapper.interpolator = interpolator; - } - - private static class InterpolatorWrapper implements Interpolator { - - public TimeInterpolator interpolator; - - @Override - public float getInterpolation(float v) { - return interpolator == null ? v : interpolator.getInterpolation(v); - } - } -} diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index c81f679d00..394b950c43 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -18,6 +18,7 @@ package com.android.launcher3; import static com.android.launcher3.compat.AccessibilityManagerCompat.isAccessibilityEnabled; import static com.android.launcher3.compat.AccessibilityManagerCompat.isObservedEventType; +import static com.android.launcher3.touch.OverScroll.OVERSCROLL_DAMP_FACTOR; import android.animation.LayoutTransition; import android.animation.TimeInterpolator; @@ -47,6 +48,7 @@ import com.android.launcher3.anim.Interpolators; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.pageindicators.PageIndicator; import com.android.launcher3.touch.OverScroll; +import com.android.launcher3.util.OverScroller; import com.android.launcher3.util.Thunk; import java.util.ArrayList; @@ -82,7 +84,6 @@ public abstract class PagedView extends ViewGrou public static final int INVALID_RESTORE_PAGE = -1001; private boolean mFreeScroll = false; - private boolean mSettleOnPageInFreeScroll = false; protected int mFlingThresholdVelocity; protected int mMinFlingVelocity; @@ -96,7 +97,7 @@ public abstract class PagedView extends ViewGrou @ViewDebug.ExportedProperty(category = "launcher") protected int mNextPage = INVALID_PAGE; protected int mMaxScrollX; - protected LauncherScroller mScroller; + protected OverScroller mScroller; private Interpolator mDefaultInterpolator; private VelocityTracker mVelocityTracker; protected int mPageSpacing = 0; @@ -122,11 +123,6 @@ public abstract class PagedView extends ViewGrou protected boolean mWasInOverscroll = false; - // mOverScrollX is equal to getScrollX() when we're within the normal scroll range. Otherwise - // it is equal to the scaled overscroll position. We use a separate value so as to prevent - // the screens from continuing to translate beyond the normal bounds. - protected int mOverScrollX; - protected int mUnboundedScrollX; // Page Indicator @@ -169,7 +165,7 @@ public abstract class PagedView extends ViewGrou * Initializes various states for this workspace. */ protected void init() { - mScroller = new LauncherScroller(getContext()); + mScroller = new OverScroller(getContext()); setDefaultInterpolator(Interpolators.SCROLL); mCurrentPage = 0; @@ -244,7 +240,7 @@ public abstract class PagedView extends ViewGrou newX = getScrollForPage(mCurrentPage); } scrollTo(newX, 0); - mScroller.setFinalX(newX); + mScroller.startScroll(mScroller.getCurrPos(), newX - mScroller.getCurrPos()); forceFinishScroller(true); } @@ -349,17 +345,6 @@ public abstract class PagedView extends ViewGrou @Override public void scrollTo(int x, int y) { - // In free scroll mode, we clamp the scrollX - if (mFreeScroll) { - // If the scroller is trying to move to a location beyond the maximum allowed - // in the free scroll mode, we make sure to end the scroll operation. - if (!mScroller.isFinished() && (x > mMaxScrollX || x < 0)) { - forceFinishScroller(false); - } - - x = Utilities.boundToRange(x, 0, mMaxScrollX); - } - mUnboundedScrollX = x; boolean isXBeforeFirstPage = mIsRtl ? (x > mMaxScrollX) : (x < 0); @@ -389,9 +374,9 @@ public abstract class PagedView extends ViewGrou overScroll(0); mWasInOverscroll = false; } - mOverScrollX = x; super.scrollTo(x, y); } + } private void sendScrollAccessibilityEvent() { @@ -425,10 +410,9 @@ public abstract class PagedView extends ViewGrou protected boolean computeScrollHelper(boolean shouldInvalidate) { if (mScroller.computeScrollOffset()) { // Don't bother scrolling if the page does not need to be moved - if (getUnboundedScrollX() != mScroller.getCurrX() - || getScrollY() != mScroller.getCurrY() - || mOverScrollX != mScroller.getCurrX()) { - scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); + if (getUnboundedScrollX() != mScroller.getCurrPos() + || getScrollX() != mScroller.getCurrPos()) { + scrollTo(mScroller.getCurrPos(), 0); } if (shouldInvalidate) { invalidate(); @@ -865,7 +849,7 @@ public abstract class PagedView extends ViewGrou * otherwise don't. mScroller.isFinished should be false when * being flinged. */ - final int xDist = Math.abs(mScroller.getFinalX() - mScroller.getCurrX()); + final int xDist = Math.abs(mScroller.getFinalPos() - mScroller.getCurrPos()); final boolean finishedScrolling = (mScroller.isFinished() || xDist < mTouchSlop / 3); if (finishedScrolling) { @@ -996,31 +980,34 @@ public abstract class PagedView extends ViewGrou } } - protected void dampedOverScroll(float amount) { - if (Float.compare(amount, 0f) == 0) return; + protected void dampedOverScroll(int amount) { + if (amount == 0) return; int overScrollAmount = OverScroll.dampedScroll(amount, getMeasuredWidth()); if (amount < 0) { - mOverScrollX = overScrollAmount; - super.scrollTo(mOverScrollX, getScrollY()); + super.scrollTo(overScrollAmount, getScrollY()); } else { - mOverScrollX = mMaxScrollX + overScrollAmount; - super.scrollTo(mOverScrollX, getScrollY()); + super.scrollTo(mMaxScrollX + overScrollAmount, getScrollY()); } invalidate(); } - protected void overScroll(float amount) { - dampedOverScroll(amount); - } - + protected void overScroll(int amount) { + if (amount == 0) return; - protected void enableFreeScroll(boolean settleOnPageInFreeScroll) { - setEnableFreeScroll(true); - mSettleOnPageInFreeScroll = settleOnPageInFreeScroll; + if (mFreeScroll && !mScroller.isFinished()) { + if (amount < 0) { + super.scrollTo(amount, getScrollY()); + } else { + super.scrollTo(mMaxScrollX + amount, getScrollY()); + } + } else { + dampedOverScroll(amount); + } } - private void setEnableFreeScroll(boolean freeScroll) { + + protected void setEnableFreeScroll(boolean freeScroll) { boolean wasFreeScroll = mFreeScroll; mFreeScroll = freeScroll; @@ -1029,8 +1016,6 @@ public abstract class PagedView extends ViewGrou } else if (wasFreeScroll) { snapToPage(getNextPage()); } - - setEnableOverscroll(!freeScroll); } protected void setEnableOverscroll(boolean enable) { @@ -1113,6 +1098,8 @@ public abstract class PagedView extends ViewGrou mTotalMotionX += Math.abs(mLastMotionX + mLastMotionXRemainder - x); boolean isFling = mTotalMotionX > mTouchSlop && shouldFlingForVelocity(velocityX); + boolean isDeltaXLeft = mIsRtl ? deltaX > 0 : deltaX < 0; + boolean isVelocityXLeft = mIsRtl ? velocityX > 0 : velocityX < 0; if (!mFreeScroll) { // In the case that the page is moved far to one direction and then is flung @@ -1128,8 +1115,7 @@ public abstract class PagedView extends ViewGrou // We give flings precedence over large moves, which is why we short-circuit our // test for a large move if a fling has been registered. That is, a large // move to the left and fling to the right will register as a fling to the right. - boolean isDeltaXLeft = mIsRtl ? deltaX > 0 : deltaX < 0; - boolean isVelocityXLeft = mIsRtl ? velocityX > 0 : velocityX < 0; + if (((isSignificantMove && !isDeltaXLeft && !isFling) || (isFling && !isVelocityXLeft)) && mCurrentPage > 0) { finalPage = returnToOriginalPage ? mCurrentPage : mCurrentPage - 1; @@ -1147,35 +1133,39 @@ public abstract class PagedView extends ViewGrou abortScrollerAnimation(true); } - float scaleX = getScaleX(); - int vX = (int) (-velocityX * scaleX); - int initialScrollX = (int) (getScrollX() * scaleX); - - mScroller.setInterpolator(mDefaultInterpolator); - mScroller.fling(initialScrollX, - getScrollY(), vX, 0, Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 0); - int unscaledScrollX = (int) (mScroller.getFinalX() / scaleX); - mNextPage = getPageNearestToCenterOfScreen(unscaledScrollX); - int firstPageScroll = getScrollForPage(!mIsRtl ? 0 : getPageCount() - 1); - int lastPageScroll = getScrollForPage(!mIsRtl ? getPageCount() - 1 : 0); - if (mSettleOnPageInFreeScroll && unscaledScrollX > 0 - && unscaledScrollX < mMaxScrollX) { - // If scrolling ends in the half of the added space that is closer to the - // end, settle to the end. Otherwise snap to the nearest page. - // If flinging past one of the ends, don't change the velocity as it will - // get stopped at the end anyway. - final int finalX = unscaledScrollX < firstPageScroll / 2 ? - 0 : - unscaledScrollX > (lastPageScroll + mMaxScrollX) / 2 ? - mMaxScrollX : - getScrollForPage(mNextPage); - - mScroller.setFinalX((int) (finalX * getScaleX())); - // Ensure the scroll/snap doesn't happen too fast; - int extraScrollDuration = OVERSCROLL_PAGE_SNAP_ANIMATION_DURATION - - mScroller.getDuration(); - if (extraScrollDuration > 0) { - mScroller.extendDuration(extraScrollDuration); + int initialScrollX = getScrollX(); + + if (((initialScrollX >= mMaxScrollX) && (isVelocityXLeft || !isFling)) || + ((initialScrollX <= 0) && (!isVelocityXLeft || !isFling))) { + mScroller.springBack(getScrollX(), 0, mMaxScrollX); + } else { + mScroller.setInterpolator(mDefaultInterpolator); + mScroller.fling(initialScrollX, -velocityX, + 0, mMaxScrollX, + Math.round(getWidth() * 0.5f * OVERSCROLL_DAMP_FACTOR)); + + int finalX = mScroller.getFinalPos(); + mNextPage = getPageNearestToCenterOfScreen(finalX); + + int firstPageScroll = getScrollForPage(!mIsRtl ? 0 : getPageCount() - 1); + int lastPageScroll = getScrollForPage(!mIsRtl ? getPageCount() - 1 : 0); + if (finalX > 0 && finalX < mMaxScrollX) { + // If scrolling ends in the half of the added space that is closer to + // the end, settle to the end. Otherwise snap to the nearest page. + // If flinging past one of the ends, don't change the velocity as it + // will get stopped at the end anyway. + int pageSnappedX = finalX < firstPageScroll / 2 ? 0 + : finalX > (lastPageScroll + mMaxScrollX) / 2 + ? mMaxScrollX + : getScrollForPage(mNextPage); + + mScroller.setFinalPos(pageSnappedX); + // Ensure the scroll/snap doesn't happen too fast; + int extraScrollDuration = OVERSCROLL_PAGE_SNAP_ANIMATION_DURATION + - mScroller.getDuration(); + if (extraScrollDuration > 0) { + mScroller.extendDuration(extraScrollDuration); + } } } invalidate(); @@ -1324,7 +1314,7 @@ public abstract class PagedView extends ViewGrou } protected boolean isInOverScroll() { - return (mOverScrollX > mMaxScrollX || mOverScrollX < 0); + return (getScrollX() > mMaxScrollX || getScrollX() < 0); } protected int getPageSnapDuration() { @@ -1443,7 +1433,7 @@ public abstract class PagedView extends ViewGrou mScroller.setInterpolator(mDefaultInterpolator); } - mScroller.startScroll(getUnboundedScrollX(), 0, delta, 0, duration); + mScroller.startScroll(getUnboundedScrollX(), delta, duration); updatePageIndicator(); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 28783fa2b7..d652fe0cda 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1096,7 +1096,7 @@ public class Workspace extends PagedView } @Override - protected void overScroll(float amount) { + protected void overScroll(int amount) { boolean shouldScrollOverlay = mLauncherOverlay != null && ((amount <= 0 && !mIsRtl) || (amount >= 0 && mIsRtl)); @@ -1109,7 +1109,7 @@ public class Workspace extends PagedView mLauncherOverlay.onScrollInteractionBegin(); } - mLastOverlayScroll = Math.abs(amount / getMeasuredWidth()); + mLastOverlayScroll = Math.abs(((float) amount) / getMeasuredWidth()); mLauncherOverlay.onScrollChange(mLastOverlayScroll, mIsRtl); } else { dampedOverScroll(amount); diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index 9be71f95c9..8439e794f5 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -493,7 +493,7 @@ public class FolderPagedView extends PagedView { int delta = scroll - getScrollX(); if (delta != 0) { mScroller.setInterpolator(Interpolators.DEACCEL); - mScroller.startScroll(getScrollX(), 0, delta, 0, Folder.SCROLL_HINT_DURATION); + mScroller.startScroll(getScrollX(), delta, Folder.SCROLL_HINT_DURATION); invalidate(); } } diff --git a/src/com/android/launcher3/touch/OverScroll.java b/src/com/android/launcher3/touch/OverScroll.java index dc801ec4c5..bf895ad9ff 100644 --- a/src/com/android/launcher3/touch/OverScroll.java +++ b/src/com/android/launcher3/touch/OverScroll.java @@ -20,7 +20,7 @@ package com.android.launcher3.touch; */ public class OverScroll { - private static final float OVERSCROLL_DAMP_FACTOR = 0.07f; + public static final float OVERSCROLL_DAMP_FACTOR = 0.07f; /** * This curve determines how the effect of scrolling over the limits of the page diminishes diff --git a/src/com/android/launcher3/util/OverScroller.java b/src/com/android/launcher3/util/OverScroller.java index ec9abceab5..d697eceae5 100644 --- a/src/com/android/launcher3/util/OverScroller.java +++ b/src/com/android/launcher3/util/OverScroller.java @@ -18,6 +18,7 @@ package com.android.launcher3.util; import static com.android.launcher3.anim.Interpolators.SCROLL; +import android.animation.TimeInterpolator; import android.content.Context; import android.hardware.SensorManager; import android.util.Log; @@ -26,17 +27,15 @@ import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; /** - * This class encapsulates scrolling with the ability to overshoot the bounds - * of a scrolling operation. This class is a drop-in replacement for - * {@link android.widget.Scroller} in most cases. + * Based on {@link android.widget.OverScroller} supporting only 1-d scrolling and with more + * customization options. */ public class OverScroller { private int mMode; - private final SplineOverScroller mScrollerX; - private final SplineOverScroller mScrollerY; + private final SplineOverScroller mScroller; - private Interpolator mInterpolator; + private TimeInterpolator mInterpolator; private final boolean mFlywheel; @@ -68,7 +67,6 @@ public class OverScroller { * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will * be used. * @param flywheel If true, successive fling motions will keep on increasing scroll speed. - * @hide */ public OverScroller(Context context, Interpolator interpolator, boolean flywheel) { if (interpolator == null) { @@ -77,48 +75,10 @@ public class OverScroller { mInterpolator = interpolator; } mFlywheel = flywheel; - mScrollerX = new SplineOverScroller(context); - mScrollerY = new SplineOverScroller(context); + mScroller = new SplineOverScroller(context); } - /** - * Creates an OverScroller with flywheel enabled. - * @param context The context of this application. - * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will - * be used. - * @param bounceCoefficientX A value between 0 and 1 that will determine the proportion of the - * velocity which is preserved in the bounce when the horizontal edge is reached. A null value - * means no bounce. This behavior is no longer supported and this coefficient has no effect. - * @param bounceCoefficientY Same as bounceCoefficientX but for the vertical direction. This - * behavior is no longer supported and this coefficient has no effect. - * @deprecated Use {@link #OverScroller(Context, Interpolator)} instead. - */ - @Deprecated - public OverScroller(Context context, Interpolator interpolator, - float bounceCoefficientX, float bounceCoefficientY) { - this(context, interpolator, true); - } - - /** - * Creates an OverScroller. - * @param context The context of this application. - * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will - * be used. - * @param bounceCoefficientX A value between 0 and 1 that will determine the proportion of the - * velocity which is preserved in the bounce when the horizontal edge is reached. A null value - * means no bounce. This behavior is no longer supported and this coefficient has no effect. - * @param bounceCoefficientY Same as bounceCoefficientX but for the vertical direction. This - * behavior is no longer supported and this coefficient has no effect. - * @param flywheel If true, successive fling motions will keep on increasing scroll speed. - * @deprecated Use {@link #OverScroller(Context, Interpolator)} instead. - */ - @Deprecated - public OverScroller(Context context, Interpolator interpolator, - float bounceCoefficientX, float bounceCoefficientY, boolean flywheel) { - this(context, interpolator, flywheel); - } - - void setInterpolator(Interpolator interpolator) { + public void setInterpolator(TimeInterpolator interpolator) { if (interpolator == null) { mInterpolator = SCROLL; } else { @@ -134,8 +94,7 @@ public class OverScroller { * friction. */ public final void setFriction(float friction) { - mScrollerX.setFriction(friction); - mScrollerY.setFriction(friction); + mScroller.setFriction(friction); } /** @@ -145,7 +104,7 @@ public class OverScroller { * @return True if the scroller has finished scrolling, false otherwise. */ public final boolean isFinished() { - return mScrollerX.mFinished && mScrollerY.mFinished; + return mScroller.mFinished; } /** @@ -157,25 +116,16 @@ public class OverScroller { * @param finished The new finished value. */ public final void forceFinished(boolean finished) { - mScrollerX.mFinished = mScrollerY.mFinished = finished; - } - - /** - * Returns the current X offset in the scroll. - * - * @return The new X offset as an absolute distance from the origin. - */ - public final int getCurrX() { - return mScrollerX.mCurrentPosition; + mScroller.mFinished = finished; } /** - * Returns the current Y offset in the scroll. + * Returns the current offset in the scroll. * - * @return The new Y offset as an absolute distance from the origin. + * @return The new offset as an absolute distance from the origin. */ - public final int getCurrY() { - return mScrollerY.mCurrentPosition; + public final int getCurrPos() { + return mScroller.mCurrentPosition; } /** @@ -184,113 +134,55 @@ public class OverScroller { * @return The original velocity less the deceleration, norm of the X and Y velocity vector. */ public float getCurrVelocity() { - return (float) Math.hypot(mScrollerX.mCurrVelocity, mScrollerY.mCurrVelocity); - } - - /** - * Returns the start X offset in the scroll. - * - * @return The start X offset as an absolute distance from the origin. - */ - public final int getStartX() { - return mScrollerX.mStart; + return mScroller.mCurrVelocity; } /** - * Returns the start Y offset in the scroll. + * Returns the start offset in the scroll. * - * @return The start Y offset as an absolute distance from the origin. + * @return The start offset as an absolute distance from the origin. */ - public final int getStartY() { - return mScrollerY.mStart; + public final int getStartPos() { + return mScroller.mStart; } /** * Returns where the scroll will end. Valid only for "fling" scrolls. * - * @return The final X offset as an absolute distance from the origin. + * @return The final offset as an absolute distance from the origin. */ - public final int getFinalX() { - return mScrollerX.mFinal; - } - - /** - * Returns where the scroll will end. Valid only for "fling" scrolls. - * - * @return The final Y offset as an absolute distance from the origin. - */ - public final int getFinalY() { - return mScrollerY.mFinal; + public final int getFinalPos() { + return mScroller.mFinal; } /** * Returns how long the scroll event will take, in milliseconds. * * @return The duration of the scroll in milliseconds. - * - * @hide Pending removal once nothing depends on it - * @deprecated OverScrollers don't necessarily have a fixed duration. - * This function will lie to the best of its ability. */ - @Deprecated public final int getDuration() { - return Math.max(mScrollerX.mDuration, mScrollerY.mDuration); + return mScroller.mDuration; } /** * Extend the scroll animation. This allows a running animation to scroll - * further and longer, when used with {@link #setFinalX(int)} or {@link #setFinalY(int)}. + * further and longer, when used with {@link #setFinalPos(int)}. * * @param extend Additional time to scroll in milliseconds. - * @see #setFinalX(int) - * @see #setFinalY(int) - * - * @hide Pending removal once nothing depends on it - * @deprecated OverScrollers don't necessarily have a fixed duration. - * Instead of setting a new final position and extending - * the duration of an existing scroll, use startScroll - * to begin a new animation. + * @see #setFinalPos(int) */ - @Deprecated public void extendDuration(int extend) { - mScrollerX.extendDuration(extend); - mScrollerY.extendDuration(extend); - } - - /** - * Sets the final position (X) for this scroller. - * - * @param newX The new X offset as an absolute distance from the origin. - * @see #extendDuration(int) - * @see #setFinalY(int) - * - * @hide Pending removal once nothing depends on it - * @deprecated OverScroller's final position may change during an animation. - * Instead of setting a new final position and extending - * the duration of an existing scroll, use startScroll - * to begin a new animation. - */ - @Deprecated - public void setFinalX(int newX) { - mScrollerX.setFinalPosition(newX); + mScroller.extendDuration(extend); } /** - * Sets the final position (Y) for this scroller. + * Sets the final position for this scroller. * - * @param newY The new Y offset as an absolute distance from the origin. + * @param newPos The new offset as an absolute distance from the origin. * @see #extendDuration(int) - * @see #setFinalX(int) - * - * @hide Pending removal once nothing depends on it - * @deprecated OverScroller's final position may change during an animation. - * Instead of setting a new final position and extending - * the duration of an existing scroll, use startScroll - * to begin a new animation. */ - @Deprecated - public void setFinalY(int newY) { - mScrollerY.setFinalPosition(newY); + public void setFinalPos(int newPos) { + mScroller.setFinalPosition(newPos); } /** @@ -307,31 +199,22 @@ public class OverScroller { long time = AnimationUtils.currentAnimationTimeMillis(); // Any scroller can be used for time, since they were started // together in scroll mode. We use X here. - final long elapsedTime = time - mScrollerX.mStartTime; + final long elapsedTime = time - mScroller.mStartTime; - final int duration = mScrollerX.mDuration; + final int duration = mScroller.mDuration; if (elapsedTime < duration) { final float q = mInterpolator.getInterpolation(elapsedTime / (float) duration); - mScrollerX.updateScroll(q); - mScrollerY.updateScroll(q); + mScroller.updateScroll(q); } else { abortAnimation(); } break; case FLING_MODE: - if (!mScrollerX.mFinished) { - if (!mScrollerX.update()) { - if (!mScrollerX.continueWhenFinished()) { - mScrollerX.finish(); - } - } - } - - if (!mScrollerY.mFinished) { - if (!mScrollerY.update()) { - if (!mScrollerY.continueWhenFinished()) { - mScrollerY.finish(); + if (!mScroller.mFinished) { + if (!mScroller.update()) { + if (!mScroller.continueWhenFinished()) { + mScroller.finish(); } } } @@ -347,107 +230,73 @@ public class OverScroller { * The scroll will use the default value of 250 milliseconds for the * duration. * - * @param startX Starting horizontal scroll offset in pixels. Positive + * @param start Starting horizontal scroll offset in pixels. Positive * numbers will scroll the content to the left. - * @param startY Starting vertical scroll offset in pixels. Positive numbers - * will scroll the content up. - * @param dx Horizontal distance to travel. Positive numbers will scroll the + * @param delta Distance to travel. Positive numbers will scroll the * content to the left. - * @param dy Vertical distance to travel. Positive numbers will scroll the - * content up. */ - public void startScroll(int startX, int startY, int dx, int dy) { - startScroll(startX, startY, dx, dy, DEFAULT_DURATION); + public void startScroll(int start, int delta) { + startScroll(start, delta, DEFAULT_DURATION); } /** * Start scrolling by providing a starting point and the distance to travel. * - * @param startX Starting horizontal scroll offset in pixels. Positive + * @param start Starting scroll offset in pixels. Positive * numbers will scroll the content to the left. - * @param startY Starting vertical scroll offset in pixels. Positive numbers - * will scroll the content up. - * @param dx Horizontal distance to travel. Positive numbers will scroll the + * @param delta Distance to travel. Positive numbers will scroll the * content to the left. - * @param dy Vertical distance to travel. Positive numbers will scroll the - * content up. * @param duration Duration of the scroll in milliseconds. */ - public void startScroll(int startX, int startY, int dx, int dy, int duration) { + public void startScroll(int start, int delta, int duration) { mMode = SCROLL_MODE; - mScrollerX.startScroll(startX, dx, duration); - mScrollerY.startScroll(startY, dy, duration); + mScroller.startScroll(start, delta, duration); } /** * Call this when you want to 'spring back' into a valid coordinate range. * - * @param startX Starting X coordinate - * @param startY Starting Y coordinate - * @param minX Minimum valid X value - * @param maxX Maximum valid X value - * @param minY Minimum valid Y value - * @param maxY Minimum valid Y value + * @param start Starting X coordinate + * @param min Minimum valid X value + * @param max Maximum valid X value * @return true if a springback was initiated, false if startX and startY were * already within the valid range. */ - public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) { + public boolean springBack(int start, int min, int max) { mMode = FLING_MODE; - - // Make sure both methods are called. - final boolean spingbackX = mScrollerX.springback(startX, minX, maxX); - final boolean spingbackY = mScrollerY.springback(startY, minY, maxY); - return spingbackX || spingbackY; + return mScroller.springback(start, min, max); } - public void fling(int startX, int startY, int velocityX, int velocityY, - int minX, int maxX, int minY, int maxY) { - fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, 0, 0); + public void fling(int start, int velocity, int min, int max) { + fling(start, velocity, min, max, 0); } /** * Start scrolling based on a fling gesture. The distance traveled will * depend on the initial velocity of the fling. - * - * @param startX Starting point of the scroll (X) - * @param startY Starting point of the scroll (Y) - * @param velocityX Initial velocity of the fling (X) measured in pixels per + * @param start Starting point of the scroll (X) + * @param velocity Initial velocity of the fling (X) measured in pixels per * second. - * @param velocityY Initial velocity of the fling (Y) measured in pixels per - * second - * @param minX Minimum X value. The scroller will not scroll past this point - * unless overX > 0. If overfling is allowed, it will use minX as - * a springback boundary. - * @param maxX Maximum X value. The scroller will not scroll past this point - * unless overX > 0. If overfling is allowed, it will use maxX as - * a springback boundary. - * @param minY Minimum Y value. The scroller will not scroll past this point - * unless overY > 0. If overfling is allowed, it will use minY as - * a springback boundary. - * @param maxY Maximum Y value. The scroller will not scroll past this point - * unless overY > 0. If overfling is allowed, it will use maxY as - * a springback boundary. - * @param overX Overfling range. If > 0, horizontal overfling in either - * direction will be possible. - * @param overY Overfling range. If > 0, vertical overfling in either - * direction will be possible. + * @param min Minimum X value. The scroller will not scroll past this point + * unless overX > 0. If overfling is allowed, it will use minX as + * a springback boundary. + * @param max Maximum X value. The scroller will not scroll past this point +* unless overX > 0. If overfling is allowed, it will use maxX as +* a springback boundary. + * @param over Overfling range. If > 0, horizontal overfling in either +* direction will be possible. */ - public void fling(int startX, int startY, int velocityX, int velocityY, - int minX, int maxX, int minY, int maxY, int overX, int overY) { + public void fling(int start, int velocity, int min, int max, int over) { // Continue a scroll or fling in progress if (mFlywheel && !isFinished()) { - float oldVelocityX = mScrollerX.mCurrVelocity; - float oldVelocityY = mScrollerY.mCurrVelocity; - if (Math.signum(velocityX) == Math.signum(oldVelocityX) && - Math.signum(velocityY) == Math.signum(oldVelocityY)) { - velocityX += oldVelocityX; - velocityY += oldVelocityY; + float oldVelocityX = mScroller.mCurrVelocity; + if (Math.signum(velocity) == Math.signum(oldVelocityX)) { + velocity += oldVelocityX; } } mMode = FLING_MODE; - mScrollerX.fling(startX, velocityX, minX, maxX, overX); - mScrollerY.fling(startY, velocityY, minY, maxY, overY); + mScroller.fling(start, velocity, min, max, over); } /** @@ -457,40 +306,21 @@ public class OverScroller { * fling functions. However there are cases where this cannot be known * in advance. This function will transition the current motion and * animate from startX to finalX as appropriate. - * - * @param startX Starting/current X position - * @param finalX Desired final X position - * @param overX Magnitude of overscroll allowed. This should be the maximum - * desired distance from finalX. Absolute value - must be positive. - */ - public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) { - mScrollerX.notifyEdgeReached(startX, finalX, overX); - } - - /** - * Notify the scroller that we've reached a vertical boundary. - * Normally the information to handle this will already be known - * when the animation is started, such as in a call to one of the - * fling functions. However there are cases where this cannot be known - * in advance. This function will animate a parabolic motion from - * startY to finalY. - * - * @param startY Starting/current Y position - * @param finalY Desired final Y position - * @param overY Magnitude of overscroll allowed. This should be the maximum - * desired distance from finalY. Absolute value - must be positive. + * @param start Starting/current X position + * @param finalPos Desired final X position + * @param over Magnitude of overscroll allowed. This should be the maximum */ - public void notifyVerticalEdgeReached(int startY, int finalY, int overY) { - mScrollerY.notifyEdgeReached(startY, finalY, overY); + public void notifyEdgeReached(int start, int finalPos, int over) { + mScroller.notifyEdgeReached(start, finalPos, over); } /** * Returns whether the current Scroller is currently returning to a valid position. * Valid bounds were provided by the - * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method. + * {@link #fling(int, int, int, int, int)} method. * * One should check this value before calling - * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress + * {@link #startScroll(int, int)} as the interpolation currently in progress * to restore a valid position will then be stopped. The caller has to take into account * the fact that the started scroll will start from an overscrolled position. * @@ -498,10 +328,7 @@ public class OverScroller { * interpolating back to a valid value. */ public boolean isOverScrolled() { - return ((!mScrollerX.mFinished && - mScrollerX.mState != SplineOverScroller.SPLINE) || - (!mScrollerY.mFinished && - mScrollerY.mState != SplineOverScroller.SPLINE)); + return (!mScroller.mFinished && mScroller.mState != SplineOverScroller.SPLINE); } /** @@ -512,8 +339,7 @@ public class OverScroller { * @see #forceFinished(boolean) */ public void abortAnimation() { - mScrollerX.finish(); - mScrollerY.finish(); + mScroller.finish(); } /** @@ -525,18 +351,7 @@ public class OverScroller { */ public int timePassed() { final long time = AnimationUtils.currentAnimationTimeMillis(); - final long startTime = Math.min(mScrollerX.mStartTime, mScrollerY.mStartTime); - return (int) (time - startTime); - } - - /** - * @hide - */ - public boolean isScrollingInDirection(float xvel, float yvel) { - final int dx = mScrollerX.mFinal - mScrollerX.mStart; - final int dy = mScrollerY.mFinal - mScrollerY.mStart; - return !isFinished() && Math.signum(xvel) == Math.signum(dx) && - Math.signum(yvel) == Math.signum(dy); + return (int) (time - mScroller.mStartTime); } static class SplineOverScroller { @@ -703,13 +518,14 @@ public class OverScroller { void setFinalPosition(int position) { mFinal = position; + mSplineDistance = mFinal - mStart; mFinished = false; } void extendDuration(int extend) { final long time = AnimationUtils.currentAnimationTimeMillis(); final int elapsedTime = (int) (time - mStartTime); - mDuration = elapsedTime + extend; + mDuration = mSplineDuration = elapsedTime + extend; mFinished = false; } -- GitLab From 3b5793fdf57e6b6f4fb3bf6211e38bffe29e8941 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 8 Aug 2018 16:50:43 -0700 Subject: [PATCH 0066/1301] Support for running Overview tests with quickstep on and off Bug: 110103162 Test: TaplTests suite Change-Id: Ic479156f2973aeec5cc3d288e1c891b8086d9daa --- .../android/quickstep/OverviewInteractionState.java | 11 +++++++---- .../launcher3/tapl/LauncherInstrumentation.java | 8 +++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index a5ff681134..224c8a7080 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -185,14 +185,18 @@ public class OverviewInteractionState { return mSwipeGestureInitializing; } + public void notifySwipeUpSettingChanged(boolean swipeUpEnabled) { + mUiHandler.removeMessages(MSG_SET_SWIPE_UP_ENABLED); + mUiHandler.obtainMessage(MSG_SET_SWIPE_UP_ENABLED, swipeUpEnabled ? 1 : 0, 0). + sendToTarget(); + } + private class SwipeUpGestureEnabledSettingObserver extends ContentObserver { - private Handler mHandler; private ContentResolver mResolver; private final int defaultValue; SwipeUpGestureEnabledSettingObserver(Handler handler, ContentResolver resolver) { super(handler); - mHandler = handler; mResolver = resolver; defaultValue = SwipeUpSetting.isSwipeUpEnabledDefaultValue() ? 1 : 0; } @@ -207,8 +211,7 @@ public class OverviewInteractionState { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); - mHandler.removeMessages(MSG_SET_SWIPE_UP_ENABLED); - mHandler.obtainMessage(MSG_SET_SWIPE_UP_ENABLED, getValue() ? 1 : 0, 0).sendToTarget(); + notifySwipeUpSettingChanged(getValue()); } private boolean getValue() { diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 884a6cb589..b02ff93bc3 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -87,6 +87,7 @@ public final class LauncherInstrumentation { private final UiDevice mDevice; private final boolean mSwipeUpEnabled; + private Boolean mSwipeUpEnabledOverride = null; /** * Constructs the root of TAPL hierarchy. You get all other objects from it. @@ -103,12 +104,17 @@ public final class LauncherInstrumentation { assertTrue("Device must run in a test harness", ActivityManager.isRunningInTestHarness()); } + // Used only by tests. + public void overrideSwipeUpEnabled(Boolean swipeUpEnabledOverride) { + mSwipeUpEnabledOverride = swipeUpEnabledOverride; + } + void setActiveContainer(VisibleContainer container) { sActiveContainer = new WeakReference<>(container); } boolean isSwipeUpEnabled() { - return mSwipeUpEnabled; + return mSwipeUpEnabledOverride != null ? mSwipeUpEnabledOverride : mSwipeUpEnabled; } private UiObject2 verifyContainerType(ContainerType containerType) { -- GitLab From f0b6db7fa81799d7db350c5d667ef4b83657f840 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 13 Aug 2018 16:10:14 -0700 Subject: [PATCH 0067/1301] Removing static launcher activity dependency from FirstFrameAnimationHelper Static dependency does not work in the presence of multiple activities and when the main activity is not Launcher (eg in fallback recents). Instead creating FirstFrameAnimatorHelper on demand for individual animations. Change-Id: I17bb69bbaaca92f0db994fb56fd784302c57d543 --- .../android/quickstep/views/RecentsView.java | 18 +- .../launcher3/AppWidgetResizeFrame.java | 20 +-- src/com/android/launcher3/CellLayout.java | 18 +- .../launcher3/FirstFrameAnimatorHelper.java | 160 ++++++++++-------- src/com/android/launcher3/Launcher.java | 64 +++---- .../android/launcher3/LauncherAnimUtils.java | 14 -- .../launcher3/anim/PropertyListBuilder.java | 6 +- .../launcher3/dragndrop/DragController.java | 7 + .../android/launcher3/dragndrop/DragView.java | 4 +- .../NotificationFooterLayout.java | 7 +- 10 files changed, 157 insertions(+), 161 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index aa51e523e1..0326bbd92d 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1269,11 +1269,10 @@ public abstract class RecentsView extends PagedView impl int otherAdjacentTaskIndex = centerTaskIndex + (centerTaskIndex - taskIndex); if (otherAdjacentTaskIndex >= 0 && otherAdjacentTaskIndex < getPageCount()) { - anim.play(ObjectAnimator.ofPropertyValuesHolder(getPageAt(otherAdjacentTaskIndex), - new PropertyListBuilder() - .translationX(mIsRtl ? -displacementX : displacementX) - .scale(1) - .build())); + anim.play(new PropertyListBuilder() + .translationX(mIsRtl ? -displacementX : displacementX) + .scale(1) + .build(getPageAt(otherAdjacentTaskIndex))); } } return anim; @@ -1282,11 +1281,10 @@ public abstract class RecentsView extends PagedView impl private Animator createAnimForChild(TaskView child, float[] toScaleAndTranslation) { AnimatorSet anim = new AnimatorSet(); anim.play(ObjectAnimator.ofFloat(child, TaskView.ZOOM_SCALE, toScaleAndTranslation[0])); - anim.play(ObjectAnimator.ofPropertyValuesHolder(child, - new PropertyListBuilder() - .translationX(toScaleAndTranslation[1]) - .translationY(toScaleAndTranslation[2]) - .build())); + anim.play(new PropertyListBuilder() + .translationX(toScaleAndTranslation[1]) + .translationY(toScaleAndTranslation[2]) + .build(child)); return anim; } diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index b2d5a3f4f3..0f5317be74 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -3,8 +3,6 @@ package com.android.launcher3; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; -import android.animation.ValueAnimator; -import android.animation.ValueAnimator.AnimatorUpdateListener; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; @@ -39,6 +37,7 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O private final Launcher mLauncher; private final DragViewStateAnnouncer mStateAnnouncer; + private final FirstFrameAnimatorHelper mFirstFrameAnimatorHelper; private final View[] mDragHandles = new View[HANDLE_COUNT]; @@ -101,6 +100,7 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O mBackgroundPadding = getResources() .getDimensionPixelSize(R.dimen.resize_frame_background_padding); mTouchTargetWidth = 2 * mBackgroundPadding; + mFirstFrameAnimatorHelper = new FirstFrameAnimatorHelper(this); } @Override @@ -368,12 +368,7 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O mDeltaX = 0; mDeltaY = 0; - post(new Runnable() { - @Override - public void run() { - snapToWidget(true); - } - }); + post(() -> snapToWidget(true)); } /** @@ -433,20 +428,19 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O } requestLayout(); } else { - ObjectAnimator oa = LauncherAnimUtils.ofPropertyValuesHolder(lp, this, + ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(lp, PropertyValuesHolder.ofInt("width", lp.width, newWidth), PropertyValuesHolder.ofInt("height", lp.height, newHeight), PropertyValuesHolder.ofInt("x", lp.x, newX), PropertyValuesHolder.ofInt("y", lp.y, newY)); - oa.addUpdateListener(a -> requestLayout()); + mFirstFrameAnimatorHelper.addTo(oa).addUpdateListener(a -> requestLayout()); AnimatorSet set = new AnimatorSet(); set.play(oa); for (int i = 0; i < HANDLE_COUNT; i++) { - set.play(LauncherAnimUtils.ofPropertyValuesHolder(mDragHandles[i], - PropertyValuesHolder.ofFloat(ALPHA, 1f))); + set.play(mFirstFrameAnimatorHelper.addTo( + ObjectAnimator.ofFloat(mDragHandles[i], ALPHA, 1f))); } - set.setDuration(SNAP_DURATION); set.start(); } diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 260abd1aa2..f52a4d6756 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -16,6 +16,8 @@ package com.android.launcher3; +import static com.android.launcher3.anim.Interpolators.DEACCEL_1_5; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; @@ -1921,7 +1923,7 @@ public class CellLayout extends ViewGroup { public static final int MODE_PREVIEW = 1; float animationProgress = 0; - Animator a; + ValueAnimator a; public ReorderPreviewAnimation(View child, int mode, int cellX0, int cellY0, int cellX1, int cellY1, int spanX, int spanY) { @@ -2039,14 +2041,14 @@ public class CellLayout extends ViewGroup { } setInitialAnimationValues(true); - a = LauncherAnimUtils.ofPropertyValuesHolder(child, - new PropertyListBuilder() - .scale(initScale) - .translationX(initDeltaX) - .translationY(initDeltaY) - .build()) + a = new PropertyListBuilder() + .scale(initScale) + .translationX(initDeltaX) + .translationY(initDeltaY) + .build(child) .setDuration(REORDER_ANIMATION_DURATION); - a.setInterpolator(new android.view.animation.DecelerateInterpolator(1.5f)); + mLauncher.getDragController().addFirstFrameAnimationHelper(a); + a.setInterpolator(DEACCEL_1_5); a.start(); } } diff --git a/src/com/android/launcher3/FirstFrameAnimatorHelper.java b/src/com/android/launcher3/FirstFrameAnimatorHelper.java index 48c1059891..c967a96e48 100644 --- a/src/com/android/launcher3/FirstFrameAnimatorHelper.java +++ b/src/com/android/launcher3/FirstFrameAnimatorHelper.java @@ -13,108 +13,124 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.android.launcher3; import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; import android.animation.ValueAnimator; +import android.animation.ValueAnimator.AnimatorUpdateListener; import android.util.Log; import android.view.View; -import android.view.ViewTreeObserver; - -import com.android.launcher3.util.Thunk; +import android.view.View.OnAttachStateChangeListener; +import android.view.ViewTreeObserver.OnDrawListener; /* * This is a helper class that listens to updates from the corresponding animation. * For the first two frames, it adjusts the current play time of the animation to * prevent jank at the beginning of the animation */ -public class FirstFrameAnimatorHelper implements ValueAnimator.AnimatorUpdateListener { +public class FirstFrameAnimatorHelper implements OnDrawListener, OnAttachStateChangeListener { + private static final String TAG = "FirstFrameAnimatorHlpr"; private static final boolean DEBUG = false; private static final int MAX_DELAY = 1000; - private final View mTarget; - private long mStartFrame; - private long mStartTime = -1; - private boolean mHandlingOnAnimationUpdate; - private boolean mAdjustedSecondFrameTime; - - private static ViewTreeObserver.OnDrawListener sGlobalDrawListener; - @Thunk static long sGlobalFrameCounter; - private static boolean sVisible; - - public FirstFrameAnimatorHelper(ValueAnimator animator, View target) { - mTarget = target; - animator.addUpdateListener(this); + + private View mRootView; + private long mGlobalFrameCount; + + public FirstFrameAnimatorHelper(View target) { + target.addOnAttachStateChangeListener(this); + if (target.isAttachedToWindow()) { + onViewAttachedToWindow(target); + } } - public static void setIsVisible(boolean visible) { - sVisible = visible; + public T addTo(T anim) { + anim.addUpdateListener(new MyListener()); + return anim; } - public static void initializeDrawListener(View view) { - if (sGlobalDrawListener != null) { - view.getViewTreeObserver().removeOnDrawListener(sGlobalDrawListener); - } + @Override + public void onDraw() { + mGlobalFrameCount ++; + } - sGlobalDrawListener = () -> sGlobalFrameCounter++; - view.getViewTreeObserver().addOnDrawListener(sGlobalDrawListener); - sVisible = true; + @Override + public void onViewAttachedToWindow(View view) { + mRootView = view.getRootView(); + mRootView.getViewTreeObserver().addOnDrawListener(this); } @Override - public void onAnimationUpdate(final ValueAnimator animation) { - final long currentTime = System.currentTimeMillis(); - if (mStartTime == -1) { - mStartFrame = sGlobalFrameCounter; - mStartTime = currentTime; + public void onViewDetachedFromWindow(View view) { + if (mRootView != null) { + mRootView.getViewTreeObserver().removeOnDrawListener(this); + mRootView = null; } + } - final long currentPlayTime = animation.getCurrentPlayTime(); - boolean isFinalFrame = Float.compare(1f, animation.getAnimatedFraction()) == 0; - - if (!mHandlingOnAnimationUpdate && - sVisible && - // If the current play time exceeds the duration, or the animated fraction is 1, - // the animation will get finished, even if we call setCurrentPlayTime -- therefore - // don't adjust the animation in that case - currentPlayTime < animation.getDuration() && !isFinalFrame) { - mHandlingOnAnimationUpdate = true; - long frameNum = sGlobalFrameCounter - mStartFrame; - // If we haven't drawn our first frame, reset the time to t = 0 - // (give up after MAX_DELAY ms of waiting though - might happen, for example, if we - // are no longer in the foreground and no frames are being rendered ever) - if (frameNum == 0 && currentTime < mStartTime + MAX_DELAY && currentPlayTime > 0) { - // The first frame on animations doesn't always trigger an invalidate... - // force an invalidate here to make sure the animation continues to advance - mTarget.getRootView().invalidate(); - animation.setCurrentPlayTime(0); - // For the second frame, if the first frame took more than 16ms, - // adjust the start time and pretend it took only 16ms anyway. This - // prevents a large jump in the animation due to an expensive first frame - } else if (frameNum == 1 && currentTime < mStartTime + MAX_DELAY && - !mAdjustedSecondFrameTime && - currentTime > mStartTime + SINGLE_FRAME_MS && - currentPlayTime > SINGLE_FRAME_MS) { - animation.setCurrentPlayTime(SINGLE_FRAME_MS); - mAdjustedSecondFrameTime = true; - } else { - if (frameNum > 1) { - mTarget.post(() -> animation.removeUpdateListener(this)); + private class MyListener implements AnimatorUpdateListener { + + private long mStartFrame; + private long mStartTime = -1; + private boolean mHandlingOnAnimationUpdate; + private boolean mAdjustedSecondFrameTime; + + @Override + public void onAnimationUpdate(final ValueAnimator animation) { + final long currentTime = System.currentTimeMillis(); + if (mStartTime == -1) { + mStartFrame = mGlobalFrameCount; + mStartTime = currentTime; + } + + final long currentPlayTime = animation.getCurrentPlayTime(); + boolean isFinalFrame = Float.compare(1f, animation.getAnimatedFraction()) == 0; + + if (!mHandlingOnAnimationUpdate && + mRootView != null && + mRootView.getWindowVisibility() == View.VISIBLE && + // If the current play time exceeds the duration, or the animated fraction is 1, + // the animation will get finished, even if we call setCurrentPlayTime -- + // therefore don't adjust the animation in that case + currentPlayTime < animation.getDuration() && !isFinalFrame) { + mHandlingOnAnimationUpdate = true; + long frameNum = mGlobalFrameCount - mStartFrame; + + // If we haven't drawn our first frame, reset the time to t = 0 + // (give up after MAX_DELAY ms of waiting though - might happen, for example, if we + // are no longer in the foreground and no frames are being rendered ever) + if (frameNum == 0 && currentTime < mStartTime + MAX_DELAY && currentPlayTime > 0) { + // The first frame on animations doesn't always trigger an invalidate... + // force an invalidate here to make sure the animation continues to advance + mRootView.invalidate(); + animation.setCurrentPlayTime(0); + // For the second frame, if the first frame took more than 16ms, + // adjust the start time and pretend it took only 16ms anyway. This + // prevents a large jump in the animation due to an expensive first frame + } else if (frameNum == 1 && currentTime < mStartTime + MAX_DELAY && + !mAdjustedSecondFrameTime && + currentTime > mStartTime + SINGLE_FRAME_MS && + currentPlayTime > SINGLE_FRAME_MS) { + animation.setCurrentPlayTime(SINGLE_FRAME_MS); + mAdjustedSecondFrameTime = true; + } else { + if (frameNum > 1) { + mRootView.post(() -> animation.removeUpdateListener(this)); + } + if (DEBUG) print(animation); } + mHandlingOnAnimationUpdate = false; + } else { if (DEBUG) print(animation); } - mHandlingOnAnimationUpdate = false; - } else { - if (DEBUG) print(animation); } - } - public void print(ValueAnimator animation) { - float flatFraction = animation.getCurrentPlayTime() / (float) animation.getDuration(); - Log.d(TAG, sGlobalFrameCounter + - "(" + (sGlobalFrameCounter - mStartFrame) + ") " + mTarget + " dirty? " + - mTarget.isDirty() + " " + flatFraction + " " + this + " " + animation); + public void print(ValueAnimator animation) { + float flatFraction = animation.getCurrentPlayTime() / (float) animation.getDuration(); + Log.d(TAG, mGlobalFrameCount + + "(" + (mGlobalFrameCount - mStartFrame) + ") " + mRootView + " dirty? " + + mRootView.isDirty() + " " + flatFraction + " " + this + " " + animation); + } } } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 9650e4eb7a..0dffed4071 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -31,7 +31,6 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; -import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.app.ActivityOptions; @@ -79,6 +78,7 @@ import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.allapps.DiscoveryBounce; +import com.android.launcher3.anim.PropertyListBuilder; import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.LauncherAppsCompatVO; @@ -740,8 +740,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, @Override protected void onStop() { super.onStop(); - FirstFrameAnimatorHelper.setIsVisible(false); - if (mLauncherCallbacks != null) { mLauncherCallbacks.onStop(); } @@ -762,8 +760,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, @Override protected void onStart() { super.onStart(); - FirstFrameAnimatorHelper.setIsVisible(true); - if (mLauncherCallbacks != null) { mLauncherCallbacks.onStart(); } @@ -1131,7 +1127,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, public void onAttachedToWindow() { super.onAttachedToWindow(); - FirstFrameAnimatorHelper.initializeDrawListener(getWindow().getDecorView()); if (mLauncherCallbacks != null) { mLauncherCallbacks.onAttachedToWindow(); } @@ -1839,7 +1834,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, @Override public void bindItems(final List items, final boolean forceAnimateIcons) { // Get the list of added items and intersect them with the set of items here - final AnimatorSet anim = new AnimatorSet(); final Collection bounceAnims = new ArrayList<>(); final boolean animateIcons = forceAnimateIcons && canRunNewAppsAnimation(); Workspace workspace = mWorkspace; @@ -1911,34 +1905,31 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } } - if (animateIcons) { - // Animate to the correct page - if (newItemsScreenId > -1) { - long currentScreenId = mWorkspace.getScreenIdForPageIndex(mWorkspace.getNextPage()); - final int newScreenIndex = mWorkspace.getPageIndexForScreenId(newItemsScreenId); - final Runnable startBounceAnimRunnable = new Runnable() { + // Animate to the correct page + if (animateIcons && newItemsScreenId > -1) { + AnimatorSet anim = new AnimatorSet(); + anim.playTogether(bounceAnims); + + long currentScreenId = mWorkspace.getScreenIdForPageIndex(mWorkspace.getNextPage()); + final int newScreenIndex = mWorkspace.getPageIndexForScreenId(newItemsScreenId); + final Runnable startBounceAnimRunnable = anim::start; + + if (newItemsScreenId != currentScreenId) { + // We post the animation slightly delayed to prevent slowdowns + // when we are loading right after we return to launcher. + mWorkspace.postDelayed(new Runnable() { public void run() { - anim.playTogether(bounceAnims); - anim.start(); - } - }; - if (newItemsScreenId != currentScreenId) { - // We post the animation slightly delayed to prevent slowdowns - // when we are loading right after we return to launcher. - mWorkspace.postDelayed(new Runnable() { - public void run() { - if (mWorkspace != null) { - AbstractFloatingView.closeAllOpenViews(Launcher.this, false); - - mWorkspace.snapToPage(newScreenIndex); - mWorkspace.postDelayed(startBounceAnimRunnable, - NEW_APPS_ANIMATION_DELAY); - } + if (mWorkspace != null) { + AbstractFloatingView.closeAllOpenViews(Launcher.this, false); + + mWorkspace.snapToPage(newScreenIndex); + mWorkspace.postDelayed(startBounceAnimRunnable, + NEW_APPS_ANIMATION_DELAY); } - }, NEW_APPS_PAGE_MOVE_DELAY); - } else { - mWorkspace.postDelayed(startBounceAnimRunnable, NEW_APPS_ANIMATION_DELAY); - } + } + }, NEW_APPS_PAGE_MOVE_DELAY); + } else { + mWorkspace.postDelayed(startBounceAnimRunnable, NEW_APPS_ANIMATION_DELAY); } } workspace.requestLayout(); @@ -2161,11 +2152,8 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } private ValueAnimator createNewAppBounceAnimation(View v, int i) { - ValueAnimator bounceAnim = LauncherAnimUtils.ofPropertyValuesHolder(v, - PropertyValuesHolder.ofFloat(View.ALPHA, 1f), - PropertyValuesHolder.ofFloat(View.SCALE_X, 1f), - PropertyValuesHolder.ofFloat(View.SCALE_Y, 1f)); - bounceAnim.setDuration(InstallShortcutReceiver.NEW_SHORTCUT_BOUNCE_DURATION); + ValueAnimator bounceAnim = new PropertyListBuilder().alpha(1).scale(1).build(v) + .setDuration(InstallShortcutReceiver.NEW_SHORTCUT_BOUNCE_DURATION); bounceAnim.setStartDelay(i * InstallShortcutReceiver.NEW_SHORTCUT_STAGGER_DELAY); bounceAnim.setInterpolator(new OvershootInterpolator(BOUNCE_ANIMATION_TENSION)); return bounceAnim; diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java index 7944ec59b8..ac07e8887f 100644 --- a/src/com/android/launcher3/LauncherAnimUtils.java +++ b/src/com/android/launcher3/LauncherAnimUtils.java @@ -16,8 +16,6 @@ package com.android.launcher3; -import android.animation.ObjectAnimator; -import android.animation.PropertyValuesHolder; import android.graphics.drawable.Drawable; import android.util.Property; import android.view.View; @@ -35,18 +33,6 @@ public class LauncherAnimUtils { // The progress of an animation to all apps must be at least this far along to snap to all apps. public static final float MIN_PROGRESS_TO_ALL_APPS = 0.5f; - public static ObjectAnimator ofPropertyValuesHolder(View target, - PropertyValuesHolder... values) { - return ofPropertyValuesHolder(target, target, values); - } - - public static ObjectAnimator ofPropertyValuesHolder(Object target, - View view, PropertyValuesHolder... values) { - ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(target, values); - new FirstFrameAnimatorHelper(anim, view); - return anim; - } - public static final Property DRAWABLE_ALPHA = new Property(Integer.TYPE, "drawableAlpha") { @Override diff --git a/src/com/android/launcher3/anim/PropertyListBuilder.java b/src/com/android/launcher3/anim/PropertyListBuilder.java index 33e7f66590..acc3b4508a 100644 --- a/src/com/android/launcher3/anim/PropertyListBuilder.java +++ b/src/com/android/launcher3/anim/PropertyListBuilder.java @@ -1,5 +1,6 @@ package com.android.launcher3.anim; +import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.view.View; @@ -44,7 +45,8 @@ public class PropertyListBuilder { return this; } - public PropertyValuesHolder[] build() { - return mProperties.toArray(new PropertyValuesHolder[mProperties.size()]); + public ObjectAnimator build(View view) { + return ObjectAnimator.ofPropertyValuesHolder(view, + mProperties.toArray(new PropertyValuesHolder[mProperties.size()])); } } diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java index 47bbbcb0d3..80077549a0 100644 --- a/src/com/android/launcher3/dragndrop/DragController.java +++ b/src/com/android/launcher3/dragndrop/DragController.java @@ -20,6 +20,7 @@ import static com.android.launcher3.AbstractFloatingView.TYPE_DISCOVERY_BOUNCE; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; import static com.android.launcher3.LauncherState.NORMAL; +import android.animation.ValueAnimator; import android.content.ComponentName; import android.content.res.Resources; import android.graphics.Bitmap; @@ -227,6 +228,12 @@ public class DragController implements DragDriver.EventListener, TouchController } } + public void addFirstFrameAnimationHelper(ValueAnimator anim) { + if (mDragObject != null && mDragObject.dragView != null) { + mDragObject.dragView.mFirstFrameAnimatorHelper.addTo(anim); + } + } + /** * Call this from a drag source view like this: * diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index 998de99a5f..7f30ffa34e 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -50,12 +50,12 @@ import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.ItemInfo; import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.FirstFrameAnimatorHelper; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.ShortcutConfigActivityInfo; @@ -93,6 +93,7 @@ public class DragView extends View { private final Launcher mLauncher; private final DragLayer mDragLayer; @Thunk final DragController mDragController; + final FirstFrameAnimatorHelper mFirstFrameAnimatorHelper; private boolean mHasDrawn = false; @Thunk float mCrossFadeProgress = 0f; private boolean mAnimationCancelled = false; @@ -133,6 +134,7 @@ public class DragView extends View { mLauncher = launcher; mDragLayer = launcher.getDragLayer(); mDragController = launcher.getDragController(); + mFirstFrameAnimatorHelper = new FirstFrameAnimatorHelper(this); final float scale = (bitmap.getWidth() + finalScaleDps) / bitmap.getWidth(); diff --git a/src/com/android/launcher3/notification/NotificationFooterLayout.java b/src/com/android/launcher3/notification/NotificationFooterLayout.java index 3cc9365604..c7de5b0a86 100644 --- a/src/com/android/launcher3/notification/NotificationFooterLayout.java +++ b/src/com/android/launcher3/notification/NotificationFooterLayout.java @@ -156,9 +156,10 @@ public class NotificationFooterLayout extends FrameLayout { Rect fromBounds = sTempRect; firstNotification.getGlobalVisibleRect(fromBounds); float scale = (float) toBounds.height() / fromBounds.height(); - Animator moveAndScaleIcon = ObjectAnimator.ofPropertyValuesHolder(firstNotification, - new PropertyListBuilder().scale(scale).translationY(toBounds.top - fromBounds.top - + (fromBounds.height() * scale - fromBounds.height()) / 2).build()); + Animator moveAndScaleIcon = new PropertyListBuilder().scale(scale) + .translationY(toBounds.top - fromBounds.top + + (fromBounds.height() * scale - fromBounds.height()) / 2) + .build(firstNotification); moveAndScaleIcon.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { -- GitLab From 6edb1b84bf4815619e2417e3796054a372845c98 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 14 Aug 2018 10:27:29 -0700 Subject: [PATCH 0068/1301] Changing Condition to an interface to allow using lambdas Change-Id: Ib7ad6a45d2ce556f843cd3a9767001904707dced --- .../ui/widget/AddConfigWidgetTest.java | 11 ++-- .../ui/widget/RequestPinItemTest.java | 2 +- .../com/android/launcher3/util/Condition.java | 51 ++++++++----------- 3 files changed, 24 insertions(+), 40 deletions(-) diff --git a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java index a5c2e69af7..ee774571ec 100644 --- a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java @@ -126,12 +126,8 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest { assertNotNull(mAppWidgetManager.getAppWidgetInfo(mWidgetId)); } else { // Verify that the widget id is deleted. - assertTrue(Wait.atMost(new Condition() { - @Override - public boolean isTrue() throws Throwable { - return mAppWidgetManager.getAppWidgetInfo(mWidgetId) == null; - } - }, DEFAULT_ACTIVITY_TIMEOUT)); + assertTrue(Wait.atMost(() -> mAppWidgetManager.getAppWidgetInfo(mWidgetId) == null, + DEFAULT_ACTIVITY_TIMEOUT)); } } @@ -145,8 +141,7 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest { /** * Condition for searching widget id */ - private class WidgetSearchCondition extends Condition - implements Workspace.ItemOperator { + private class WidgetSearchCondition implements Condition, Workspace.ItemOperator { @Override public boolean isTrue() throws Throwable { diff --git a/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java b/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java index dcb564a778..02a79b384d 100644 --- a/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java +++ b/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java @@ -200,7 +200,7 @@ public class RequestPinItemTest extends AbstractLauncherUiTest { /** * Condition for for an item */ - private class ItemSearchCondition extends Condition { + private class ItemSearchCondition implements Condition { private final ItemOperator mOp; diff --git a/tests/src/com/android/launcher3/util/Condition.java b/tests/src/com/android/launcher3/util/Condition.java index e9ee67cdb0..78c652a29e 100644 --- a/tests/src/com/android/launcher3/util/Condition.java +++ b/tests/src/com/android/launcher3/util/Condition.java @@ -8,47 +8,36 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -public abstract class Condition { +public interface Condition { - public abstract boolean isTrue() throws Throwable; + boolean isTrue() throws Throwable; /** * Converts the condition to be run on UI thread. */ - public static Condition runOnUiThread(final Condition condition) { + static Condition runOnUiThread(final Condition condition) { final MainThreadExecutor executor = new MainThreadExecutor(); - return new Condition() { - @Override - public boolean isTrue() throws Throwable { - final AtomicBoolean value = new AtomicBoolean(false); - final Throwable[] exceptions = new Throwable[1]; - final CountDownLatch latch = new CountDownLatch(1); - executor.execute(new Runnable() { - @Override - public void run() { - try { - value.set(condition.isTrue()); - } catch (Throwable e) { - exceptions[0] = e; - } - - } - }); - latch.await(1, TimeUnit.SECONDS); - if (exceptions[0] != null) { - throw exceptions[0]; + return () -> { + final AtomicBoolean value = new AtomicBoolean(false); + final Throwable[] exceptions = new Throwable[1]; + final CountDownLatch latch = new CountDownLatch(1); + executor.execute(() -> { + try { + value.set(condition.isTrue()); + } catch (Throwable e) { + exceptions[0] = e; } - return value.get(); + + }); + latch.await(1, TimeUnit.SECONDS); + if (exceptions[0] != null) { + throw exceptions[0]; } + return value.get(); }; } - public static Condition minChildCount(final UiObject2 obj, final int childCount) { - return new Condition() { - @Override - public boolean isTrue() { - return obj.getChildCount() >= childCount; - } - }; + static Condition minChildCount(final UiObject2 obj, final int childCount) { + return () -> obj.getChildCount() >= childCount; } } -- GitLab From dc755e718ded4a3af112b63420ea1060618a2982 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Fri, 10 Aug 2018 20:01:24 -0700 Subject: [PATCH 0069/1301] Started converting Launcher to be gesture-stable All tests keep passing. WorkTabTest.workTabExists was made gesture-stable. There is no need to use TAPL, as the point is not to check answering to gestures, but to check presence of tabs, which is better to do using launcher internal state. (It still fails if run as a part of all tests, presumably, because after Launcher's start, changes in user configuration are not recognized, so I've commented the failing part) Bug: 110103162 Test: Run all tests Change-Id: Ic30b8e8475d16cee3880332f12311a44ddfa26cb --- .../allapps/AllAppsContainerView.java | 20 +++++++ tests/Android.mk | 3 +- .../launcher3/ui/AbstractLauncherUiTest.java | 48 ++++++++++++++-- .../launcher3/ui/AllAppsAppLaunchTest.java | 55 ------------------- .../launcher3/ui/AllAppsIconToHomeTest.java | 6 +- .../launcher3/ui/ShortcutsLaunchTest.java | 8 +-- .../launcher3/ui/ShortcutsToHomeTest.java | 8 +-- .../com/android/launcher3/ui/WorkTabTest.java | 28 +++------- .../ui/widget/AddConfigWidgetTest.java | 12 ++-- .../launcher3/ui/widget/AddWidgetTest.java | 6 +- .../launcher3/ui/widget/BindWidgetTest.java | 16 +++--- .../ui/widget/RequestPinItemTest.java | 10 ++-- 12 files changed, 101 insertions(+), 119 deletions(-) delete mode 100644 tests/src/com/android/launcher3/ui/AllAppsAppLaunchTest.java diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 40cf0f3d07..cf7842a59c 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -390,6 +390,26 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo } } + // Used by tests only + private boolean isDescendantViewVisible(int viewId) { + final View view = findViewById(viewId); + if (view == null) return false; + + if (!view.isShown()) return false; + + return view.getGlobalVisibleRect(new Rect()); + } + + // Used by tests only + public boolean isPersonalTabVisible() { + return isDescendantViewVisible(R.id.tab_personal); + } + + // Used by tests only + public boolean isWorkTabVisible() { + return isDescendantViewVisible(R.id.tab_work); + } + public AlphabeticalAppsList getApps() { return mAH[AdapterHolder.MAIN].appsList; } diff --git a/tests/Android.mk b/tests/Android.mk index 7a7d203994..180fc0cb37 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -17,7 +17,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests -LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 +LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 \ + ub-launcher-aosp-tapl LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_FULL_LIBS_MANIFEST_FILES := $(LOCAL_PATH)/AndroidManifest-common.xml diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index dd91fe86d2..46a6446f24 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -15,6 +15,9 @@ */ package com.android.launcher3.ui; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + import android.app.Instrumentation; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -36,24 +39,30 @@ import android.support.test.uiautomator.Until; import android.util.Log; import android.view.MotionEvent; +import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.LauncherSettings; +import com.android.launcher3.LauncherState; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.R; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.testcomponent.AppWidgetNoConfig; import com.android.launcher3.testcomponent.AppWidgetWithConfig; +import com.android.launcher3.util.Condition; +import com.android.launcher3.util.Wait; +import com.android.launcher3.util.rule.LauncherActivityRule; import org.junit.Before; +import org.junit.Rule; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import java.util.function.Consumer; +import java.util.function.Function; /** * Base class for all instrumentation tests providing various utility methods. @@ -65,19 +74,23 @@ public abstract class AbstractLauncherUiTest { public static final long SHORT_UI_TIMEOUT= 300; public static final long DEFAULT_UI_TIMEOUT = 3000; - public static final long LARGE_UI_TIMEOUT = 10000; public static final long DEFAULT_WORKER_TIMEOUT_SECS = 5; protected MainThreadExecutor mMainThreadExecutor = new MainThreadExecutor(); protected UiDevice mDevice; + protected LauncherInstrumentation mLauncher; protected Context mTargetContext; protected String mTargetPackage; private static final String TAG = "AbstractLauncherUiTest"; + @Rule + public LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); + @Before public void setUp() throws Exception { mDevice = UiDevice.getInstance(getInstrumentation()); + mLauncher = new LauncherInstrumentation(mDevice); mTargetContext = InstrumentationRegistry.getTargetContext(); mTargetPackage = mTargetContext.getPackageName(); } @@ -236,6 +249,33 @@ public abstract class AbstractLauncherUiTest { } } + protected T getFromLauncher(Function f) { + return getOnUiThread(() -> f.apply(mActivityMonitor.getActivity())); + } + + protected void executeOnLauncher(Consumer f) { + getFromLauncher(launcher -> { + f.accept(launcher); + return null; + }); + } + + // Cannot be used between a Tapl call injecting a gesture and a tapl call expecting the + // results of that gesture because the wait can hide flakeness. + protected boolean waitForState(LauncherState state) { + return waitForLauncherCondition(launcher -> launcher.getStateManager().getState() == state); + } + + // Cannot be used after injecting any gesture using Tapl because this can hide flakiness. + protected boolean waitForLauncherCondition(Function condition) { + return Wait.atMost(new Condition() { + @Override + public boolean isTrue() { + return getFromLauncher(condition); + } + }, DEFAULT_ACTIVITY_TIMEOUT); + } + /** * Finds a widget provider which can fit on the home screen. * @param hasConfigureScreen if true, a provider with a config screen is returned. diff --git a/tests/src/com/android/launcher3/ui/AllAppsAppLaunchTest.java b/tests/src/com/android/launcher3/ui/AllAppsAppLaunchTest.java deleted file mode 100644 index b95a850ec1..0000000000 --- a/tests/src/com/android/launcher3/ui/AllAppsAppLaunchTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.android.launcher3.ui; - -import android.content.pm.LauncherActivityInfo; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; - -import com.android.launcher3.util.Condition; -import com.android.launcher3.util.Wait; -import com.android.launcher3.util.rule.LauncherActivityRule; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.assertTrue; - -/** - * Test for verifying apps is launched from all-apps - */ -@LargeTest -@RunWith(AndroidJUnit4.class) -public class AllAppsAppLaunchTest extends AbstractLauncherUiTest { - - @Rule public LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); - - @Test - public void testAppLauncher_portrait() throws Exception { - lockRotation(true); - performTest(); - } - - @Test - public void testAppLauncher_landscape() throws Exception { - lockRotation(false); - performTest(); - } - - private void performTest() throws Exception { - mActivityMonitor.startLauncher(); - - LauncherActivityInfo testApp = getChromeApp(); - - // Open all apps and wait for load complete - final UiObject2 appsContainer = openAllApps(); - assertTrue(Wait.atMost(Condition.minChildCount(appsContainer, 2), DEFAULT_UI_TIMEOUT)); - - // Open app and verify app launched - scrollAndFind(appsContainer, By.text(testApp.getLabel().toString())).click(); - assertTrue(mDevice.wait(Until.hasObject(By.pkg( - testApp.getComponentName().getPackageName()).depth(0)), DEFAULT_UI_TIMEOUT)); - } -} diff --git a/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java b/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java index 00f30ada9d..8b9c58400f 100644 --- a/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java +++ b/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java @@ -1,5 +1,7 @@ package com.android.launcher3.ui; +import static org.junit.Assert.assertTrue; + import android.content.pm.LauncherActivityInfo; import android.support.test.filters.LargeTest; import android.support.test.runner.AndroidJUnit4; @@ -9,15 +11,12 @@ import android.support.test.uiautomator.Until; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; -import com.android.launcher3.util.rule.LauncherActivityRule; import com.android.launcher3.util.rule.ShellCommandRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.assertTrue; - /** * Test for dragging an icon from all-apps to homescreen. */ @@ -25,7 +24,6 @@ import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) public class AllAppsIconToHomeTest extends AbstractLauncherUiTest { - @Rule public LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); @Rule public ShellCommandRule mDefaultLauncherRule = ShellCommandRule.setDefaultLauncher(); @Test diff --git a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java index 69f6c8780d..f913470370 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java @@ -1,5 +1,8 @@ package com.android.launcher3.ui; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import android.content.pm.LauncherActivityInfo; import android.graphics.Point; import android.support.test.filters.LargeTest; @@ -12,16 +15,12 @@ import android.view.MotionEvent; import com.android.launcher3.R; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; -import com.android.launcher3.util.rule.LauncherActivityRule; import com.android.launcher3.util.rule.ShellCommandRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - /** * Test for verifying that shortcuts are shown and can be launched after long pressing an app */ @@ -29,7 +28,6 @@ import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) public class ShortcutsLaunchTest extends AbstractLauncherUiTest { - @Rule public LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); @Rule public ShellCommandRule mDefaultLauncherRule = ShellCommandRule.setDefaultLauncher(); @Test diff --git a/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java b/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java index fad06a6986..4f5c1137b3 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java @@ -1,5 +1,8 @@ package com.android.launcher3.ui; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import android.content.pm.LauncherActivityInfo; import android.graphics.Point; import android.support.test.filters.LargeTest; @@ -12,16 +15,12 @@ import android.view.MotionEvent; import com.android.launcher3.R; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; -import com.android.launcher3.util.rule.LauncherActivityRule; import com.android.launcher3.util.rule.ShellCommandRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - /** * Test for dragging a deep shortcut to the home screen. */ @@ -29,7 +28,6 @@ import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) public class ShortcutsToHomeTest extends AbstractLauncherUiTest { - @Rule public LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); @Rule public ShellCommandRule mDefaultLauncherRule = ShellCommandRule.setDefaultLauncher(); @Test diff --git a/tests/src/com/android/launcher3/ui/WorkTabTest.java b/tests/src/com/android/launcher3/ui/WorkTabTest.java index 62444341a1..2f867f366a 100644 --- a/tests/src/com/android/launcher3/ui/WorkTabTest.java +++ b/tests/src/com/android/launcher3/ui/WorkTabTest.java @@ -15,15 +15,13 @@ */ package com.android.launcher3.ui; +import static com.android.launcher3.LauncherState.ALL_APPS; + +import static org.junit.Assert.assertTrue; + import android.support.test.filters.LargeTest; import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; -import com.android.launcher3.R; -import com.android.launcher3.util.Condition; -import com.android.launcher3.util.Wait; -import com.android.launcher3.util.rule.LauncherActivityRule; import com.android.launcher3.util.rule.ShellCommandRule; import org.junit.After; @@ -32,13 +30,9 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.assertTrue; - @LargeTest @RunWith(AndroidJUnit4.class) public class WorkTabTest extends AbstractLauncherUiTest { - @Rule - public LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); @Rule public ShellCommandRule mDefaultLauncherRule = ShellCommandRule.setDefaultLauncher(); @@ -66,17 +60,13 @@ public class WorkTabTest extends AbstractLauncherUiTest { public void workTabExists() { mActivityMonitor.startLauncher(); - // Open all apps and wait for load complete - final UiObject2 appsContainer = openAllApps(); - assertTrue(Wait.atMost(Condition.minChildCount(appsContainer, 2), - LARGE_UI_TIMEOUT)); + executeOnLauncher(launcher -> launcher.getStateManager().goToState(ALL_APPS)); /* - assertTrue("Personal tab is missing", - mDevice.wait(Until.hasObject(getSelectorForId(R.id.tab_personal)), - LARGE_UI_TIMEOUT)); - assertTrue("Work tab is missing", - mDevice.wait(Until.hasObject(getSelectorForId(R.id.tab_work)), LARGE_UI_TIMEOUT)); + assertTrue("Personal tab is missing", waitForLauncherCondition( + launcher -> launcher.getAppsView().isPersonalTabVisible())); + assertTrue("Work tab is missing", waitForLauncherCondition( + launcher -> launcher.getAppsView().isWorkTabVisible())); */ } } \ No newline at end of file diff --git a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java index a5c2e69af7..44cdbaf7f7 100644 --- a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java @@ -15,6 +15,11 @@ */ package com.android.launcher3.ui.widget; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertTrue; + import android.appwidget.AppWidgetManager; import android.content.Intent; import android.support.test.filters.LargeTest; @@ -31,7 +36,6 @@ import com.android.launcher3.testcomponent.WidgetConfigActivity; import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; -import com.android.launcher3.util.rule.LauncherActivityRule; import com.android.launcher3.util.rule.ShellCommandRule; import com.android.launcher3.widget.WidgetCell; @@ -40,11 +44,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertTrue; - /** * Test to verify widget configuration is properly shown. */ @@ -52,7 +51,6 @@ import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) public class AddConfigWidgetTest extends AbstractLauncherUiTest { - @Rule public LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); @Rule public ShellCommandRule mGrantWidgetRule = ShellCommandRule.grandWidgetBind(); private LauncherAppWidgetProviderInfo mWidgetInfo; diff --git a/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java index 19f7db72bf..d89f26e8a2 100644 --- a/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java @@ -15,6 +15,8 @@ */ package com.android.launcher3.ui.widget; +import static org.junit.Assert.assertTrue; + import android.support.test.filters.LargeTest; import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.By; @@ -28,7 +30,6 @@ import com.android.launcher3.Workspace.ItemOperator; import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; -import com.android.launcher3.util.rule.LauncherActivityRule; import com.android.launcher3.util.rule.ShellCommandRule; import com.android.launcher3.widget.WidgetCell; @@ -36,8 +37,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.assertTrue; - /** * Test to add widget from widget tray */ @@ -45,7 +44,6 @@ import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) public class AddWidgetTest extends AbstractLauncherUiTest { - @Rule public LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); @Rule public ShellCommandRule mGrantWidgetRule = ShellCommandRule.grandWidgetBind(); @Test diff --git a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java index b55711934f..c8c38965c1 100644 --- a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java @@ -15,6 +15,11 @@ */ package com.android.launcher3.ui.widget; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.content.ComponentName; @@ -30,21 +35,20 @@ import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.UiSelector; import com.android.launcher3.LauncherAppWidgetHost; -import com.android.launcher3.widget.LauncherAppWidgetHostView; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; -import com.android.launcher3.widget.PendingAppWidgetHostView; import com.android.launcher3.Workspace; import com.android.launcher3.compat.AppWidgetManagerCompat; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.util.ContentWriter; import com.android.launcher3.util.LooperExecutor; -import com.android.launcher3.util.rule.LauncherActivityRule; import com.android.launcher3.util.rule.ShellCommandRule; +import com.android.launcher3.widget.LauncherAppWidgetHostView; import com.android.launcher3.widget.PendingAddWidgetInfo; +import com.android.launcher3.widget.PendingAppWidgetHostView; import com.android.launcher3.widget.WidgetHostViewLoader; import org.junit.After; @@ -58,11 +62,6 @@ import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - /** * Tests for bind widget flow. * @@ -72,7 +71,6 @@ import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) public class BindWidgetTest extends AbstractLauncherUiTest { - @Rule public LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); @Rule public ShellCommandRule mGrantWidgetRule = ShellCommandRule.grandWidgetBind(); private ContentResolver mResolver; diff --git a/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java b/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java index dcb564a778..0022d1996e 100644 --- a/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java +++ b/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java @@ -15,6 +15,10 @@ */ package com.android.launcher3.ui.widget; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertTrue; + import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.content.Intent; @@ -40,7 +44,6 @@ import com.android.launcher3.testcomponent.RequestPinItemActivity; import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; -import com.android.launcher3.util.rule.LauncherActivityRule; import com.android.launcher3.util.rule.ShellCommandRule; import com.android.launcher3.widget.WidgetCell; @@ -52,10 +55,6 @@ import org.junit.runner.RunWith; import java.util.UUID; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertTrue; - /** * Test to verify pin item request flow. */ @@ -63,7 +62,6 @@ import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) public class RequestPinItemTest extends AbstractLauncherUiTest { - @Rule public LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); @Rule public ShellCommandRule mGrantWidgetRule = ShellCommandRule.grandWidgetBind(); @Rule public ShellCommandRule mDefaultLauncherRule = ShellCommandRule.setDefaultLauncher(); -- GitLab From 7debc53f9377398ffa7eb53d473dff997098a40c Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 13 Aug 2018 16:07:28 -0700 Subject: [PATCH 0070/1301] Skip logic to find the dominant color when loading recent task icons - Also move some allocations in ColorExtractor into thread locals to reduce allocations Bug: 78777731 Change-Id: I8819106d476a9af02e864135a2f44b55fe9219cd --- .../quickstep/NormalizedIconLoader.java | 8 ++++- .../com/android/quickstep/RecentsModel.java | 4 ++- .../launcher3/graphics/BitmapInfo.java | 8 ++++- .../launcher3/graphics/ColorExtractor.java | 30 ++++++++++++++----- .../launcher3/graphics/LauncherIcons.java | 16 ++++++++-- .../dynamicui/WallpaperManagerCompatVL.java | 7 +++-- 6 files changed, 58 insertions(+), 15 deletions(-) diff --git a/quickstep/src/com/android/quickstep/NormalizedIconLoader.java b/quickstep/src/com/android/quickstep/NormalizedIconLoader.java index f875bb786e..a4a2e5690b 100644 --- a/quickstep/src/com/android/quickstep/NormalizedIconLoader.java +++ b/quickstep/src/com/android/quickstep/NormalizedIconLoader.java @@ -42,12 +42,15 @@ public class NormalizedIconLoader extends IconLoader { private final SparseArray mDefaultIcons = new SparseArray<>(); private final DrawableFactory mDrawableFactory; + private final boolean mDisableColorExtraction; private LauncherIcons mLauncherIcons; public NormalizedIconLoader(Context context, TaskKeyLruCache iconCache, - LruCache activityInfoCache) { + LruCache activityInfoCache, + boolean disableColorExtraction) { super(context, iconCache, activityInfoCache); mDrawableFactory = DrawableFactory.get(context); + mDisableColorExtraction = disableColorExtraction; } @Override @@ -74,6 +77,9 @@ public class NormalizedIconLoader extends IconLoader { int primaryColor, boolean isInstantApp) { if (mLauncherIcons == null) { mLauncherIcons = LauncherIcons.obtain(mContext); + if (mDisableColorExtraction) { + mLauncherIcons.disableColorExtraction(); + } } mLauncherIcons.setWrapperBackgroundColor(primaryColor); diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index fa4e016db4..a9b7326391 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -94,7 +94,9 @@ public class RecentsModel extends TaskStackChangeListener { protected IconLoader createNewIconLoader(Context context, TaskKeyLruCache iconCache, LruCache activityInfoCache) { - return new NormalizedIconLoader(context, iconCache, activityInfoCache); + // Disable finding the dominant color since we don't need to use it + return new NormalizedIconLoader(context, iconCache, activityInfoCache, + true /* disableColorExtraction */); } }; mRecentsTaskLoader.startLoader(mContext); diff --git a/src/com/android/launcher3/graphics/BitmapInfo.java b/src/com/android/launcher3/graphics/BitmapInfo.java index ab906e2f09..c905a78e53 100644 --- a/src/com/android/launcher3/graphics/BitmapInfo.java +++ b/src/com/android/launcher3/graphics/BitmapInfo.java @@ -35,9 +35,15 @@ public class BitmapInfo { } public static BitmapInfo fromBitmap(Bitmap bitmap) { + return fromBitmap(bitmap, null); + } + + public static BitmapInfo fromBitmap(Bitmap bitmap, ColorExtractor dominantColorExtractor) { BitmapInfo info = new BitmapInfo(); info.icon = bitmap; - info.color = ColorExtractor.findDominantColorByHue(bitmap); + info.color = dominantColorExtractor != null + ? dominantColorExtractor.findDominantColorByHue(bitmap) + : 0; return info; } } diff --git a/src/com/android/launcher3/graphics/ColorExtractor.java b/src/com/android/launcher3/graphics/ColorExtractor.java index e9d72b7931..da5da9cea6 100644 --- a/src/com/android/launcher3/graphics/ColorExtractor.java +++ b/src/com/android/launcher3/graphics/ColorExtractor.java @@ -18,22 +18,32 @@ package com.android.launcher3.graphics; import android.graphics.Bitmap; import android.graphics.Color; import android.util.SparseArray; +import java.util.Arrays; /** * Utility class for extracting colors from a bitmap. */ public class ColorExtractor { - public static int findDominantColorByHue(Bitmap bitmap) { - return findDominantColorByHue(bitmap, 20); + private final int NUM_SAMPLES = 20; + private final float[] mTmpHsv = new float[3]; + private final float[] mTmpHueScoreHistogram = new float[360]; + private final int[] mTmpPixels = new int[NUM_SAMPLES]; + private final SparseArray mTmpRgbScores = new SparseArray<>(); + + /** + * This picks a dominant color, looking for high-saturation, high-value, repeated hues. + * @param bitmap The bitmap to scan + */ + public int findDominantColorByHue(Bitmap bitmap) { + return findDominantColorByHue(bitmap, NUM_SAMPLES); } /** * This picks a dominant color, looking for high-saturation, high-value, repeated hues. * @param bitmap The bitmap to scan - * @param samples The approximate max number of samples to use. */ - public static int findDominantColorByHue(Bitmap bitmap, int samples) { + public int findDominantColorByHue(Bitmap bitmap, int samples) { final int height = bitmap.getHeight(); final int width = bitmap.getWidth(); int sampleStride = (int) Math.sqrt((height * width) / samples); @@ -42,15 +52,18 @@ public class ColorExtractor { } // This is an out-param, for getting the hsv values for an rgb - float[] hsv = new float[3]; + float[] hsv = mTmpHsv; + Arrays.fill(hsv, 0); // First get the best hue, by creating a histogram over 360 hue buckets, // where each pixel contributes a score weighted by saturation, value, and alpha. - float[] hueScoreHistogram = new float[360]; + float[] hueScoreHistogram = mTmpHueScoreHistogram; + Arrays.fill(hueScoreHistogram, 0); float highScore = -1; int bestHue = -1; - int[] pixels = new int[samples]; + int[] pixels = mTmpPixels; + Arrays.fill(pixels, 0); int pixelCount = 0; for (int y = 0; y < height; y += sampleStride) { @@ -82,7 +95,8 @@ public class ColorExtractor { } } - SparseArray rgbScores = new SparseArray<>(); + SparseArray rgbScores = mTmpRgbScores; + rgbScores.clear(); int bestColor = 0xff000000; highScore = -1; // Go back over the RGB colors that match the winning hue, diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 333fe5907c..0167a1d9c4 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -90,6 +90,7 @@ public class LauncherIcons implements AutoCloseable { synchronized (sPoolSync) { // Clear any temporary state variables mWrapperBackgroundColor = DEFAULT_WRAPPER_BACKGROUND; + mDisableColorExtractor = false; next = sPool; sPool = this; @@ -105,6 +106,8 @@ public class LauncherIcons implements AutoCloseable { private final Context mContext; private final Canvas mCanvas; private final PackageManager mPm; + private final ColorExtractor mColorExtractor; + private boolean mDisableColorExtractor; private final int mFillResIconDpi; private final int mIconBitmapSize; @@ -121,6 +124,7 @@ public class LauncherIcons implements AutoCloseable { private LauncherIcons(Context context) { mContext = context.getApplicationContext(); mPm = mContext.getPackageManager(); + mColorExtractor = new ColorExtractor(); InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext); mFillResIconDpi = idp.fillResIconDpi; @@ -196,7 +200,7 @@ public class LauncherIcons implements AutoCloseable { * The bitmap is also visually normalized with other icons. */ public BitmapInfo createBadgedIconBitmap(Drawable icon, UserHandle user, int iconAppTargetSdk, - boolean isInstantApp, float [] scale) { + boolean isInstantApp, float[] scale) { if (scale == null) { scale = new float[1]; } @@ -223,7 +227,7 @@ public class LauncherIcons implements AutoCloseable { } else { result = bitmap; } - return BitmapInfo.fromBitmap(result); + return BitmapInfo.fromBitmap(result, mDisableColorExtractor ? null : mColorExtractor); } /** @@ -245,6 +249,14 @@ public class LauncherIcons implements AutoCloseable { mWrapperBackgroundColor = (Color.alpha(color) < 255) ? DEFAULT_WRAPPER_BACKGROUND : color; } + /** + * Disables the dominant color extraction for all icons loaded through this session (until + * this instance is recycled). + */ + public void disableColorExtraction() { + mDisableColorExtractor = true; + } + private Drawable normalizeAndWrapToAdaptiveIcon(Drawable icon, int iconAppTargetSdk, RectF outIconBounds, float[] outScale) { float scale = 1f; diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVL.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVL.java index 4a8bbbd5af..7529f17f46 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVL.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVL.java @@ -18,7 +18,6 @@ package com.android.launcher3.uioverrides.dynamicui; import static android.app.WallpaperManager.FLAG_SYSTEM; import static com.android.launcher3.Utilities.getDevicePrefs; -import static com.android.launcher3.graphics.ColorExtractor.findDominantColorByHue; import android.app.WallpaperInfo; import android.app.WallpaperManager; @@ -47,6 +46,7 @@ import android.util.Log; import android.util.Pair; import com.android.launcher3.Utilities; +import com.android.launcher3.graphics.ColorExtractor; import java.io.IOException; import java.util.ArrayList; @@ -169,6 +169,7 @@ public class WallpaperManagerCompatVL extends WallpaperManagerCompat { private HandlerThread mWorkerThread; private Handler mWorkerHandler; + private ColorExtractor mColorExtractor; @Override public void onCreate() { @@ -176,6 +177,7 @@ public class WallpaperManagerCompatVL extends WallpaperManagerCompat { mWorkerThread = new HandlerThread("ColorExtractionService"); mWorkerThread.start(); mWorkerHandler = new Handler(mWorkerThread.getLooper()); + mColorExtractor = new ColorExtractor(); } @Override @@ -258,7 +260,8 @@ public class WallpaperManagerCompatVL extends WallpaperManagerCompat { String value = VERSION_PREFIX + wallpaperId; if (bitmap != null) { - int color = findDominantColorByHue(bitmap, MAX_WALLPAPER_EXTRACTION_AREA); + int color = mColorExtractor.findDominantColorByHue(bitmap, + MAX_WALLPAPER_EXTRACTION_AREA); value += "," + color; } -- GitLab From eca08a10bd86b9ebea5a883bd0444057e4579c0c Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Sat, 11 Aug 2018 15:53:40 -0700 Subject: [PATCH 0071/1301] Respect night mode flag on Q and beyond Test: manual Change-Id: I01c51d02e787557717c12567adc8276943dbd1bc Fixes: 110758454 --- .../launcher3/BaseDraggingActivity.java | 24 ++++++++++++++++++- src/com/android/launcher3/Utilities.java | 4 ++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java index d6635dc136..f5fbf80dcd 100644 --- a/src/com/android/launcher3/BaseDraggingActivity.java +++ b/src/com/android/launcher3/BaseDraggingActivity.java @@ -19,7 +19,9 @@ package com.android.launcher3; import android.app.ActivityOptions; import android.content.ActivityNotFoundException; import android.content.Intent; +import android.content.res.Configuration; import android.graphics.Rect; +import android.os.Build; import android.os.Bundle; import android.os.Process; import android.os.StrictMode; @@ -81,13 +83,33 @@ public abstract class BaseDraggingActivity extends BaseActivity @Override public void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo) { + updateTheme(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + updateTheme(); + } + + private void updateTheme() { + WallpaperColorInfo wallpaperColorInfo = WallpaperColorInfo.getInstance(this); if (mThemeRes != getThemeRes(wallpaperColorInfo)) { recreate(); } } protected int getThemeRes(WallpaperColorInfo wallpaperColorInfo) { - if (wallpaperColorInfo.isDark()) { + boolean darkTheme; + if (Utilities.ATLEAST_Q) { + Configuration configuration = getResources().getConfiguration(); + int nightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; + darkTheme = nightMode == Configuration.UI_MODE_NIGHT_YES; + } else { + darkTheme = wallpaperColorInfo.isDark(); + } + + if (darkTheme) { return wallpaperColorInfo.supportsDarkText() ? R.style.AppTheme_Dark_DarkText : R.style.AppTheme_Dark; } else { diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index a8513185e5..1c12464346 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -83,6 +83,10 @@ public final class Utilities { private static final Matrix sMatrix = new Matrix(); private static final Matrix sInverseMatrix = new Matrix(); + public static final boolean ATLEAST_Q = Build.VERSION.CODENAME.length() == 1 + && Build.VERSION.CODENAME.charAt(0) >= 'Q' + && Build.VERSION.CODENAME.charAt(0) <= 'Z'; + public static final boolean ATLEAST_P = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P; -- GitLab From d230307a958189041a7d5616e89fb2966011b55e Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 14 Aug 2018 15:21:45 -0700 Subject: [PATCH 0072/1301] Migrating to android-x Change-Id: I9a774152d13a541e8496dd84f2469bfed407f86d --- Android.mk | 5 ++--- build.gradle | 17 ++++++++------- proguard.flags | 2 +- .../launcher3/LauncherAnimationRunner.java | 8 ++++--- .../quickstep/ActivityControlHelper.java | 5 +++-- .../quickstep/OverviewInteractionState.java | 3 ++- .../com/android/quickstep/RecentsModel.java | 3 ++- .../android/quickstep/TaskOverlayFactory.java | 3 ++- .../com/android/quickstep/TouchConsumer.java | 3 ++- .../WindowTransformSwipeHandler.java | 8 +++---- .../quickstep/util/ClipAnimationHelper.java | 3 ++- .../android/quickstep/util/LayoutUtils.java | 5 +++-- .../com/android/quickstep/views/IconView.java | 5 ++++- .../android/quickstep/views/RecentsView.java | 3 ++- .../quickstep/views/ShelfScrimView.java | 3 ++- .../launcher3/AbstractFloatingView.java | 3 ++- src/com/android/launcher3/AllAppsList.java | 5 +++-- .../launcher3/AppWidgetsRestoredReceiver.java | 3 ++- src/com/android/launcher3/BaseActivity.java | 3 ++- .../android/launcher3/BaseRecyclerView.java | 3 ++- src/com/android/launcher3/BubbleTextView.java | 3 ++- src/com/android/launcher3/CellLayout.java | 6 +++--- src/com/android/launcher3/IconCache.java | 5 +++-- .../launcher3/InvariantDeviceProfile.java | 3 ++- src/com/android/launcher3/Launcher.java | 3 ++- src/com/android/launcher3/LauncherModel.java | 3 ++- .../launcher3/LauncherStateManager.java | 4 +++- src/com/android/launcher3/PromiseAppInfo.java | 3 ++- .../launcher3/WidgetPreviewLoader.java | 3 ++- .../DragAndDropAccessibilityDelegate.java | 5 +++-- .../WorkspaceAccessibilityHelper.java | 3 ++- .../allapps/AllAppsContainerView.java | 13 ++++++------ .../allapps/AllAppsFastScrollHelper.java | 4 ++-- .../launcher3/allapps/AllAppsGridAdapter.java | 11 +++++----- .../allapps/AllAppsRecyclerView.java | 3 ++- .../launcher3/allapps/FloatingHeaderView.java | 7 ++++--- .../allapps/PersonalWorkSlidingTabStrip.java | 5 +++-- .../search/AllAppsSearchBarController.java | 2 -- .../compat/AppWidgetManagerCompat.java | 3 ++- .../compat/AppWidgetManagerCompatVL.java | 3 ++- .../compat/AppWidgetManagerCompatVO.java | 3 ++- .../launcher3/compat/LauncherAppsCompat.java | 5 ++++- .../compat/LauncherAppsCompatVL.java | 7 +++++-- .../compat/LauncherAppsCompatVO.java | 3 ++- .../compat/PackageInstallerCompat.java | 3 ++- .../android/launcher3/dragndrop/DragView.java | 8 +++---- .../folder/FolderAnimationManager.java | 3 ++- .../android/launcher3/folder/FolderIcon.java | 4 ++-- .../launcher3/folder/PreviewBackground.java | 3 ++- .../launcher3/folder/PreviewItemManager.java | 11 +++++----- .../launcher3/graphics/ColorScrim.java | 3 ++- .../launcher3/graphics/DrawableFactory.java | 4 +++- .../launcher3/graphics/IconNormalizer.java | 7 ++++--- .../launcher3/graphics/IconPalette.java | 3 ++- .../launcher3/graphics/IconShapeOverride.java | 3 ++- .../launcher3/graphics/LauncherIcons.java | 3 ++- .../launcher3/graphics/ShadowGenerator.java | 3 ++- .../launcher3/graphics/TriangleShape.java | 3 ++- .../graphics/WorkspaceAndHotseatScrim.java | 3 ++- .../keyboard/FocusedItemDecorator.java | 7 ++++--- .../logging/UserEventDispatcher.java | 3 ++- .../android/launcher3/model/ModelPreload.java | 3 ++- .../android/launcher3/model/WidgetsModel.java | 3 ++- .../notification/NotificationKeyData.java | 3 ++- .../notification/NotificationListener.java | 3 ++- .../launcher3/popup/PopupDataProvider.java | 3 ++- .../launcher3/popup/PopupPopulator.java | 5 +++-- .../launcher3/touch/SwipeDetector.java | 5 +++-- .../launcher3/util/ListViewHighlighter.java | 3 ++- .../views/DoubleShadowBubbleTextView.java | 3 ++- .../launcher3/views/OptionsPopupView.java | 3 ++- .../views/RecyclerViewFastScroller.java | 4 ++-- .../android/launcher3/views/ScrimView.java | 18 +++++++++------- .../launcher3/views/SpringRelativeLayout.java | 21 ++++++++++--------- .../launcher3/widget/WidgetsDiffReporter.java | 3 ++- .../launcher3/widget/WidgetsFullSheet.java | 3 ++- .../launcher3/widget/WidgetsListAdapter.java | 7 +++---- .../launcher3/widget/WidgetsRecyclerView.java | 7 ++++--- .../widget/WidgetsRowViewHolder.java | 3 ++- .../dynamicui/ColorExtractionAlgorithm.java | 7 ++++--- .../dynamicui/WallpaperManagerCompat.java | 3 ++- .../dynamicui/WallpaperManagerCompatVL.java | 3 ++- .../WallpaperManagerCompatVOMR1.java | 3 ++- tests/Android.mk | 13 +++++++++--- .../model/BaseModelUpdateTaskTestCase.java | 3 ++- .../widget/WidgetsListAdapterTest.java | 11 +++++----- .../com/android/launcher3/tapl/AllApps.java | 3 ++- .../launcher3/tapl/AllAppsFromOverview.java | 3 ++- .../tapl/com/android/launcher3/tapl/Home.java | 3 ++- .../tapl/LauncherInstrumentation.java | 5 +++-- .../com/android/launcher3/tapl/Overview.java | 3 ++- .../com/android/launcher3/tapl/Workspace.java | 5 +++-- 92 files changed, 268 insertions(+), 174 deletions(-) diff --git a/Android.mk b/Android.mk index 2a32857488..ca53fa7adb 100644 --- a/Android.mk +++ b/Android.mk @@ -37,9 +37,8 @@ LOCAL_AAPT2_ONLY := true LOCAL_MODULE_TAGS := optional LOCAL_STATIC_ANDROID_LIBRARIES := \ - android-support-v4 \ - android-support-v7-recyclerview \ - android-support-dynamic-animation + androidx.recyclerview_recyclerview \ + androidx.dynamicanimation_dynamicanimation LOCAL_SRC_FILES := \ $(call all-proto-files-under, protos) \ diff --git a/build.gradle b/build.gradle index 4ae6600ee3..dcb5b81c34 100644 --- a/build.gradle +++ b/build.gradle @@ -4,12 +4,12 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.0-alpha12' - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.3' + classpath 'com.android.tools.build:gradle:3.2.0-beta05' + classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6' } } -final String SUPPORT_LIBS_VERSION = '28.0.0-SNAPSHOT' +final String SUPPORT_LIBS_VERSION = '1.0.0-alpha1' apply plugin: 'com.android.application' apply plugin: 'com.google.protobuf' @@ -57,6 +57,8 @@ android { dimension "default" applicationId 'com.android.launcher3' testApplicationId 'com.android.launcher3.tests' + + minSdkVersion 28 } } @@ -84,7 +86,7 @@ android { androidTest { res.srcDirs = ['tests/res'] - java.srcDirs = ['tests/src'] + java.srcDirs = ['tests/src', 'tests/tapl'] manifest.srcFile "tests/AndroidManifest-common.xml" } @@ -118,9 +120,8 @@ repositories { } dependencies { - implementation "com.android.support:support-v4:${SUPPORT_LIBS_VERSION}" - implementation "com.android.support:support-dynamic-animation:${SUPPORT_LIBS_VERSION}" - implementation "com.android.support:recyclerview-v7:${SUPPORT_LIBS_VERSION}" + implementation "androidx.dynamicanimation:dynamicanimation:${SUPPORT_LIBS_VERSION}" + implementation "androidx.recyclerview:recyclerview:${SUPPORT_LIBS_VERSION}" implementation 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7' quickstepImplementation fileTree(dir: "quickstep/libs", include: 'sysui_shared.jar') @@ -132,7 +133,7 @@ dependencies { androidTestImplementation 'com.android.support.test:runner:1.0.0' androidTestImplementation 'com.android.support.test:rules:1.0.0' androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' - androidTestImplementation "com.android.support:support-annotations:${SUPPORT_LIBS_VERSION}" + androidTestImplementation "androidx.annotation:annotation:${SUPPORT_LIBS_VERSION}" } protobuf { diff --git a/proguard.flags b/proguard.flags index ddae07e0d9..a312b9103c 100644 --- a/proguard.flags +++ b/proguard.flags @@ -95,7 +95,7 @@ # next row when focus is on the last item of last row when using a RecyclerView # Keep optimized and shrunk proguard to prevent issues like this when using # support jar. --keep class android.support.v7.widget.RecyclerView { *; } +-keep class androidx.recyclerview.widget.RecyclerView { *; } # Preference fragments -keep class ** extends android.preference.PreferenceFragment { diff --git a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java index e34631042d..78f6ffa88c 100644 --- a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java +++ b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java @@ -17,7 +17,8 @@ package com.android.launcher3; import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; import static com.android.launcher3.Utilities.postAsyncCallback; -import static com.android.systemui.shared.recents.utilities.Utilities.postAtFrontOfQueueAsynchronously; +import static com.android.systemui.shared.recents.utilities.Utilities + .postAtFrontOfQueueAsynchronously; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -25,12 +26,13 @@ import android.animation.AnimatorSet; import android.annotation.TargetApi; import android.os.Build; import android.os.Handler; -import android.support.annotation.BinderThread; -import android.support.annotation.UiThread; import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import androidx.annotation.BinderThread; +import androidx.annotation.UiThread; + @TargetApi(Build.VERSION_CODES.P) public abstract class LauncherAnimationRunner implements RemoteAnimationRunnerCompat { diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index bb5bf6e1ca..185080eef3 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -42,8 +42,6 @@ import android.graphics.Rect; import android.os.Build; import android.os.Handler; import android.os.Looper; -import android.support.annotation.Nullable; -import android.support.annotation.UiThread; import android.view.View; import com.android.launcher3.BaseDraggingActivity; @@ -77,6 +75,9 @@ import java.util.Objects; import java.util.function.BiPredicate; import java.util.function.Consumer; +import androidx.annotation.Nullable; +import androidx.annotation.UiThread; + /** * Utility class which abstracts out the logical differences between Launcher and RecentsActivity. */ diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index 224c8a7080..d71c08ad52 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -27,7 +27,6 @@ import android.os.Handler; import android.os.Message; import android.os.RemoteException; import android.provider.Settings; -import android.support.annotation.WorkerThread; import android.util.Log; import com.android.launcher3.Utilities; @@ -36,6 +35,8 @@ import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.UiThreadHelper; import com.android.systemui.shared.recents.ISystemUiProxy; +import androidx.annotation.WorkerThread; + /** * Sets overview interaction flags, such as: * diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index a9b7326391..196f0cc62c 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -29,7 +29,6 @@ import android.os.Build; import android.os.Bundle; import android.os.RemoteException; import android.os.UserHandle; -import android.support.annotation.WorkerThread; import android.util.Log; import android.util.LruCache; import android.util.SparseArray; @@ -52,6 +51,8 @@ import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; import java.util.function.Consumer; +import androidx.annotation.WorkerThread; + /** * Singleton class to load and manage recents model. */ diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java index c272b1a7ef..72895167f8 100644 --- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java +++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java @@ -18,7 +18,6 @@ package com.android.quickstep; import android.content.Context; import android.graphics.Matrix; -import android.support.annotation.AnyThread; import android.view.View; import com.android.launcher3.R; @@ -27,6 +26,8 @@ import com.android.launcher3.util.ResourceBasedOverride; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; +import androidx.annotation.AnyThread; + /** * Factory class to create and add an overlays on the TaskView */ diff --git a/quickstep/src/com/android/quickstep/TouchConsumer.java b/quickstep/src/com/android/quickstep/TouchConsumer.java index 42e9aee1bf..646fc57f25 100644 --- a/quickstep/src/com/android/quickstep/TouchConsumer.java +++ b/quickstep/src/com/android/quickstep/TouchConsumer.java @@ -17,7 +17,6 @@ package com.android.quickstep; import android.annotation.TargetApi; import android.os.Build; -import android.support.annotation.IntDef; import android.view.Choreographer; import android.view.MotionEvent; @@ -25,6 +24,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.function.Consumer; +import androidx.annotation.IntDef; + @TargetApi(Build.VERSION_CODES.O) @FunctionalInterface public interface TouchConsumer extends Consumer { diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index f8ef49b311..66655bd3c2 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -43,9 +43,6 @@ import android.os.Handler; import android.os.Looper; import android.os.SystemClock; import android.os.UserHandle; -import android.support.annotation.AnyThread; -import android.support.annotation.UiThread; -import android.support.annotation.WorkerThread; import android.util.Log; import android.view.HapticFeedbackConstants; import android.view.View; @@ -86,11 +83,14 @@ import com.android.systemui.shared.system.RecentsAnimationControllerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier; import com.android.systemui.shared.system.WindowCallbacksCompat; -import com.android.systemui.shared.system.WindowManagerWrapper; import java.util.StringJoiner; import java.util.function.BiFunction; +import androidx.annotation.AnyThread; +import androidx.annotation.UiThread; +import androidx.annotation.WorkerThread; + @TargetApi(Build.VERSION_CODES.O) public class WindowTransformSwipeHandler { private static final String TAG = WindowTransformSwipeHandler.class.getSimpleName(); diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index 0597a2ebdf..c3ce4399ef 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -29,7 +29,6 @@ import android.graphics.Rect; import android.graphics.RectF; import android.os.Build; import android.os.RemoteException; -import android.support.annotation.Nullable; import android.view.animation.Interpolator; import com.android.launcher3.BaseDraggingActivity; @@ -51,6 +50,8 @@ import com.android.systemui.shared.system.WindowManagerWrapper; import java.util.function.BiFunction; +import androidx.annotation.Nullable; + /** * Utility class to handle window clip animation */ diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java index ec9c7eaed9..7715f358a8 100644 --- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java +++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java @@ -20,14 +20,15 @@ import static java.lang.annotation.RetentionPolicy.SOURCE; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; -import android.support.annotation.AnyThread; -import android.support.annotation.IntDef; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import java.lang.annotation.Retention; +import androidx.annotation.AnyThread; +import androidx.annotation.IntDef; + public class LayoutUtils { private static final int MULTI_WINDOW_STRATEGY_HALF_SCREEN = 1; diff --git a/quickstep/src/com/android/quickstep/views/IconView.java b/quickstep/src/com/android/quickstep/views/IconView.java index 8659949153..eb8da6e58b 100644 --- a/quickstep/src/com/android/quickstep/views/IconView.java +++ b/quickstep/src/com/android/quickstep/views/IconView.java @@ -18,12 +18,15 @@ package com.android.quickstep.views; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; -import android.support.annotation.NonNull; import android.util.AttributeSet; import android.view.View; + import com.android.launcher3.FastBitmapDrawable; + import java.util.ArrayList; +import androidx.annotation.NonNull; + /** * A view which draws a drawable stretched to fit its size. Unlike ImageView, it avoids relayout * when the drawable changes. diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index aa51e523e1..0770696796 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -44,7 +44,6 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; import android.os.UserHandle; -import android.support.annotation.Nullable; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -95,6 +94,8 @@ import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; import java.util.function.Consumer; +import androidx.annotation.Nullable; + /** * A list of recent tasks. */ diff --git a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java index 8b5e832453..896557550a 100644 --- a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java +++ b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java @@ -15,11 +15,12 @@ */ package com.android.quickstep.views; -import static android.support.v4.graphics.ColorUtils.setAlphaComponent; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.anim.Interpolators.ACCEL; import static com.android.launcher3.anim.Interpolators.LINEAR; +import static androidx.core.graphics.ColorUtils.setAlphaComponent; + import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; diff --git a/src/com/android/launcher3/AbstractFloatingView.java b/src/com/android/launcher3/AbstractFloatingView.java index e58e73d28c..1c07ea4a7e 100644 --- a/src/com/android/launcher3/AbstractFloatingView.java +++ b/src/com/android/launcher3/AbstractFloatingView.java @@ -25,7 +25,6 @@ import static com.android.launcher3.compat.AccessibilityManagerCompat.sendCustom import android.annotation.SuppressLint; import android.content.Context; -import android.support.annotation.IntDef; import android.util.AttributeSet; import android.util.Pair; import android.view.MotionEvent; @@ -40,6 +39,8 @@ import com.android.launcher3.views.BaseDragLayer; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import androidx.annotation.IntDef; + /** * Base class for a View which shows a floating UI on top of the launcher UI. */ diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index 5eb6cc72dc..24826918f0 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -22,8 +22,6 @@ 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 android.util.Log; import com.android.launcher3.compat.LauncherAppsCompat; @@ -35,6 +33,9 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + /** * Stores the list of all applications for the all apps view. diff --git a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java index b249c95306..0250c363d7 100644 --- a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java +++ b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java @@ -9,7 +9,6 @@ import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.os.Handler; -import android.support.annotation.WorkerThread; import android.util.Log; import com.android.launcher3.LauncherSettings.Favorites; @@ -18,6 +17,8 @@ import com.android.launcher3.model.LoaderTask; import com.android.launcher3.provider.RestoreDbTask; import com.android.launcher3.util.ContentWriter; +import androidx.annotation.WorkerThread; + public class AppWidgetsRestoredReceiver extends BroadcastReceiver { private static final String TAG = "AWRestoredReceiver"; diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index 6c82e6385c..2ec7e012c4 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -25,7 +25,6 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.res.Configuration; -import android.support.annotation.IntDef; import android.view.ContextThemeWrapper; import android.view.View.AccessibilityDelegate; @@ -41,6 +40,8 @@ import java.io.PrintWriter; import java.lang.annotation.Retention; import java.util.ArrayList; +import androidx.annotation.IntDef; + public abstract class BaseActivity extends Activity implements UserEventDelegate{ public static final int INVISIBLE_BY_STATE_HANDLER = 1 << 0; diff --git a/src/com/android/launcher3/BaseRecyclerView.java b/src/com/android/launcher3/BaseRecyclerView.java index 74b9cfaf33..f300ef740d 100644 --- a/src/com/android/launcher3/BaseRecyclerView.java +++ b/src/com/android/launcher3/BaseRecyclerView.java @@ -17,7 +17,6 @@ package com.android.launcher3; import android.content.Context; -import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -25,6 +24,8 @@ import android.view.ViewGroup; import com.android.launcher3.views.RecyclerViewFastScroller; +import androidx.recyclerview.widget.RecyclerView; + /** * A base {@link RecyclerView}, which does the following: diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index fae199259e..01e3a10b0e 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -27,7 +27,6 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.support.v4.graphics.ColorUtils; import android.text.TextUtils.TruncateAt; import android.util.AttributeSet; import android.util.Property; @@ -52,6 +51,8 @@ import com.android.launcher3.model.PackageItemInfo; import java.text.NumberFormat; +import androidx.core.graphics.ColorUtils; + /** * TextView that draws a bubble behind the text. We cannot use a LineBackgroundSpan * because we want to make the bubble taller than the text and TextView's clip is diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 260abd1aa2..7971f69ead 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -35,9 +35,6 @@ import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Parcelable; -import android.os.SystemClock; -import android.support.annotation.IntDef; -import android.support.v4.view.ViewCompat; import android.util.ArrayMap; import android.util.AttributeSet; import android.util.Log; @@ -73,6 +70,9 @@ import java.util.Collections; import java.util.Comparator; import java.util.Stack; +import androidx.annotation.IntDef; +import androidx.core.view.ViewCompat; + public class CellLayout extends ViewGroup { public static final int WORKSPACE_ACCESSIBILITY_DRAG = 2; public static final int FOLDER_ACCESSIBILITY_DRAG = 1; diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index f496600c7a..abd5538c6c 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -38,8 +38,6 @@ import android.os.Handler; import android.os.Process; import android.os.SystemClock; import android.os.UserHandle; -import android.support.annotation.NonNull; -import android.support.v4.graphics.ColorUtils; import android.text.TextUtils; import android.util.Log; @@ -63,6 +61,9 @@ import java.util.List; import java.util.Set; import java.util.Stack; +import androidx.annotation.NonNull; +import androidx.core.graphics.ColorUtils; + /** * Cache of application icons. Icons can be made from any thread. */ diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index 70845541b8..f3f2238e36 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -22,7 +22,6 @@ import android.content.res.Configuration; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.Point; -import android.support.annotation.VisibleForTesting; import android.util.DisplayMetrics; import android.util.Xml; import android.view.Display; @@ -40,6 +39,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import androidx.annotation.VisibleForTesting; + public class InvariantDeviceProfile { // We do not need any synchronization for this variable as its only written on UI thread. diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 9650e4eb7a..c8bee2ea5f 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -57,7 +57,6 @@ import android.os.Parcelable; import android.os.Process; import android.os.StrictMode; import android.os.UserHandle; -import android.support.annotation.Nullable; import android.text.TextUtils; import android.text.method.TextKeyListener; import android.util.Log; @@ -141,6 +140,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import androidx.annotation.Nullable; + /** * Default launcher application. */ diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 19aa795fec..fe9f901c4b 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -31,7 +31,6 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Process; import android.os.UserHandle; -import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.Log; import android.util.Pair; @@ -74,6 +73,8 @@ import java.util.List; import java.util.concurrent.CancellationException; import java.util.concurrent.Executor; +import androidx.annotation.Nullable; + /** * Maintains in-memory state of the Launcher. It is expected that there should be only one * LauncherModel object held in a static. Also provide APIs for updating the database state diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index 5bbfc1d79e..fe3df95d2a 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -17,6 +17,7 @@ package com.android.launcher3; import static android.view.View.VISIBLE; + import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_FADE; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_SCALE; @@ -34,7 +35,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.os.Handler; import android.os.Looper; -import android.support.annotation.IntDef; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; @@ -47,6 +47,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import androidx.annotation.IntDef; + /** * TODO: figure out what kind of tests we can write for this * diff --git a/src/com/android/launcher3/PromiseAppInfo.java b/src/com/android/launcher3/PromiseAppInfo.java index ea9f7527f5..ea151cd580 100644 --- a/src/com/android/launcher3/PromiseAppInfo.java +++ b/src/com/android/launcher3/PromiseAppInfo.java @@ -18,11 +18,12 @@ package com.android.launcher3; import android.content.Context; import android.content.Intent; -import android.support.annotation.NonNull; import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.util.PackageManagerHelper; +import androidx.annotation.NonNull; + public class PromiseAppInfo extends AppInfo { public int level = 0; diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java index 7af4bf9799..84bad08583 100644 --- a/src/com/android/launcher3/WidgetPreviewLoader.java +++ b/src/com/android/launcher3/WidgetPreviewLoader.java @@ -25,7 +25,6 @@ import android.os.AsyncTask; import android.os.CancellationSignal; import android.os.Handler; import android.os.UserHandle; -import android.support.annotation.Nullable; import android.util.Log; import android.util.LongSparseArray; @@ -51,6 +50,8 @@ import java.util.WeakHashMap; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import androidx.annotation.Nullable; + public class WidgetPreviewLoader { private static final String TAG = "WidgetPreviewLoader"; diff --git a/src/com/android/launcher3/accessibility/DragAndDropAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/DragAndDropAccessibilityDelegate.java index bd3bb4d4b7..117296d5f6 100644 --- a/src/com/android/launcher3/accessibility/DragAndDropAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/DragAndDropAccessibilityDelegate.java @@ -19,8 +19,6 @@ package com.android.launcher3.accessibility; import android.content.Context; import android.graphics.Rect; import android.os.Bundle; -import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; -import android.support.v4.widget.ExploreByTouchHelper; import android.view.View; import android.view.View.OnClickListener; import android.view.accessibility.AccessibilityEvent; @@ -31,6 +29,9 @@ import com.android.launcher3.R; import java.util.List; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; +import androidx.customview.widget.ExploreByTouchHelper; + /** * Helper class to make drag-and-drop in a {@link CellLayout} accessible. */ diff --git a/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java b/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java index e6f120fe64..1c088dbdd0 100644 --- a/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java +++ b/src/com/android/launcher3/accessibility/WorkspaceAccessibilityHelper.java @@ -18,7 +18,6 @@ package com.android.launcher3.accessibility; import android.content.Context; import android.graphics.Rect; -import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.text.TextUtils; import android.view.View; @@ -32,6 +31,8 @@ import com.android.launcher3.ShortcutInfo; import com.android.launcher3.accessibility.LauncherAccessibilityDelegate.DragType; import com.android.launcher3.dragndrop.DragLayer; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; + /** * Implementation of {@link DragAndDropAccessibilityDelegate} to support DnD on workspace. */ diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index cf7842a59c..e5cda21f19 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -23,12 +23,6 @@ import android.graphics.Point; import android.graphics.Rect; import android.os.Bundle; import android.os.Process; -import android.support.animation.DynamicAnimation; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; import android.text.Selection; import android.text.SpannableStringBuilder; import android.util.AttributeSet; @@ -59,6 +53,13 @@ import com.android.launcher3.views.BottomUserEducationView; import com.android.launcher3.views.RecyclerViewFastScroller; import com.android.launcher3.views.SpringRelativeLayout; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.dynamicanimation.animation.DynamicAnimation; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + /** * The all apps view container. */ diff --git a/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java b/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java index e08cb15cd2..3ee1293e28 100644 --- a/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java +++ b/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java @@ -15,13 +15,13 @@ */ package com.android.launcher3.allapps; -import android.support.v7.widget.RecyclerView; - import com.android.launcher3.util.Thunk; import java.util.HashSet; import java.util.List; +import androidx.recyclerview.widget.RecyclerView; + public class AllAppsFastScrollHelper implements AllAppsGridAdapter.BindViewCallback { private static final int INITIAL_TOUCH_SETTLING_DURATION = 100; diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java index 27fc53a820..0f13550199 100644 --- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java +++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java @@ -18,11 +18,6 @@ package com.android.launcher3.allapps; import android.content.Context; import android.content.Intent; import android.content.res.Resources; -import android.support.v4.view.accessibility.AccessibilityEventCompat; -import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; -import android.support.v4.view.accessibility.AccessibilityRecordCompat; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -44,6 +39,12 @@ import com.android.launcher3.util.PackageManagerHelper; import java.util.List; +import androidx.core.view.accessibility.AccessibilityEventCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; +import androidx.core.view.accessibility.AccessibilityRecordCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + /** * The grid view adapter of all the apps. */ diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index a6c1346f6b..adc4a72d1f 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -21,7 +21,6 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.drawable.Drawable; -import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.util.SparseIntArray; import android.view.MotionEvent; @@ -41,6 +40,8 @@ import com.android.launcher3.views.RecyclerViewFastScroller; import java.util.List; +import androidx.recyclerview.widget.RecyclerView; + /** * A RecyclerView with custom fast scroll support for the all apps view. */ diff --git a/src/com/android/launcher3/allapps/FloatingHeaderView.java b/src/com/android/launcher3/allapps/FloatingHeaderView.java index eaa777416d..5348349f4d 100644 --- a/src/com/android/launcher3/allapps/FloatingHeaderView.java +++ b/src/com/android/launcher3/allapps/FloatingHeaderView.java @@ -19,9 +19,6 @@ import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Point; import android.graphics.Rect; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -32,6 +29,10 @@ import android.widget.LinearLayout; import com.android.launcher3.R; import com.android.launcher3.anim.PropertySetter; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + public class FloatingHeaderView extends LinearLayout implements ValueAnimator.AnimatorUpdateListener { diff --git a/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java b/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java index 31c5914b81..decdcc0aa0 100644 --- a/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java +++ b/src/com/android/launcher3/allapps/PersonalWorkSlidingTabStrip.java @@ -19,8 +19,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.graphics.Canvas; import android.graphics.Paint; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import android.widget.Button; @@ -32,6 +30,9 @@ import com.android.launcher3.Utilities; import com.android.launcher3.pageindicators.PageIndicator; import com.android.launcher3.util.Themes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + /** * Supports two indicator colors, dedicated for personal and work tabs. */ diff --git a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java index dcc45545a4..91be504ef4 100644 --- a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java +++ b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java @@ -15,8 +15,6 @@ */ package com.android.launcher3.allapps.search; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java index fd1f0cca2e..32432561b0 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java @@ -22,7 +22,6 @@ import android.content.ComponentName; import android.content.Context; import android.os.Bundle; import android.os.UserHandle; -import android.support.annotation.Nullable; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherAppWidgetProviderInfo; @@ -35,6 +34,8 @@ import com.android.launcher3.widget.custom.CustomWidgetParser; import java.util.HashMap; import java.util.List; +import androidx.annotation.Nullable; + public abstract class AppWidgetManagerCompat { private static final Object sInstanceLock = new Object(); diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java b/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java index 843028503e..1065748328 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java @@ -23,7 +23,6 @@ import android.os.Bundle; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; -import android.support.annotation.Nullable; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherAppWidgetProviderInfo; @@ -38,6 +37,8 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; +import androidx.annotation.Nullable; + class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { private final UserManager mUserManager; diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompatVO.java b/src/com/android/launcher3/compat/AppWidgetManagerCompatVO.java index 44158edbf1..b7b0563ba6 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompatVO.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompatVO.java @@ -18,7 +18,6 @@ package com.android.launcher3.compat; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; -import android.support.annotation.Nullable; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.PackageUserKey; @@ -26,6 +25,8 @@ import com.android.launcher3.util.PackageUserKey; import java.util.Collections; import java.util.List; +import androidx.annotation.Nullable; + class AppWidgetManagerCompatVO extends AppWidgetManagerCompatVL { AppWidgetManagerCompatVO(Context context) { diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index 2cac536f6a..407355ce35 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -24,12 +24,15 @@ import android.content.pm.LauncherActivityInfo; 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; +import androidx.annotation.Nullable; + public abstract class LauncherAppsCompat { public interface OnAppsChangedCallbackCompat { diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java index cc3e5a7277..ba0ac6e4a6 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java @@ -29,15 +29,18 @@ import android.graphics.Rect; import android.os.Bundle; import android.os.Process; import android.os.UserHandle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.util.ArrayMap; + import com.android.launcher3.compat.ShortcutConfigActivityInfo.ShortcutConfigActivityInfoVL; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.PackageUserKey; + import java.util.ArrayList; import java.util.List; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + public class LauncherAppsCompatVL extends LauncherAppsCompat { protected final LauncherApps mLauncherApps; diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java index 173d0d1f3b..386b3b3fe3 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java @@ -28,7 +28,6 @@ import android.os.Build; import android.os.Parcelable; import android.os.Process; import android.os.UserHandle; -import android.support.annotation.Nullable; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; @@ -42,6 +41,8 @@ import com.android.launcher3.util.PackageUserKey; import java.util.ArrayList; import java.util.List; +import androidx.annotation.Nullable; + @TargetApi(26) public class LauncherAppsCompatVO extends LauncherAppsCompatVL { diff --git a/src/com/android/launcher3/compat/PackageInstallerCompat.java b/src/com/android/launcher3/compat/PackageInstallerCompat.java index 3270ba2005..7dad7e9052 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompat.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompat.java @@ -19,11 +19,12 @@ 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; +import androidx.annotation.NonNull; + public abstract class PackageInstallerCompat { public static final int STATUS_INSTALLED = 0; diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index 998de99a5f..e1417b76a8 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -41,16 +41,12 @@ import android.graphics.drawable.InsetDrawable; import android.os.Build; import android.os.Handler; import android.os.Looper; -import android.support.animation.FloatPropertyCompat; -import android.support.animation.SpringAnimation; -import android.support.animation.SpringForce; import android.view.View; import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.ItemInfo; import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; @@ -70,6 +66,10 @@ import com.android.launcher3.widget.PendingAddShortcutInfo; import java.util.Arrays; import java.util.List; +import androidx.dynamicanimation.animation.FloatPropertyCompat; +import androidx.dynamicanimation.animation.SpringAnimation; +import androidx.dynamicanimation.animation.SpringForce; + public class DragView extends View { private static final ColorMatrix sTempMatrix1 = new ColorMatrix(); private static final ColorMatrix sTempMatrix2 = new ColorMatrix(); diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index 0c77f9ed1e..6ef798d625 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -29,7 +29,6 @@ import android.content.Context; import android.content.res.Resources; 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; @@ -47,6 +46,8 @@ import com.android.launcher3.util.Themes; import java.util.List; +import androidx.core.graphics.ColorUtils; + /** * Manages the opening and closing animations for a {@link Folder}. * diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index a60216c534..87a079604f 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -26,8 +26,6 @@ import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.os.Parcelable; -import android.support.annotation.NonNull; import android.util.AttributeSet; import android.util.Property; import android.view.LayoutInflater; @@ -69,6 +67,8 @@ import com.android.launcher3.widget.PendingAddShortcutInfo; import java.util.ArrayList; import java.util.List; +import androidx.annotation.NonNull; + /** * An icon that can appear on in the workspace representing an {@link Folder}. */ diff --git a/src/com/android/launcher3/folder/PreviewBackground.java b/src/com/android/launcher3/folder/PreviewBackground.java index 86266e6255..ceb1a8c372 100644 --- a/src/com/android/launcher3/folder/PreviewBackground.java +++ b/src/com/android/launcher3/folder/PreviewBackground.java @@ -30,7 +30,6 @@ import android.graphics.PorterDuffXfermode; import android.graphics.RadialGradient; import android.graphics.Region; import android.graphics.Shader; -import android.support.v4.graphics.ColorUtils; import android.util.Property; import android.view.View; @@ -40,6 +39,8 @@ import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.util.Themes; +import androidx.core.graphics.ColorUtils; + /** * This object represents a FolderIcon preview background. It stores drawing / measurement * information, handles drawing, and animation (accept state <--> rest state). diff --git a/src/com/android/launcher3/folder/PreviewItemManager.java b/src/com/android/launcher3/folder/PreviewItemManager.java index 1f69f6e768..0004e1e406 100644 --- a/src/com/android/launcher3/folder/PreviewItemManager.java +++ b/src/com/android/launcher3/folder/PreviewItemManager.java @@ -16,13 +16,17 @@ package com.android.launcher3.folder; +import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.ENTER_INDEX; +import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.EXIT_INDEX; +import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; +import static com.android.launcher3.folder.FolderIcon.DROP_IN_ANIMATION_DURATION; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.support.annotation.NonNull; import android.view.View; import android.widget.TextView; @@ -33,10 +37,7 @@ import com.android.launcher3.Utilities; import java.util.ArrayList; import java.util.List; -import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.ENTER_INDEX; -import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.EXIT_INDEX; -import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; -import static com.android.launcher3.folder.FolderIcon.DROP_IN_ANIMATION_DURATION; +import androidx.annotation.NonNull; /** * Manages the drawing and animations of {@link PreviewItemDrawingParams} for a {@link FolderIcon}. diff --git a/src/com/android/launcher3/graphics/ColorScrim.java b/src/com/android/launcher3/graphics/ColorScrim.java index 96d93d83b1..5c1081ac3f 100644 --- a/src/com/android/launcher3/graphics/ColorScrim.java +++ b/src/com/android/launcher3/graphics/ColorScrim.java @@ -17,7 +17,6 @@ package com.android.launcher3.graphics; import android.graphics.Canvas; import android.graphics.Color; -import android.support.v4.graphics.ColorUtils; import android.view.View; import android.view.animation.Interpolator; @@ -25,6 +24,8 @@ import com.android.launcher3.R; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.uioverrides.WallpaperColorInfo; +import androidx.core.graphics.ColorUtils; + /** * Simple scrim which draws a color */ diff --git a/src/com/android/launcher3/graphics/DrawableFactory.java b/src/com/android/launcher3/graphics/DrawableFactory.java index bbc013d506..5bc81e69a0 100644 --- a/src/com/android/launcher3/graphics/DrawableFactory.java +++ b/src/com/android/launcher3/graphics/DrawableFactory.java @@ -28,9 +28,9 @@ import android.graphics.drawable.BitmapDrawable; 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.ItemInfoWithIcon; import com.android.launcher3.R; @@ -38,6 +38,8 @@ import com.android.launcher3.Utilities; import com.android.launcher3.allapps.AllAppsBackgroundDrawable; import com.android.launcher3.util.ResourceBasedOverride; +import androidx.annotation.UiThread; + /** * Factory for creating new drawables. */ diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index a2a08015e3..df00815c07 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -24,22 +24,23 @@ import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; -import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -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 com.android.launcher3.dragndrop.FolderAdaptiveIcon; import java.nio.ByteBuffer; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + public class IconNormalizer { private static final String TAG = "IconNormalizer"; diff --git a/src/com/android/launcher3/graphics/IconPalette.java b/src/com/android/launcher3/graphics/IconPalette.java index 9c3b77ece6..cda07c31a2 100644 --- a/src/com/android/launcher3/graphics/IconPalette.java +++ b/src/com/android/launcher3/graphics/IconPalette.java @@ -19,12 +19,13 @@ package com.android.launcher3.graphics; import android.app.Notification; import android.content.Context; import android.graphics.Color; -import android.support.v4.graphics.ColorUtils; import android.util.Log; import com.android.launcher3.R; import com.android.launcher3.util.Themes; +import androidx.core.graphics.ColorUtils; + /** * Contains colors based on the dominant color of an icon. */ diff --git a/src/com/android/launcher3/graphics/IconShapeOverride.java b/src/com/android/launcher3/graphics/IconShapeOverride.java index 223243b7ad..cadc6e35eb 100644 --- a/src/com/android/launcher3/graphics/IconShapeOverride.java +++ b/src/com/android/launcher3/graphics/IconShapeOverride.java @@ -30,7 +30,6 @@ import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.provider.Settings; -import android.support.annotation.NonNull; import android.text.TextUtils; import android.util.Log; @@ -42,6 +41,8 @@ import com.android.launcher3.util.LooperExecutor; import java.lang.reflect.Field; +import androidx.annotation.NonNull; + /** * Utility class to override shape of {@link android.graphics.drawable.AdaptiveIconDrawable}. */ diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 0167a1d9c4..087362cd42 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -41,7 +41,6 @@ import android.graphics.drawable.PaintDrawable; import android.os.Build; import android.os.Process; import android.os.UserHandle; -import android.support.annotation.Nullable; import com.android.launcher3.AppInfo; import com.android.launcher3.FastBitmapDrawable; @@ -57,6 +56,8 @@ import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.Provider; import com.android.launcher3.util.Themes; +import androidx.annotation.Nullable; + /** * Helper methods for generating various launcher icons */ diff --git a/src/com/android/launcher3/graphics/ShadowGenerator.java b/src/com/android/launcher3/graphics/ShadowGenerator.java index 52d45accfd..d2d1699bf7 100644 --- a/src/com/android/launcher3/graphics/ShadowGenerator.java +++ b/src/com/android/launcher3/graphics/ShadowGenerator.java @@ -27,10 +27,11 @@ import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; -import android.support.v4.graphics.ColorUtils; import com.android.launcher3.LauncherAppState; +import androidx.core.graphics.ColorUtils; + /** * Utility class to add shadows to bitmaps. */ diff --git a/src/com/android/launcher3/graphics/TriangleShape.java b/src/com/android/launcher3/graphics/TriangleShape.java index cce4e3cd9c..2c15725406 100644 --- a/src/com/android/launcher3/graphics/TriangleShape.java +++ b/src/com/android/launcher3/graphics/TriangleShape.java @@ -19,7 +19,8 @@ package com.android.launcher3.graphics; import android.graphics.Outline; import android.graphics.Path; import android.graphics.drawable.shapes.PathShape; -import android.support.annotation.NonNull; + +import androidx.annotation.NonNull; /** * Wrapper around {@link android.graphics.drawable.shapes.PathShape} diff --git a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java index bc4a06d5e2..00cc1a7e2c 100644 --- a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java +++ b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java @@ -34,7 +34,6 @@ import android.graphics.RectF; import android.graphics.Region; import android.graphics.Shader; import android.graphics.drawable.Drawable; -import android.support.v4.graphics.ColorUtils; import android.util.DisplayMetrics; import android.util.Property; import android.view.View; @@ -47,6 +46,8 @@ import com.android.launcher3.Workspace; import com.android.launcher3.uioverrides.WallpaperColorInfo; import com.android.launcher3.util.Themes; +import androidx.core.graphics.ColorUtils; + /** * View scrim which draws behind hotseat and workspace */ diff --git a/src/com/android/launcher3/keyboard/FocusedItemDecorator.java b/src/com/android/launcher3/keyboard/FocusedItemDecorator.java index 05ae406e8b..2476a6fd3e 100644 --- a/src/com/android/launcher3/keyboard/FocusedItemDecorator.java +++ b/src/com/android/launcher3/keyboard/FocusedItemDecorator.java @@ -17,14 +17,15 @@ package com.android.launcher3.keyboard; import android.graphics.Canvas; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.ItemDecoration; -import android.support.v7.widget.RecyclerView.State; import android.view.View; import android.view.View.OnFocusChangeListener; import com.android.launcher3.keyboard.FocusIndicatorHelper.SimpleFocusIndicatorHelper; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.ItemDecoration; +import androidx.recyclerview.widget.RecyclerView.State; + /** * {@link ItemDecoration} for drawing and animating focused view background. */ diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index 7087fdb786..a318dc0eb6 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -32,7 +32,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.SystemClock; -import android.support.annotation.Nullable; import android.util.Log; import android.view.View; import android.view.ViewParent; @@ -55,6 +54,8 @@ import com.android.launcher3.util.ResourceBasedOverride; import java.util.Locale; import java.util.UUID; +import androidx.annotation.Nullable; + /** * Manages the creation of {@link LauncherEvent}. * To debug this class, execute following command before side loading a new apk. diff --git a/src/com/android/launcher3/model/ModelPreload.java b/src/com/android/launcher3/model/ModelPreload.java index f186e9572d..b353810ef5 100644 --- a/src/com/android/launcher3/model/ModelPreload.java +++ b/src/com/android/launcher3/model/ModelPreload.java @@ -16,7 +16,6 @@ package com.android.launcher3.model; import android.content.Context; -import android.support.annotation.WorkerThread; import android.util.Log; import com.android.launcher3.AllAppsList; @@ -26,6 +25,8 @@ import com.android.launcher3.LauncherModel.ModelUpdateTask; import java.util.concurrent.Executor; +import androidx.annotation.WorkerThread; + /** * Utility class to preload LauncherModel */ diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java index 9f8f2632eb..448ff6c920 100644 --- a/src/com/android/launcher3/model/WidgetsModel.java +++ b/src/com/android/launcher3/model/WidgetsModel.java @@ -8,7 +8,6 @@ import android.content.Context; import android.content.pm.PackageManager; import android.os.Process; import android.os.UserHandle; -import android.support.annotation.Nullable; import android.util.Log; import com.android.launcher3.AppFilter; @@ -34,6 +33,8 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import androidx.annotation.Nullable; + /** * Widgets data model that is used by the adapters of the widget views and controllers. * diff --git a/src/com/android/launcher3/notification/NotificationKeyData.java b/src/com/android/launcher3/notification/NotificationKeyData.java index bf7ae1a5c0..508cf877c0 100644 --- a/src/com/android/launcher3/notification/NotificationKeyData.java +++ b/src/com/android/launcher3/notification/NotificationKeyData.java @@ -18,11 +18,12 @@ package com.android.launcher3.notification; import android.app.Notification; import android.service.notification.StatusBarNotification; -import android.support.annotation.NonNull; import java.util.ArrayList; import java.util.List; +import androidx.annotation.NonNull; + /** * The key data associated with the notification, used to determine what to include * in badges and dummy popup views before they are populated. diff --git a/src/com/android/launcher3/notification/NotificationListener.java b/src/com/android/launcher3/notification/NotificationListener.java index ac5aaf8538..4c85c8b17a 100644 --- a/src/com/android/launcher3/notification/NotificationListener.java +++ b/src/com/android/launcher3/notification/NotificationListener.java @@ -27,7 +27,6 @@ import android.os.Looper; import android.os.Message; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; -import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.ArraySet; import android.util.Log; @@ -45,6 +44,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import androidx.annotation.Nullable; + /** * A {@link NotificationListenerService} that sends updates to its * {@link NotificationsChangedListener} when notifications are posted or canceled, diff --git a/src/com/android/launcher3/popup/PopupDataProvider.java b/src/com/android/launcher3/popup/PopupDataProvider.java index f1b8ec0931..3faec447a4 100644 --- a/src/com/android/launcher3/popup/PopupDataProvider.java +++ b/src/com/android/launcher3/popup/PopupDataProvider.java @@ -18,7 +18,6 @@ package com.android.launcher3.popup; import android.content.ComponentName; import android.service.notification.StatusBarNotification; -import android.support.annotation.NonNull; import android.util.Log; import com.android.launcher3.ItemInfo; @@ -41,6 +40,8 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import androidx.annotation.NonNull; + /** * Provides data for the popup menu that appears after long-clicking on apps. */ diff --git a/src/com/android/launcher3/popup/PopupPopulator.java b/src/com/android/launcher3/popup/PopupPopulator.java index b295bb2aea..450062961a 100644 --- a/src/com/android/launcher3/popup/PopupPopulator.java +++ b/src/com/android/launcher3/popup/PopupPopulator.java @@ -20,8 +20,6 @@ import android.content.ComponentName; import android.os.Handler; import android.os.UserHandle; import android.service.notification.StatusBarNotification; -import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; @@ -40,6 +38,9 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + /** * Contains logic relevant to populating a {@link PopupContainerWithArrow}. In particular, * this class determines which items appear in the container, and in what order. diff --git a/src/com/android/launcher3/touch/SwipeDetector.java b/src/com/android/launcher3/touch/SwipeDetector.java index 703e4fdaba..6ffc0efae7 100644 --- a/src/com/android/launcher3/touch/SwipeDetector.java +++ b/src/com/android/launcher3/touch/SwipeDetector.java @@ -19,12 +19,13 @@ import static android.view.MotionEvent.INVALID_POINTER_ID; import android.content.Context; import android.graphics.PointF; -import android.support.annotation.NonNull; -import android.support.annotation.VisibleForTesting; import android.util.Log; import android.view.MotionEvent; import android.view.ViewConfiguration; +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; + /** * One dimensional scroll/drag/swipe gesture detector. * diff --git a/src/com/android/launcher3/util/ListViewHighlighter.java b/src/com/android/launcher3/util/ListViewHighlighter.java index ecad2afe2e..360546e53f 100644 --- a/src/com/android/launcher3/util/ListViewHighlighter.java +++ b/src/com/android/launcher3/util/ListViewHighlighter.java @@ -21,7 +21,6 @@ import android.animation.ValueAnimator; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.support.v4.graphics.ColorUtils; import android.view.View; import android.view.View.OnLayoutChangeListener; import android.widget.AbsListView; @@ -31,6 +30,8 @@ import android.widget.ListView; import com.android.launcher3.R; +import androidx.core.graphics.ColorUtils; + /** * Utility class to scroll and highlight a list view item */ diff --git a/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java b/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java index a11a8c5377..64e166eeb8 100644 --- a/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java +++ b/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java @@ -20,13 +20,14 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; -import android.support.v4.graphics.ColorUtils; import android.util.AttributeSet; import android.widget.TextView; import com.android.launcher3.BubbleTextView; import com.android.launcher3.R; +import androidx.core.graphics.ColorUtils; + /** * Extension of {@link BubbleTextView} which draws two shadows on the text (ambient and key shadows} */ diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index dc6d2ff099..3e58ea6739 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -22,7 +22,6 @@ import android.content.Context; import android.content.Intent; import android.graphics.Rect; import android.graphics.RectF; -import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import android.util.ArrayMap; import android.util.AttributeSet; @@ -44,6 +43,8 @@ import com.android.launcher3.widget.WidgetsFullSheet; import java.util.ArrayList; import java.util.List; +import androidx.annotation.VisibleForTesting; + /** * Popup shown on long pressing an empty space in launcher */ diff --git a/src/com/android/launcher3/views/RecyclerViewFastScroller.java b/src/com/android/launcher3/views/RecyclerViewFastScroller.java index ed1cf4f1ed..f0d6de20f6 100644 --- a/src/com/android/launcher3/views/RecyclerViewFastScroller.java +++ b/src/com/android/launcher3/views/RecyclerViewFastScroller.java @@ -24,7 +24,6 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; -import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.util.Property; import android.view.MotionEvent; @@ -35,10 +34,11 @@ import android.widget.TextView; import com.android.launcher3.BaseRecyclerView; import com.android.launcher3.R; import com.android.launcher3.Utilities; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.FastScrollThumbDrawable; import com.android.launcher3.util.Themes; +import androidx.recyclerview.widget.RecyclerView; + /** * The track and scrollbar that shows when you scroll the list. */ diff --git a/src/com/android/launcher3/views/ScrimView.java b/src/com/android/launcher3/views/ScrimView.java index 7066980a9d..6fd84db26a 100644 --- a/src/com/android/launcher3/views/ScrimView.java +++ b/src/com/android/launcher3/views/ScrimView.java @@ -16,8 +16,6 @@ package com.android.launcher3.views; import static android.content.Context.ACCESSIBILITY_SERVICE; -import static android.support.v4.graphics.ColorUtils.compositeColors; -import static android.support.v4.graphics.ColorUtils.setAlphaComponent; import static android.view.MotionEvent.ACTION_DOWN; import static com.android.launcher3.LauncherState.ALL_APPS; @@ -25,6 +23,9 @@ import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.anim.Interpolators.ACCEL; import static com.android.launcher3.anim.Interpolators.DEACCEL; +import static androidx.core.graphics.ColorUtils.compositeColors; +import static androidx.core.graphics.ColorUtils.setAlphaComponent; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.Keyframe; @@ -38,12 +39,6 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.view.ViewCompat; -import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; -import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; -import android.support.v4.widget.ExploreByTouchHelper; import android.util.AttributeSet; import android.util.Property; import android.view.KeyEvent; @@ -68,6 +63,13 @@ import com.android.launcher3.util.Themes; import java.util.List; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; +import androidx.customview.widget.ExploreByTouchHelper; + /** * Simple scrim which draws a flat color */ diff --git a/src/com/android/launcher3/views/SpringRelativeLayout.java b/src/com/android/launcher3/views/SpringRelativeLayout.java index b0313ceab8..d0ec9d7e08 100644 --- a/src/com/android/launcher3/views/SpringRelativeLayout.java +++ b/src/com/android/launcher3/views/SpringRelativeLayout.java @@ -15,24 +15,25 @@ */ package com.android.launcher3.views; +import static androidx.dynamicanimation.animation.SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY; +import static androidx.dynamicanimation.animation.SpringForce.STIFFNESS_LOW; +import static androidx.dynamicanimation.animation.SpringForce.STIFFNESS_MEDIUM; + import android.content.Context; import android.graphics.Canvas; -import android.support.animation.DynamicAnimation; -import android.support.animation.FloatPropertyCompat; -import android.support.animation.SpringAnimation; -import android.support.animation.SpringForce; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.EdgeEffectFactory; import android.util.AttributeSet; import android.util.SparseBooleanArray; import android.view.View; import android.widget.EdgeEffect; import android.widget.RelativeLayout; -import static android.support.animation.SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY; -import static android.support.animation.SpringForce.STIFFNESS_LOW; -import static android.support.animation.SpringForce.STIFFNESS_MEDIUM; +import androidx.annotation.NonNull; +import androidx.dynamicanimation.animation.DynamicAnimation; +import androidx.dynamicanimation.animation.FloatPropertyCompat; +import androidx.dynamicanimation.animation.SpringAnimation; +import androidx.dynamicanimation.animation.SpringForce; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory; public class SpringRelativeLayout extends RelativeLayout { diff --git a/src/com/android/launcher3/widget/WidgetsDiffReporter.java b/src/com/android/launcher3/widget/WidgetsDiffReporter.java index d67f403655..2ba672d7af 100644 --- a/src/com/android/launcher3/widget/WidgetsDiffReporter.java +++ b/src/com/android/launcher3/widget/WidgetsDiffReporter.java @@ -16,7 +16,6 @@ package com.android.launcher3.widget; -import android.support.v7.widget.RecyclerView; import android.util.Log; import com.android.launcher3.IconCache; @@ -26,6 +25,8 @@ import com.android.launcher3.widget.WidgetsListAdapter.WidgetListRowEntryCompara import java.util.ArrayList; import java.util.Iterator; +import androidx.recyclerview.widget.RecyclerView; + /** * Do diff on widget's tray list items and call the {@link RecyclerView.Adapter} * methods accordingly. diff --git a/src/com/android/launcher3/widget/WidgetsFullSheet.java b/src/com/android/launcher3/widget/WidgetsFullSheet.java index 2a7bb03aa1..f7ff69abe3 100644 --- a/src/com/android/launcher3/widget/WidgetsFullSheet.java +++ b/src/com/android/launcher3/widget/WidgetsFullSheet.java @@ -20,7 +20,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.PropertyValuesHolder; import android.content.Context; import android.graphics.Rect; -import android.support.annotation.VisibleForTesting; import android.util.AttributeSet; import android.util.Pair; import android.view.LayoutInflater; @@ -36,6 +35,8 @@ import com.android.launcher3.R; import com.android.launcher3.views.RecyclerViewFastScroller; import com.android.launcher3.views.TopRoundedCornerView; +import androidx.annotation.VisibleForTesting; + /** * Popup for showing the full list of available widgets */ diff --git a/src/com/android/launcher3/widget/WidgetsListAdapter.java b/src/com/android/launcher3/widget/WidgetsListAdapter.java index 0147ea4278..1016d04005 100644 --- a/src/com/android/launcher3/widget/WidgetsListAdapter.java +++ b/src/com/android/launcher3/widget/WidgetsListAdapter.java @@ -16,8 +16,6 @@ package com.android.launcher3.widget; import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.Adapter; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -30,14 +28,15 @@ import com.android.launcher3.R; import com.android.launcher3.WidgetPreviewLoader; import com.android.launcher3.model.WidgetItem; import com.android.launcher3.util.LabelComparator; -import com.android.launcher3.util.PackageUserKey; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.Iterator; import java.util.List; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.Adapter; + /** * List view adapter for the widget tray. * diff --git a/src/com/android/launcher3/widget/WidgetsRecyclerView.java b/src/com/android/launcher3/widget/WidgetsRecyclerView.java index 124058ec45..641183a015 100644 --- a/src/com/android/launcher3/widget/WidgetsRecyclerView.java +++ b/src/com/android/launcher3/widget/WidgetsRecyclerView.java @@ -18,9 +18,6 @@ package com.android.launcher3.widget; import android.content.Context; import android.graphics.Point; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.OnItemTouchListener; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -28,6 +25,10 @@ import android.view.View; import com.android.launcher3.BaseRecyclerView; import com.android.launcher3.R; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener; + /** * The widgets recycler view. */ diff --git a/src/com/android/launcher3/widget/WidgetsRowViewHolder.java b/src/com/android/launcher3/widget/WidgetsRowViewHolder.java index 8f269a643d..d26edb6134 100644 --- a/src/com/android/launcher3/widget/WidgetsRowViewHolder.java +++ b/src/com/android/launcher3/widget/WidgetsRowViewHolder.java @@ -15,12 +15,13 @@ */ package com.android.launcher3.widget; -import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.ViewGroup; import com.android.launcher3.BubbleTextView; import com.android.launcher3.R; +import androidx.recyclerview.widget.RecyclerView.ViewHolder; + public class WidgetsRowViewHolder extends ViewHolder { public final ViewGroup cellContainer; diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/ColorExtractionAlgorithm.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/ColorExtractionAlgorithm.java index 21b324f07a..5a1f9caa5d 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/ColorExtractionAlgorithm.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/ColorExtractionAlgorithm.java @@ -17,9 +17,6 @@ package com.android.launcher3.uioverrides.dynamicui; import android.graphics.Color; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.graphics.ColorUtils; import android.util.Log; import android.util.Pair; import android.util.Range; @@ -30,6 +27,10 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.graphics.ColorUtils; + /** * Implementation of tonal color extraction **/ diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompat.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompat.java index 5c533ff343..0fd0a35317 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompat.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompat.java @@ -17,10 +17,11 @@ package com.android.launcher3.uioverrides.dynamicui; import android.content.Context; -import android.support.annotation.Nullable; import com.android.launcher3.Utilities; +import androidx.annotation.Nullable; + public abstract class WallpaperManagerCompat { private static final Object sInstanceLock = new Object(); diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVL.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVL.java index 7529f17f46..7883442546 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVL.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVL.java @@ -41,7 +41,6 @@ import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.HandlerThread; import android.os.ParcelFileDescriptor; -import android.support.annotation.Nullable; import android.util.Log; import android.util.Pair; @@ -51,6 +50,8 @@ import com.android.launcher3.graphics.ColorExtractor; import java.io.IOException; import java.util.ArrayList; +import androidx.annotation.Nullable; + public class WallpaperManagerCompatVL extends WallpaperManagerCompat { private static final String TAG = "WMCompatVL"; diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVOMR1.java b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVOMR1.java index 4509e05aa0..f34497deba 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVOMR1.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/dynamicui/WallpaperManagerCompatVOMR1.java @@ -21,11 +21,12 @@ import android.app.WallpaperManager; import android.app.WallpaperManager.OnColorsChangedListener; import android.content.Context; import android.graphics.Color; -import android.support.annotation.Nullable; import android.util.Log; import java.lang.reflect.Method; +import androidx.annotation.Nullable; + @TargetApi(27) public class WallpaperManagerCompatVOMR1 extends WallpaperManagerCompat { diff --git a/tests/Android.mk b/tests/Android.mk index 180fc0cb37..1531c32df7 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -17,8 +17,11 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests -LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 \ - ub-launcher-aosp-tapl +LOCAL_STATIC_JAVA_LIBRARIES := \ + android-support-test \ + ub-uiautomator \ + mockito-target-minus-junit4 \ + ub-launcher-aosp-tapl LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_FULL_LIBS_MANIFEST_FILES := $(LOCAL_PATH)/AndroidManifest-common.xml @@ -36,7 +39,11 @@ include $(BUILD_PACKAGE) # Build rule for Tapl library. # include $(CLEAR_VARS) -LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator libSharedSystemUI +LOCAL_STATIC_JAVA_LIBRARIES := \ + androidx.annotation_annotation \ + android-support-test \ + ub-uiautomator \ + libSharedSystemUI LOCAL_SRC_FILES := $(call all-java-files-under, tapl) \ ../quickstep/src/com/android/quickstep/SwipeUpSetting.java diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index b217847f5e..5d5af4f24f 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -18,7 +18,6 @@ import android.graphics.Bitmap.Config; import android.graphics.Color; import android.os.Process; import android.os.UserHandle; -import android.support.annotation.NonNull; import android.support.test.InstrumentationRegistry; import android.support.test.rule.provider.ProviderTestRule; @@ -49,6 +48,8 @@ import java.util.HashMap; import java.util.List; import java.util.concurrent.Executor; +import androidx.annotation.NonNull; + /** * Base class for writing tests for Model update tasks. */ diff --git a/tests/src/com/android/launcher3/widget/WidgetsListAdapterTest.java b/tests/src/com/android/launcher3/widget/WidgetsListAdapterTest.java index 0185f130e5..5befeb9abe 100644 --- a/tests/src/com/android/launcher3/widget/WidgetsListAdapterTest.java +++ b/tests/src/com/android/launcher3/widget/WidgetsListAdapterTest.java @@ -15,6 +15,11 @@ */ package com.android.launcher3.widget; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.isNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.content.pm.PackageManager; @@ -22,7 +27,6 @@ import android.graphics.Bitmap; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; -import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import com.android.launcher3.IconCache; @@ -43,10 +47,7 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.Map; -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.isNull; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import androidx.recyclerview.widget.RecyclerView; @SmallTest @RunWith(AndroidJUnit4.class) diff --git a/tests/tapl/com/android/launcher3/tapl/AllApps.java b/tests/tapl/com/android/launcher3/tapl/AllApps.java index e270b46056..d64f86cbc1 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllApps.java +++ b/tests/tapl/com/android/launcher3/tapl/AllApps.java @@ -18,11 +18,12 @@ package com.android.launcher3.tapl; import static org.junit.Assert.assertTrue; -import android.support.annotation.NonNull; import android.support.test.uiautomator.BySelector; import android.support.test.uiautomator.Direction; import android.support.test.uiautomator.UiObject2; +import androidx.annotation.NonNull; + /** * Operations on AllApps opened from Home. Also a parent for All Apps opened from Overview. */ diff --git a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java index 7ed2dc2f6d..07e73fc9be 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java +++ b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java @@ -17,9 +17,10 @@ package com.android.launcher3.tapl; import android.graphics.Point; -import android.support.annotation.NonNull; import android.support.test.uiautomator.UiObject2; +import androidx.annotation.NonNull; + /** * Operations on AllApps opened from Overview. */ diff --git a/tests/tapl/com/android/launcher3/tapl/Home.java b/tests/tapl/com/android/launcher3/tapl/Home.java index 436e5ff6b9..786f260b8b 100644 --- a/tests/tapl/com/android/launcher3/tapl/Home.java +++ b/tests/tapl/com/android/launcher3/tapl/Home.java @@ -16,9 +16,10 @@ package com.android.launcher3.tapl; -import android.support.annotation.NonNull; import android.support.test.uiautomator.UiObject2; +import androidx.annotation.NonNull; + /** * Operations on the home screen. * diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index b02ff93bc3..fa282c3334 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -26,8 +26,6 @@ import android.app.ActivityManager; import android.app.UiAutomation; import android.os.Bundle; import android.provider.Settings; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.test.InstrumentationRegistry; import android.support.test.uiautomator.By; import android.support.test.uiautomator.BySelector; @@ -41,6 +39,9 @@ import com.android.quickstep.SwipeUpSetting; import java.lang.ref.WeakReference; import java.util.concurrent.TimeoutException; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + /** * The main tapl object. The only object that can be explicitly constructed by the using code. It * produces all other objects. diff --git a/tests/tapl/com/android/launcher3/tapl/Overview.java b/tests/tapl/com/android/launcher3/tapl/Overview.java index 9493990746..3c0ae2daf6 100644 --- a/tests/tapl/com/android/launcher3/tapl/Overview.java +++ b/tests/tapl/com/android/launcher3/tapl/Overview.java @@ -19,13 +19,14 @@ package com.android.launcher3.tapl; import static org.junit.Assert.assertNotEquals; import android.graphics.Point; -import android.support.annotation.NonNull; import android.support.test.uiautomator.Direction; import android.support.test.uiautomator.UiObject2; import java.util.Collections; import java.util.List; +import androidx.annotation.NonNull; + /** * Overview pane. */ diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java index 045ab5fcf2..c58c24443a 100644 --- a/tests/tapl/com/android/launcher3/tapl/Workspace.java +++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java @@ -19,12 +19,13 @@ package com.android.launcher3.tapl; import static junit.framework.TestCase.assertTrue; import android.graphics.Point; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.test.uiautomator.Direction; import android.support.test.uiautomator.UiObject2; import android.view.KeyEvent; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + /** * Operations on the workspace screen. */ -- GitLab From b6398a1eb8b69651e0f901a93d7b46347e5d6a83 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Tue, 14 Aug 2018 19:53:43 -0700 Subject: [PATCH 0073/1301] Sharing protocol constants between Launcher and TAPL Bug: 110103162 Test: TaplTests Change-Id: I5b2a2b8576a7a6ea4a156f00858711496d6b5bba --- .../quickstep/ActivityControlHelper.java | 4 ++- src/com/android/launcher3/TestProtocol.java | 27 +++++++++++++++++++ .../allapps/AllAppsContainerView.java | 6 +++-- .../compat/AccessibilityManagerCompat.java | 3 ++- .../AbstractStateChangeTouchController.java | 4 ++- tests/Android.mk | 3 ++- .../com/android/launcher3/tapl/AllApps.java | 6 +++-- .../tapl/LauncherInstrumentation.java | 5 ++-- 8 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 src/com/android/launcher3/TestProtocol.java diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 185080eef3..322e270e26 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -51,6 +51,7 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherInitListener; import com.android.launcher3.LauncherState; import com.android.launcher3.R; +import com.android.launcher3.TestProtocol; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimationSuccessListener; @@ -233,7 +234,8 @@ public interface ActivityControlHelper { // Optimization, hide the all apps view to prevent layout while initializing activity.getAppsView().getContentView().setVisibility(View.GONE); - AccessibilityManagerCompat.sendEventToTest(activity, "TAPL_WENT_TO_STATE"); + AccessibilityManagerCompat.sendEventToTest( + activity, TestProtocol.SWITCHED_TO_STATE_MESSAGE); } return new AnimationFactory() { diff --git a/src/com/android/launcher3/TestProtocol.java b/src/com/android/launcher3/TestProtocol.java new file mode 100644 index 0000000000..0a3b86d630 --- /dev/null +++ b/src/com/android/launcher3/TestProtocol.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3; + +/** + * Protocol for custom accessibility events for communication with UI Automation tests. + */ +public final class TestProtocol { + public static final String GET_SCROLL_MESSAGE = "TAPL_GET_SCROLL"; + public static final String SCROLL_Y_FIELD = "scrollY"; + public static final String SWITCHED_TO_STATE_MESSAGE = "TAPL_SWITCHED_TO_STATE"; + public static final String RESPONSE_MESSAGE_POSTFIX = "_RESPONSE"; +} diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index e5cda21f19..6908ab48a6 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -42,6 +42,7 @@ import com.android.launcher3.InsettableFrameLayout; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.R; +import com.android.launcher3.TestProtocol; import com.android.launcher3.Utilities; import com.android.launcher3.compat.AccessibilityManagerCompat; import com.android.launcher3.config.FeatureFlags; @@ -576,9 +577,10 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo @Override public boolean performAccessibilityAction(int action, Bundle arguments) { if (AccessibilityManagerCompat.processTestRequest( - mLauncher, "TAPL_GET_SCROLL", action, arguments, + mLauncher, TestProtocol.GET_SCROLL_MESSAGE, action, arguments, response -> - response.putInt("scrollY", getActiveRecyclerView().getCurrentScrollY()))) { + response.putInt(TestProtocol.SCROLL_Y_FIELD, + getActiveRecyclerView().getCurrentScrollY()))) { return true; } diff --git a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java index 3b0226e1c7..02da86186a 100644 --- a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java +++ b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java @@ -23,6 +23,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; +import com.android.launcher3.TestProtocol; import com.android.launcher3.Utilities; public class AccessibilityManagerCompat { @@ -95,7 +96,7 @@ public class AccessibilityManagerCompat { final Bundle response = new Bundle(); responseFiller.accept(response); AccessibilityManagerCompat.sendEventToTest( - accessibilityManager, eventTag + "_RESPONSE", response); + accessibilityManager, eventTag + TestProtocol.RESPONSE_MESSAGE_POSTFIX, response); return true; } return false; diff --git a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java index 0e277eabcd..fd9157e218 100644 --- a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java +++ b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java @@ -39,6 +39,7 @@ import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherStateManager.AnimationComponents; import com.android.launcher3.LauncherStateManager.AnimationConfig; import com.android.launcher3.LauncherStateManager.StateHandler; +import com.android.launcher3.TestProtocol; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; @@ -517,7 +518,8 @@ public abstract class AbstractStateChangeTouchController } mLauncher.getStateManager().goToState(targetState, false /* animated */); - AccessibilityManagerCompat.sendEventToTest(mLauncher, "TAPL_WENT_TO_STATE"); + AccessibilityManagerCompat.sendEventToTest( + mLauncher, TestProtocol.SWITCHED_TO_STATE_MESSAGE); } } diff --git a/tests/Android.mk b/tests/Android.mk index 1531c32df7..03cb154a40 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -46,7 +46,8 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ libSharedSystemUI LOCAL_SRC_FILES := $(call all-java-files-under, tapl) \ - ../quickstep/src/com/android/quickstep/SwipeUpSetting.java + ../quickstep/src/com/android/quickstep/SwipeUpSetting.java \ + ../src/com/android/launcher3/TestProtocol.java LOCAL_SDK_VERSION := current LOCAL_MODULE := ub-launcher-aosp-tapl diff --git a/tests/tapl/com/android/launcher3/tapl/AllApps.java b/tests/tapl/com/android/launcher3/tapl/AllApps.java index d64f86cbc1..c3bc61babf 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllApps.java +++ b/tests/tapl/com/android/launcher3/tapl/AllApps.java @@ -24,6 +24,8 @@ import android.support.test.uiautomator.UiObject2; import androidx.annotation.NonNull; +import com.android.launcher3.TestProtocol; + /** * Operations on AllApps opened from Home. Also a parent for All Apps opened from Overview. */ @@ -96,8 +98,8 @@ public class AllApps extends LauncherInstrumentation.VisibleContainer { } private int getScroll(UiObject2 allAppsContainer) { - return mLauncher.getAnswerFromLauncher(allAppsContainer, "TAPL_GET_SCROLL"). - getInt("scrollY", -1); + return mLauncher.getAnswerFromLauncher(allAppsContainer, TestProtocol.GET_SCROLL_MESSAGE). + getInt(TestProtocol.SCROLL_Y_FIELD, -1); } private void ensureIconVisible(UiObject2 appIcon, UiObject2 allAppsContainer) { diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index fa282c3334..01e76f3f30 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -34,6 +34,7 @@ import android.support.test.uiautomator.UiObject2; import android.support.test.uiautomator.Until; import android.view.accessibility.AccessibilityEvent; +import com.android.launcher3.TestProtocol; import com.android.quickstep.SwipeUpSetting; import java.lang.ref.WeakReference; @@ -174,7 +175,7 @@ public final class LauncherInstrumentation { Bundle getAnswerFromLauncher(UiObject2 view, String requestTag) { // Send a fake set-text request to Launcher to initiate a response with requested data. - final String responseTag = requestTag + "_RESPONSE"; + final String responseTag = requestTag + TestProtocol.RESPONSE_MESSAGE_POSTFIX; return executeAndWaitForEvent( () -> view.setText(requestTag), event -> responseTag.equals(event.getClassName()), @@ -338,7 +339,7 @@ public final class LauncherInstrumentation { void swipe(int startX, int startY, int endX, int endY) { executeAndWaitForEvent( () -> mDevice.swipe(startX, startY, endX, endY, 60), - event -> "TAPL_WENT_TO_STATE".equals(event.getClassName()), + event -> TestProtocol.SWITCHED_TO_STATE_MESSAGE.equals(event.getClassName()), "Swipe failed to receive an event for the swipe end: " + startX + ", " + startY + ", " + endX + ", " + endY); } -- GitLab From 1502c673d022ced571382e23302eb4a0aba72f9c Mon Sep 17 00:00:00 2001 From: arangelov Date: Mon, 16 Jul 2018 17:47:39 +0100 Subject: [PATCH 0074/1301] Prevent the work mode switch thumb from being dragged. When we normally press the work mode switch, it waits for the profile to receive the ACTION_MANAGED_PROFILE_AVAILABLE broadcast before the button UI actually toggles. The user never interacts directly with that switch. However, dragging the switch thumb used to bypass that logic. This CL makes sure dragging the switch thumb cannot happen in the first place. Change-Id: Ib3b4ae7591136c35e6d02783387d752e246cfb5b Fixes: 111211805 Test: Manual --- src/com/android/launcher3/allapps/WorkModeSwitch.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/com/android/launcher3/allapps/WorkModeSwitch.java b/src/com/android/launcher3/allapps/WorkModeSwitch.java index e7cf092093..d529f6fb59 100644 --- a/src/com/android/launcher3/allapps/WorkModeSwitch.java +++ b/src/com/android/launcher3/allapps/WorkModeSwitch.java @@ -20,6 +20,7 @@ import android.os.AsyncTask; import android.os.Process; import android.os.UserHandle; import android.util.AttributeSet; +import android.view.MotionEvent; import android.widget.Switch; import com.android.launcher3.compat.UserManagerCompat; @@ -60,6 +61,11 @@ public class WorkModeSwitch extends Switch { setEnabled(true); } + @Override + public boolean onTouchEvent(MotionEvent ev) { + return ev.getActionMasked() == MotionEvent.ACTION_MOVE || super.onTouchEvent(ev); + } + private void trySetQuietModeEnabledToAllProfilesAsync(boolean enabled) { new AsyncTask() { -- GitLab From 977690e931d1f58715713add88172a8c44bea960 Mon Sep 17 00:00:00 2001 From: Tony Date: Wed, 15 Aug 2018 14:02:56 -0700 Subject: [PATCH 0075/1301] Make arrow feel more connected to popup - Clip the arrow that is overlapped by the popup, so that it doesn't show when that part of the popup is highlighted - Animate the arrow first instead of last. Now the animation feels like one continuous motion as the arrow grows into the popup. Bug: 111159923 Bug: 111006276 Change-Id: I22fb3037d950d55fe6c8ed4dc5345279874f0a3a --- res/values/config.xml | 2 +- .../android/launcher3/popup/ArrowPopup.java | 72 +++++++++++++------ 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index 8d31bd271f..2a6b25cfcc 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -122,7 +122,7 @@ 150 - 80 + 40 300 diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java index 3bf8bef1b6..0bb5e2afd2 100644 --- a/src/com/android/launcher3/popup/ArrowPopup.java +++ b/src/com/android/launcher3/popup/ArrowPopup.java @@ -16,6 +16,8 @@ package com.android.launcher3.popup; +import static com.android.launcher3.anim.Interpolators.ACCEL_DEACCEL; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; @@ -35,7 +37,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; -import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.FrameLayout; import com.android.launcher3.AbstractFloatingView; @@ -66,7 +67,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { protected final Launcher mLauncher; protected final boolean mIsRtl; - private final int mArrayOffset; + private final int mArrowOffset; private final View mArrow; protected boolean mIsLeftAligned; @@ -99,7 +100,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { final int arrowHeight = resources.getDimensionPixelSize(R.dimen.popup_arrow_height); mArrow = new View(context); mArrow.setLayoutParams(new DragLayer.LayoutParams(arrowWidth, arrowHeight)); - mArrayOffset = resources.getDimensionPixelSize(R.dimen.popup_arrow_vertical_offset); + mArrowOffset = resources.getDimensionPixelSize(R.dimen.popup_arrow_vertical_offset); } public ArrowPopup(Context context, AttributeSet attrs) { @@ -187,11 +188,17 @@ public abstract class ArrowPopup extends AbstractFloatingView { int radius = getResources().getDimensionPixelSize(R.dimen.popup_arrow_corner_radius); arrowPaint.setPathEffect(new CornerPathEffect(radius)); mArrow.setBackground(arrowDrawable); + // Clip off the part of the arrow that is underneath the popup. + if (mIsAboveIcon) { + mArrow.setClipBounds(new Rect(0, -mArrowOffset, arrowLp.width, arrowLp.height)); + } else { + mArrow.setClipBounds(new Rect(0, 0, arrowLp.width, arrowLp.height + mArrowOffset)); + } mArrow.setElevation(getElevation()); } mArrow.setPivotX(arrowLp.width / 2); - mArrow.setPivotY(mIsAboveIcon ? 0 : arrowLp.height); + mArrow.setPivotY(mIsAboveIcon ? arrowLp.height : 0); animateOpen(); } @@ -220,7 +227,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { protected void orientAboutObject() { measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); int width = getMeasuredWidth(); - int extraVerticalSpace = mArrow.getLayoutParams().height + mArrayOffset + int extraVerticalSpace = mArrow.getLayoutParams().height + mArrowOffset + getResources().getDimensionPixelSize(R.dimen.popup_vertical_padding); int height = getMeasuredHeight() + extraVerticalSpace; @@ -309,11 +316,11 @@ public abstract class ArrowPopup extends AbstractFloatingView { if (mIsAboveIcon) { arrowLp.gravity = lp.gravity = Gravity.BOTTOM; lp.bottomMargin = getPopupContainer().getHeight() - y - getMeasuredHeight() - insets.top; - arrowLp.bottomMargin = lp.bottomMargin - arrowLp.height - mArrayOffset - insets.bottom; + arrowLp.bottomMargin = lp.bottomMargin - arrowLp.height - mArrowOffset - insets.bottom; } else { arrowLp.gravity = lp.gravity = Gravity.TOP; lp.topMargin = y + insets.top; - arrowLp.topMargin = lp.topMargin - insets.top - arrowLp.height - mArrayOffset; + arrowLp.topMargin = lp.topMargin - insets.top - arrowLp.height - mArrowOffset; } } @@ -343,7 +350,8 @@ public abstract class ArrowPopup extends AbstractFloatingView { final AnimatorSet openAnim = new AnimatorSet(); final Resources res = getResources(); final long revealDuration = (long) res.getInteger(R.integer.config_popupOpenCloseDuration); - final TimeInterpolator revealInterpolator = new AccelerateDecelerateInterpolator(); + final long arrowDuration = res.getInteger(R.integer.config_popupArrowOpenCloseDuration); + final TimeInterpolator revealInterpolator = ACCEL_DEACCEL; // Rectangular reveal. final ValueAnimator revealAnim = createOpenCloseOutlineProvider() @@ -351,16 +359,21 @@ public abstract class ArrowPopup extends AbstractFloatingView { revealAnim.setDuration(revealDuration); revealAnim.setInterpolator(revealInterpolator); - Animator fadeIn = ObjectAnimator.ofFloat(this, ALPHA, 0, 1); - fadeIn.setDuration(revealDuration); + ValueAnimator fadeIn = ValueAnimator.ofFloat(0, 1); + fadeIn.setDuration(revealDuration + arrowDuration); fadeIn.setInterpolator(revealInterpolator); + fadeIn.addUpdateListener(anim -> { + float alpha = (float) anim.getAnimatedValue(); + mArrow.setAlpha(alpha); + setAlpha(revealAnim.isStarted() ? alpha : 0); + }); openAnim.play(fadeIn); // Animate the arrow. mArrow.setScaleX(0); mArrow.setScaleY(0); Animator arrowScale = ObjectAnimator.ofFloat(mArrow, LauncherAnimUtils.SCALE_PROPERTY, 1) - .setDuration(res.getInteger(R.integer.config_popupArrowOpenDuration)); + .setDuration(arrowDuration); openAnim.addListener(new AnimatorListenerAdapter() { @Override @@ -371,7 +384,7 @@ public abstract class ArrowPopup extends AbstractFloatingView { }); mOpenCloseAnimator = openAnim; - openAnim.playSequentially(revealAnim, arrowScale); + openAnim.playSequentially(arrowScale, revealAnim); openAnim.start(); } @@ -388,26 +401,35 @@ public abstract class ArrowPopup extends AbstractFloatingView { } mIsOpen = false; - final AnimatorSet closeAnim = new AnimatorSet(); - // Hide the arrow - closeAnim.play(ObjectAnimator.ofFloat(mArrow, LauncherAnimUtils.SCALE_PROPERTY, 0)); - closeAnim.play(ObjectAnimator.ofFloat(mArrow, ALPHA, 0)); + final AnimatorSet closeAnim = new AnimatorSet(); final Resources res = getResources(); - final TimeInterpolator revealInterpolator = new AccelerateDecelerateInterpolator(); + final TimeInterpolator revealInterpolator = ACCEL_DEACCEL; + final long revealDuration = res.getInteger(R.integer.config_popupOpenCloseDuration); + final long arrowDuration = res.getInteger(R.integer.config_popupArrowOpenCloseDuration); + + // Hide the arrow + Animator scaleArrow = ObjectAnimator.ofFloat(mArrow, LauncherAnimUtils.SCALE_PROPERTY, 0) + .setDuration(arrowDuration); // Rectangular reveal (reversed). final ValueAnimator revealAnim = createOpenCloseOutlineProvider() .createRevealAnimator(this, true); + revealAnim.setDuration(revealDuration); revealAnim.setInterpolator(revealInterpolator); - closeAnim.play(revealAnim); + closeAnim.playSequentially(revealAnim, scaleArrow); - Animator fadeOut = ObjectAnimator.ofFloat(this, ALPHA, 0); + ValueAnimator fadeOut = ValueAnimator.ofFloat(getAlpha(), 0); + fadeOut.setDuration(revealDuration + arrowDuration); fadeOut.setInterpolator(revealInterpolator); + fadeOut.addUpdateListener(anim -> { + float alpha = (float) anim.getAnimatedValue(); + mArrow.setAlpha(alpha); + setAlpha(scaleArrow.isStarted() ? 0 : alpha); + }); closeAnim.play(fadeOut); onCreateCloseAnimation(closeAnim); - closeAnim.setDuration((long) res.getInteger(R.integer.config_popupOpenCloseDuration)); closeAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { @@ -429,21 +451,25 @@ public abstract class ArrowPopup extends AbstractFloatingView { protected void onCreateCloseAnimation(AnimatorSet anim) { } private RoundedRectRevealOutlineProvider createOpenCloseOutlineProvider() { - int arrowCenterX = getResources().getDimensionPixelSize(mIsLeftAligned ^ mIsRtl ? + Resources res = getResources(); + int arrowCenterX = res.getDimensionPixelSize(mIsLeftAligned ^ mIsRtl ? R.dimen.popup_arrow_horizontal_center_start: R.dimen.popup_arrow_horizontal_center_end); + int halfArrowWidth = res.getDimensionPixelSize(R.dimen.popup_arrow_width) / 2; + float arrowCornerRadius = res.getDimension(R.dimen.popup_arrow_corner_radius); if (!mIsLeftAligned) { arrowCenterX = getMeasuredWidth() - arrowCenterX; } int arrowCenterY = mIsAboveIcon ? getMeasuredHeight() : 0; - mStartRect.set(arrowCenterX, arrowCenterY, arrowCenterX, arrowCenterY); + mStartRect.set(arrowCenterX - halfArrowWidth, arrowCenterY, arrowCenterX + halfArrowWidth, + arrowCenterY); if (mEndRect.isEmpty()) { mEndRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); } return new RoundedRectRevealOutlineProvider - (mOutlineRadius, mOutlineRadius, mStartRect, mEndRect); + (arrowCornerRadius, mOutlineRadius, mStartRect, mEndRect); } /** -- GitLab From c677417d7abfcf5ba1c78848a254a19ad668f04c Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 17 Jun 2018 14:47:41 -0700 Subject: [PATCH 0076/1301] Polish shelf tracking - Offset distance based on where gesture started, so that the shelf is always under your finger even if you swiped up high on the nav bar - Use the same distance when swiping down to launch a task as we use for swiping up from an app (so that the swipe feels more reversible) - Allow swiping up in the gap between hotseat and overview, so there's no "dead zone" Bug: 109709720 Change-Id: I828d82e8feb250fd31e382d42aeefcb11d4a07d5 --- .../PortraitStatesTouchController.java | 10 ++++++++- .../quickstep/ActivityControlHelper.java | 22 +++++++++++++------ .../quickstep/OtherActivityTouchConsumer.java | 2 +- .../WindowTransformSwipeHandler.java | 16 +++++++++----- .../android/quickstep/util/LayoutUtils.java | 6 +++++ 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java index a1ae99eae9..8684c58f1d 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java @@ -46,6 +46,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.quickstep.RecentsModel; import com.android.quickstep.TouchInteractionService; +import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; @@ -97,11 +98,17 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr } return false; } + RecentsView recentsView = mLauncher.getOverviewPanel(); if (mLauncher.isInState(ALL_APPS)) { // In all-apps only listen if the container cannot scroll itself if (!mLauncher.getAppsView().shouldContainerScroll(ev)) { return false; } + } else if (mLauncher.isInState(OVERVIEW) && recentsView.getChildCount() > 0) { + // Allow swiping up in the gap between the hotseat and overview. + if (ev.getY() < recentsView.getChildAt(0).getBottom()) { + return false; + } } else { // For all other states, only listen if the event originated below the hotseat height DeviceProfile dp = mLauncher.getDeviceProfile(); @@ -197,7 +204,7 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr // Reset the state manager, when changing the interaction mode mLauncher.getStateManager().goToState(OVERVIEW, false /* animate */); mPendingAnimation = recentsView.createTaskLauncherAnimation(taskView, maxAccuracy); - mPendingAnimation.anim.setInterpolator(Interpolators.ZOOM_IN); + mPendingAnimation.anim.setInterpolator(Interpolators.LINEAR); Runnable onCancelRunnable = () -> { cancelPendingAnim(); @@ -206,6 +213,7 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr mCurrentAnimation = AnimatorPlaybackController.wrap(mPendingAnimation.anim, maxAccuracy, onCancelRunnable); mLauncher.getStateManager().setCurrentUserControlledAnimation(mCurrentAnimation); + totalShift = LayoutUtils.getShelfTrackingDistance(mLauncher.getDeviceProfile()); } else { mCurrentAnimation = mLauncher.getStateManager() .createAnimationToNewWorkspace(mToState, builder, maxAccuracy, this::clearState, diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 322e270e26..77af211f5e 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -16,7 +16,6 @@ package com.android.quickstep; import static android.view.View.TRANSLATION_Y; - import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.LauncherState.FAST_OVERVIEW; @@ -38,6 +37,7 @@ import android.app.ActivityManager.RunningTaskInfo; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.graphics.PointF; import android.graphics.Rect; import android.os.Build; import android.os.Handler; @@ -100,8 +100,13 @@ public interface ActivityControlHelper { void onTransitionCancelled(T activity, boolean activityVisible); + default int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, + @InteractionType int interactionType, TransformedRect outRect) { + return getSwipeUpDestinationAndLength(dp, context, interactionType, outRect, null); + } + int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, - @InteractionType int interactionType, TransformedRect outRect); + @InteractionType int interactionType, TransformedRect outRect, PointF touchTown); void onSwipeUpComplete(T activity); @@ -185,7 +190,7 @@ public interface ActivityControlHelper { @Override public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, - @InteractionType int interactionType, TransformedRect outRect) { + @InteractionType int interactionType, TransformedRect outRect, PointF touchDown) { LayoutUtils.calculateLauncherTaskSize(context, dp, outRect.rect); if (interactionType == INTERACTION_QUICK_SCRUB) { outRect.scale = FastOverviewState.getOverviewScale(dp, outRect.rect, context); @@ -195,9 +200,12 @@ public interface ActivityControlHelper { int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right; return dp.hotseatBarSizePx + hotseatInset; } else { - int shelfHeight = dp.hotseatBarSizePx + dp.getInsets().bottom; - // Track slightly below the top of the shelf (between top and content). - return shelfHeight - dp.edgeMarginPx * 2; + int swipeLength = LayoutUtils.getShelfTrackingDistance(dp); + if (touchDown != null) { + // We are already partway through based on where we touched the nav bar. + swipeLength -= dp.heightPx - touchDown.y; + } + return swipeLength; } } @@ -456,7 +464,7 @@ public interface ActivityControlHelper { @Override public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, - @InteractionType int interactionType, TransformedRect outRect) { + @InteractionType int interactionType, TransformedRect outRect, PointF touchDown) { LayoutUtils.calculateFallbackTaskSize(context, dp, outRect.rect); if (dp.isVerticalBarLayout()) { Rect targetInsets = dp.getInsets(); diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index 0e811f771f..c3e056812a 100644 --- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java +++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java @@ -444,7 +444,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC } else { TraceHelper.partitionSection("RecentsController", "Received"); mInteractionHandler.onRecentsAnimationStart(mController, mTargets, - mHomeContentInsets, mMinimizedHomeBounds); + mHomeContentInsets, mMinimizedHomeBounds, mDownPos); } } } diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 66655bd3c2..18fbfbbabc 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -36,6 +36,7 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Point; +import android.graphics.PointF; import android.graphics.Rect; import android.os.Build; import android.os.Bundle; @@ -175,6 +176,7 @@ public class WindowTransformSwipeHandler { protected boolean mIsGoingToHome; private DeviceProfile mDp; private int mTransitionDragLength; + private PointF mTouchDown; // Shift in the range of [0, 1]. // 0 => preview snapShot is completely visible, and hotseat is completely translated down @@ -340,12 +342,12 @@ public class WindowTransformSwipeHandler { } } - private void initTransitionEndpoints(DeviceProfile dp) { + private void initTransitionEndpoints(DeviceProfile dp, PointF touchDown) { mDp = dp; TransformedRect tempRect = new TransformedRect(); - mTransitionDragLength = mActivityControlHelper - .getSwipeUpDestinationAndLength(dp, mContext, mInteractionType, tempRect); + mTransitionDragLength = mActivityControlHelper.getSwipeUpDestinationAndLength( + dp, mContext, mInteractionType, tempRect, touchDown); mClipAnimationHelper.updateTargetRect(tempRect); } @@ -569,7 +571,7 @@ public class WindowTransformSwipeHandler { * Called by {@link #mLayoutListener} when launcher layout changes */ public void buildAnimationController() { - initTransitionEndpoints(mActivity.getDeviceProfile()); + initTransitionEndpoints(mActivity.getDeviceProfile(), mTouchDown); mAnimationFactory.createActivityController(mTransitionDragLength, mInteractionType); } @@ -619,7 +621,8 @@ public class WindowTransformSwipeHandler { } public void onRecentsAnimationStart(RecentsAnimationControllerCompat controller, - RemoteAnimationTargetSet targets, Rect homeContentInsets, Rect minimizedHomeBounds) { + RemoteAnimationTargetSet targets, Rect homeContentInsets, Rect minimizedHomeBounds, + PointF touchDown) { DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(mContext).getDeviceProfile(mContext); final Rect overviewStackBounds; RemoteAnimationTargetCompat runningTaskTarget = targets.findTask(mRunningTaskId); @@ -650,7 +653,8 @@ public class WindowTransformSwipeHandler { mClipAnimationHelper.updateSource(overviewStackBounds, runningTaskTarget); } mClipAnimationHelper.prepareAnimation(false /* isOpening */); - initTransitionEndpoints(dp); + mTouchDown = touchDown; + initTransitionEndpoints(dp, mTouchDown); mRecentsAnimationWrapper.setController(controller, targets); setStateOnUiThread(STATE_APP_CONTROLLER_RECEIVED); diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java index 7715f358a8..253e56fab1 100644 --- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java +++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java @@ -111,4 +111,10 @@ public class LayoutUtils { outRect.set(Math.round(x), Math.round(y), Math.round(x + outWidth), Math.round(y + outHeight)); } + + public static int getShelfTrackingDistance(DeviceProfile dp) { + int shelfHeight = dp.hotseatBarSizePx + dp.getInsets().bottom; + // Track slightly below the top of the shelf (between top and content). + return shelfHeight - dp.edgeMarginPx * 2; + } } -- GitLab From 923b81c14ffa56c9244853995960dc0bf6950b6a Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Thu, 16 Aug 2018 17:49:57 -0700 Subject: [PATCH 0077/1301] Reducing time of TaplTests run From ~245 to ~150 sec. Done by removing testing behaviors that don't depend on QS from tests marked with QuickstepOnOff attribute. Also fixing a bug that went unnoticed: now restoring Launcher QS mode after each test. Bug: 110103162 Test: TaplTests suite Change-Id: I715158b47ac1e370f578b8d4f13d9633283763fe --- .../com/android/launcher3/tapl/LauncherInstrumentation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 01e76f3f30..aa9792b35e 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -115,7 +115,7 @@ public final class LauncherInstrumentation { sActiveContainer = new WeakReference<>(container); } - boolean isSwipeUpEnabled() { + public boolean isSwipeUpEnabled() { return mSwipeUpEnabledOverride != null ? mSwipeUpEnabledOverride : mSwipeUpEnabled; } -- GitLab From ad7830586299906bd0b1f653e0a8ea1128c16a8c Mon Sep 17 00:00:00 2001 From: arangelov Date: Fri, 17 Aug 2018 14:46:45 +0100 Subject: [PATCH 0078/1301] Highlight work tab when user already in All Apps after creating WP. When a user created a work profile and was already in the All Apps view, the work tab was not highlighted, because the logic for that was only in AllAppsContainerView#onScrollUpEnd(). This CL highlights the tab when the user has resumed and the All Apps view is expanded. Bug: 79242814 Test: Manual Change-Id: I40af0d513c95f8084e21f4e276e9f56bcb06555e --- src/com/android/launcher3/Launcher.java | 1 + .../launcher3/allapps/AllAppsContainerView.java | 7 ++++++- .../allapps/AllAppsTransitionController.java | 12 +++++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 7f9932336c..f0ddd53edf 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -353,6 +353,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, public void onEnterAnimationComplete() { super.onEnterAnimationComplete(); UiFactory.onEnterAnimationComplete(this); + mAllAppsController.highlightWorkTabIfNecessary(); } @Override diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 6908ab48a6..3d15c757d0 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -486,8 +486,13 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo } public void onScrollUpEnd() { + highlightWorkTabIfNecessary(); + } + + void highlightWorkTabIfNecessary() { if (mUsingTabs) { - ((PersonalWorkSlidingTabStrip) findViewById(R.id.tabs)).highlightWorkTabIfNecessary(); + ((PersonalWorkSlidingTabStrip) findViewById(R.id.tabs)) + .highlightWorkTabIfNecessary(); } } diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 24a8d51451..e7313e8411 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -249,11 +249,21 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil if (Float.compare(mProgress, 1f) == 0) { mAppsView.setVisibility(View.INVISIBLE); mAppsView.reset(false /* animate */); - } else if (Float.compare(mProgress, 0f) == 0) { + } else if (isAllAppsExpanded()) { mAppsView.setVisibility(View.VISIBLE); mAppsView.onScrollUpEnd(); } else { mAppsView.setVisibility(View.VISIBLE); } } + + private boolean isAllAppsExpanded() { + return Float.compare(mProgress, 0f) == 0; + } + + public void highlightWorkTabIfNecessary() { + if (isAllAppsExpanded()) { + mAppsView.highlightWorkTabIfNecessary(); + } + } } -- GitLab From 4043b05cdef4e713b57f76e532539ead7e7c2ba6 Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 17 Aug 2018 13:47:39 -0700 Subject: [PATCH 0079/1301] Cancel badge scale anim when setting new badge scale Otherwise it's possible the badge scale animation will override the non-animated set value, which could mean a badge continues to show even though it shouldn't: - Animate badge scale to 1 - Before animation finishes, set badge scale to 0 - Badge scale ends at 1, since animation wasn't cancelled, so we continue to show it indefinitely Also exported some properties in case a similar issue arises. Bug: 111791593 Change-Id: Ia1a417239b909886adf9351e9bdc06a3b22d8b73 --- src/com/android/launcher3/BubbleTextView.java | 29 +++++++++++++++++-- .../launcher3/badge/FolderBadgeInfo.java | 3 ++ src/com/android/launcher3/folder/Folder.java | 2 +- .../android/launcher3/folder/FolderIcon.java | 26 +++++++++++++++-- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 01e3a10b0e..230ea4fea0 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -16,6 +16,8 @@ package com.android.launcher3; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.ColorStateList; @@ -112,10 +114,13 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, @ViewDebug.ExportedProperty(category = "launcher") private float mTextAlpha = 1; + @ViewDebug.ExportedProperty(category = "launcher") private BadgeInfo mBadgeInfo; private BadgeRenderer mBadgeRenderer; private int mBadgeColor; + @ViewDebug.ExportedProperty(category = "launcher") private float mBadgeScale; + private Animator mBadgeScaleAnim; private boolean mForceHideBadge; private Point mTempSpaceForBadgeOffset = new Point(); private Rect mTempIconBounds = new Rect(); @@ -188,10 +193,29 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, public void reset() { mBadgeInfo = null; mBadgeColor = Color.TRANSPARENT; + cancelBadgeScaleAnim(); mBadgeScale = 0f; mForceHideBadge = false; } + private void cancelBadgeScaleAnim() { + if (mBadgeScaleAnim != null) { + mBadgeScaleAnim.cancel(); + } + } + + private void animateBadgeScale(float... badgeScales) { + cancelBadgeScaleAnim(); + mBadgeScaleAnim = ObjectAnimator.ofFloat(this, BADGE_SCALE_PROPERTY, badgeScales); + mBadgeScaleAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mBadgeScaleAnim = null; + } + }); + mBadgeScaleAnim.start(); + } + public void applyFromShortcutInfo(ShortcutInfo info) { applyFromShortcutInfo(info, false); } @@ -378,7 +402,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, if (forceHideBadge) { invalidate(); } else if (hasBadge()) { - ObjectAnimator.ofFloat(this, BADGE_SCALE_PROPERTY, 0, 1).start(); + animateBadgeScale(0, 1); } } @@ -524,8 +548,9 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, if (wasBadged || isBadged) { // Animate when a badge is first added or when it is removed. if (animate && (wasBadged ^ isBadged) && isShown()) { - ObjectAnimator.ofFloat(this, BADGE_SCALE_PROPERTY, newBadgeScale).start(); + animateBadgeScale(newBadgeScale); } else { + cancelBadgeScaleAnim(); mBadgeScale = newBadgeScale; invalidate(); } diff --git a/src/com/android/launcher3/badge/FolderBadgeInfo.java b/src/com/android/launcher3/badge/FolderBadgeInfo.java index 3a1bf60c4d..fa5e8a43dd 100644 --- a/src/com/android/launcher3/badge/FolderBadgeInfo.java +++ b/src/com/android/launcher3/badge/FolderBadgeInfo.java @@ -16,6 +16,8 @@ package com.android.launcher3.badge; +import android.view.ViewDebug; + import com.android.launcher3.Utilities; /** @@ -56,6 +58,7 @@ public class FolderBadgeInfo extends BadgeInfo { return 0; } + @ViewDebug.ExportedProperty(category = "launcher") public boolean hasBadge() { return mNumNotifications > 0; } diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 6a3ebcfb00..a059627df8 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -644,7 +644,7 @@ public class Folder extends AbstractFloatingView implements DragSource, mFolderIcon.mBackground.animateBackgroundStroke(); mFolderIcon.onFolderClose(mContent.getCurrentPage()); if (mFolderIcon.hasBadge()) { - mFolderIcon.createBadgeScaleAnimator(0f, 1f).start(); + mFolderIcon.animateBadgeScale(0f, 1f); } mFolderIcon.requestFocus(); } diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 87a079604f..d09f03612f 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -20,6 +20,7 @@ import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_I import static com.android.launcher3.folder.PreviewItemManager.INITIAL_ITEM_ANIMATION_DURATION; import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Canvas; @@ -32,6 +33,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; +import android.view.ViewDebug; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -106,9 +108,12 @@ public class FolderIcon extends FrameLayout implements FolderListener { private Alarm mOpenAlarm = new Alarm(); + @ViewDebug.ExportedProperty(category = "launcher", deepExport = true) private FolderBadgeInfo mBadgeInfo = new FolderBadgeInfo(); private BadgeRenderer mBadgeRenderer; + @ViewDebug.ExportedProperty(category = "launcher") private float mBadgeScale; + private Animator mBadgeScaleAnim; private Point mTempSpaceForBadgeOffset = new Point(); private static final Property BADGE_SCALE_PROPERTY @@ -393,15 +398,30 @@ public class FolderIcon extends FrameLayout implements FolderListener { float newBadgeScale = isBadged ? 1f : 0f; // Animate when a badge is first added or when it is removed. if ((wasBadged ^ isBadged) && isShown()) { - createBadgeScaleAnimator(newBadgeScale).start(); + animateBadgeScale(newBadgeScale); } else { + cancelBadgeScaleAnim(); mBadgeScale = newBadgeScale; invalidate(); } } - public Animator createBadgeScaleAnimator(float... badgeScales) { - return ObjectAnimator.ofFloat(this, BADGE_SCALE_PROPERTY, badgeScales); + private void cancelBadgeScaleAnim() { + if (mBadgeScaleAnim != null) { + mBadgeScaleAnim.cancel(); + } + } + + public void animateBadgeScale(float... badgeScales) { + cancelBadgeScaleAnim(); + mBadgeScaleAnim = ObjectAnimator.ofFloat(this, BADGE_SCALE_PROPERTY, badgeScales); + mBadgeScaleAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mBadgeScaleAnim = null; + } + }); + mBadgeScaleAnim.start(); } public boolean hasBadge() { -- GitLab From e6627ebfed80dfe95bf3ad22dfe1234faf03e710 Mon Sep 17 00:00:00 2001 From: arangelov Date: Wed, 15 Aug 2018 19:58:01 +0100 Subject: [PATCH 0080/1301] Don't call BottomUserEducationView#close() while running animation. If while the work profile info card opening animation was playing you pressed the Work tab repeatedly, close() was called. That caused the animation to never complete properly (onAnimationEnd() was never called). This CL makes sure to not call close() if the animation is still running. Bug: 112471462 Bug: 112188042 Test: Manual Change-Id: I2e62e0c5c6f1d6132ea359a85cb6aadf57639c30 --- src/com/android/launcher3/views/AbstractSlideInView.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/views/AbstractSlideInView.java b/src/com/android/launcher3/views/AbstractSlideInView.java index 59bea48c8c..26c8f243b5 100644 --- a/src/com/android/launcher3/views/AbstractSlideInView.java +++ b/src/com/android/launcher3/views/AbstractSlideInView.java @@ -108,7 +108,8 @@ public abstract class AbstractSlideInView extends AbstractFloatingView @Override public boolean onControllerTouchEvent(MotionEvent ev) { mSwipeDetector.onTouchEvent(ev); - if (ev.getAction() == MotionEvent.ACTION_UP && mSwipeDetector.isIdleState()) { + if (ev.getAction() == MotionEvent.ACTION_UP && mSwipeDetector.isIdleState() + && !isOpeningAnimationRunning()) { // If we got ACTION_UP without ever starting swipe, close the panel. if (!getPopupContainer().isEventOverView(mContent, ev)) { close(true); @@ -117,6 +118,10 @@ public abstract class AbstractSlideInView extends AbstractFloatingView return true; } + private boolean isOpeningAnimationRunning() { + return mIsOpen && mOpenCloseAnimator.isRunning(); + } + /* SwipeDetector.Listener */ @Override @@ -154,7 +159,7 @@ public abstract class AbstractSlideInView extends AbstractFloatingView onCloseComplete(); return; } - if (!mIsOpen || mOpenCloseAnimator.isRunning()) { + if (!mIsOpen) { return; } mOpenCloseAnimator.setValues( -- GitLab From 0a9f3ab4a6acf1a5560d4e4039c88a697529d9d4 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 15 Aug 2018 15:28:47 -0700 Subject: [PATCH 0081/1301] Converting tests to Androidx Bug: 112610679 Change-Id: I712826e668f1fbeb4e47cc541d4f5296d8eb74c0 --- tests/Android.mk | 8 ++++---- .../search/DefaultAppSearchAlgorithmTest.java | 2 +- .../com/android/launcher3/logging/FileLogTest.java | 6 +++--- .../launcher3/model/AddWorkspaceItemsTaskTest.java | 2 +- .../model/BaseModelUpdateTaskTestCase.java | 4 ++-- .../launcher3/model/CacheDataUpdatedTaskTest.java | 2 +- .../launcher3/model/DbDowngradeHelperTest.java | 6 +++--- .../launcher3/model/GridSizeMigrationTaskTest.java | 8 ++++---- .../android/launcher3/model/LoaderCursorTest.java | 6 +++--- .../model/PackageInstallStateChangedTaskTest.java | 2 +- .../launcher3/popup/PopupPopulatorTest.java | 2 +- .../launcher3/provider/RestoreDbTaskTest.java | 6 +++--- .../android/launcher3/touch/SwipeDetectorTest.java | 6 +++--- .../launcher3/ui/AbstractLauncherUiTest.java | 14 +++++++------- .../launcher3/ui/AllAppsIconToHomeTest.java | 10 +++++----- .../android/launcher3/ui/ShortcutsLaunchTest.java | 10 +++++----- .../android/launcher3/ui/ShortcutsToHomeTest.java | 10 +++++----- .../src/com/android/launcher3/ui/WorkTabTest.java | 4 ++-- .../launcher3/ui/widget/AddConfigWidgetTest.java | 8 ++++---- .../android/launcher3/ui/widget/AddWidgetTest.java | 8 ++++---- .../launcher3/ui/widget/BindWidgetTest.java | 6 +++--- .../launcher3/ui/widget/RequestPinItemTest.java | 10 +++++----- .../src/com/android/launcher3/util/Condition.java | 2 +- .../android/launcher3/util/GridOccupancyTest.java | 4 ++-- .../launcher3/util/rule/LauncherActivityRule.java | 2 +- .../launcher3/util/rule/ShellCommandRule.java | 2 +- .../launcher3/widget/WidgetsListAdapterTest.java | 6 +++--- tests/tapl/com/android/launcher3/tapl/AllApps.java | 6 +++--- .../launcher3/tapl/AllAppsFromOverview.java | 2 +- tests/tapl/com/android/launcher3/tapl/AppIcon.java | 8 ++++---- tests/tapl/com/android/launcher3/tapl/Home.java | 2 +- .../launcher3/tapl/LauncherInstrumentation.java | 12 ++++++------ .../tapl/com/android/launcher3/tapl/Overview.java | 4 ++-- .../com/android/launcher3/tapl/OverviewTask.java | 6 +++--- tests/tapl/com/android/launcher3/tapl/Widgets.java | 4 ++-- .../tapl/com/android/launcher3/tapl/Workspace.java | 4 ++-- 36 files changed, 102 insertions(+), 102 deletions(-) diff --git a/tests/Android.mk b/tests/Android.mk index 03cb154a40..8e1f2930df 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -18,8 +18,8 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_STATIC_JAVA_LIBRARIES := \ - android-support-test \ - ub-uiautomator \ + androidx-test \ + androidx.test.uiautomator_uiautomator \ mockito-target-minus-junit4 \ ub-launcher-aosp-tapl @@ -41,8 +41,8 @@ include $(BUILD_PACKAGE) include $(CLEAR_VARS) LOCAL_STATIC_JAVA_LIBRARIES := \ androidx.annotation_annotation \ - android-support-test \ - ub-uiautomator \ + androidx-test \ + androidx.test.uiautomator_uiautomator \ libSharedSystemUI LOCAL_SRC_FILES := $(call all-java-files-under, tapl) \ diff --git a/tests/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithmTest.java b/tests/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithmTest.java index 846a163700..ab2adaaefa 100644 --- a/tests/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithmTest.java +++ b/tests/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithmTest.java @@ -16,7 +16,7 @@ package com.android.launcher3.allapps.search; import android.content.ComponentName; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.AppInfo; import com.android.launcher3.Utilities; diff --git a/tests/src/com/android/launcher3/logging/FileLogTest.java b/tests/src/com/android/launcher3/logging/FileLogTest.java index 9c7cb8f61c..e031f1d34a 100644 --- a/tests/src/com/android/launcher3/logging/FileLogTest.java +++ b/tests/src/com/android/launcher3/logging/FileLogTest.java @@ -1,8 +1,8 @@ package com.android.launcher3.logging; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; diff --git a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java index 401711d072..dae8f2f9ab 100644 --- a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java +++ b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java @@ -7,7 +7,7 @@ import android.content.Context; import android.content.Intent; import android.graphics.Rect; import android.net.Uri; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.runner.AndroidJUnit4; import android.util.Pair; import com.android.launcher3.ItemInfo; diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index 5d5af4f24f..dd3e859fda 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -18,8 +18,8 @@ import android.graphics.Bitmap.Config; import android.graphics.Color; import android.os.Process; import android.os.UserHandle; -import android.support.test.InstrumentationRegistry; -import android.support.test.rule.provider.ProviderTestRule; +import androidx.test.InstrumentationRegistry; +import androidx.test.rule.provider.ProviderTestRule; import com.android.launcher3.AllAppsList; import com.android.launcher3.AppFilter; diff --git a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java index ac9d319c83..59f807acf2 100644 --- a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java +++ b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java @@ -1,6 +1,6 @@ package com.android.launcher3.model; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.AppInfo; import com.android.launcher3.ItemInfo; diff --git a/tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java b/tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java index 1d9148ba13..0903ddc16d 100644 --- a/tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java +++ b/tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java @@ -25,9 +25,9 @@ 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 androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.LauncherProvider; import com.android.launcher3.LauncherProvider.DatabaseHelper; diff --git a/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java b/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java index 031909fe12..b2fd1d9687 100644 --- a/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java +++ b/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java @@ -7,10 +7,10 @@ import android.content.ContextWrapper; import android.content.Intent; import android.database.Cursor; import android.graphics.Point; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.MediumTest; -import android.support.test.rule.provider.ProviderTestRule; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.MediumTest; +import androidx.test.rule.provider.ProviderTestRule; +import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherModel; diff --git a/tests/src/com/android/launcher3/model/LoaderCursorTest.java b/tests/src/com/android/launcher3/model/LoaderCursorTest.java index dfefa3140a..29e54b1374 100644 --- a/tests/src/com/android/launcher3/model/LoaderCursorTest.java +++ b/tests/src/com/android/launcher3/model/LoaderCursorTest.java @@ -6,9 +6,9 @@ import android.content.Intent; import android.database.MatrixCursor; import android.graphics.Bitmap; import android.os.Process; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.IconCache; import com.android.launcher3.InvariantDeviceProfile; diff --git a/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java b/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java index 0a741c4792..51e21e2c76 100644 --- a/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java +++ b/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java @@ -1,6 +1,6 @@ package com.android.launcher3.model; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppWidgetInfo; diff --git a/tests/src/com/android/launcher3/popup/PopupPopulatorTest.java b/tests/src/com/android/launcher3/popup/PopupPopulatorTest.java index 9a89b1b2f2..6a1dc96671 100644 --- a/tests/src/com/android/launcher3/popup/PopupPopulatorTest.java +++ b/tests/src/com/android/launcher3/popup/PopupPopulatorTest.java @@ -17,7 +17,7 @@ package com.android.launcher3.popup; import android.content.pm.ShortcutInfo; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.shortcuts.ShortcutInfoCompat; diff --git a/tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java b/tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java index 5d417b5bcf..babb7315eb 100644 --- a/tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java +++ b/tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java @@ -3,9 +3,9 @@ package com.android.launcher3.provider; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.MediumTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.MediumTest; +import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.LauncherProvider.DatabaseHelper; import com.android.launcher3.LauncherSettings.Favorites; diff --git a/tests/src/com/android/launcher3/touch/SwipeDetectorTest.java b/tests/src/com/android/launcher3/touch/SwipeDetectorTest.java index ff83131d10..73b6dafd1e 100644 --- a/tests/src/com/android/launcher3/touch/SwipeDetectorTest.java +++ b/tests/src/com/android/launcher3/touch/SwipeDetectorTest.java @@ -15,9 +15,9 @@ */ package com.android.launcher3.touch; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import android.util.Log; import android.view.MotionEvent; import android.view.ViewConfiguration; diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index 46a6446f24..7e8890ad2a 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -29,13 +29,13 @@ import android.graphics.Point; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; -import android.support.test.InstrumentationRegistry; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.BySelector; -import android.support.test.uiautomator.Direction; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; +import androidx.test.InstrumentationRegistry; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.BySelector; +import androidx.test.uiautomator.Direction; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; import android.util.Log; import android.view.MotionEvent; diff --git a/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java b/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java index 8b9c58400f..23560e881a 100644 --- a/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java +++ b/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java @@ -3,11 +3,11 @@ package com.android.launcher3.ui; import static org.junit.Assert.assertTrue; import android.content.pm.LauncherActivityInfo; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; import com.android.launcher3.util.Condition; import com.android.launcher3.util.Wait; diff --git a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java index f913470370..f8a7bf79e4 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java @@ -5,11 +5,11 @@ import static org.junit.Assert.assertTrue; import android.content.pm.LauncherActivityInfo; import android.graphics.Point; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; import android.view.MotionEvent; import com.android.launcher3.R; diff --git a/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java b/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java index 4f5c1137b3..ff1dcf3d6c 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java @@ -5,11 +5,11 @@ import static org.junit.Assert.assertTrue; import android.content.pm.LauncherActivityInfo; import android.graphics.Point; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; import android.view.MotionEvent; import com.android.launcher3.R; diff --git a/tests/src/com/android/launcher3/ui/WorkTabTest.java b/tests/src/com/android/launcher3/ui/WorkTabTest.java index 2f867f366a..044b7f3382 100644 --- a/tests/src/com/android/launcher3/ui/WorkTabTest.java +++ b/tests/src/com/android/launcher3/ui/WorkTabTest.java @@ -19,8 +19,8 @@ import static com.android.launcher3.LauncherState.ALL_APPS; import static org.junit.Assert.assertTrue; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.util.rule.ShellCommandRule; diff --git a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java index 7f6dd44d1d..183e3908ee 100644 --- a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java @@ -22,10 +22,10 @@ import static org.junit.Assert.assertTrue; import android.appwidget.AppWidgetManager; import android.content.Intent; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.UiObject2; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiObject2; import android.view.View; import com.android.launcher3.ItemInfo; diff --git a/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java index d89f26e8a2..050f046d00 100644 --- a/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/AddWidgetTest.java @@ -17,10 +17,10 @@ package com.android.launcher3.ui.widget; import static org.junit.Assert.assertTrue; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.UiObject2; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiObject2; import android.view.View; import com.android.launcher3.ItemInfo; diff --git a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java index c8c38965c1..0dc9b2e675 100644 --- a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java @@ -30,9 +30,9 @@ import android.content.pm.PackageInstaller.SessionParams; import android.content.pm.PackageManager; import android.database.Cursor; import android.os.Bundle; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.UiSelector; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; +import androidx.test.uiautomator.UiSelector; import com.android.launcher3.LauncherAppWidgetHost; import com.android.launcher3.LauncherAppWidgetInfo; diff --git a/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java b/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java index ec0a0513ba..74f0978b44 100644 --- a/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java +++ b/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java @@ -23,11 +23,11 @@ import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.content.Intent; import android.graphics.Color; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; import android.view.View; import com.android.launcher3.ItemInfo; diff --git a/tests/src/com/android/launcher3/util/Condition.java b/tests/src/com/android/launcher3/util/Condition.java index 78c652a29e..b564a1a873 100644 --- a/tests/src/com/android/launcher3/util/Condition.java +++ b/tests/src/com/android/launcher3/util/Condition.java @@ -1,6 +1,6 @@ package com.android.launcher3.util; -import android.support.test.uiautomator.UiObject2; +import androidx.test.uiautomator.UiObject2; import com.android.launcher3.MainThreadExecutor; diff --git a/tests/src/com/android/launcher3/util/GridOccupancyTest.java b/tests/src/com/android/launcher3/util/GridOccupancyTest.java index fdd8e88863..cbf30b1788 100644 --- a/tests/src/com/android/launcher3/util/GridOccupancyTest.java +++ b/tests/src/com/android/launcher3/util/GridOccupancyTest.java @@ -1,7 +1,7 @@ package com.android.launcher3.util; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/tests/src/com/android/launcher3/util/rule/LauncherActivityRule.java b/tests/src/com/android/launcher3/util/rule/LauncherActivityRule.java index edd152a2c7..1c7160fe51 100644 --- a/tests/src/com/android/launcher3/util/rule/LauncherActivityRule.java +++ b/tests/src/com/android/launcher3/util/rule/LauncherActivityRule.java @@ -20,7 +20,7 @@ import android.app.Application; import android.app.Application.ActivityLifecycleCallbacks; import android.content.Intent; import android.os.Bundle; -import android.support.test.InstrumentationRegistry; +import androidx.test.InstrumentationRegistry; import com.android.launcher3.Launcher; import com.android.launcher3.Workspace.ItemOperator; diff --git a/tests/src/com/android/launcher3/util/rule/ShellCommandRule.java b/tests/src/com/android/launcher3/util/rule/ShellCommandRule.java index dba2d71003..9f0db2bf9e 100644 --- a/tests/src/com/android/launcher3/util/rule/ShellCommandRule.java +++ b/tests/src/com/android/launcher3/util/rule/ShellCommandRule.java @@ -18,7 +18,7 @@ package com.android.launcher3.util.rule; import android.content.ComponentName; import android.content.pm.ActivityInfo; import android.os.ParcelFileDescriptor; -import android.support.test.InstrumentationRegistry; +import androidx.test.InstrumentationRegistry; import org.junit.rules.TestRule; import org.junit.runner.Description; diff --git a/tests/src/com/android/launcher3/widget/WidgetsListAdapterTest.java b/tests/src/com/android/launcher3/widget/WidgetsListAdapterTest.java index 5befeb9abe..d5b14f2985 100644 --- a/tests/src/com/android/launcher3/widget/WidgetsListAdapterTest.java +++ b/tests/src/com/android/launcher3/widget/WidgetsListAdapterTest.java @@ -24,9 +24,9 @@ import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Bitmap; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import android.view.LayoutInflater; import com.android.launcher3.IconCache; diff --git a/tests/tapl/com/android/launcher3/tapl/AllApps.java b/tests/tapl/com/android/launcher3/tapl/AllApps.java index c3bc61babf..c1eba202cf 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllApps.java +++ b/tests/tapl/com/android/launcher3/tapl/AllApps.java @@ -18,9 +18,9 @@ package com.android.launcher3.tapl; import static org.junit.Assert.assertTrue; -import android.support.test.uiautomator.BySelector; -import android.support.test.uiautomator.Direction; -import android.support.test.uiautomator.UiObject2; +import androidx.test.uiautomator.BySelector; +import androidx.test.uiautomator.Direction; +import androidx.test.uiautomator.UiObject2; import androidx.annotation.NonNull; diff --git a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java index 07e73fc9be..dd286bd1f2 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java +++ b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java @@ -17,7 +17,7 @@ package com.android.launcher3.tapl; import android.graphics.Point; -import android.support.test.uiautomator.UiObject2; +import androidx.test.uiautomator.UiObject2; import androidx.annotation.NonNull; diff --git a/tests/tapl/com/android/launcher3/tapl/AppIcon.java b/tests/tapl/com/android/launcher3/tapl/AppIcon.java index 721f7a8ef8..a0f32a4569 100644 --- a/tests/tapl/com/android/launcher3/tapl/AppIcon.java +++ b/tests/tapl/com/android/launcher3/tapl/AppIcon.java @@ -18,10 +18,10 @@ package com.android.launcher3.tapl; import static org.junit.Assert.assertTrue; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.BySelector; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.BySelector; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; import android.widget.TextView; /** diff --git a/tests/tapl/com/android/launcher3/tapl/Home.java b/tests/tapl/com/android/launcher3/tapl/Home.java index 786f260b8b..815a63e6f1 100644 --- a/tests/tapl/com/android/launcher3/tapl/Home.java +++ b/tests/tapl/com/android/launcher3/tapl/Home.java @@ -16,7 +16,7 @@ package com.android.launcher3.tapl; -import android.support.test.uiautomator.UiObject2; +import androidx.test.uiautomator.UiObject2; import androidx.annotation.NonNull; diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 01e76f3f30..bf8b537ece 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -26,12 +26,12 @@ import android.app.ActivityManager; import android.app.UiAutomation; import android.os.Bundle; import android.provider.Settings; -import android.support.test.InstrumentationRegistry; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.BySelector; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; +import androidx.test.InstrumentationRegistry; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.BySelector; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; import android.view.accessibility.AccessibilityEvent; import com.android.launcher3.TestProtocol; diff --git a/tests/tapl/com/android/launcher3/tapl/Overview.java b/tests/tapl/com/android/launcher3/tapl/Overview.java index 3c0ae2daf6..be1d219af2 100644 --- a/tests/tapl/com/android/launcher3/tapl/Overview.java +++ b/tests/tapl/com/android/launcher3/tapl/Overview.java @@ -19,8 +19,8 @@ package com.android.launcher3.tapl; import static org.junit.Assert.assertNotEquals; import android.graphics.Point; -import android.support.test.uiautomator.Direction; -import android.support.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Direction; +import androidx.test.uiautomator.UiObject2; import java.util.Collections; import java.util.List; diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java index 0b3a26492e..ecad768539 100644 --- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java +++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java @@ -18,9 +18,9 @@ package com.android.launcher3.tapl; import static org.junit.Assert.assertTrue; -import android.support.test.uiautomator.Direction; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; +import androidx.test.uiautomator.Direction; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; /** * A recent task in the overview panel carousel. diff --git a/tests/tapl/com/android/launcher3/tapl/Widgets.java b/tests/tapl/com/android/launcher3/tapl/Widgets.java index f67ef4c774..facf1c6d73 100644 --- a/tests/tapl/com/android/launcher3/tapl/Widgets.java +++ b/tests/tapl/com/android/launcher3/tapl/Widgets.java @@ -16,8 +16,8 @@ package com.android.launcher3.tapl; -import android.support.test.uiautomator.Direction; -import android.support.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Direction; +import androidx.test.uiautomator.UiObject2; /** * All widgets container. diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java index c58c24443a..f5b01ee9b2 100644 --- a/tests/tapl/com/android/launcher3/tapl/Workspace.java +++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java @@ -19,8 +19,8 @@ package com.android.launcher3.tapl; import static junit.framework.TestCase.assertTrue; import android.graphics.Point; -import android.support.test.uiautomator.Direction; -import android.support.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Direction; +import androidx.test.uiautomator.UiObject2; import android.view.KeyEvent; import androidx.annotation.NonNull; -- GitLab From fd34b94b33e926d91beb5d386e96e346fc428b08 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Tue, 21 Aug 2018 16:30:09 -0700 Subject: [PATCH 0082/1301] Passing instrumentation to LauncherInstrumentation UiDevice, the old param, belongs to a support lib; as TAPL switched to AndroidX, it became impossible to pass it from platform tests that still use the old support lib. Bug: 110103162 Test: TaplTests Change-Id: I1f82099b432912fa40da96df0d6179579aab66a3 --- .../launcher3/ui/AbstractLauncherUiTest.java | 7 +++--- .../tapl/LauncherInstrumentation.java | 23 ++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index 7e8890ad2a..f81463a76b 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -29,6 +29,9 @@ import android.graphics.Point; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; +import android.util.Log; +import android.view.MotionEvent; + import androidx.test.InstrumentationRegistry; import androidx.test.uiautomator.By; import androidx.test.uiautomator.BySelector; @@ -36,8 +39,6 @@ import androidx.test.uiautomator.Direction; import androidx.test.uiautomator.UiDevice; import androidx.test.uiautomator.UiObject2; import androidx.test.uiautomator.Until; -import android.util.Log; -import android.view.MotionEvent; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; @@ -90,7 +91,7 @@ public abstract class AbstractLauncherUiTest { @Before public void setUp() throws Exception { mDevice = UiDevice.getInstance(getInstrumentation()); - mLauncher = new LauncherInstrumentation(mDevice); + mLauncher = new LauncherInstrumentation(getInstrumentation()); mTargetContext = InstrumentationRegistry.getTargetContext(); mTargetPackage = mTargetContext.getPackageName(); } diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 74a91a4678..09bf403aa1 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -23,16 +23,19 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.app.ActivityManager; +import android.app.Instrumentation; import android.app.UiAutomation; import android.os.Bundle; import android.provider.Settings; -import androidx.test.InstrumentationRegistry; +import android.view.accessibility.AccessibilityEvent; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.test.uiautomator.By; import androidx.test.uiautomator.BySelector; import androidx.test.uiautomator.UiDevice; import androidx.test.uiautomator.UiObject2; import androidx.test.uiautomator.Until; -import android.view.accessibility.AccessibilityEvent; import com.android.launcher3.TestProtocol; import com.android.quickstep.SwipeUpSetting; @@ -40,9 +43,6 @@ import com.android.quickstep.SwipeUpSetting; import java.lang.ref.WeakReference; import java.util.concurrent.TimeoutException; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - /** * The main tapl object. The only object that can be explicitly constructed by the using code. It * produces all other objects. @@ -90,17 +90,19 @@ public final class LauncherInstrumentation { private final UiDevice mDevice; private final boolean mSwipeUpEnabled; private Boolean mSwipeUpEnabledOverride = null; + private final Instrumentation mInstrumentation; /** * Constructs the root of TAPL hierarchy. You get all other objects from it. */ - public LauncherInstrumentation(UiDevice device) { - mDevice = device; + public LauncherInstrumentation(Instrumentation instrumentation) { + mInstrumentation = instrumentation; + mDevice = UiDevice.getInstance(instrumentation); final boolean swipeUpEnabledDefault = !SwipeUpSetting.isSwipeUpSettingAvailable() || SwipeUpSetting.isSwipeUpEnabledDefaultValue(); mSwipeUpEnabled = Settings.Secure.getInt( - InstrumentationRegistry.getTargetContext().getContentResolver(), + instrumentation.getTargetContext().getContentResolver(), SWIPE_UP_SETTING_NAME, swipeUpEnabledDefault ? 1 : 0) == 1; assertTrue("Device must run in a test harness", ActivityManager.isRunningInTestHarness()); @@ -162,9 +164,8 @@ public final class LauncherInstrumentation { UiAutomation.AccessibilityEventFilter eventFilter, String message) { try { final AccessibilityEvent event = - InstrumentationRegistry.getInstrumentation().getUiAutomation() - .executeAndWaitForEvent( - command, eventFilter, WAIT_TIME_MS); + mInstrumentation.getUiAutomation().executeAndWaitForEvent( + command, eventFilter, WAIT_TIME_MS); assertNotNull("executeAndWaitForEvent returned null (this can't happen)", event); return (Bundle) event.getParcelableData(); } catch (TimeoutException e) { -- GitLab From 018e3c4447ad77344c378bf3cca4a6484fa45a9e Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 22 Aug 2018 15:35:52 -0700 Subject: [PATCH 0083/1301] Update the shared lib for lambda definitions removal Bug: 112849320 Change-Id: I9b8971a84368eee88bf6fc5a4c0e39b32e7ea891 --- quickstep/libs/sysui_shared.jar | Bin 133150 -> 143824 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 27de1e9075d3b2e5504f8e714234365355592f3f..d2072b63cd0df1ff8fa0e33cdae422f0b01ff845 100644 GIT binary patch literal 143824 zcmce;19WB0x;C0l$F|wAZFOwhwzI;HlNEK;v2EMx*fu)0ZQShr?S1ap|9{TD=f}8n zj5RghsyS!X^Hx3eyj4p<`YRY3$X^>V=RZ#Vet-r61CbR~5u}rp6JvNE0Rd6?7t@^) zvlO~d!@vFhmcf6R$_mO!iis+#(94R+8roT!nF5^Y)J&ZKmiBhsL`?LIFv3ozhR&uY zbV457L;!nxJ9GUXmJTp5|C;^ZU*R7+u+O8hy)DCkZ2|WW3qv~-Cwohie`AUMKUe}h z0M4eiE|&i$3EqE|1Ylw4WctsCL4iPh+Wl)0lKg+9RH8SwF$4g-B5I`izGFcgbnT)< zPV=1htI_H7Db*mC2lP-a+Q;^IMY8!@B8M;fHu z8r&My-mC?ZUF%CXEbOfsT2X4nIi5$>mKDg#ZYq4HxtIW3hZ|}d5bA8Lo@$7D3o2hR z$3mefB-{gjfmp3D3V4dI`(ac4l3_H49P$Ns9WL~;uf5Lt{Nj%f1!+jAfo|1@>CY>? zFaINQK5zcVM*4a7x2pYT#r;Qh{G)80OpQ(LoB{u+o&T(izyCLLkd${db#k>dbyIM% zclRI_F*P%Ev2p&Z0@CAj~i%`x8_)Fue9iyrnE}fXWVnXI>t1~*sq#|QUmB;rX zuYMobHagiMRiMFf{T{>@Sg1i&`9^&8M=7Tb=x2YkGkUiGYjvg##W7*Bi!SPHDdY-4zmkl~ZxeL!sTngfVoZuT`ypJyXGftX z3mz*+JM^tGkJ+tOR8tkOA~RB~wXq^~D3?`ep(2)IJ*H(2_=O6l<{c1RmTgk6Fy7(k zEB7iGE7S{J^k~*?nEPL2W6v10ThG~{oY};v02}53ziO*`3WI72Yi;VPG_x*kD3$6E zh{;4V(tO)c)-4w9A})S(^+K`aGGAA<$LoN&mt{r_P#jGXQ_XYIx9f0~Jn!(P?g5vi!DS2#tY4MEYe{ zP>c-<8w3FgjHuzA=a2&g!_1Ene#{8tyPbj`?KKFLeKrV<%{t=ARW%bKI|k%%@pStB zB_0qHB$j9_u-cDf$Dp68`kS8I@AaNl$Lc+*YSDIslHyr9~IEm_1iXjjw( zHTZ$DKwbb}{cQPVeH)V6QaWu|Y4)hKSgz<2_@zYtwvmE-m3A;uya z?AHgYY8WrwJ+d`>UE|mou*mI1E3^9G(HC>sZtVfZAXld`o3Xw9G2Xbl-z-fq)cP7O zB_G=Y@%(6^Fk;<5Jgv{P}C2S2>XX^u_nl8=gdm$`BKq z?XB3VvNX%saA3GJrXm%3p0_ZQ+bUi;vMg0{UPpP{WqwWJA|2++J@g^Sy$cCPz&diZ zlFa6qsg5Kn13PTB#l4m<4!jS9E z4B~|GsI82&ekQm`-P0M>SbV{M8BmFK1G(MJR3HtSRcMJ z9K~h~8KgBdj?Q2ooJf%qd%Guxe~==lz@l<<(g-E3(;Pj*VgYc`P=MW82Q@wz*d%b* zj5MuY9ipYRv{&>b9{TSo+G01XnJhGn3#(9VN4#@F3JuHcB(v*+XrhQ1%7_W#gVSK)mDm-gGHaSY)<>s zpwFzNwy|taYrJ(~RVF)yGnSASQ6HqRmjsmCx`Z~W-N3}Y5HE53^0Ln$w{2OSz@O;$0f~v6X2^l(Pm^x z>DE-4&o4+@S+|^+h>6n;;z)AdKZY^6{l?RC=qVW+3Qa%{n3n$0TL_LTx4fg)#6}iB zhJC1oDl|2LV4^}OYgK5-Qo&1@oT{KSAG{Ybe#FFZ)kEbuBdHx0!QAAPvwsrL8Iy1umbx4QMsHbz+h;(!96WRr?&zw}72hPRyP}`q+BKshC=~`9FEDnp!pT_!= z>Jw++G&c1l1m({mioQ!Uoib)g;mQ{ z;Zz^|rf=`_!d3ltoDjye>bxvV#)IstC=xS*U{Dc@qX2W72eU;$l%xK=`Pmaqb+A*~ z0Ef~@pgI%e(hcstTWft+&p_ITP0{LmwAFGX5w&kS%g!?gSXr0wruMs|_3f^}9aGFJ z=ml0zX5jk1mOa2Aug3kP3#Jj`wIYO5CT4~D1R4cQsR=r>a@k_6x{%y8M8YQVmjkS@ z8KoLKHk;8H3c^h5jcDU~;VuHMoia)qnUcsj+)1G-AbiMC7`_p^N=6wd2rEe>*>wJO zrCwOX&y7(8N*XxJ zogMwcDTX}g9|*RQ6YxEB1WA@SH3n(?f|6&y=%)~Chz71K(1NNEoe^mTNwwfQ-hDhT zo-(`MIQR}m#=(P;$BarBU50P`J4;0?0|-ePlL?JsNw!L3jdCNP>NH!=b(SarFXj(k z93Shb9k*!}qM7-ZWFR8BAP+u{jOUkR7qInhiO~H5xvczI!1G4tEarYj)E`6PNT%Lr z4OxTWT5Ys4J!6f!Tz>ZQpE((N*-1Ws4w&jofpOe$B^0!fnhYV7NxdpkB%Ztc+fEV2 zPU)_eB*e1LlDL1I1UhC0Jh-+gmzp*%^N9FkUQ3J(k5A=g=1j9Z8XozMjtGkWCGh@ zu3b0a(&Ft+X((McXw%eHPX)F7Fjk!Plbd(2j8GGyrS_Oy!-Q3w@Zxdtkdwq(x*bz; zMeTn58uU&$r&h2`s+ysfn=SKjrIlM7Fhy;eMBGR0FleNMGh6=o?N6-~t1+G~+BgN{ zu4KI<_9` z3ryK1EHFYF3t(DY?%waz?lNCYkcWDhFZ~dt_{JLS6h(+9DV#AP<;QSc(y|;&boLWP&_clr&`HCrs*X;yoOH(nK;1P?>AT& zMr7@mvkK;E&6c(z#NLn)E?7}<_ni$VEfTY2s+gTxC816QtXQ?&icd|DZ3*L6gA5xC zf~)F5~+|A`9 zAxOO)q^W|s9pSm2apJJ^67&^0_%*ru6?k{8JhF$7aLsZ*#88~1@1)}+8qzM6^qQ)C zP0e?W`@E}4KVcnTvRr>-z`iaEx33YH6UTb%1p2-u#ftIP?5^~b38yBP9ERo4JvF3yrf z%)6W8Zw+ZOp@_@>mvfOGmd<~L1_3eo931~OaQ)9X7vKLr=lY9nwsQ6J(fN2LV0N**Yt!>LLm6OWH~Fj|P;5>+u;*??RoWk|Xr%MSjoK+`<;*TS zh-O=7SQR2ml|sF252rz=OkuI)&%xZaM}wCj-C~((w3eL$fmem)3j7-PXEA&D+4VCZ| z&`>C8t1r0HPp45b3pDWNUZb$zQ>)#{6{6#me-&5TkPrDCM7g`x6gxaC%GqNzbzHS~ z0H*M4BRHKo-B4Rp2}KO~8T*xFCw&=;>B0qWEYhpw-GR^nN`H+m^@wlSPUxoXKx z0B%|)w$F3zqZ6+)`fU@<54ibwta*HDSak1rhJNi)d$t0bRb_ZO&uklN8yysDt4asx zTnkkZmh={XB4&3dn)7A%I)$2hJq($vxT zrNh**l6(U9BT>1&wzHZ!1tAZDmcbgcwUA4yYKc~)Nn?Geq^ERQGz}UnX}4^;QTAAM zBbz1uRX5-kMybIuHQO}Mdci5t9-3~pnN)<&v%Fe6)Q(PrM3gwOE?kpAV81Q1TaS35 zj>bBgibgar4cH>O+Vy+gDgnmlhjTemx!eSO?24yyme439jM)=e;rh#33{_Nm%BvqX z+GsNwgZ0C{YHib8Esu&cYHGCH*SLmsigJF}xY1F%yW4V}6~&m-Vky^nG9Kz!{DxR^ z{jD-`{hj^VMZA*H`Xovn@oPoqLe9fEDCe&a1SS-*20;cM zeD4a$$Chtm>V$I}L1(pfJML7>e(S^sdzGQL-c&Z-AZKnVVNsh=QJK`xyD?B#p)>HH zW1er*vzfAN<|Z3gYVzsUnt}u|BDCI{=F`f*Y^9IEL7PU&UzB^`x@QSlZe3ln5ZdZ9;+O~DKwAW)F7r~g(x-BKJ>{6qa<@l6g(NS&!;QP}%8%lB3$&`_AE?KaKx+xVfD>21PR=O9 z-a(@fzvoh6z}X6DDR$DV?>@{?fe*6?xnZewYqou%HbH7>f0Q&+MLkV9Qo3c0of84(vn8e970$Zjp^a1 z?*2=CdD5D<@4_Q_(IZ~q3d?uPaeY_vy<54xAIu(*?B*Wzap@g)`8Di1pzkTH{z_SM zAl&JjKoV)ykd+u-0rDcQcmS-c-MUeeQfm5LU5G-l1f~XL-RUYRS)-|a+W-3Srt!=T%qLHAr zu2HhLFHGy5!c~%FA;CASboPDs4bMW2jnW=9&X-AjJxB5#zx2i|cvxst6U;K#AJ0|v z&2eu7k^Xq|2z8XzpA7EP(@?M?PkBD1x?CkB$Lv~emqjeZv>1%NLLqw z@erXW{={)Goc`0-DO*I!GC#&?s~-uD_*KYk>@MG#;&E^u7@ z@Rcunqr%;A$`;RKNj+`H5KlQMhZ;Yuj&H3)87u-8szJ{9=H* z4-)G-#-F`BJI&-%59-4cRV6qEj zt-pgj@zMidf38M*P*>P_x3z^!J+qB0@o!WELg0#;Aud!PHp*IydcsLKI%L-4fP*dfiKc!& z!beShre_&$T{2z&&VDRa&A7m9O1yumBOwf9M-S-@>CYYof! z!}95o7ippC?GkCb`E96!iy*qtok}4+iGobADJ^6Q39C~{t5HwkukG^q6XQ|Gkr7D_ z4=Z4;x2+Q>J_?Q)&sM$~aR0#^IvU3IlT#K66JEYOhrJ|3WBU^t{AVC(c2R0>Jae8X%6lW z#RC}jC&V~P?Jdfz?g;MpCKGL>XW@n}^m=tZrwpvii(Wfu{rHEf=u`KDe)a;W)* z&MI~ES(Y=@W1-=-HhZYm7-~8_JLBMTTQvC(OyT1v;<;NjIYKn~CF;o}BMn}rU~p%T9fkFApAHwqLw$Y^#C8eH@w&{TI+kS)6MZQ z!)0zrKf=GTBjp~?tJ>u5&$9uGjbXoo1Kk8a#q=b(^C#S7d&5!OV!)PD^6Zpb{`jxiEJvnCGs zo&OZ{3ngQ)5Cp{qv#f}5Ko z;@Nua8U5`9n9sB>7FujV`vs?+=`<`b zobYSi=BjjfzgNLSdK@A|-LlQSQsYfbmJo!lqo)Qt> z%LiBqm}|8T@@_15OVjB=hT?`cimO*oH~5WM4H7L(EV@y+oTDKV()M01k7X4l>5l2k ze07_5%eDz@6fRm|Lb`ohg2yBStm6jkY4%}DfJcD=WaE?);(PtsK}PJixtnag;i*&890n;(6LJ{DudsdA^ z^(sRAXYE>Cs7q4N`(DF(#Zaq!Ze}GaaDgU&PS#b6h(vf)BIq(b_gi=L8MryjFgkE6 zVSFUtkg^^+uBoa{p)z3Q824I=!tH8wyvC{KMAICvGqtPV5|Hhe=~RF+8T$kxEiKz% zB(CqrLrzHU=YWC&QEf(^fjgf zx9Aj6s!tKU-|ikt{95nH0c+<{ETVTFE2I}I(%L}{+4=B=OC)r&+-)qr4%Z3kJLIUvmxjs zSxbp4J|DV%5BmJ2QU0wyVv7#1FoUV4$4|Xc{ za}+1MWo$W#EJ9;xu&22+`4?TUR!@sgy$ld?XZNEX>iB1GmmNiQ2EE!AbAQsC9GhQY zMX>Y_OmBLVDv=Q9ObuzgTDfb}X#cRTkmXo*L!Xz~c;iQR8Vl4kYIery57R*5dJodi z<(QS!ypLFjo2yleO-Ax1@c`uRyapE<3?F(SRlM+^@FD1YbS-@IqpR7feoQo9Byc!* zS+U@qj4G(AmBLv<3`l3<7h7BD7-p7(Hp7=^zzDgSPEe{z4aW;Iq@k&5-SS&j0o{vF3R4C8BJ)S+`v5exUFek0s9l7=Iv z8munqxa$-UIG}Q9sl2L-6k;L&^C|cKk;_<#9o_i(f`Y1mooFnfyi!ZZOE}m!2z!a48`qRCU7{G(p9QL7wv?>=4S{dCQ>n-ZC1$u z49Qw~oWmG2@0l^bdPdSnxKRwTf)r@WE%4=uc-FW$40>s;**7@ym!&dEHIea!;*33T z2xK_^qN6Y*iqD;u(ml#s=oYn;Q#3hTc;gRJ!5xaQ${j zV-33S2&y%y-ij^3T(bt_5z|jjk!I!SKD$djA0?pTB@jRFVGWx2?KlOPn})_Qj{(y+ z>)~SJ%-Nhm7%j}3#N_^99SHBjO<1)9Ig8lzkRulff);DI+jF@i1-?{TP6Ru2U|CIg zC;(jM1&z)5guITjB)occz~q=pR>RwiSASeZ8V`Xv4$qKI&Qdc>k;UB(TLzm3D-JUe zE2qa=lA8uw4#&jZ=)_~|#o~dtD4^=AXFR5-KH^PGSM{4O_B|+NJjxlZ8xID?&L&yE zrFW`a%)A&M0)lm*9v2yFRH#-(vaaC0)tJ@`nAS_spMi`93-K1~D%6p#CrYc=-mcCe z39bio)P*whCmd?p=$=gng=U+Su)mS&T6MFFSE;`$*ZYkb4N3RynWpxcC5=r}c|`q` z?sA8d$|QEgit)%y0;eCQ8T&apx~=$&45P1rmcU$rq#GU!+82{GHE z3PCYu;&fii(Q=nqVbNK4gv6~$#4mal+fLcGLhC{9;WyhR4`!(W4U&RgU+Fs>>t5AH z_&%#V8JPpo0O)EztG`4B7t6+bl2dGqnOJy`rDyiDX7=z#OW$6i3071Qj+V*brCvw0wx2Q)T*;AsKNhp>$XSN69ov;xJN2O!TF_|3?;z|8)6LP>~7~UqkPm5UnBo6|GLJYSh{pN^v1~9Gm^oG{qzs% zu3+mb(ltKeXq6k)ae=wScyI}mqUZewFkm7+3Y8)l z*PLNiYOMmOE*@aS$4{2=b!0Oer&Bx(J44vMN~-Gx3u3Y^ z_-xAI$aChI%q>wc%ESa0=-j4>n=ggIxWNjr`%_%bAA)yJU?@+cyoTa<9#W01 zxP=~b3s&e45zURUv##NEgvQdFVkDMuQ-GmqX-Dg7^9h`1p)xC=vzk8vIuAmY!5sZZ zDV*ub15`s^A%~+TXCd@tdS*SKzmk~d;6Vi`NqvQe`fNbT)3o3Z=}|xlzd` zta{cB+USqPiR;)^>7AX##S=N%G%Ld+)Owvu=KA)dw4Q6~HY6)P>sCgRxhTxBuw0}` z?f!Ig`IpL~8{3SFLtgSex3##sLe&*C7Xr*gbh?ip)@!uruVZu0g3Z(}{Fs#!3Uyy0 z)ia|zs%^F-zPBnLJl$?(x zkRssPVB0Jz8^b}Con387XseV)plC`}>4ml#9Qn>vPMyJ*ls;Dp9bek+Ae6C z&7SUGRHn@5>4j`d88j9sgQ2wBfKb-R&PL_iN(;oVUDWGS7F*W!bjMU$7KlfdS{j5i zJQjw+5*PVFmA`zj>2wHYs9u5Z;MP&(Txz z>7=fn&wR&nATb6Rsv`bhSRulgMFMEcu*~R4x>IRJeOjWbzCvp)kFW#J1i{#*mFo|0 zzv)ayNipI}AX&&h_iel8b`NDvv0G8EB8k?`QH~B>gw?>AG)k^2wLQzu-R_h+!#n(f zKi!lsEr)nVb{A98hm=gLnZXAONzQxg_5K}+t7Ux|Jm{W+elaz5#XoBG z7}}S3h^M%WqN@Do2a&OVIjl*$QJyuxBIf+rU`nD%Eba$$V!8A{+?}Lx<^UZ$?tV*l z!xm~PyTuJ_1ADPqKVA)dj7KWQH>k0^BNOM$eCA^2PG;WB%p$IGhR8yjDW_n;lSB(7 zX=kRyVkmc~X8>!-B*1Xl{D;e6aQ;03CceHGhcA5PvmC1!Ht8Ughn;aO z&+;JW3s-0_@%cWZC_zCVGJ?}5#o5x^Z;p;zn+)OoJ;*y`&oxHqo-A+!<-5i7K7i^q zfc!oY_ZnC9h$;TWG3k(MoO@N?=PtL+%MjU4MB}cgJ{!67x{MepMRq(1%G!i`E|%_9BYD%HbUrzh)(bM7)b8y$Y)i zhf_pwR4;H#=3D!Y%N@-;7FmzH1NC-V7|9(~8=huCGC^ZgnDym2#h4_p-q0boVQmZv z-YdA9ekIiDM-GLqpuJ!5DVzg#?zSUx+Ym}Zh{gas9GJX!V=R9u2VQl=@t>YhDWsG= zH8HfnA=;+t;9&B><_woPh!h^VYqUUa&s(;l;%P~*?t-}!5fSsM2|Yz+QV|h@vUIb& z& zFOWn3MsHoe6Z6qoMb7%mxNlE0aTvflViU@n%7`6kz<`_|!|k+7bIt%ql-<#riuwgW z%lxbTJG|QOZ#z0DQ~E$CZcJ;JzR*kGzAMd%y6M)B&)NNd(Udcjn;PEFN%XM)cOn}9 zLR0=3(U|;re; zJ0b-5$cAW=0x2{~GidWV1kqD;-pQI$$1NQ!he1-|<BWFhOItNLR z#C=6_;*^JjQ=#T63)@(RBM=1l8-4!c+yG4b)wb#b9V z01|n1Tq(*7(N|RVa>;O=4`*P?63YaX^dBkBx_yHlyWA&U{AGZ$DZaYE4`GCh3Xh^l zf|JSganbzp^5Oinds|Cp`K9CgcZau9eFX24iDy%&h4zu~7*bldhvRP*bBS_SnG-2f z$d-Jeh|g2Y;YYK|Trog%-?Vh&e)7j%^|)%i7D@VXMlMb+Q*@}bI=B;5MMO&?bX2`p z&-b{|J@+TV{rP*F$p%25G4A7WhB_1w0!kWWJ9J6}7I*^k4M~lp2YyY5$hs@WWlf97 z))`|6f*o_nb}fa%Vw2tvqOlq@J5p>sDUaL;sWRt@)-B}Tq;QHWlCL7nZQC~4;KUf`!7iPPj5N5)|DzFbravTFHkZ%i)Hl-!jf% zDms?>o;n#1=YwpsU?zwn>#La~B7Ib4CY)V!Cs62|gDs0=l@t2+USym{5RqR=jGfsf z;u}_ALfFEcv(910%Nd30)Dy4Q^F=X^F&()8JEcQ$fIB^Cnn~H@e0KJ{ByPf@m{Hv< zgpZf8y3L)0B2Q;sf=Axn7zc%>k|}y|$S~%-&Bs%nkd~>IcsFcX!%8ki+L7U&s zTs>aCf4$TYx%BtOQ8qoe!ZbOciIh(;hb|>;H^$aT+f#c)ELE07&DSZ%wvHA{&{%(p z@X9;#8nkp6zM&SIKoRY~Ejq`p8*UhB8Nu1Co^Vm?{K#2#xR|Hrz`FYc7UQxWR$bJ}(s!i<}?!OXvagxdNyAkFNij&d)4 z0x7sxHbfgiTZjc$ym1y40YZ@ZDgk2G?M$1d=LTl}P1n zdy}*OL_}`?1ky@$!ry>|9_~zV0dvR7A=IHA@1#%WfpciC$OPD_9m-?56N9Famqnsr zXU;p|#-+&VwT))~@cabQ7Df?|Gv2w!+JV1=LPNz_{?k zs%wR^TU9W-;_UVZpW)pSUQo?>bOQE~1JbfgTF-6GGlmM7GresiP5LWrWp(^(1#IN` z$=`t#wn=J@g*-a%93($CxK6G&Ts15$&0fjRUDX}jq^fHa~kh?=kQHy~-H`~@Vv z54pSn@JTxC3(ale;oHJbBuymDd?IPeAfv3_kDYBlnLn)@(8TpY@z0hG@>1(`;r|aL zvHXRk{MbKoXp(4yzHBU0jH{!pb+m22D|4e@#>L|tOb3uaErghjRC*fN{_M#J%d;IJ z!bKb9A{zEsYzHB3Cdiw}uo+JQVa4o9k5#fhF4Er@pRUhl%?&ad9BJ)R_8K+MlM570 zBidBY9XE`+ji!6hBhrV8W1ttbeAaIA5n?&v+HYCMRTvOE>S<8X-NUXECX}i$A*rwL zO@GXx$zaUbty^1Ti}5hW1wi&1_$0D}8wX=P*I=+}2_R*N5V#2o+y#hqCZ0)n@B|7g zGp4%q*4L0P;pLtt-bQmvrl0(N6{kt`mx4PnEbg@tzI54YttP$=O6cAF*j`rE(c(o? zY25h^ZB?OA*3rJGHr)9{Ufg7)F9yjBEz8?nj-?KMU%5cN9A%PPs#47+l9bdkqhSv- zB3TK(2R^HECz?*t`2#OCl_g2?b8%c4+8lwUz|UC)x6I;lTu2OQ_R+CrPMH;zr`~~m z`7~%Nc9(rxH5;`nu(ZW9&CO);c8TMthkEbgR~dz_<{z2X-sdX=cT&)WQE^M^mR8&5 zEhF=Gg+Bu3%K-4Qj0HQiUM^OkETrK4NbPuL<-X=)$%964-JIxyOp~Bd#(ITI6vgOm zy`&1D$FD&KFiUxTP>d(^cgW{XS+Q+1MW+)g&nj!t5$z1DzF+g8HsNP~J9nq-5t?Ol zVz+*099{G45NuK4JjW(`h^X}x+xwb_*=Hr_Asy)kKF>c%s4)7fZt^|}pWP$7|J0-a zU7kz5@!9wOMcPKB@XEh`E-i8c|97pQ*8h1gDsLxgVq+?7VQ6P=Y9eF#xoXqS)af5M zo?w#xDu@KW$#K;lZVt+hagVXm9Mlo?g&0Y~u(}%8Eo79;v#uII@wiC)`sJN6rml91 zy2`zuhG64h@deUPdyGbgCLLv8GKqM^Xmmw_2u*!*Q6Bir1iw5gj2qaBtS(EPP@!su?i4E$Ru-g+ckFFP?O=5uj?_QEbxl zB=BNWLhXUPEED0t&aGo&yY_5K(Mhp}4?+E<2h6yb2rmbOvHMCssrbtr5fXKJ{OrYN zS^ZVEcMQ~zbDvkrpKZc_-Lr`NAD8VvN-^=s4R`)&P(VGFuNLcf48A!r)<=YIAHm=d zC#+;2%Ag$Hyb}t_&gPWDzzmW6x5z#Vk=Vr8?^N*^BP&7{meNhmA%3RHGvsuZmN~e5 zMODv54ss`%o&}Uv<-p>Fa8E+M8`=%?wg;cb3%5xS>nBgtue(C!dxDZJPQ%vj#5hvv z0RzH<2-bMe$h*ZR-fBu&aihITr#G<=p*m5+d(Aoo34{c3W?e)d{PZOZR=mhYT=KzK zo6^LY+oL%8&^14c*fOD~CuU=x=8-0^)8~HZ(KA@IW95cJ2DXzvRIxFQFOuEW>gYi` z2B-^r1=_P;;cUdtHL-P~e(O0A>@2(Di@dOY{k{_tP|%jH!E6gJn^zr~QtO$zQlp&A3*Xee1Qy5oL0oztJ=4~zL(W~ni8FtG8k{z@6 zDFT`-x@PDyBO(82vf8L!i5uMGYIi{fYUPGS7TrlHsZims^TVm zr~$tf*e#(eBUhsu>VBovt~mmzZHFNy$;WPiM=RI9DcF~VXYB@~->yW!WshLd;g?l) z>shtiTH!sGNdi>=B&CyMM<;R$xTs&;jrHX)u@qHXr_Vjc5dC_n+hI#oDKyta9 zn4M>pX&hzVVn=+SIczJAqBc=iC#N!%3aEpo$*MwQ+1JDt{GN;HtZGo8!@^-paUGLy zO_110(rfySx_Kpy-lPz3Rt_;OlWIvtoO-ZKH4k(P`uSv<<0d2*M_}PGjL3xCgi-hH z?JYq4*zz~u27@A16z%-VvwUvq-kKKSgT?e|u2FlkyUYnLpQ0@bB%Nl!J8nk(^PH?GG4()P;2>a zN2#LI$8EfM0GZUKL|Dp!qCclwC=qE@c)`x}hp)S+3R4RmmwRY&A&$x;*W1fB za=M^@_~tKCQFuz@F>B}95=Zy>x@)a=4p4Elfs%ZyXYcnok+uT*@? zo>fZ3R8CqI;WMNx;!}6UXHRWO-y;S0W?RWM|5D~>J`3E)1V6I2001D`H9YE#9DV5hPpIf{BbGxV_HILWn$v6a!{rsvx#7M)fG)<2{@4yGg4-eGhmIUva+Tys&9nM0yIS z4GE0*6yl+D`^~^7W#J_M$`eJ_w*Pn6aUCld(?n+dmoI4 zQ$SCFv|EfJ@e5YfmdBznP?#=D1{hnLX-=2L&U${n*YJ}s7N9(yx@yALU~DsMuNC#i zoQ&)aRCFZ*yMDGjm36;aZ@-nap}fy7=@b`jRX@LCMc4w6{jm1)_j23~7mlSN*=Eu^XU9D#0JF@gJqqcjyr&4J zthAMvQHQ$1K2x`WpLIL#;@)ZeBdm~`TUAO+y#2xZoXHI8cH-LC*nZk0AgZbPid8ob z@ap?msHyfaF~ui6Njt!Ed+r&+7Rw~8Z;+VgRw|UiAZaplc&5!F-X-%9L~u+B#Vh^m zV9F!2p#8U)o)IupXSJOaD)r0HVaZBVf7Wq>%%B-pg#DG z>CdSY`Iam&NeRr~8yC&B+9Q3-5(jZ)kBw2H6$yP~ke}%`yrk3ds_6%mM99p1? zqFuH>f*0qAQ=&HdE5riJ@8AI(0{lt^wAroFjox`tlc{vHFIOrvIt%UH;oZ zxUt}gdaa9@j0DHi9L#mo6F^>yZ*~pldbg0!RCp+Y8!aCU$};*vT(vR z!BMdH2ZFtsX1a^azG8@GBT@dM#7lgyEnuaAi?1sc)0tHL)`d^aq1^d2*Y*TglIEfh z{H|`nNz4tVk*c|VF{Q?Yx(#ENB{-uYLc@pTBH0?8Cb6qxwGg>(JU+$ox~8Gru+Vr$ z-Rm2@g;rYaOq69>@I|M05^)Sud3*|{Gg*_rTe{pyOY_JBSSjywa0~GiN=k&KeBqs! z-a7Mrrz+j7Afdo{P{snwXpP7KQ7Q^|tHJV!JsBv_tt}5h2WIQ! zfc^XgCUY2T=|a9Dh5}hZZRWI@*_&3|;SPH^?xu?N?9}QJ(RDe8b?3$%PTWe+GTL8T zqJn31g!yddX(#AMXKUlWBu)6jJLP#rYDIVHU5JOl#GJZx(akFIoB?t3dT3zRg(RFv z^fY$rIMA9q?yuU^`Y?JGjH+?LN`&odM=pevvE~)Fm8Og1-c(JL3LPiG--j|1n8w_y z)>bgJgpkIx-DI2cQ3G04*#95e-YPiGD9IAG#mvmi%q)u;T*4As%*<%9#j==7%*@Qp z%w#dMWU;i0zq@DRkJ#ym+1Y)p@1b7u-n=Kz$vnAxq)x@mqdbh;YNVbJQVl^yTAU1^ zj5rT{6e8!8!NhVI&`@pH_D7$NwvH18^ zc%Fwj*~{^T+_(I?aGh%J2Hm&xy3_j^R~Wlqh!cm?w?{3CUI)`zn4bIQFLVID3etH~GK5cI}MILSf1J)8ieuO~%w>uNNU6t_Vd`eAPsbD-~ zEioYVs_vI$;z>XHg|bev{|M`H3xECj$CrQ^L1#~+iyZVM0_GE4kav^%yhnp?KcX zELX!(4nuRS9KH2y^3bSDbAG?nZ#cv=RA4wfagAVt9kOD~VDnhM1}O^}DND4Fq=F6u zrY>DDFtTZDWmvTGuhaG#&>iAWnI#3OE%p+|a^~8;?@aeg=(%8~?3K|lUDU>`kvc?B zJ|3WXXETf^f9Dm0ubQ4TPmPFW~KWg4{TXXB-vu1b?c$7OpLAUPhrd}NMzy2N+J`EBubM;b#CamtcjIC zdB%8w-GJA=qv)7D!b6rPIC%*bX%SS-e?Uh9!Ap7tq}SWbE}=6x9_f7(c-`6BY>981 zlo>Wxx|-HMM!xZrJeJY3Xg}C|IuuJQ7;)NH-_j6b;#|R~=+-V~nC@S5cFgp(wNG%v z*`~s7?!l0gk2gdO#FQsUY96!M?A!5CfAXs@8!}Oqd{zIwYY+-NfT=!OjH}l*?Qe21 zymC1}y>rU68gJ3sd}vs&bhw4A;H!l1;@jO@nBSVR z+1p*r2nQA}OymRMYiQo=>LD#R`Br;@Y62uq(P3@!^P&AeJ6CaPfdavztv`adYQ{F8^9qQpJZz(GVnzd zUv?%zeYFI9)4kQp8jGu~xvgX_W{3Jp-4x*5JdN9O8_%=bb-f7hGFiw0u3|bot&?$k z!TTaKbt~lY@V37tB@9;Q%_k0G_e`CZ;~g@f6T?UyXB_}`$RAdhoS0J$wT&Y=MBnmG zUV}znsEAW^PzYAzd}&ct@fDYAP5wyc9IjrwW)!Qh)$JBWCRj<0eiuPotC&{n?4a89 z;uH~5uxZrB_rLS*3HBuc&mqj{MoFcZI)>6@0R~!#v zZ?T1!ql~mTomf1+I9@#mak6PSRt~XpSVja5G*_hqFnL%*I8DvtQdAlYm276LN*jA= z17J&xSS0_d3|NQY&HzB}lYs+R@u zzs=tfsO?Lh=<~IC`gk> z(W7J-dt=|DLP1pnj!F0kp8fsTqOu-{#$|tvi$Mved%rRU%EiYN`L4F%pKR`T<`n12 zLW^Az>Uo6T`yqHJeg~7ykZ~hdbI-)ZK(bTuU`RVuAG}SUnKw$k&K2Nv)YEe)R!?(ff z`pecVDHSMd$D#AYeT99ej?N&C&KZYd6p5!VIxilDJ?M2Q?LCsZ;cDeRQ?L<{>D1{o z`S9eMbvW)M^mf~U?5B5dVs4V9h(BdMzL^Itz|F1TP&(K%~ROD z%SX*qGAApm@N&X(RAuBRl1Zwkx=b5YuL$4ASHzp=puS5P2OuOH|rLhSEU-=ckwPi@yb||&p#{0fiYDMVO3?tX_j~b%an?6 zZn8jkE=~`i?6mB9_NO?TxzVvT`ZnN5W+^Vb)4E@8i;tD4A+4mq*x3cG55%JI$OAqZ46T!f z?4~$@;7Hjh7zmf1T;rY|S!t}Mg7I#7xI5IQKPJXq6==;*GsnwL1MQ}8CodWDllL}e zmYPt&rCA)#p9MmYPoe&E!E^cJ^!>MfL!4hxQ%=x%Ngy$)ORco|exiS8PP z8<`oON*F2iZ;-|?^z2C+DE6t_l@L5$rUwLvkoI0L0wpJg*FKpblEDza4K$XxI8Z;+Ri_X`$9S7WCsSF94Qf?J|9YK0P)?s}aY`?mTs{Mw zLxPxTPalI_9Fkp3#`H`**E4z9p$oc@X0~NsBZ{R{9V6F=AuBY2)iOjL(*~vc$o@$$ zBfFBp81UF}r>d@6=~=HnPEnb~za94$YWE|Xb5zVOA+nc^LQ*A>wy|VBmxuc+yrC$P zXan2-`_CU0epC+mk#DTgNo}vO%hUbwb+^o!ovNj8rK;HK1*&6w@7c$iE!9wVRT-@v z)WEM&?#$}7@5Eu>eaepw$hVV^p#!4El->>76kO%2Gu2m7tVKCEioH-mzpOnH2b_0* zFD(YUn|y2wom^Ax09UO6FBbWdRgJ!^tTXUo@ykAc86rUUjL9(!LQNH%8*g!)lx{Y& z3B|3Li1@vkr?f>z3|9MF+lVb^*k+EaHEe}SUTDC!6*A@W+z2cxbHQmrTh*hcD2~-jbqLZyaD*-zN^uy+z3N z(RS%QAJZtde(wl@dykPk@D8{|-U=o^eoZH)y+U_-9mjvIO~8u+f=IEb&LnAN2)nT? z%RYV-h2+e*0>xsi6)c>EvJbvCsFqlDslp_uRdWzZ{6xIg=Ge@ot^IaukE-<{#JHPz zUAbnh`D0hJMe(#Zs%v)KuK!UGqoG5(QMC#Qgt*UH=Py_+D{+K`>$wasehkS4o*p_a zd%XnkMEb#^u(9drQcSZwj=S)B(b(Hn63qJSn1N-WUatAcbGYs_`3ZquG9DP%h~GY* z-2B&`x&T`4I^o1}*FhNUfQ-Z)8CqXzX?i7#SKHr!k}RZJ#S^oD1erH45xPg8)F)`X zDJa<6jKN#Vaj2DH_}P!#dcC+sV%clQ-&pU`T2<1gY8D+-6;6P5rUCpNFU4?=s9?Z} zCc{4KCI*}x?7Q|XAM`Fk*Z|Pztv2|LxsJJl2PrCr>>Fj;&ndBh`uqMk^zR$tMRBGAmP%{Utg&2qf15#U zNnLqmA8i>HoONxGd2pTjl5|rtBmx=N71SE z))I4Y$%Xqkv~o(~_v;x)vGt&E{OjmrE{T~0&~K8_^-y^$`5)E;2Otw{-qE*^xxynR z0Y|YMW92ASHvt1JBREbnpTN{=0V=h!#8XzAZHIj255yYH!&)31C0tJ()X7JMqeV@Q zxurrFrMr{D#HX{_3U^UQb0hVze8PLrH4IGj4OgWb`79xa;S@HbkX&P+j)mupOm-$( zgGH3fNh3Ks=PXMx z41xS0qJ%_@1@6!+dY+`^H@A^rUU95~ti?t08@hB&?0+KD8*_L0uyV!-@GsfV{IBo& ziwn}jDJ3Ys+sC5j(5h0i9Mkmxtp>6s`!U>Drc4rD}PagO^&z!4-jvcD15zY2J zgD&*1fl2koGDy*aw2(!9a1sgL*=KT!#3puH@ zDFkts2+6lreo!@9CnpWpa|i)~tfiFp2NUwlJEQOIxr0Sh;T9@1&G<(~%Ij+LDR+V2 z?LN*D=>GtlHH_PhW0(h?*;|jDsZ>__x|LN;O$lcSH_oH!(UuV11aFhsl~Hs-U!|Iq z=tnbNQ3sZ6mrDk-=zCk5I}Iq?hfCQr#R@T%K&%xto5ljk<|2Yv?AC3SEiFJ+M?pLt zBPULs)7~4w<&3~Jdi!5?Q0vl@$2Jp9w0w2}bEwxRUiNmA_vgJ2p!7ej+i4nGZ1aR* z_rnVQt=HuIQbiI+2wNC@!Bwj!+3H{UTvYtvHZywOjrlOy`4o7+Si-GcpoWur@?zyi zT%hO|G4_if1t0B6hoS?{b}LZ=HN!t|mhN{o`!Gy=IGF6C$K0<==a_syQ4Rg(Mv7PWGUd3$uJ67V;8$to}G;Jf^nb#(h_=r}T86(BX!8sv;>s$iCwfk}03R zUz1N0M#(6}z0a+r_O^hu=X-T}-JClw%XjcLcODj$OOwQMmtdGl6vJHAnEU3L-^%B; z4l|}QDDF5q%*#0GOv5oJB*1zsPtUavyK)&oAWvap8=J`zDdSNytr#u?+ipNfvzcHZB(pcxnA7XrORK9pD~Q$iTXNVkKnBA`+%{BN)E35&-iZLHDtP97O_O!|8Dqvc%YA%5h`*AlPK$GTt&IFS+h@{RQG#}xoBAqgeyGQX^OX!Y zdc9An?L)+YSXc~y)W#>?>$;`lg(rYGc(NEfGjdpyhixbc7wnLX^Hx;~s{~cZH+hOG z+^^5v86b*n;#>#HW4b7ebiv}5AJ;8vwyKa-#sOA4AeZy84JBKGs8W!h3q-R!RP7^W z6_p2M8mE(?wK5?q4&E8ezvx5K4AvIE2+r?FPk=QY7$dcI1Y)oz95(QrHl#Q#mBp2v z)$Ofng+6i5G$*4ukK&jJ)>sX5b^@5({pKEZs*B-~Bw~5P^(SwbT=|D|e&&orOl^I& zA*>*a#i4Z?12Ia`!3CnpHM^~_$`vbw=B^vidhozm;DkyG#G@yJ9ic4kxEGO#&Rt zk9RH}Cb#qAbUD5taBFOtrx0~w?-jR`RR&7#UCi|EW`nt01- zU3Tl_;WVtrQJ|X~bQ)H%u-x#e4bF3PE1TCo;gb$YoQem3?IyCyB)RG>&4hp?|JK2$ zb`)^Q*8i~n!}3~1ft?FUD8M<+bW}H1#e*J=%04x_RlY)UqsaO#A=fG+->kN#(F<2S zc6%{JiZ$M9zY=3hY8N`;wy)i|czCR30VNzd_3!K-aAw3-JaTxBu<$7OGa}1z>E&jI zoNw4u%1s&MPUcZ$nM39#zGnxve11qsZ7!V|!nvVCw1-1yJFu?oV)SM$5!AfBDjqE} zi4##w8q4yw);(S4aBJ6A_2%;y^|GFAyt(c)`15mm%7|$5M9jrU)3P@cV)Q_b?_)?m zpxf5@`dZTr{{X|?qa8s-;lRclu>1Cup+?fNM$(vb#>dL)JQU#L${CsP1?3%4vffm1 zWWJXfO~m+j4l#$_0jH?m`lf5cIWPQ{bA^kPjvH8Cj?xlH%jSiO;GgHEP8XOQdiz*< zc_B+HBlsS?wbaal^sx4+mQjoQ3dujUXnmuz9{Mu}4m~UFTKg*td0jJ2(&gSX6<0Q} z&0u{6t6z4K{K{;2#;PyqLhNdyZ-aojAx%$km!{m9^JXp;hXxuN7J|Kbk2;H-x%Q0y zCc(sGVGQ$KnSzG+8zkQ{wOthThv&pR%)|8`z5C=e@YR#92s=-454Mn2t;!UO#OUnwXubFRsrkWAE(i61uO^rdhy$7l73v36rr_hdI8cA1Tz6D<*x>rRX z)qE@bYJS=bc1_x0u>7r;O7Pp+D_Q zMwI@;uNfm!6;${+u&0Rs?~t+le~UnnF|xD$C;j(N@ALos@(+AmpM0*3u7NlB^OrnM zm=TJ%0jjdHj##dwhMNXrD;a~_;!$hv*(|qL20^bhTl}QF@~Uv5zL%~~9p;Q>mG9Be z``0%o&-*kP91j_a)iGv!y$dJdhud+di`3VfwTLV~C-0;m!sxm>Mr=J89|-UAr?2!q z2u~0W?;8U`mDDu$_Z6L8S z5w_!NB+>otI^$Aq*tj=(l566*l1ooK`eKsUVfus#%(Rqu3g}3@AF1c?8PY{1h?-pT zF3UiaZu;REFzGPX_(~7PkJ+Oz^f&R`j5_cm=2fT1nQrA?!EWGIt-#czL*ls9a8a$W z)`wZ!A-puBgS?~Q)Ux2uB2__4v12-=_?VFsn9VFLorqgc?ZSlCey8Il#4JPydBi9tj>nq%g)z_*bOXU|NAiFvY=r*B6sr}5U0qg67ow;V3bjdLA zCxk+7bZZZW8t_!(>I}`iinR0{%tjf3yJ;I02Mn5k!rKW=X_QSMuG9U7AD@6KGMdSbxl>5gXKAAAn`3$m*;z)=12t8Pv z9sPj`CPW+Pw5zN*y#z+eg4fi@+L1AO=$30WYdKR!lB086B2#qM491vD&9nnZl5IT+C%FC_4Cdf zC_Sf4Tm#}4eEUj#@M33$>cGX(AtaxAvyt}~V?EA%5Oatid( zvZl&sR;mQWevVc;AMolb$#_He<3J$IznCf{9Q`gkjZ+wt@@A$&bN{mL^A6O@-n zAQqJOJ$eo``h6VM@Qy`3oRwp?yJv8dCKbjd4yUNMUy*#+5ek*c5f#;N=UB~E5b3Lb z^CZi3ys~sA6A^5fQ&JbnG|$i$9>-Y!j9*UA;n{me=N;W3o);Ul%p|fx>y@c1sx z0|o0JXlFf^?ihm<=S&hfcJc78Uu+@0euUdcVAx>}w8m)Q=6g7H<|$(Ev~kC3XsP3L zf`L|dwiCyPh&^%Nt0|IO&@QO+evC*~BfXX`6&Th~-eMNbcSY#vrYblny{9$9`| z{s##`VSXNd{YgT6LHc*8mhb;C)&487dbn#Zqz?X+igRIfARJOW%MOB|WbIEn5B)|3 zF&0Fjh(Oi|tlef|;GS*B6>rsWa!KqT|B{N^i2EZX)gKo}ORKejzfd6oLn|$b%i?$w zaHRO)vz0tuG}RJ^35+A;pNjuE+3~RM)Vcq*dF!*~v0XJK0Ikz26YTX`zNbe__b{@( zwRd&tTe<5ijC_^d`}6ThiRi|G@Pl&eU3>fIiHGJks&HL%6X+vx>Lb1{?_PlFv!(mc zL65wtYjFs@eRAs51F(&Fvm52Bx=CTS$?&V`G0Z`Evg1>WnfNrq`8EHp$ZgdV^GDaw zy(y~*C;k+q?jF;d<9P!ZLv1-NCfKC@DMbFuZ2!tP7+Kn2>Iv8bjTuerEj?W?LOkP0 z%a6w%^;IR}H0fIuUWn~|LA|y56x_P@qAsmD(Q?K4LND!vbP)HN`mD4#1fox2Yy)TC zW?_M2Yqrpa8D3-O78V2)2f1zPh&vBe5dy!?D<d`^=ihX7FCsJtAqNPKKDU+HvwAw7ZEnm4$=f>=^8Pobo=YTtQRI zRD&%Eafs0-tC79n7dM7JnH5>U!Ch-g=6ZU)RNi1H(AhxG!fjHqu-D`Oap`?d8$82# zki)r;Xm-{!|HO@okZI{OW#?Q0PsS^%+dK>7lwFE~Eli1U4FV*@UI~u}9Ty^$Aa^-m z!H7m8gT`K1&}g9!@WrMU{99?PUTq20m|F{yC$myf)Y6Mf0LmK;R5V5Ql8YAI^7 zVaT7?xo$G$v0Wxj0mNH8t~D*|sq7?&g5X|?y^nIVK*$xrqNee70Pv7b*2T$X95NjN(S=C#R|_eikrWkp}5B(IXW37Rjxe$ z?o=XMvD0$w>Q0n_Pg>j=Z_u)iNt%v0p(tsPFYK;qOd}XG28^Uo+0f38+l*KOCw|CH zg;XuonNEfu17#3&rvd5;+!ry&yFwm2o?KMs)z188xC5&UR|mDNn2AJ^ka}&y(cd_m zPvc#+#>6qA=`&EqWsh8e{@4swF^cRIhge?-vW}a^KS#PrHiSxcjv@_t6jZ`%bgBl> zJ-xm4s=GpP7uKf2B^Y5hm{L?^Ig#31PWV((qbI`!-zSjTp5xJy2UQlFT8vYFTw6R< z*80bkh##r7WN^}*YF6Di=qW!2jZ!})d`7^%@X8`_>I#_Hai;P_kcC~I;TuP5_w8+; z_?GTv^1j7*^r_CUEa!6Sh*diVI!cEQGcsx^JUgf0KHCCvC_;k8A~Ho#B$4?lm!Olz z-UU)kZ^tBH)?rxsdw^f75vQSbW`*Vgxz zKz_B(u?LLKsvB_M;u~^3^(R*0?@zSCDvvFr%#RJDU*CZ!AU2nJ#8lU=RQ8>MAX4*E zR<~n|ybUTVi>OS-`0-!Q<2rOi9P<1;aU44$sfK~OED%x*?1c5<>asLH^KP_{_b(qi zMjNcvpRnK6_OqIGr-gVkf-xN7=7q1MWX6PHO|x>lIr-gAS+%EsQjJ@dIjjIVeMI(M zl&h=J4q!9Gd$S-j*?CR^JmM+TdNS|^ME}?(6K1DPpU0W@?EF0msi+OM#MNiXA;)Y+ zZ)I$*_Q^)Oke0en_;If~jM+)=-n22xh70@5Tl?l{8_lXay|&3}!p)Y*umU}NVJ51w ztWmbXJVe5mS-D7$iBrpJQPuh4s;YoF2go<{L4=@RT3RzTkY#D=@H7x-@iOcm4=UeV zfVWD)#cXEh)vj(0`96nmcautp>hBdJK$1LRt-UfK%VIzHW}$$LcRt$3DO5C zt+)7-9Z47nQz(IF`zqPvT8TRAx8mZv{%0FgqN{j#s z3=IM(4W}ZMpAJ4(@;YoKd?T-rDj2*yvliVKz{pYA?mlmIC)@y{ZV7NF6FIo?L|xhd z`i!TB@kB(+<2GdC07UD431NHUPx4jc2&Pi`&|p2Mvd>*~<5!6np1l+0v@BsY0kVO& zPCtV>%ddzQI2g>o==+xTn_M#y_M1?efny%{#)7sX1i;Fju7-l2KFtw-bpwC(1kEdt|Mjbxt&gKNvt5mc2sP$3R=;O5J!;mb8>2aLF5J}z8N!fvdhhXm9!9ct2;Gmk|m>Qb-m3^V! zfZjc8Ghlc8VY{E1yy}i8I3mK_IFeR#*ca})AZ^XTit=wpl;qJJ^ze9ce=F&B=(Z%K zd7Oa*OmWQ?*?}A8?gYf%&5Ek%&AtO65$Ji6c+++v7+7vs_Du#3Dsn>l0M-O)4h~FkIHlz1tsCD-U^@R420Mia% z=mC@?8Dbl`{LVn9XI2_bXChK1G84|5cknZrguUjwPLH{vgAeMpdBJ$U&ghoGqMa|Z z!UQ8CtrAllZ42a&I3viJ2gX@D>ndM^4V% zT#VbVI5VBEX`zch)SZ_Bv0WrAcH9NWsNg(F_NhFIDqACwB+ z&C4uuXBOf^As8HD_6XOXxoi5wm;Y#y{f5sCOY>R!3;o;DU+%w!M*;s>qV}(mWMyju zTM8w6=g)tPK3G)oZ{JJe74>W!k#nX$)7DpM^7z;Z33`M>E0$$F78O5U&I)1iEdBAxSkHMAKp~mTojgdkN{kXL? z5$t(~z>KJ!b-Ayu3A!#psZ42bfdf(5oiwK80+UOfu3{8AA2hL?N)fWu;)x-%+T;^O z)u01NVw6h4Hf}hx1z?sKwyuiF7Y0XYrQJ$1hMp;D$4r-1B}A|0+Ht*s)_QqU8hYP( zZ3X=^#m6~UQEix#>DQ|g4%?Kd^i{!c&sWwn&)xAts0%l)=u-|odP2VnMC$!hUw8DHv zZdSY^|JOmviWv)-{w#C2KO0g0YjqXyKR!sxjwaThbMF8D^Asx_fgys?|I^O2y@hb7 z?e^8JXNl|RmGwdP9FjCeZ_q9^I_a(`dhZ%w4Y$)&hD+W*il`Fob-AK1?lDBMy(qtoxLA3)XpXQTYLaU?Op&*0I2QiA_= z@WlS7!TZPUZ%={GP`!5<>iU(s!O!mXFfw@&?FS`Z#|%VsSRnjnf6ZDg5QI58Se%?X zX20R#a7p+>#z@}KaAb}GPdBZ!rb4x>|F=Q+4+K(LE)IoKg|tvFOw3j&0z zL=?O!D{nPKLO^Df1%{|E&1}-@)UBw`ru_rn1<@Z!k4b9PGQwOsqj~S zGGX;SX^Y%)fw-&OWIm7xPn!WlZW3LT^TR}&( zx+g`Y_f6rinQ2}!v35|v-Ysb05PtY;AlXOpurTe-l;vN23=avH548s0LY&w1!7i&; zon2uF8=uLBT3o4Vqt9;oheCuQR>G(c3`?$MQ#vaO$z+Jxj+IEO3x{CotXP?4ApH!c zh8S*BnE)o{$*k3Qj`3zSx>ZzUEQgK3=8+?L@@X0eA!fjF)Zm40AFgvyYo}MFuB66h z13=d&DUSz=8#ofVePE+fykb5$5m|;c#I{z~dn0q2tjJ?!vfkhdyik5B4@P&BN|p*9 zy`x$RMTT3t8>l<3jNO?0y_Dj?>C9zN*opydr>$D7@KEIBv+|go z+PuMPBb6dd7f8KWm|?(w5Vc}G%E3l&vxWm0VrpPZYST$s^Heu!w847qSP7z?{|m%* z(iQ5MsDFvFp;a+I8XJt7H|=Xw?GiY0bJL8r??b2r0K)QY=aV_n@BxxkbmrHn+8X<^ zzS&ek(ArzLr@`nQbe`Ai^89!aw1{E!&XfHoq80HIYYuhX>60exrh}MF>4Px)BQBDw zk#Gxb74l?lYoioPo>;Ld*)1XL&4UDJ_3yEZF6_;5tM%3G>~!;*lM{^=wo|JXoHWCJ z$|k&^qC`nchN7uqvmO3tM1G6bfUO%)&nxZC;cT8K%~oq~!+PAIyAqX&ahz_t&gY*m z)ZJ5Qq$;jA3arsAI@|+!M)@r8TL{(Hk7bt!ZTIbU%SI9JWj6?)?iwQv3W83}asy*+ z$`F>6J-J2!52h+W?cxp7e&~2tt}K}ZsRT)ZBzh-a(jUA9Lq+Xdb2B@s8MZtph@V~L zb-YWcixWQ{AbFaVQ*YYUKBoaQ1XIczZ&M=^Wjv!ZP)c__*0|U!MF|%kRtniOsn-hU z8fF+;+R0XxEXbx2_9eRyl8(8UGkYin_vsNT{|b0l z#NP5)y(SO-v}!N87RIx)$XImOE@pd3xo)>g@;mZ(gA@OthRMGwT6N@##vMGhYa|#0 zH(9X5IgRP~tZ5J@Rn=hg4aVk1=g?FR zx5EU_0*h7{g$X~VM_Zu&Y~pi?>PWi{jfKm_!FaQY8EiD4n`81M)pPJcU63Rxi>4yE zvxs<#Q#6Lyp)1!Zo1Ay=nT5By8GKiEn0_)`$-MX+C5ecxD4-y$Qm$d%98e~giC3Ns zrCqh*z0Dco2N~ffVu}G1+6-TT9$bIXbv}$ret-J*#9YflRf-|tPzfDA@EubFFw}6RTw#xo~oW}!H<^+AY zWRkd^KQ`eQ!PI1U>J4y+p{>=5lU28i8>aXH}Zh6dGiz)$8wp$YMAx}yE5I(?VV(86u>0QJIFJ{=S4&+&itH9 z*RSWb-A27fNHlMQbrM&oJ<7!!5#TT4IV zJ+;vo*4ps?yjodYA^sRoW$bqV6F>5LRy@!d%{8VRkVeS3lNMjtwz$j=Wkbj4Qqf%0 znxed``_maOxrGCPGJjJbknoVMFHd0pZcK_1_!i1;N&8lt-5TmUQKc;O| zQ+FJ^`7@zChFOyW7t-V~#xUO2uLpjjQ|+HsSUt`?TDJc9Dcr_VXCwG38dQ zbg+sF!(Do0dp+|=rGsuPip(buDwpqFuk&qt$O`J>JP@hhFK1Iz#b->>Hlpi!*uSY% zp25RcW_|!rXN{TIEUhHS0WS)hZPHR3o)WAQ?WJH=3IjILo>f~`)@h7oHze>6L|2K5D>Hon-}I*o&uCz6Rvw28zx)yhxsm z-*kZ!vMb}<9vd+#iv*Tl`a!9seXUc44XIwR>WTrWa89w_}$j@thFRpR8v$2ubB$Ek>WfJQqweDoeY>1TpH4HLHQ5oi_%b zYOTkL@>mMR^+)35-DN&V?wg(+vocWpvV=$Sevy3sPPGxc*e6x`<@-rAfcP)A1&@3M zp5UnUy@$VKj`pn!bgzH)-~2O`!0m4MATx)ILeLKi&Fm)%watewU+-;>VM~Sp{vF2dP?KHFEj*yj}LS89pjeq<5e zB?lwM6n>EV9U}uzoXjggqEW4cbqgDIBXfLMhju9P^d&3VM}UF3R=-mWpm?3~8alL3 zEs!Gsq-zQC9dSSoguqRx$d^VpjJb;?mBZ|t6+yz!EZPGQ=#=tOAnrMoYzK`SVly>l z>?pX_{o>pF!x^$H*YU_Z3B4>AIKFM6Cd#f|`Nu&`bdDy%BlKk$Es5skkp-BRpG832 zQvm#nx}VovKO6zkoE3v=km{Wl6Hl4FxiEYhzvSVkFWSB+B$TsR*j`EJ;jMS7VtkFB zKzwT~pc zpx)BDxHPX@p-(k9un&&G_JYR#mPI2Z@C7zVtZ!Vc-OeL*Fmw_38mVB^Z_Tg9G^jroU;=W2Q!~9HSXY=>*8)rSp`6}P{Iu2a z6QICP! zJl3jN{8vyBMn`?NH|zG2M`^oN?!f^ ztiS(3?fhh>aWO{x@&$q9|5;J@pKf#c@!yrm)jqwQel4b+pE0N&ss6O!*3X3;DMwvKQ+Vz5Kn$|q+%3Y?MQUNrB4 zde>hOX@O+6*OB?J+PsEL%FvuKZxczgK5kyTZT_rkQSafyac<`fDwa{5RqdYj1IHaZ z;W7s#f7O#@7Hp=6^+D;gsumAJl;a@v2R5ky-*AHPstWZSDG&5D#r1u%0a5uTTfJ|& zVq$f@)hmsnm{WaGodLmey$&4@6SBwFKKP=pz$zC$6LBrA_0;AcLNScerxv~Z@z{s+ zKbkM86H>iPbt*;CUL*NsuQ`?2V=zW@YTr4O-=&K; zqHlaM3-4Xq81D{SXx!R=Z5BAj1;@JahDQG(IxfeLQ8LU^pc1gtNq(*wsUK-C+j_Cg zkR#d}K`R%J*;Qd|H@~yBEw6Lsr}XA)E5fJ8SUjA&L4e2K{tBo#Si;o&LbO9B0OqPm z!=_kwPe1z_6`U23CebbGCnVQ>B7v!vl=C=h5m4QGl5pRbpl0G+%Ec8d7!d zhR0Li-})pT{&A*Xqb19XK1qtne{26F@;@Oe{^j!2?&;;Ny3p|9HX-jw#ZHYZiUtFV z!XnBh1EU`P=NkpHJq2uR(6nDw-#95Ro0BPz6BUY0iA_aCjCxsP_~kQAgHX5)8|)yR z4Q5%zUkUA(+0|dGi$XuU*1XmLUcz2k>}Eu`B;fZ4F+P)eW|s|JR_6^%T3!lz-iISa zUo#Ybq7~O5E=`CkX5Golx-1h>>@xJ(*OcxgH{exuh(QMz>TH>b?YAfKkg z#+tEQI1VXNTQl4zD}jnq1u^ zw=zA312!VTKRng?l}gO7Lw9)7oxJUu>fCt_1+ncKi?+N)CtH{44lo_eh+&wgioID_ z{S9@{o*P}!$U0YX7Dzpq9mz7U4Y}F}`W|A>{KBQ>7jX>7^&z|1o`twEq5AN3@yy6i zm}Xjy31LoW(R)~i*mNqU`N;CQIKI+gDu(xX*Sg0l)0xodXGMG^_7POTk%}773R!lh zn1FKmMVlK%wv8!SGXEeuABpqfI4u{+12*{FfU{JtREPx9h>f%=ug+!+3e2Vs{7cUU z_w>rbmWRbuAxIJI38sLmU~K99w5z_O;q6tCD+$KrAQ?$t-%4A<>?S=*Irh53O2z6| zl^OVpC3QlG)>|uE?opnQi&?Yo4f0qJuWlUPbgyhSZy|lp0Tbh(usbZI&**QuV^#$! z1XJRML9&;=Ql>IbCodih*s|Kv2Wiq3{&Oda`Hb+MwH?Z4QK6rjoZIeguiMH_hFZ=X zrDHiMvjl`m9K6%zBfh|eyont9Z%AAZax=R4`!g8Bvn5lC;cWRbu?7RgHb~~PL>5xY zwihh=JnJh-SZ(=)j??`e$Ij{?Q#R|&mK;|x3qr^FDq2+CnuI+#m*9f#VAfPz6{~1^ zyQIABl!IhOEWLnqyRUh}cm^g&1o5}+5Tpq|YM7w0Y~p?{{l}~Y(YV*WxZW$I3tuJ%dx|f}2xaA%n(4PmdW_bT zR64<`rXgCZMEE^-G&*~|wA4V?P!gSzqwrc?Rd-R9cA0^4h{G;aM(Z0=eUvAx2YE=A z<58b%LaKHbL3oN*DU6Gp*PPl?kq#-kX$|tC43{}(4oK6y`%6DXwBtQAjA5~zIMRt@ zvH%%0EW9Y;jUp}9{7N>Lj9i+y7Z1)N47>_70?iG`g1l7hTm(1^=oq7Fa1y^}zlL~* z$f20AN)G5DjQfe5Lyw(Vl(o7lZ>uNzjwhjZht=EL$`Jj1VZWnw>F{;|8HM0{+fSb6 z0-)MLjkQW@^)}vD{RQo>T+de-6^cp@MV)l;$q7m3a|T#nBNx$q2Y=L2u@$#Q3Jx2i zjhXp#dVmqB5wLS4XvJ3{$+<;pGyX(_h^JHC@i+6_DKWM0!eKYtL>MN`h&hK`8W9Wq zEVns_p)Fd=7UH!jPSR$>mG`J6L)d7mhv^e+6xz)R!dezF&$WR*3eO0T88_}8A+UaF z;RR-2tQIs8K>y45&3z_6j|m$$24AT^lnS~J&@J%w+=Z8Af~U4aMCKk(j|?qAwb!F) zBtp4(KvnJgFPs(ZAEH@Qaz@nfZ>$ROYCdwRi#ThaLA|*=Ng{idhPjgw^)JBix21qd zCo`3A{p(Dcv3aM39-4g0OE8lcg!n<41i?zm2|pcF=Mlj#l5=&>_8qMxs>JR?xJTIo&Rt`RQ(Yb9H(jTGGQJs>YS9iTTI zN=a$(scc`yh3x$`kRdcgA3ZHJ8@3Lgs6xX6^$(%0qXrV6)`pIGI0&yWO0);T&(VH- zEux)P0P`8O=dZB*AxA-S>}V+8m0OqRz%Ih#)A6kdCA=j!u0+UyL!)CU?KKXiK)Szo zk+Ed zqHg~tGx5Jzd&ekCqHJrlDs9`gZQGT$Z5x%gZJ)Gl+qPY4XIAQEf8F=q_owd|{k?Za zjB_IXow0YsTr1|9Yt59S`Szl-aOa}GFB&BG9_9P5Lx?)0W1!zzR-RobZ z0tj7WRY9~WHmi4^?}?py3DCYk8Qx>)zrgHX711&Hd6nOU424BhKKua{2ldRNlX#xlS-q%czceg& zZbjrT7caHq&o&TGxgz3+PKlk~3ZgCn`iKYFzbOLr;SWqcT1D5hK14pL-QsC}{aNxw z*9*VmeFgZ9C;dp~shyJ)63)y;9TjpU_yM_L4@!SAe-eFU>7rU7`H^Qa-{VR{#}IW5 zi+qB1(akSBNXPpI4-kE1u=WrN7O|&k?ih2kk|Qf<$v`r_6||hTfN04^OY{^L0)6Nf zwcK(UEIXS?`03+oPjXmA8Hw5=X?SMzDjS8I*86gzl%lTfF&&CP&3#q#&Ec(}8 zu?Sxaj1!f`tzsaj#QT3EyV4&opY|f^&%_s(!d%KDRoMs;47KOD%D0zTL*Mk;Clb~) zWTty0Q&O^!!YQ3S2EF{a1Jy;5o=&=SOZ9=ypmJnusC=1l*WhRClyC44+fPL<*f{^w zg2b2t60QE!{p9~936Qa>(Hre zphy|QDJ_|nYsEA@c)v$SzJp~)u{x0C5WlB zIi*;G^>s&r=6ekDu9U<`2nKJt_;7a&{4^=)uinsU8_jfBn1XrN74n^AxhNn!U-?nE zTHiR$KEM@5015>53B;>$Pa$1H=bGL$G~w8vs~VUFiDg@zfddsg3RYC?!knFACqwM+ z6p#kk|0(oKabhchPo_4ssOwmsnlC_lB}u_=^<`-QQ>9qKnWGZfbZJSx!t3}tLHzB| z0{_jp*(ulpBtWTdJ~yIqFT64AaKQ2vp(vZ8Ff1LxJ@k2Lx5Q=dbi8EIrk|M_>hQzN4{O__I_reBq~C~u)zhSagLSSQ3sgAj68sD{QFw<68q?u;)l=%D zjM38NquT<^KE$N~#DEF>B+@D8s8^akMc^QSH9w9Fae51hDVgUg0ckbnnG1uEZqOqH zkROs?WDy;qdx;nqPsG9~BDW@Wl`O zQBvL{#eS?(-)ITkKjQv%Krz(RI{im4R&g_K{tHCvb}Z^Mx)oA@k}o*(^&V|=Jog*^ zUhdg8;W9aW`LBK`fb?e*Y&PMd3~f;i@iJpL(LXu(KHrwW=CbBKXU>36o&+A>6MEwb zkV3#8Kojr)#YK4^0=rK$|Lib>is^$qj3(xPrE&-C;ylRY>EqDJKXPp5ydEI%9>qAI z$Q78I~3FjPoc_;AaU8aU8n?7~E!=!RDC3RzRpm7-JL1?`eco z$nw{jgI@!WJdo8H;4()Rb};QNCsIMT3;+@aEHZj1)DbB?hHcmfB= z-b@j`hFz7t7Y(f?+*r*huz+Pkf@(~&FQ&7+ZI;LM238tm=(y7uUy(J)==&Sor?WaC z;pj~BOY%LDNF5f3e&sGkMpitUhP9H4k_V^AK{bm3IZ|W`UVm(!aFNYvpSd4Hc28R?-yLWU<%W1n9=NvRd$a;KIG|J6 zvr{>sqwVFOBx+a_YX0LOGPI+2YN9f#v`WV>G&z2Ggn2O=LzmU>E z@Y+AFLV@A)AmH<{^m-L}0!-XtsBbtrUx?Q25zu#~DY>@IB^&1w%!#`rult6NMgzOd z4NxI=Mt&(pY{*ioGOo-qgg71C;0`KxMpiK8EQQoL(+^Ft>zYszUm5#*TL_o?1U1A(Vs4vj!!$R;k zE7%5S+esz2`DzJsRdcK}&m0+W+^S3ttZ@7|m{rsGQ7-c%D0jEynCLm9Ts>8tq$~k$ z2BSQoX6e}K(KpFV+_2R6C&&-+-NE~`XgmF%x&pkqBFNq0_cw|WmdhHW%ju)58#DIB zWmw#&JT(0?x8<1eBpj_0^lH5QB|edvlrMPN{qTf020w;=@PX&S2yp-Ax_`sE_o9Eh zN*5@>zzCOVI_G0^A-2_XTl!gt`@izpvOG6|pk}!`Gks2CKUN`~|`{Q0o@#=|FZf zko|^WyZ>ir^vErE)PcM^l;7~mEqZ5I&pzop?GT1;v+^gC?txqeW&010FOiW>=4lS( zAiZ6e1-6{P=!)hk1brj7143s+xcto71!oA}pbzzRXNXLQ&^fQ_!g<7zU|0w1?N}kU z(8srCyq9PA^spEddKVbEcW4)PaO%+zG{?N;I~sbGP^fpLp8e1ADWJ^|z5B!Ia3{v_ zo!(*KO!Hsc3{?P(C%=4|-b|qF@-Ohzzb!9?l=IZJPVwH+;tHD>;$MgyYX<}^E>~d9 z4=lKXx(kBx!Z^S(0OHaN5y|30f9$tqJibQCm}gd88eEx>6BB!2l787>ihLyH1)4<# zN;DB$FdZN7wpVC z{+A9)ReT(=^?@$=gLjT*GZBYBJaVo{>N_^oGuxm3)CS_PpW#LTKgz)D%o7IgELaC^ zXAE@g_VF5L24uwfFj8*}<~wOBT=0tL1DY8OsQYX24-zS?Vf!-Tn2G7Bib?E1XAqP7 zXr=fah4c~AL)@aG5UsSC0$UVCcqt3yaSLWNCHxdc{^U!q;!t+R{M&!hTf)$)S2`4?PplFX_b(Ad6*v}7vd_{#*ga|N6E4>j~EQ~ctC zB&%3PQ8i;3Bs3!lb>_`-7It+#JY4IDh8i`gV@_By9HxuOrs4bkXNb3FrV!515vR*Z z4^15L-3gf@iCYb|_reZyC?VkFc`Snt9%t1Ybg{&%3#$m?rFF{D#Ma$n`w$JMON$sI zwuu1DMsKmm43@1t$gGsXW)RRHTOmyAvBA#ZJkI3PfR0%qHzVM!z$s_?<^>n>nI&skP0{1-S}}-ta#{BMFK;-< z`vSf{bpekrY*07c>j683KkSrvKYs%)BHdeqnioAf^Ff{dq$vQu&;I%ra{iMm-Pin+ z)Ac?1^qJ#-$|`E^ z2x@W~6&Dvk@lvtUo$Pb_DtEU=pc@?kzMGHG{yRwIgx0h%19QsTySodRLp)=bppTI7 z@hV5yXAIYl*J=)=V;!yg*M;+WwCWzK^ZbKYaD>)ed9si;y7EDjI_f|s;b*y>?`Dojjpa|MRFme_83ef>KpI3rG7!EG zIL}BLN8R|vGSmE=L}YfN0W{S7H!t0+R73LqeKq_oqWkv(I-dW#wU##V_@{C%D`iU! z`5blF&#s#+T=+!+flApLHQ}esxta~Js%Sg`1yn)lM;b|u0ZDo|GjiNl!AjR%HM{O= z(+{0XOEs^B$WK|bY?o#3bmW0h&*`=`KIXTrne8`^-0=6W4ZnBn*3nFsKoq6Z$qIY< zU{F*vmDZa6Ko%}(3%omuDJE(t-eva!M|sxed1DGP55T8Sb$=v@pTyk=iJzjppK9MC zMKPt4B(Vo&m^!LI1yl$gtIbaNgvvyN6syNVGw#jUkKq5s}PZifqE3d7d#%2fE z*+#>4Xs!O@Pk~Z=fb-ac@!V7KB{bN^g$cQPvYiQ3fXG6kZ5`3*qRdQ>##5DSo8eNi zz$A1#Z^>E8QIwJ$hpT|gUj!9ykDbbi00Na<=B~$d{fI%zPdL5dcb5rdb80|~gS;(tHC@c7&;usNlStCN5~YX`$g?$LjmRa)K@#4ufSy z;i4q26BYPuN>dj(#!4sEV5g`v44KoYiV+&lZ0<=*buP8ns$uHvonNzSd3nE(wO=jJ z3z^4icMk=>M@Us^ina%os-!QM8CC2;w2MFc5H17^mfn3f=9xM7JO{RiOxr*OIvUq2cWnyUs+~U8yLV?A6LV*zLHAWG9j4=k>^UJXc_FJ8eXS{QWOOa0btM zKh0(_L0CMKZDRqcM?dcQ@FVZm@Q8Y_$p2l7$Fn}R-m=A*|_`$dOf=0yyT_G5ypty}O zj5tKVFwR(9ImCcE(%f0;!^yhr0i_ZM&`P2xVu=7br!yA(RAe3jDtd|rm!M4(un*n| zT9`qCq*}1NJN-Ok`niDQfS0iUi(yFM+}SI_xwJ=tACd4Rco#Ea7_N?2@p>aFeD~wv zx1?P*WO~qF3&``_kVj&JkFU`n^Vo+sG#-FNA+Aw%{4wT7=P3a`|ZjXWP`$Iw%)zfrhIiQFXH1w)@=G=HnNy66$s zL<&VBpfHUY`phFcX%|g=XJA1vhug+TiTadB!T{ZbCHXrF+&hM3S#o^ArY znjbY zgjSgfKE2F$G&+w&iErt_Rtm~D#6wb649nGiFH%7U^W8P*wDY~v;JRBT;%MROM7gGR z2xb|v#Buk}lsS6Jd_1;{iz@DXm-_x0(2{&wao@gsXQjXU75+WQvi!#&`%iE!O7-x@ zUU3-d0sgIxpdEoCt585U0Y@GGTZE$SkR!iXvw$X?k(3%BqS1)!1z9=D+NXn|9%i^+ z}#tS9-`! ztCP9!`lh2!%l4&DFQ;=B--`XPmn@K?`Z!*>H61ggooQSu!k#%U$^t zr)`Jx+W0PpKOGY`GKZg&q7fFn2Xak)2e#U!w_c`2|nD?7&16Lv*^=?P=f`su-TSAvUC3`Zu?>DqJY zE@XGM$M!myD4P9ccauTa?jCz8R*>WU%>#0$Fi^7j=*K#QIW9tOOcc|Qsy?B!24wIZ z#nyAw=A|Iq*oT4pV+HI7r|YiFJcq_50fJ$)=HO?HPa#lFOB6GAJHEyxsoNDH_;*mavF4nr?ZgCS97m&7^OITSN8twTzzBi!Nvm5KOH5jipE^hSG0 zYDiC&h{Jgj;yYN+EKv8Br`>296E8jd`_~;x)*hwSWv%9J2MUU}{MjS$d^g+a!(Pbj_}(## zp{*7&zto0(Dhe|u47x3{M($vt?THL&qg9sktD{x9w^y$AY#%i*3Abt9lcf8-zU1Z& z@~slI8)!m;< zwnysKJW2?PK5A6d^rKlcp1$sY(_q`V))gMB2Qek>IuVH|up`4|-hB&T%Q*?SQz7hB zr+(H7XG!c($jlF%TFhfswiZT1r!2LNEah9xn6=G5#{9Q>oV1S7{c9V(p%NQ0P7|jL zZky?Hw(5O4RJV#&aoDaHFPp1{Ju~;nDKiysxuNq{#>|;}&`kO}(!FEW+S~f_x>u$X z>+XIvn{L4R%4^6FyG{2{X0U%#dh@HsHj%Y@dXcaReeQzts1DoCF*jRJFFjPeSF_f8 z;1vIzJe4kjX3NPR^uteNp|_{^gbtT4jeHZYZEdge3D-nYA zv@e>A&T)E%$ZM!G)(88&zo~Qzd&ySz1|AKk>X^O;=kPS!6+ALlebBruNt|7IkXrS9 zGWj^|!v6SZ*^2I?ux2_d?AG*06sB^_Ewg_MGX6)U8LtAxjS7 zGV`FZ>8%Qy()&nZjb5Yl<=giXlzIU(@u{eLVaiZ;o7utUrIU_PIRNqqm0O=?+yOg84(R6R+zc`l6f)aEJuuJHR_FN)_?G88+?SxQ{h z>J)kFsBV?zm6B7G>)WJ=k{in#0g9+d@y~P1ZC5tegAqC;XjSt$f9finixO_B&XvYe zsItq93&vT?jIENZmFugdn3fu;UgR+W9lV$5J- zvt&84o-~)5Co80+&Wr}IG)4g$Bd}#X77bZQ<@(LXlT-^SVQmU2CD)?>mFi|J#e&?- zy_iI)7=VF-6~o+MJ4AI98Yn|wG$X^?-vnq~sVw>QZA^x9)DWUlEN)N2GmGX0)P#&{=U`YBw$p|Vsb?ai*jl_76bC+8@LU7pTodlx!q}OHPTylykzvV{SN6#a_r;8NyndzXOToY5Khrfa7#0ii_vym4W~~1lke2D z?;A)1;URk>TeYWVCR^LYA~5veil`ZEGYuM-(+wtm553E@vGaukRrl6DDK_%Ix`*VNAOEl5>h&-_oL>x`|>3$5qS$JAl1sXjn93VBcx zBU8H@Alx!38>CqvNkmSQATmkEe~YYA%YxnMW=J?z`B&zzt^Dqc1;=C*?T*c55#1h} zfO$D3dMOIn3As_?Q3n4~B^rK>+P9S(BYIJ{{Yr6LEa)^L9AANi7p2qbeAthmkcO5` zARw%=M#sz`a`&cOoZYac^c9@> z&C-^9;@L<=g3nJp){J0rvat}(`V&abi!!6Z`wZkh2EF45A+zz%upo+j87#tcSPa)5P`YOM zWMyaj+&`2|VwQRQ1J-_{eN4|_2q49`(SjdC%E-~?Vzlj@UYVW*o!Z9TxZF+&l339BqPpA zrsUS9e#6wNJ=sg>P9u5@CFJ4QfE-b@WYFU;ZI9P1N|%M7l5LRn*I@DcMXLd=ARFO# zZAw6IoE`y=(QNk)a5m@qF>-fdX#dA8KxzJ+9Si!$4>gScE%*M<=GOd!NBXCo&cEo5 z={l)zUq!H8Kf}rNhS`zXVamox2)3Vu<_@Z^2ipkjS6jhrI)vFXCVRjy3Pcs^npsM) z%b1~oat}V?Y-&~x|{l1vJ&Apt%nM9GskS}9EC@Ec3LAP zJ1#i+!Yw8Ma&IVY*qX4~wL?>9zy{kdF7%X{NV;Fc^dtLfUlmI1!fYkd_(}H4SJLuX}VLH3N(?_)?Y(iwpdR^48krP9nm1_4Ygq!$KI{d~V6O$n5DHu}{5n-zN3xb>a- zzKZ()nHBmbgoF)@%uW8aY{?o<$ZB{)erlFhg(lcWFh&>%Fo7nL>ZWEiMhJLl2I*5m zFbyrmk(;ec^NpIO54?8?E#Cghg2}`Q3d!ThW#eX2#fmLUXm>*87pWU=ykAbA&zpW< z@8{3_KTCK!QG3Qu_=koFv4vdJy4EYeU}l@zC(Sasm;iTZc?JEIt782fjY zp7G0H&4T>Ou6vB$L%+%oLb&S6Ga|55RpiUJD;QV>Ym<8DF{r!Q*rF;;R+}y&&eL3J z$;0T`E>f&kZP#ko6&aNE60%eD>&;hHN(@vRY*rfUsbvQ&#ySr$va<-<4VSG4Y`7H> z=rF4uN!JihK{ryS3rrd{>q#km&OI;15 zqlVs~*XASBHx+nKnd}rWmf?Kw+N5uXk)pw>t>NCZS(;HJqk$SkTX^KT9A48ZX5zDE z{&x(9ZKGQMwYSghM99O$yzu0WV1=9gqS0P=E7qo-#9<@-o2sgvR9Mp0u_TeV)#B9+v`(6ez#;;oHl!T+OA*9SHvr{g`J8dPv3Vfns zx;>!2^nBCUV24BN5cKcUUR}1yqufSg`8;Blr|rZSyU9@UQqWd&th(_8)qyU|S`&O+eBYYzmgMDnMn9lr%rZ?FwBb1#jC zDWv;pETnr$Vc7$ju#S-3TP@-BtOvYfLCaXEa#y6b5X^6JpPQVpiAl#|{6j02fL?7& zq4P|xQ z5fys+eHxi({9l<9Zvb&o+c+r@aMp?U^a{_Xzn(;Jcn}zg_DRThbv6Lcp6?^x{+N6^ zc8H(h{f?K|s89#4q$4UC_so%F!K8BHr3J_5)>hi)dtyF0$->cU2dR{q<} zQhpfg34;bPe-tqVJd0u5jJ10L^1vr^3yY!dX8A!mRT8ygB0Sq6r{Fe9xDqB!eaFPG zE4138T<#fv3RhO?sDi({!lFFE;|-7DNc2w?iuGcO;M7b60+I%APRDgdNMksUzGvP<_ky& ztLlUik?PoW(I8FzhyA*=nQr?>`@(?RtP)JmN=sX&5AmdtqAcCT~Rjfm)y^8Ec$QXrMQxb!oDPfWV$z zQk?N1+T16irBM4UIRrNvKU6VVX_^0s)mge}Gq2YRFEI%pQSir1y3Q)*wAqSpP?v8& zaIL3i&KgSKvH>#Kf-*QU;w0cXDxsbI6*6AG(EJj(bs_qMxkCrn}bB ze75!p(0Dd#Dib>ApKXX%8xMaYkQ{4Ycgg11i%%VsxG?Y7MxuMjM``S}VokKg$wy+* z^VvbEKbMup(2le*^IFN2GhAVY z=jvGHKS&@&Sq_jpEgi8fxZn3ePM7Tu$~W1$4H$i7S5xUkZFKHtp}0%#;|xKnFue&g z2^{gZxq)@bCI_QtaaIlfa|K>;>I?P)b3iLWR0FvY-u?NFK{u zu7F`)Q)){Rg~#`8D(Z?+7HVMbM!OevJ|equPC=-ZQwg2Qe@J7@u0j))be{OZ=J4dc zA51<1{nBF@?Bw5*wJARV{v6@5DTzZPz_p>Bw(S&U!~h{tmqvpd2O5zjjsez9oJeF= zV*42+qw|qIdA@iC6es)}3f=$Khh6LiLXkQ@aj|_8l_?5H41Vo-KH-BXk?e0E4X}XA zAJ{wSHU4k2_pt-m^#?p)ufy$vukm!4(AoF%B-%NaD6q+2`ZaBsRQ1_oze58ZI9&H7n;j3nH$bHgMybZ#_=w=WlRYr zc)4iVo?-?k(TxM^FT5)^v)WXP2Z(}4BpIe;K0BuD0_I6a%IHzU+OLJOZxJ>0a_*>UopEdtngrb}2DZpLD;BAoB;6b1Et-ln31L0Ur`qHw@`bN(k<|0uuVK{o#(!wkDg2?)90h<^x?c!&NM zrxt~gs+1jMBEM9&B$mm}(Y@sW7nC-F?VHB^4)WF`G+wlH+T#QOL@3~D?)MEmkU&7< zM=l{KgJ{6d;g?vLAVM*VC*=PE(B!Z)%9rmoefVF~PX7NdtNt&_JlV<(c?5UZkGQHa zq24j-KpIQRNO6C(zm`nWLSXn?Nd^TKH=35vEV(>SfF@1t;&znxunkCk_{97Ruv>5n zJGGcT13z^;ML&aHXD&>RBYn);@0>M1dE%M*O87=tfyhRI5t9;`WNsaqG;`c@WY_^fj>RsMSTl zv5c~!NT!+!*%F815~RSkS%JIa?5?rW_SlWU5BJ zd$5{{5)w*Ih6BO|CFoo;$G9|^7g|jsGEEfO!BDeSjnvLQF&>0rWF#6cAKPp95d2I2 z?t>C^Sj-yM8J*{4$T)-=*a?mAV63dK;jNM{Aj}bszr^?!vZwZi6ubP5I#Ex{d)#hu z)Q;A7I|5MG^w( zX=pjq{3IT&k(^k2T$I!BqG@;v#Un&A@I>!mC0-yz!GcJoK7xOyiRVW;j7@XS63z^D z^fKhV$E9XPd&HZ zsWskg_IzdewlHnBupk=RI1XD86kg$-;eDCf5$=BmT>@ktJyhE}?Y$nNT1FkMD6#=y z)=G$(f7>UMDY88?07To{n<|F!0YqSSut*oKC>BqWMWG`gn|=FT`SuOKKiBH)8xX7d zSfvohRDyD(DHG`QaEJWx6X98W;fYcAYOb(3K^G{uk3EAd#Y@BAg$K>Jn#oI?oFVA? zU}4c?aazZ?|9P6X?NYX$os()e?$`+>r6VAXaRP zkUfknNL8s@sN5i)H^6ss?f#;f229RkhOBsln7$CS?KwMZ5_N$=p5HcG)#bS8%Z;krq`2F+|SYNw!TYdMDk`GTX|`3{wtOs*==!W zn}Fi>Xh`m!mwQBlnlv^5vIMf>d2)Ib@7h?Hnz6mygsw&p+r=W=O)Ao|YzKji9ebg} zt<|t)*?j61qcsIt<~?BZ+I*gRp{WIV>$y#5N4>Wga;e%GqBPd*Q<9?d%+t|e!S2+r zK3CS>yz`V4hilWs^h3qoM@2=~wjxPu0`eAh#O0lpFe8T=Qmp&eul`%u5tWwpNAU5D zdi=#C(+!G^ri4pQPkcPA&*lZBWw!BXPgnf5C5zYcZP)rLn+>Jp%98Q%N3Au_!UD@R z+KwhCC6|cq75fT7Yfgi|dG~To_yk`*&3-pI9B_`q5cAkIo@4FHF=s8dTV(U;NIJBeLvpjW$T(4pqkFw4Z zDo5bP&Qe_c%Iys70{c&a;^h}7L19XW`)B=|s*-ME4L-XSXU+yM#Ij7y8&=ujzxWFM z>6vv_sX&Lxc~tB!$^}Qn+VkubEmtVt&YLt>e-9ZS2ENt2f@ruA_Byn%(kwB*xTwvpBw)nBRJ&$nw>`uO@5fd_TTiqJrWxfyYm%PiUb7J`i)&8?W4adE=-rGgw0hU@HGDV*2DOJQBZ;t;Aa{i73yFw8CjhxO)a*r7Q<|XnKbxTe#j+5tS*J}Y|I`%_#CdUKq_Yg3-bRYAC zD3Sj&FAU7?-8-_O&c2w*pqpgP$ds zSg(EthJA>`G}8bl8s`8h9f&m(#w5d7Nvli}iIaE6(eK-%xP0F?7-)%Jmv+CF#U3r8 zR-h=vS9ZzQG-rxsGsJD8l|(5dj6wfD;zd{2jC?ysFN5K9BORU2RtDV@gZ+bJ`q}eV z0CdOHvtYWC{;hgMofz36KotMYaQ}XH`e$Z@i$~i8dHW(19H=UH&XNN6{G31wf>3KOt23w{zuP_gg#U7Dtun+=T zBrH|7cZ?+XRpBU*aRE2Q_GH`GL3gOP*P9FtP9;d?4-&ThlF0ERqpm5a5&U9c@+A9P zHgoOM;rITyK;O%?L5IwOi>4#Ravrt7w3MKcGPNeFRK@XPs>eD(+fd0_$=yk+?3MfA zq6a;ZP5!6s?#*NIF^~lAuSNO6W{*}>-<(+SN@QnCxTbF>MlL`)* zM2d%oLYkE>-$S!Es-^tgKLR5j$Il50ZXY_yxQ#6vLN3%1h2B~e?CAIq$sLlV!426I z%g=9JyxCXfUDap+F3G%hcx9~guYu5HZ~pNhZerc{vgrh0tW&uHsD&6PVJEUmcJU%B z?7al&ib9~^+iY!6@aM&Rm&01ZMZ*sjzPS2jZJg|RSr>Yba&Q>i*(EAg7c!1tPX^Zv z{PhNYWUbt6A+bb>N0Zcv8jJ_e9OA;}A75&H2Q-OznVpxnF&f*&dk&e+wM-d=v9y7H zGrK2kbe;TIpQPgbMUQhTw?s#`P^x!pWv=aN;q7GzPcCK=T>ty}) zP{R3mhdu}PXqqrAw$q+&({4`C}(y%SJ1S(@0iEq-@?G}6JY1A&~ z<{>+bhIG`RJMb0ixi<5~pZCsYRm+^tgA7~r9YQ1aG#MkN@{865=2tD6VR6{x&C5}( z@3rwAD?d^P-ma2LHfnmI*{xUl|7UO}I!{o_CeV)`MBhf*|30hY{*NCgCFgH#^?$LH zS&6dp$XYnVeqYVPcGC0@{ivur0>7jM!2(4Rk&uK37g4m6YW0oan91$+xfUj~u-0Dv zH`B~zv|oO{D-2IIBIwj&xSqW0`OYxUOuoNAet_2wCqj{4sX2VNEd35v_& z7$MV8M_uODU35}89f`l)I;5#UAqns-B$H{DHfKZc1+k zZ5X`Ni4cL(gR!>ET=tU~i4b?>;CF9;$cat6n(CZ<4{9qK>wFPZ`UHpPy6S z>JJsW*%C^=-q7FRU221@jtgz|y37PFR2Tm#Nd4*>?2u^udruZFtuQE%A!PB~f<@qG zse&j5I2)yLvZd46_e2!2JtsD$Kxb(8sh-|R`v}NCaoLI)1n(m#!BLNJ`5+tx6ao(q#io8y&RfYIy==Tt9&aL(iONf}t! zA3gs)+Q)c*p#tvvwj=*W@_&EZ{bz@`b zn!G^OTm)#eLTZN-fC$Df^>4YK#1%T38BbF@Skij_&dDnYPwPO)XM<#oe1#9a|HA)z zJ2}Vxjn~c@>Qb32?=rzTZSIS?`Kn`yQM1r2VMp#ac!ep;=S>0cO{ zLozh8lIj-8UMVdLoT$I@T7Y}#2o!`pHOOj1VMaloe$}vy2o^^dmF8=FgmQq*irh8N zR>*2K2p0|9(d}|L=g{pKM!a8mzanS@Ks8`Mu-G5t%;;FboM{ zBT7R0>`lfzi2xyJ2Ad?Mf@1B^S6o{V<=7+#vqk<_v+AB+)%AM0pQa6UwU|xSVzA)2 zrj?q7%ZjC%nvRZMM76Ek%9hKD8d}B&&rDYv3}F+<)=}aN^E2Nw&k5%VPtQH~$zDYb z&m&8%h%HoIIy&qpnFuC5*x6Ag*bdZQgWl)z?gk-{xA>H|+SI#Fm~MB8Zcj}}k6H~s zgcC8pGL~=Av2SILuHt}XU~Z`$zl!2lUPvxz_{}|n&U+z}JLe>DXHiI^zJ9m$A`KK`KSJ|;|@xzDaSXYtiyI9w!Dr^t*{P^|K0wwFaI_y{R zpN!JZSWv{2o{jkr-^U?q3W%nfDoao zq&lpr!1$7#r~s9)$l^7MFd*bKfr?cbyohWN8i~GIY#aP_J;Njh<9>?yhxub}20RSnW59Oz0Ew&eoU3Nf(2! z2j5N0aOp`DL2Dre4y5SA*~n~GE4!B5ff5?lVA2(VX{nw#hId)E>p<8_!4@G0?`4rz z=1KqxJNTIw6C}u;(v|B;d)W1ALqe2jUvlC8%yK2+P|>@deks`}8Hbl%2Y^9?1q z9bMnX%r#Q6Xw*5WIh)&cZeU!l5USIIkl53lX5g(lcCRIhm4cH4O6n{kcP}SNX!Gm2 zlbbz5LtWL|rowRpQ=nV`{EV%n@zP~(X7gIB$>Y!ybi-M$eUnEV! z0pW}~{o~M@pXH_y$=puq`4!9`9V=QM*t_+zqhEHR!Xrjf>+L=|bcu8i#&@7^+NNYm zuldS+J#)*mO-_%yyJ9}JlKI;BHu6O00@eL|b4!7NmJYf%Z0inkkn^O<#mvEr(_L%? zuB7w85wzZ*TCVGD1lyUoz>WlVs5m}qa%?ng8BK`Yot|ixSke$8X4Rh;wB~-%jV>LR z9<6>HsSWdTIDjZU66F+#LoXx^1JCC)6SK84@^~Bc{uoUyx+DoQn`4DT3vinY);Rk@ zbY(IZ(~t#F1F7&NW|cil2eRd;1_vhRl0_h0b7Lo0aE(7fM$wE8due*Y*M?5MB3Jv!`$fys$FcgT{YW%w}WAJzuY9 zjl!yz^GY0fRq>w4*h-k7PHAs6%0j@C-B}tsSxU^EHU)6HPyeMnbEpXZ^Rt3Mw}ina zU@ba)BY2!K_;pL?tf)yGqGa* z5L2=EWWo=K%_o_ctl}(|0w#c+lP3w)5IHNHH*vhtdbD^xxLdni|HygeZ05K!yNoyB z%a!+Rn|*lfPm!Ef8?5GL9H)@Ek}1cEU6u41o7ug(nM0eV?Yz8VY0hsVS>2H-p^ac} zj!(`1hqbqkts~mfJ)M}Dnb|QjLrgIsqr26C3x3_k!^;_REy7BlMU31>Y(K0xpXFAK2oZ?VA&LLIPZyI8x!Wi#f zG@k5EMZE1_#4a805t+(A?qBqW$3nWE9)&S`J*!BUF*#+uUof5t1W?iD{y8cVnp!7` zI8nEpKv_4R09dz_F4r|0b%-m{{bm!?kUlFsnSfb0o1iv&T5j4nl0RC&fgvk63N1&Z z0_DnTe1nRV=9NY*+p3Ld-Kr8In-WF^?WSmvnZaeU&HkKG=aN~$b%2+}Q7H55kopIq zburMJj(&Y-cr?W>c)e0Z;CLP03 z7&Jv!WEo@E+P}rq9Y564T@>U}SEtY1jkB;6&%FdIe}ykyqkqLS{PcWROp;#ZLQED8;Q5^WE4k_=)`L89W%ofl ze+>0C{|3L+ZRunr3WPct_l({jpsiFGV>#QN&wgO8+QJf6+ate=wyj>I$35_qaI-M9d}8kke59`=kC>|Otrf(8~q%t zh_tLzv<3{G>FXa8iP&ZP(I%n+M+n<~G&&5;rE3=)UD6To3I^z+^9A&DL{mo8&JtPb4|8mlO-T zkidu*5bAO5_QOM%fDUwru6fn=2Pi1!f2Mg#s#_U%1qLzvmyJ3=WGc?X{HtXi2!_x` zFQud-vh;_{J;p9`lQ~UJls;yx{%gahV6H8k{~X+$<;82?wgJ(ba#-Z&2S`Ja*~&$U z_cUwas`u>Jr4LjZivoY%4%^5$rcf+z%c7O4AI_Qe@7Wt|yUm?U?_QgtRm=%%v^FRv$^b`B8Wm;mOi?&)w^#0>}0O z7dwn_FkcoOxVTgX@d*`I*w((y`6TV}h!zT`W*GY*_6c;1fLidQ)$zgxkoPJXSiSkV zA5cxZIZJz!oSKnAX3D(Nq&AYNiyhIdg)6rdPzNNh7$_YQsWbTD#DE{^OC#BwTg(2w z=fVJ`CmydXOe?9_)5Y%;+j31%y8bz#o^06eoLa(4iLqscS1nGD7Xz5mO_RU;7sxA=ake${$M<@~^X6KOM zsbAIS?=&gSh`^c-1=bMeo49^p>qqdenQcCVt(fz z2aAr`Aq{%QaRu3L_Q4=u!y?^C5$&m9xJT^q_ttv_q4STxdu7<#2gGAMQ%XEB3_)a} z`R}nN76YIRVmz{9e{|7g@{{ZFQ{%hoH-RvvZaXlZ($04v-PyLLYhGzNev*#*)CC-y z)=mbHAWsi|%sE0^9_rTxv<6R1E)g@&`NZ+aUj_is9q-~x4SAqUR)#h@#CtU#c$kq! z2|E&BubIVfIwD`M(Gqps`MCD>(4?-BfP)IUz}?LCh+a6Yq4t*eU*m>cSBtNUCYCO6 zBTz}#M1bFu3Inf@Kqg4LKt%FZ1n-R7fYs*rIRqsov-n-E_uDbF9I7{yKT{)$^NDPD)#e zvVaC3wk*O+Q$f1UnfTTro65*GMmTsJg=slY(K$PJ8tHb1q`XA{;w9J#m+f$W{UGlSl<^);#LGWCNr*)2Ek;((%!J9v>*WbYCg(qI>(<0}f#Ei{A1<`& z&iW9SQbDyFufON_yDllGK4Hh68|=ez#h`VW6|Ot83#588K;2%NzfO-c$vEUS$kk&M z7=*jXN;rQ*MdG!DmHc|d$=VYo9PQkiP6XEPmccA@puxs-C}XsX0RpnMe1reJAa*D*sYUXJd??6 z8riOvUw{sMHA6`IbS__#j=y=q_zn&cBqQxDFjj_PhCU8P%~qTX316IVgCn!qG~G~o zq(CC`N9+*xp1FJV!j|0+-Dt*+bw=;r3SPRutzSx&fus&g+TsLl z6Lm&4K=waSyc$5Tb#5^A2?|zAiQtKDQ_NdtvE>0)0Sc|b4&|b#jiXPOPq1Df(ONQw z)iyMr>x={F)My1fSZQ>l&}6XkMV65vr%rEJ`~XC<1W-!*)w}#v-FKULmNQ{-X%@@@ zGI)*oBmt3v2csfd87n=u{pl9&#_jk(2mq>)mPjOhp?nf*GM%(`7G#xD*ZWzY z@7`IrJiK|mt7LTYid9D%50NNQ9v4IJK@kx?6sH3CwH&fvR>Zz@vZ(=0+kWQizgQ%s zYtmNl(Y6NO*JaAxcmR_is*`I zTlE%veKOZV@Im94L9}bhqM7&M1j#GcDO^s}jq)rI#LJLAl`Z^4HpN@x1sP4nbjDrY zM08MAwjjR9y{=zSe|k!09aeF{*s0Lkqqk2VhOMR2ST&4?JuJRh-fEq(fH!EsRJ!SM zYL>#FbvTA^kwh>?F~ty931?BGA6< zZVs5JFM?|@%ON$eOF@*GR~|LjxX|TGaIi}BI^z5i*V6XL`-oytFRvMRadu905InKh z*%1%d8XmGP*Vz%;i^DmbAaJS{^dY`S8>U(CQF-;sQdEwU|;-xxqKDnGu_`bR;%TnrRA_- z%<&}@kOK!Iuc;t5*+cV%d|-tNidHlWR4lgiZ`N?ut}4+-#Ft;GZY{C;O;7%9$Z8+j zq1S?bAB6u3U_EkqT4|$!fxXiHy8xEJ|15xI;cR0JG_w3DX5?h_k04e=!m|Uq1j?YV ze?Z{=z&eWP*Ax}#2L}j*;S@u3e{|wdoAYe~(+0dT(E`1NOSohMQrmcGEqO{c_h0;~ zvVq`><8Md+tsuvW0+FK zmc^LY*_c)v_!Ws2QN{GqhFb|;yIT{PByu5fpJeU@;;Jw}tZ=ubJL9-#ZJOJ8KF2Ij<}!DEmvaMiK`l3*<<@%d^X10 zu;gDEkD)brwwN!ym9DQ2acF>V|?TB z8Z}2cYR%zZaAYT7WZkz59Yb=5L((vHR@=tICa8j^uaDc|3r?=!^_oILgnye`r_Wk*R`Obmfeb0CR@7V~d zs86w|tW2$`;Jy{gQ^~j!$v3&x4PHPbOv}7*_$!+HFx*DBpU;7=;Ie7kMz`Io&)$wE zxJIsZBNgP7W48P3`T<|+Wu$E{vfnB3^m(RcFNrrlV?%3@a(b=hZg5e&FN@rpy>>*1 zvrB*Ui+;%TFBm0x%5pdYjDS7>vYxlgM~ z>Yx+`H?`_m#c%%8L=k{NuEbq(^%wiTtJ+2On8V)9n&Gu|hSZKE0>AvgY)p$HkD`3?XUQ9Tg7X*>8BQ12&;o8$jAO`jMO3~Vk~PbU zKimz7)Qi15Br+nrNZfa$jf%j+lR%N&LWX3KRj^Q5sj<8ZE6sA`3!N?LcJ=HRCexW& zj(ig>^?e!jH|8{f`lGciuX^(-kip-_&DS1|4q}QyQQ^;)DDGl^1!>c5#|~Lm_^WO+ zNqmUlazFv+0^ib$_t)oyvv%6+9xKkh6&|9-HXjRbk)3>SO#Q{SdZN9uTYP6d%zbDhv!$+*0k@8s1`w@vqxZ?PJD8ao&id$2k4bO?@Infn{G0HQziK@Qb5<(#LjlypDcb>x+FQE=f7dc!(Jw_xobQQQ(9qNBIAB>d|@097m0<6Opuw3m9HNXV98no%ZWo& z>pM)u+MN4bDub5aeqEHmHE&TSnk|)0G9jI9qLUA$rU7QRqBaiZ&uSxvK6*DBpc64l z1H!8N+UIvsUM=|7t16L2w1(n~4h~*E$7Nc;ct4NKbS$H6YAd+eNKzBuv2)ZiK$t#F zdk)DI%(scE*l0-(4ygk5z>l*;wuVBYulbs^7?p8s8kIFZ^)6)I z)|!<7R&YN;|I{-L=S^I>&kL5uoXVd(_u?l-7POe{%V_JIofz}@asv-Ae~5&wR~)eD zw9lM67xbGl=HvL>kMOSc#o2(_Km@|bB4g_?28&XxxYI){nH|}?zRTT#OX09q9063l zZ~p0tyXx&3X{oh!O(&XVM8p^{I@{^AxA?CgEMDFT`z7D zhP0LQJm&?-%@FW9n#1u{S))~lD9HdtZ_F*V;e(2Auz9*n28EX+ybTh(z^F?t8G+5! z2%EvI+DXq+opIxtQFF*H3u*D`B8H*H2N=#DDkp<%N@t9T9ETmaxUDOGW?7qc-W48N zDqr7AR)3QpYwMf6Oox0qJC2ir4lvy;*(!f#_p{!AWLiSoZR34q3wZjO`OYKa)iv3b zg#zyUKtc*Esdq)&9prt550G43;o6CPRJ;$~*xFc+*v48=_`Jkxfgl}&_v`%r^>HAM^?~MHQJ);>UF{Zw@jWdFnB6Zfdq-xFvpUXB z!lt&}#!Q~j%fBVQD75svf_C)4Ha8*M5QIE2?K)0dzSf*?48o+rvAFAp*qM5=U7|m= z+N7dDTa%hHD==ts{J8*zNX%S+@m5}I!K&KM46%-d>k4gY>J%9h0<@9QIrQeLN^55_x92-^Ct3ib*7qext-!KDhq8FvLCp&ZmBHQNVu7ll9Y+Y(;mRD|8>8CZUNsV=xgqUE~}L;aYmv=u6u4{&GHs#kGvgkiZwI4&i7tLa4h_V$U`5DKf27mF4do9`DY54bny;yq!my!7f5`c%- znx&s~z>D9jhS!_iz>21GdG1-+Cn|aB)8(<*?;N&05)^!PB}ZIU4RUq`nE)?=vCm37 zVZs+dl1~7}c(a1O!yXVe$kJADAGO-&hWIKS@#{Od5b?~UQ0O(2$5Y6}TRW9v3}e?$ z(k=t=r;vbGy*$Z9H$>nue=xGpR++%yQt79`J8o4*hWQxZU8Zn)!Vt&QqH9Q3;X^IW zin^Z|==#^{hyPu9#0`ps$yyRv^9}DwQqRYKf-u;Roj6vX#bpwh|JtR(fPG&6zjmqr zUEjt3+s?+$PSwH48roKS6WP`%MtQ|Lc|zbOr>_9C49`P0UI!mD<~bLH9gx^zV>^qWInW?bzl`W14$ zOj+2?u)hNlo|C^}M=4Z0R6O@ddT6x+%b{^VkF-0LJ&{>;srF^vl1sG>ol{#Hr;1u> zc@Nrv$sjgxudxY0C|A4PX`lJ%AyGX&|9kTY%z`7A0Uk6hYoB5Y;ZQ7}uk{7YUZaBdAg7zpVG?1oZLb>>?F`QtV@D=fWdc4^S?&cNv?)wBZ*j}mswYAo^Ph`OUq<}0x3zq-)pEm#Vt+g`1 z#Oa5)i_uSKBPUyje{QYgZNu@^KC6|vQpYJ)T0$*tjNeqws;trCGylfc#Zi*%Dzeiy zP?DXer;lvxGmeb2I;tEuD~B-9NE*C;d!rz8O{?;C@n?EDRLIfUlEM?~B=S!V=d?;x$cNLPbQLA4wF|jNBlNg6s>$En0ZfJN1ht_h`2?M z*~2sZK(g4K-sLrY%^B2L2Mf4wTe*jZ4C|4ymCNleGCVukT-hH!skDE!*41Gfob33E zH?S0`?YbY ze+Ak47v5ot=A&|I0?6?JGHb_Y;1L|Ri+->0x%)3)lW!X>qWKOB%TjL(*(rBBCrR`*qx?aJ3K zGBd6z6S`;JN`4lmx$yX%d=AUDuvqH2v)qN=@}Pv~{(G&25I)eqCO-g_gk9q6X--Z1 zvc&^RWL|(Lku6=Pm?&2qp;X%mP6@l)&czfP* zCRS!5QC8_k(c~F=SVCAW!HNSs)B zp$miemTul!kRCex#Zf!OZ(tfQQK6EUFkS4mF;0^cm-_7*&~`?LHTO}iC0)J+hF%(D zSWx8tpT5~_^i~h{pX%oQw{Y$MA9b_-V?ED^+p=9##TXJAk~*hqvDVOh1jhj+Fm$Ih zW2R6=ORp_M(7d4#9<10`p=p%rtsqT*gmpoLLeHE3r3tu<#9yT{QhVR_^uBD(zP*3U z=>B-VWikw(vQ{l!qM4hnE)p#tM6(H2xbxWRb#x
fa!VymLjRKk}zRU$5TN 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%0DUMS)zm!h#*OMuGu!C8EUgO&Sfj!DL)bU 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

jM0aQwfj2!|PHR!BULw z#;vPLiH2L-&xsK}uItX0w(<^B6ThApe+v~0q4IhOBN+~3BV+$uMP3^Sp;IwwE1`Rc z;zS?4VQQw3;czR_2kw~(Zyu-2cItbB^3H*1l%4Sps=Kz)PE+%LV;>H_xZ@{&<~^d{#{cqHTU@c1D_5$3My zIj_(dm)?~6MV(EV!YGMXO`zyvP|*+HE!(c6^kZJbV!>8`A9`Jb$2V(U*XPfW8ztA& zYTqwEAnagg4La}-?AGZ{vU9W5excVNnEl~Z*uLeZ2?}a17+fF$H)j%_c)D}Tui*YL zUFQ~~DniFOqj<6~bOPuTOan8cU!;ogx*HX~u9wQdaK^XTzUOZtFPMYSbB7h0)y=;Y ze|*10U}iTj`+D6&X%@_67)c!JzuUK4JOS$%7e5zWmg+(_?a19+&NZ>FQxWh%E8+1nCh*Xsecu1WLU7DErQlJ z=|s{N)`T6Gz+xNcd{X;MG|Gz2wuMuR@zYJX{z)@1fkU`Lq z?jGvNpesw&bkJ)TD9@;W${{7of9NLAXvw)9pMzFj6kPODWGiJ^Sv=PuK4)O_@Li9Z$Md}J?>*<9bMC$8y>m}^O$Ybh@t0t)VP^iXn#nIm2iii9|C;^k z(6#?X+KwitIoFr)-JHqV0b3Y}T zlTvVZzJ7HlXM&vZS*=LV;*zj&iz}a-yhl zbM$hy&L0NoJ?tye%)3X!Muw)d`!lJwzp<6xeAVufme6*suCgz1e&)t@wLJ0DUqefI zo{z@!HB<}bGBjyL<@O(b5-`)B=pE-VQNVws$2o+}o}C%7c}q z-JULK@11?W#pqsX8Fg2xv0>tP$_Af_SCwWyio6{`)^0P^`+m}^?z1!E=Zg?3<-9vJ zJUbdC(!NUyrnxFL{W##8cbjJqQ179*qMfg_?6|fNQCGAuCN`Ig!*1FkONK!+yCwB_p+LUF zuinxr4apG`@s0wEJR!QFGug>cLa6$yzc5hQzczS#*iG!J^6@)He4ohq7;;I|sc#)} z=cDAl%T9WOwquV+r~FZ_!srp9q2f2^3tagrSlPw@Y1>oHu%QhewC!b2p0?miv2`Yb zm3!Ry$}q(bVeOYKtG@1emh7ANuEkQ3j3b!uM=_TQ<7Lz}@`6``u1a_0rjDD^JQI<# z*>c$!_EtBP`SRo}>7HFrYT4S!#Ky@jDw987DLAiofu&W7oHXw4Gt!dx!NX4ZthPn5 z6bU&Mw7dDtziGIX-{%kRVe%`3d$ah(QS7!kw)Yilzvkz6wQ!2iiIVM)DF^S6@Ar$7 z3h-nOAF#o^uRD#Aon#MI z&TKUb*m|b8XXKXnx9ky&N0OJ4L}eJWD!e~#wyRvTn{G(iDPB0Efmhi>*XwpjldEFD z=k)1_y|gdSn)vH@j*YqdA+DRJ?vpKNapey&+}Q1O_@+hi?oVBl`(}zhdgpd1hI1bj zu4Ra+U&n;p@WWxfr_sOOwMyp42GqulG~!Yh4+pi~j^26{?5DW3?AHs4{8ISuK!vYn zLvqlxD`Q`F+0(QX8K1s=-o~b3)c&HEDc5y6ck3UtLFRe0aj;~<*_w+gc<7AHSyWjR zjRZ4|qa>Qmn_Du`2AAVD^N?`9t82Iz`(w6K@MmGH75CvXmoAQ4$6C9ZBLj}L&KO_!`_Z>;ZPNy_V-ggJblB{Fv7OC+k8vys3m>v*jbK9yKzT)1Js!87K5IuT}8#G zkGk9(c<_sqp0~0u%~|xN$ooo>b1sUrKXZHn-*Y|QrJb{`5DVY zqB|6F#+|HWbU$s3L_YtN-C=eloKl$osGH)!Yvx69r_=3}OM_W`jq5RIzW->c@+lMW z%lNmPqJv$n>3Z;u5;u*pI)3s|@^6B$Zka(0PbuaQzpsLvlrKhn->Fv8$2%YP`qG?; zcdJ14o3ZRX9ztG2qAD-{bWi#^Hoxn+C;g|Gb23AwWH@O>z=YPROiGP5$iZ#A74fu`*}D5@S{UjG*_*$mXYLQv-)i3{ z^r+N?n{RyG)I`6K0HSiD-bhy9fLpXgvhRNDhkas4b$2LRoV8OLrwjSl;kCiti0Qit zvNa~znF)d3hl~?i0>E$VuC|G^!(l)vCU(-{QYr@I{?n%YE%vL!~b1dMb<-88KCD zG>vWv@dJrp9`$NHvM_UdbmgA|B3a4Wf(K$Z7vzW*?AJE;1$DEi-IChUlAa5*@9;}J{DU2psJWOu`ZY3ZzYHyv_QK6v8(5xb7T6g|%xQ=mjd`xhHSPE)5 zC~jat>3P7jiif0U>kbq&J~&7B`03M_;EI+S6-9Uby6Sz;b6l>zfG5O7q5EUq&Rq+5 zdmzrlU9nj}r$&4|f4*AQaHoIKhZEqV)RCC^$% z>9HPuZBg3tBU#0Olvb|=mDp$7PQRZ{b!a*w$JuO_>+uEy-x@Blvek_?% zymmbPbn?rXf~bL%qZ74>*IaWfLLS7p)`(;1f_wBo(NJcqYu;xY=bj!&e!89Dmvgqedj`^1c!)9u#K2JXiJTc|7r%p;lCHlB2`e|F} zhaIjX?*arV{KmEB1cjces&W+Y1S@p zbPCnWURE!6I{F!FYyD0+vFCIji_>-=;H`TWclquBUFh(kW;IXYQ`NH8ELWV1GJ4)y zuRl?lTtiV*AS&N8KxXTYjS5Viu^1mY`m9zjB&IqEK}vx1&+zCcm~&cv^kC$vKl&O%;PGG4WI*YyCh*(JTCelj5c2 z1zL|#%WpQcM#9ePJ@TqmqWGHQI;({bdr4KA#GeYvY<|u8Dy#cfn({9it64v*>Df*b zR}v51mT}iNCZ-H`4LBv}r7orKDPI>$<~~#J*cWOkW-Tf7Z&G$%q{ijkjeD#;9tTUO zZTg&ZqziK|CGE^FF^f`_y`t5@;^S1}zE7-jrF)$c0ik>dq6fhJaW?hOI zEK`oZhq%o1j0dAO#4f!h_fUCqX}K!L(L63bRnJ#C1MHFB{?z{KIGAZv+K?oyrF916DqlGpo{6rrrfClmsWqCs;S|y9D%y`SzG8)8#j@*y?QNu z2flUJ)m9a8w}-V2!Z_LjB27l04B?xyy>bo+XJ;F1q3T+GmRnM9X#wdT|+!YZO z`f{+_W+SGd$7Uau6YA^{@m5Tm_1GQNE!0sjI*g%A`7ZgJVW%vp_0;806t{{E0ApZWHv*LU5| z$@FRE$cy2Mr$QOeYOd|Y9uc?D$YEf@IoGIR&#)USVal?ak~|73a=f#Ze_z^LX%Y+$oP}Y3 z=WmF;=-CxOUc6LUQbj>dRzvfkvfOg;c{B`$g?ocL7=u&qm%9QSy!@wOuSouL#r!$> z%Uww~f8iXfX~~rfC+shG3ns`d$iaJ4?BmYE7jE(Akp8(l0VR=v9~f+}XxVeE$$IdK z30%jza3|~s>Hl*l_22o0O&HgJTsA=>g!;nAfEVH-?r+yG1z4h#vqJ7BSm zfdnft&%cDGVUIRqn*-x03`e|SIfMSMK(yekFc@|fwb&5g+tRB9;zzkv`fSSv-Fg?~ zogn@OE2Uoz3O|L<$ERsMAYe8w?XNDdrJ5*#G#u^h5ms8}MD&*>pDhzFI5uSLul`a4 zC*-Vx_W%0pBm7Io5#T(V|LU(%j#UHkYx0U^>%)3% z(IMg}R@QKYSw2@r`KKzxA886>i1rT~8CSKj?oZ-7EIfUG); ziUpsPz_XF#02}#fs}8&`2*`L6B42>wN@()t zre^90J54jRl@Zd=+;ZNE=U=NW)oZ+_hj#|>n;l?kArImHtNLGX@#~iMhGs+@h@~ow zOD)+`bL~|8Og6KR-eW*g7cDjDfH< zAQDSM1a`Qx1|Z?#rblNu;t2?SlVCO_2>~j)uL+1>z8sA-wi$pa1Dz@b!8ru41cx;t zHtatOFZuEF{4eG){{X(J2)qPa@qDrMhOCOGh;YPD(rB0w*|`}8I}H|wf{PgNNj_?& zB>aS#vtyU4!ToLk-9f#*Bx$9D-(v@U&QDGOVNWB?|ET@gaZclC_u1<{l3{uzYh6q@e*?_rr>LC=}SgY)n8hF6yW<4?x0BZShMcz-{r(2JpmzPeWs5{n$!*TJwfN$gd+>c~txWY$u3WP*~c; z>R|+y*cmF3n@d2x#e;pRkEKnn8iu1p0zSqC@v#n&TP0@v#wHs7N`~A##75x^`b8W} z3uG2VVg5qSEKMl0+_E+GEWL^P%e!+>Y z6foEQgtSf7m-vVm@Ra`Ine15;kAQa3cZ@v?0FM(`mlTd+!(gPWYvK{ewk6qzptAuh z1LPX}`i+JVXVn%?Y1=2}F`Y!LtT5v*y zdhgLi-f|_-dxO9tq3V!uFW=Vj4O?yi`6T|b&0kV$!3pEXg*BC> zb^=`GU%2m}i0A616Ty!wYaZct1h@}>*`~b0T5zKHad*2?GR=h?EQZNoKK=z^97yM3H2yjn59oh;j6%wSn zEG`0L`C3N4$@WrK17jJ3@@0Q&e@}s z;h$j2CU0*4y9PIY>4e6c=&?z;O7II!o>JaiHB$izUVQ&P!Gv&DF6?Kj+Bnebz+Za3 zd26*~{4&<--w<>G!7d260d$BT0)=IX2;^$O7!6Gk&~*cTmenW0%}rpyU;$Ye1xO#( z-y@3kXGy$}2U(1G%Z-lvFBPVA16(-hMo9>ESLmv+%LkQVrDM!tpzlgR-$A8Bh7pOg zvbIMo2q_6SL;;hTACC!*T4G$P@LYi9$0l-@G2T17Nj8hL*g9O_Z%#m~XmE~-R?c+P=S|A`;K`fbJwa2f9 zs*VOn)-F4z!>#EJozv|~SPk)apj%Ex++xzuLE}XVaYSeVX+oBYTe=p!xyNaRX{+Jj zw-elIs?fAc&Lg5I_=@5#-Q$5Jdx4#vL^vJcGObHdxOE0k;^+(pW6UKEwR{;i zLcN7s3JzPvaIqbK{GV{~)HGZwJ8l6ZsL#`a`2aC$US4+m7KB?qL}F2F@Tmv9rXzy7 z_^K37sidVc;vSVP4WYG^uZ6Zypkyf!_grPLzYM48HLMLt=sfPFPk?)fAar1k0y|e% zuV4bNWN^=*>F!$gLbD@7jdw~lhg1Xdbbpadn^=m4-a+EN`d(O z0r!{_==hM{M;u|X=&|%NZ?ACAW{|)!OOR<8A&P_dJO)DX4fhMy&RbIy%<@7|d?bKlHlWJY8} z?%bLACDt$2Ua2Gt3Wf#*1qB5JZZaYV^uJ8dKwv=f;%dV5(h3rcejP|$1|FN^Yu!6LNxT+e1yu_pY^pu<|J;MULEIrNa^jxzF(=zM+i3@{_ zJe{=sf_rs~N`u<`J)?}=thBn*EF;Z0qYNEz_0sXl;R(n;kAK^P!Y%N(cmBW2|2#g} ze>r*5zgtZm?HP?7%v>C;%@|$1UER#>-K`m2t&CmF%@|b}Ozn(aUHubPgN%ic*MXQE#vuUkIZH`QWv#=wzH=doxrhPh<> z(nT?SIGrY<(aFw(`K-B9*|bu;D_i4|%!fS4xwI))*J}Gd@jxVK4u%Li__e}deA!f- zv=X^q4w=rbRWv5(B--N_wql8b4;ngxc%Dnh4^|ss8G+R#@eLf8rSHF8R?Pa3yW|n% zLAdg_26({#u1cc+4^?t8H#K)~b7hoP^e}hvur~Kpa&h$XCR25DHzE7y>c6U3re&*$ zw}u@sd;6<4vvr_hUzUl2qb;*H1?%t)MQV`T4xWSKN>+N&YdxRNbO4)sk%b^4-=`p#KiKE6dT5+(8`x8<()obT?L zcj4n~)ZW)!?*~vsW3?$q0)pOpxQAYxF+&0z!^G4HM=3L-B{{z4W&^C|$qc)9C&8F! zBa!9Ym6z~XEKeWhkDq!Rns{?)QnOedBkr{_16AlTb2=U)ZgVg#19C(CoL|#xmn| zW=dPlXWb1tX_+`wJv3nAzid2h3p$%D&~0QRY&Br&wK?n)rS*F3yV~g=6Li>#ND(Tl zrnjD*N8)t&HG>P5_g{#7tIIW8_?P@QsB%#)>aKNa3Wm_7>pQHsIbfzD^y#O4>&-RI zoyIb3!4=8~7#6&r_hZ!O6jCrMeg-l!eaaUn)n(E|SVFmlE6-p%Z0MaX?K~DJ_p#g7 z(j2qboUF6s*9u3P&UK#FlG3NPccRy%(oB+hYUc62w49{FWx_#6 zk=Q5f9Q#;_Vm6_L&x?Y$jMRSMf4Xo6_a^vT&(Q4UFm~I{& zhLu+?uag-$&dFE~(Mhw@VY{i#I+NFEsY@=ktY6${l+D0X6(6zPrjmUs>#kAxLBq`+ zKgVlZyPHP-cx{v6X>geo^AQ0_8cbFo_XAZQB#~8OH!<09czn(D_zUa(6bm{{S^C%T z6f~YhAc(r#V~``iJT%>a%zpXyHAaLR9c2RuFEC{7qw3zJRx=WAB;fE+zWI7(z;7lA zvAgo3N4Zp20Xw!OS;>0B{dU=RdmzcOw;w`Mfg@3Tu7T^q!9j9h;HK+HrvUq@B*k?~ zZC95!d3n*`L_XA16E~jWv@=4Vm5e`I%{f=TjTs%1+AV+mE`vNwixfKe%h1DV11?Q- z!g_w;GX;u7c7k@U%6#m8e(qHRGK(h=nOeGU_2oWOjFX-}Pkw>m086nyUW(@tquB9* zA;f=@b@B?a=s>-1KOpR@=c>y02nYe#W_7HRuScaeU^=7=QfIMW>xFw^ zl^@bz27H5g^rtgAJ^EmV*fDUXG|`}B8})bUXL0q}cW~kNxx}B^rCmD8XgQ9qgq>HU z)Dn^9F4AI<0w|=Dh0&|XmH;s^Le*b|N_mA%HvN>n~W~&-6I~%ZI>{v9q+LJyFX0u)+q3uPL^0nPypxgN8Jvj~8~XFZIsRK8yPA zAJ2u;&xU?4;I3bs{C!6C-|sJ-1q0fGYis_!$09z0T?zaw2MPHn3uB?{bZ?N?pw}rR zB1IAllse8~zJy0v=#5EaF2Q6jT#}vRR-w7zfpX9SP5eO%LDz(DW)(RTx9i&2kXh2G zTOllH_|yK32vKAR(GE|pe8fH?b`>CPkQ~iB{h(W>UYm+9?E+h*2e%J2Zt?gn&J?^R zyiEam;RuZkKH1)ctb%d=#e`!c%B3SfE_jh6jYwCdz*nSR5OdX5iQ!s`Qy7~o%N8LJ zG&nb^dV3&_c&P4P#o!N!Swuas+~ACu5t&yzaqgP+!R!?c6th+?E<&W6P@Y`URU!SZ zHnk-Jvz!!S5tXiD`IMI+5W`3cF{xbS5zY}u9azfaOEI_6K<{CRdb1SVslI%5Tv0R# zqYE_L^JK>qC>(S#;g4InA=bEJpZLiQPp(+1 zQI6_udPTdg&PjRq*nPfZ$VE7UgY}8*&w1X;i9ijgw!^n?;D3lVT3qp@7$gwTIMTlp z?SFvJzeAgUBijEV*P6OcxSH6163A@rtyOtF@WwnG=*yGM#~frUw>qR#yExP@*XvKP zP-KR5HpgwJx@T=p)~&5|7_4*4InUG4a@vHb;P;;f%9udIvq3CUUV1Y;t5{X5rwYQ4-`b zpT^$N9-4KdxI?FG5|jmLY2-Nxx)_DB&uD)EX){`wkE9ub+q^Map|kAW0TgvbcS zk$IQUaVk94jMp7F+rlr6ie$x5p)HJrwyvV!q_`_1PpRqqswrSB?bzvEb zO`Tpa>2W%{XC*(EO^o|$osH^uzlen-rbapuHSA+~or?obRW1XGr1`>8Y zT=epju&D;V`Vb~qb-Z4%zL9BdZ__%|-75QaUh)GNj|sHkO4LF5w4Gyknb-%i#jNts z%r;TO)uckM8g69mqP1?u$t3Uj3%DTX2vC1Y0`5genu{xyy;p>gD0r&WRZg?Eh097~ zZE{g2sWoe+OP%(dGrM21*SFtfUb>D8PM;Xx#qk7>(ZskF)vHA2bRfjSCGS!rWL#fC zO&n2h?)ZlK@imRJ2Rc`GOrHKp9*@EiGJfJ=Bgn^hrIyj0y3Uq{T0f*E8(;kqUBNt{ z6t7@V7=G@&1J!U9fX-KQ#Lf5f2)w8Ah&*rUo*mzCj20w!^`R-@(Mx^IcD?4vo!bv| zZy7+ZHxICn?hC#<_d>;V_tRYTN8DRu4l~YxC{&dJ>}WC5gI#K@I*;Zjx-I89^SN>} zXi35)TC-iG&SUG6o@fXnHxaPo&E?*PRPzfE<2S-A+m^eio)ohf1U!jsHxuPM(a+K4 z*Egn6xU6QsFh|1u>2{VUl}8zyMN_lV>RJ57AbV&<=Czytlj%yDu88VG;^Va@((sBD6*l5m+X}k`#%ddh@XrWYzrt@?c=d8JGlY&= zxe0w<6Z9C(?m6orR8A|(8Xt&|+9-?It zLc23TFnQ_rK`1&em$I9rv{tZ={ISm0QJXQp3%u&9G4*dL(m?BLE7LnW_|61-KIdDn zf44QxEdMA0Cltm#NSq9SCAJ%UUT=&Wi)#P4=K>%Q?n?VrAl{Me-V8Ys1(YE6N575v zy)hgTz8-L*-T@BUk@{C6?SI^B`l+taszCEh0fr62dZi7XNC-v^M`x8cZ`3WBN;?3C zmJ!0D-%KkjbdwQk7uLdArm0;sOpQ7%F5A<*d)00ZbmJpH0t1~GGaazdHvB*6pu!kU zQzN=NnW93)O?kLwML_{0Cr4o`lkR<{U@>Dz57ZtvMj&{?X-0m^84)_%juzO22wbc+4CruLIp&y8OgTGn*K7#r~}eYzZld5@BjqYzMv zcXstUB4lojss^r_lj^s;sj<*~QiiBbHg{ZXD_L@d5xT}-flyya}&~dvv zKPzqMq&HByupDo;H?Vwgbr~5V=Nz*!jBp~b&YR`hxqSi)s-B3J&XCLJP`3kPssMOP z2Y+Yv@`0;kztG)&vG4D=;AaBS%Qd*_J*JR=F{?Mwqk}}LLq)71Lno-f5#vwz!qJZo z%%sGE6 zMbRsI+A(_@l~tS)B5D~BJkucp@}gMVuq0RVar$kUm^jz&3A7$b53511)oipA0uKSs7?TS( zszuJaNW2F|9HOCyqGk~?JqSXJM` z8vYaGs5I=xyHquD_UHylwHRE7;v0%BT3;3o-~uO7!JBfD3F(`*uf92>J4MUSnp6mu zUWGAC`m^GV(I5q5ij^d_+Zd>oP{O3Ef$!(`{=E?s2>?zv%V41`J&O^O*d9}FjZAPb zcu5P*LbXt%Tq%etHwywPHw*L%UKM;2b=GY1Z=o5u>C9g^{pbru{bLbn(>_3r4 z;4x@Z!*GPuX?_3nt$GI4&$Iu!F+!mK4(|Tjj*RL*4J~!+|7%C4PD|eoPZRym?QN~4 zXK&k4KN;>=DY^93w|m}l>sp=Y_2@*%(XcjUa0@y9UBZpDhh@e_BYtLK$S^31is5e{ zbzveeC>kvCGWpyPsN#7@G9*D2SVi$qDSEzOpsEpazt>x@-appjs@m%;4JTby@6Q^-@vl7aQt}Aa;0u+&F=8r~TtzMNl zh(|{}4CC37B+EWhk;IToJS;p-JaWMNft%C31ZCyUL$h58>GE77Vm8A~&E>pgO74Z` zy1Na(658s}Hs@fhN)$36E=TFN^0MX>b8pj_^N-|)I#QWkEaBHuOaoOOPislKTQ~*j zkz_a8E)q`TOcsvq&eN{+3{bfE3Y;IJSH5Co#pkBybfXXR4stfaY%S!rN>Htz597)- zZc;H`sg-}<{O%Z(Xgsd@_0slIC+twj-kWxleH)j|Ovn_Ay+-4OpvmSuB5pb$bqwdr zk^G`JRZtd?hEr~hd4{LBzm3D(T(6wf%rY`;&3Xi1_U0+D@~2)&=4iNaaWMHk8@uV? z7&cl>Ox|1ax$&8)~Fy`Dyv1dj(i^VG2Ncjq=6GdwjP>YD#s<>$8pF7gVw2u&#ZP! z8Q}3j+-ubRVJx2yzLiy)0`CKCPIT92d0InDHWzzr7Uy;`iq+AwQ@e*`iGyWFh*L7k z+idp{??bAdNisvk-qfZ)Nf{@WIbv^L0Y;Rq&V-fV0W-@sk+uT zYgI>f)3C|5cI16b+gon3(!tDJ$!fmiu`_gKSZ3I+p{43rJJ##a9oHSr}lNXcE}&b-kdcXW;G>E6oFuv82zGFVvjlt;F-W|{f4 z$wtXUXLKFndA*D|gMYq*9YY`a6Pz@oI?rAgvyHw7<=uD@1Sia%A@z(Z1JT>rBAb1X zTfMQ6c%gK2ZyGF0(B6WjJqhcWxBfD?ezd1p#)5L^i``#o>ZDnU?P`RIhx*pU2 zbLbH0+#tNw@pOeQ8+uaaSrV_KhqEpm$~;ToAEd-Wmn+4${X<_;{cOrAE|U5pAK-M) zGpLEA972G2r(s`XliR9-N#m}rD6&>BL`%(abxlS_PmmxP!ifZZpvUKezwpDZra$7; z5-C>F;Ri(!VG##*ZwO6t++?OZfGL;ON=oA={Lu>M(L#-zK+G5b4L=aZP~BfCxWFPS zh!*Ub-o`JtP;t+gDD(Zc`}hin2f&Z_tGNSn&KPUW8EwuKhH+nb+lbu{8QhOh_6@i% zD!1hurQnw$)_9>yWad5mq~eje`1zS~D5KMyhZ~imjbF4_#!%1nP8S+rDo!a;Cd3?~ zOR{X7#fREjhDV6Hv{V4kY`@ek%C&3I8SyuA`Hkb^RRG1x(uqH0r8mYwd!ykPQ6O;u zKEiGac6o`iWUo?SnI}{Oawu)n&)$(N$Fd=T&JZ0NqbLhDpFqOGkBM{{%pQrv(u$$! zG*mx|F132M);D7WclQtBTZ_2&W%nv92U(k%&<>ABoVsxAL<5~m^3z?H&);e+fAV<0 zLvZ>_3HuM7KiRRr;GYeNZ#5@Q96JxuT>v!vANetoktQx3(_c&ose%OVWaxn|{Q)C} zN{wxx!Mbe4$)PgWjqVMCPl7`T--bs0qxpe~@q$P%gwP*~V2_rU{R-=jNH2yRhwdU? zp$*@^5gHPE0@q2go{hh=ew;vnhVd~JdD5(-0NSc&83yH4}LQ=5J&EfxaR;u)HT~=G#I223OTb(nJCz4~C3E zyc|Q*GT)3K?5`XzfGpZyd9YABYCLIL+(yzgHkr&ns(bb$=Guz8DUz0C>c_5$7pIs8 zdgvs#IvBwQ+Jh@pAG2%~H?*`eGyHU%Ax+%uJXVlsr6BByu@x{v^I(I{L z2SntU9b$&9TIZuTpEqQR<2j z{g`@VjhO&-%xsYDqRmXG(mc-8lOFDaGx;1vX~!R8?^`kCe>BK^pWC%eImwn`O#B)X zde8)}Q`bZ;&7KR=u*vUK>U0~|dS7{Px;!1H>!dvObbC>%Fw*7q+ezvLuxSzxiPH^{ zyZA(oNac=_S)9Lme2Bb~qrgZGfiA@ebB2XcJfR@LfMbDCIHe9#u!{1E{bb;%7ZIwY z6f<1yPzVP)x*8~?7ld!C8v7-Yag963taFO16)kjWMUE*Nn0Hp?tNo^u+H+tgL9&z# zsVN&HzZi5f4Rs0UkNai75`EDSA5jcyV?Htefx7R_WbnR!M+y~?{~hc6w~eg-Gwb|| zck?y%{~B57f9lC>&8_iyJufl~um!8+u#qcKk$F7Z#Fln z!Gbi=_nPNA$Nie;8*saFcl-H?350Mk1~VJc2%8gJT)K}4QdgKb&T?PMMHwO1MJr`UoSQC^`dVsL7RBGd;R_qQ z5dH6CaTphr!zRB&Fl`$iVt`bM-Ch?v1#&={SOGzqa&*xM9Xy)sx>=ktZhLA+a4>&K{Zxx$a9TxIf5~uYkmKxrY4DUszc<-Z>g6DJj3+$_<@XvBv2?pM!Z6oi^YhiONNfVL^hc0u#-IElqq)zmbQQC1W31yYg2p9=iCfX-iHh z*|(Csvay^_;UZ4YrABiUtt?jC;_QkW^qijFi<7CQt=kIZ*L@^7^F>IqT`(1}9f)2h zh*-6d>-Gyw6{eI9mKu}U*)hl=;8<(6{BK^13ah_Xr@4deSJ+$@nB;;_V@BLX%}|(2 zvmYs2!PnHm3sIr0!&A6aX;uyN?blhB+AJ`#FhKAdOEYctnpu7Ne!@_12#kOgu3m3M z_HxW@ZVu)pQ^t6E7~S(KcdNcnRK+A z2r*}x-e^C<=4@-hF|T5CvVv&OEP&-ydkx6j`xDRM)J>eUYEwvX)im$MfsdK+dI=Ah zgKJ9h2QZf~jyF+Lz3~Ck)JsE%Ma$Jx&9S=8{aHUa2-_wz#0?31=ax~qgeGpA%wBWM zJf)ku={EGKs}5nklt(ZDD$<|d+gkg8j}{L@?+?+pl$cCs^$~XNo{%dVgAsUeLuG(^ z4+T^o>Sp+fa)ZZS7 zJEp8>GW4|9y^e}ww~L!8pK|1PJEwOWKXA55@ml$W5j)9V-9Q>k`3870Q`%O0tm;q0 zr#3p?;eU};x|}@vRCx@so^a@$FGf*Ub$tc)je_g&wNHpmMY>J4ci*;oJdS z4>uA!;Ccly*6RCBQTq+I9v-dBdKLPu5C!3TA$_a?BBRFmym$c}katA87X#fcRW=X*{T~h>VdGGvY6f z>ENG79DjDBx=|zgY~QEvAT^btl$3tI!YyK?IB-Dt*lq@Zbo$BnUFZoAolF7;rrgQ@ z`CeLqBQ_3qZ5gKZ(K{k)xmb8YIzZK@XQzdN+`Ub69p38%d6u{Pz`o?!8^IvlmGpPK z$0#iC74BRv=`bC~x7}gZ%TNYsN4kF%(<{btgqBFRqSC>Imn2no2Z!%<*QZ_IRCxu) z>BgEL&EVm-?+#bWEIiKvulHgifUhT_0k58K_q_n1v-tvKY-K=rIiOmeAoO)ZuG+v( zmUTul+DHdv;$?cW3+nbw$@2kiv-MW{_}6~E{EmMv6KVWbna2uE1J1Cf z$s=A-9v@jAPsuH&-6N@F^fzd;NH_K=Aos-!`j5JOxr zW0;8{22~5=sDn)5z?*r7(;g#J9Dy;0&ybD707KJBU2lXPKx2T+=`s z{;3TRFn~wVm2pZ!!vSGIJ&u;E?16a}hYA~8{&LmVMfqa~pGB_y()>~8R3 zd+TGah8?59-&H*1m3@&ORhz9MQv^5K*rCAOIBQVeIYftAaG~L9uH?LqoZhq!ASLhUHzs$D1Spe>oYQOtu{$DMutyxWzo*XHy^|p~^$>6@ zBq7c9t-xsk2g{|ooujyXEoH~oWgBitgg4QiYpIx+K6G`A-|XCp5YeI!ys85hQ}QzM zCC6`{A|X`k+16avg$UM_@g04C0>94MUyU6V0BE#hZ&#XiG)fI*w%WI<%gRUt_*JW= zm*czW#|*WMM6Z8@ZihxenxGLelIYLriMAS86QvR&T?|4b8)$qr8!!wnYQO&Jl&v?^ zC0GA-%I^Qh%>HM>3*^5fymbDXMyb7{nYkUKh_R`yrHiAxgPEGKtF4@)v6;CGnWBTV znVq?)m9c}RxtW~x--MWhxy!$vn6dG$hz= zV^0^)hW6a+-R!qDx=-LgRD&ks#ObO%oY_6z?*Rygdq4$D3`}%RvRJ!>+2X zWuq@SdcJ&&((5+&a8;e@Avzg=q>;2U(>PRkw4M* zZ;<8nNgJpca7Sc8tQ?Wup&L<}poTQ^CxKE_XY5wxdZCdsO66%{m0x6sc1YmBzv8-A zHsZsq!!W{gDiTucCA7&eQR&0IhcgP=i)uVSGL$PwQe^qS2nq*b@*$e2U>Gv&JCud5 z>_}92nMgSXaq2Uf#qA(TDboDS3W;!NEc6XbKs%xWKwTt&FM=$9O15V?WxahS<199I z=I$pv_IJckdT6~>L6**e-7{Aq6Wz8|wctcc8eSrHsFT~FTt!1h^oQw$41Ce5{;2~i z3Z-M|j_js_W@-fTR0iYDc;Y4od|B^I{gJjWKfHQfIjU@z2OUZ}{aCD-06@yyvBq|k zrzY|*aMry3C^gF(`2yb_!>hm4mbzyTN~a+V!h z?WQ36sWz)}-Hu0@mLOBy{ElMj1?onJQWD_Yn+Z_01b$^?FX7jh=DZmm<}gg%>~X0w zoB-Ks>tLs;NrUT|uB-NrWX^fr%vZE?x(E&I7-ik0RNvM1v;X-2!%| zTx`KW)Lx^mzBK#1t)xnd&iXdFn{sg62l7n3bEH`ooUe< z=1{-xF0k$LyauW92}gU+3kB=n{+@j%vQljU|2 z#O@^X)^1vpa0Zt*iVcr0tG_1eE!H{n(6yswqXyk)5L{Q{<~Q^!pG)>IFWB)=m#2W! ziC~YzDOc}}V|t0{&myLy^=1MsDD8-fgPLWiZ$NAC-99+z-bk!Sui5^Gm-ZMU+$WOY zA|NK1@Q9Kpz-C|lbNbgD0LT43oC+Wd+CTUc{u83#eD=h(AR>HCGcam6iQd-px~X`& zbbfv{qUGof{O8dORZrLh3wfLpg7v_<%j=ts93ve%`*M%741l~2cXzl&syN+U+o0x( zLXE$^X3n1Z^M=CR>#fa48O0$cB5n>n0C>LK$3wzA;cA2TBV+i;Ys;B`^&PjI{laT)#HhkD^0NAe%ZRpQ8mr(UMm zb#yH;_UXP1gy7RfOZrQ4nsGjN>#vnweR2yDWA0jyr3WyDuZB7~@BIOxL~+h@mo=NB zQ}jwB`%|+ea?Ot_-;o+w{K*|x2*#-^horpR)KqbdK3n9}e@YLszndLM4F9l*d`^Ddx=F zO?4LKBkyy91!$&LKXX40f1DtAJdxMhew-V6pEN%Y^>gF`yt;3+uPwjJj33lDT$Sh2 z5)oJ8R<-BvHL$4C>mm22F``_P+064q7h9{c^K)`C%`7-lY%Cb7-Zaf->!zn`mhn<7 zQe3g`wBt1r?DhC#k*Q95So~0QI*JIz4@LvP1}&9(-pM4MO33)?2zl1Zaz)M22U4l- zB9R4vO@T!?RfZ?dil}s|>avC92GhwD$?Xu-?QEbd|bQ=tUl*r+)Zu;^#2YPJNd zHKlYP6P{47S;`cXUtDD-s;fa1cExjS+rnKi!8yXkg!9a*V;1^&b*58SGLN1{wxb!( zXv7$iV(!eQ+r()R?3?avH7Zj1+LGy;*i`sxRjT@qZ`LQyM^f(k6q1 z6m9@iBgBT*3Kc?BKoRM(`9zkNrxxou(p`LLf4_h^icR1K5tE5MMoH-RsQ(>#;3L70H^`9P<$bN38x^2By4GB9ZEF98UBI_$6r=r zRnD6S^@NFdshLHKMQ)ObTvQ|C!lE{u-qMxjm_0AH7(byFovlN;cF;N-jeVN!2!W42 z!%~MS_A%s7ZC*|q>DV6LJZYx{{TmJPxZw@wv{%u)r9zg{sB?zLFI| zGlks{Jx}>yu#PW;>czI(U<0ed>?9dXGx%B_gHH6I_7F2G^q5?3o351H8H)u6aUVoP zbeEY=f4aN;E!6f;JtL`2Y+C!p?Q9z0IbMFVV@S51(jOD6k<;4X{MK9LtSRg;;N0m| z{x*$r-JqYqg4eaiiexEmwhCDZm|+-B8ta`>X5V3w$Be9H7xi2Lr7 zN=|CI+pGutRCyF_%zNBHj(SxQT|h^pcBz6z77UCn2FAVCt`khT<|ydEXtLhIXfqtj%aD0OOx`MH7$8sYy zKabDC&=C7pQG&n|?BEnn+aUvfqDgmx=6&_w9JF52g{_zV7%7YV9}| z*w#-VYv?G|BBwn6xtA$RD&3twWy%8D^2DxRW5!jSl=kPgSM_F@W<2~wt#v~(M-%4l zl*Kn_eD09y;oYu}p*;+J8OU=~BxNb~%d&|_bF{ee#;r1`ZW>%XrL6ake-VbuZoD)Ps}*mM5^g+JU}KIx;r z=l~)I@%hSAYpf4v974qPo|yFUf_PnPJ+W%6qe|}-8^UA=OlVXpD_koT&~L~ z4i*gwDxWrheK-|X{DQhY%h^`|>$nNw)r>IIi9pm0^X6m&VI3Qz*q3GW~zW-!0sf` zs!()nWu6b+@a8M+1n7}pn^^oLp3#ZUeBf1b-wU^2JfA|ak>_UyW79%&qDHB$D)vKi zlZ!9tp%3_lOo1 zO{pY&bQ2)fccE_Xoi8@XR0%d*C{nF_^Wuom^ZE2_ul132pe@($|AsulIh#i(h^hMm z$sNXdOvg=6=cRVO#@!Z(gdbxFqgwmw4_s^b zMETBr!p|Q~PtbGN|6uD(nez?)4`n1{wRNwB00PqePszIfs*F&GJL&iS}4R@$vPS``XuhgsN` zKD5nj0&^%|+t|P^p~jUOt+RHzW!5ucMPQmqjsmo%^Q^~%EX$?|L6gi@4#pmw*4eAq z4PKt4vfWAI!{BJ=W?_u5TI?AOojBY$!9UP=LX*Jluwqk$8*xsV208UDt7gGq5ljxt ziW0F`I)KyKW2B&xa%SStHLutTR+^Gin?9MYjMZ>jCG zNb43k2{&4FH{6z(Cr8mhgW@C#6I5fVBn2q|wt{2;-P$`|0VW_M4)gt(yoc@xy+_8^ z_YgOz;n<|9`LO|~qL_9z*~1cUXe*4I+eCJeCDCWu{iqfSSeF8(AZAkof3Ub|m_e46 ze&(W#9?xdqSJK4U0CiwehUO_@f~(b}{u^6zDZMUZ#K(4-6q`M#xg|t5C+)FOROmu# z6f7!7KUc<;^P=Z+e8WJyQ$=WpZ2fj$=SwnMLVaH`mnWa6tf=;CNX9H{tEOY?gM$25 z=plD|uDXNGXcR0OXvPm#bBS{cuOZXs98f-HY9L9~gPHU?XUVG~5j!)8E0sEq%|q)~ zm}mEzG>&9KEZ#S(FRZy;BaIZbI{d=YAinrRa<+MS76--ip7UaPNgQ1l%%yTA(XsOd z>@OD_xfPs(>fTfxSvUUWB`wP0u(f-hyT)B4C+kCrO7FMt`nmNPN|&cmS*EM9ZhQMp zyk-&7iTn6u$13V($(e9}dPLukKxc_jwp_>k6y)(`!V&o);~Zhmdc%^&pnavyuFB06 zoox*i3|B{-G74TI_p*o!t4JSjDQ`EuBeiwNvE|uqq&?lnDcvki^QQy+?3^!l5R8+< z8f<=x_Uhqng4lXDkEjv+rDA$c_VnCnuf$?P)|p#5onI>l(33RxUBHa#9`i?W2&T3k zbT(1N-xTYMxf)~b=h=ArZJ(zrHsx0{IVBR}J&Z;G`gd1ROb!%6jCq25#KTY|sQZG% zKEKZ=-6(Of-c*U)WXbO!v;;pWVm}P;3hRtWBL2r{$d0Iyr@RYiV`z~e-owpvxKaYz z>kAaL!)y^-N>J6g0mk7$OQO7?w3pG?U8;V>U^;ss6T*!9=x;oj&4|iyzvH9Q06K@u zvB9GBDnii&afXud61iBo{kFCk*{`JPPxQ>wH^Ji85T|3hnBPAOiy23eY#Q>76eKy} zK+KgSC-(%_T6u~=Gof!OkpR>)^-06(wZAN*4qa2eQcC-U_irv-^b9%d>SS5MZG0^z~QB(>*h1{BTS6fqY;6jzkm zGEz+O^q^%LQEHMf$B%d!ZGVF}KlZ4@Q`BCVFpM{EW_Sx5jD}t>SfctX5FSf`7v=E= zH7$jS589r`x)JLNhn6VJJ{`o>pCyTmVMoV zG)K^4GWX9+_`NX)kl0`4^8dHWCGr1*a{WuUTD77B(N3@fESe|CrXs?~e~^JFgUo>A z9yh?0Q3%OhL!^s|6l+B8Fk^4$$9FdeuluyLzSKWEG@vK8Dc97gaWonzS+%xi@?U>t zz8z`)?qO|i?w%+HvkEx=*nRJN_1Zo2?I-Pd-CNs(Xh8n1GI@+*OO$!cVoQ{L3}f3% zw_pj9=PEs%0IDwiHUNSx{SE+HSrkMUf=7rwU7{&~CJM7u=hKWP1XGG6oP0|Z%R#yD zwl;uj@K!D*lzmL`>!X`dEPb!)@E6Y^r3ugoSNCd#dEKuRo0B=Om0AL^ktkgQQG4$^ zSB!n?l5!jm+v(9pIHSb)rR$|T!i+wq{wX5du*UYh{L+!3aAghN8a-QS9*4UsR%l^E z>LW9dA;p#rWoto~&SrA(B(}MTicOkFu%hB~%gZ-q!&DX@e^Esb0}?Hz61$VMz}gj3 zmi)EZfibHk!MB|)V~xuD#LLRlTKzj7S+$vkn&vr8ZS!|Bm5PrVXPp~Ya@+;rJ}9Hl zbc&j7u^DuAm<<1YzjrkusrtdOK5&iZUpW6L<2qQ4iMHEW5uGgcOH$w!fL(ZDOSlOyKH zlfu`aD|q*{V1QL}E7 z711g`aC`blbulPMGEoW#-+ryUzo$^0r83O)te-tBz|a0;V_!7cOfB|qK_$Y1F`fUs zT>`#dYmE=1XbcN`r>+80;$nL_t|PUsp>k%o3EdetD`bRxo<_@R+Jrx8l|IofusJ`G z=eBXr(RzXRcMCJ7FMMn48mX7>f+aq>3|-P*LpM$IZN0O$E9{lm(U_wcroJZ&`;Q9x z&B=`MxDhs4Mz^-Hi4k0tqlD5!GUal5`t(B8s20<{+#m~xK;KUEMGco}SB-o&^IcNs zA<0ZF=(&*IQNSU-CJYAtJY1}{Z*HM!Yr-nR%;L52?eJUA(2S&@rZdXI=tcW^h_r4v zD@;9~Wd%*ZM10EJl?3apg~lD+-!WD??;y3;1)mQp&o()T7ArNyid-HZ9yGYQ$WT_h z@(fmerM^)7cc&}z?O9l42d=xPhlD9~H$$L`p~DqVC;#1NhymXv@S-z0O?`%C3265_ zaAq+_T!8)(8C@6=`4xlpYrX#c%3?>reRSFT(cV*ayxc$5Ew-}4Lc8se7B?2DTBn{ZP1mj9Bc`_l7Xp0F66?G}h?#(t@f z-;~^zsARfihl62WVe5io&7X>GiBSUq$MMT!AiCxTyJYKbQrGe1NU=*gvn#8x31ihS z%UjytTMI%NVP^~iQbSC4=DWzOY0NZT!G~5`+{=DA3q~4%Lao8%D7$wdlZ>dbd^_!Z zd)ghTC=amA`_A2n<+&+aJqcOj;m3}7XcOOSVxmqa24m@%F<`>?%U|pJ;%|>GI=r1*ibqLvgtWPi{_hw%@nMa0V@IxWOvt)Gw9J^`B{2Pt~p30>f}MC&{s?)Zl{ z_1%?D;E9zsIp(I|e$-0gFy!F%H;NTSE%Y!!`jbCdEb7%3){=xVAp`_3nbb0ZqU|^3 z&gH40X;ORVsA=;&XPIfOwX+86h*;zJo6b}4#FFr7O8BwQX8jh~{T?T5nM%(I!9JyY zFjV(d>Y9?*D&a+7?NFK=k-1bRK{eSo9#u81On?Uk-ms3;nWwH z{J?t^jrY}|UlIIq<;=9ji^@lD3GF+Uv+655TL?^_2rug^6D7js=~haxE3$fN&Da6I z^=2d`z#?OOc^B+^lWc2~>~in;&pUG-L*4j4Zx(&)zGf+C=}@ic6mj&!*%$`XQ}<|0 z#BQJVQ2Y?NSfJ330&D)!VWV@C)X+mPZ|cs;-+5aMC=M#mmkW85fiyye3u)13QsWrh%jP$DAEi*bGUsc3T0u-()Q1~K{jh5GfLOp% zs%05D^_H+RCuxZzRb>nl*$5*oP`^?En%0Xxrgw7SrW0^mq@Y%=Ewv1Rz86$CZjIJn z+BVQ7g%N8RW2Su^ZeryQ%e-5pj~tIOP}Y5yXYLFzKaJ9VB&Lm@SSzkQis^*=MB%f8 z0D@?mMMyTtFswS zDTub1k3>;az91a07K8j!gd{JXDbZgHQM)A=&l_kpaSL;9J5=8PVL{V#jIt(>9`dd} zqFeOwo1bI>1w|{?2MiO?4t7(e`Gd!*a^4jAYprOOcjYK%If+Qtn38lhp&Z`XN+1oU zxP@_vQ3>74*^Z^%81eNN@)x`x?|_6`N?P=duSbIDh5@&67I{fHUNxn=r9@_#T5w%r z@o6a_ND5fF)p6rY&bCMLtR`J4g1B)>+I;g5!^_PdhBFeaK4oSNVZ(Cng~yHZ9z`Lq zl#=YCC8iDA={(G7)EukZnI@E+PK>U3M`hp&6ea5*d>2W#OgK9GzT5@_q{W0WGWl8O zJF)a%mlj;B-WBlYy8XeW^Y}9&ByA!ZtbbZJVZMgc$u{m6-2KFK3YH{0lyqpxW1PT( z)FqXQDnAo;AA6loUGGN*IvJGCcxJQ9Mb*^o# z>f?88y!YA39@4=)$*q}#G~W#1qNiCZDhJSSgqLe>bmVkXjXK&+bY9{tJo%b$wDviY zCCv6AZcvw9VM^oklr*t}>&fY?t`;iKQr72G4=)Pyt9Q>ygy^71*tH@5-!pFm$Y_|ulG zlJlg@Ii9PnnQqfYQ*I_t)joKiKszX1()w(q$SuACNQ$nq-bKnC*#ocu;=Pw&e#y2B zVT8s;Hnd?Vya}C>3I~5XjfWGSNUF9heqf%|!hG_zC3}kCm7F9=uAO_>MFva<;TyEA zQOa}UwAD14Ma9Wl-VwUhke~jCs%}=4I8jU&WvmeM8xOcHiMzH9-B+5Z+WyvYxn7;f zNmj4N7#EhrGX7mPUY)w)agG_;T9T_;O4~h{wmBY9oMV(2aVYSt?L0)b5>T(? zV0}DtbrKw7PPS0?vKQ0>z8L6GZfeza8BOli6*_W0J%n+PR}m|t{y-C9PhuHrtBn|I zyMkIKXP^(zYd(d(ih$`*LMtqa37;-~DOgtQW6~}^(o`6{v}A(@h=nej$DY=292rp- zO6TlruVtLdNKqg%_lKD<`sp2aOi!lQcc7{C;6Ymx5y~F~U@SKq&mYaZ5o}SR@iPIe z%QFc$t{1cwr8MWFzsLYici_6aSaU1IdoXazH;K?#x*?^xpmCGV9=RoIb8MMf_F{ux(#nt+o>#F<5bQ4g7VuYlIa{rDhaI3taQhbU7L&>iF>t zn+d};B!%*Xg5^*d>??LFGiKO8eqpSObMW?cDw}V`G0gl2@NH?E7d%)A*8Hs;Vn%aR z`q7kzx@?i>6GZ&tr$()>moO)K;a5~11Vpa)%iYf?cuNOvDXyle%m9@ zq79$Vzon~yewJbqL~p@QU_hZffp*Rt+QFIt6E|fy0SpKm^!!AS2!+SuUq8HHVXO6Q z>t%hc<&we^3T@Gj{U4PIs8K1;d)tAA+@R~Yo77^6AYyZf-e7G6zK*4L$L~*l{%QQe zFfssn1^PFQ!v9x!mh=BJ&;C2BszbSIDWiVr8Z**i>a-O|k2N$%5j4b$&*iEKic>a8 zYhs82&qbm%FQ+CSG&0!?vDvJF8_BPt$SKMF6t*kp;$Ls@Ck#g$)JEK}+kW<<@cuZS zj2oRGmhM}o)4lSzrak^R<~z>vxMGX`{Pqj^QPFFM%J%ZwQHzIV9e2bs*Rd3hzGKX1 z-CIeib3A-*r^(~7^~=Ua>9&Y-qiPSH?`UU;vqL@0CiZBGbAx2M`OS`Pi*$TjC)(o% zo^LD6L%Bneck8nF<5_IlqtGoIp8+SK>v?<~;^XBPFYy}RMX!4g0vLYmQNH&^h zkM#<4Lx~Zlv#h|hApih8-2{hDZhEnqe?3nGwTTsO>0~*Nb*3^i6JN&|WzE6$AhaYW zmuwhffMbgS>h45kT|D7ROsbuPJc?kK%13eL{;)#7?D#ySFe;{JZ%n+8Foh;OOHL)?>Hl+Yq*f#JlO{Mw{{j8J($F|!+E6tB<7C`KMlie zvl?^hnm>n4hs~eD{DT=SvQ|0-&7f=(6*B4BIfpQbyck^o^D~Pb6IPnZSVjXhluQPf zF#}G;(}S~$OXRdAd^)a`TOUj{(Ad;O(%a1C94b~WT5+b{xyc-5VSpN}INKMEv{<2= zN{tuJ6;2bEr>R+1wtY5d50Q}62FVcGc_JYdNu=ne9XJTc<4MYhiEW6Odym7GW?r$8 z9UV;GB0Gzo1Sv1TtF(o~6w3}Z`&a~ZH60)|!8#vB;ct`b#EpV@dg>T^!n-*a0^43F zCHq`uX0N7N#B2C>v7a%%nGH`!gDnI-E3L$LPO`+d45)Q0F``BKC)#fF&`b zC>>z{;4i(!E^Rol1|H2!<-^LfXu=eXiwcwfVS6`=SVHWQe@gu5*c@&^iKk2-;wNw4 zL#2ipE;CP3d<04TU|Fj;nqdnzI#Upy&vduToO|HaDj$u2c`MNE52E}>iI$HdG;PEJ zUWQ?@<-wS0I`z)cQQ_vLxox&_5Jl%GDm$y3cr1lj7ULR=br%M!tyZT0-nJ_kZlz>5 z!c}T8nb{LlSMN`D4HDxfrYXuS!z)HrDT@sREQSY1KGg|DoN{9Jt5J@J%X`MpCfES?D4 zs<$9;d;`v?d`R`#3bsRGxH-GS7;`n~!6PqW!JDoU{j#@AaH{)QaD2mbN*@aS)i)M! z-M#Tx-VxhoFFap4d(l{5f!*dUXw^zTQyHBa=;y7(jVfIk^lG5X=3K6zIyVVT%n}o& z;~zpi6jnhwWH@^H=ffdL2Ek#NK_ODH{GIU%_?LqA<#wb>G-PjenD;u;BqGUu+46P^~bgkC>O*ubyUXa+LfzO-Kw6|E4re?^Q9$ zk&RPAr7p2oyXk-u2P!YSrpmU#6Z?-i-mzZ(7FHST;vRoy? z*>6?Ys6e}C4|)}bgE?g0O)jy$1GmIA;I{q(Xn2V*8Xa5sk>pZ_xO7R4O&@m%IJ-1E zG!R22Y$~Rnwd(Jo$=RwTZt7GfWioZC>}8`ntui4~sc}|Fh)LHeQikic`lHBFCase& zp;%Vwpd~_;E-2}6s1|HMA={f3+Ip9~Wc#mK^^45G6`w5hX>Nqg(=;zhTU;kTSYkIR zwhr#?`(GDo)oZy>$CXR1`o%=#DJ#AgFxE6Eh$`_RjG0|lIZh8y#Fxd7=rRrx47V>a zn?BQq1hf3;Py;lwBS5#kCJ$@MbX?$Gq^K7%}F>N>39Fy{P z)=_$bvg|hX-vq8B^#4UEfVKD4>s~O+bop^-R1=YwFUyHubLt+BmYB}n4R;|s#GNi} zDV*^4B}rnID@}X`*O}|FveD>Dx~NB6>X2)sDnr}>l^LEX?^xa$R&ZV2m!IbA!#TWw zwy!AB+E?z4OzF@_-^=N*h?XjU?2nLfK$RpM%?0(NFYfG)3WcV(C-mX0JrILs? z$A#I}DuV{I9T*%4MFq*rYe7xeOfs?(m7b2&jTf;M8GmFtw;Z$EkM)|&7>n19UUilP zTLM~>ZisgFtsm3#rpk6f;cZMo-{^b7ZZI}Q_=9sbp7%br z&yYzEsH8JR^J}8xS`LUuNQc02Z5d)*V);9;M?&a!A~*USf#JvY2Zb|XiZhG+98vJ7 zKv5ULu@KIIJwo=yWjf`4I=8gOQ9mqQYrVIA(1~iJsz@h~Zhm z@%~v3Vc*47dG@@fwSbe`M3=Xea z)jD12GSMTI>XEa#6Yu!W4Stp{nbk?ad$%nFuUr&1TQFn#=T-mkt7YLqzvox#womVe z$v?+!oP=T(Q2!SByx9Lc`25f63CaH_@Tu@Gu6?U?eH%&S{b)) zJ^$CL=v!J!8@u^$C9^A+Lnam(XcNQ!@GCboPYhA`=b?XlWT$!4ip4=A)njc-XiUov zkSqBBfB{Ktqj!>xtG@o5&*HlITDJ?>6%fMfx$(HOi)RpDJGf$eLGO(DtPQJm0abyL z$gq|nQ}9VI0XiVoBk7O|*xOJW+lHyI=S@{zoe;}Zs7+6Q(3cwA@4y&ytpa`PmiRj{ zq4$a=rP4GCShW(h!gQ^8*i^=bc zS^<7S-v(e2iDp|uZ24;|^_9GOa$MseR5*WP=v=g?uyd1LP%DlwRD66WaHDNX^1|tK z!CbpO&`A1}*7ZmV{e?1Mk$~A?3I^LZ{Zr4vPvwMq27Voe9UuuH2_9Gb66&PUBD2;@ zeF25fnv}SkMp0f zk$wL2(;(N8q>Rq6$v*Zyc(`Nv{j+-ExyhK9zikp{FeMUz_}}3wE<5uc1WE#PcF2K; z7kvC##`=Uw2H!f07<|~|((4_qEcI{~ZT>;?)vBS!vH!g{s{b%>_n+_W|JIu7Uo_wU zAp`vD&+q(Ohbk>QeIYQ-rDO8YKxP#%M1TwlA*B#7Buzrnt6@-6*8~_U+BOeQ2y!!} zZ%@>)YsRy~nC)50XtjpLw^WMbm@ps$V=oiP=(80_XB3#76fK*AWo7E zwO{|D1?pc6%Uzk#Eq~`mQk>{X;Q#uvPCvRWY>VH8F*JTdg6k^Mt_#0Q_4Zj7*R6WT zLh_w+aIUuz;R8z)Yy#&gIDIz>N%%r$^;sY1!*D~B_+UlyU3S2QSkdS5NWaZ=^9i|E zDEOJ)O=L4kNc@hGHv=Sy7pEJ{SxMvjrEf1 zmkk3*w+CZOABCCNk{Y^oS8(RNK7jiWn6a%t{#&-xF_I))jT%Ew_4@x>Gck$NS&|+? z8XH5=Kg_k}S9}vWp7}HT6sLI!;5l*i2TMG4rbSPupCH+NaDMOc&Dl-yx8=*+NMDUdtw^W$nQZA~C5FE8ZniDySdP0bZ(o*o zw`%MDL-qt!btY*zUpu?_D){OjPuo`ep|kD~$1ts%8eLc~PKK%o^~DHnDuqzs;PqFu zP39)Kb?X`|jEd{o_~y`*>{2yutQeKKy5sglu<0C`ZU=J?dcR)GVmw^w{|ABXfYi%+ zXjMh(+PMSB!zDb!*xIbvx{*iq-N?A6X1Ne}d1{B8B>v!0$jkA0l7dU{5in3veQr;J zbK<*md5KQyKI*FEl-@Xo5iA&6kBXxGY_PDStBq^;%4G^fa` z0cJr5dC>q+oiIG1!5`ta_R2eP%P3SAeFvHzl?^hiqo@XTQzkboRyee@P&Sg~V~Q-& zYBWT!k_l`C$TEl6=Z_lSD@80%EWD%zoO=b@G&*z{f^;+AP=R!_-e7}tv)p9(F*&w7 z%!s4F$WS15-U=Yk3XlFy^Euo6cw!iS`PAI(I43i@WQ%?rCN#Vkp3}*1JCKM!&9SF} zsSJ5oN?%k^P7nr<1*rS@RCxHN#j z|5|1?uN6i5_0z{N4Nj(N1LYY7&HjTCmLD)AL)6)CIYQtJ6< zmC9Djv#d&A8j4Hf;Jt~*K$^(i(R}oWoTm&%`C2w(q%-F}Wpiv)t^DHES1m!H)jd?w zt@4`HedW@pimDZzIlc#AoX(|N4e!om`~V#vd3`Ngc^hKh;b}L1DF)sv3MJH@d2W`W z)x3wE65yqWXh{BNumk;~j(bnX7q_UejxfxIhnf?Yj!$cUXd0{R50$f%^pn#og{Ml! zT|(n+^tNEtY{^XpAARdp{`JF$5~qzSws^V~%tiZ4n1eS5=<}=?F0u)I_#++7%K!s2 z>Fs~Qr=i~xCrT2%?NKM`2EtVw!+e!y0;vkBHr41C zc@$~B11rm2qdARGC+Dq~Tn0Gk<4kiAM4=}bzMV{4S%^8HQoiB;b zF3TH?sWgNKm_S#to4B#-aXyF2IJNjGJUX6q$g&ZUa28R{p{blNDl*Qt1jt;Xb^|=d zzoWO>IlY_hXUmov&h)gnZCG3`(`F-F1XfGctsgAeJgnEAL||qTFPR*06!%D!`>N8_ zx>(otw-pyrpB}1dy-u&iR|7!30>%3{T<7t=m*M!2x^=#vfw6Hr>nR)QUp?C)?1hiQ z)1J1pv07p72eoL=QSUwzv`=JRqvBUJq);~$wsK94nMs!wo=T|<9TF2Lq|u|Y9e(U} z@UU@6kvh10xZG|7I@mb`qoxD9I6#~kOW9@)-bJPH$G8mG_68y*b@8z(CQPlaQ;JX! zE)?0=jKfdM%HpWjh8!qWW^*k`oko1VRy&~L4(r>}==;-nSO^XtooA#p8m$`wsnNg2 zjsMV73*a{am+;poSzEGLEDl~%S5~RzUOuch-|}sreX*Z&`vld{H;B8`H$wnT{XlcU z8?Km&hrHm9+F@95q~!`;n=+crMGTZBu!nVuez`*`ph*CFAPk)}9YC8HjO^kS_nAlr z4~g4t1~1K20eI{tJ;84It+s&1*to#wJA)c`91)+j+6ZjcegJk5K|!=1RX)A)FM~@s0D~};29e|W zN077;Y{KbTBA19Co~!gpuzIYkloxl1)I9!aN9e;QvRI~caLk%;f~I&z5F#`Dy-3-D zGQOQtFB^x4VB>8SvqyJTNv89PDcDw6L#X{~h@OixB_fp#qLDsnh!vi6N6KxM3yH6E zn7xwaMcS*2&Pe6X3PBvRt+T7M#^ZGw6(Z%m=8KrBuj!Ph3igeQ&N#~h`Lk=Lj-cf( z8>n$a)7ND7dk=q}87guQSY|cOx>OL69}w>usEIn^^z>^}O#w&|Frh<(A5F-}40|Lp z1C|f7_FN`~p+&Gy1Q7uvdXR41p}t%_b)$#OKajYFWN4s$L99zUxc4}?6#+W^uaXsq?hpr(wLp*ov!3Xs#M8&tfuUJ>f zHoKqUhNUDT5X7QZPx9AZb@7~qh`s!$`NrxCcAJc6N4*09bun0Ia?$y7Qn)atJ@Je% z@2lnoP2IUu5VJzK*@a6k`m8M6LCN)tQlGpPV2np{yD^O)-$|5ZC9SlR+X)AHd`IBeRJlw6?dYofs*+py$*GQc$%eCfV)*^ zQ01?_JEsm*7Yo{0x;-mbE_1|Wh+Ft5ELSqH)C74f5A@+Hg5!Ksj(`+D7wi(g0QcDA znuXuvA|Tgpc;(`QJs*z;B0^>$rILU;u$hC4rYtiiJ4WDF z$P`e^Hj?UDrpG!m&pyGhAFVf*l-=4>d*Fe^YH(P(id!DHT?%ihivwMwL>aWj*;e5z zh!qhK`4eo*&WoUJ=9L=dM}J{4oJL0N7mCVYWC;TR?l$II59!ZuUDZ(#y-Zmd*}H)J z3bE8iJAm@=)uUiZeVLv6y$_ zs~$)KmyBN?0BhdSA09Xeh;c+O%)I?9*~7;lj^1Q6jlkDW{Kj&9o4h-M2@XG>k^S`~ z93a<$LH6M-hapzV`nj)4{!}PasaE;VgYHA10xT1IF!brEZh#ja<+*?FfR*0Lfl_!uCnvu){$^z{3MaA4ekv6@2e zVQM^%n+~d$gNly(U*9&vshtZavhS7O5o}D@kg;tK!90_m;19o>B7bT=L0$NNt$L#J zASM;E6VQpgeE+k;mbw>}=79V0;~4+H;%fd|mD*ollz$Jo6e?-TBJ-nsftx4O!Ynl9 z?7=nYna+}_aEZeK5&Z1ycpeuxz;N7sJ5%c06pd6CuGglq7 zN#zARMqQKkG07RxH%wF6_0+7vNaHGB1sB1FJTnjVdlO&`H6dMHS>1eEBTdjOMrqw{ zEcY#73c$2?^i$-Y&%r5OjAz2dHlWy*sgLwF(1&xOUFrAwM+$>TqFwFsZif5Cjl?W} zH-gZ*Tr5v&?~;NiVd^}Iq+@W&w@+;*krxl%Bv#!2GF1RSK`&MY$D^-!NLDX9{{bki zLeaKKrW`RL)50o4Yw5G8g(y`mB)fUQsLuBwWIqPRr9Cq-}? zIq<11aU()3gSR@OoH`Akg_9j$1@sYKVq7kX zEn(GbyaTIzhUdzbPP0#{-vMpu`yZ7O(H+SDn9CF~ct9O>4t&gwP%irv%6-GUzz((u z8Nu1x;ELqT$cvi)3s{3cB3@n)+)qI}17TXkN|NWuRSL{Fd6tZ{a#;kU8EvzMnAPik zvzg+>J60f0OuE zamlD8If3+YX+P+ogc+Pd?X-eIaZSZ2#?4GpK^K$c&DAC#R3#J+CEB1Q>;%djG^;rQ z<)4kAgj>%vS)nDal8E0n#*FRaO`=FO-P_*7?_Jkk*PYke+ia)F-|sIbVWzcoy1V=L zVXb|#>#YjAlzc`Gg}=)RQz~z8_zrKO=1ODtgeZ-!=;9J#XzGZhQjrNalIyGLc~Umf{4O&|@!`b^$lsjVqU_Kdta zW7k19s%(q1k8WG%)CmS9R@r`?PmS*@dtdEY2dTcB5vabkhD@W6XasrOw@k|x-?e$Z zaaJem2i&|EQ@k1NiTG*%!l0Wtj(E|}wU6&hKA4ZFcx??}gF)uUgn5-encF0+1WM&3 zN5Sy!N@$i~quvNCT%@CE4@H@|UZvh4ABH{w>yip@>4V~{G#Z!1W~ZocdOaoCs=9&a zXD6P}rZue^*>4s*t`rzs4>bSjQn;WB8KgS8vVL!d+%34&tr%WzbQTkOrLEAR3E3sG z`}}gMFakc<=;oQZu>AfC?rnqDEqnHSd>dJ}EA8f4pCjrO(bvpa3N*j4kE=%$JA*8x z?qx-lBGFE}*km@TH;H3<)wmbTG1I5Cg2;lLWUO)CXsci{cB-}21t0HbfYuP10`0y` zcYUVWRchiiZSM=xvoFvFyy@2^jcbKVl{~IxOz9xX3DRkGsXeY}z+05MKh&nu>;&$v zGGdBmE3)RFR6AJ{41APi8iIxcN>ks)%!Cq+m3vfR6qw$=C+_h>>G&B7q{x_LKV>o7 zZAk$E2auLztucu^D@JXex0o;dkOb9VE9SrnM^m{nj1To^g`~KU3L}y^npP5)gqkOg zISn~LLkodr`0-Z_aT?KV44(DXJd&pBsh}CLg`#ezzR|C$LGZ{wc^oLqO&00>?heK4 zHKROJ@%qV4>Im(Q)mc+h$Vwtl9K3V8kd=zEp!*^djNAmTMB4H+j@}CBM&{`UQx=ax z%$Nvgc+eNhfAIZ&Kd{fA#`mOXKrl-fq72rF=a?@0YeMYJ7GNUXaU0eXQbqdl%dNAe z04!Nqh`7T$ypTqi_J6$Xg+e$Ku5rE+4cG}!`pI8nr=j^5#;fy4xEC9nH8m+!N~a|u z&Vn4V66yU`U6*1qH_Kzbk(M^F#g;2?DGdU;IbyCBGrx_&Gsg$6%dm>d9%}-R3@p*i z#tUmzNW(l`at5GkSKD!b8;|&!jKW(Q7m#79U;iY=A+x*<+2JDUTz{x3bU7_aITGT0 zq|sos94&CB$x;Z5GGz}Z;v?|ta~Is^)e~_lAgZvqb-b=y)9RXpg!X{;@hvrMSk4XV zPp{1?wK!AJDge#gOr?aE#87l2z8_5zBE_-fC;WT~pD-L)UE(!- z8Tq5NOx-EEopq&($KIh-wEKvF+c?RPzuV zbW9OZOPs4&HMxccT{%+f;OOIgGBU(V=7^$6hdEPe2c4>{8eLI}1Cq+z0({di96!}I zdgHp{nm4rPj)A)j%z0L1U1t#k-N3Fx7)(0PF+UIl%bdk5ZHNX89~gLg8fP-EiXk<$ zkD-}7v+v(jv)rfdWWlgbjPmtsViY;NuelewGOCr~bnP^bzVon=mVl-yBcB0=xY9LK zP5@h^HR;Esvsq7kbytWT$D9ZWBPoxW(z;1=g*Q`~{NQuueFraN?v>)e11%9#ma zGkp_m+GwYZVSa0^ckX?tS1A1?ltZ|`Gri|8Yojkpw7pYBKh6d z+PcD!3Ik63Hp+5HPIHq_2lB(UcexNb=SX;OzXCOti-@3Bz#aO(MYpieqbKPj26ccn z-Sd)gM+9UX?@gZxe=6FK1=?(|r>?L)Edkls6oRBoWq{MN=n3z)bhe1ASkD}~CEZ*| zIKp)Vqv6}f`wBb7D>@WFB$|zo5~HTF^s98i6jATI<(E|+%q5{Ui_FKK^_#@*-Pidq z!EcQGs$4mNF5pG#6Brc(loA9~JN^=BzyxNlgtG%#=EGK}wNIh}zd5vS_LHjxIPm8a z*l1g9oO;t>EFg!i2}htYRA!6dpmV~%e;up?U3}@h*Y0TvR`D~DQR|W)Fg8jB04G-E zK9@YumrF?&JNT)ZkzFdB>iApmd0>GqW)UuI6wX<@ixs|~P$pg_?+H34_PLaMBJd10 zShi7=_dS<+;%`^qfKd8`@>SdgbZD}Eg-SHfUW#!Rzg85?NjoxS^d(gD3QUM9w`Ez& zoq8#3h_U?^WGaI>nwwT$6Ma{13$ivc&)j;C??Wj4py%`VEa1UvL_*_sYPN0l4x%e}+@wCv3UZ;ZRbLt0b#{kSi&AH+>}K4>J!aK>$I4%P$FkAZOQl|MpJ~irqjIi- zH}4wXjKqnm$jl9$q!+ZK6g_kfr)M;kzba5&v=h6-fA&w`E-QU;wmm3*1&?hX*pzDZl=W?^ymA55 zw*!!FpI;#;zhis~ZlaaHpuUw3vwIm|jz3_uw4+n7%RVH*`MURXVeUkgzTo%};IOV^ zl&6e@54Z2GmA-hodqC&Ddg%PQ+=EU56yWlS-{jQY13pOB-xYVdIk+EnC_aatiQlC9 zpY0h76}O;`WRW!|=-&a~P~Dn}`FGtIZ}&Ed--0`ThJ=bot4Dlw6Y7U*f72ciiW`WU zmDvfprE=pfN&P4mH+npheEfCAdEDt8Z6`Hcc=HT5l)s)C(r{Qk4u()Vok9hoXjX>* zdtiZjlw2lTW3Fd`J!}A+EhoPK0}^c>c2*3vEb4b$e4&#C*WA_*k3($^SCr@LhvEG7 zALUU{OTcbNwR{<1hj0(%*UX|qON2IVSAC{=tyEZzF60fTtP``|ZrYT%w?%qZsj(;F z*1F}woKECvykj_w)sa#b(bStn^ND&~?@t{?v^VZu(lBF~6u3^*G9PXmx8pqW^<-cU1))uy;wlRVa4$x(T@JR2!-*mdS+?Fpf-t*MrjPbqf zq;dS()bZ&jba+l$x=V}K{?5EEVi&){bI^*W4b>CNjJv5ko*R$sR}-5DhZw$Wm~KR7 z3O_|`mhkrgVEkuSX6%uBwZ4#Yt?ID2uOy3NV#uPV%#oAja;|3r#3fw@oF*LyAKOO6 z#i&__y)_Lr*g2YZdzvL$DjluAfE?1%SP!1?SLSfxFg0P_d{5GbHhuip2c)@9DV=A1 zpS=d$ywh~i*@uz|gkgek-tH?GsN_~xo|k6nDwCzczZj|+hXo=ltL%7?HvcYKnXKko zGHRV-+}J9n)z6`j5O3A22e&IhvYXfKyjMb2SCc0m6U#qjC z&uSnC&`qNh#YP+e$tU0Yaw1PU(*&x~A6+ZQB*{3Q@8cH&W4cU-lk^HaFJz08#Zjjg zikcKXukA4W{nV~Hh$-T(GkFtW1Uk^UuW`vjb^4wETu_VPy~0AuLtdjDB0VTt z7VWiKMi;_2weT!bK-scVOwKxCHCyTKkc_s9GuP%Mxt<3`^X?(fPrRt;30>gZ;bwtU z=fz?E6e8k`JDIN)$sK`+ij=yP1=Teso=I*fBrXHUcRxm zZC1I=(M~uXZS%Y2(e}Kx-?Ve_KmY0L6iv6qCr6WdUT>7e%er_IwEom<_MWM9nHMaf z^4-yM2R$4PWtV_H1b%A__DWc^^{snn*%;ok- zfqqt;J>^J|+vv`gc$x=%Dz!yNVHYv>jMaJ{(N7B8zkCIEs?{ZbyqD;wP+G~kMM3=C z1yln5hxNz1=@k7d78VwRLRhviM}(y z^g$S(?rR~;bbJjJfxVk{{hF+Unr@7>u4l8dEpkgob4^E^F__`X-gL*oN*9Kh$vPFl z3n+?;(hgw|P34VD%+8(W#QJ>${aiQOv)CK(TjI~&;K@}da~sO=3x*vV*Cl9 z`LP8XAzKje(9rJ6LQHFk#>%WB*eF_}7l@^3f4i>VnR;-`OA;?2OB(b*;yxszBc|JA zL^#sDN7xObd6bi-xz>=4#*CK}M4xyRe6~u|V9J+SmkvEOCZZktIgtOvJKSqJXj^`< zCLb-KiQob}O$*o#BkG39chS#opI0)j5}nnG&TFL=o^xMXny=2QjH%YmJx2NUg5@<& z;>ZUcRI4m4tGElq+1UNi;MMRFR@C`Wl&KVX_K>Lre@ppt7&U__(^ydZcjd3*&dJDu z_6+TU37q11J{|;I3}LUEQNJB(uex$S&t!;&Mrb9vfe6ftDa7M3|KIM3&Y@ky*uE*M zS40;hJizKv{=a-!h}sZX_+Aw+JlG6!}s?!HsLJcT2gd$G-dU836%V1r7sd^z}S z2c-vGLiH#YQTQT02lA~z=ZA7-8=qX*!*eVGsl6O$paiE><|FFS74WB(M{vf=m*eIO9njvuBLpWQg-HTLLwF;?!gy zO)^H;8POWey;1Zv5v5V@Iplcp@93{XLd9nM(h~p> zQTA7ZbaT3RmU4B83?cTYwD1=QYst&F@>SyG_E@(`^{k%KLow6$5H|a4S)V-}k?$Xo zZ)LcrG6|Gt&@YngIl3>(kR;Wn*D2&_${vz;OK1KZmVi7EFdZd@BnHPMCI}jr*A?#m zU36y=7`@%I;sdk)1-JKp{c~IwG>VU~;{)pL+2m!S`}YZ*V9d9eV(>9{EFT2-UV-q; zYr;LWlS-E3+~|*wxGWc^{RlO}JS!KBlPha?fICK7S6Zn_uR%jFf3GL=l!@uqT74Z= zooETV#6mN&HIhX^w{`#3au*e~aj{#e;7pXN9rbtN;6=X5R1xdcZHE$W=qIWgiqGN| z;s(43N$+@m{U6hAFe?bHkjvlR$L7)uMx7Ey(4RWF=x5&s4xbPs{d%YGF%2~+zNP5> z3Cn`Ag=>EoWn6-@K2WoZalkw==e!&5p8itq-BmSYTN~TjHjve(7r;ippy>RCnuSid zhFGrD6QtBfqBO}=5-e#(o2c*%~)>$idnifveAr2g2TvY{dmRqkC%e zs|(Bd-sL6}47;pX{tH>bu9ccYhzVuQHdIF8MEA$%`u-iJ6w*Lt(<)w6IaV~4*iIjw ztK(u8Uo6Wy!@Z|MD}2SGA_ZLzw2qiVOKRE+ipGG+OsXg83Kv&orAqWapJbXu8K>2< zocQ57r%(y2sv|!t^*em`L8Ef?_=|?&CthjDDD=pPy^at1)!CCTu&b}Xo47^e!E(Ex zSsXtkG2imC0`xO}E)2@fk&3FcqORr<>|D*<^sK7E45B|70uCSGiZ;k`CPpF{dqk*nt*4FL~b@Ewk%HAI~@q=t|1v8FOrL;X1${{r!(8-D1}#X7#8$hV~DBJk__t7_ZPF zv{jlzC|X|KWk~&>oGC<0A)4}WY(2i8BBo@A;*XFRSRA(yn<_{4_A(9hTCLmsjhfU4Cr?N23iBh z>EgSZC80LblDZM1^Qx~omwE5N#u4&buD-Ow)~%?Z!IDJeA|n@O0(5IiSlGGa8^)dk zVg4{XSV*)J_J3M|CEIGO;H7HyDAtbrIQG^{04{S-9T8YB@SKs?fyLbsDmR-AN!NaB zo9V_C=CchVN9l9*ZtQ>7=XL@QzcHrr zaEX_DJVD`)w?$7}-%P7MY-aJ^z(;+$Iv``2vvu|~gyucdhH-DGUu}1JI>3t`$%WoW zH@LH>lg|Sn_6w(UZoJhu#*S^z|J8Z0I~jW9NB!|5nCrjdYX$zF_}YKSLy7(;qHOy=_E=^R^$w8&MZ~2MGPefPI*N#i@uPH{HQJ!++IPi!vWDvB?|{6J z4`}}u$QwuF(wMxMx;S2bhwz0#p@3J!fkK($joH?cmz5L^PxMWtu~?R`mmcY{VReHdd*5<0yJ@>rB_lsA>H z+vZu0ROJzOy9lb@H?mU42yc2y(%7tY_(A(Ti@3GKkmxQ;4^l(s=gx z_XvmngFpL!7UFUL{~fZVk=wr%c$q4iF35lFJ!MG$nwK$m{+6T?4p$LVkU*iy0|S+i zoW~AI5`fVm9c92xn+Qx5hxzU^$#%UDg3uaANut$$+Y9I(J+!}$XOO1zeT(6F*LrI1 z{>=0;z8lu%`vTq};%1$R_Cz8zUYV#%HDH=H_M4Orn8@?fY_a+SHGZ);}^}wb+hHD z_t33|;b~#CWRCBv32(s%KBSC=f31ODWYpuf%2lHkG+V~b0rNOm&z4oFWliqeGGbM% z6Nh(MzGBzM1-8+vI+nNkAic_d{8l-4p3-gRRv!zZJSt1bkK51LrH@0c6GUzI#N61d zv}evVu{Tx+x5CPlGTACo2p2%B+zVDt;wG{U^vBakSEi>+qP{x>Dac@Njkatz3=zcJ$0(iSLdyJt9Gqgf6uwsm}5TULHOe`l;tVx zqaBfb24=WMms_)~wrZk`EmUXF1Q= zcpjodL>b!pJa&q;w)sX?ZMMfH(Oli7bmnf-53+gDD}tNB)eI{4IdM)s>vltn$nmk3 zoQM4T6vMyaQDW9=|)h1Ttw#v#j;57TF%eDP4$ z)9>kW7~ZY1|IA+(O0*;-)^Wjc@-GM$|2Emh6>+bmXW#RJx{x^gGo^$j7H~M0T;%^t)6i6%QRd84n$UOrz=j{kXpk*>*PHvIGNN4mfs7OZH%Et4QZy@>W5`1=q!%OeD!6t0aK@tJ_w1)3p z3?J?opWI4$EpYoD3%rB5TG&&n`Sl@sJQg7Qcmet&ttmgmVUx3epm;uTi!_;6UGPeoM8cN{5G930tH6e&@6hHA z-(XfNoT1>3sHR6!sDFJUWVZ&|B1(bfb|aLWSgH;_7`ndCC} z{QRh25XXA{HF@MQ166$c65C3DX&(OHc#;3T$g=#$MfTstwMgB=TV?4hdDjH^6$U~R zBtu{$R)|OzCkUqVV-XQl8AQonAzw}33~wx9EaP?xn_!u)xp}#|d8ygRTDyIANUc#u z$6oMUucOSis$;2H>rMXc%|-vj?Mj9WCj93l!Zh#mmeUOHgxj>w{mJK5D|WBaJEe?c zw7>NL&X`pwb~runz}J61xkU~k<~_8@QN z(UzbKH{w!0IV@)H~j`e(1wYDAK1~38DR_LA45(s_@MZKTz_rRS2mEA zP)7WfAp6iL2-DkX#4F%fmf=RUR}c>L?iS(|%&s`$20aV{hWl)cuZqezP zkTSbO#4CP)SM;zl=UKvU*a%8-{8=|CFx>LiAV;%c?%_&wwCb?_$XxfK(l0lB(Cz_d zT-va^QF+e&*EJ=i zpn!|wv`49KsCPU66_NMMc`HM+tJy)5j-#z?;I7}copO2YKuca`zh)A^ja-R>=`b{5zK?{j@nElV%-(*>04dZ}%mwmyNIZ9TCafYpzLvNfnsg`e3gpseN@we zSm~9AeP8UIfqmC0r%l4sI4^odmCLp{&=PHvLaJ6HVodZ7ZZ;n8WpEdsSd+Htgk9)Ot@SuOh0|k0y%1A zHYF|Gqf1ZhDNuAkiCe&Y5XUn{MZ%UOuf~st->f_rUvD0gMXS`Fb#6>qB)_;+V>@k$ zUecYCYvxR%Ba+^IDGs(zU|TNNmfMNUdeh^Ra6_)wd9eB?GL zT=ut(5zLmUQHK4d&@{4RcN~n!T!%wmc%;cINj1~0G-1zAN6IbZy%qQILA#sA{)iSO zRMV%rBTN|L7d6tQgQr?34{@D}gTR0$^L`ghvzWI{PZ zH2LC&?x`8G?FOa~tMzTu^=dKh7U?fLHMHubnV56!7;5}&Zyt@TKWbB96Y6mv7CR{x z;U6IpwW6^r)MkY`;fJLmTU+8tr(UdorsAWyI8Pz2Qn5Q&GS>`YLe?ExN5+5Sa-Bdg z#9HM4$y!E&Gk$>Q_re4sWwk~@HXK^J-Ewr@jBaU`b}r}nvb94o@mr=vpRNk8wUeD3 z>aahw6>|6A%(>(<+{0P@7`aE^SNhOOivZ6IS;(6m*Zf93TGs{a&br5nsc2iT#HRDgSYo?(lOZUcQ%PrX;p8g}OpfD26j^3mTO-thZTP z5h#3PM!PAl1@@=Q118{itQF3$fwVOKz{ombh(R%?8u>1nQ>^MPyQpppC-|Z{QO-nB z^kV}N>;TT7e7GXcL~&wM&Y%J$;?M|-hj0D<>k69ME|+i&0dI&0r)L&{X$9f&3h>JL z@pm{@1@ZRq$_4QeIA{6s<2XcfA>}w{1@UJ%#o>>nYp-yFc=qCbuYsilS%Z7Jsev8g zQ(lNegfx9!8ZmESRc~o;5UE=bnERn8O9KzrNIC)Hbuj$HUbm@FzIIy!0nh!1bu^hf zthtXr8Enfy|c5Ky;OyqeTr>Ipd5x%P)bxRiHPxd~gUxt_oSk5$`#IGl#yQobV>p*3k~!t#d7LVfWSlao z+Kx2HSC25_y`3_LbtW`sCJ~5TX^Z3drZxEbWO&0*-%G6y*j15xij#LJGsh9inQvH( zpJAErXbS$|6g=_FbpK+}8w7L)A>2$zIO^uORi~a$>?R~2n$$HQ23!e25`o&)dLS-5 z_tMnDX@};e(if_y4X!{AtcaJ!qAZC+Hg2k{*T|P~)q@Oqsi9v%p(oD#=DKjwxPDJ7 z{WAeMw41+YFIWeh84u{@O+?aZR?t746r4oq3QTRPH(9#S^qM1BSPe||fph|lI6$i> zmimP1s9QQC!fA+GxBg1ge4fiy`DO%MG$>|2gkBS) z&%!T+e&(x{`6)K^zoi9sX0hKks!Y{;e_Eg^9MbBl*7IOMO>aeN)+0h4MMtx3#|;0} zK`Lykfz99+PgylgtXCR{Kxl(DD5esG87V4P$>>Z(7q!o1(-dl`w76p`?p8+s!{n`i z?m;UzJDdWGjgPc{tZ*jWns4yFl!$U{Y~-e?0*8$+Q<>@F!#Ca#lJCt^fWy&wePeB$ zUpa2+nrfzQ(9SeBSSPA#nSf2HE?zd_jN_p=cYwhsBYbZ_CBDO7THpew^8#5-qv6&a z0@{fBh+t*1bS+%;ZSUI={9e#sQEn?z0+GTzqEe;D#sa{g_N+py>J<}W>6t;t4!9o$ z3SdnoY#{MSIJHHOPGj&h(0x6+fU(kSZedk)#y$6B24#6`q_jHG%{SBf``vr6Vyi(x zHpo4K5g&dQSd(m^2F8+`$k-CwaS0)OphjblyLDQol9TugQ_oAa4|EQl1-}A=-zL$S zW+z3BI&=vDVH|yFxOH?a@!X`Igg>pAoIJw)QZiVW5EH`T&fc?Nerw5Fr5tQh9@(sv zLUA?<%!*NYL&$`#&&q{pxjaD()Kr&|;@rOY;|}S{%DY%Ws)!=ZFg?>-?d=a|X1@a+ zb8A%1mSesl{D|_z_$max;QG6x^R3T%#N8*zKjOjJfeN3?uU1+e<9}+W|1;5K`-UdF?GaXdcjOi}Oi^6aR zmNazcStc{5{`9}_Ak1lI8Rml^oy-MY@5CFa)*dZsWvz4RtNfbQ-{D}o>0^f7uC`Nt z+xC!(=hIH^NDDyOEH*~_&15YHgp6%nex%~yZI++h%KhsOFPCLEL!U$9AQz7`-EoXbF0vNgcSV$olq<+a8-}VdZ@mc?X|Fd8W z(%q|DQpgFMLPX(AdKCzd;^r<#jO>-g-D+5gs8NAdrRC5_%YMLtGC`Xiovi z^_#E^cm9F)0t~eNV7y-WL%iof`%}QYAJ$>btaw5GRK`!aWT64b0G=?tL*Lk8JUwv`xAw3M+nHs+1b+6bcQ+low#a6-%H<5q2V}6G@d)o_5X6x?d9M>Jn@0blP!C?Zlwd z#d*{Uny5yRo`cZTEc1&k&dtRvj|eHbN(x9?`?LW6Oh5$0<9K;(q5dfBLTiia+`65j!C8YUMw`nAOq|;Gu&F#} z(x7SD=H$Ya#(P)kb?V0Y!02&_9g?tGaE~Ns=Cd4#cmAYH*zZtm7aPW1LcrO=v=Gkb zhmxn!SH4c_pq@hRS>JV3a%hEWjG=D-BwG^{0V<|yBcSepjfrY$(*Ik)_8UE>1S*d*xQyxtQi}XgVIYAp})3;Y4J!O@^PHF;Ek7tu7o13Woha zSye%Uh=FUvP(|h4-0D3pKE*nMjE+`v%7#BE`&3v=wt=C@a*$bWQe#x9eAx_mcg&kK z+BVDgSJrFv^k&5eCvb|3)Xo&on)+HzR5Bs0nHTSIGS02QyQ&eUEJ1qs$AeSsp%52h zkVjV>Fz++Ty2oqDn0pt4Jm?gmTI}=eJ9Qu3A-o5wV8m~+L9I9pq}*T|lG>ZyvGyzb z8QPRyqkc)1K!gKjGfCF-@|0PMEm)8~QA=_zF3JuMYN>+~%w6Fr+lKsV*G;ksQ@}hB zIJIn)ftHkGFH(h%jBQ?0oe5vBoo$-0)ol(x;v>5=ImdUU573v&{Vp8%`^=x^kE;Im zpSfYu#2d!6O}D5Dbq-N&DMH<v$dbzxSGMsgUeL(zED?{3dN&COB z8UdL9>2UeaSmOU2E?>1$#?j?pLH?>C-{~CH{c~!jd@#;f&|4TMB(bl6S)(wWZK3Wiv-_&J5|8)xN*1!(%tGs-}zFr>{ zRvIQ0S2e^{NRUIad=?&t8^l;x9ld0J?$OB|o| zD6d$MH^CL!WM9v+2PnF5EIl1H$cQsyN;&>AVSsLmi|~rdIK18;Zv`BRZxKFeL0y(G zN(%L|gjnEQhV6cX{~iH6OU;Mhhb+S+TMOgBEepD!UyBdvp8dm@4)cfI;2P;OVlE80 zfK5WiHrEn#n-nu{igEtp9z)UMG)o2Q)91 z@{B}|k{_BwRz=7VFPfuAE?eZOL?yX!x-_hoF_V-iq;AsIkp^9~Rw$(C)cNCN(EKDp z{Ab3=HSU0%^L%{Ku5G4>i2;rWYtBH>o}3Xh#8Nm%)`>TZkQ*xHYYIbn#@HglKi{xn zTE3#{mm`Q4;L)e>VXvMPc> z(Sm}wvLirMjK0;Ca7GqSktzWzoO_0QA#N1II?6#nq|f_&n-8CD{64*Xzqbxa?8xk7 zGTZ=;luFI93y{%&po88P@4cp33w_RU!ndh1I+DoL9IvG)wGp{1k7|qznwpyEl=lY1 zR<0INNbA=o(T=%~uylElXLi3*S@<#}L#cO6^Qg4VOJ`SpIl99_$-hay?_$`+GHe}= zuLaLr_uu3wRghFU;@_Fp8D)XeLAizEina2)>-L-UtVRi(>FEtj$?IL z%%ub80NfqzpO|;)|FhWEG8#VDUrYJ$KQ@>A|6dmS-)mc?X8q3)aWi3s#864<6r@Z- zFo>nGFjpZ6J;GY@4A}IQm<{n6hCl0L zUTm2@*wi@NGZ_=Ec4<1zJC2puO9*FLWoR?8CevfdOS6n=ocsBUon*XR1VF9{i@6$Xr<$~zmyeAi1_dOKa%w&Uso_?< z;TVPV2~R`5xoww)Tv;PW6MVHu>QCrO`OnEbzu4(Bt44avakhyzm=PiXgb7|9%ti+8k z)mNcXdDeFpYH86~T53);PK*gLmSB!yHg$RnR#Y=yT8j~jTIjI5cnJv+WMgHTG7lyE zY%X?D?ogqmu~?33H?S|J)}1ULuCzKex{w9GAk7krvfU!jQ&e+ide!|QMG4h~omO7N z+MJM4g87V+6;qO3>?>3!S9KVZ-&}-l76Fj(*C|o}#)YwOIE7$OzNc~*peHQgtT`nE z?yta#3-8UOlABAnk;Yqa4$f@NTY|Ei34S)85UH2&M%~n_Wl^cgXbaI8FN{T6jVY>z zq>fuRBky7^G?x#W(6Pkn>9rP_+8Vt+;H0%luzHlMtlF2StTp5OoC8%?Daf~lEsQyJ zt37a!s3I;YLXDu-BDSAYbf0JFJU)tzj8 zx?i;`_wH8=cZxlQLanC8T@iUayLm7{C|I%scA;+nO*}~Q-WI^uJn$nw-vHrhTtiVK zbHCDMYRtVnADeSZ$sSvVWxMxR0M*sFyLz9OyMF)4k&s!FEf#!gQotyrE_F}&4v06! zJ~0^n{+Fgv{f2TL`f8UMEXP<0wkPhkDB$fyYSO!E2iv=1hkNc#kHX1jVO)aa^MNUZ za+{_s2w5IDBS&~``Bt}kuPRMCb-;}WP>uuFF78}6y$ZhEOLyD6U5?(U>yjniJEsqi zr=YTZ5pkiIb@LT*1-$c^NtLTElhI07{q!8^sjBNv&SIL#@3jlPh{Gf^)Vw9LeeM_r zs?i?qkEZgnC==Yoc|eN%|Sny!wIvT?n9hKwG&a)IF~I z?gRQVOR7gf!gC$<cV>l@?*fmnijaN_dP20a??Yl+&Ov-(IZi0x90Komr%mAkSz zJjbx}08c0xhxCNne6?oS{Np1GLSHP-T|nOm^|^TI4?b9{`qKIR_CQ! zpVAP39Shb?EVx$yuRngBn}xe=#>+L-@~pD39h}c|z`VTQC*=kL$JKQScQ2*$K8x!< z>?Y4dtNuU*hj>Q6Y;$DmP7s?Qy8PWBH7o^1W)(!*h$4g9cE8^i>q8bY;)Yws~gUaK4&-X zn@vucPP`Ixf%lJ~8TUldRpM*gd%Zk?t;>jj$}53N(v4Jc?48XbUZ9iBkd{W=;*AaS zhYMdfHhgy^($kGN+azKWb5vyOK^__JSMGcfgq+QJOGC+by3r0SR|;LQVof#?uVBxJ zlJfy48tx8Zq+_J}Yy5u>0tE`zsLU^IW$Tw(`2RfR{LlG1U#G6Jv!flr{C~k3iqveC zu~kuglY?v|*b|jkUy>`B* z>RDxF#^yNuZ^)Uqu^e*ePOd38Kn~(V;j6CWuOX+$w9|CkD*x5zEA}ts7rKBEhAJXl zLF8iXT5M*fPLw{HBNKPcA!=I4{Uu1ff%E)Fu^?!>@>VQClm(^}!^w%vZ~_?NAt8)5 z1~gG7(^j&OWRuZI4Mgf>SW!$Vsx2kNR7~!gT%W!4?n?5z_9W>--1SDs0qFd(d{tNH ziL|AARAIr=xJBkjor|>Ds!Cm!hVTgEBV^;|sv4OyQaww_3{Gh`Dz>Jd(M@8@ZBm*s z@yr*yX{);now!(xvESKsdE$3=+UU)I*pD18_>C? zxfdzRB|%5+WbtBquaZwlG(kX5LmIWrHyd#oX5t=*Gk^A7iGPl!?8)12kTo zJ2<2Yqq`KPSsiCIxD2p(*N4fUPAAMv-MkNYq=4dvBq2#b9yR@ttr$%io#Kcpm0dR&(9puPr=On1y^$WcW?f^)#3PeMvU&zxqd1%9yTkG0rv zUNjlAv^)=q*%p;5+s0W$(HT9|=#goS%Nq77Y-{tPMnnTe%c@vjt4$?4PN8_VNVF;Q ze$?T;FG#Vtnf#Krci8;4LVCP&osoHzgR)~s37>x8p5g!!4yinxm-fJSoJ9rju__CV zVHY^|IF&wy5WH$wR-RZwRCd+l z`;}%+9W-_Sk&BzFXaw8#!gbRDS*V2e=bmW|9n<^bUB2cEho!1TM)AI#Wdf?-s?WJK z=^c$bPh$FknQtv zIR{n*+&WKDs|&yl7NaF;{6U`OPV85H5RaW=0z%S(@Yb)zVwiIxj#YzCKP9X?Je>CN z1GvrM{r6t?s2pT#J<9V(-x;1mVN<>u)0%Zgj-GsIzE2Fr>Z+vg%hv zH_QS24)nkHV(z-WKM+V%I8?L9(VXSxl(>TW@gi!ao1TT~OFOvXHU z$EHf~s+RT;^PuAAqTqa4Q0gO=8HuB=RTV?D;J;Hs2G9l2u{iOBsSVFgL4vpXMj%0^ zbGWo)z9GLez#v-VXAj3kz68Z8sLj|HwQ6)&nFlsC2xey;w1dfh66C+jp5STD-0h%* z@Rlbs=mxjubc9l9TJfq4O+T^0t6rp^l`L*;Z|%lpF%5UcRh*pF7{$`Vfq@85Wld%E z;oIl>8K}zoX7Oxk4-u<6Z(FGW_+PAPKZr%h;$0CReZ?FzzbMjYicCJ)^QzM@?(>KH zEQHy+aE5{!6H6MShJ#fwn$b$~R>aZAt?0Qp$5n){+7sr}#}cXG`KNqe5_;v)X~Xg? z(Ruk>7V|t6W5hlmJ$S!LRQXX>)&rsY(iN*;8$A&GwAs>AZl`sAF}}l?xyR)4k>97Q zDtt%Jy4$8qxnxR-t6TKsJC3TBp2;d;Bow`>aI~xs3C!v3XN2wJA;}m{TgEf-EuCrS zv$?*RV+{Uow=ZD*Huv@HUMDEF`s?oBkQqEAi5d%N_KW$;-Cd0^;NpYvR0aM{Kvy?n z>Ko5XtoHJ;3tdrk_^)d~8@wu7%vbfFgZ*Et|NkD`A^IO*1HKYb?OYs4g%T#(HV+EGb6 z4LT1GHli*?u=Yk{N6eIopa4lQW!SnqVf~i?Lj8^1H=SqRg?YFUHt!YG<`Vi4z+9u7 zC}mi-u|#F6Hrumzic$_s9G5;zX8rUf@H~~Y%TeK0WR?AKoXt&C(k)nU7q#mmF{r5K zZv0BepDuDLqxlpSgJ?C6HROZ{m$^|opy~=-x(HA<*<_Y*)&z!VylLM zhSm8JU&_&K9hN^JJP%EubbvWv(yWO0lj9y^7)#c~Li4t@u4C}|hZuA*=3cY=m1>@h zNhlV5S$qD)MWhwjQZ1-kkvtcr*`c1t3^(MUuS_VlKkTz?ndz&HshH^-t24n++?VEN zb~eNnj=42&w^#>2SY(I>YS+jpgmq;4VVmZMx`J`_ZeD}A27-sy(((Y2!QG!b?ee~* zwdtB=zH}RbEE}7_Cb^PEyKFus2}R7p_F!Z)!kmLgqk%SckWDNbq4lf|9_`h{2|Fcd zJS#ubo|MfE*P0l0!TD;P--DqE%yQ)#qb3l-o6Y71pYRb_7-l58M&yOf@32Uc$3GE6 zvD6`uuNYpCLpVqo9@45xLBS-=80!*seu12#&t2O1?FleGmA-#~U=cR6^?isSCZ)-(|^IKcgoO4WN$InQp zV$D(Kp!$q_Qx5)vh~ZdTfFK;D1!h-FS1QJf41 zn8m;8xj*C5d3@^hd~X$E?=uXDB5W`_5ashj0c@oJNd_J+*jm8Q#gf$|uk^A?jLKRw zB7h|Hl;r!k^pzx2fi-%wZ$)KpACt42x%>)->i(a%{O|l}`kqBe>Id%Ir9$qeQ$CjH z)$Dkoo#faay2vk{9lhIVe6)o(hK5}A6HFy}^MkXNIOxoEKcQkUL$q(?GOP$1vsKQ@ z5#CShe2ig}Kxi`y%BOxLTN~=VY?_F*nYV5P;4?E^5M)vq{T5Y0h4l)vmaWydrnX>B zS$_T=LnVvUY3sbVjQ-DlY|dglqkZ8UKfXYv|MPxu{>R1bU%T*cbfZfH#vpMiiI4m~ z`%i+v=r<5a$gnt*pZ&~6dWikh>7XS3FCw9npdpjQ(=v#aHB#kG9qXIbYiO5L^H=i# z+eliG_^PVre3y=8SGUdPWx$H-%G##wdAE(O|KI7Z&-XMQZ<2bemrt*2zpJ+6KUq%4 zZ4I&ff+Ey^Jn3B)BI#Zs=nv;2@y@n{nQ+P`Du@ZVpn@4uWgejXo9!${34~c0QUGKa| zbVgK{(D}c*X$p3J))Z*#!EWhe7Sbd{Wy=~ASuqAy=YUnv@u#jlpS(2Vya~ zS9XTO7Bb{h8H)H-qzE{%TIOzA=fGN<*kWcG-!5|oXR!G3g*=Q zWLe}nmgZ-&{iZw-j-;p%>jjAUGzo78t&A;XDbfC>G6_49c*&LFgk6bBwHRv)@Rfj8 zC6j}fG5b}FXj3AM=__!4?M@f;g(Jy`d=m|htxAIvn<%pUG&B3^(v3b7yCJgT{wE8f zc}|RNR7sam*C8UKGZQ`2LkQ8Qb>Wj_eBZ3=yMq3cScse zen!0+K4m7}KJ_hr$|O}FnKdR-ezQjkPpQda8?}r{GA3NW)2OG3OnVmG*y4qCmeA(z zWDT2)J8g{BN}Y8iEC%6f0WTDidQ3&*npxMFJ$>vwmiS4LH~5oZzd;NT8|_V4E+^*% zy$uMkM*$-FW7m6>qIs^(#I(l6dl5L_6w@mB)|sXB(PeU3pC93il?+PE7lr`=$BvNm z3_lhspDIm=Pl6C~AJc4Dv)EDKtq%}y7R4syHVG#@@sP?`Ia38vR1KT+<4POYZLt$zYGXT0>i%o^0WcMTK7-q9!HC``K}6 zv+fXY18_4H5F0di*d4%}%xUszj|+Zjs-foSvfb8QfBiFCl3Z+$L%WQ)LA=1hnbE{f z`mIw#)BK|xAsQ(Ljl3)v<~mBa6ZN51w3~L@e^H3cYba_@561V7{IO2hJtVeTE6*~m?#T*{CdQz#OgKk6$2UWh$sXym=*D966bn6k#8JPljEglq@! zMu!3mrqayW8#KSS(BLCHEvvuiT8VEG9=4&8cpeI~JgtM;D#uvQvm$ z{wm;AQdT+^%~X!)>XZcG*U+J8`BC&b$S2-^J4|Of>6>Kznft@qv}qn@IQLR2(HY#{F-+eGXdYl z#5xHxc_JA&6(WZynS*gx#nu^+hOIs<0uQ!G5p=*}amS=*cL&3JkbF(-qxMLWIfwQ9 zb;bNb#AS42)tzcNc5q>C&&!VCjE&23vi{K67wx>UL&k7q=23aX3SM)F7PvAe3*K_) z8OW~idndYcY$yW`P>|@a*)YC2^bYpd?pGBUtefir zFkrz*Tbyro>Y%RPK?l|xSs&CP3n*w_vz|zLLTjqTd@4|NAzS%dh)~=%f$NVDe)IHb z>+5JmKeU9F%^$ zVBolDpe0LhBMmlSvSIOdZj5vsx@GXrA3r~dflul=Jr;V&W_dd94#G*u7u$m|wLy-z zipDCi#AhoN`~a8JHB-z^fST}9v%4KA+noN;2ecpmF}s+lV&+0i61+G)iDn3uZ7G>= ziY69LJ;1OoMAqhIwGL-#_HE1gQ@^Fs!io(Dl!+t*IuWHILW4jQ#-}P#2!wnK0|%BV zoC&BiB`HqXYxhqAw6&U+_cM^&LY{|-2nXws@AiIv6KgZ68qN$8GSwCGMdpG z69ad?uGP*?(B+glON4G-%!@D68L?a-Wbh_{@fQcwUUUI_4 zTw^cZ8_}!MK9e1`z`ljXb_R`%QM$h3pX$G^{yOPmO&js&5WgTyKY#rKZUn3^B6M`^{C=U6c$VwLdgzir#rZOol71jf)1uxIt!lpYL>RPoN*jHY zfS2gCVnt?&-hZ=e02&#Oopj>8t;Wm%6I&h1D)CZmuNg^kL6k&?4P@1LaCVfojiD^% z7t~nVIIM2;Vz3{0J^d~FMwcy&^y~SR)~mVHoh|da73|2;ejbFyPU^sdaIYtfeF#2e zZ%^^Ao8)45PBGZi0QE{KvA3!(@p=?}$1>K$eGa&KV(9A`Gtq-#7JaehR( zczA`J;udNw@Dg;D(b?dHN3gnl|G+bILuBCK)I-GKY`}?(^F{{&YFUY}NgyV=F_mo& zP>GdJewjzHCF51L%~ONfaew2g1|}cp7L=i0r3amT88ILuYw8%M2wR`eF7lks;9(2V zgli|STHC(JC(~Vb(N5sfVx(RKMeB+uHUI19yzq*$l%f}fET$>E4&o%S91unvnKc3_ zV88??pUNq9TbWe`>=9n3tE5arPqpt?LHnW|zhp37e*mt@LgJW>R5_D9F~gdrzyZ@s9*4P!J>!Q{oX#OvX4%HW`;}j z#vprLidRhJ)!O#ptEHpMCBxh;IrQlI2cwpHil8H^_z`w>8khGOxa{z{A)HwAz$5v= z<0%rHbJ7IaOw2I~H!=0gON#K+XtW*nK9b;+OJW&5TBIilu@Ge~lFk)W4$LPEpoHbD zk?uM>_1nMt7uzgttvcSO6?l@~YB=f~bB>Mq;G)Mn87JwyUYHThag};GcqM3^t*llG?#+dT; zD17Fse_`A+rsMB)6Brr&eT3LO8gM4BUU;5GdjHhaspE%eeRJXx%_%84fpNy7o(VjQDEKlk4M;DvGw)AJjoT~*`CD3cl$1CVj`ho zHh@u}or_!%4{waH4T-%OY@ai1sc}lDLEr0TSWyw51j7LusSEcGb$9q6j?q>c&OSfV zw+eUpYADUw0&7WdauDoFZJ;fYd#4;Ho%0HnSw7Rg&UFqrugqH3?^Q< z1WTM`m2K(Des*4>`WM%qMsqcM&i65EJO7j}m@@Q)FPicJYfH&YEhB6$21lz>pnX-% z{CQnERzb6A8(a)?Xy z3sk+P603v_-%_-}+|!D@i^{zDXjML@X?v53F`ul3vzNe9K_sLqec^Mwc;-x>9Lk3WP5Gr<*9TZjEJI#XV`*8R1`cZZZM@u_p9lX) z%>6LXBb)*~Q*%UOt;OeHr7oG#Hcq-@eL#0c`N8?CEGM*|jiURfJD-88RImxZa3pI) z;-fBs~SZd2$*>b zHaVbSz1Xu^bX#P3wXAk5jtWLQT_Y=$|D=XjwpEtg3Ou0q_*EQ9LYj=>Z4;G6RaXHW z07@tU7hnjL))TbGe1)cNxp5 zx+Q~rNuTEdo}vn_HS{#!Q~n$7s@3oJJz*7P;)GY>JC6_JMZ}xj8CxFNKUQ5(o7o7P zg;?-y2DPEzu#<%O}dC@RS{n zLU85h_iN{!osCKu>WM{x_QZRsFZ}nb510X6#=4PiuK#K7Q!MD=)&@RZ(hj%g~ZFBP_J% ztI32~`gmRWj6-jj9+A116_ZyDmdg; zb~Yy@VS21@C&2-OELS`mJv~KH9T!nn>)@rBZl~i3na(b$)fWP-p zZBkHlog&!u^RDq@m9#_gG^OYv$GcWKLpjP-`=xC3^Su&t)MA$$@wM8pM`M#)qY%EO z0tzD;0DBpgB5*=RS)~o9Lekqh_A79J?^G+6EDatO9Oc6gPjp}w^cURn^cii7div7gAiFh!!?Ko%D+W#A zsYM=Ivdn^Mk`Px#s%^q}a~m2d@qW*$O-%Qc;B_7wbZ2o{gf4*S&=vEGik=^X&J+GRQk!@~p6!f!dOG|!?LX5H zF$@p++qYcW{|SWS{m(!+3m01>fT5+0h@rFLzk#@D)o3MTb(D{4k>sExe$j|V4HU+~ zGb!yzj6o?DDeTY(V znYQh==gg^|&%cidzh>rYYmIi*z?nx&9N;TpTWBjy88E!A7`(^qQw+26dhKI(eZi$E z%x=CRXs++n)@Zz?=MC15)ehB8-M|gBpt;gqKo<^}wdmd#0-$743e^$3b=|Q1FIbwa zGhJ|-P08sQE+Di#@?e{;p~B$&1urpCvHZ&l47tbQC@pvt9;++PxW`|r06$+v3`8<; zNwqt&FH(!~p)==;aU^CMEm}sNU@n(@0)~tA)qfx#6+x-K#aCMtShp7qr2HU{rq*tx zh!8PT_2SY&#u%kj162y9uxTvhZ4!Mf%cZgIbjv?bRuBbGzZ^`1&PYGgpltJ9=PV`V ztE<3WNL2YE;})A`vY7%n4+FJ3$c58dZX|l?r0*vxfEREx%7S^M(Ta)hR!=v{CMEkD zF2a8^%YP?k+msr7JpSfUXE1?hKHTD0B4{{w15rnHQMtrsso_nSDeAp*P#tboj;`kC z%$KTJQ}plM5KKJxBGd)n40nL;ZYjauBshb`=G3XXCFHATjJ*Gm;G;b-Jd)br@EzUO zq|U-PyGa@rhQn^3Nf=BOW_#5=ikz)`1R?WH9Gic)EINnKc5%nC@IWGfi=KkVM?83> zv!EA4KYjtIH?UgGOI(ch1X_RX^~pj8huU3FXM!F(JshZ^d3|+R_Dj#^j8>T3ei$wh zc1aj>Q6KRc#EtK*y3j|C7w3S{NF!|9ju><2)R!dziErh&)*?K^Impqr=R-I5w19rV z67QNgP~Mv5RoGkbb^};|abMQWd702zGSfSQa}S?d5W5TOqqKl={6Q>h4C<1|$|LBb{aT5S!bVb# z(GZBwU=CdHvDnVt@9w2Q${^)}(IEV!y*sE2QAKgU)-F`FC(rj`D^8v@y9B>PJK1?!QlQ0%zy?+S3!l*5qn1;JxL{7)6&|28+!#o5xv(%I6~iCz$3X>0fonNz{h z&fbaSpQnn4{eMpyhY)w?(-fdLn^8SGt0; z0wk|Ti>J83BZ%1F!z}XGwDd%qbJM+w3e9FD6=e#kssEYDp=N`*<6X%|BpKi0y1n;o zasjt-X{O~NPA~#lRr!#oa2h(to2tcIOYfAQ3F(g?Sv$Hc%R_o$xDT@k9yqUxH{T7z zFd*_!3kWZaGhzAvABmp-xBQ;})9U}b2p6fpx&7m505AhelCgs# z;~jyC{FsFGpHq8_gTw`v3X{i@3IF(wM$f!r@1Qp=Q`^Uf+NgzUeL7%O*HmQ@j0Q@k zrj=r=?ojnH`?0)j)uHBh*3(+^Pd+F%AYdnkyk-MMm%L zBMQP2bo(W1C>y8_v_YYk)-X$JEmaix;h2m7MOD74qLk_! z-eowb&kJya^Dfdeiu-VMwpJWq9$D^8W2?%xcT%rBZ;)5^CLK7smoc?{F4-Sk$EuS* zx^cXVO^d<^LBui(D>M++?;lks*a*1#(2GER@!BhQ#)CcEhs|nNqA%0S7pGup3XW22(gz2pk4Aj+o zvH=q>U@X&Em`wH4HY~2@ZEG7h+CV6fD`mJY>chdIqi^(zzE&sK)qZ4KL`jnL%|a&= zO?Ot8vqg7_FQb~%;xce<88h=JRMtKQBgI{jD|h6}dAB?ZU27}5mC#5U^{CG#GTavl znX%kY`ZN%?nwjUxwa{Gb45Ux$5PnXnG!B=^m!&!EftuXqnaey)5m;xFyIc|;k=N9; z>*N2nw(dqI@nUgCwQ+{yKkEE8j+H@ID~4lMX|kp4B)+5iB}cne z`>B_=Zyy|)jkhhv#>}-s4Lh(Hum=EfGr$;c*2X&Q@uH`rw}()$dw}o9dPc?Du%j;e9|uCue*JM?)=@e} z6gDSkwLb|(H#h;aApzlXsNsh5uF*S(AwqE&4;?u!+OWA1loXXS1Pv=rTMrrH*Dyo5 zmLWyl#EBwXdYo9~DiiP!tP7DsL2;5GZj_@i({@oAl4^@-S#ePMohfowEXc$%_m>?FJ8OenFQ+iVE25Qkw-w%mDY_v)0^AZ!My}dugKE>B z6ttBTxO)1h`I;p~t~LGa5p^#E+jV=^Bry2t4Ig7aFBB}@EZsbsitH67hGVWHhip4G z*%mYM=~(wx=3j#DK{lXAN{uuP7tqIdlQ~-CR*-8Y#wT$N-HxUoUC*5#5ykLTayYmo z=n#zeu&NX9xkzd8xz!G{l>;eZSuWTrT%r$5f;=fa^k@b&)81T-F}2GB&8e9rBe?yE zQ8$1p@{TSb`DMjk$R#ss-NVAOEqUGu{uB9M8j7yn{qU2yNfjKos{|*o8=6%CL4-yp zlvj1b!wI_p8flKmnAz@n!C-Zs-tb{OykayD1<1wRK zEZMpU3QTn72uI+rc8%ee)j#A-7To+P?-(5EoW$g_^WDD5&gg1^ z$te&=C{Hp8$to#DMmB6zZQ+fLXl7nC?ofu6nMo3Z_GzDL`feqGNz@|_DFfmuTFc_9dkT|J z-t$k?C2jlU?uipWmwRGh1iDn@HaxV2HEjwyd^cEKv%Bt%20LYFeei&M4%Gf4Rm|k< z4S*95RvxKQEH7z;YuiB3Me$2!fMZtQCNCb0nFVYN3Dr*`t-7OY3-O!veNs?N?Ih+f z2{Dbdi!9N#mEsJj)O56}wj4>J&{X%RbhdT}*K9=OG&{I79Ebp6ek-UPojZdygbcl| z%vhZ;nyMQ{EE*Yb|BiSyN9Ov}+Io%ZzsMZj^rRNy=7axr{&gpRj_Le++w#4-WSK?c zm;EQ2wvR|6?0ag7C6orPM@+>h zPamzQ@Y2n&z25l|nD(pcHfpEk?+vK|Fz2FznX>jKM@>TTSa?4 zgMYV4Cusen<0yD1ZzH){gAarp6&}8^ag;>=qaP6W;%9b~ANYRiEDyG>R?oq7I&(KZ z4CUj?Gwy19(kyE#nHj;rU~hgT80R}Yy2cyAyGMFwV z(k)ZycZ5{%BxYHm_e3nY6%GUIyPg28q*4)LNS3pfph)L7!HgsmwCj1Q$o$2-v`Efq z>YfqPuMKXMD6&Kto~vQ?MvnOy8CN0l z4}Zvk`@iSVMi|QXP2S?_rv*2y6+b<`wi5?r$-KVJA|E$b;2S@zlHZHv5%f@wl2Yl! zZ2ZXaJTjcQry`FWU%^Sb7xaHB7&0uYp8kdM!wsbOTFYhZm5r$FOj$;2U%;_N{F3;TOMqd+@G zAqP|HHEhwRJKx(a*L$qo#8uZo`RnIDKzM_ZTaNiH{WAOZp#HBx_ZmZS4QWvK6epp$PBY-1W5X&JS9Iq65!oNpZ*v(Z`z(Fc4@o|5-RZNVDN=meS~Q zU@g(#GY^74H~6xqvqwWWjRmTcdmE5)(aG8HO-m-XT5xl^f2a=IgTWqIZqDEZw=q)Z z#gbHv<`4b>ig1fgW`b0CVwd9(P03Z}uHXQgcomkTM!#}b|Y+DnxRonq%_O(q~3V&}h@ z$N$H7#X&sV`!6%+ot)cr!FanbM6@zLpBd4FWFt^t8X>s%g^*-zg%* z1?sOm#?17)hyz=q)3Qv<&))yU`lIS_rRO)+>;41QLG*|Ip=|u`KmS$h;Qtu7O8>su z|GU#VOF>I!kr$b(L1(Kfi3Suw4guj=;P^!0~b-VvBrqIng`G* zxM35Y#9L{NWf)x|%Z3FGm#a*NqwLd~ogJSas{H~;#FMF``_VYxg>ph`yhDNrN?eQ3 zn+&!&d9~zT=v8!)$r&7;IU6|7S{@Yg^DgH}R>7OXv#8JkQl}9tTU*Jp*RB%&=MKHwCj- z!t)7n$a$Y%Wa(<942IlO-)^}xKzLqgbK45>ANw}9z-#jEl{jhB7L>oGMr$(*x!bd( ztPF7Eg&m<73DI zW)kh(G40{epOvJ7E;0+9N`2X~bA4xOMAZnHZ77aOgxcblJG?cI4(Vy0K6@P6@bW!6 z5v53tFq3MucHfnBZctFJy1H}u6fKjqpFYA+DRky~KUYd4j=Pbe_y4jp4-`1`ldPC= z-Lk7hbNz1bl5Ez*{~IEsI<9+hPSN_x=dr;$_vdg#TSf|D_i9S z`pz#0hW41b>}Lc$%bKjH3qL@|4@B51crNKeKjbFFq}HXJ!6|q|6ODfDC0R*9x2!0? z6v7ltL8k(=-zvT&sgaOhJ+E<1vkV*e8N7LH@Rt2_O7TP+0dX|TewrZ}mmI3Xkg>Eb zb0B80_t2njXGx+ONb7h0yI+63Og_@~*M4iNx34@oNeHIhk`#NZ_fEfKW|!2ytfV09 zNdE0Va|E1QX%B3^vCaOiiT@vS{QoAl>HlqrXC-bZEbt-^_goU!F=-}Mum}duD--0> zOU9w|0i4c^KyKNjoY#%S`-#fNeTZqChQUKj{*sL}WXSq8&*NuZWoLT6UZymVzJ4Ab z)BKRRp^SjGS1Y8Y3F(aHM_rL!y#3ZnvP)vepf@t@h1+K7F{^C1bgLR~*;gDHZ$bLc zrwvMbsEU*+?dn}aB649wWnw54MJn?7t4aqCReEVE4+c#BI zrAvzHFR@dT&tI}_CwIwyz48g9@=e{f8N6*CSp!m|WEX|VTy?$Kql}Zqp~GwpJxiym zJ8Q|T8rO^gT-TQ;H;X!71jbdK<`rieAxwJUMj;A7$(LFNXpqDx z8$W;|6=jO+4h=Vl=h7nKN6^K3Hs}@C?B@n0%jUJ<=lOywqKPLOXVZTZZidXY6i5nd3YSI?i z5HA*Fp7Y0HoakaH9SAf$38Gl2uUM!u2ZLsC#K0sg9Ae{=a#c*R`VQ05`ZDwIizEiI z>7uzslX}(irE|`**2YzV_2rc_?&Wg&=d=&az$9(qRy$GVJI}Pw_FuMR8ST%T)8kN6 zn4ZI8)`kp7RvF<}YiC=(;UFPL3T0J;k{>A#-g#Y*AT?d=>sW6FB|b>T$}E&FCCjcTDec!O+Q{O_rtuF|2Hv7MN9eO`88S8>&JQDaIRe2i>1hNrau9-c64)Z9n0Hs8fy>FR6xdB(^s z<}AJ3s-0*7KTDP?)+>(SoD?aIFiWZ1?`WSj+Gjco$17)) z$0lR%MLwQQ+?+D$^SDb!W#;t(_v;fBAodVyvop)3)r}Nx{M#3X#{Npc^7^_@UE8C& zFTwZ~nBZlNVcbIr%7|mXP}EN_96UT=J?nozfR&hp5G55QlJ;$kZXG(x>$2y0{kkO_QoQkWU+fK(}6b+WyB?L)$HngeH@1rx3$V)2=SP~dF zXoxbCn=n?^QarHzIllVxk_)X7?%|29=@Ep$U}}N%57KQQT{2_FK4Et%-69slPhnOB z75-F+g<4U!j$yC7LK=iHKf}6M$&yyip&c~l5l;vPMCFosIFxFZ0pt9r-#y)W90>&s z^dKF{52@cK4Esr&K`=oi5*ZnyT_~&PA<49ji0Hvkh~unJpTrOUQ-qg}kg1zlX1rh| zJjI-N*G)!e78`KU=LE=<~5KJvWrD8qu}&z*vBkn@)`6Ou9-}h2tk%D6#s%oaU6CsZz>2^D$AdDlm#_t?z~Ie zCIAh}UJJoQ^gNNrI2iQp=@-9?i;DmY^G!vWLWN9_?Tl`7_ICoKqIm7;w$Ur1I9nLvD zB4$B= z57C%)v88M~{`hf@+xw8m@vH`?bmJJ9r@)3vidJQS9qazBWMtP(VKG0OF}%W5~F$^?w&Csi4;s-`USFC=WpihQoa*C9&v*93(WbA zG7nl#LGS(GN0^KDC)&e^Au<3;#B)-+Gnfyg`~)ryUBuU%bnDK;2Tk` zk?I?>mQE_^s=jBhZAeZ`z6cXWkF$bgKK&RSk?Khtg0LZqjl>jic-2EI1i%&V^erA0 zs}i9n1p)wc0s>iag|;ak^Egp|a9}g~3@4xLHY^)PrI?-yO@tMQgr?Tmo4jZR6MY8CxBLwkmmM$FX z=eST|_M9VuT*%l^oA^7;qAPz1vw5nsfzx+lM-3uf(gIU1aCmypi(*{fhS}nV0;M%c{65-UNmJY}oZk2E%6K;A%)9@VTo30g zo&tR(N`r%N_Nt7Zh-cO4<9Q4BE_p^xugrUA@lfot1FbB0N7>B23V&rzdw_as_eyy- zOzY%^ICTf%EWRptOO>dc8fDp($S_c)alquSo_T`rl-+B62xVO#c}Yeb3$MIN@YfQ! zOf9_P;M>>u(m=Js`Bwj_Ir&hMJF)nAbzF1)0R!~@3X}zR6CjGohLkZ3jv$H-I>eECa%b`N*G@8tgK_liD@5Fbn73?+%V`OQ z%$a9miKBOT&hjgOr{K1More_6E2gLD{{F*%dZ+kVF1fi{qs#u0{DXh|f?_sKaGg&7 zPfq~5Pl%3SW_4np%TUH_gi4qQT(}63_Ma4{uk7iXn+gmco#T}kr!1ddn_cW1(r!}o zxv$9#@8GgKYJ~S_X)%nyzZ7L89F&9a?f8n@obWbahlXx#&KU78mVFYBGo@8#N#)|c zdV!^1K4nW}=8_~$KEuxNqw6zP8-Go@gXd)*oUp|%98Z>oq8DDCE+{>+LAsxX9VTW^ zyB8-du^hOTCK*!kIWufW&!a1vNvoqDw7#v$3~QNDPoA_Z^;o^gCf~^|H-xus%~vci zm={Dr>!DBo_{*PZ4#zi<^vKmFt8U+k7pQ$Zd4{T^FUYRnu~E~K?oO4aUi^6E7OdW_(Q50Vlk`Kr{n7RE-A^@Q5zc z>0-Joh}-Jd-5(B)(#P=8yb17jU5MOQ!;~0R69rR(tO8pvf6AJ7FKpMyEYEa4sC-&N zV4-0_M!1=Q!zfQWvmSl?bGNGHK$duxqKANWDwmF?&xkiJ@#9hLO=8h$m1OqdcafwL zK`O)4)wCK#t&JEbrbxEphKbb=C%#QYph=Vs^zRx<=7emwcCluRgYY*^>?*}e%_vKC zl!>*t{2TtaC}Ym><4IItG1lB{3N@NZNs!kR0$KIv<@Ywl0T$ez(!6ES8zhT((B_C{=tQ$YvJXcTs_u6HJWPv$cmmWIx+87)_T~NzoQ*E|2ASV7 zwu8yGz@MnUQFc?eM^}R*#wH`;Iob$H$yAz2sJ;^AF@poO0>?!T=EfKoI5t92_);CK0YO( z?P4QNzVHGn&^YK(Ci@FaK6|oEpHlT{mFvT?r5BMg$O5-BUo19{p+lg8bl`ktnjSY9 zKobYVDk%*qPnRa14|$HYCFb%wO#C#$k)?Gzv#y1v>6us~-}8^YMxqDac-O;Wn@}3T ziltn>Zwg-`Kv2vu)E?K%NLucype9>1v4$`4{q)=!Br}4luBD^cc?h|!r1Ye&lD3s# zio*I0>{4ZL>*0rRr7$?{xPl_?WU;zZmuvXL@APL;)TN4sQXEM+uGD;YSvjvzoaVA> z1SZ28(Hwzg%msdDb!9ZJ`1xh107wy&sqppmJvpDJ*Nufj`(j6@fBt$gMim!TI0#MA zh6Xp7ZNG~wct+y1m~n$!LikECy=A?ZBKfIrg3A7}s>H6r%qg57?jtqzo;pcj)Dgx( zcQaHZDWFGBnken8YldA7Q344SjiQCZ2Z7wHBq)`I^h5RkgbZy!^v{Gqv-aKVqJ3k6 z+yUxDWiJ$@9Qx9W6ikwOkYdkQToaTbQ?izG^Y;lEpmvWZq0+i5=lv=9swmj+f6j@r zM-5GGv^%7m2ffU0&J}Uhp0e4LJ+udWQ1+W@7Ox0CXF}?n+nm(s@=}Lla z(h97(NZHHqt6knxQ|35R(`Gq)t}Jzod|N?PT+6Sds;oCst5A}H+OMQ+gg{*ffok}L zs%*|2Y;0hv22d|r7`9ypOjAOan5Y@y7nUz3s!E3*mOHwcegX`5QE_wH2tC9V2ppXyG7E%Y;;U)mM2+atYOX5=L00Xk*2q0_&+h?C8d4Jh@j zT#vD+Iz8gtPQ3GcuZWdmyXpuuw-z^gBcjz6tl;NtPfGSsDZHk&fbSJ4%(2an$Ik=vXS413i1tD=+j5!P1FT6@zr0i~ zioRqKl9VI->0zNXx=N9>Kmk>vf;v8qyfj6WhSI7mNTdIxHFzySMo+VV_=b}uSd)9w z70&8Scd1@oaJ>p)ioIL~(g;ghW$}tQt&aG#aafPVwh{2|I?qkcf5eSG@Rr75e0bH; z`#htYge!;s$x20)BoMB0)6`&(4(LqRzlqh7S7GVqg?Zskc;r&t zR^$>RtFGvMTJPKkkM4mxD#4OQiH_-`67+$3VNU%Evh;+lIF=)e)CD!#=WLsgiS4>ga^bGuNf1dd4Q9gSD^F_62JD2ewpmDWPpiuam(z&dy+EJ2^CNKbnI|=gC1FD zS2zUYxK$v_wTj-T95{N7r#Q@Lc0h-2 z>{z;Y6mKdSV?!_H%P@&E*Jkc%kT3And^>rRcP0h~*psV2nXAw*bB$tumfqMrTt8Vk zA^PwNVSHkAegWTF-L4x@EUv%Mqqx7pVHf!I6*%(kBQ<)(JG(kd&*Keu7<%S0b(2|r z?gM1zhZy|T zw(xIglkZuXjkPCwOZ+XU=KHPsA*}@rlXCUUdiw3wvdPdQ_eG!{8Ra>Fz$(fkG{h>{ z|k$!Og+Z$jZr# z#=%t2-pG)~-pIhn+R=f=+04l0U+O#~J$*|fKp9b!ivxxl@Xqd?9 zmxBagpU9a>*6jOBW{B9ylhjGi9kv}8>K=z_8<)Qy?<+e%(EH~AW_{t|FhDykQjouz zw)CBSc*;WO#w$ooR22B`JS>aEyX_8R5z@4USQsKSz0+r*10JAs;Mb5Iq2oq>GAilusO+j&pA z@wnBqP^AiFYzPR38g}b*u}!R&i*Vzaa-lBa_QV8uW(MJ=%6MDenv*NO@El8Ed=^Gh zd{%1|2v33fx)*#Q-U%AnZ9j2=P7Q4}1*=#xqg8u@imbsjTWYFu#P_ z4lRTlmgyE;lqITApwVUfNWbZ)#fgM!^;YIGyV*0_+ z#1Z@P^7=Yct6rlZ3DeD3x+&5tOx!xn75Xx?`)+ueF3-8eF1;EFSSOQYE&eZl_q<~$V3fepy`PUzcu;0)x>pejiD)$h0uOVET1pPRpN z{J{miLQ=#2{sF9oyI>=K;Wvyn6>XtJP&SVeI4BQQ-#~K6TcI?D^ZjRRW%`Z*akoMK zGQVChC|1dv#09WEF%uYxL&UOLawR@G2E9Bu3L7c#VpgjB4`@JoEL9m0WMl{dV(^(jKO2&KZO<5qaf%Z?M)hYUg1c71 zf0?CT5aC~vZcxYX^o7D*{o?;)ZFENG5A?Q#AhA@JpVp!=xFI40qpleCv zRBsj41}~*EAPSj#{Hb8ZUg8p>(=G0z)%a|)cbB8T)goHhd?N@t=tokGgF$2)Ig4E) zES(RxK;TkyyfeBb)0!G#(64YtNGD+1<(QeN7sR?D6BQRUw0D{;7lcuOQG&sBoEgJ3 z?WNHpsAa|Q3^mvufqWnj)#?hYnW>ZfQvg-uv)02)62V8Ar~7Bc>Q9P!U#2+(Wg8CF zmC>bKJY#TGHr(Yp=~{Q4pu@%>C#+ZID%j7D@bBSO1$)Ob?(zj(-`cRsw(Icvd-+`- zE{wbAGl9vmUee-kX-dq?si!0j1f;@9@HOoybM{lPOx@9EhE%haK;m+TYXYD%gj;j+ z(Qb19;>}wt*G2{CS*~v&nVzyIl1?uE!M~c=UAOh>)aUy(3;b6@tjea-_sbUh|28FC z=KpBS|5GJn?eHzhwz2;2ifjd2BLe{&D_cFse_i|)BxI1}kiV==bWO8<5~w49s0TI= z7--fGr2Yt7SEZ|i37gnB1*LYx`9`tko5iL%Kk?jP5tL7&>s1i|g0aMh736wwHAxwffBno&!x;_SGundkdd@ey;}#3rNwT)@HJEcY z*bBpx+BEpR-IgJ@80i)}suyhKkR;<#)zdkU8`C4 zrFH>E$v?&-e}&!kCr*3Fe<0Q(aBCH5rcmALwpeTh_LZ)MF4_o_ZL?mF(8d7S0Q%4e zYoI?oN~yApnp)tpr*4$Cy4Zn(bJazs1(wOHL8bfc-eLdGU1WH>Z@+Iv-o%4`pMqW4 z8K@COySPuBkC)FM&;9m{&P>J|M!CY2#3B}Byn+`JiUP8gbk&vgr(vsjqywi>7BLz2 z65VM>ICPUD@By{UzK_a=>)1{a8N}3rNw+iYLTTb~8r}H(X*aGbdDKQFJk8>&_rT1# zWn?`}WG~-S?mO_avU>3y+J|K}{9PmfPprxrR4`A!p<#MSE%&L{B3416AMtvfqynXx z=X<9Fu1~PHk>T{OShYlxNME8=^dYC-3vf!#!hW@`Kb!w7Jry|JPUic5ol5%;x`Y4R z$0z@P2fYr$PL59YM*l8FXiD6%UZ6!D=4ml&2<~ln`Y54QU0WwW;N7e$S5(RXf!q)( z*&<+RQkN-18XEI$*_Gq<$G7VPzL5>xuk2kEw^cwKx@CKM&6*jJ?*9Ao2Gi@%NKUp_ z9YBA@R%)<-f8QMi&fILt2pB&VJR3#=+kwk38(AU?I~ZNKb|f!Odw2*W)juF6fG1zt zEO&M_%AR+p8pnzcG@jtuE7_co zM|baD{2j&SVFQeiL1wj&FJOc>5}qL&yaEN3Wh8novXENRp*7xpOCd12w90{%9oie} z-gDB4M--|UOAJwT_tr?OFh1?GWR}PtKqm3Cj%KRc>TknUOcV|~xCi+!LaL>gBvI12 z(c$I@6h%$eRl7OCsUdcA$NrSIL+GW~H@d~Y>b$}0Ik7t;{(Faaj&#TwM@V)M=pyO| z0;`2K-Oyl|mFi4Ic{~DfIN&Lx=khfXKerCdc;29wzx?|}>LFVttHMAqTKO-V?$uO> zFk+vfqvoVgNQ(8iCaiReJ|Qlkhu|Cvvoa5|XVT)BPwGY;lIT;{Rw}p%wsW)b-5K=D zyud7QR$6^2sCFySZ%C{UuQyr~VwTFPj-YgrlXU*gVBw`tEP(b6ONRd-8Tfw;%YUf| zs+4#B5vck_EvBlPj7Zkl?4LWt+_MfkIM0lqEU&MCChIS>ajVzR28YZ@=7mTSpLBRRVp2;nkMIbl36bwdeD8!~4T^jt?kpjK`;_ zzVHaGu~Ta5!Y%Ak(nEFhgsSWr3XDq9;rfra*cDmX86g-U>;PAp0VfyvZu_V&=Nw}3W}TNdgV&WUOYD(X9}i1P`jpg;bJ4HBW9qhiJ&L^f zgJ{Yo|Kyo_rx$ZhE9NGiiQQn~@uN-`b%F@I~Rpc`3j*X*nG+3K*I}8q|#C-56;B@ZymH8lR_{IySbmv%_ z`Tl^UUgsy}OXJq;UFbEYigYrGy{wq47&lUX0$cDaY*(G zLkEnzuLPP@r#`?@s>98iY11f`C*Gv3L4(*-=~P=NrU86An~}wJ0Lm3}bz=)yf(5^b zy2qLWHbt?{xYXEftBT4>rT12|;?KIppp$%7SaN$wSSW{z{;t{bksJn*n>JXTmPLG&n#IRq%h zN>C)yQhShm5~-aeeDK7bW|Q)wnF6wRje1jF<%m#q5QCY)CDviH}gl+d$DAP)b+h zg@{!an2@{c02O<-%N4M<&u}p-=?@Yi2r%x{?Ak6zgl+iZyWdjl8XK7%j{oVOj+X} zg->7007Jz&-;6+JsR%Jsf(*ubvFqZ-MHoNDKxX67*bu|OPNodic##yM&PUP*nTM{l z-+2ng>(5`M(lgc2!Nbs!B2SZN7jtc%J8KOcZ|^xgUm!OKS26lOb4K?Ru!TH}_Z(n! zP5{DMA~^RL-HUR(TI!T1FOWLts)H;T7@(dN2GA` zDmiM@_2+=_QGC;-}%qm&rftlnyFz~j>6Ip6=_)bBI*M!dKymz8d}Np07%7c z-BA{QR3RP{sGJ>%PAZ&g4h`&io?}XtU z`iZ{*cZC_%t@F$-o-Q2FA9(n)0>uX$%aPd6r{xQmbo9~dNEYJmo>IS$_E!?us2KyU zTB&35)6AR3;ZxO;TRek{XSzzC=oX2Bt0L*3H?zH#9iVwk(r*>#O(-Oyc$ou;9AD#O zx9l$$Cs~YCfsgI_dW9r0S|iV)6-tN-sFJW>)6yr~2|_y7z_J-^A+F6|rhTK7V4k5X z^^*4D^H=OXnw@xV4fbv~Xf(HzuAm)AFGL$O^MQ*8G>UKsdMUU_tvVJV{HfuHAFg3O z@FZMVI6k2Fy>cxyWLhy9DvdTy9S1e(z@L=^R>uWI(50}}5Sj_7Xd1JCZ~fgYX9~^D z$NrpS{^nwOk9N*6V1NzUQGN~XADod{;L<3}a0?Yala05p7wfxej^DxOqM{wcIHlg_ z!q_QE3qf#)N~G`rlwT0`w8iX6rAJ=yZ3smxg0f+61!<>kfqInnOU=2)QG4vdYVE81 zo}-MKpsn+dcQ5hR$58n}tVJxVh&j0%plu$J9hp6lw3GYS9pEhZdqojI$aE5v*2|=M z&BjAee7CiD?Hcg0Mgi#2wZt{Z7-D(0y`q^v)YkhbA`gSsAj<3o^K#?FYs^4C*o#9} z=t3^8H%V|4j-?1$%D|@C1>?s0!TGGSTV&8{GhTXNnaAFnmNnHD+?MT-)jQU2p0pOy zL3$`{QB!m!-d==(FOp+5|7FlwbQV`|-SEJY$^8ZTj|Hte(Vji^dn#=GhpF(N1z7z5 zClvQvLH>`U+_#nCUrXA*Q`#bhIq7dl1J^<_HC4o-I3FK;llkx9s4zrRExJl@`)V7tF@ z&}aiUgbwHoj2j4B1K6Nks5Tp9jR05Of6DhGV1YM`QqSyq#*;4Wseqe`+zK@|pEou+ z3;{0RnL-@gDjw6u`N%f!`F*iEapGr6!DH)2m`5%E`>I?*z_4c7U`F8v>Rj_JUE)^n z{ugXaVcmNKTNjN1*n5*af%z+EG-z5yHJT$f0VZhu{-8)5>Xsn;Eq9FINLV0gVsutE z@^$8vf&s@L@?>GrM~GWW@bcFXdO~&$h7aMfC)gFYRTJ4w$oNqti+KPNux*4e$(UOi zCr@b6x(1p%&xxw5={|xvb2y+*uRz}b019=_d{#Ax)Cn0go=`uG7IRA z)-gRhnX4>@nI8#Rg$0bLBYu9qZC*>~Q1i>BJn%xu-(oIOfS^qXjdB`^&a?76)Koi{ zEX!Hl*s})nI2zAcdV=2k;_I`CW#GntD2R~&p@x_}OmKhx&9R1+SAjWzPLWxTU%t2| zbP%ga0|y$F{y`r5M^Stk^w|Wo7qjq~2i4`gWV?JNO{VV>51~Wm6?#Dr-w#wdal*;Y z(DPP4!bd`KufUeZjThtdoY+s_O*<|Ze@gTV4oe14zUaPOV}-@v{h-+hEyVgynW>aW z>c9-Hw;IK3-o+4a_M^}-3J-?k7bMn277D4tX~stCnEj^)d)zn&P(A;=GGwD6W-5IX zV*mfJr~O|B@xKUgk%E@Z_g==O-4Wc3PGy8lhKnhiYcb*vPt)57UM?*OnP6Iie|to- zY%ZEbF3tX;CWos-7tG%s@?3t*H6U*x9hAMo%qRta2ga*U)~*O~W6YH-AG={h)+>}r!>!EQ(9E5&U_{bp*_7Pq>rZZ_}HORnozviN&3tjK`3J2FibkkSB zSbt>5(P9|ktM?d(;-^~LmOzN%-{GGahFoW+%xsVo91}*zhN@u3(T&pkmb0nb0+OX` zcg`a001^9Z%;0wPL|JKOnPih^-r|O?Z`YhBAkT!{Vm3)PT4G(}n?qAQJuFu_OtWP6 zR18(?YP9jp5KK`o_7)@;84LM70>kv5a-eSmN99TkIKGrpqlPC`17HI`-DJq7e1SXq!2%qVwIAtvSApNWqO`8;Y{K?G?Pc3UjmB5NcmVeMR!u>k@;gA#S^9fa$ zXx&ZV>kX+m6CUFm=@MpNnDoK9MlpD5zP{Dl#OQ*}V(Zt5ad;HR1 zoeMAGzPO)@#`pEfE608LXxgf8pqOw#{O3K_p3atSzIMIf!`&6s`I6rI>pbRb(d&V`ID6$&CB}bAraNFaQv;3)|_8 z09&4|_B&(1IUUfA(7H)Ou^TVlJ^hsoz<+;sqn*^Y#e>fHTRlR%|MH=_H5`xWKGS-Q zwa`pTUwIEUkS@o5zKtp|v88Zwk%vwM!}KTn zDYPGp8aJ4e{cuZ{I51;;Xij*D(vOtgM?Q?>4gW}ObA>dX&LYsO&LlAN7Cs9+gOH59 zBxbz9NHBaP!x=y}9%W!^Pdx{=BON`qKO+5;UlWC69~N_>QY47kbr8QZSEE@S^&qww z8=s1gunRNSQ}o0-x3207j1&@gAsE7*tTacgNwPDM3OawPzlv-m8C*VoO!7Jpv=CP>7%&F?jn=9XP9m`(^X@e+k)tIBERn3C{cf zi-!Db8BwuNK@tIYlYBQl?}MVy<|B1iPv{rN%Oil ztnAFoa5d@pE<3!{ah3Sw|1EsV+Jfihmt{OQGy@B9kQ?`ZEq3gwokE9VE3g zkFtxhDH75tRRif#8M5O0E<2A^-3D}?ipY|v254+$4q#-yGo`!hOv8u`I6YGzS}!%` z?JpPwI!+;|hhncG6{KTP=?pc9tCi8c#SWMKq(+h(*G5af{3KP-uy$Id_w#S&8)l@9 zMx9tp6`7>rA$$rcC$dG4uWp5`k=wXzB2%n1)-tck%@35BhAnjI zqlTqRKHWq^ccKm;c9{#vkExw$W^_I^^M`fTlH4tCgp*T6U27{T<%fELgGTjIKSeW1J2?% z#oaYm-S(p95yNN`_7;~PEt0QMU+cq_f;S>GhgzL1*wmd@B<2s@k-=IrBoW zJEsOzEX>hj76rrTZ$uieWUN8i)CfBv6hUzg(8Oe^qks2<^6&T|KI%Z(Rz{ z-d~VHxqYab7cN8OC9gY|raO`c8fERB9f?Yd&eR_-G|iqN@1p9AX0}q0V!LQ!GYv#1 zN{3k!DIzqiQMX575rs+4*^_4Jl~^ACj#M{Sreb^~zL~OGuxvsEmMZdUAF8 z33a=TV#*_6Fc!RTVG0N(Hi!|W#?Wn+}UZe<{c->pzY$8AoEPU!Cm+t3J^>#F8sri%CZw# z4D?FNDu$Q9$^sry2t5mrY7PK}HW*>eb9)4+5=C4qun(`SxNq zeQcgE`}UVNeBh^^hLv*&eGW@-evWhNT`H0F3kWz2ej_QiZ6e3p#j}iGZo7#9=kpzl zwzq;FjJe=d$;B=ay%?GVZ*>dKB^bCrOG&$8@F_O|6N}EBJ>wX3bH8>6^|Da=D=~)) zql{w4Jj?fxPMLeunBuNfS?ftnw8T(osCz~$V^X6=HI34rOg%v!A<=9+2N>&Zxa>SU zN(T+VsQrhyhf^XzR#a|KXH?%p#KJ1R^LfLGC{6K%{ixvJ(05K2wcv+}=Pr(H$oRYp z7VdYr&2KFbt8r}8BH)w9!{M@5!;)T?A`(T=+U2Jv7+fpbHVMT%G#O$g#y_gF-gJF$ zqb`z|p(x^%l(-r(Hw%=4fyR)?C|mvTplQrTdpG3 z`^Y%)NHtly^$kX`G|@a!u}8Udac2;)t{Mcp{nc1)+P0t;eK=-%A~hEqLkWdQcIAQm5t)?Y zZ|Ml37euMLBJ0R>i*j_qNMbq@D6|PTWbk9sya8JKU;Oq3@;hVX_9l29hVvTE(M@=& zMYv`A$39%#ZL(_sGz<0 z$`V3~$Pvs%u&N>QVMwN@E?td|!wwny$INSsj0kdm%sf99?01Kl9~#z5gh}(IKRW;H zFRW#>zuunhQvi9?YYO6PWVdODgxiRzI&MYc;M;qrn_*tvmJh@xj_~iM_I@i!&_iO` zvp*bgIYPime{_axW#o!o8Cq-pcHE zpd{P#79~S-_2u+EO%bCO)~d2V#fub*Tl``DLt&BJGn>;V(}@Y4Jkq^e9MRD@{RyWH zeMFdYVL8>vJ7DWeGMu@X(~8Hp3X;Remjcm^Y?Li$s6aEZmR1GQz2%IFpgvRqoox(yO6sFU3jxt8?&T1mdlL7?Ss4AINPQ1PLYyH#y@!oznHs!@Op=viHmPy0yWLcCXmYr z5R~;hhPk_$D$7-{w}Pr??Ff}V0I#*uqmm_gIfL~Wha7O8jGUczYti_j94_|uh!@JA6lP(p3D5t4Eo=Pw_Elo5~v^K z4c$|Xto9%wf;x^&HT$HrivA{0A)(ZXvJA+gp>3Jf;hwXXwoN=XqCN|)zqk?v1J#9f z|G;&ZuU9I2MO0cW3lvaVVZ_kQ%&f8OJWpr1#62$U2y_EELTqD>FxrH1;jkalW!EbO z*zA+aU-Vn~+J&*8Piu3|)YlCLQ)@6EXp38CRH+jhhfT@}!04?HC)&1;4~j-Jrr6IP zHXL7VsqMm+B$s@gl#(_eI|UaMZ!lNnnpz$JYu`4XOTJ%|Yxs%`?F{?6{D5_lqOQQe z@-K%EWC1X+v|_>NFCxS3%T)}uTD8&d>G<*yj*GI~dO2o|&Y$}X1l{EHYbm*I!+It~ zkXnd(xaWIk3M<7e25e>?Hkdy(ET8YY6?^`w?YaoTpu&>?-m=`k>{Zhc!?a>j>>A#O zFTerKfoI-K^*0`9tXdTvd4MFxJbgY<1dOr4Oy1}YVe(r^6fgpXv=t&3oSZMx4`Gsv zOk^qgGiXn`o@)at(NEG^$Gw%>#;HO$wkbHeS`EkY?Yd5a>9?lBJA%tV`^GtHH})qm z0xg+hmK*cy#H`Mv9g4?W26>KtM!t3pQkgkW3Pd1Ru-n6I#c89{b889?_Urqe8zSOD z?sHE6@(bX^ESEv2=g}NOgVn&3H5wOM`o$48<`27qY5u{}s;;79x5SoHt77j~7JX%x z{9+(EMjsGA{!ZcaJVbpfU28GI-$Z8zmuVs^YLnc$ew?EsL% zPYv>01KPTKa#POVcwFI&dO3CJ7wmZR^O>7$+NJ#tK~WWQO*iPu;dI(RY(844;4Vfx zJ@&10vHO+0IqFaJjEZ&H;eqlqI)J6bPdMV3%eUqy1|>C=^Za1c^L(NbU(m$~vWn94 z8$_e}7}ASxfX09B`ZWo+Fek+HsBo@=`i2nGX3_{0Ia;{G4u|e-vH;Mf?HOafbf9*$$EN`R(2vc2!=jqejYeu*cvtlS>aAlsySljnTJq+Wk?HsRmTu@ zaN$hi5SZQ6$VCj!)OI1hN{L%xaqN2dile89?*5T!#?Qj1?rBU;y(#=)CEpAy|4{5H z@Spi{?@gJ6YnUAbI7f~Jj1Pa8smtUua=Kr+srDa+DgSR>`QM;E)xV%V)Q{4dYQUF@ zWfx(Pwwq1@+Z+aHrsa}kqht^SieIKZBzIemmAiS?^$%H6ef*f24=fZvj@+#lcBNpj zdDrRe43{34SM%PFw>zvpyr&|}{$bY)hJpSPV)S~>u*tT)UzNd8!8ULzdiZL_MoDAK zUZ`xIPhm#YFv=AMi0dJl2mky4@9%66IhdJ_y=5o|lS1er*@&PWEwM%wk!g?IwB2)>|yfW+X zNWH&eBjig#@NO-$Mwyph!$X_cAw2Y`kXA_SV+ilJZ&0c?OO^jP6OheEgn zxnfOd$&l2#zfX4(C{lr6#-iARGnJWDiyRP*AQ}Y;hT|%j*2wSsE^Yv>}8aoa-gt zB*)rgg7P3v8 zy<$}K0?#=VkXBovDKG|OI7ucBsy8 zTX^d6flnv4FS}zp!*3zOfg4cY&|b2O-34)oa8o^V|Jp@}H!UQk&VMbj@4byGzt~tzwqP@3vZNj5rJ6_sC`LbE2 zR0($-urHfsHGWdQ4-W`bPo?jURmF|B9+5O5aGFFhTvIr9f@?KGmv;9WAjlI8c_C=^ zr>Km51U&2#?UYK?c$d3Ta>{KNSfEGO=!H4ot4)1Q22nD5h|+q~@Ir~kLon&we`X_y z4HNUZK*CuhQlX<51Cd6O-BFFren(bu)ydZjzM~x%_B#Qp?(q$fedlX*P#GkyF)@Ym z9b~Qfz1SXrY#!j6Cdm9UHNOSqm}83^U-80Y+DMS_8o`1UbA3xS;vu~&5p{x4jmY$a zGf!K;Pb`T`cK~;~L|@ev8|7ane(7yYl>fESiu{kd0JeYc15|VzkiTLrL;{^F4M4wZ z)>=(9e?3JsPcciFm1%9g7+cm8Cl$Dq{)ef1TCu=nacmmozew@*CzRiW%DGRQO+QcD zO~>c$^niLsi6fx9PdU-Vqis$b!TWe^_HU_eiVP3KezpEgP_z(4U zz^z%54oVLSr+i^lfLXh|@B%0-{Wg6@_qNkB!H1k{-k2fIRC&%l?YGn%5{4udtQ-QD z;c(&av%bto9kkDrked%uY1$l|(frVirrq3Ewe>)=}z8A{9ScH~O*ioTdMy+`bV4tUYN9m1bL= z;8*NcDObl#mc-{G*cR!|H#|c|(GhGpJ%#lQsLjF($NO&DvAHR_S$5~LWnh=Asu!!p zrpWfb6?@5Ydr8<`zVcoAnXbAe3p$bdS$v~$MgS}zsA9&4mYUZx+**PMGH^C86X$DY z!(p~mZDqcufw!l8220n)_~fQ5rs$|W&dg^uBRp8LsrMy_RBEzLK}O7zTKXy9VKm6M zlI^XNmPMkUzNQ)8=g1VF<|TdrFzshE$VBQzY>|6&I5FzQaFM44=jAh`W`K1}MetXv z4FdECMM&?#HF}7%20+*x5;S3Ps&fc8Sn{}>u{n?@vnWxfX5FuTQ9F^%*BCu$vE2SW zy1+3T8o>UFpQ!(f@ssUebvjx9-g3s4i z&;Tvga7H+puah(`dTbo3E-c|F>3G8Ut~U2&CPX!|2pOb1|~ zuKg<-^f~&bb^cC(tizAy!$ZWpYu*mnwI6&~M^B^ManV+<#|SCJ<5I65^qXt^8r5Mz zsBhRnuPEm`2W4AeDrvRij&GIa%-)b9$+7mB?&ZWan}$!fh?wixuo^>m)WU#n)g17q(nOt8&75i?Y^UV~O`7dk3ccL?*?#

_w9`xP0 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%0DS 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 T0bvCES40N^p)m_Yw-EmaV1#yE -- GitLab From 6ed64355b4f4a3ac09c37eae03217c4fd79c05a6 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 22 Aug 2018 16:16:16 -0700 Subject: [PATCH 0084/1301] Use clear-all recent tasks call Change-Id: I1c93bffa0573d0a37a86b62f5a7ec948ac11799e --- quickstep/src/com/android/quickstep/views/RecentsView.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 20f7cdb87c..f3dec9a814 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -995,10 +995,8 @@ public abstract class RecentsView extends PagedView impl mPendingAnimation = pendingAnimation; mPendingAnimation.addEndListener((onEndListener) -> { if (onEndListener.isSuccess) { - int taskViewCount = getTaskViewCount(); - for (int i = 0; i < taskViewCount; i++) { - removeTask(getTaskViewAt(i).getTask(), -1, onEndListener, false); - } + // Remove all the task views now + ActivityManagerWrapper.getInstance().removeAllRecentTasks(); removeAllViews(); onAllTasksRemoved(); } -- GitLab From 9aca88cbf93b10703573493829a706321bf6729e Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 22 Aug 2018 17:35:18 -0700 Subject: [PATCH 0085/1301] Fixing tests on a larger device See atp for failed tests. Widget container may return objects outside of screen, hence the test failures. Test: AddConfigWidgetTest.com.android.launcher3.ui.widget.AddConfigWidgetTest etc Change-Id: Ia402dae0c9bc8f0585e57ac5f562a59e8ff4ed53 --- tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index f81463a76b..75313317a5 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -141,7 +141,8 @@ public abstract class AbstractLauncherUiTest { // findObject can only execute after spring settles. mDevice.wait(Until.findObject(condition), SHORT_UI_TIMEOUT); UiObject2 widget = container.findObject(condition); - if (widget != null) { + if (widget != null && widget.getVisibleBounds().intersects( + 0, 0, mDevice.getDisplayWidth(), mDevice.getDisplayHeight())) { return widget; } } while (container.scroll(Direction.DOWN, 1f)); -- GitLab From 9c0ad56d11b3b8bf3d8415aed0c17d8e78d8914c Mon Sep 17 00:00:00 2001 From: Tobias Dubois Date: Mon, 11 Jun 2018 16:17:17 +0200 Subject: [PATCH 0086/1301] Lint fix: IS_DEBUG_DEVICE: Implied default locale Use the ROOT locale to make sure toLowerCase has consistent behavior regardless of the currently set language. Test: Manual Change-Id: Ie43f76cbc15eee0d96314e92d2acd5abb22f7077 --- src/com/android/launcher3/Utilities.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 1c12464346..74fc8d1080 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -114,8 +114,9 @@ public final class Utilities { * Indicates if the device has a debug build. Should only be used to store additional info or * add extra logging and not for changing the app behavior. */ - public static final boolean IS_DEBUG_DEVICE = Build.TYPE.toLowerCase().contains("debug") - || Build.TYPE.toLowerCase().equals("eng"); + public static final boolean IS_DEBUG_DEVICE = + Build.TYPE.toLowerCase(Locale.ROOT).contains("debug") || + Build.TYPE.toLowerCase(Locale.ROOT).equals("eng"); // An intent extra to indicate the horizontal scroll of the wallpaper. public static final String EXTRA_WALLPAPER_OFFSET = "com.android.launcher3.WALLPAPER_OFFSET"; -- GitLab From 53da286c05954b51121faafbcecb317e4fbc9150 Mon Sep 17 00:00:00 2001 From: Tobias Dubois Date: Mon, 11 Jun 2018 16:54:51 +0200 Subject: [PATCH 0087/1301] Use View.getHeight() instead of Canvas.getHeight() for PageIndicatorDots Use View.getHeight() instead of Canvas.getHeight() to get the same height regardless of using hardware or software accelerated drawing. Test: manual Change-Id: I475afef017102d7968f28a7aab8116238af3d90d --- src/com/android/launcher3/pageindicators/PageIndicatorDots.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java index 709975f02c..f7c730a6c5 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java @@ -244,7 +244,7 @@ public class PageIndicatorDots extends View implements PageIndicator { float startX = (getWidth() - mNumPages * circleGap + mDotRadius) / 2; float x = startX + mDotRadius; - float y = canvas.getHeight() / 2; + float y = getHeight() / 2; if (mEntryAnimationRadiusFactors != null) { // During entry animation, only draw the circles -- GitLab From d819b8f7436eaa85896848b3d52d4728621d9653 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Thu, 23 Aug 2018 11:45:34 -0700 Subject: [PATCH 0088/1301] Comment fix Bug: 110103162 Test: ReflectionBasicUiTest Change-Id: Ic9cfe925bb396e3fa0257009d5d9f53db728f9f0 --- tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index 75313317a5..4e5cd907c1 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -268,7 +268,8 @@ public abstract class AbstractLauncherUiTest { return waitForLauncherCondition(launcher -> launcher.getStateManager().getState() == state); } - // Cannot be used after injecting any gesture using Tapl because this can hide flakiness. + // Cannot be used in TaplTests after injecting any gesture using Tapl because this can hide + // flakiness. protected boolean waitForLauncherCondition(Function condition) { return Wait.atMost(new Condition() { @Override -- GitLab From 98afc964614dc98e5ed6b8b22cd69155b2ba43f1 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Thu, 23 Aug 2018 15:05:17 -0700 Subject: [PATCH 0089/1301] Increasing wait time to populate suggested apps Bug: 110103162 Test: ReflectionBasicUiTest Change-Id: Iee5d4f328bdde93e6d9c2db9869314aa3a8eb00f --- .../launcher3/ui/AbstractLauncherUiTest.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index 4e5cd907c1..d45036607f 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -262,8 +262,8 @@ public abstract class AbstractLauncherUiTest { }); } - // Cannot be used between a Tapl call injecting a gesture and a tapl call expecting the - // results of that gesture because the wait can hide flakeness. + // Cannot be used in TaplTests between a Tapl call injecting a gesture and a tapl call expecting + // the results of that gesture because the wait can hide flakeness. protected boolean waitForState(LauncherState state) { return waitForLauncherCondition(launcher -> launcher.getStateManager().getState() == state); } @@ -271,12 +271,19 @@ public abstract class AbstractLauncherUiTest { // Cannot be used in TaplTests after injecting any gesture using Tapl because this can hide // flakiness. protected boolean waitForLauncherCondition(Function condition) { + return waitForLauncherCondition(condition, DEFAULT_ACTIVITY_TIMEOUT); + } + + // Cannot be used in TaplTests after injecting any gesture using Tapl because this can hide + // flakiness. + protected boolean waitForLauncherCondition( + Function condition, long timeout) { return Wait.atMost(new Condition() { @Override public boolean isTrue() { return getFromLauncher(condition); } - }, DEFAULT_ACTIVITY_TIMEOUT); + }, timeout); } /** -- GitLab From 12daab5597f45be6272ee5782c5f363d89bf38b7 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Fri, 24 Aug 2018 14:04:43 -0700 Subject: [PATCH 0090/1301] Enabling some test suites that miss from ATP ATP requires the test size attribute, or else the test won't be run. Test: Will see on ATP Change-Id: If231781b5188c022e47cc40e46af933d753fa114 --- .../search/DefaultAppSearchAlgorithmTest.java | 9 ++++++--- .../model/AddWorkspaceItemsTaskTest.java | 17 ++++++++++------- .../model/CacheDataUpdatedTaskTest.java | 14 ++++++++------ .../PackageInstallStateChangedTaskTest.java | 6 ++++-- .../launcher3/popup/PopupPopulatorTest.java | 16 ++++++++++------ 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/tests/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithmTest.java b/tests/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithmTest.java index ab2adaaefa..afbedbacd0 100644 --- a/tests/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithmTest.java +++ b/tests/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithmTest.java @@ -15,7 +15,12 @@ */ package com.android.launcher3.allapps.search; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import android.content.ComponentName; + +import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.AppInfo; @@ -24,12 +29,10 @@ import com.android.launcher3.Utilities; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - /** * Unit tests for {@link DefaultAppSearchAlgorithm} */ +@SmallTest @RunWith(AndroidJUnit4.class) public class DefaultAppSearchAlgorithmTest { private static final DefaultAppSearchAlgorithm.StringMatcher MATCHER = diff --git a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java index dae8f2f9ab..38e211b69c 100644 --- a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java +++ b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java @@ -1,5 +1,11 @@ package com.android.launcher3.model; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.verify; + import android.content.ComponentName; import android.content.ContentProviderOperation; import android.content.ContentValues; @@ -7,9 +13,11 @@ import android.content.Context; import android.content.Intent; import android.graphics.Rect; import android.net.Uri; -import androidx.test.runner.AndroidJUnit4; import android.util.Pair; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherProvider; import com.android.launcher3.LauncherSettings; @@ -25,15 +33,10 @@ import org.mockito.ArgumentCaptor; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.verify; - /** * Tests for {@link AddWorkspaceItemsTask} */ +@SmallTest @RunWith(AndroidJUnit4.class) public class AddWorkspaceItemsTaskTest extends BaseModelUpdateTaskTestCase { diff --git a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java index 59f807acf2..db80044454 100644 --- a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java +++ b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java @@ -1,5 +1,12 @@ package com.android.launcher3.model; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertNull; + +import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.AppInfo; @@ -13,15 +20,10 @@ import org.junit.runner.RunWith; import java.util.Arrays; import java.util.HashSet; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertNull; - /** * Tests for {@link CacheDataUpdatedTask} */ +@SmallTest @RunWith(AndroidJUnit4.class) public class CacheDataUpdatedTaskTest extends BaseModelUpdateTaskTestCase { diff --git a/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java b/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java index 51e21e2c76..435686ff8c 100644 --- a/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java +++ b/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java @@ -1,5 +1,8 @@ package com.android.launcher3.model; +import static org.junit.Assert.assertEquals; + +import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.ItemInfo; @@ -15,11 +18,10 @@ import org.junit.runner.RunWith; import java.util.Arrays; import java.util.HashSet; -import static org.junit.Assert.assertEquals; - /** * Tests for {@link PackageInstallStateChangedTask} */ +@SmallTest @RunWith(AndroidJUnit4.class) public class PackageInstallStateChangedTaskTest extends BaseModelUpdateTaskTestCase { diff --git a/tests/src/com/android/launcher3/popup/PopupPopulatorTest.java b/tests/src/com/android/launcher3/popup/PopupPopulatorTest.java index 6a1dc96671..d224c89068 100644 --- a/tests/src/com/android/launcher3/popup/PopupPopulatorTest.java +++ b/tests/src/com/android/launcher3/popup/PopupPopulatorTest.java @@ -16,7 +16,16 @@ package com.android.launcher3.popup; +import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS; +import static com.android.launcher3.popup.PopupPopulator.NUM_DYNAMIC; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import android.content.pm.ShortcutInfo; + +import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -28,15 +37,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS; -import static com.android.launcher3.popup.PopupPopulator.NUM_DYNAMIC; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - /** * Tests the sorting and filtering of shortcuts in {@link PopupPopulator}. */ +@SmallTest @RunWith(AndroidJUnit4.class) public class PopupPopulatorTest { -- GitLab From a3fd1e5bfeadfab722879a545f09ea2630fbb3d7 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Fri, 24 Aug 2018 17:48:25 -0700 Subject: [PATCH 0091/1301] Fixing AOSP tests after AndroidX migration Test: adb shell am instrument -w -r -e debug false com.android.launcher3.tests/androidx.test.runner.AndroidJUnitRunner Change-Id: I72bf7095087b012a6eceac71ee02f2d7a5c8c51b --- build.gradle | 2 +- tests/AndroidManifest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index dcb5b81c34..7ac4127853 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ android { versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } buildTypes { diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml index ec89f9c020..0be5f112bf 100644 --- a/tests/AndroidManifest.xml +++ b/tests/AndroidManifest.xml @@ -28,7 +28,7 @@ -- GitLab From 2b787e5bd6314b3b657b73e529e16cb52863bcbb Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 20 Aug 2018 15:01:03 -0700 Subject: [PATCH 0092/1301] Using a placeholder icon shape instead of low-res/blurry icon Bug: 111142970 Change-Id: I867224464ae9c026f4dcb5256ef14fc39c8e751d --- .../LauncherAppTransitionManagerImpl.java | 4 +- .../quickstep/NormalizedIconLoader.java | 4 +- res/values/attrs.xml | 1 + res/values/styles.xml | 2 + src/com/android/launcher3/AllAppsList.java | 2 +- src/com/android/launcher3/BubbleTextView.java | 9 +- src/com/android/launcher3/IconCache.java | 100 ++++++++---------- .../android/launcher3/ItemInfoWithIcon.java | 15 +-- src/com/android/launcher3/ShortcutInfo.java | 2 +- .../allapps/AllAppsRecyclerView.java | 3 +- .../launcher3/graphics/BitmapInfo.java | 3 + .../launcher3/graphics/DrawableFactory.java | 84 +++++++-------- .../graphics/PlaceHolderIconDrawable.java | 60 +++++++++++ .../launcher3/model/CacheDataUpdatedTask.java | 2 +- .../android/launcher3/model/LoaderTask.java | 2 +- .../launcher3/model/PackageUpdatedTask.java | 2 +- .../widget/PendingAppWidgetHostView.java | 14 +-- .../android/launcher3/widget/WidgetCell.java | 4 +- 18 files changed, 179 insertions(+), 134 deletions(-) create mode 100644 src/com/android/launcher3/graphics/PlaceHolderIconDrawable.java diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 37d0b12bdc..5680a67090 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -427,8 +427,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag mFloatingView = new View(mLauncher); if (isBubbleTextView && v.getTag() instanceof ItemInfoWithIcon ) { // Create a copy of the app icon - mFloatingView.setBackground( - DrawableFactory.get(mLauncher).newIcon((ItemInfoWithIcon) v.getTag())); + mFloatingView.setBackground(DrawableFactory.INSTANCE.get(mLauncher) + .newIcon(v.getContext(), (ItemInfoWithIcon) v.getTag())); } // Position the floating view exactly on top of the original diff --git a/quickstep/src/com/android/quickstep/NormalizedIconLoader.java b/quickstep/src/com/android/quickstep/NormalizedIconLoader.java index a4a2e5690b..8f7dbdd366 100644 --- a/quickstep/src/com/android/quickstep/NormalizedIconLoader.java +++ b/quickstep/src/com/android/quickstep/NormalizedIconLoader.java @@ -49,7 +49,7 @@ public class NormalizedIconLoader extends IconLoader { LruCache activityInfoCache, boolean disableColorExtraction) { super(context, iconCache, activityInfoCache); - mDrawableFactory = DrawableFactory.get(context); + mDrawableFactory = DrawableFactory.INSTANCE.get(context); mDisableColorExtraction = disableColorExtraction; } @@ -96,6 +96,6 @@ public class NormalizedIconLoader extends IconLoader { userId, desc.getPrimaryColor(), activityInfo.applicationInfo.isInstantApp()); - return mDrawableFactory.newIcon(bitmapInfo, activityInfo); + return mDrawableFactory.newIcon(mContext, bitmapInfo, activityInfo); } } diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 045e4e98c8..956270cba3 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -34,6 +34,7 @@ + diff --git a/res/values/styles.xml b/res/values/styles.xml index 7ea28ccf08..098aac562e 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -43,6 +43,7 @@ @drawable/workspace_bg @style/WidgetContainerTheme ?android:attr/colorPrimary + #FFF @@ -73,6 +74,7 @@ @style/WidgetContainerTheme.Dark #FF464646 true + #000 - + + \ No newline at end of file diff --git a/res/values-v19/styles.xml b/res/values-v22/styles.xml similarity index 71% rename from res/values-v19/styles.xml rename to res/values-v22/styles.xml index 36c09718e5..f86db7a493 100644 --- a/res/values-v19/styles.xml +++ b/res/values-v22/styles.xml @@ -1,7 +1,7 @@ + - \ No newline at end of file diff --git a/res/values/styles.xml b/res/values/styles.xml index 098aac562e..7b11891a61 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -27,7 +27,7 @@ #FF757575 - - + false + false + true + #00000000 + #00000000 + + diff --git a/res/xml/launcher_preferences.xml b/res/xml/launcher_preferences.xml index 1df7c2fbaf..c55cc49855 100644 --- a/res/xml/launcher_preferences.xml +++ b/res/xml/launcher_preferences.xml @@ -14,9 +14,10 @@ limitations under the License. --> - + - - + - - + diff --git a/src/com/android/launcher3/SettingsActivity.java b/src/com/android/launcher3/SettingsActivity.java deleted file mode 100644 index a17f614192..0000000000 --- a/src/com/android/launcher3/SettingsActivity.java +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Copyright (C) 2015 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 static com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY; -import static com.android.launcher3.states.RotationHelper.getAllowRotationDefaultValue; -import static com.android.launcher3.util.SecureSettingsObserver.newNotificationSettingsObserver; - -import android.annotation.TargetApi; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.Fragment; -import android.content.ComponentName; -import android.content.ContentResolver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceScreen; -import android.provider.Settings; -import android.text.TextUtils; -import android.view.View; -import android.widget.Adapter; -import android.widget.ListView; - -import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.graphics.IconShapeOverride; -import com.android.launcher3.notification.NotificationListener; -import com.android.launcher3.util.ListViewHighlighter; -import com.android.launcher3.util.SecureSettingsObserver; -import com.android.launcher3.views.ButtonPreference; - -import java.util.Objects; - -/** - * Settings activity for Launcher. Currently implements the following setting: Allow rotation - */ -public class SettingsActivity extends Activity - implements PreferenceFragment.OnPreferenceStartFragmentCallback { - - private static final String FLAGS_PREFERENCE_KEY = "flag_toggler"; - - private static final String ICON_BADGING_PREFERENCE_KEY = "pref_icon_badging"; - /** Hidden field Settings.Secure.ENABLED_NOTIFICATION_LISTENERS */ - private static final String NOTIFICATION_ENABLED_LISTENERS = "enabled_notification_listeners"; - - private static final String EXTRA_FRAGMENT_ARG_KEY = ":settings:fragment_args_key"; - private static final String EXTRA_SHOW_FRAGMENT_ARGS = ":settings:show_fragment_args"; - private static final int DELAY_HIGHLIGHT_DURATION_MILLIS = 600; - private static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (savedInstanceState == null) { - Fragment f = Fragment.instantiate(this, getString(R.string.settings_fragment_name)); - // Display the fragment as the main content. - getFragmentManager().beginTransaction() - .replace(android.R.id.content, f) - .commit(); - } - } - - protected PreferenceFragment getNewFragment() { - return new LauncherSettingsFragment(); - } - - @Override - public boolean onPreferenceStartFragment( - PreferenceFragment preferenceFragment, Preference pref) { - if (getFragmentManager().isStateSaved()) { - // Sometimes onClick can come after onPause because of being posted on the handler. - // Skip starting new fragments in that case. - return false; - } - Fragment f = Fragment.instantiate(this, pref.getFragment(), pref.getExtras()); - if (f instanceof DialogFragment) { - ((DialogFragment) f).show(getFragmentManager(), pref.getKey()); - } else { - getFragmentManager() - .beginTransaction() - .replace(android.R.id.content, f) - .addToBackStack(pref.getKey()) - .commit(); - } - return true; - } - - /** - * This fragment shows the launcher preferences. - */ - public static class LauncherSettingsFragment extends PreferenceFragment { - - private SecureSettingsObserver mIconBadgingObserver; - - private String mPreferenceKey; - private boolean mPreferenceHighlighted = false; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (savedInstanceState != null) { - mPreferenceHighlighted = savedInstanceState.getBoolean(SAVE_HIGHLIGHTED_KEY); - } - - getPreferenceManager().setSharedPreferencesName(LauncherFiles.SHARED_PREFERENCES_KEY); - addPreferencesFromResource(R.xml.launcher_preferences); - - // Only show flag toggler UI if this build variant implements that. - Preference flagToggler = findPreference(FLAGS_PREFERENCE_KEY); - if (flagToggler != null && !FeatureFlags.showFlagTogglerUi()) { - getPreferenceScreen().removePreference(flagToggler); - } - - ContentResolver resolver = getActivity().getContentResolver(); - - ButtonPreference iconBadgingPref = - (ButtonPreference) findPreference(ICON_BADGING_PREFERENCE_KEY); - if (!Utilities.ATLEAST_OREO) { - getPreferenceScreen().removePreference( - findPreference(SessionCommitReceiver.ADD_ICON_PREFERENCE_KEY)); - getPreferenceScreen().removePreference(iconBadgingPref); - } else if (!getResources().getBoolean(R.bool.notification_badging_enabled)) { - getPreferenceScreen().removePreference(iconBadgingPref); - } else { - // Listen to system notification badge settings while this UI is active. - mIconBadgingObserver = newNotificationSettingsObserver( - getActivity(), new IconBadgingObserver(iconBadgingPref, resolver)); - mIconBadgingObserver.register(); - // Also listen if notification permission changes - mIconBadgingObserver.getResolver().registerContentObserver( - Settings.Secure.getUriFor(NOTIFICATION_ENABLED_LISTENERS), false, - mIconBadgingObserver); - mIconBadgingObserver.dispatchOnChange(); - } - - Preference iconShapeOverride = findPreference(IconShapeOverride.KEY_PREFERENCE); - if (iconShapeOverride != null) { - if (IconShapeOverride.isSupported(getActivity())) { - IconShapeOverride.handlePreferenceUi((ListPreference) iconShapeOverride); - } else { - getPreferenceScreen().removePreference(iconShapeOverride); - } - } - - // Setup allow rotation preference - Preference rotationPref = findPreference(ALLOW_ROTATION_PREFERENCE_KEY); - if (getResources().getBoolean(R.bool.allow_rotation)) { - // Launcher supports rotation by default. No need to show this setting. - getPreferenceScreen().removePreference(rotationPref); - } else { - // Initialize the UI once - rotationPref.setDefaultValue(getAllowRotationDefaultValue()); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putBoolean(SAVE_HIGHLIGHTED_KEY, mPreferenceHighlighted); - } - - @Override - public void onResume() { - super.onResume(); - - Intent intent = getActivity().getIntent(); - mPreferenceKey = intent.getStringExtra(EXTRA_FRAGMENT_ARG_KEY); - if (isAdded() && !mPreferenceHighlighted && !TextUtils.isEmpty(mPreferenceKey)) { - getView().postDelayed(this::highlightPreference, DELAY_HIGHLIGHT_DURATION_MILLIS); - } - } - - private void highlightPreference() { - Preference pref = findPreference(mPreferenceKey); - if (pref == null || getPreferenceScreen() == null) { - return; - } - PreferenceScreen screen = getPreferenceScreen(); - if (Utilities.ATLEAST_OREO) { - screen = selectPreferenceRecursive(pref, screen); - } - if (screen == null) { - return; - } - - View root = screen.getDialog() != null - ? screen.getDialog().getWindow().getDecorView() : getView(); - ListView list = root.findViewById(android.R.id.list); - if (list == null || list.getAdapter() == null) { - return; - } - Adapter adapter = list.getAdapter(); - - // Find the position - int position = -1; - for (int i = adapter.getCount() - 1; i >= 0; i--) { - if (pref == adapter.getItem(i)) { - position = i; - break; - } - } - new ListViewHighlighter(list, position); - mPreferenceHighlighted = true; - } - - @Override - public void onDestroy() { - if (mIconBadgingObserver != null) { - mIconBadgingObserver.unregister(); - mIconBadgingObserver = null; - } - super.onDestroy(); - } - - @TargetApi(Build.VERSION_CODES.O) - private PreferenceScreen selectPreferenceRecursive( - Preference pref, PreferenceScreen topParent) { - if (!(pref.getParent() instanceof PreferenceScreen)) { - return null; - } - - PreferenceScreen parent = (PreferenceScreen) pref.getParent(); - if (Objects.equals(parent.getKey(), topParent.getKey())) { - return parent; - } else if (selectPreferenceRecursive(parent, topParent) != null) { - ((PreferenceScreen) parent.getParent()) - .onItemClick(null, null, parent.getOrder(), 0); - return parent; - } else { - return null; - } - } - } - - /** - * Content observer which listens for system badging setting changes, - * and updates the launcher badging setting subtext accordingly. - */ - private static class IconBadgingObserver implements SecureSettingsObserver.OnChangeListener { - - private final ButtonPreference mBadgingPref; - private final ContentResolver mResolver; - - public IconBadgingObserver(ButtonPreference badgingPref, ContentResolver resolver) { - mBadgingPref = badgingPref; - mResolver = resolver; - } - - @Override - public void onSettingsChanged(boolean enabled) { - int summary = enabled ? R.string.icon_badging_desc_on : R.string.icon_badging_desc_off; - - boolean serviceEnabled = true; - if (enabled) { - // Check if the listener is enabled or not. - String enabledListeners = - Settings.Secure.getString(mResolver, NOTIFICATION_ENABLED_LISTENERS); - ComponentName myListener = - new ComponentName(mBadgingPref.getContext(), NotificationListener.class); - serviceEnabled = enabledListeners != null && - (enabledListeners.contains(myListener.flattenToString()) || - enabledListeners.contains(myListener.flattenToShortString())); - if (!serviceEnabled) { - summary = R.string.title_missing_notification_access; - } - } - mBadgingPref.setWidgetFrameVisible(!serviceEnabled); - mBadgingPref.setFragment( - serviceEnabled ? null : NotificationAccessConfirmation.class.getName()); - mBadgingPref.setSummary(summary); - - } - } - - public static class NotificationAccessConfirmation - extends DialogFragment implements DialogInterface.OnClickListener { - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - final Context context = getActivity(); - String msg = context.getString(R.string.msg_missing_notification_access, - context.getString(R.string.derived_app_name)); - return new AlertDialog.Builder(context) - .setTitle(R.string.title_missing_notification_access) - .setMessage(msg) - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(R.string.title_change_settings, this) - .create(); - } - - @Override - public void onClick(DialogInterface dialogInterface, int i) { - ComponentName cn = new ComponentName(getActivity(), NotificationListener.class); - Bundle showFragmentArgs = new Bundle(); - showFragmentArgs.putString(EXTRA_FRAGMENT_ARG_KEY, cn.flattenToString()); - - Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra(EXTRA_FRAGMENT_ARG_KEY, cn.flattenToString()) - .putExtra(EXTRA_SHOW_FRAGMENT_ARGS, showFragmentArgs); - getActivity().startActivity(intent); - } - } -} diff --git a/src/com/android/launcher3/graphics/IconShapeOverride.java b/src/com/android/launcher3/graphics/IconShapeOverride.java index cadc6e35eb..b636c6d478 100644 --- a/src/com/android/launcher3/graphics/IconShapeOverride.java +++ b/src/com/android/launcher3/graphics/IconShapeOverride.java @@ -26,9 +26,6 @@ import android.content.Intent; import android.content.res.Resources; import android.os.Build; import android.os.SystemClock; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; @@ -42,6 +39,9 @@ import com.android.launcher3.util.LooperExecutor; import java.lang.reflect.Field; import androidx.annotation.NonNull; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.Preference.OnPreferenceChangeListener; /** * Utility class to override shape of {@link android.graphics.drawable.AdaptiveIconDrawable}. diff --git a/src/com/android/launcher3/settings/IconBadgingPreference.java b/src/com/android/launcher3/settings/IconBadgingPreference.java new file mode 100644 index 0000000000..7c97b38d28 --- /dev/null +++ b/src/com/android/launcher3/settings/IconBadgingPreference.java @@ -0,0 +1,138 @@ +/* + * 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.settings; + +import static com.android.launcher3.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY; +import static com.android.launcher3.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGS; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.provider.Settings; +import android.util.AttributeSet; +import android.view.View; + +import com.android.launcher3.R; +import com.android.launcher3.notification.NotificationListener; +import com.android.launcher3.util.SecureSettingsObserver; + +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; + +/** + * A {@link Preference} for indicating icon badging status. + * Also has utility methods for updating UI based on badging status changes. + */ +public class IconBadgingPreference extends Preference + implements SecureSettingsObserver.OnChangeListener { + + private boolean mWidgetFrameVisible = false; + + /** Hidden field Settings.Secure.ENABLED_NOTIFICATION_LISTENERS */ + private static final String NOTIFICATION_ENABLED_LISTENERS = "enabled_notification_listeners"; + + public IconBadgingPreference( + Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public IconBadgingPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public IconBadgingPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public IconBadgingPreference(Context context) { + super(context); + } + + private void setWidgetFrameVisible(boolean isVisible) { + if (mWidgetFrameVisible != isVisible) { + mWidgetFrameVisible = isVisible; + notifyChanged(); + } + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + + View widgetFrame = holder.findViewById(android.R.id.widget_frame); + if (widgetFrame != null) { + widgetFrame.setVisibility(mWidgetFrameVisible ? View.VISIBLE : View.GONE); + } + } + + @Override + public void onSettingsChanged(boolean enabled) { + int summary = enabled ? R.string.icon_badging_desc_on : R.string.icon_badging_desc_off; + + boolean serviceEnabled = true; + if (enabled) { + // Check if the listener is enabled or not. + String enabledListeners = Settings.Secure.getString( + getContext().getContentResolver(), NOTIFICATION_ENABLED_LISTENERS); + ComponentName myListener = + new ComponentName(getContext(), NotificationListener.class); + serviceEnabled = enabledListeners != null && + (enabledListeners.contains(myListener.flattenToString()) || + enabledListeners.contains(myListener.flattenToShortString())); + if (!serviceEnabled) { + summary = R.string.title_missing_notification_access; + } + } + setWidgetFrameVisible(!serviceEnabled); + setFragment(serviceEnabled ? null : NotificationAccessConfirmation.class.getName()); + setSummary(summary); + } + + public static class NotificationAccessConfirmation + extends DialogFragment implements DialogInterface.OnClickListener { + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Context context = getActivity(); + String msg = context.getString(R.string.msg_missing_notification_access, + context.getString(R.string.derived_app_name)); + return new AlertDialog.Builder(context) + .setTitle(R.string.title_missing_notification_access) + .setMessage(msg) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.title_change_settings, this) + .create(); + } + + @Override + public void onClick(DialogInterface dialogInterface, int i) { + ComponentName cn = new ComponentName(getActivity(), NotificationListener.class); + Bundle showFragmentArgs = new Bundle(); + showFragmentArgs.putString(EXTRA_FRAGMENT_ARG_KEY, cn.flattenToString()); + + Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(EXTRA_FRAGMENT_ARG_KEY, cn.flattenToString()) + .putExtra(EXTRA_SHOW_FRAGMENT_ARGS, showFragmentArgs); + getActivity().startActivity(intent); + } + } +} diff --git a/src/com/android/launcher3/settings/PreferenceHighlighter.java b/src/com/android/launcher3/settings/PreferenceHighlighter.java new file mode 100644 index 0000000000..4ed4cf1133 --- /dev/null +++ b/src/com/android/launcher3/settings/PreferenceHighlighter.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.settings; + +import static androidx.core.graphics.ColorUtils.setAlphaComponent; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.Property; +import android.view.View; + +import com.android.launcher3.util.Themes; + +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.ItemDecoration; +import androidx.recyclerview.widget.RecyclerView.State; +import androidx.recyclerview.widget.RecyclerView.ViewHolder; + +/** + * Utility class for highlighting a preference + */ +public class PreferenceHighlighter extends ItemDecoration implements Runnable { + + private static final Property HIGHLIGHT_COLOR = + new Property(Integer.TYPE, "highlightColor") { + + @Override + public Integer get(PreferenceHighlighter highlighter) { + return highlighter.mHighlightColor; + } + + @Override + public void set(PreferenceHighlighter highlighter, Integer value) { + highlighter.mHighlightColor = value; + highlighter.mRv.invalidateItemDecorations(); + } + }; + + private static final long HIGHLIGHT_DURATION = 15000L; + private static final long HIGHLIGHT_FADE_OUT_DURATION = 500L; + private static final long HIGHLIGHT_FADE_IN_DURATION = 200L; + private static final int END_COLOR = setAlphaComponent(Color.WHITE, 0); + + private final Paint mPaint = new Paint(); + private final RecyclerView mRv; + private final int mIndex; + + private boolean mHighLightStarted = false; + private int mHighlightColor = END_COLOR; + + + public PreferenceHighlighter(RecyclerView rv, int index) { + mRv = rv; + mIndex = index; + } + + @Override + public void run() { + mRv.addItemDecoration(this); + mRv.smoothScrollToPosition(mIndex); + } + + @Override + public void onDraw(Canvas c, RecyclerView parent, State state) { + ViewHolder holder = parent.findViewHolderForAdapterPosition(mIndex); + if (holder == null) { + return; + } + if (!mHighLightStarted && state.getRemainingScrollVertical() != 0) { + // Wait until scrolling stopped + return; + } + + if (!mHighLightStarted) { + // Start highlight + int colorTo = setAlphaComponent(Themes.getColorAccent(mRv.getContext()), 66); + ObjectAnimator anim = ObjectAnimator.ofArgb(this, HIGHLIGHT_COLOR, END_COLOR, colorTo); + anim.setDuration(HIGHLIGHT_FADE_IN_DURATION); + anim.setRepeatMode(ValueAnimator.REVERSE); + anim.setRepeatCount(4); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + removeHighlight(); + } + }); + anim.start(); + mHighLightStarted = true; + } + + View view = holder.itemView; + mPaint.setColor(mHighlightColor); + c.drawRect(0, view.getY(), parent.getWidth(), view.getY() + view.getHeight(), mPaint); + } + + private void removeHighlight() { + ObjectAnimator anim = ObjectAnimator.ofArgb( + this, HIGHLIGHT_COLOR, mHighlightColor, END_COLOR); + anim.setDuration(HIGHLIGHT_FADE_OUT_DURATION); + anim.setStartDelay(HIGHLIGHT_DURATION); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mRv.removeItemDecoration(PreferenceHighlighter.this); + } + }); + anim.start(); + } +} diff --git a/src/com/android/launcher3/settings/SettingsActivity.java b/src/com/android/launcher3/settings/SettingsActivity.java new file mode 100644 index 0000000000..66420d079e --- /dev/null +++ b/src/com/android/launcher3/settings/SettingsActivity.java @@ -0,0 +1,250 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.settings; + +import static com.android.launcher3.SessionCommitReceiver.ADD_ICON_PREFERENCE_KEY; +import static com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY; +import static com.android.launcher3.states.RotationHelper.getAllowRotationDefaultValue; +import static com.android.launcher3.util.SecureSettingsObserver.newNotificationSettingsObserver; + +import android.app.Activity; +import android.app.DialogFragment; +import android.app.Fragment; +import android.content.Intent; +import android.os.Bundle; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; + +import com.android.launcher3.LauncherFiles; +import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.graphics.IconShapeOverride; +import com.android.launcher3.util.SecureSettingsObserver; + +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragment; +import androidx.preference.PreferenceFragment.OnPreferenceStartFragmentCallback; +import androidx.preference.PreferenceFragment.OnPreferenceStartScreenCallback; +import androidx.preference.PreferenceGroup.PreferencePositionCallback; +import androidx.preference.PreferenceScreen; +import androidx.recyclerview.widget.RecyclerView; + +/** + * Settings activity for Launcher. Currently implements the following setting: Allow rotation + */ +public class SettingsActivity extends Activity + implements OnPreferenceStartFragmentCallback, OnPreferenceStartScreenCallback { + + private static final String FLAGS_PREFERENCE_KEY = "flag_toggler"; + + private static final String ICON_BADGING_PREFERENCE_KEY = "pref_icon_badging"; + /** Hidden field Settings.Secure.ENABLED_NOTIFICATION_LISTENERS */ + private static final String NOTIFICATION_ENABLED_LISTENERS = "enabled_notification_listeners"; + + public static final String EXTRA_FRAGMENT_ARG_KEY = ":settings:fragment_args_key"; + public static final String EXTRA_SHOW_FRAGMENT_ARGS = ":settings:show_fragment_args"; + private static final int DELAY_HIGHLIGHT_DURATION_MILLIS = 600; + public static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (savedInstanceState == null) { + Bundle args = new Bundle(); + String prefKey = getIntent().getStringExtra(EXTRA_FRAGMENT_ARG_KEY); + if (!TextUtils.isEmpty(prefKey)) { + args.putString(EXTRA_FRAGMENT_ARG_KEY, prefKey); + } + + Fragment f = Fragment.instantiate( + this, getString(R.string.settings_fragment_name), args); + // Display the fragment as the main content. + getFragmentManager().beginTransaction() + .replace(android.R.id.content, f) + .commit(); + } + } + + private boolean startFragment(String fragment, Bundle args, String key) { + if (Utilities.ATLEAST_P && getFragmentManager().isStateSaved()) { + // Sometimes onClick can come after onPause because of being posted on the handler. + // Skip starting new fragments in that case. + return false; + } + Fragment f = Fragment.instantiate(this, fragment, args); + if (f instanceof DialogFragment) { + ((DialogFragment) f).show(getFragmentManager(), key); + } else { + getFragmentManager() + .beginTransaction() + .replace(android.R.id.content, f) + .addToBackStack(key) + .commit(); + } + return true; + } + + @Override + public boolean onPreferenceStartFragment( + PreferenceFragment preferenceFragment, Preference pref) { + return startFragment(pref.getFragment(), pref.getExtras(), pref.getKey()); + } + + @Override + public boolean onPreferenceStartScreen(PreferenceFragment caller, PreferenceScreen pref) { + Bundle args = new Bundle(); + args.putString(PreferenceFragment.ARG_PREFERENCE_ROOT, pref.getKey()); + return startFragment(getString(R.string.settings_fragment_name), args, pref.getKey()); + } + + /** + * This fragment shows the launcher preferences. + */ + public static class LauncherSettingsFragment extends PreferenceFragment { + + private SecureSettingsObserver mIconBadgingObserver; + + private String mHighLightKey; + private boolean mPreferenceHighlighted = false; + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + final Bundle args = getArguments(); + mHighLightKey = args == null ? null : args.getString(EXTRA_FRAGMENT_ARG_KEY); + if (rootKey == null && !TextUtils.isEmpty(mHighLightKey)) { + rootKey = getParentKeyForPref(mHighLightKey); + } + + if (savedInstanceState != null) { + mPreferenceHighlighted = savedInstanceState.getBoolean(SAVE_HIGHLIGHTED_KEY); + } + + getPreferenceManager().setSharedPreferencesName(LauncherFiles.SHARED_PREFERENCES_KEY); + setPreferencesFromResource(R.xml.launcher_preferences, rootKey); + + PreferenceScreen screen = getPreferenceScreen(); + for (int i = screen.getPreferenceCount() - 1; i >= 0; i--) { + Preference preference = screen.getPreference(i); + if (!initPreference(preference)) { + screen.removePreference(preference); + } + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(SAVE_HIGHLIGHTED_KEY, mPreferenceHighlighted); + } + + protected String getParentKeyForPref(String key) { + return null; + } + + /** + * Initializes a preference. This is called for every preference. Returning false here + * will remove that preference from the list. + */ + protected boolean initPreference(Preference preference) { + switch (preference.getKey()) { + case ICON_BADGING_PREFERENCE_KEY: + if (!Utilities.ATLEAST_OREO || + !getResources().getBoolean(R.bool.notification_badging_enabled)) { + return false; + } + + // Listen to system notification badge settings while this UI is active. + mIconBadgingObserver = newNotificationSettingsObserver( + getActivity(), (IconBadgingPreference) preference); + mIconBadgingObserver.register(); + // Also listen if notification permission changes + mIconBadgingObserver.getResolver().registerContentObserver( + Settings.Secure.getUriFor(NOTIFICATION_ENABLED_LISTENERS), false, + mIconBadgingObserver); + mIconBadgingObserver.dispatchOnChange(); + return true; + + case ADD_ICON_PREFERENCE_KEY: + return Utilities.ATLEAST_OREO; + + case IconShapeOverride.KEY_PREFERENCE: + if (!IconShapeOverride.isSupported(getActivity())) { + return false; + } + IconShapeOverride.handlePreferenceUi((ListPreference) preference); + return true; + + case ALLOW_ROTATION_PREFERENCE_KEY: + if (getResources().getBoolean(R.bool.allow_rotation)) { + // Launcher supports rotation by default. No need to show this setting. + return false; + } + // Initialize the UI once + preference.setDefaultValue(getAllowRotationDefaultValue()); + return true; + + case FLAGS_PREFERENCE_KEY: + // Only show flag toggler UI if this build variant implements that. + return FeatureFlags.showFlagTogglerUi(); + } + + return true; + } + + @Override + public void onResume() { + super.onResume(); + + if (isAdded() && !mPreferenceHighlighted) { + PreferenceHighlighter highlighter = createHighlighter(); + if (highlighter != null) { + getView().postDelayed(highlighter, DELAY_HIGHLIGHT_DURATION_MILLIS); + mPreferenceHighlighted = true; + } + } + } + + private PreferenceHighlighter createHighlighter() { + if (TextUtils.isEmpty(mHighLightKey)) { + return null; + } + + PreferenceScreen screen = getPreferenceScreen(); + if (screen == null) { + return null; + } + + RecyclerView list = getListView(); + PreferencePositionCallback callback = (PreferencePositionCallback) list.getAdapter(); + int position = callback.getPreferenceAdapterPosition(mHighLightKey); + return position >= 0 ? new PreferenceHighlighter(list, position) : null; + } + + @Override + public void onDestroy() { + if (mIconBadgingObserver != null) { + mIconBadgingObserver.unregister(); + mIconBadgingObserver = null; + } + super.onDestroy(); + } + } +} diff --git a/src/com/android/launcher3/util/ListViewHighlighter.java b/src/com/android/launcher3/util/ListViewHighlighter.java deleted file mode 100644 index c9fe228d58..0000000000 --- a/src/com/android/launcher3/util/ListViewHighlighter.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.launcher3.util; - -import android.animation.ArgbEvaluator; -import android.animation.ObjectAnimator; -import android.animation.ValueAnimator; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.view.View; -import android.view.View.OnLayoutChangeListener; -import android.widget.AbsListView; -import android.widget.AbsListView.OnScrollListener; -import android.widget.AbsListView.RecyclerListener; -import android.widget.ListView; - -import com.android.launcher3.R; - -import androidx.core.graphics.ColorUtils; - -/** - * Utility class to scroll and highlight a list view item - */ -public class ListViewHighlighter implements OnScrollListener, RecyclerListener, - OnLayoutChangeListener { - - private final ListView mListView; - private int mPosHighlight; - - private boolean mColorAnimated = false; - - public ListViewHighlighter(ListView listView, int posHighlight) { - mListView = listView; - mPosHighlight = posHighlight; - mListView.setOnScrollListener(this); - mListView.setRecyclerListener(this); - mListView.addOnLayoutChangeListener(this); - - mListView.post(this::tryHighlight); - } - - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, - int oldLeft, int oldTop, int oldRight, int oldBottom) { - mListView.post(this::tryHighlight); - } - - private void tryHighlight() { - if (mPosHighlight < 0 || mListView.getChildCount() == 0) { - return; - } - if (!highlightIfVisible(mListView.getFirstVisiblePosition(), - mListView.getLastVisiblePosition())) { - mListView.smoothScrollToPosition(mPosHighlight); - } - } - - @Override - public void onScrollStateChanged(AbsListView absListView, int i) { } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, - int visibleItemCount, int totalItemCount) { - highlightIfVisible(firstVisibleItem, firstVisibleItem + visibleItemCount - 1); - } - - private boolean highlightIfVisible(int start, int end) { - if (mPosHighlight < 0 || mListView.getChildCount() == 0) { - return false; - } - if (start > mPosHighlight || mPosHighlight > end) { - return false; - } - highlightView(mListView.getChildAt(mPosHighlight - start)); - - // finish highlight - mListView.setOnScrollListener(null); - mListView.removeOnLayoutChangeListener(this); - - mPosHighlight = -1; - return true; - } - - @Override - public void onMovedToScrapHeap(View view) { - unhighlightView(view); - } - - private void highlightView(View view) { - if (Boolean.TRUE.equals(view.getTag(R.id.view_highlighted))) { - // already highlighted - } else { - view.setTag(R.id.view_highlighted, true); - view.setTag(R.id.view_unhighlight_background, view.getBackground()); - view.setBackground(getHighlightBackground()); - view.postDelayed(() -> { - unhighlightView(view); - }, 15000L); - } - } - - private void unhighlightView(View view) { - if (Boolean.TRUE.equals(view.getTag(R.id.view_highlighted))) { - Object background = view.getTag(R.id.view_unhighlight_background); - if (background instanceof Drawable) { - view.setBackground((Drawable) background); - } - view.setTag(R.id.view_unhighlight_background, null); - view.setTag(R.id.view_highlighted, false); - } - } - - private ColorDrawable getHighlightBackground() { - int color = ColorUtils.setAlphaComponent(Themes.getColorAccent(mListView.getContext()), 26); - if (mColorAnimated) { - return new ColorDrawable(color); - } - mColorAnimated = true; - ColorDrawable bg = new ColorDrawable(Color.WHITE); - ObjectAnimator anim = ObjectAnimator.ofInt(bg, "color", Color.WHITE, color); - anim.setEvaluator(new ArgbEvaluator()); - anim.setDuration(200L); - anim.setRepeatMode(ValueAnimator.REVERSE); - anim.setRepeatCount(4); - anim.start(); - return bg; - } -} diff --git a/src/com/android/launcher3/views/ButtonPreference.java b/src/com/android/launcher3/views/ButtonPreference.java deleted file mode 100644 index fdcf2ca5ba..0000000000 --- a/src/com/android/launcher3/views/ButtonPreference.java +++ /dev/null @@ -1,65 +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.views; - -import android.content.Context; -import android.preference.Preference; -import android.util.AttributeSet; -import android.view.View; -import android.view.ViewGroup; - -/** - * Extension of {@link Preference} which makes the widget layout clickable. - * - * @see #setWidgetLayoutResource(int) - */ -public class ButtonPreference extends Preference { - - private boolean mWidgetFrameVisible = false; - - public ButtonPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - public ButtonPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public ButtonPreference(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public ButtonPreference(Context context) { - super(context); - } - - public void setWidgetFrameVisible(boolean isVisible) { - if (mWidgetFrameVisible != isVisible) { - mWidgetFrameVisible = isVisible; - notifyChanged(); - } - } - - @Override - protected void onBindView(View view) { - super.onBindView(view); - - ViewGroup widgetFrame = view.findViewById(android.R.id.widget_frame); - if (widgetFrame != null) { - widgetFrame.setVisibility(mWidgetFrameVisible ? View.VISIBLE : View.GONE); - } - } -} -- GitLab From 0ca6c30bf022fda776abf913e0cf61c464c44601 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Fri, 19 Oct 2018 11:39:02 -0700 Subject: [PATCH 0209/1301] Enabling creating additional shortcuts by any launcher Bug: 117888000 Test: manual test with a prototype Change-Id: I4d678a6c35341e61c74ed295d2b2202c5eebe034 --- .../android/quickstep/TaskOverlayFactory.java | 35 ++++++++++++++++--- .../android/quickstep/views/TaskMenuView.java | 22 +++++------- .../quickstep/views/TaskThumbnailView.java | 4 +++ .../com/android/quickstep/views/TaskView.java | 21 ++++++++--- 4 files changed, 61 insertions(+), 21 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java index 72895167f8..59a937f4cc 100644 --- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java +++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java @@ -20,21 +20,34 @@ import android.content.Context; import android.graphics.Matrix; import android.view.View; +import androidx.annotation.AnyThread; + +import com.android.launcher3.BaseActivity; +import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.R; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.ResourceBasedOverride; +import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; -import androidx.annotation.AnyThread; +import java.util.ArrayList; +import java.util.List; /** * Factory class to create and add an overlays on the TaskView */ public class TaskOverlayFactory implements ResourceBasedOverride { - private static TaskOverlayFactory sInstance; + /** Note that these will be shown in order from top to bottom, if available for the task. */ + private static final TaskSystemShortcut[] MENU_OPTIONS = new TaskSystemShortcut[]{ + new TaskSystemShortcut.AppInfo(), + new TaskSystemShortcut.SplitScreen(), + new TaskSystemShortcut.Pin(), + new TaskSystemShortcut.Install(), + }; + public static TaskOverlayFactory get(Context context) { Preconditions.assertUIThread(); if (sInstance == null) { @@ -55,9 +68,23 @@ public class TaskOverlayFactory implements ResourceBasedOverride { public static class TaskOverlay { - public void setTaskInfo(Task task, ThumbnailData thumbnail, Matrix matrix) { } + public void setTaskInfo(Task task, ThumbnailData thumbnail, Matrix matrix) { + } - public void reset() { } + public void reset() { + } + public List getEnabledShortcuts(TaskView taskView) { + final ArrayList shortcuts = new ArrayList<>(); + final BaseDraggingActivity activity = BaseActivity.fromContext(taskView.getContext()); + for (TaskSystemShortcut menuOption : MENU_OPTIONS) { + View.OnClickListener onClickListener = + menuOption.getOnClickListener(activity, taskView); + if (onClickListener != null) { + shortcuts.add(menuOption); + } + } + return shortcuts; + } } } diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java index c4afad7c99..667165bf2e 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java +++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java @@ -43,6 +43,8 @@ import com.android.quickstep.TaskSystemShortcut; import com.android.quickstep.TaskUtils; import com.android.quickstep.views.IconView.OnScaleUpdateListener; +import java.util.List; + /** * Contains options for a recent task when long-pressing its icon. */ @@ -50,14 +52,6 @@ public class TaskMenuView extends AbstractFloatingView { private static final Rect sTempRect = new Rect(); - /** Note that these will be shown in order from top to bottom, if available for the task. */ - public static final TaskSystemShortcut[] MENU_OPTIONS = new TaskSystemShortcut[] { - new TaskSystemShortcut.AppInfo(), - new TaskSystemShortcut.SplitScreen(), - new TaskSystemShortcut.Pin(), - new TaskSystemShortcut.Install(), - }; - private final OnScaleUpdateListener mTaskViewIconScaleListener = new OnScaleUpdateListener() { @Override public void onScaleUpdate(float scale) { @@ -197,11 +191,13 @@ public class TaskMenuView extends AbstractFloatingView { params.topMargin = (int) -mThumbnailTopMargin; mTaskIcon.setLayoutParams(params); - for (TaskSystemShortcut menuOption : MENU_OPTIONS) { - OnClickListener onClickListener = menuOption.getOnClickListener(mActivity, taskView); - if (onClickListener != null) { - addMenuOption(menuOption, onClickListener); - } + final BaseDraggingActivity activity = BaseDraggingActivity.fromContext(getContext()); + final List shortcuts = + taskView.getTaskOverlay().getEnabledShortcuts(taskView); + final int count = shortcuts.size(); + for (int i = 0; i < count; ++i) { + final TaskSystemShortcut menuOption = shortcuts.get(i); + addMenuOption(menuOption, menuOption.getOnClickListener(activity, taskView)); } } diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index 7223f97f44..ce65de1e09 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -173,6 +173,10 @@ public class TaskThumbnailView extends View { return 0; } + public TaskOverlay getTaskOverlay() { + return mOverlay; + } + @Override protected void onDraw(Canvas canvas) { drawOnCanvas(canvas, 0, 0, getMeasuredWidth(), getMeasuredHeight(), mCornerRadius); diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index c1424c4751..56074f0f55 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -42,12 +42,12 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import android.widget.Toast; -import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; +import com.android.quickstep.TaskOverlayFactory; import com.android.quickstep.TaskSystemShortcut; import com.android.quickstep.TaskUtils; import com.android.quickstep.views.RecentsView.PageCallbacks; @@ -56,8 +56,9 @@ import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.Task.TaskCallbacks; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; - import com.android.systemui.shared.system.ActivityOptionsCompat; + +import java.util.List; import java.util.function.Consumer; /** @@ -190,6 +191,10 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback return mIconView; } + public TaskOverlayFactory.TaskOverlay getTaskOverlay() { + return mSnapshotView.getTaskOverlay(); + } + public void launchTask(boolean animate) { launchTask(animate, (result) -> { if (!result) { @@ -384,7 +389,11 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback final Context context = getContext(); final BaseDraggingActivity activity = fromContext(context); - for (TaskSystemShortcut menuOption : TaskMenuView.MENU_OPTIONS) { + final List shortcuts = + mSnapshotView.getTaskOverlay().getEnabledShortcuts(this); + final int count = shortcuts.size(); + for (int i = 0; i < count; ++i) { + final TaskSystemShortcut menuOption = shortcuts.get(i); OnClickListener onClickListener = menuOption.getOnClickListener(activity, this); if (onClickListener != null) { info.addAction(menuOption.createAccessibilityAction(context)); @@ -407,7 +416,11 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback return true; } - for (TaskSystemShortcut menuOption : TaskMenuView.MENU_OPTIONS) { + final List shortcuts = + mSnapshotView.getTaskOverlay().getEnabledShortcuts(this); + final int count = shortcuts.size(); + for (int i = 0; i < count; ++i) { + final TaskSystemShortcut menuOption = shortcuts.get(i); if (menuOption.hasHandlerForAction(action)) { OnClickListener onClickListener = menuOption.getOnClickListener( fromContext(getContext()), this); -- GitLab From 87dc48b7bfaa6b7691cc8b8db2433e6f6b5270ef Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 12 Oct 2018 11:42:33 -0700 Subject: [PATCH 0210/1301] Handling configuration changes at runtime instead of killing the process Change-Id: I0c7f7e58ddb690f371c257b6142a4e918e9acb7f --- .../launcher3/InvariantDeviceProfile.java | 71 ++++++++++++++++--- .../android/launcher3/LauncherAppState.java | 16 +++++ .../android/launcher3/config/BaseFlags.java | 7 +- .../launcher3/icons/BaseIconCache.java | 24 +++++-- .../launcher3/icons/LauncherIcons.java | 45 ++++++++---- .../android/launcher3/util/ConfigMonitor.java | 49 ++++++++----- .../launcher3/util/SQLiteCacheHelper.java | 4 ++ 7 files changed, 168 insertions(+), 48 deletions(-) diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index f3f2238e36..0b2f4d921e 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -16,6 +16,8 @@ package com.android.launcher3; +import static com.android.launcher3.config.FeatureFlags.APPLY_CONFIG_AT_RUNTIME; + import android.annotation.TargetApi; import android.content.Context; import android.content.res.Configuration; @@ -23,6 +25,7 @@ import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.Point; import android.util.DisplayMetrics; +import android.util.Log; import android.util.Xml; import android.view.Display; import android.view.WindowManager; @@ -45,13 +48,13 @@ public class InvariantDeviceProfile { // We do not need any synchronization for this variable as its only written on UI thread. public static final MainThreadInitializedObject INSTANCE = - new MainThreadInitializedObject<>((c) -> { - new ConfigMonitor(c).register(); - return new InvariantDeviceProfile(c); - }); + new MainThreadInitializedObject<>(InvariantDeviceProfile::new); private static final float ICON_SIZE_DEFINED_IN_APP_DP = 48; + public static final int CHANGE_FLAG_GRID = 1 << 0; + public static final int CHANGE_FLAG_ICON_SIZE = 1 << 1; + // Constants that affects the interpolation curve between statically defined device profile // buckets. private static float KNEARESTNEIGHBOR = 3; @@ -61,9 +64,9 @@ public class InvariantDeviceProfile { private static float WEIGHT_EFFICIENT = 100000f; // Profile-defining invariant properties - String name; - float minWidthDps; - float minHeightDps; + private String name; + private float minWidthDps; + private float minHeightDps; /** * Number of icons per row and column in the workspace. @@ -95,9 +98,11 @@ public class InvariantDeviceProfile { public Point defaultWallpaperSize; + private final ArrayList mChangeListeners = new ArrayList<>(); + private ConfigMonitor mConfigMonitor; + @VisibleForTesting - public InvariantDeviceProfile() { - } + public InvariantDeviceProfile() {} private InvariantDeviceProfile(InvariantDeviceProfile p) { this(p.name, p.minWidthDps, p.minHeightDps, p.numRows, p.numColumns, @@ -125,6 +130,12 @@ public class InvariantDeviceProfile { @TargetApi(23) private InvariantDeviceProfile(Context context) { + initGrid(context); + mConfigMonitor = new ConfigMonitor(context, + APPLY_CONFIG_AT_RUNTIME.get() ? this::onConfigChanged : this::killProcess); + } + + private void initGrid(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); DisplayMetrics dm = new DisplayMetrics(); @@ -185,6 +196,44 @@ public class InvariantDeviceProfile { } } + public void addOnChangeListener(OnIDPChangeListener listener) { + mChangeListeners.add(listener); + } + + private void killProcess(Context context) { + Log.e("ConfigMonitor", "restarting launcher"); + android.os.Process.killProcess(android.os.Process.myPid()); + } + + private void onConfigChanged(Context context) { + // Config changes, what shall we do? + InvariantDeviceProfile oldProfile = new InvariantDeviceProfile(this); + + // Re-init grid + initGrid(context); + + int changeFlags = 0; + if (numRows != oldProfile.numRows || + numColumns != oldProfile.numColumns || + numFolderColumns != oldProfile.numFolderColumns || + numFolderRows != oldProfile.numFolderRows || + numHotseatIcons != oldProfile.numHotseatIcons) { + changeFlags |= CHANGE_FLAG_GRID; + } + + if (iconSize != oldProfile.iconSize || iconBitmapSize != oldProfile.iconBitmapSize) { + changeFlags |= CHANGE_FLAG_ICON_SIZE; + } + + // Create a new config monitor + mConfigMonitor.unregister(); + mConfigMonitor = new ConfigMonitor(context, this::onConfigChanged); + + for (OnIDPChangeListener listener : mChangeListeners) { + listener.onIdpChanged(changeFlags, this); + } + } + ArrayList getPredefinedDeviceProfiles(Context context) { ArrayList profiles = new ArrayList<>(); try (XmlResourceParser parser = context.getResources().getXml(R.xml.device_profiles)) { @@ -356,4 +405,8 @@ public class InvariantDeviceProfile { return x * aspectRatio + y; } + public interface OnIDPChangeListener { + + void onIdpChanged(int changeFlags, InvariantDeviceProfile profile); + } } \ No newline at end of file diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index 6bf581277e..338c20bbcb 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -17,6 +17,7 @@ package com.android.launcher3; import static com.android.launcher3.util.SecureSettingsObserver.newNotificationSettingsObserver; +import static com.android.launcher3.InvariantDeviceProfile.CHANGE_FLAG_ICON_SIZE; import android.content.ComponentName; import android.content.ContentProviderClient; @@ -30,6 +31,7 @@ import com.android.launcher3.compat.PackageInstallerCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.icons.IconCache; +import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.notification.NotificationListener; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.Preconditions; @@ -94,6 +96,7 @@ public class LauncherAppState { mContext.registerReceiver(mModel, filter); UserManagerCompat.getInstance(mContext).enableAndResetCache(); + mInvariantDeviceProfile.addOnChangeListener(this::onIdpChanged); if (!mContext.getResources().getBoolean(R.bool.notification_badging_enabled)) { mNotificationBadgingObserver = null; @@ -113,6 +116,19 @@ public class LauncherAppState { } } + private void onIdpChanged(int changeFlags, InvariantDeviceProfile idp) { + if (changeFlags == 0) { + return; + } + + if ((changeFlags & CHANGE_FLAG_ICON_SIZE) != 0) { + LauncherIcons.clearPool(); + mIconCache.updateIconParams(idp.fillResIconDpi, idp.iconBitmapSize); + } + + mModel.forceReload(); + } + /** * Call from Application.onTerminate(), which is not guaranteed to ever be called. */ diff --git a/src/com/android/launcher3/config/BaseFlags.java b/src/com/android/launcher3/config/BaseFlags.java index dc60c8fff2..290d8c4994 100644 --- a/src/com/android/launcher3/config/BaseFlags.java +++ b/src/com/android/launcher3/config/BaseFlags.java @@ -84,6 +84,12 @@ abstract class BaseFlags { // trying to make them fit the orientation the device is in. public static final boolean OVERVIEW_USE_SCREENSHOT_ORIENTATION = true; + /** + * Feature flag to handle define config changes dynamically instead of killing the process. + */ + public static final TogglableFlag APPLY_CONFIG_AT_RUNTIME = new TogglableFlag( + "APPLY_CONFIG_AT_RUNTIME", false, "Apply display changes dynamically"); + public static void initialize(Context context) { // Avoid the disk read for builds without the flags UI. if (showFlagTogglerUi()) { @@ -188,5 +194,4 @@ abstract class BaseFlags { return h$; } } - } diff --git a/src/com/android/launcher3/icons/BaseIconCache.java b/src/com/android/launcher3/icons/BaseIconCache.java index 6433103f94..5b74d1da16 100644 --- a/src/com/android/launcher3/icons/BaseIconCache.java +++ b/src/com/android/launcher3/icons/BaseIconCache.java @@ -90,11 +90,11 @@ public class BaseIconCache { private final HashMap mCache = new HashMap<>(INITIAL_ICON_CACHE_CAPACITY); private final InstantAppResolver mInstantAppResolver; - final int mIconDpi; - - final IconDB mIconDb; final Handler mWorkerHandler; + int mIconDpi; + IconDB mIconDb; + private final BitmapFactory.Options mDecodeOptions; public BaseIconCache(Context context, int iconDpi, int iconPixelSize) { @@ -103,8 +103,6 @@ public class BaseIconCache { mUserManager = UserManagerCompat.getInstance(mContext); mLauncherApps = LauncherAppsCompat.getInstance(mContext); mInstantAppResolver = InstantAppResolver.newInstance(mContext); - mIconDpi = iconDpi; - mIconDb = new IconDB(context, iconPixelSize); mIconProvider = IconProvider.newInstance(context); mWorkerHandler = new Handler(LauncherModel.getWorkerLooper()); @@ -115,6 +113,22 @@ public class BaseIconCache { } else { mDecodeOptions = null; } + + mIconDpi = iconDpi; + mIconDb = new IconDB(context, iconPixelSize); + } + + public void updateIconParams(int iconDpi, int iconPixelSize) { + mWorkerHandler.post(() -> updateIconParamsBg(iconDpi, iconPixelSize)); + } + + private synchronized void updateIconParamsBg(int iconDpi, int iconPixelSize) { + mIconDpi = iconDpi; + mDefaultIcons.clear(); + + mIconDb.close(); + mIconDb = new IconDB(mContext, iconPixelSize); + mCache.clear(); } private Drawable getFullResDefaultActivityIcon() { diff --git a/src/com/android/launcher3/icons/LauncherIcons.java b/src/com/android/launcher3/icons/LauncherIcons.java index 69614a3cb7..c96d35db56 100644 --- a/src/com/android/launcher3/icons/LauncherIcons.java +++ b/src/com/android/launcher3/icons/LauncherIcons.java @@ -27,11 +27,11 @@ import android.os.UserHandle; import com.android.launcher3.AppInfo; import com.android.launcher3.FastBitmapDrawable; -import com.android.launcher3.graphics.BitmapRenderer; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.LauncherAppState; import com.android.launcher3.Utilities; +import com.android.launcher3.graphics.BitmapRenderer; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; @@ -48,13 +48,14 @@ public class LauncherIcons extends BaseIconFactory implements AutoCloseable { private static final Object sPoolSync = new Object(); private static LauncherIcons sPool; - private LauncherIcons next; + private static int sPoolId = 0; /** * Return a new Message instance from the global pool. Allows us to * avoid allocating new objects in many cases. */ public static LauncherIcons obtain(Context context) { + int poolId; synchronized (sPoolSync) { if (sPool != null) { LauncherIcons m = sPool; @@ -62,9 +63,33 @@ public class LauncherIcons extends BaseIconFactory implements AutoCloseable { m.next = null; return m; } + poolId = sPoolId; } + InvariantDeviceProfile idp = LauncherAppState.getIDP(context); - return new LauncherIcons(context, idp.fillResIconDpi, idp.iconBitmapSize); + return new LauncherIcons(context, idp.fillResIconDpi, idp.iconBitmapSize, poolId); + } + + public static void clearPool() { + synchronized (sPoolSync) { + sPool = null; + sPoolId++; + } + } + + private final Context mContext; + private final int mFillResIconDpi; + private final int mIconBitmapSize; + private final int mPoolId; + + private LauncherIcons next; + + private LauncherIcons(Context context, int fillResIconDpi, int iconBitmapSize, int poolId) { + super(context, fillResIconDpi, iconBitmapSize); + mContext = context.getApplicationContext(); + mFillResIconDpi = fillResIconDpi; + mIconBitmapSize = iconBitmapSize; + mPoolId = poolId; } /** @@ -72,6 +97,9 @@ public class LauncherIcons extends BaseIconFactory implements AutoCloseable { */ public void recycle() { synchronized (sPoolSync) { + if (sPoolId != mPoolId) { + return; + } // Clear any temporary state variables clear(); @@ -85,17 +113,6 @@ public class LauncherIcons extends BaseIconFactory implements AutoCloseable { recycle(); } - private final Context mContext; - private final int mFillResIconDpi; - private final int mIconBitmapSize; - - private LauncherIcons(Context context, int fillResIconDpi, int iconBitmapSize) { - super(context, fillResIconDpi, iconBitmapSize); - mContext = context.getApplicationContext(); - mFillResIconDpi = fillResIconDpi; - mIconBitmapSize = iconBitmapSize; - } - public BitmapInfo createBadgedIconBitmap(Drawable icon, UserHandle user, int iconAppTargetSdk) { return createBadgedIconBitmap(icon, user, iconAppTargetSdk, false); diff --git a/src/com/android/launcher3/util/ConfigMonitor.java b/src/com/android/launcher3/util/ConfigMonitor.java index 5dd0d08d67..717acdccbe 100644 --- a/src/com/android/launcher3/util/ConfigMonitor.java +++ b/src/com/android/launcher3/util/ConfigMonitor.java @@ -29,9 +29,12 @@ import android.util.Log; import android.view.Display; import android.view.WindowManager; +import com.android.launcher3.MainThreadExecutor; +import com.android.launcher3.Utilities.Consumer; + /** * {@link BroadcastReceiver} which watches configuration changes and - * restarts the process in case changes which affect the device profile occur. + * notifies the callback in case changes which affect the device profile occur. */ public class ConfigMonitor extends BroadcastReceiver implements DisplayListener { @@ -48,7 +51,9 @@ public class ConfigMonitor extends BroadcastReceiver implements DisplayListener private final Point mRealSize; private final Point mSmallestSize, mLargestSize; - public ConfigMonitor(Context context) { + private Consumer mCallback; + + public ConfigMonitor(Context context, Consumer callback) { mContext = context; Configuration config = context.getResources().getConfiguration(); @@ -64,6 +69,12 @@ public class ConfigMonitor extends BroadcastReceiver implements DisplayListener mSmallestSize = new Point(); mLargestSize = new Point(); display.getCurrentSizeRange(mSmallestSize, mLargestSize); + + mCallback = callback; + + mContext.registerReceiver(this, new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED)); + mContext.getSystemService(DisplayManager.class) + .registerDisplayListener(this, new Handler(UiThreadHelper.getBackgroundLooper())); } @Override @@ -71,16 +82,10 @@ public class ConfigMonitor extends BroadcastReceiver implements DisplayListener Configuration config = context.getResources().getConfiguration(); if (mFontScale != config.fontScale || mDensity != config.densityDpi) { Log.d(TAG, "Configuration changed"); - killProcess(); + notifyChange(); } } - public void register() { - mContext.registerReceiver(this, new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED)); - mContext.getSystemService(DisplayManager.class) - .registerDisplayListener(this, new Handler(UiThreadHelper.getBackgroundLooper())); - } - @Override public void onDisplayAdded(int displayId) { } @@ -97,7 +102,7 @@ public class ConfigMonitor extends BroadcastReceiver implements DisplayListener if (!mRealSize.equals(mTmpPoint1) && !mRealSize.equals(mTmpPoint1.y, mTmpPoint1.x)) { Log.d(TAG, String.format("Display size changed from %s to %s", mRealSize, mTmpPoint1)); - killProcess(); + notifyChange(); return; } @@ -105,22 +110,28 @@ public class ConfigMonitor extends BroadcastReceiver implements DisplayListener if (!mSmallestSize.equals(mTmpPoint1) || !mLargestSize.equals(mTmpPoint2)) { Log.d(TAG, String.format("Available size changed from [%s, %s] to [%s, %s]", mSmallestSize, mLargestSize, mTmpPoint1, mTmpPoint2)); - killProcess(); + notifyChange(); } } - private void killProcess() { - Log.d(TAG, "restarting launcher"); - try { - mContext.unregisterReceiver(this); - mContext.getSystemService(DisplayManager.class).unregisterDisplayListener(this); - } catch (Exception e) { - // We are going to die anyway, ignore any error die to race condition in registering. + private synchronized void notifyChange() { + if (mCallback != null) { + Consumer callback = mCallback; + mCallback = null; + new MainThreadExecutor().execute(() -> callback.accept(mContext)); } - android.os.Process.killProcess(android.os.Process.myPid()); } private Display getDefaultDisplay(Context context) { return context.getSystemService(WindowManager.class).getDefaultDisplay(); } + + public void unregister() { + try { + mContext.unregisterReceiver(this); + mContext.getSystemService(DisplayManager.class).unregisterDisplayListener(this); + } catch (Exception e) { + Log.e(TAG, "Failed to unregister config monitor", e); + } + } } diff --git a/src/com/android/launcher3/util/SQLiteCacheHelper.java b/src/com/android/launcher3/util/SQLiteCacheHelper.java index 44c1762c34..3faf0709a9 100644 --- a/src/com/android/launcher3/util/SQLiteCacheHelper.java +++ b/src/com/android/launcher3/util/SQLiteCacheHelper.java @@ -87,6 +87,10 @@ public abstract class SQLiteCacheHelper { mOpenHelper.clearDB(mOpenHelper.getWritableDatabase()); } + public void close() { + mOpenHelper.close(); + } + protected abstract void onCreateTable(SQLiteDatabase db); /** -- GitLab From cda96a5b43b7facfd64ef58f54763862731c9bc4 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 18 Oct 2018 15:05:45 -0700 Subject: [PATCH 0211/1301] Setup make icon-loader library Bug: 115891474 Test: make -j10 icon-loader Next step: Launcher will depend on icon-loader in next CL Change-Id: I797ddb857cf8be79f3be6ca2f174c593ca3713a5 --- Android.bp | 20 ++++++++++++++++ .../launcher3/InstallShortcutReceiver.java | 6 ++--- .../android/launcher3/ItemInfoWithIcon.java | 8 +++++++ src/com/android/launcher3/LauncherModel.java | 2 +- .../compat/LauncherAppsCompatVO.java | 2 +- .../android/launcher3/dragndrop/DragView.java | 23 ++++++++++++------- .../launcher3/icons/BaseIconCache.java | 2 +- .../launcher3/icons/BaseIconFactory.java | 4 ++-- .../android/launcher3/icons/BitmapInfo.java | 7 ------ .../android/launcher3/icons/IconCache.java | 2 +- .../launcher3/icons/IconNormalizer.java | 17 ++++---------- .../launcher3/icons/ShadowGenerator.java | 13 ++++------- .../android/launcher3/model/LoaderCursor.java | 6 ++--- .../android/launcher3/model/LoaderTask.java | 4 ++-- .../launcher3/model/PackageUpdatedTask.java | 2 +- .../launcher3/model/ShortcutsChangedTask.java | 4 ++-- .../model/UserLockStateChangedTask.java | 2 +- .../launcher3/popup/PopupPopulator.java | 2 +- 18 files changed, 70 insertions(+), 56 deletions(-) diff --git a/Android.bp b/Android.bp index 2608280c92..4b327020c3 100644 --- a/Android.bp +++ b/Android.bp @@ -28,3 +28,23 @@ java_library_static { ], platform_apis: true, } + + +android_library { + name: "icon-loader", + sdk_version: "28", + static_libs: [ + "androidx.core_core", + ], + resource_dirs: [ + "res", + ], + srcs: [ + "src/com/android/launcher3/icons/BaseIconFactory.java", + "src/com/android/launcher3/icons/BitmapInfo.java", + "src/com/android/launcher3/icons/IconNormalizer.java", + "src/com/android/launcher3/icons/FixedScaleDrawable.java", + "src/com/android/launcher3/icons/ShadowGenerator.java", + "src/com/android/launcher3/icons/ColorExtractor.java", + ], +} diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index 7190f12779..851454b77b 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -480,7 +480,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { final LauncherAppState app = LauncherAppState.getInstance(mContext); // Set default values until proper values is loaded. appInfo.title = ""; - app.getIconCache().getDefaultIcon(user).applyTo(appInfo); + appInfo.applyFrom(app.getIconCache().getDefaultIcon(user)); final ShortcutInfo si = appInfo.makeShortcut(); if (Looper.myLooper() == LauncherModel.getWorkerLooper()) { app.getIconCache().getTitleAndIcon(si, activityInfo, false /* useLowResIcon */); @@ -495,7 +495,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } else if (shortcutInfo != null) { ShortcutInfo si = new ShortcutInfo(shortcutInfo, mContext); LauncherIcons li = LauncherIcons.obtain(mContext); - li.createShortcutIcon(shortcutInfo).applyTo(si); + si.applyFrom(li.createShortcutIcon(shortcutInfo)); li.recycle(); return Pair.create((ItemInfo) si, (Object) shortcutInfo); } else if (providerInfo != null) { @@ -656,7 +656,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { if (iconInfo == null) { iconInfo = app.getIconCache().getDefaultIcon(info.user); } - iconInfo.applyTo(info); + info.applyFrom(iconInfo); info.title = Utilities.trim(name); info.contentDescription = UserManagerCompat.getInstance(app.getContext()) diff --git a/src/com/android/launcher3/ItemInfoWithIcon.java b/src/com/android/launcher3/ItemInfoWithIcon.java index 6d453c9b38..e29f92713d 100644 --- a/src/com/android/launcher3/ItemInfoWithIcon.java +++ b/src/com/android/launcher3/ItemInfoWithIcon.java @@ -20,6 +20,8 @@ import static com.android.launcher3.icons.BitmapInfo.LOW_RES_ICON; import android.graphics.Bitmap; +import com.android.launcher3.icons.BitmapInfo; + /** * Represents an ItemInfo which also holds an icon. */ @@ -118,4 +120,10 @@ public abstract class ItemInfoWithIcon extends ItemInfo { public boolean usingLowResIcon() { return iconBitmap == LOW_RES_ICON; } + + public void applyFrom(BitmapInfo info) { + iconBitmap = info.icon; + iconColor = info.color; + } + } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index cbfde25596..8e9021f58b 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -657,7 +657,7 @@ public class LauncherModel extends BroadcastReceiver updateAndBindShortcutInfo(() -> { si.updateFromDeepShortcutInfo(info, mApp.getContext()); LauncherIcons li = LauncherIcons.obtain(mApp.getContext()); - li.createShortcutIcon(info).applyTo(si); + si.applyFrom(li.createShortcutIcon(info)); li.recycle(); return si; }); diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java index fb446600c3..82617fe7ee 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java @@ -139,7 +139,7 @@ public class LauncherAppsCompatVO extends LauncherAppsCompatVL { ShortcutInfo info = new ShortcutInfo(compat, context); // Apply the unbadged icon and fetch the actual icon asynchronously. LauncherIcons li = LauncherIcons.obtain(context); - li.createShortcutIcon(compat, false /* badged */).applyTo(info); + info.applyFrom(li.createShortcutIcon(compat, false /* badged */)); li.recycle(); LauncherAppState.getInstance(context).getModel() .updateAndBindShortcutInfo(info, compat); diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index 6d1efd5879..b6a8b50a95 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -204,7 +204,7 @@ public class DragView extends View { public void run() { LauncherAppState appState = LauncherAppState.getInstance(mLauncher); Object[] outObj = new Object[1]; - final Drawable dr = getFullDrawable(info, appState, outObj); + Drawable dr = getFullDrawable(info, appState, outObj); if (dr instanceof AdaptiveIconDrawable) { int w = mBitmap.getWidth(); @@ -220,10 +220,20 @@ public class DragView extends View { mBadge = getBadge(info, appState, outObj[0]); mBadge.setBounds(badgeBounds); - LauncherIcons li = LauncherIcons.obtain(mLauncher); - Utilities.scaleRectAboutCenter(bounds, - li.getNormalizer().getScale(dr, null, null, null)); - li.recycle(); + // Do not draw the background in case of folder as its translucent + mDrawBitmap = !(dr instanceof FolderAdaptiveIcon); + + try (LauncherIcons li = LauncherIcons.obtain(mLauncher)) { + Drawable nDr; // drawable to be normalized + if (mDrawBitmap) { + nDr = dr; + } else { + // Since we just want the scale, avoid heavy drawing operations + nDr = new AdaptiveIconDrawable(new ColorDrawable(Color.BLACK), null); + } + Utilities.scaleRectAboutCenter(bounds, + li.getNormalizer().getScale(nDr, null, null, null)); + } AdaptiveIconDrawable adaptiveIcon = (AdaptiveIconDrawable) dr; // Shrink very tiny bit so that the clip path is smaller than the original bitmap @@ -259,9 +269,6 @@ public class DragView extends View { // Assign the variable on the UI thread to avoid race conditions. mScaledMaskPath = mask; - // Do not draw the background in case of folder as its translucent - mDrawBitmap = !(dr instanceof FolderAdaptiveIcon); - if (info.isDisabled()) { FastBitmapDrawable d = new FastBitmapDrawable((Bitmap) null); d.setIsDisabled(true); diff --git a/src/com/android/launcher3/icons/BaseIconCache.java b/src/com/android/launcher3/icons/BaseIconCache.java index 6433103f94..9198c24825 100644 --- a/src/com/android/launcher3/icons/BaseIconCache.java +++ b/src/com/android/launcher3/icons/BaseIconCache.java @@ -261,7 +261,7 @@ public class BaseIconCache { protected void applyCacheEntry(CacheEntry entry, ItemInfoWithIcon info) { info.title = Utilities.trim(entry.title); info.contentDescription = entry.contentDescription; - ((entry.icon == null) ? getDefaultIcon(info.user) : entry).applyTo(info); + info.applyFrom((entry.icon == null) ? getDefaultIcon(info.user) : entry); } public synchronized BitmapInfo getDefaultIcon(UserHandle user) { diff --git a/src/com/android/launcher3/icons/BaseIconFactory.java b/src/com/android/launcher3/icons/BaseIconFactory.java index db723b7208..c8c9618279 100644 --- a/src/com/android/launcher3/icons/BaseIconFactory.java +++ b/src/com/android/launcher3/icons/BaseIconFactory.java @@ -69,14 +69,14 @@ public class BaseIconFactory { public ShadowGenerator getShadowGenerator() { if (mShadowGenerator == null) { - mShadowGenerator = new ShadowGenerator(mContext); + mShadowGenerator = new ShadowGenerator(mIconBitmapSize); } return mShadowGenerator; } public IconNormalizer getNormalizer() { if (mNormalizer == null) { - mNormalizer = new IconNormalizer(mContext); + mNormalizer = new IconNormalizer(mContext, mIconBitmapSize); } return mNormalizer; } diff --git a/src/com/android/launcher3/icons/BitmapInfo.java b/src/com/android/launcher3/icons/BitmapInfo.java index ebe05113e8..245561ea53 100644 --- a/src/com/android/launcher3/icons/BitmapInfo.java +++ b/src/com/android/launcher3/icons/BitmapInfo.java @@ -18,8 +18,6 @@ package com.android.launcher3.icons; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; -import com.android.launcher3.ItemInfoWithIcon; - public class BitmapInfo { public static final Bitmap LOW_RES_ICON = Bitmap.createBitmap(1, 1, Config.ALPHA_8); @@ -27,11 +25,6 @@ public class BitmapInfo { public Bitmap icon; public int color; - public void applyTo(ItemInfoWithIcon info) { - info.iconBitmap = icon; - info.iconColor = color; - } - public void applyTo(BitmapInfo info) { info.icon = icon; info.color = color; diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java index 434945550c..41a53e572f 100644 --- a/src/com/android/launcher3/icons/IconCache.java +++ b/src/com/android/launcher3/icons/IconCache.java @@ -139,7 +139,7 @@ public class IconCache extends BaseIconCache { // null info means not installed, but if we have a component from the intent then // we should still look in the cache for restored app icons. if (info.getTargetComponent() == null) { - getDefaultIcon(info.user).applyTo(info); + info.applyFrom(getDefaultIcon(info.user)); info.title = ""; info.contentDescription = ""; } else { diff --git a/src/com/android/launcher3/icons/IconNormalizer.java b/src/com/android/launcher3/icons/IconNormalizer.java index 73177825bd..4052a55147 100644 --- a/src/com/android/launcher3/icons/IconNormalizer.java +++ b/src/com/android/launcher3/icons/IconNormalizer.java @@ -28,14 +28,9 @@ import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.AdaptiveIconDrawable; -import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.Log; -import com.android.launcher3.LauncherAppState; -import com.android.launcher3.Utilities; -import com.android.launcher3.dragndrop.FolderAdaptiveIcon; - import java.nio.ByteBuffer; import androidx.annotation.NonNull; @@ -84,9 +79,9 @@ public class IconNormalizer { private final Matrix mMatrix; /** package private **/ - IconNormalizer(Context context) { + IconNormalizer(Context context, int iconBitmapSize) { // Use twice the icon size as maximum size to avoid scaling down twice. - mMaxSize = LauncherAppState.getIDP(context).iconBitmapSize * 2; + mMaxSize = iconBitmapSize * 2; mBitmap = Bitmap.createBitmap(mMaxSize, mMaxSize, Bitmap.Config.ALPHA_8); mCanvas = new Canvas(mBitmap); mPixels = new byte[mMaxSize * mMaxSize]; @@ -193,17 +188,13 @@ public class IconNormalizer { */ public synchronized float getScale(@NonNull Drawable d, @Nullable RectF outBounds, @Nullable Path path, @Nullable boolean[] outMaskShape) { - if (Utilities.ATLEAST_OREO && d instanceof AdaptiveIconDrawable) { + if (BaseIconFactory.ATLEAST_OREO && d instanceof AdaptiveIconDrawable) { if (mAdaptiveIconScale != SCALE_NOT_INITIALIZED) { if (outBounds != null) { outBounds.set(mAdaptiveIconBounds); } return mAdaptiveIconScale; } - if (d instanceof FolderAdaptiveIcon) { - // Since we just want the scale, avoid heavy drawing operations - d = new AdaptiveIconDrawable(new ColorDrawable(Color.BLACK), null); - } } int width = d.getIntrinsicWidth(); int height = d.getIntrinsicHeight(); @@ -314,7 +305,7 @@ public class IconNormalizer { 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.ATLEAST_OREO && d instanceof AdaptiveIconDrawable && + if (BaseIconFactory.ATLEAST_OREO && d instanceof AdaptiveIconDrawable && mAdaptiveIconScale == SCALE_NOT_INITIALIZED) { mAdaptiveIconScale = scale; mAdaptiveIconBounds.set(mBounds); diff --git a/src/com/android/launcher3/icons/ShadowGenerator.java b/src/com/android/launcher3/icons/ShadowGenerator.java index 57d463a806..6491b7ec15 100644 --- a/src/com/android/launcher3/icons/ShadowGenerator.java +++ b/src/com/android/launcher3/icons/ShadowGenerator.java @@ -16,7 +16,6 @@ package com.android.launcher3.icons; -import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BlurMaskFilter; @@ -28,23 +27,19 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; -import com.android.launcher3.LauncherAppState; - import androidx.core.graphics.ColorUtils; /** * Utility class to add shadows to bitmaps. */ public class ShadowGenerator { - - // Percent of actual icon size - private static final float HALF_DISTANCE = 0.5f; public static final float BLUR_FACTOR = 0.5f/48; // Percent of actual icon size public static final float KEY_SHADOW_DISTANCE = 1f/48; private static final int KEY_SHADOW_ALPHA = 61; - + // Percent of actual icon size + private static final float HALF_DISTANCE = 0.5f; private static final int AMBIENT_SHADOW_ALPHA = 30; private final int mIconSize; @@ -53,8 +48,8 @@ public class ShadowGenerator { private final Paint mDrawPaint; private final BlurMaskFilter mDefaultBlurMaskFilter; - public ShadowGenerator(Context context) { - mIconSize = LauncherAppState.getIDP(context).iconBitmapSize; + public ShadowGenerator(int iconSize) { + mIconSize = iconSize; mBlurPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); mDrawPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); mDefaultBlurMaskFilter = new BlurMaskFilter(mIconSize * BLUR_FACTOR, Blur.NORMAL); diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java index 94cf5c286a..ea4d32b282 100644 --- a/src/com/android/launcher3/model/LoaderCursor.java +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -153,7 +153,7 @@ public class LoaderCursor extends CursorWrapper { info.title = getTitle(); // the fallback icon if (!loadIcon(info)) { - mIconCache.getDefaultIcon(info.user).applyTo(info); + info.applyFrom(mIconCache.getDefaultIcon(info.user)); } // TODO: If there's an explicit component and we can't install that, delete it. @@ -176,7 +176,7 @@ public class LoaderCursor extends CursorWrapper { BitmapInfo iconInfo = li.createIconBitmap(info.iconResource); li.recycle(); if (iconInfo != null) { - iconInfo.applyTo(info); + info.applyFrom(iconInfo); return true; } } @@ -185,7 +185,7 @@ public class LoaderCursor extends CursorWrapper { // Failed to load from resource, try loading from DB. byte[] data = getBlob(iconIndex); try (LauncherIcons li = LauncherIcons.obtain(mContext)) { - li.createIconBitmap(BitmapFactory.decodeByteArray(data, 0, data.length)).applyTo(info); + info.applyFrom(li.createIconBitmap(BitmapFactory.decodeByteArray(data, 0, data.length))); return true; } catch (Exception e) { Log.e(TAG, "Failed to load icon for info " + info, e); diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index 1ec7af2bb8..405125e12d 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -498,8 +498,8 @@ public class LoaderTask implements Runnable { c.loadIcon(finalInfo) ? finalInfo.iconBitmap : null; LauncherIcons li = LauncherIcons.obtain(context); - li.createShortcutIcon(pinnedShortcut, - true /* badged */, fallbackIconProvider).applyTo(info); + info.applyFrom(li.createShortcutIcon(pinnedShortcut, + true /* badged */, fallbackIconProvider)); li.recycle(); if (pmHelper.isAppSuspended( pinnedShortcut.getPackage(), info.user)) { diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 201a63e116..0f67f0cd48 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -194,7 +194,7 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { BitmapInfo iconInfo = li.createIconBitmap(si.iconResource); li.recycle(); if (iconInfo != null) { - iconInfo.applyTo(si); + si.applyFrom(iconInfo); infoUpdated = true; } } diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index 020bc41822..47fcd9e13b 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -96,8 +96,8 @@ public class ShortcutsChangedTask extends BaseModelUpdateTask { // If the shortcut is pinned but no longer has an icon in the system, // keep the current icon instead of reverting to the default icon. LauncherIcons li = LauncherIcons.obtain(context); - li.createShortcutIcon(fullDetails, true, Provider.of(shortcutInfo.iconBitmap)) - .applyTo(shortcutInfo); + shortcutInfo.applyFrom(li.createShortcutIcon(fullDetails, true, + Provider.of(shortcutInfo.iconBitmap))); li.recycle(); updatedShortcutInfos.add(shortcutInfo); } diff --git a/src/com/android/launcher3/model/UserLockStateChangedTask.java b/src/com/android/launcher3/model/UserLockStateChangedTask.java index 9f02d4fdad..40c1912252 100644 --- a/src/com/android/launcher3/model/UserLockStateChangedTask.java +++ b/src/com/android/launcher3/model/UserLockStateChangedTask.java @@ -95,7 +95,7 @@ public class UserLockStateChangedTask extends BaseModelUpdateTask { // If the shortcut is pinned but no longer has an icon in the system, // keep the current icon instead of reverting to the default icon. LauncherIcons li = LauncherIcons.obtain(context); - li.createShortcutIcon(shortcut, true, Provider.of(si.iconBitmap)).applyTo(si); + si.applyFrom(li.createShortcutIcon(shortcut, true, Provider.of(si.iconBitmap))); li.recycle(); } else { si.runtimeStatusFlags |= FLAG_DISABLED_LOCKED_USER; diff --git a/src/com/android/launcher3/popup/PopupPopulator.java b/src/com/android/launcher3/popup/PopupPopulator.java index c14c00eb87..61113b80fd 100644 --- a/src/com/android/launcher3/popup/PopupPopulator.java +++ b/src/com/android/launcher3/popup/PopupPopulator.java @@ -150,7 +150,7 @@ public class PopupPopulator { final ShortcutInfo si = new ShortcutInfo(shortcut, launcher); // Use unbadged icon for the menu. LauncherIcons li = LauncherIcons.obtain(launcher); - li.createShortcutIcon(shortcut, false /* badged */).applyTo(si); + si.applyFrom(li.createShortcutIcon(shortcut, false /* badged */)); li.recycle(); si.rank = i; -- GitLab From dc7d25d3e18971e1199075a4b7e58a5ddfdf4d59 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 15 Oct 2018 14:01:04 -0700 Subject: [PATCH 0212/1301] Adding SystemShortcut for RemoteAction Bug: 117888000 Test: manual test with a prototype Change-Id: I10ed0a8c0237a85af5ac32a7fc68e1f9d2ffc5ba --- protos/launcher_log.proto | 1 + res/values/config.xml | 1 + res/values/strings.xml | 3 + .../launcher3/popup/RemoteActionShortcut.java | 72 +++++++++++++++++++ .../launcher3/popup/SystemShortcut.java | 16 +++-- 5 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 src/com/android/launcher3/popup/RemoteActionShortcut.java diff --git a/protos/launcher_log.proto b/protos/launcher_log.proto index 41dd0bda4f..b3ed365b88 100644 --- a/protos/launcher_log.proto +++ b/protos/launcher_log.proto @@ -112,6 +112,7 @@ enum ControlType { CANCEL_TARGET = 14; TASK_PREVIEW = 15; SPLIT_SCREEN_TARGET = 16; + REMOTE_ACTION_SHORTCUT = 17; } enum TipType { diff --git a/res/values/config.xml b/res/values/config.xml index 0efaccf194..85c2e65c51 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -123,6 +123,7 @@ + diff --git a/res/values/strings.xml b/res/values/strings.xml index eb6b28413d..7e5784d0bf 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -347,4 +347,7 @@ Notifications and apps are off Close Closed + + + Failed: %1$s diff --git a/src/com/android/launcher3/popup/RemoteActionShortcut.java b/src/com/android/launcher3/popup/RemoteActionShortcut.java new file mode 100644 index 0000000000..af0d3daa58 --- /dev/null +++ b/src/com/android/launcher3/popup/RemoteActionShortcut.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.popup; + +import android.app.PendingIntent; +import android.app.RemoteAction; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.view.View; +import android.widget.Toast; + +import com.android.launcher3.AbstractFloatingView; +import com.android.launcher3.ItemInfo; +import com.android.launcher3.Launcher; +import com.android.launcher3.R; +import com.android.launcher3.userevent.nano.LauncherLogProto; + +public class RemoteActionShortcut extends SystemShortcut { + private static final String TAG = "RemoteActionShortcut"; + + private final RemoteAction mAction; + + public RemoteActionShortcut(RemoteAction action) { + super(action.getIcon(), action.getTitle(), action.getContentDescription(), + R.id.action_remote_action_shortcut); + mAction = action; + } + + @Override + public View.OnClickListener getOnClickListener( + final Launcher launcher, final ItemInfo itemInfo) { + return view -> { + AbstractFloatingView.closeAllOpenViews(launcher); + + try { + mAction.getActionIntent().send(0, + (pendingIntent, intent, resultCode, resultData, resultExtras) -> { + if (resultData != null && !resultData.isEmpty()) { + Log.e(TAG, "Remote action returned result: " + mAction.getTitle() + + " : " + resultData); + Toast.makeText(launcher, resultData, Toast.LENGTH_SHORT).show(); + } + }, new Handler(Looper.getMainLooper())); + } catch (PendingIntent.CanceledException e) { + Log.e(TAG, "Remote action canceled: " + mAction.getTitle(), e); + Toast.makeText(launcher, launcher.getString( + R.string.remote_action_failed, + mAction.getTitle()), + Toast.LENGTH_SHORT) + .show(); + } + + launcher.getUserEventDispatcher().logActionOnControl(LauncherLogProto.Action.Touch.TAP, + LauncherLogProto.ControlType.REMOTE_ACTION_SHORTCUT, view); + }; + } +} diff --git a/src/com/android/launcher3/popup/SystemShortcut.java b/src/com/android/launcher3/popup/SystemShortcut.java index b80ba8abe1..f9a2007930 100644 --- a/src/com/android/launcher3/popup/SystemShortcut.java +++ b/src/com/android/launcher3/popup/SystemShortcut.java @@ -6,8 +6,10 @@ import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; import android.content.Context; import android.content.Intent; import android.graphics.Rect; -import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.ImageView; @@ -36,7 +38,7 @@ import java.util.List; public abstract class SystemShortcut extends ItemInfo { private final int mIconResId; private final int mLabelResId; - private final Drawable mIcon; + private final Icon mIcon; private final CharSequence mLabel; private final CharSequence mContentDescription; private final int mAccessibilityActionId; @@ -50,7 +52,7 @@ public abstract class SystemShortcut extends Ite mContentDescription = null; } - public SystemShortcut(Drawable icon, CharSequence label, CharSequence contentDescription, + public SystemShortcut(Icon icon, CharSequence label, CharSequence contentDescription, int accessibilityActionId) { mIcon = icon; mLabel = label; @@ -71,7 +73,9 @@ public abstract class SystemShortcut extends Ite public void setIconAndLabelFor(View iconView, TextView labelView) { if (mIcon != null) { - iconView.setBackground(mIcon); + mIcon.loadDrawableAsync(iconView.getContext(), + iconView::setBackground, + new Handler(Looper.getMainLooper())); } else { iconView.setBackgroundResource(mIconResId); } @@ -85,7 +89,9 @@ public abstract class SystemShortcut extends Ite public void setIconAndContentDescriptionFor(ImageView view) { if (mIcon != null) { - view.setImageDrawable(mIcon); + mIcon.loadDrawableAsync(view.getContext(), + view::setImageDrawable, + new Handler(Looper.getMainLooper())); } else { view.setImageResource(mIconResId); } -- GitLab From 72c8c311ba78d8a3d2dab2a2bc0e8f1d8091da0b Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Fri, 19 Oct 2018 15:57:40 -0700 Subject: [PATCH 0213/1301] Create OWNERS file in master branch Test: adding a meta file and doesn't affect build Bug: 117838787 Change-Id: I9a0f4ae526179f4e5bd7420b30d10c53c1b427bf --- OWNERS | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 OWNERS diff --git a/OWNERS b/OWNERS new file mode 100644 index 0000000000..a8c84eb2d7 --- /dev/null +++ b/OWNERS @@ -0,0 +1,4 @@ +adamcohen@google.com +hyunyoungs@google.com +sunnygoyal@google.com +winsonc@google.com -- GitLab From 36bf5d6f24ce54f5e178b4c03bf1db4fe7f5b6b2 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 15 Oct 2018 14:01:04 -0700 Subject: [PATCH 0214/1301] Enable creating task shortcuts without inheriting Bug: 117888000 Test: manual test with a prototype Change-Id: Ib7edab875c18b60cafc912325bd4e1fa0b7f515c --- quickstep/src/com/android/quickstep/TaskSystemShortcut.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java index 66ce4c3ac7..a8eb321e46 100644 --- a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java +++ b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java @@ -63,7 +63,7 @@ public class TaskSystemShortcut extends SystemShortcut protected T mSystemShortcut; - protected TaskSystemShortcut(T systemShortcut) { + public TaskSystemShortcut(T systemShortcut) { super(systemShortcut); mSystemShortcut = systemShortcut; } -- GitLab From 658c67a609161bc5958636636fbac81a872934b5 Mon Sep 17 00:00:00 2001 From: Zak Cohen Date: Fri, 19 Oct 2018 14:21:05 -0700 Subject: [PATCH 0215/1301] Deepshortcuts - only keep the per package shortcut count in memory. Change to only keep the per Activity shortcut count in memory, not the list of ids. The full shortcuts are loaded at long press time so saves memory. Bug:117239104 Test:Manual and ran instrumentation tests Change-Id: Iee974ecba2c977216be4f078396ceed22b931f5d --- src/com/android/launcher3/Launcher.java | 6 ++--- src/com/android/launcher3/LauncherModel.java | 4 ++-- .../launcher3/model/BaseModelUpdateTask.java | 12 ++++------ .../android/launcher3/model/BgDataModel.java | 24 +++++++++---------- .../launcher3/model/LoaderResults.java | 22 +++++++---------- .../android/launcher3/model/LoaderTask.java | 2 +- .../launcher3/model/ShortcutsChangedTask.java | 2 +- .../model/UserLockStateChangedTask.java | 2 +- .../popup/PopupContainerWithArrow.java | 10 ++++---- .../launcher3/popup/PopupDataProvider.java | 17 +++++++------ .../launcher3/popup/PopupPopulator.java | 4 ++-- .../shortcuts/DeepShortcutManager.java | 5 ++-- 12 files changed, 49 insertions(+), 61 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 0395fbbcc7..e714a0bf8d 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -110,7 +110,6 @@ import com.android.launcher3.util.ActivityResultInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.ItemInfoMatcher; -import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.MultiValueAlpha; import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; import com.android.launcher3.util.PackageManagerHelper; @@ -137,6 +136,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -2163,11 +2163,11 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } /** - * Copies LauncherModel's map of activities to shortcut ids to Launcher's. This is necessary + * Copies LauncherModel's map of activities to shortcut counts to Launcher's. This is necessary * because LauncherModel's map is updated in the background, while Launcher runs on the UI. */ @Override - public void bindDeepShortcutMap(MultiHashMap deepShortcutMapCopy) { + public void bindDeepShortcutMap(HashMap deepShortcutMapCopy) { mPopupDataProvider.setDeepShortcutMap(deepShortcutMapCopy); } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 8e9021f58b..b3dabae538 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -57,7 +57,6 @@ import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.ItemInfoMatcher; -import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Provider; @@ -69,6 +68,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -161,7 +161,7 @@ public class LauncherModel extends BroadcastReceiver public void bindAllWidgets(ArrayList widgets); public void onPageBoundSynchronously(int page); public void executeOnNextDraw(ViewOnDrawExecutor executor); - public void bindDeepShortcutMap(MultiHashMap deepShortcutMap); + public void bindDeepShortcutMap(HashMap deepShortcutMap); } LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter) { diff --git a/src/com/android/launcher3/model/BaseModelUpdateTask.java b/src/com/android/launcher3/model/BaseModelUpdateTask.java index fcdc088a70..c9d8e3eb48 100644 --- a/src/com/android/launcher3/model/BaseModelUpdateTask.java +++ b/src/com/android/launcher3/model/BaseModelUpdateTask.java @@ -27,10 +27,10 @@ import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.ItemInfoMatcher; -import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.widget.WidgetListRowEntry; import java.util.ArrayList; +import java.util.HashMap; import java.util.concurrent.Executor; /** @@ -107,13 +107,9 @@ public abstract class BaseModelUpdateTask implements ModelUpdateTask { } public void bindDeepShortcuts(BgDataModel dataModel) { - final MultiHashMap shortcutMapCopy = dataModel.deepShortcutMap.clone(); - scheduleCallbackTask(new CallbackTask() { - @Override - public void execute(Callbacks callbacks) { - callbacks.bindDeepShortcutMap(shortcutMapCopy); - } - }); + final HashMap shortcutMapCopy = + new HashMap<>(dataModel.deepShortcutMap); + scheduleCallbackTask(callbacks -> callbacks.bindDeepShortcutMap(shortcutMapCopy)); } public void bindUpdatedWidgets(BgDataModel dataModel) { diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 81eefc4d8b..151d6f4b6f 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -38,7 +38,6 @@ import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSparseArrayMap; -import com.android.launcher3.util.MultiHashMap; import com.google.protobuf.nano.MessageNano; import java.io.FileDescriptor; @@ -97,9 +96,9 @@ public class BgDataModel { public boolean hasShortcutHostPermission; /** - * Maps all launcher activities to the id's of their shortcuts (if they have any). + * Maps all launcher activities to counts of their shortcuts. */ - public final MultiHashMap deepShortcutMap = new MultiHashMap<>(); + public final HashMap deepShortcutMap = new HashMap<>(); /** * Entire list of widgets. @@ -154,14 +153,11 @@ public class BgDataModel { } if (args.length > 0 && TextUtils.equals(args[0], "--all")) { - writer.println(prefix + "shortcuts"); - for (ArrayList map : deepShortcutMap.values()) { - writer.print(prefix + " "); - for (String str : map) { - writer.print(str + ", "); - } - writer.println(); + writer.println(prefix + "shortcut counts "); + for (Integer count : deepShortcutMap.values()) { + writer.print(count + ", "); } + writer.println(); } } @@ -359,9 +355,9 @@ public class BgDataModel { } /** - * Clear all the deep shortcuts for the given package, and re-add the new shortcuts. + * Clear all the deep shortcut counts for the given package, and re-add the new shortcut counts. */ - public synchronized void updateDeepShortcutMap( + public synchronized void updateDeepShortcutCounts( String packageName, UserHandle user, List shortcuts) { if (packageName != null) { Iterator keysIter = deepShortcutMap.keySet().iterator(); @@ -381,7 +377,9 @@ public class BgDataModel { if (shouldShowInContainer) { ComponentKey targetComponent = new ComponentKey(shortcut.getActivity(), shortcut.getUserHandle()); - deepShortcutMap.addToList(targetComponent, shortcut.getId()); + + Integer previousCount = deepShortcutMap.get(targetComponent); + deepShortcutMap.put(targetComponent, previousCount == null ? 1 : previousCount + 1); } } } diff --git a/src/com/android/launcher3/model/LoaderResults.java b/src/com/android/launcher3/model/LoaderResults.java index 2c15df1925..1d18e7667b 100644 --- a/src/com/android/launcher3/model/LoaderResults.java +++ b/src/com/android/launcher3/model/LoaderResults.java @@ -34,7 +34,6 @@ import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.LooperIdleLock; -import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.ViewOnDrawExecutor; import com.android.launcher3.widget.WidgetListRowEntry; @@ -42,9 +41,8 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.HashSet; +import java.util.HashMap; import java.util.Iterator; -import java.util.Set; import java.util.concurrent.Executor; /** @@ -333,20 +331,16 @@ public class LoaderResults { } public void bindDeepShortcuts() { - final MultiHashMap shortcutMapCopy; + final HashMap shortcutMapCopy; synchronized (mBgDataModel) { - shortcutMapCopy = mBgDataModel.deepShortcutMap.clone(); + shortcutMapCopy = new HashMap<>(mBgDataModel.deepShortcutMap); } - Runnable r = new Runnable() { - @Override - public void run() { - Callbacks callbacks = mCallbacks.get(); - if (callbacks != null) { - callbacks.bindDeepShortcutMap(shortcutMapCopy); - } + mUiExecutor.execute(() -> { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindDeepShortcutMap(shortcutMapCopy); } - }; - mUiExecutor.execute(r); + }); } public void bindAllApps() { diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index 405125e12d..8b3e2c9a86 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -861,7 +861,7 @@ public class LoaderTask implements Runnable { if (mUserManager.isUserUnlocked(user)) { List shortcuts = mShortcutManager.queryForAllShortcuts(user); - mBgDataModel.updateDeepShortcutMap(null, user, shortcuts); + mBgDataModel.updateDeepShortcutCounts(null, user, shortcuts); } } } diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index 47fcd9e13b..e99fed9294 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -116,7 +116,7 @@ public class ShortcutsChangedTask extends BaseModelUpdateTask { if (mUpdateIdMap) { // Update the deep shortcut map if the list of ids has changed for an activity. - dataModel.updateDeepShortcutMap(mPackageName, mUser, mShortcuts); + dataModel.updateDeepShortcutCounts(mPackageName, mUser, mShortcuts); bindDeepShortcuts(dataModel); } } diff --git a/src/com/android/launcher3/model/UserLockStateChangedTask.java b/src/com/android/launcher3/model/UserLockStateChangedTask.java index 40c1912252..8e7557a2ee 100644 --- a/src/com/android/launcher3/model/UserLockStateChangedTask.java +++ b/src/com/android/launcher3/model/UserLockStateChangedTask.java @@ -117,7 +117,7 @@ public class UserLockStateChangedTask extends BaseModelUpdateTask { } if (isUserUnlocked) { - dataModel.updateDeepShortcutMap( + dataModel.updateDeepShortcutCounts( null, mUser, deepShortcutManager.queryForAllShortcuts(mUser)); } bindDeepShortcuts(dataModel); diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index b9e6a98b45..4f1fcda122 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -216,13 +216,13 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, BubbleTextView icon, ItemInfo item, SystemShortcutFactory factory) { PopupDataProvider popupDataProvider = mLauncher.getPopupDataProvider(); populateAndShow(icon, - popupDataProvider.getShortcutIdsForItem(item), + popupDataProvider.getShortcutCountForItem(item), popupDataProvider.getNotificationKeysForItem(item), factory.getEnabledShortcuts(mLauncher, item)); } @TargetApi(Build.VERSION_CODES.P) - protected void populateAndShow(final BubbleTextView originalIcon, final List shortcutIds, + protected void populateAndShow(final BubbleTextView originalIcon, int shortcutCount, final List notificationKeys, List systemShortcuts) { mNumNotifications = notificationKeys.size(); mOriginalIcon = originalIcon; @@ -240,12 +240,12 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, int viewsToFlip = getChildCount(); mSystemShortcutContainer = this; - if (!shortcutIds.isEmpty()) { + if (shortcutCount > 0) { if (mNotificationItemView != null) { mNotificationItemView.addGutter(); } - for (int i = shortcutIds.size(); i > 0; i--) { + for (int i = shortcutCount; i > 0; i--) { mShortcuts.add(inflateAndAdd(R.layout.deep_shortcut, this)); } updateHiddenShortcuts(); @@ -284,7 +284,7 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, final Looper workerLooper = LauncherModel.getWorkerLooper(); new Handler(workerLooper).postAtFrontOfQueue(PopupPopulator.createUpdateRunnable( mLauncher, originalItemInfo, new Handler(Looper.getMainLooper()), - this, shortcutIds, mShortcuts, notificationKeys)); + this, mShortcuts, notificationKeys)); } private String getTitleForAccessibility() { diff --git a/src/com/android/launcher3/popup/PopupDataProvider.java b/src/com/android/launcher3/popup/PopupDataProvider.java index 4d5a9c6e93..320650397f 100644 --- a/src/com/android/launcher3/popup/PopupDataProvider.java +++ b/src/com/android/launcher3/popup/PopupDataProvider.java @@ -29,7 +29,6 @@ import com.android.launcher3.notification.NotificationKeyData; import com.android.launcher3.notification.NotificationListener; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.util.ComponentKey; -import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.widget.WidgetListRowEntry; @@ -52,8 +51,8 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan private final Launcher mLauncher; - /** Maps launcher activity components to their list of shortcut ids. */ - private MultiHashMap mDeepShortcutMap = new MultiHashMap<>(); + /** Maps launcher activity components to a count of how many shortcuts they have. */ + private HashMap mDeepShortcutMap = new HashMap<>(); /** Maps packages to their BadgeInfo's . */ private Map mPackageUserToBadgeInfos = new HashMap<>(); /** Maps packages to their Widgets */ @@ -146,22 +145,22 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan } } - public void setDeepShortcutMap(MultiHashMap deepShortcutMapCopy) { + public void setDeepShortcutMap(HashMap deepShortcutMapCopy) { mDeepShortcutMap = deepShortcutMapCopy; if (LOGD) Log.d(TAG, "bindDeepShortcutMap: " + mDeepShortcutMap); } - public List getShortcutIdsForItem(ItemInfo info) { + public int getShortcutCountForItem(ItemInfo info) { if (!DeepShortcutManager.supportsShortcuts(info)) { - return Collections.EMPTY_LIST; + return 0; } ComponentName component = info.getTargetComponent(); if (component == null) { - return Collections.EMPTY_LIST; + return 0; } - List ids = mDeepShortcutMap.get(new ComponentKey(component, info.user)); - return ids == null ? Collections.EMPTY_LIST : ids; + Integer count = mDeepShortcutMap.get(new ComponentKey(component, info.user)); + return count == null ? 0 : count; } public BadgeInfo getBadgeInfoForItem(ItemInfo info) { diff --git a/src/com/android/launcher3/popup/PopupPopulator.java b/src/com/android/launcher3/popup/PopupPopulator.java index 61113b80fd..2c59202e9b 100644 --- a/src/com/android/launcher3/popup/PopupPopulator.java +++ b/src/com/android/launcher3/popup/PopupPopulator.java @@ -124,7 +124,7 @@ public class PopupPopulator { public static Runnable createUpdateRunnable(final Launcher launcher, final ItemInfo originalInfo, final Handler uiHandler, final PopupContainerWithArrow container, - final List shortcutIds, final List shortcutViews, + final List shortcutViews, final List notificationKeys) { final ComponentName activity = originalInfo.getTargetComponent(); final UserHandle user = originalInfo.user; @@ -141,7 +141,7 @@ public class PopupPopulator { } List shortcuts = DeepShortcutManager.getInstance(launcher) - .queryForShortcutsContainer(activity, shortcutIds, user); + .queryForShortcutsContainer(activity, user); String shortcutIdToDeDupe = notificationKeys.isEmpty() ? null : notificationKeys.get(0).shortcutId; shortcuts = PopupPopulator.sortAndFilterShortcuts(shortcuts, shortcutIdToDeDupe); diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java index 24e2e2f81f..e70aac68f6 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -94,10 +94,11 @@ public class DeepShortcutManager { * Gets all the manifest and dynamic shortcuts associated with the given package and user, * to be displayed in the shortcuts container on long press. */ + @TargetApi(25) public List queryForShortcutsContainer(ComponentName activity, - List ids, UserHandle user) { + UserHandle user) { return query(ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_DYNAMIC, - activity.getPackageName(), activity, ids, user); + activity.getPackageName(), activity, null, user); } /** -- GitLab From 6ec45c76cf8f44f573ec7028f344673bbbf3c722 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 22 Oct 2018 09:54:55 -0700 Subject: [PATCH 0216/1301] Add FirstScreenWidget plugin interface Bug: 115877296 Change-Id: I974300a6460677758cbe99cab3bb71339eb2928b --- .../systemui/plugins/FirstScreenWidget.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src_plugins/com/android/systemui/plugins/FirstScreenWidget.java diff --git a/src_plugins/com/android/systemui/plugins/FirstScreenWidget.java b/src_plugins/com/android/systemui/plugins/FirstScreenWidget.java new file mode 100644 index 0000000000..8d7dd4bc08 --- /dev/null +++ b/src_plugins/com/android/systemui/plugins/FirstScreenWidget.java @@ -0,0 +1,15 @@ +package com.android.systemui.plugins; + +import android.view.ViewGroup; +import com.android.systemui.plugins.annotations.ProvidesInterface; + +/** + * Implement this interface to wrap the widget on the first home screen, e.g. to add new content. + */ +@ProvidesInterface(action = FirstScreenWidget.ACTION, version = FirstScreenWidget.VERSION) +public interface FirstScreenWidget extends Plugin { + String ACTION = "com.android.systemui.action.PLUGIN_FIRST_SCREEN_WIDGET"; + int VERSION = 1; + + void onWidgetUpdated(ViewGroup widgetView); +} -- GitLab From 904dbcdf9db7aa54a63a53e07e7d0b00d822db41 Mon Sep 17 00:00:00 2001 From: Ryan Lothian Date: Mon, 22 Oct 2018 16:31:28 -0400 Subject: [PATCH 0217/1301] Only show flags UI if developer options is enabled Change-Id: I69005e623dab9f1f2f0682b61311836b62337835 --- src/com/android/launcher3/config/BaseFlags.java | 11 +++++++---- .../android/launcher3/settings/SettingsActivity.java | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/config/BaseFlags.java b/src/com/android/launcher3/config/BaseFlags.java index dc60c8fff2..fa4ff752eb 100644 --- a/src/com/android/launcher3/config/BaseFlags.java +++ b/src/com/android/launcher3/config/BaseFlags.java @@ -20,6 +20,7 @@ import static androidx.core.util.Preconditions.checkNotNull; import android.content.Context; import android.content.SharedPreferences; +import android.provider.Settings; import androidx.annotation.GuardedBy; import androidx.annotation.Keep; @@ -51,8 +52,10 @@ abstract class BaseFlags { throw new UnsupportedOperationException("Don't instantiate BaseFlags"); } - public static boolean showFlagTogglerUi() { - return Utilities.IS_DEBUG_DEVICE; + public static boolean showFlagTogglerUi(Context context) { + return Utilities.IS_DEBUG_DEVICE && + Settings.Global.getInt(context.getApplicationContext().getContentResolver(), + Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; } public static final boolean IS_DOGFOOD_BUILD = false; @@ -85,8 +88,8 @@ abstract class BaseFlags { public static final boolean OVERVIEW_USE_SCREENSHOT_ORIENTATION = true; public static void initialize(Context context) { - // Avoid the disk read for builds without the flags UI. - if (showFlagTogglerUi()) { + // Avoid the disk read for user builds + if (Utilities.IS_DEBUG_DEVICE) { SharedPreferences sharedPreferences = context.getSharedPreferences(FLAGS_PREF_NAME, Context.MODE_PRIVATE); synchronized (sLock) { diff --git a/src/com/android/launcher3/settings/SettingsActivity.java b/src/com/android/launcher3/settings/SettingsActivity.java index 66420d079e..4c022b438f 100644 --- a/src/com/android/launcher3/settings/SettingsActivity.java +++ b/src/com/android/launcher3/settings/SettingsActivity.java @@ -203,7 +203,7 @@ public class SettingsActivity extends Activity case FLAGS_PREFERENCE_KEY: // Only show flag toggler UI if this build variant implements that. - return FeatureFlags.showFlagTogglerUi(); + return FeatureFlags.showFlagTogglerUi(getContext()); } return true; -- GitLab From b92656af196e0fa13791e15fa1dffc74a19e509d Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 15 Oct 2018 14:01:04 -0700 Subject: [PATCH 0218/1301] Passing package name to a remote action Bug: 117888000 Test: manual test with a prototype Change-Id: Ieea91c443186ccd653ae04fe76baff14e78021a0 --- .../android/launcher3/popup/RemoteActionShortcut.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/popup/RemoteActionShortcut.java b/src/com/android/launcher3/popup/RemoteActionShortcut.java index af0d3daa58..c76fb9651e 100644 --- a/src/com/android/launcher3/popup/RemoteActionShortcut.java +++ b/src/com/android/launcher3/popup/RemoteActionShortcut.java @@ -18,6 +18,7 @@ package com.android.launcher3.popup; import android.app.PendingIntent; import android.app.RemoteAction; +import android.content.Intent; import android.os.Handler; import android.os.Looper; import android.util.Log; @@ -48,14 +49,20 @@ public class RemoteActionShortcut extends SystemShortcut { AbstractFloatingView.closeAllOpenViews(launcher); try { - mAction.getActionIntent().send(0, + mAction.getActionIntent().send( + launcher, + 0, + new Intent().putExtra( + Intent.EXTRA_PACKAGE_NAME, + itemInfo.getTargetComponent().getPackageName()), (pendingIntent, intent, resultCode, resultData, resultExtras) -> { if (resultData != null && !resultData.isEmpty()) { Log.e(TAG, "Remote action returned result: " + mAction.getTitle() + " : " + resultData); Toast.makeText(launcher, resultData, Toast.LENGTH_SHORT).show(); } - }, new Handler(Looper.getMainLooper())); + }, + new Handler(Looper.getMainLooper())); } catch (PendingIntent.CanceledException e) { Log.e(TAG, "Remote action canceled: " + mAction.getTitle(), e); Toast.makeText(launcher, launcher.getString( -- GitLab From 848d86ad32e3c4b1b1f9e57bd6b084ee0a080e7e Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 22 Oct 2018 14:55:22 -0700 Subject: [PATCH 0219/1301] Remove shape detection logic for icon legacy treatment Bug: 117991192 Change-Id: Ife2047e7b36099daa4526c471e5c70554f068de1 --- .../android/launcher3/dragndrop/DragView.java | 2 +- .../launcher3/icons/BaseIconFactory.java | 8 +- .../launcher3/icons/IconNormalizer.java | 96 +------------------ 3 files changed, 6 insertions(+), 100 deletions(-) diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index b6a8b50a95..8f223a37e0 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -232,7 +232,7 @@ public class DragView extends View { nDr = new AdaptiveIconDrawable(new ColorDrawable(Color.BLACK), null); } Utilities.scaleRectAboutCenter(bounds, - li.getNormalizer().getScale(nDr, null, null, null)); + li.getNormalizer().getScale(nDr, null)); } AdaptiveIconDrawable adaptiveIcon = (AdaptiveIconDrawable) dr; diff --git a/src/com/android/launcher3/icons/BaseIconFactory.java b/src/com/android/launcher3/icons/BaseIconFactory.java index c8c9618279..cd60de55a8 100644 --- a/src/com/android/launcher3/icons/BaseIconFactory.java +++ b/src/com/android/launcher3/icons/BaseIconFactory.java @@ -192,18 +192,18 @@ public class BaseIconFactory { } AdaptiveIconDrawable dr = (AdaptiveIconDrawable) mWrapperIcon; dr.setBounds(0, 0, 1, 1); - scale = getNormalizer().getScale(icon, outIconBounds, dr.getIconMask(), outShape); - if (ATLEAST_OREO && !outShape[0] && !(icon instanceof AdaptiveIconDrawable)) { + scale = getNormalizer().getScale(icon, outIconBounds); + if (ATLEAST_OREO && !(icon instanceof AdaptiveIconDrawable)) { FixedScaleDrawable fsd = ((FixedScaleDrawable) dr.getForeground()); fsd.setDrawable(icon); fsd.setScale(scale); icon = dr; - scale = getNormalizer().getScale(icon, outIconBounds, null, null); + scale = getNormalizer().getScale(icon, outIconBounds); ((ColorDrawable) dr.getBackground()).setColor(mWrapperBackgroundColor); } } else { - scale = getNormalizer().getScale(icon, outIconBounds, null, null); + scale = getNormalizer().getScale(icon, outIconBounds); } outScale[0] = scale; diff --git a/src/com/android/launcher3/icons/IconNormalizer.java b/src/com/android/launcher3/icons/IconNormalizer.java index 4052a55147..8eb82524e8 100644 --- a/src/com/android/launcher3/icons/IconNormalizer.java +++ b/src/com/android/launcher3/icons/IconNormalizer.java @@ -20,16 +20,13 @@ 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.AdaptiveIconDrawable; import android.graphics.drawable.Drawable; -import android.util.Log; import java.nio.ByteBuffer; @@ -53,9 +50,6 @@ 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.005f; private static final float SCALE_NOT_INITIALIZED = 0; // Ratio of the diameter of an normalized circular icon to the actual icon size. @@ -64,8 +58,6 @@ public class IconNormalizer { private final int mMaxSize; private final Bitmap mBitmap; private final Canvas mCanvas; - private final Paint mPaintMaskShape; - private final Paint mPaintMaskShapeOutline; private final byte[] mPixels; private final Rect mAdaptiveIconBounds; @@ -75,8 +67,6 @@ public class IconNormalizer { private final float[] mLeftBorder; private final float[] mRightBorder; private final Rect mBounds; - private final Path mShapePath; - private final Matrix mMatrix; /** package private **/ IconNormalizer(Context context, int iconBitmapSize) { @@ -90,88 +80,9 @@ public class IconNormalizer { mBounds = new Rect(); mAdaptiveIconBounds = new Rect(); - 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 * context.getResources().getDisplayMetrics().density); - mPaintMaskShapeOutline.setStyle(Paint.Style.STROKE); - mPaintMaskShapeOutline.setColor(Color.BLACK); - mPaintMaskShapeOutline.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); - - mShapePath = new Path(); - mMatrix = new Matrix(); mAdaptiveIconScale = SCALE_NOT_INITIALIZED; } - /** - * 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. - - // 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, mShapePath); - - // XOR operation - mCanvas.drawPath(mShapePath, mPaintMaskShape); - - // DST_OUT operation around the mask path outline - mCanvas.drawPath(mShapePath, mPaintMaskShapeOutline); - - // Check if the result is almost transparent - return isTransparentBitmap(); - } - - /** - * Used to determine if certain the bitmap is transparent. - */ - private boolean isTransparentBitmap() { - ByteBuffer buffer = ByteBuffer.wrap(mPixels); - buffer.rewind(); - mBitmap.copyPixelsToBuffer(buffer); - - int y = mBounds.top; - // buffer position - int index = y * mMaxSize; - // buffer shift after every row, width of buffer = mMaxSize - int rowSizeDiff = mMaxSize - mBounds.right; - - int sum = 0; - for (; y < mBounds.bottom; y++) { - index += mBounds.left; - for (int x = mBounds.left; x < mBounds.right; x++) { - if ((mPixels[index] & 0xFF) > MIN_VISIBLE_ALPHA) { - sum++; - } - index++; - } - index += rowSizeDiff; - } - - float percentageDiffPixels = ((float) sum) / (mBounds.width() * mBounds.height()); - return percentageDiffPixels < PIXEL_DIFF_PERCENTAGE_THRESHOLD; - } - /** * Returns the amount by which the {@param d} should be scaled (in both dimensions) so that it * matches the design guidelines for a launcher icon. @@ -186,8 +97,7 @@ public class IconNormalizer { * * @param outBounds optional rect to receive the fraction distance from each edge. */ - public synchronized float getScale(@NonNull Drawable d, @Nullable RectF outBounds, - @Nullable Path path, @Nullable boolean[] outMaskShape) { + public synchronized float getScale(@NonNull Drawable d, @Nullable RectF outBounds) { if (BaseIconFactory.ATLEAST_OREO && d instanceof AdaptiveIconDrawable) { if (mAdaptiveIconScale != SCALE_NOT_INITIALIZED) { if (outBounds != null) { @@ -298,10 +208,6 @@ public class IconNormalizer { 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; -- GitLab From 5ee074a11b765451d6fbf0a3046839c79f4ea8da Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 16 Oct 2018 15:59:24 -0700 Subject: [PATCH 0220/1301] Caching clean up, remove dependency on old shared lib loading/caching logic - Clarify caching policy, we only cache the last N task snapshots - Pull out necessary logic from RecentsTaskLoadPlan (deprecated) into launcher class RecentTasksList which also manages the invalidation of the last loaded list - Pull out logic from task loading logic in the shared lib into separate classes TaskThumbnailCache and TaskIconCache, and have each task view manage the load request for data Bug: 117603579 Test: Thumbnails still load Change-Id: I938e4dea19e7f5d24724c32194d254ca003e89aa --- quickstep/res/values/config.xml | 5 + .../launcher3/uioverrides/UiFactory.java | 11 +- .../quickstep/OtherActivityTouchConsumer.java | 2 +- .../quickstep/OverviewCommandHelper.java | 2 +- .../android/quickstep/RecentTasksList.java | 167 ++++++++++++++ .../android/quickstep/RecentsActivity.java | 1 - .../com/android/quickstep/RecentsModel.java | 206 +++++++----------- .../com/android/quickstep/TaskIconCache.java | 151 +++++++++++++ .../android/quickstep/TaskThumbnailCache.java | 198 +++++++++++++++++ .../quickstep/TouchInteractionService.java | 1 - .../WindowTransformSwipeHandler.java | 4 +- .../android/quickstep/views/RecentsView.java | 95 ++++---- .../com/android/quickstep/views/TaskView.java | 77 ++++--- res/values/config.xml | 2 - src/com/android/launcher3/Launcher.java | 1 - .../launcher3/icons/HandlerRunnable.java | 67 ++++++ .../android/launcher3/icons/IconCache.java | 22 +- 17 files changed, 767 insertions(+), 245 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/RecentTasksList.java create mode 100644 quickstep/src/com/android/quickstep/TaskIconCache.java create mode 100644 quickstep/src/com/android/quickstep/TaskThumbnailCache.java create mode 100644 src/com/android/launcher3/icons/HandlerRunnable.java diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml index c294376340..d8ca1c47c1 100644 --- a/quickstep/res/values/config.xml +++ b/quickstep/res/values/config.xml @@ -19,4 +19,9 @@ com.android.quickstep.logging.UserEventDispatcherExtension + + + 3 + 12 diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index b406b30781..4e79fed59e 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -163,19 +163,12 @@ public class UiFactory { } } - public static void onStart(Context context) { - RecentsModel model = RecentsModel.INSTANCE.get(context); - if (model != null) { - model.onStart(); - } - } - public static void onEnterAnimationComplete(Context context) { // After the transition to home, enable the high-res thumbnail loader if it wasn't enabled // as a part of quickstep/scrub, so that high-res thumbnails can load the next time we // enter overview - RecentsModel.INSTANCE.get(context).getRecentsTaskLoader() - .getHighResThumbnailLoader().setVisible(true); + RecentsModel.INSTANCE.get(context).getThumbnailCache() + .getHighResLoadingState().setVisible(true); } public static void onLauncherStateOrResumeChanged(Launcher launcher) { diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index 94ec69a0c2..b11260ea58 100644 --- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java +++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java @@ -232,7 +232,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC mInputConsumer, mTouchInteractionLog); // Preload the plan - mRecentsModel.loadTasks(mRunningTask.id, null); + mRecentsModel.getTasks(null); mInteractionHandler = handler; handler.setGestureEndCallback(mEventQueue::reset); diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index d9626c4bdf..5b488ca6db 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -230,7 +230,7 @@ public class OverviewCommandHelper { mRunningTaskId = mAM.getRunningTask().id; // Preload the plan - mRecentsModel.loadTasks(mRunningTaskId, null); + mRecentsModel.getTasks(null); } @Override diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java new file mode 100644 index 0000000000..fec38bf144 --- /dev/null +++ b/quickstep/src/com/android/quickstep/RecentTasksList.java @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.quickstep; + +import android.app.ActivityManager; +import android.content.Context; +import android.os.Process; +import android.util.SparseBooleanArray; +import com.android.launcher3.MainThreadExecutor; +import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.BackgroundExecutor; +import com.android.systemui.shared.system.KeyguardManagerCompat; +import com.android.systemui.shared.system.RecentTaskInfoCompat; +import com.android.systemui.shared.system.TaskDescriptionCompat; +import com.android.systemui.shared.system.TaskStackChangeListener; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Consumer; + +/** + * Manages the recent task list from the system, caching it as necessary. + */ +public class RecentTasksList extends TaskStackChangeListener { + + private final KeyguardManagerCompat mKeyguardManager; + private final MainThreadExecutor mMainThreadExecutor; + private final BackgroundExecutor mBgThreadExecutor; + + // The list change id, increments as the task list changes in the system + private int mChangeId; + // The last change id when the list was last loaded completely, must be <= the list change id + private int mLastLoadedId; + + ArrayList mTasks = new ArrayList<>(); + + public RecentTasksList(Context context) { + mMainThreadExecutor = new MainThreadExecutor(); + mBgThreadExecutor = BackgroundExecutor.get(); + mKeyguardManager = new KeyguardManagerCompat(context); + mChangeId = 1; + } + + /** + * Asynchronously fetches the list of recent tasks. + * + * @param numTasks The maximum number of tasks to fetch + * @param loadKeysOnly Whether to load other associated task data, or just the key + * @param callback The callback to receive the list of recent tasks + * @return The change id of the current task list + */ + public synchronized int getTasks(int numTasks, boolean loadKeysOnly, + Consumer> callback) { + final int requestLoadId = mChangeId; + final int numLoadTasks = numTasks > 0 + ? numTasks + : Integer.MAX_VALUE; + + if (mLastLoadedId == mChangeId) { + // The list is up to date, callback with the same list + mMainThreadExecutor.execute(() -> { + if (callback != null) { + callback.accept(mTasks); + } + }); + } + + // Kick off task loading in the background + mBgThreadExecutor.submit(() -> { + ArrayList tasks = loadTasksInBackground(numLoadTasks, + loadKeysOnly); + + mMainThreadExecutor.execute(() -> { + mTasks = tasks; + mLastLoadedId = requestLoadId; + + if (callback != null) { + callback.accept(tasks); + } + }); + }); + + return requestLoadId; + } + + /** + * @return Whether the provided {@param changeId} is the latest recent tasks list id. + */ + public synchronized boolean isTaskListValid(int changeId) { + return mChangeId == changeId; + } + + @Override + public synchronized void onTaskStackChanged() { + mChangeId++; + } + + @Override + public synchronized void onActivityPinned(String packageName, int userId, int taskId, + int stackId) { + mChangeId++; + } + + @Override + public synchronized void onActivityUnpinned() { + mChangeId++; + } + + /** + * Loads and creates a list of all the recent tasks. + */ + private ArrayList loadTasksInBackground(int numTasks, + boolean loadKeysOnly) { + int currentUserId = Process.myUserHandle().getIdentifier(); + ArrayList allTasks = new ArrayList<>(); + List rawTasks = + ActivityManagerWrapper.getInstance().getRecentTasks(numTasks, currentUserId); + // The raw tasks are given in most-recent to least-recent order, we need to reverse it + Collections.reverse(rawTasks); + + SparseBooleanArray tmpLockedUsers = new SparseBooleanArray() { + @Override + public boolean get(int key) { + if (indexOfKey(key) < 0) { + // Fill the cached locked state as we fetch + put(key, mKeyguardManager.isDeviceLocked(key)); + } + return super.get(key); + } + }; + + int taskCount = rawTasks.size(); + for (int i = 0; i < taskCount; i++) { + ActivityManager.RecentTaskInfo rawTask = rawTasks.get(i); + RecentTaskInfoCompat t = new RecentTaskInfoCompat(rawTask); + Task.TaskKey taskKey = new Task.TaskKey(rawTask); + Task task; + if (!loadKeysOnly) { + ActivityManager.TaskDescription rawTd = t.getTaskDescription(); + TaskDescriptionCompat td = new TaskDescriptionCompat(rawTd); + boolean isLocked = tmpLockedUsers.get(t.getUserId()); + task = new Task(taskKey, td.getPrimaryColor(), td.getBackgroundColor(), + t.supportsSplitScreenMultiWindow(), isLocked, rawTd, t.getTopActivity()); + } else { + task = new Task(taskKey); + } + allTasks.add(task); + } + + return allTasks; + } +} \ No newline at end of file diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index b93a54b899..ef735e1ce2 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -219,7 +219,6 @@ public class RecentsActivity extends BaseDraggingActivity { // onActivityStart callback. mFallbackRecentsView.setContentAlpha(1); super.onStart(); - UiFactory.onStart(this); mFallbackRecentsView.resetTaskVisuals(); } diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index 517f7599db..a9ce5ccf26 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -18,38 +18,22 @@ package com.android.quickstep; import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId; import android.annotation.TargetApi; -import android.app.ActivityManager; import android.content.ComponentCallbacks2; -import android.content.ComponentName; import android.content.Context; -import android.content.pm.ActivityInfo; -import android.content.res.Resources; -import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; -import android.os.Handler; +import android.os.HandlerThread; +import android.os.Process; import android.os.RemoteException; -import android.os.UserHandle; import android.util.Log; -import android.util.LruCache; import android.util.SparseArray; -import android.view.accessibility.AccessibilityManager; - import com.android.launcher3.MainThreadExecutor; -import com.android.launcher3.R; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.Preconditions; -import com.android.launcher3.util.UiThreadHelper; import com.android.systemui.shared.recents.ISystemUiProxy; -import com.android.systemui.shared.recents.model.IconLoader; -import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan; -import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan.PreloadOptions; -import com.android.systemui.shared.recents.model.RecentsTaskLoader; -import com.android.systemui.shared.recents.model.TaskKeyLruCache; +import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.BackgroundExecutor; import com.android.systemui.shared.system.TaskStackChangeListener; - import java.util.ArrayList; import java.util.function.Consumer; @@ -68,110 +52,102 @@ public class RecentsModel extends TaskStackChangeListener { private final ArrayList mAssistDataListeners = new ArrayList<>(); private final Context mContext; - private final RecentsTaskLoader mRecentsTaskLoader; private final MainThreadExecutor mMainThreadExecutor; - private final Handler mBgHandler; - private RecentsTaskLoadPlan mLastLoadPlan; - private int mLastLoadPlanId; - private int mTaskChangeId; private ISystemUiProxy mSystemUiProxy; private boolean mClearAssistCacheOnStackChange = true; - private final boolean mIsLowRamDevice; - private boolean mPreloadTasksInBackground; - private final AccessibilityManager mAccessibilityManager; + + private final RecentTasksList mTaskList; + private final TaskIconCache mIconCache; + private final TaskThumbnailCache mThumbnailCache; private RecentsModel(Context context) { mContext = context; - ActivityManager activityManager = - (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - mIsLowRamDevice = activityManager.isLowRamDevice(); mMainThreadExecutor = new MainThreadExecutor(); - mBgHandler = new Handler(UiThreadHelper.getBackgroundLooper()); - - Resources res = context.getResources(); - mRecentsTaskLoader = new RecentsTaskLoader(mContext, - res.getInteger(R.integer.config_recentsMaxThumbnailCacheSize), - res.getInteger(R.integer.config_recentsMaxIconCacheSize), 0) { - - @Override - protected IconLoader createNewIconLoader(Context context, - TaskKeyLruCache iconCache, - LruCache activityInfoCache) { - // Disable finding the dominant color since we don't need to use it - return new NormalizedIconLoader(context, iconCache, activityInfoCache, - true /* disableColorExtraction */); - } - }; - mRecentsTaskLoader.startLoader(mContext); + + HandlerThread loaderThread = new HandlerThread("TaskThumbnailIconCache", + Process.THREAD_PRIORITY_BACKGROUND); + loaderThread.start(); + mTaskList = new RecentTasksList(context); + mIconCache = new TaskIconCache(context, loaderThread.getLooper()); + mThumbnailCache = new TaskThumbnailCache(context, loaderThread.getLooper()); ActivityManagerWrapper.getInstance().registerTaskStackListener(this); + } - mTaskChangeId = 1; - loadTasks(-1, null); - mAccessibilityManager = context.getSystemService(AccessibilityManager.class); + public TaskIconCache getIconCache() { + return mIconCache; } - public RecentsTaskLoader getRecentsTaskLoader() { - return mRecentsTaskLoader; + public TaskThumbnailCache getThumbnailCache() { + return mThumbnailCache; } /** - * Preloads the task plan - * @param taskId The running task id or -1 + * Fetches the list of recent tasks. + * * @param callback The callback to receive the task plan once its complete or null. This is * always called on the UI thread. * @return the request id associated with this call. */ - public int loadTasks(int taskId, Consumer callback) { - final int requestId = mTaskChangeId; - - // Fail fast if nothing has changed. - if (mLastLoadPlanId == mTaskChangeId) { - if (callback != null) { - final RecentsTaskLoadPlan plan = mLastLoadPlan; - mMainThreadExecutor.execute(() -> callback.accept(plan)); - } - return requestId; - } - - BackgroundExecutor.get().submit(() -> { - // Preload the plan - RecentsTaskLoadPlan loadPlan = new RecentsTaskLoadPlan(mContext); - PreloadOptions opts = new PreloadOptions(); - opts.loadTitles = mAccessibilityManager.isEnabled(); - loadPlan.preloadPlan(opts, mRecentsTaskLoader, taskId, UserHandle.myUserId()); - // Set the load plan on UI thread - mMainThreadExecutor.execute(() -> { - mLastLoadPlan = loadPlan; - mLastLoadPlanId = requestId; - - if (callback != null) { - callback.accept(loadPlan); - } - }); - }); - return requestId; + public int getTasks(Consumer> callback) { + return mTaskList.getTasks(-1, false /* loadKeysOnly */, callback); } - public void setPreloadTasksInBackground(boolean preloadTasksInBackground) { - mPreloadTasksInBackground = preloadTasksInBackground && !mIsLowRamDevice; + /** + * @return Whether the provided {@param changeId} is the latest recent tasks list id. + */ + public boolean isTaskListValid(int changeId) { + return mTaskList.isTaskListValid(changeId); } - @Override - public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { - mTaskChangeId++; + /** + * Finds and returns the task key associated with the given task id. + * + * @param callback The callback to receive the task key if it is found or null. This is always + * called on the UI thread. + */ + public void findTaskWithId(int taskId, Consumer callback) { + mTaskList.getTasks(-1, true /* loadKeysOnly */, (tasks) -> { + for (Task task : tasks) { + if (task.key.id == taskId) { + callback.accept(task.key); + return; + } + } + callback.accept(null); + }); } @Override - public void onActivityUnpinned() { - mTaskChangeId++; + public void onTaskStackChangedBackground() { + if (!mThumbnailCache.isPreloadingEnabled()) { + // Skip if we aren't preloading + return; + } + + int currentUserId = Process.myUserHandle().getIdentifier(); + if (!checkCurrentOrManagedUserId(currentUserId, mContext)) { + // Skip if we are not the current user + return; + } + + // Keep the cache up to date with the latest thumbnails + mTaskList.getTasks(mThumbnailCache.getCacheSize(), true /* keysOnly */, (tasks) -> { + int runningTaskId = ActivityManagerWrapper.getInstance().getRunningTask().id; + for (Task task : tasks) { + if (task.key.id == runningTaskId) { + // Skip the running task, it's not going to have an up-to-date snapshot by the + // time the user next enters overview + continue; + } + mThumbnailCache.updateThumbnailInCache(task); + } + }); } @Override public void onTaskStackChanged() { - mTaskChangeId++; - Preconditions.assertUIThread(); if (mClearAssistCacheOnStackChange) { mCachedAssistData.clear(); @@ -180,39 +156,6 @@ public class RecentsModel extends TaskStackChangeListener { } } - @Override - public void onTaskStackChangedBackground() { - int userId = UserHandle.myUserId(); - if (!mPreloadTasksInBackground || !checkCurrentOrManagedUserId(userId, mContext)) { - // TODO: Only register this for the current user - return; - } - - // Preload a fixed number of task icons/thumbnails in the background - ActivityManager.RunningTaskInfo runningTaskInfo = - ActivityManagerWrapper.getInstance().getRunningTask(); - RecentsTaskLoadPlan plan = new RecentsTaskLoadPlan(mContext); - RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options(); - launchOpts.runningTaskId = runningTaskInfo != null ? runningTaskInfo.id : -1; - launchOpts.numVisibleTasks = 2; - launchOpts.numVisibleTaskThumbnails = 2; - launchOpts.onlyLoadForCache = true; - launchOpts.onlyLoadPausedActivities = true; - launchOpts.loadThumbnails = true; - PreloadOptions preloadOpts = new PreloadOptions(); - preloadOpts.loadTitles = mAccessibilityManager.isEnabled(); - plan.preloadPlan(preloadOpts, mRecentsTaskLoader, -1, userId); - mRecentsTaskLoader.loadTasks(plan, launchOpts); - } - - public boolean isLoadPlanValid(int resultId) { - return mTaskChangeId == resultId; - } - - public RecentsTaskLoadPlan getLastLoadPlan() { - return mLastLoadPlan; - } - public void setSystemUiProxy(ISystemUiProxy systemUiProxy) { mSystemUiProxy = systemUiProxy; } @@ -221,16 +164,15 @@ public class RecentsModel extends TaskStackChangeListener { return mSystemUiProxy; } - public void onStart() { - mRecentsTaskLoader.startLoader(mContext); - } - public void onTrimMemory(int level) { if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { - // We already stop the loader in UI_HIDDEN, so stop the high res loader as well - mRecentsTaskLoader.getHighResThumbnailLoader().setVisible(false); + mThumbnailCache.getHighResLoadingState().setVisible(false); + } + if (level == ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL) { + // Clear everything once we reach a low-mem situation + mThumbnailCache.clear(); + mIconCache.clear(); } - mBgHandler.post(() -> mRecentsTaskLoader.onTrimMemory(level)); } public void onOverviewShown(boolean fromHome, String tag) { diff --git a/quickstep/src/com/android/quickstep/TaskIconCache.java b/quickstep/src/com/android/quickstep/TaskIconCache.java new file mode 100644 index 0000000000..afa58fab07 --- /dev/null +++ b/quickstep/src/com/android/quickstep/TaskIconCache.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep; + +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Looper; +import android.util.LruCache; +import android.view.accessibility.AccessibilityManager; +import com.android.launcher3.MainThreadExecutor; +import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.icons.HandlerRunnable; +import com.android.launcher3.util.Preconditions; +import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.recents.model.TaskKeyLruCache; +import com.android.systemui.shared.system.ActivityManagerWrapper; +import java.util.function.Consumer; + +/** + * Manages the caching of task icons and related data. + * TODO: This class should later be merged into IconCache. + */ +public class TaskIconCache { + + private final Handler mBackgroundHandler; + private final MainThreadExecutor mMainThreadExecutor; + private final AccessibilityManager mAccessibilityManager; + + private final NormalizedIconLoader mIconLoader; + + private final TaskKeyLruCache mIconCache; + private final TaskKeyLruCache mContentDescriptionCache; + private final LruCache mActivityInfoCache; + + private TaskKeyLruCache.EvictionCallback mClearActivityInfoOnEviction = + new TaskKeyLruCache.EvictionCallback() { + @Override + public void onEntryEvicted(Task.TaskKey key) { + if (key != null) { + mActivityInfoCache.remove(key.getComponent()); + } + } + }; + + public TaskIconCache(Context context, Looper backgroundLooper) { + mBackgroundHandler = new Handler(backgroundLooper); + mMainThreadExecutor = new MainThreadExecutor(); + mAccessibilityManager = context.getSystemService(AccessibilityManager.class); + + Resources res = context.getResources(); + int cacheSize = res.getInteger(R.integer.recentsIconCacheSize); + mIconCache = new TaskKeyLruCache<>(cacheSize, mClearActivityInfoOnEviction); + mContentDescriptionCache = new TaskKeyLruCache<>(cacheSize, mClearActivityInfoOnEviction); + mActivityInfoCache = new LruCache<>(cacheSize); + mIconLoader = new NormalizedIconLoader(context, mIconCache, mActivityInfoCache, + true /* disableColorExtraction */); + } + + /** + * Asynchronously fetches the icon and other task data. + * + * @param task The task to fetch the data for + * @param callback The callback to receive the task after its data has been populated. + * @return A cancelable handle to the request + */ + public IconLoadRequest updateIconInBackground(Task task, Consumer callback) { + Preconditions.assertUIThread(); + if (task.icon != null) { + // Nothing to load, the icon is already loaded + callback.accept(task); + return null; + } + + IconLoadRequest request = new IconLoadRequest(mBackgroundHandler) { + @Override + public void run() { + Drawable icon = mIconLoader.getIcon(task); + String contentDescription = loadContentDescriptionInBackground(task); + if (isCanceled()) { + // We don't call back to the provided callback in this case + return; + } + mMainThreadExecutor.execute(() -> { + task.icon = icon; + task.titleDescription = contentDescription; + callback.accept(task); + onEnd(); + }); + } + }; + Utilities.postAsyncCallback(mBackgroundHandler, request); + return request; + } + + public void clear() { + mIconCache.evictAll(); + mContentDescriptionCache.evictAll(); + } + + /** + * Loads the content description for the given {@param task}. + */ + private String loadContentDescriptionInBackground(Task task) { + // Return the cached content description if it exists + String label = mContentDescriptionCache.getAndInvalidateIfModified(task.key); + if (label != null) { + return label; + } + + // Skip loading content descriptions if accessibility is not enabled + if (!mAccessibilityManager.isEnabled()) { + return ""; + } + + // Skip loading the content description if the activity no longer exists + ActivityInfo activityInfo = mIconLoader.getAndUpdateActivityInfo(task.key); + if (activityInfo == null) { + return ""; + } + + // Load the label otherwise + label = ActivityManagerWrapper.getInstance().getBadgedContentDescription(activityInfo, + task.key.userId, task.taskDescription); + mContentDescriptionCache.put(task.key, label); + return label; + } + + public static abstract class IconLoadRequest extends HandlerRunnable { + IconLoadRequest(Handler handler) { + super(handler, null); + } + } +} diff --git a/quickstep/src/com/android/quickstep/TaskThumbnailCache.java b/quickstep/src/com/android/quickstep/TaskThumbnailCache.java new file mode 100644 index 0000000000..c47101b827 --- /dev/null +++ b/quickstep/src/com/android/quickstep/TaskThumbnailCache.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep; + +import android.app.ActivityManager; +import android.content.Context; +import android.content.res.Resources; +import android.os.Handler; +import android.os.Looper; +import com.android.launcher3.MainThreadExecutor; +import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.icons.HandlerRunnable; +import com.android.launcher3.util.Preconditions; +import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.recents.model.TaskKeyLruCache; +import com.android.systemui.shared.recents.model.ThumbnailData; +import com.android.systemui.shared.system.ActivityManagerWrapper; +import java.util.ArrayList; +import java.util.function.Consumer; + +public class TaskThumbnailCache { + + private final Handler mBackgroundHandler; + private final MainThreadExecutor mMainThreadExecutor; + + private final int mCacheSize; + private final TaskKeyLruCache mCache; + private final HighResLoadingState mHighResLoadingState; + + public static class HighResLoadingState { + private boolean mIsLowRamDevice; + private boolean mVisible; + private boolean mFlingingFast; + private boolean mHighResLoadingEnabled; + private ArrayList mCallbacks = new ArrayList<>(); + + public interface HighResLoadingStateChangedCallback { + void onHighResLoadingStateChanged(boolean enabled); + } + + private HighResLoadingState(Context context) { + ActivityManager activityManager = + (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + mIsLowRamDevice = activityManager.isLowRamDevice(); + } + + public void addCallback(HighResLoadingStateChangedCallback callback) { + mCallbacks.add(callback); + } + + public void removeCallback(HighResLoadingStateChangedCallback callback) { + mCallbacks.remove(callback); + } + + public void setVisible(boolean visible) { + mVisible = visible; + updateState(); + } + + public void setFlingingFast(boolean flingingFast) { + mFlingingFast = flingingFast; + updateState(); + } + + public boolean isEnabled() { + return mHighResLoadingEnabled; + } + + private void updateState() { + boolean prevState = mHighResLoadingEnabled; + mHighResLoadingEnabled = !mIsLowRamDevice && mVisible && !mFlingingFast; + if (prevState != mHighResLoadingEnabled) { + for (int i = mCallbacks.size() - 1; i >= 0; i--) { + mCallbacks.get(i).onHighResLoadingStateChanged(mHighResLoadingEnabled); + } + } + } + } + + public TaskThumbnailCache(Context context, Looper backgroundLooper) { + mBackgroundHandler = new Handler(backgroundLooper); + mMainThreadExecutor = new MainThreadExecutor(); + mHighResLoadingState = new HighResLoadingState(context); + + Resources res = context.getResources(); + mCacheSize = res.getInteger(R.integer.recentsThumbnailCacheSize); + mCache = new TaskKeyLruCache<>(mCacheSize); + } + + /** + * Synchronously fetches the thumbnail for the given {@param task} and puts it in the cache. + */ + public void updateThumbnailInCache(Task task) { + Preconditions.assertUIThread(); + + // Fetch the thumbnail for this task and put it in the cache + mCache.put(task.key, ActivityManagerWrapper.getInstance().getTaskThumbnail( + task.key.id, true /* reducedResolution */)); + } + + + /** + * Asynchronously fetches the icon and other task data for the given {@param task}. + * + * @param callback The callback to receive the task after its data has been populated. + * @return A cancelable handle to the request + */ + public ThumbnailLoadRequest updateThumbnailInBackground(Task task, boolean reducedResolution, + Consumer callback) { + Preconditions.assertUIThread(); + + if (task.thumbnail != null && (!task.thumbnail.reducedResolution || reducedResolution)) { + // Nothing to load, the thumbnail is already high-resolution or matches what the + // request, so just callback + callback.accept(task); + return null; + } + + ThumbnailData cachedThumbnail = mCache.getAndInvalidateIfModified(task.key); + if (cachedThumbnail != null && (!cachedThumbnail.reducedResolution || reducedResolution)) { + // Already cached, lets use that thumbnail + task.thumbnail = cachedThumbnail; + callback.accept(task); + return null; + } + + ThumbnailLoadRequest request = new ThumbnailLoadRequest(mBackgroundHandler, + reducedResolution) { + @Override + public void run() { + ThumbnailData thumbnail = ActivityManagerWrapper.getInstance().getTaskThumbnail( + task.key.id, reducedResolution); + if (isCanceled()) { + // We don't call back to the provided callback in this case + return; + } + mMainThreadExecutor.execute(() -> { + task.thumbnail = thumbnail; + callback.accept(task); + onEnd(); + }); + } + }; + Utilities.postAsyncCallback(mBackgroundHandler, request); + return request; + } + + /** + * Clears the cache. + */ + public void clear() { + mCache.evictAll(); + } + + /** + * @return The cache size. + */ + public int getCacheSize() { + return mCacheSize; + } + + /** + * @return The mutable high-res loading state. + */ + public HighResLoadingState getHighResLoadingState() { + return mHighResLoadingState; + } + + /** + * @return Whether to enable background preloading of task thumbnails. + */ + public boolean isPreloadingEnabled() { + return !mHighResLoadingState.mIsLowRamDevice && mHighResLoadingState.mVisible; + } + + public static abstract class ThumbnailLoadRequest extends HandlerRunnable { + public final boolean reducedResolution; + + ThumbnailLoadRequest(Handler handler, boolean reducedResolution) { + super(handler, null); + this.reducedResolution = reducedResolution; + } + } +} diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 9371a4c1cf..b1a214d9dd 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -196,7 +196,6 @@ public class TouchInteractionService extends Service { super.onCreate(); mAM = ActivityManagerWrapper.getInstance(); mRecentsModel = RecentsModel.INSTANCE.get(this); - mRecentsModel.setPreloadTasksInBackground(true); mMainThreadExecutor = new MainThreadExecutor(); mOverviewCommandHelper = new OverviewCommandHelper(this); mMainThreadChoreographer = Choreographer.getInstance(); diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 1c79f44755..6908b89783 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -504,8 +504,8 @@ public class WindowTransformSwipeHandler { // This method is only called when STATE_GESTURE_STARTED_QUICKSTEP/ // STATE_GESTURE_STARTED_QUICKSCRUB is set, so we can enable the high-res thumbnail loader // here once we are sure that we will end up in an overview state - RecentsModel.INSTANCE.get(mContext).getRecentsTaskLoader() - .getHighResThumbnailLoader().setVisible(true); + RecentsModel.INSTANCE.get(mContext).getThumbnailCache() + .getHighResLoadingState().setVisible(true); } private void shiftAnimationDestinationForQuickscrub() { diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 1205bdc3b6..cbbd181e20 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -43,7 +43,6 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; -import android.os.UserHandle; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -78,13 +77,11 @@ import com.android.launcher3.util.Themes; import com.android.quickstep.OverviewCallbacks; import com.android.quickstep.QuickScrubController; import com.android.quickstep.RecentsModel; +import com.android.quickstep.TaskThumbnailCache; import com.android.quickstep.TaskUtils; import com.android.quickstep.util.ClipAnimationHelper; import com.android.quickstep.util.TaskViewDrawable; -import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan; -import com.android.systemui.shared.recents.model.RecentsTaskLoader; import com.android.systemui.shared.recents.model.Task; -import com.android.systemui.shared.recents.model.TaskStack; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.BackgroundExecutor; @@ -100,7 +97,8 @@ import androidx.annotation.Nullable; * A list of recent tasks. */ @TargetApi(Build.VERSION_CODES.P) -public abstract class RecentsView extends PagedView implements Insettable { +public abstract class RecentsView extends PagedView implements Insettable, + TaskThumbnailCache.HighResLoadingState.HighResLoadingStateChangedCallback { private static final String TAG = RecentsView.class.getSimpleName(); @@ -206,17 +204,13 @@ public abstract class RecentsView extends PagedView impl handler.post(() -> dismissTask(taskView, true /* animate */, false /* removeTask */)); } else { - RecentsTaskLoadPlan loadPlan = new RecentsTaskLoadPlan(getContext()); - RecentsTaskLoadPlan.PreloadOptions opts = - new RecentsTaskLoadPlan.PreloadOptions(); - opts.loadTitles = false; - loadPlan.preloadPlan(opts, mModel.getRecentsTaskLoader(), -1, - UserHandle.myUserId()); - if (loadPlan.getTaskStack().findTaskWithId(taskId) == null) { - // The task was removed from the recents list - handler.post(() -> - dismissTask(taskView, true /* animate */, false /* removeTask */)); - } + mModel.findTaskWithId(taskKey.id, (key) -> { + if (key == null) { + // The task was removed from the recents list + handler.post(() -> dismissTask(taskView, true /* animate */, + false /* removeTask */)); + } + }); } }); } @@ -229,9 +223,9 @@ public abstract class RecentsView extends PagedView impl } }; - // Used to keep track of the last requested load plan id, so that we do not request to load the + // Used to keep track of the last requested task list id, so that we do not request to load the // tasks again if we have already requested it and the task list has not changed - private int mRequestedLoadPlanId = -1; + private int mTaskListChangeId = -1; // Only valid until the launcher state changes to NORMAL private int mRunningTaskId = -1; @@ -285,7 +279,6 @@ public abstract class RecentsView extends PagedView impl mActivity = (T) BaseActivity.fromContext(context); mQuickScrubController = new QuickScrubController(mActivity, this); mModel = RecentsModel.INSTANCE.get(context); - mClearAllButton = (ClearAllButton) LayoutInflater.from(context) .inflate(R.layout.overview_clear_all_button, this, false); mClearAllButton.setOnClickListener(this::dismissAllTasks); @@ -316,7 +309,7 @@ public abstract class RecentsView extends PagedView impl public TaskView updateThumbnail(int taskId, ThumbnailData thumbnailData) { TaskView taskView = getTaskView(taskId); if (taskView != null) { - taskView.onTaskDataLoaded(taskView.getTask(), thumbnailData); + taskView.getThumbnail().setThumbnail(taskView.getTask(), thumbnailData); } return taskView; } @@ -331,6 +324,7 @@ public abstract class RecentsView extends PagedView impl protected void onAttachedToWindow() { super.onAttachedToWindow(); updateTaskStackListenerState(); + mModel.getThumbnailCache().getHighResLoadingState().addCallback(this); mActivity.addMultiWindowModeChangedListener(mMultiWindowModeChangedListener); ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener); } @@ -339,6 +333,7 @@ public abstract class RecentsView extends PagedView impl protected void onDetachedFromWindow() { super.onDetachedFromWindow(); updateTaskStackListenerState(); + mModel.getThumbnailCache().getHighResLoadingState().removeCallback(this); mActivity.removeMultiWindowModeChangedListener(mMultiWindowModeChangedListener); ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mTaskStackListener); } @@ -349,12 +344,11 @@ public abstract class RecentsView extends PagedView impl // Clear the task data for the removed child if it was visible if (child != mClearAllButton) { - Task task = ((TaskView) child).getTask(); + TaskView taskView = (TaskView) child; + Task task = taskView.getTask(); if (mHasVisibleTaskData.get(task.key.id)) { mHasVisibleTaskData.delete(task.key.id); - RecentsTaskLoader loader = mModel.getRecentsTaskLoader(); - loader.unloadTaskData(task); - loader.getHighResThumbnailLoader().onTaskInvisible(task); + taskView.onTaskListVisibilityChanged(false /* visible */); } } } @@ -444,14 +438,13 @@ public abstract class RecentsView extends PagedView impl return true; } - private void applyLoadPlan(RecentsTaskLoadPlan loadPlan) { + private void applyLoadPlan(ArrayList tasks) { if (mPendingAnimation != null) { - mPendingAnimation.addEndListener((onEndListener) -> applyLoadPlan(loadPlan)); + mPendingAnimation.addEndListener((onEndListener) -> applyLoadPlan(tasks)); return; } - TaskStack stack = loadPlan != null ? loadPlan.getTaskStack() : null; - if (stack == null) { + if (tasks == null || tasks.isEmpty()) { removeAllViews(); onTaskStackUpdated(); return; @@ -462,7 +455,6 @@ public abstract class RecentsView extends PagedView impl // Ensure there are as many views as there are tasks in the stack (adding and trimming as // necessary) final LayoutInflater inflater = LayoutInflater.from(getContext()); - final ArrayList tasks = new ArrayList<>(stack.getTasks()); // Unload existing visible task data unloadVisibleTaskData(); @@ -581,9 +573,8 @@ public abstract class RecentsView extends PagedView impl loadVisibleTaskData(); } - // Update the high res thumbnail loader - RecentsTaskLoader loader = mModel.getRecentsTaskLoader(); - loader.getHighResThumbnailLoader().setFlingingFast(isFlingingFast); + // Update the high res thumbnail loader state + mModel.getThumbnailCache().getHighResLoadingState().setFlingingFast(isFlingingFast); return scrolling; } @@ -618,13 +609,12 @@ public abstract class RecentsView extends PagedView impl * and unloads the associated task data for tasks that are no longer visible. */ public void loadVisibleTaskData() { - if (!mOverviewStateEnabled || mRequestedLoadPlanId == -1) { + if (!mOverviewStateEnabled || mTaskListChangeId == -1) { // Skip loading visible task data if we've already left the overview state, or if the // task list hasn't been loaded yet (the task views will not reflect the task list) return; } - RecentsTaskLoader loader = mModel.getRecentsTaskLoader(); int centerPageIndex = getPageNearestToCenterOfScreen(); int numChildren = getTaskViewCount(); int lower = Math.max(0, centerPageIndex - 2); @@ -641,14 +631,12 @@ public abstract class RecentsView extends PagedView impl continue; } if (!mHasVisibleTaskData.get(task.key.id)) { - loader.loadTaskData(task); - loader.getHighResThumbnailLoader().onTaskVisible(task); + taskView.onTaskListVisibilityChanged(true /* visible */); } mHasVisibleTaskData.put(task.key.id, visible); } else { if (mHasVisibleTaskData.get(task.key.id)) { - loader.unloadTaskData(task); - loader.getHighResThumbnailLoader().onTaskInvisible(task); + taskView.onTaskListVisibilityChanged(false /* visible */); } mHasVisibleTaskData.delete(task.key.id); } @@ -659,27 +647,40 @@ public abstract class RecentsView extends PagedView impl * Unloads any associated data from the currently visible tasks */ private void unloadVisibleTaskData() { - RecentsTaskLoader loader = mModel.getRecentsTaskLoader(); for (int i = 0; i < mHasVisibleTaskData.size(); i++) { if (mHasVisibleTaskData.valueAt(i)) { TaskView taskView = getTaskView(mHasVisibleTaskData.keyAt(i)); if (taskView != null) { - Task task = taskView.getTask(); - loader.unloadTaskData(task); - loader.getHighResThumbnailLoader().onTaskInvisible(task); + taskView.onTaskListVisibilityChanged(false /* visible */); } } } mHasVisibleTaskData.clear(); } + @Override + public void onHighResLoadingStateChanged(boolean enabled) { + // Whenever the high res loading state changes, poke each of the visible tasks to see if + // they want to updated their thumbnail state + for (int i = 0; i < mHasVisibleTaskData.size(); i++) { + if (mHasVisibleTaskData.valueAt(i)) { + TaskView taskView = getTaskView(mHasVisibleTaskData.keyAt(i)); + if (taskView != null) { + // Poke the view again, which will trigger it to load high res if the state + // is enabled + taskView.onTaskListVisibilityChanged(true /* visible */); + } + } + } + } + protected abstract void startHome(); public void reset() { mRunningTaskId = -1; mRunningTaskTileHidden = false; mIgnoreResetTaskId = -1; - mRequestedLoadPlanId = -1; + mTaskListChangeId = -1; unloadVisibleTaskData(); setCurrentPage(0); @@ -691,8 +692,8 @@ public abstract class RecentsView extends PagedView impl * Reloads the view if anything in recents changed. */ public void reloadIfNeeded() { - if (!mModel.isLoadPlanValid(mRequestedLoadPlanId)) { - mRequestedLoadPlanId = mModel.loadTasks(mRunningTaskId, this::applyLoadPlan); + if (!mModel.isTaskListValid(mTaskListChangeId)) { + mTaskListChangeId = mModel.getTasks(this::applyLoadPlan); } } @@ -753,8 +754,8 @@ public abstract class RecentsView extends PagedView impl setCurrentPage(0); - // Load the tasks - reloadIfNeeded(); + // Load the tasks (if the loading is already + mTaskListChangeId = mModel.getTasks(this::applyLoadPlan); } public void showNextTask() { diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 56074f0f55..da5b79a9df 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -17,7 +17,6 @@ package com.android.quickstep.views; import static android.widget.Toast.LENGTH_SHORT; - import static com.android.launcher3.BaseActivity.fromContext; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.LINEAR; @@ -30,6 +29,7 @@ import android.app.ActivityOptions; import android.content.Context; import android.content.res.Resources; import android.graphics.Outline; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.util.AttributeSet; @@ -47,14 +47,15 @@ import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; +import com.android.quickstep.RecentsModel; +import com.android.quickstep.TaskIconCache; import com.android.quickstep.TaskOverlayFactory; import com.android.quickstep.TaskSystemShortcut; +import com.android.quickstep.TaskThumbnailCache; import com.android.quickstep.TaskUtils; import com.android.quickstep.views.RecentsView.PageCallbacks; import com.android.quickstep.views.RecentsView.ScrollState; import com.android.systemui.shared.recents.model.Task; -import com.android.systemui.shared.recents.model.Task.TaskCallbacks; -import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityOptionsCompat; @@ -64,7 +65,7 @@ import java.util.function.Consumer; /** * A task in the Recents view. */ -public class TaskView extends FrameLayout implements TaskCallbacks, PageCallbacks { +public class TaskView extends FrameLayout implements PageCallbacks { private static final String TAG = TaskView.class.getSimpleName(); @@ -137,6 +138,10 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback private Animator mIconAndDimAnimator; private float mFocusTransitionProgress = 1; + // The current background requests to load the task thumbnail and icon + private TaskThumbnailCache.ThumbnailLoadRequest mThumbnailLoadRequest; + private TaskIconCache.IconLoadRequest mIconLoadRequest; + public TaskView(Context context) { this(context, null); } @@ -170,13 +175,8 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback * Updates this task view to the given {@param task}. */ public void bind(Task task) { - if (mTask != null) { - mTask.removeCallback(this); - } mTask = task; mSnapshotView.bind(); - task.addCallback(this); - setContentDescription(task.titleDescription); } public Task getTask() { @@ -233,15 +233,34 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback } } - @Override - public void onTaskDataLoaded(Task task, ThumbnailData thumbnailData) { - mSnapshotView.setThumbnail(task, thumbnailData); - mIconView.setDrawable(task.icon); - mIconView.setOnClickListener(icon -> showTaskMenu()); - mIconView.setOnLongClickListener(icon -> { - requestDisallowInterceptTouchEvent(true); - return showTaskMenu(); - }); + public void onTaskListVisibilityChanged(boolean visible) { + if (mTask == null) { + return; + } + if (visible) { + // These calls are no-ops if the data is already loaded, try and load the high + // resolution thumbnail if the state permits + RecentsModel model = RecentsModel.INSTANCE.get(getContext()); + TaskThumbnailCache thumbnailCache = model.getThumbnailCache(); + TaskIconCache iconCache = model.getIconCache(); + mThumbnailLoadRequest = thumbnailCache.updateThumbnailInBackground(mTask, + !thumbnailCache.getHighResLoadingState().isEnabled() /* reducedResolution */, + (task) -> mSnapshotView.setThumbnail(task, task.thumbnail)); + mIconLoadRequest = iconCache.updateIconInBackground(mTask, + (task) -> { + setContentDescription(task.titleDescription); + setIcon(task.icon); + }); + } else { + if (mThumbnailLoadRequest != null) { + mThumbnailLoadRequest.cancel(); + } + if (mIconLoadRequest != null) { + mIconLoadRequest.cancel(); + } + mSnapshotView.setThumbnail(null, null); + setIcon(null); + } } private boolean showTaskMenu() { @@ -253,16 +272,18 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback return mMenuView != null; } - @Override - public void onTaskDataUnloaded() { - mSnapshotView.setThumbnail(null, null); - mIconView.setDrawable(null); - mIconView.setOnLongClickListener(null); - } - - @Override - public void onTaskWindowingModeChanged() { - // Do nothing + private void setIcon(Drawable icon) { + if (icon != null) { + mIconView.setDrawable(icon); + mIconView.setOnClickListener(v -> showTaskMenu()); + mIconView.setOnLongClickListener(v -> { + requestDisallowInterceptTouchEvent(true); + return showTaskMenu(); + }); + } else { + mIconView.setDrawable(null); + mIconView.setOnLongClickListener(null); + } } private void setIconAndDimTransitionProgress(float progress) { diff --git a/res/values/config.xml b/res/values/config.xml index 85c2e65c51..946afecf85 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -132,6 +132,4 @@ - 6 - 12 diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 0395fbbcc7..c50819a6fc 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -768,7 +768,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } mAppWidgetHost.setListenIfResumed(true); NotificationListener.setNotificationsChangedListener(mPopupDataProvider); - UiFactory.onStart(this); } private void logOnDelayedResume() { diff --git a/src/com/android/launcher3/icons/HandlerRunnable.java b/src/com/android/launcher3/icons/HandlerRunnable.java new file mode 100644 index 0000000000..e7132cd694 --- /dev/null +++ b/src/com/android/launcher3/icons/HandlerRunnable.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.icons; + +import android.os.Handler; + +/** + * A runnable that can be posted to a {@link Handler} which can be canceled. + */ +public abstract class HandlerRunnable implements Runnable { + + private final Handler mHandler; + private final Runnable mEndRunnable; + + private boolean mEnded = false; + private boolean mCanceled = false; + + public HandlerRunnable(Handler handler, Runnable endRunnable) { + mHandler = handler; + mEndRunnable = endRunnable; + } + + /** + * Cancels this runnable from being run, only if it has not already run. + */ + public void cancel() { + mHandler.removeCallbacks(this); + // TODO: This can actually cause onEnd to be called twice if the handler is already running + // this runnable + // NOTE: This is currently run on whichever thread the caller is run on. + mCanceled = true; + onEnd(); + } + + /** + * @return whether this runnable was canceled. + */ + protected boolean isCanceled() { + return mCanceled; + } + + /** + * To be called by the implemention of this runnable. The end callback is done on whichever + * thread the caller is calling from. + */ + public void onEnd() { + if (!mEnded) { + mEnded = true; + if (mEndRunnable != null) { + mEndRunnable.run(); + } + } + } +} diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java index 41a53e572f..6e2ca28ec6 100644 --- a/src/com/android/launcher3/icons/IconCache.java +++ b/src/com/android/launcher3/icons/IconCache.java @@ -169,27 +169,9 @@ public class IconCache extends BaseIconCache { applyCacheEntry(entry, infoInOut); } - public static abstract class IconLoadRequest implements Runnable { - private final Handler mHandler; - private final Runnable mEndRunnable; - - private boolean mEnded = false; - + public static abstract class IconLoadRequest extends HandlerRunnable { IconLoadRequest(Handler handler, Runnable endRunnable) { - mHandler = handler; - mEndRunnable = endRunnable; - } - - public void cancel() { - mHandler.removeCallbacks(this); - onEnd(); - } - - public void onEnd() { - if (!mEnded) { - mEnded = true; - mEndRunnable.run(); - } + super(handler, endRunnable); } } -- GitLab From cc8dbf31db320c6d9513516603c9dcb2c3d01aa5 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 16 Oct 2018 15:59:24 -0700 Subject: [PATCH 0221/1301] Caching clean up, remove dependency on old shared lib loading/caching logic - Clarify caching policy, we only cache the last N task snapshots - Pull out necessary logic from RecentsTaskLoadPlan (deprecated) into launcher class RecentTasksList which also manages the invalidation of the last loaded list - Pull out logic from task loading logic in the shared lib into separate classes TaskThumbnailCache and TaskIconCache, and have each task view manage the load request for data Bug: 117603579 Test: Thumbnails still load Change-Id: I938e4dea19e7f5d24724c32194d254ca003e89aa --- quickstep/res/values/config.xml | 5 + .../launcher3/uioverrides/UiFactory.java | 11 +- .../quickstep/OtherActivityTouchConsumer.java | 2 +- .../quickstep/OverviewCommandHelper.java | 2 +- .../android/quickstep/RecentTasksList.java | 167 ++++++++++++++ .../android/quickstep/RecentsActivity.java | 1 - .../com/android/quickstep/RecentsModel.java | 206 +++++++----------- .../com/android/quickstep/TaskIconCache.java | 151 +++++++++++++ .../android/quickstep/TaskThumbnailCache.java | 198 +++++++++++++++++ .../quickstep/TouchInteractionService.java | 1 - .../WindowTransformSwipeHandler.java | 4 +- .../android/quickstep/views/RecentsView.java | 95 ++++---- .../com/android/quickstep/views/TaskView.java | 77 ++++--- res/values/config.xml | 2 - src/com/android/launcher3/Launcher.java | 1 - .../launcher3/icons/HandlerRunnable.java | 67 ++++++ .../android/launcher3/icons/IconCache.java | 22 +- 17 files changed, 767 insertions(+), 245 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/RecentTasksList.java create mode 100644 quickstep/src/com/android/quickstep/TaskIconCache.java create mode 100644 quickstep/src/com/android/quickstep/TaskThumbnailCache.java create mode 100644 src/com/android/launcher3/icons/HandlerRunnable.java diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml index c294376340..d8ca1c47c1 100644 --- a/quickstep/res/values/config.xml +++ b/quickstep/res/values/config.xml @@ -19,4 +19,9 @@ com.android.quickstep.logging.UserEventDispatcherExtension + + + 3 + 12 diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index b406b30781..4e79fed59e 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -163,19 +163,12 @@ public class UiFactory { } } - public static void onStart(Context context) { - RecentsModel model = RecentsModel.INSTANCE.get(context); - if (model != null) { - model.onStart(); - } - } - public static void onEnterAnimationComplete(Context context) { // After the transition to home, enable the high-res thumbnail loader if it wasn't enabled // as a part of quickstep/scrub, so that high-res thumbnails can load the next time we // enter overview - RecentsModel.INSTANCE.get(context).getRecentsTaskLoader() - .getHighResThumbnailLoader().setVisible(true); + RecentsModel.INSTANCE.get(context).getThumbnailCache() + .getHighResLoadingState().setVisible(true); } public static void onLauncherStateOrResumeChanged(Launcher launcher) { diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index 94ec69a0c2..b11260ea58 100644 --- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java +++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java @@ -232,7 +232,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC mInputConsumer, mTouchInteractionLog); // Preload the plan - mRecentsModel.loadTasks(mRunningTask.id, null); + mRecentsModel.getTasks(null); mInteractionHandler = handler; handler.setGestureEndCallback(mEventQueue::reset); diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index d9626c4bdf..5b488ca6db 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -230,7 +230,7 @@ public class OverviewCommandHelper { mRunningTaskId = mAM.getRunningTask().id; // Preload the plan - mRecentsModel.loadTasks(mRunningTaskId, null); + mRecentsModel.getTasks(null); } @Override diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java new file mode 100644 index 0000000000..fec38bf144 --- /dev/null +++ b/quickstep/src/com/android/quickstep/RecentTasksList.java @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.quickstep; + +import android.app.ActivityManager; +import android.content.Context; +import android.os.Process; +import android.util.SparseBooleanArray; +import com.android.launcher3.MainThreadExecutor; +import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.BackgroundExecutor; +import com.android.systemui.shared.system.KeyguardManagerCompat; +import com.android.systemui.shared.system.RecentTaskInfoCompat; +import com.android.systemui.shared.system.TaskDescriptionCompat; +import com.android.systemui.shared.system.TaskStackChangeListener; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Consumer; + +/** + * Manages the recent task list from the system, caching it as necessary. + */ +public class RecentTasksList extends TaskStackChangeListener { + + private final KeyguardManagerCompat mKeyguardManager; + private final MainThreadExecutor mMainThreadExecutor; + private final BackgroundExecutor mBgThreadExecutor; + + // The list change id, increments as the task list changes in the system + private int mChangeId; + // The last change id when the list was last loaded completely, must be <= the list change id + private int mLastLoadedId; + + ArrayList mTasks = new ArrayList<>(); + + public RecentTasksList(Context context) { + mMainThreadExecutor = new MainThreadExecutor(); + mBgThreadExecutor = BackgroundExecutor.get(); + mKeyguardManager = new KeyguardManagerCompat(context); + mChangeId = 1; + } + + /** + * Asynchronously fetches the list of recent tasks. + * + * @param numTasks The maximum number of tasks to fetch + * @param loadKeysOnly Whether to load other associated task data, or just the key + * @param callback The callback to receive the list of recent tasks + * @return The change id of the current task list + */ + public synchronized int getTasks(int numTasks, boolean loadKeysOnly, + Consumer> callback) { + final int requestLoadId = mChangeId; + final int numLoadTasks = numTasks > 0 + ? numTasks + : Integer.MAX_VALUE; + + if (mLastLoadedId == mChangeId) { + // The list is up to date, callback with the same list + mMainThreadExecutor.execute(() -> { + if (callback != null) { + callback.accept(mTasks); + } + }); + } + + // Kick off task loading in the background + mBgThreadExecutor.submit(() -> { + ArrayList tasks = loadTasksInBackground(numLoadTasks, + loadKeysOnly); + + mMainThreadExecutor.execute(() -> { + mTasks = tasks; + mLastLoadedId = requestLoadId; + + if (callback != null) { + callback.accept(tasks); + } + }); + }); + + return requestLoadId; + } + + /** + * @return Whether the provided {@param changeId} is the latest recent tasks list id. + */ + public synchronized boolean isTaskListValid(int changeId) { + return mChangeId == changeId; + } + + @Override + public synchronized void onTaskStackChanged() { + mChangeId++; + } + + @Override + public synchronized void onActivityPinned(String packageName, int userId, int taskId, + int stackId) { + mChangeId++; + } + + @Override + public synchronized void onActivityUnpinned() { + mChangeId++; + } + + /** + * Loads and creates a list of all the recent tasks. + */ + private ArrayList loadTasksInBackground(int numTasks, + boolean loadKeysOnly) { + int currentUserId = Process.myUserHandle().getIdentifier(); + ArrayList allTasks = new ArrayList<>(); + List rawTasks = + ActivityManagerWrapper.getInstance().getRecentTasks(numTasks, currentUserId); + // The raw tasks are given in most-recent to least-recent order, we need to reverse it + Collections.reverse(rawTasks); + + SparseBooleanArray tmpLockedUsers = new SparseBooleanArray() { + @Override + public boolean get(int key) { + if (indexOfKey(key) < 0) { + // Fill the cached locked state as we fetch + put(key, mKeyguardManager.isDeviceLocked(key)); + } + return super.get(key); + } + }; + + int taskCount = rawTasks.size(); + for (int i = 0; i < taskCount; i++) { + ActivityManager.RecentTaskInfo rawTask = rawTasks.get(i); + RecentTaskInfoCompat t = new RecentTaskInfoCompat(rawTask); + Task.TaskKey taskKey = new Task.TaskKey(rawTask); + Task task; + if (!loadKeysOnly) { + ActivityManager.TaskDescription rawTd = t.getTaskDescription(); + TaskDescriptionCompat td = new TaskDescriptionCompat(rawTd); + boolean isLocked = tmpLockedUsers.get(t.getUserId()); + task = new Task(taskKey, td.getPrimaryColor(), td.getBackgroundColor(), + t.supportsSplitScreenMultiWindow(), isLocked, rawTd, t.getTopActivity()); + } else { + task = new Task(taskKey); + } + allTasks.add(task); + } + + return allTasks; + } +} \ No newline at end of file diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index b93a54b899..ef735e1ce2 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -219,7 +219,6 @@ public class RecentsActivity extends BaseDraggingActivity { // onActivityStart callback. mFallbackRecentsView.setContentAlpha(1); super.onStart(); - UiFactory.onStart(this); mFallbackRecentsView.resetTaskVisuals(); } diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index 517f7599db..a9ce5ccf26 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -18,38 +18,22 @@ package com.android.quickstep; import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId; import android.annotation.TargetApi; -import android.app.ActivityManager; import android.content.ComponentCallbacks2; -import android.content.ComponentName; import android.content.Context; -import android.content.pm.ActivityInfo; -import android.content.res.Resources; -import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; -import android.os.Handler; +import android.os.HandlerThread; +import android.os.Process; import android.os.RemoteException; -import android.os.UserHandle; import android.util.Log; -import android.util.LruCache; import android.util.SparseArray; -import android.view.accessibility.AccessibilityManager; - import com.android.launcher3.MainThreadExecutor; -import com.android.launcher3.R; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.Preconditions; -import com.android.launcher3.util.UiThreadHelper; import com.android.systemui.shared.recents.ISystemUiProxy; -import com.android.systemui.shared.recents.model.IconLoader; -import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan; -import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan.PreloadOptions; -import com.android.systemui.shared.recents.model.RecentsTaskLoader; -import com.android.systemui.shared.recents.model.TaskKeyLruCache; +import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.BackgroundExecutor; import com.android.systemui.shared.system.TaskStackChangeListener; - import java.util.ArrayList; import java.util.function.Consumer; @@ -68,110 +52,102 @@ public class RecentsModel extends TaskStackChangeListener { private final ArrayList mAssistDataListeners = new ArrayList<>(); private final Context mContext; - private final RecentsTaskLoader mRecentsTaskLoader; private final MainThreadExecutor mMainThreadExecutor; - private final Handler mBgHandler; - private RecentsTaskLoadPlan mLastLoadPlan; - private int mLastLoadPlanId; - private int mTaskChangeId; private ISystemUiProxy mSystemUiProxy; private boolean mClearAssistCacheOnStackChange = true; - private final boolean mIsLowRamDevice; - private boolean mPreloadTasksInBackground; - private final AccessibilityManager mAccessibilityManager; + + private final RecentTasksList mTaskList; + private final TaskIconCache mIconCache; + private final TaskThumbnailCache mThumbnailCache; private RecentsModel(Context context) { mContext = context; - ActivityManager activityManager = - (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - mIsLowRamDevice = activityManager.isLowRamDevice(); mMainThreadExecutor = new MainThreadExecutor(); - mBgHandler = new Handler(UiThreadHelper.getBackgroundLooper()); - - Resources res = context.getResources(); - mRecentsTaskLoader = new RecentsTaskLoader(mContext, - res.getInteger(R.integer.config_recentsMaxThumbnailCacheSize), - res.getInteger(R.integer.config_recentsMaxIconCacheSize), 0) { - - @Override - protected IconLoader createNewIconLoader(Context context, - TaskKeyLruCache iconCache, - LruCache activityInfoCache) { - // Disable finding the dominant color since we don't need to use it - return new NormalizedIconLoader(context, iconCache, activityInfoCache, - true /* disableColorExtraction */); - } - }; - mRecentsTaskLoader.startLoader(mContext); + + HandlerThread loaderThread = new HandlerThread("TaskThumbnailIconCache", + Process.THREAD_PRIORITY_BACKGROUND); + loaderThread.start(); + mTaskList = new RecentTasksList(context); + mIconCache = new TaskIconCache(context, loaderThread.getLooper()); + mThumbnailCache = new TaskThumbnailCache(context, loaderThread.getLooper()); ActivityManagerWrapper.getInstance().registerTaskStackListener(this); + } - mTaskChangeId = 1; - loadTasks(-1, null); - mAccessibilityManager = context.getSystemService(AccessibilityManager.class); + public TaskIconCache getIconCache() { + return mIconCache; } - public RecentsTaskLoader getRecentsTaskLoader() { - return mRecentsTaskLoader; + public TaskThumbnailCache getThumbnailCache() { + return mThumbnailCache; } /** - * Preloads the task plan - * @param taskId The running task id or -1 + * Fetches the list of recent tasks. + * * @param callback The callback to receive the task plan once its complete or null. This is * always called on the UI thread. * @return the request id associated with this call. */ - public int loadTasks(int taskId, Consumer callback) { - final int requestId = mTaskChangeId; - - // Fail fast if nothing has changed. - if (mLastLoadPlanId == mTaskChangeId) { - if (callback != null) { - final RecentsTaskLoadPlan plan = mLastLoadPlan; - mMainThreadExecutor.execute(() -> callback.accept(plan)); - } - return requestId; - } - - BackgroundExecutor.get().submit(() -> { - // Preload the plan - RecentsTaskLoadPlan loadPlan = new RecentsTaskLoadPlan(mContext); - PreloadOptions opts = new PreloadOptions(); - opts.loadTitles = mAccessibilityManager.isEnabled(); - loadPlan.preloadPlan(opts, mRecentsTaskLoader, taskId, UserHandle.myUserId()); - // Set the load plan on UI thread - mMainThreadExecutor.execute(() -> { - mLastLoadPlan = loadPlan; - mLastLoadPlanId = requestId; - - if (callback != null) { - callback.accept(loadPlan); - } - }); - }); - return requestId; + public int getTasks(Consumer> callback) { + return mTaskList.getTasks(-1, false /* loadKeysOnly */, callback); } - public void setPreloadTasksInBackground(boolean preloadTasksInBackground) { - mPreloadTasksInBackground = preloadTasksInBackground && !mIsLowRamDevice; + /** + * @return Whether the provided {@param changeId} is the latest recent tasks list id. + */ + public boolean isTaskListValid(int changeId) { + return mTaskList.isTaskListValid(changeId); } - @Override - public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { - mTaskChangeId++; + /** + * Finds and returns the task key associated with the given task id. + * + * @param callback The callback to receive the task key if it is found or null. This is always + * called on the UI thread. + */ + public void findTaskWithId(int taskId, Consumer callback) { + mTaskList.getTasks(-1, true /* loadKeysOnly */, (tasks) -> { + for (Task task : tasks) { + if (task.key.id == taskId) { + callback.accept(task.key); + return; + } + } + callback.accept(null); + }); } @Override - public void onActivityUnpinned() { - mTaskChangeId++; + public void onTaskStackChangedBackground() { + if (!mThumbnailCache.isPreloadingEnabled()) { + // Skip if we aren't preloading + return; + } + + int currentUserId = Process.myUserHandle().getIdentifier(); + if (!checkCurrentOrManagedUserId(currentUserId, mContext)) { + // Skip if we are not the current user + return; + } + + // Keep the cache up to date with the latest thumbnails + mTaskList.getTasks(mThumbnailCache.getCacheSize(), true /* keysOnly */, (tasks) -> { + int runningTaskId = ActivityManagerWrapper.getInstance().getRunningTask().id; + for (Task task : tasks) { + if (task.key.id == runningTaskId) { + // Skip the running task, it's not going to have an up-to-date snapshot by the + // time the user next enters overview + continue; + } + mThumbnailCache.updateThumbnailInCache(task); + } + }); } @Override public void onTaskStackChanged() { - mTaskChangeId++; - Preconditions.assertUIThread(); if (mClearAssistCacheOnStackChange) { mCachedAssistData.clear(); @@ -180,39 +156,6 @@ public class RecentsModel extends TaskStackChangeListener { } } - @Override - public void onTaskStackChangedBackground() { - int userId = UserHandle.myUserId(); - if (!mPreloadTasksInBackground || !checkCurrentOrManagedUserId(userId, mContext)) { - // TODO: Only register this for the current user - return; - } - - // Preload a fixed number of task icons/thumbnails in the background - ActivityManager.RunningTaskInfo runningTaskInfo = - ActivityManagerWrapper.getInstance().getRunningTask(); - RecentsTaskLoadPlan plan = new RecentsTaskLoadPlan(mContext); - RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options(); - launchOpts.runningTaskId = runningTaskInfo != null ? runningTaskInfo.id : -1; - launchOpts.numVisibleTasks = 2; - launchOpts.numVisibleTaskThumbnails = 2; - launchOpts.onlyLoadForCache = true; - launchOpts.onlyLoadPausedActivities = true; - launchOpts.loadThumbnails = true; - PreloadOptions preloadOpts = new PreloadOptions(); - preloadOpts.loadTitles = mAccessibilityManager.isEnabled(); - plan.preloadPlan(preloadOpts, mRecentsTaskLoader, -1, userId); - mRecentsTaskLoader.loadTasks(plan, launchOpts); - } - - public boolean isLoadPlanValid(int resultId) { - return mTaskChangeId == resultId; - } - - public RecentsTaskLoadPlan getLastLoadPlan() { - return mLastLoadPlan; - } - public void setSystemUiProxy(ISystemUiProxy systemUiProxy) { mSystemUiProxy = systemUiProxy; } @@ -221,16 +164,15 @@ public class RecentsModel extends TaskStackChangeListener { return mSystemUiProxy; } - public void onStart() { - mRecentsTaskLoader.startLoader(mContext); - } - public void onTrimMemory(int level) { if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { - // We already stop the loader in UI_HIDDEN, so stop the high res loader as well - mRecentsTaskLoader.getHighResThumbnailLoader().setVisible(false); + mThumbnailCache.getHighResLoadingState().setVisible(false); + } + if (level == ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL) { + // Clear everything once we reach a low-mem situation + mThumbnailCache.clear(); + mIconCache.clear(); } - mBgHandler.post(() -> mRecentsTaskLoader.onTrimMemory(level)); } public void onOverviewShown(boolean fromHome, String tag) { diff --git a/quickstep/src/com/android/quickstep/TaskIconCache.java b/quickstep/src/com/android/quickstep/TaskIconCache.java new file mode 100644 index 0000000000..afa58fab07 --- /dev/null +++ b/quickstep/src/com/android/quickstep/TaskIconCache.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep; + +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Looper; +import android.util.LruCache; +import android.view.accessibility.AccessibilityManager; +import com.android.launcher3.MainThreadExecutor; +import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.icons.HandlerRunnable; +import com.android.launcher3.util.Preconditions; +import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.recents.model.TaskKeyLruCache; +import com.android.systemui.shared.system.ActivityManagerWrapper; +import java.util.function.Consumer; + +/** + * Manages the caching of task icons and related data. + * TODO: This class should later be merged into IconCache. + */ +public class TaskIconCache { + + private final Handler mBackgroundHandler; + private final MainThreadExecutor mMainThreadExecutor; + private final AccessibilityManager mAccessibilityManager; + + private final NormalizedIconLoader mIconLoader; + + private final TaskKeyLruCache mIconCache; + private final TaskKeyLruCache mContentDescriptionCache; + private final LruCache mActivityInfoCache; + + private TaskKeyLruCache.EvictionCallback mClearActivityInfoOnEviction = + new TaskKeyLruCache.EvictionCallback() { + @Override + public void onEntryEvicted(Task.TaskKey key) { + if (key != null) { + mActivityInfoCache.remove(key.getComponent()); + } + } + }; + + public TaskIconCache(Context context, Looper backgroundLooper) { + mBackgroundHandler = new Handler(backgroundLooper); + mMainThreadExecutor = new MainThreadExecutor(); + mAccessibilityManager = context.getSystemService(AccessibilityManager.class); + + Resources res = context.getResources(); + int cacheSize = res.getInteger(R.integer.recentsIconCacheSize); + mIconCache = new TaskKeyLruCache<>(cacheSize, mClearActivityInfoOnEviction); + mContentDescriptionCache = new TaskKeyLruCache<>(cacheSize, mClearActivityInfoOnEviction); + mActivityInfoCache = new LruCache<>(cacheSize); + mIconLoader = new NormalizedIconLoader(context, mIconCache, mActivityInfoCache, + true /* disableColorExtraction */); + } + + /** + * Asynchronously fetches the icon and other task data. + * + * @param task The task to fetch the data for + * @param callback The callback to receive the task after its data has been populated. + * @return A cancelable handle to the request + */ + public IconLoadRequest updateIconInBackground(Task task, Consumer callback) { + Preconditions.assertUIThread(); + if (task.icon != null) { + // Nothing to load, the icon is already loaded + callback.accept(task); + return null; + } + + IconLoadRequest request = new IconLoadRequest(mBackgroundHandler) { + @Override + public void run() { + Drawable icon = mIconLoader.getIcon(task); + String contentDescription = loadContentDescriptionInBackground(task); + if (isCanceled()) { + // We don't call back to the provided callback in this case + return; + } + mMainThreadExecutor.execute(() -> { + task.icon = icon; + task.titleDescription = contentDescription; + callback.accept(task); + onEnd(); + }); + } + }; + Utilities.postAsyncCallback(mBackgroundHandler, request); + return request; + } + + public void clear() { + mIconCache.evictAll(); + mContentDescriptionCache.evictAll(); + } + + /** + * Loads the content description for the given {@param task}. + */ + private String loadContentDescriptionInBackground(Task task) { + // Return the cached content description if it exists + String label = mContentDescriptionCache.getAndInvalidateIfModified(task.key); + if (label != null) { + return label; + } + + // Skip loading content descriptions if accessibility is not enabled + if (!mAccessibilityManager.isEnabled()) { + return ""; + } + + // Skip loading the content description if the activity no longer exists + ActivityInfo activityInfo = mIconLoader.getAndUpdateActivityInfo(task.key); + if (activityInfo == null) { + return ""; + } + + // Load the label otherwise + label = ActivityManagerWrapper.getInstance().getBadgedContentDescription(activityInfo, + task.key.userId, task.taskDescription); + mContentDescriptionCache.put(task.key, label); + return label; + } + + public static abstract class IconLoadRequest extends HandlerRunnable { + IconLoadRequest(Handler handler) { + super(handler, null); + } + } +} diff --git a/quickstep/src/com/android/quickstep/TaskThumbnailCache.java b/quickstep/src/com/android/quickstep/TaskThumbnailCache.java new file mode 100644 index 0000000000..c47101b827 --- /dev/null +++ b/quickstep/src/com/android/quickstep/TaskThumbnailCache.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep; + +import android.app.ActivityManager; +import android.content.Context; +import android.content.res.Resources; +import android.os.Handler; +import android.os.Looper; +import com.android.launcher3.MainThreadExecutor; +import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.icons.HandlerRunnable; +import com.android.launcher3.util.Preconditions; +import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.recents.model.TaskKeyLruCache; +import com.android.systemui.shared.recents.model.ThumbnailData; +import com.android.systemui.shared.system.ActivityManagerWrapper; +import java.util.ArrayList; +import java.util.function.Consumer; + +public class TaskThumbnailCache { + + private final Handler mBackgroundHandler; + private final MainThreadExecutor mMainThreadExecutor; + + private final int mCacheSize; + private final TaskKeyLruCache mCache; + private final HighResLoadingState mHighResLoadingState; + + public static class HighResLoadingState { + private boolean mIsLowRamDevice; + private boolean mVisible; + private boolean mFlingingFast; + private boolean mHighResLoadingEnabled; + private ArrayList mCallbacks = new ArrayList<>(); + + public interface HighResLoadingStateChangedCallback { + void onHighResLoadingStateChanged(boolean enabled); + } + + private HighResLoadingState(Context context) { + ActivityManager activityManager = + (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + mIsLowRamDevice = activityManager.isLowRamDevice(); + } + + public void addCallback(HighResLoadingStateChangedCallback callback) { + mCallbacks.add(callback); + } + + public void removeCallback(HighResLoadingStateChangedCallback callback) { + mCallbacks.remove(callback); + } + + public void setVisible(boolean visible) { + mVisible = visible; + updateState(); + } + + public void setFlingingFast(boolean flingingFast) { + mFlingingFast = flingingFast; + updateState(); + } + + public boolean isEnabled() { + return mHighResLoadingEnabled; + } + + private void updateState() { + boolean prevState = mHighResLoadingEnabled; + mHighResLoadingEnabled = !mIsLowRamDevice && mVisible && !mFlingingFast; + if (prevState != mHighResLoadingEnabled) { + for (int i = mCallbacks.size() - 1; i >= 0; i--) { + mCallbacks.get(i).onHighResLoadingStateChanged(mHighResLoadingEnabled); + } + } + } + } + + public TaskThumbnailCache(Context context, Looper backgroundLooper) { + mBackgroundHandler = new Handler(backgroundLooper); + mMainThreadExecutor = new MainThreadExecutor(); + mHighResLoadingState = new HighResLoadingState(context); + + Resources res = context.getResources(); + mCacheSize = res.getInteger(R.integer.recentsThumbnailCacheSize); + mCache = new TaskKeyLruCache<>(mCacheSize); + } + + /** + * Synchronously fetches the thumbnail for the given {@param task} and puts it in the cache. + */ + public void updateThumbnailInCache(Task task) { + Preconditions.assertUIThread(); + + // Fetch the thumbnail for this task and put it in the cache + mCache.put(task.key, ActivityManagerWrapper.getInstance().getTaskThumbnail( + task.key.id, true /* reducedResolution */)); + } + + + /** + * Asynchronously fetches the icon and other task data for the given {@param task}. + * + * @param callback The callback to receive the task after its data has been populated. + * @return A cancelable handle to the request + */ + public ThumbnailLoadRequest updateThumbnailInBackground(Task task, boolean reducedResolution, + Consumer callback) { + Preconditions.assertUIThread(); + + if (task.thumbnail != null && (!task.thumbnail.reducedResolution || reducedResolution)) { + // Nothing to load, the thumbnail is already high-resolution or matches what the + // request, so just callback + callback.accept(task); + return null; + } + + ThumbnailData cachedThumbnail = mCache.getAndInvalidateIfModified(task.key); + if (cachedThumbnail != null && (!cachedThumbnail.reducedResolution || reducedResolution)) { + // Already cached, lets use that thumbnail + task.thumbnail = cachedThumbnail; + callback.accept(task); + return null; + } + + ThumbnailLoadRequest request = new ThumbnailLoadRequest(mBackgroundHandler, + reducedResolution) { + @Override + public void run() { + ThumbnailData thumbnail = ActivityManagerWrapper.getInstance().getTaskThumbnail( + task.key.id, reducedResolution); + if (isCanceled()) { + // We don't call back to the provided callback in this case + return; + } + mMainThreadExecutor.execute(() -> { + task.thumbnail = thumbnail; + callback.accept(task); + onEnd(); + }); + } + }; + Utilities.postAsyncCallback(mBackgroundHandler, request); + return request; + } + + /** + * Clears the cache. + */ + public void clear() { + mCache.evictAll(); + } + + /** + * @return The cache size. + */ + public int getCacheSize() { + return mCacheSize; + } + + /** + * @return The mutable high-res loading state. + */ + public HighResLoadingState getHighResLoadingState() { + return mHighResLoadingState; + } + + /** + * @return Whether to enable background preloading of task thumbnails. + */ + public boolean isPreloadingEnabled() { + return !mHighResLoadingState.mIsLowRamDevice && mHighResLoadingState.mVisible; + } + + public static abstract class ThumbnailLoadRequest extends HandlerRunnable { + public final boolean reducedResolution; + + ThumbnailLoadRequest(Handler handler, boolean reducedResolution) { + super(handler, null); + this.reducedResolution = reducedResolution; + } + } +} diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 9371a4c1cf..b1a214d9dd 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -196,7 +196,6 @@ public class TouchInteractionService extends Service { super.onCreate(); mAM = ActivityManagerWrapper.getInstance(); mRecentsModel = RecentsModel.INSTANCE.get(this); - mRecentsModel.setPreloadTasksInBackground(true); mMainThreadExecutor = new MainThreadExecutor(); mOverviewCommandHelper = new OverviewCommandHelper(this); mMainThreadChoreographer = Choreographer.getInstance(); diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 1c79f44755..6908b89783 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -504,8 +504,8 @@ public class WindowTransformSwipeHandler { // This method is only called when STATE_GESTURE_STARTED_QUICKSTEP/ // STATE_GESTURE_STARTED_QUICKSCRUB is set, so we can enable the high-res thumbnail loader // here once we are sure that we will end up in an overview state - RecentsModel.INSTANCE.get(mContext).getRecentsTaskLoader() - .getHighResThumbnailLoader().setVisible(true); + RecentsModel.INSTANCE.get(mContext).getThumbnailCache() + .getHighResLoadingState().setVisible(true); } private void shiftAnimationDestinationForQuickscrub() { diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 1205bdc3b6..cbbd181e20 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -43,7 +43,6 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; -import android.os.UserHandle; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -78,13 +77,11 @@ import com.android.launcher3.util.Themes; import com.android.quickstep.OverviewCallbacks; import com.android.quickstep.QuickScrubController; import com.android.quickstep.RecentsModel; +import com.android.quickstep.TaskThumbnailCache; import com.android.quickstep.TaskUtils; import com.android.quickstep.util.ClipAnimationHelper; import com.android.quickstep.util.TaskViewDrawable; -import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan; -import com.android.systemui.shared.recents.model.RecentsTaskLoader; import com.android.systemui.shared.recents.model.Task; -import com.android.systemui.shared.recents.model.TaskStack; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.BackgroundExecutor; @@ -100,7 +97,8 @@ import androidx.annotation.Nullable; * A list of recent tasks. */ @TargetApi(Build.VERSION_CODES.P) -public abstract class RecentsView extends PagedView implements Insettable { +public abstract class RecentsView extends PagedView implements Insettable, + TaskThumbnailCache.HighResLoadingState.HighResLoadingStateChangedCallback { private static final String TAG = RecentsView.class.getSimpleName(); @@ -206,17 +204,13 @@ public abstract class RecentsView extends PagedView impl handler.post(() -> dismissTask(taskView, true /* animate */, false /* removeTask */)); } else { - RecentsTaskLoadPlan loadPlan = new RecentsTaskLoadPlan(getContext()); - RecentsTaskLoadPlan.PreloadOptions opts = - new RecentsTaskLoadPlan.PreloadOptions(); - opts.loadTitles = false; - loadPlan.preloadPlan(opts, mModel.getRecentsTaskLoader(), -1, - UserHandle.myUserId()); - if (loadPlan.getTaskStack().findTaskWithId(taskId) == null) { - // The task was removed from the recents list - handler.post(() -> - dismissTask(taskView, true /* animate */, false /* removeTask */)); - } + mModel.findTaskWithId(taskKey.id, (key) -> { + if (key == null) { + // The task was removed from the recents list + handler.post(() -> dismissTask(taskView, true /* animate */, + false /* removeTask */)); + } + }); } }); } @@ -229,9 +223,9 @@ public abstract class RecentsView extends PagedView impl } }; - // Used to keep track of the last requested load plan id, so that we do not request to load the + // Used to keep track of the last requested task list id, so that we do not request to load the // tasks again if we have already requested it and the task list has not changed - private int mRequestedLoadPlanId = -1; + private int mTaskListChangeId = -1; // Only valid until the launcher state changes to NORMAL private int mRunningTaskId = -1; @@ -285,7 +279,6 @@ public abstract class RecentsView extends PagedView impl mActivity = (T) BaseActivity.fromContext(context); mQuickScrubController = new QuickScrubController(mActivity, this); mModel = RecentsModel.INSTANCE.get(context); - mClearAllButton = (ClearAllButton) LayoutInflater.from(context) .inflate(R.layout.overview_clear_all_button, this, false); mClearAllButton.setOnClickListener(this::dismissAllTasks); @@ -316,7 +309,7 @@ public abstract class RecentsView extends PagedView impl public TaskView updateThumbnail(int taskId, ThumbnailData thumbnailData) { TaskView taskView = getTaskView(taskId); if (taskView != null) { - taskView.onTaskDataLoaded(taskView.getTask(), thumbnailData); + taskView.getThumbnail().setThumbnail(taskView.getTask(), thumbnailData); } return taskView; } @@ -331,6 +324,7 @@ public abstract class RecentsView extends PagedView impl protected void onAttachedToWindow() { super.onAttachedToWindow(); updateTaskStackListenerState(); + mModel.getThumbnailCache().getHighResLoadingState().addCallback(this); mActivity.addMultiWindowModeChangedListener(mMultiWindowModeChangedListener); ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener); } @@ -339,6 +333,7 @@ public abstract class RecentsView extends PagedView impl protected void onDetachedFromWindow() { super.onDetachedFromWindow(); updateTaskStackListenerState(); + mModel.getThumbnailCache().getHighResLoadingState().removeCallback(this); mActivity.removeMultiWindowModeChangedListener(mMultiWindowModeChangedListener); ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mTaskStackListener); } @@ -349,12 +344,11 @@ public abstract class RecentsView extends PagedView impl // Clear the task data for the removed child if it was visible if (child != mClearAllButton) { - Task task = ((TaskView) child).getTask(); + TaskView taskView = (TaskView) child; + Task task = taskView.getTask(); if (mHasVisibleTaskData.get(task.key.id)) { mHasVisibleTaskData.delete(task.key.id); - RecentsTaskLoader loader = mModel.getRecentsTaskLoader(); - loader.unloadTaskData(task); - loader.getHighResThumbnailLoader().onTaskInvisible(task); + taskView.onTaskListVisibilityChanged(false /* visible */); } } } @@ -444,14 +438,13 @@ public abstract class RecentsView extends PagedView impl return true; } - private void applyLoadPlan(RecentsTaskLoadPlan loadPlan) { + private void applyLoadPlan(ArrayList tasks) { if (mPendingAnimation != null) { - mPendingAnimation.addEndListener((onEndListener) -> applyLoadPlan(loadPlan)); + mPendingAnimation.addEndListener((onEndListener) -> applyLoadPlan(tasks)); return; } - TaskStack stack = loadPlan != null ? loadPlan.getTaskStack() : null; - if (stack == null) { + if (tasks == null || tasks.isEmpty()) { removeAllViews(); onTaskStackUpdated(); return; @@ -462,7 +455,6 @@ public abstract class RecentsView extends PagedView impl // Ensure there are as many views as there are tasks in the stack (adding and trimming as // necessary) final LayoutInflater inflater = LayoutInflater.from(getContext()); - final ArrayList tasks = new ArrayList<>(stack.getTasks()); // Unload existing visible task data unloadVisibleTaskData(); @@ -581,9 +573,8 @@ public abstract class RecentsView extends PagedView impl loadVisibleTaskData(); } - // Update the high res thumbnail loader - RecentsTaskLoader loader = mModel.getRecentsTaskLoader(); - loader.getHighResThumbnailLoader().setFlingingFast(isFlingingFast); + // Update the high res thumbnail loader state + mModel.getThumbnailCache().getHighResLoadingState().setFlingingFast(isFlingingFast); return scrolling; } @@ -618,13 +609,12 @@ public abstract class RecentsView extends PagedView impl * and unloads the associated task data for tasks that are no longer visible. */ public void loadVisibleTaskData() { - if (!mOverviewStateEnabled || mRequestedLoadPlanId == -1) { + if (!mOverviewStateEnabled || mTaskListChangeId == -1) { // Skip loading visible task data if we've already left the overview state, or if the // task list hasn't been loaded yet (the task views will not reflect the task list) return; } - RecentsTaskLoader loader = mModel.getRecentsTaskLoader(); int centerPageIndex = getPageNearestToCenterOfScreen(); int numChildren = getTaskViewCount(); int lower = Math.max(0, centerPageIndex - 2); @@ -641,14 +631,12 @@ public abstract class RecentsView extends PagedView impl continue; } if (!mHasVisibleTaskData.get(task.key.id)) { - loader.loadTaskData(task); - loader.getHighResThumbnailLoader().onTaskVisible(task); + taskView.onTaskListVisibilityChanged(true /* visible */); } mHasVisibleTaskData.put(task.key.id, visible); } else { if (mHasVisibleTaskData.get(task.key.id)) { - loader.unloadTaskData(task); - loader.getHighResThumbnailLoader().onTaskInvisible(task); + taskView.onTaskListVisibilityChanged(false /* visible */); } mHasVisibleTaskData.delete(task.key.id); } @@ -659,27 +647,40 @@ public abstract class RecentsView extends PagedView impl * Unloads any associated data from the currently visible tasks */ private void unloadVisibleTaskData() { - RecentsTaskLoader loader = mModel.getRecentsTaskLoader(); for (int i = 0; i < mHasVisibleTaskData.size(); i++) { if (mHasVisibleTaskData.valueAt(i)) { TaskView taskView = getTaskView(mHasVisibleTaskData.keyAt(i)); if (taskView != null) { - Task task = taskView.getTask(); - loader.unloadTaskData(task); - loader.getHighResThumbnailLoader().onTaskInvisible(task); + taskView.onTaskListVisibilityChanged(false /* visible */); } } } mHasVisibleTaskData.clear(); } + @Override + public void onHighResLoadingStateChanged(boolean enabled) { + // Whenever the high res loading state changes, poke each of the visible tasks to see if + // they want to updated their thumbnail state + for (int i = 0; i < mHasVisibleTaskData.size(); i++) { + if (mHasVisibleTaskData.valueAt(i)) { + TaskView taskView = getTaskView(mHasVisibleTaskData.keyAt(i)); + if (taskView != null) { + // Poke the view again, which will trigger it to load high res if the state + // is enabled + taskView.onTaskListVisibilityChanged(true /* visible */); + } + } + } + } + protected abstract void startHome(); public void reset() { mRunningTaskId = -1; mRunningTaskTileHidden = false; mIgnoreResetTaskId = -1; - mRequestedLoadPlanId = -1; + mTaskListChangeId = -1; unloadVisibleTaskData(); setCurrentPage(0); @@ -691,8 +692,8 @@ public abstract class RecentsView extends PagedView impl * Reloads the view if anything in recents changed. */ public void reloadIfNeeded() { - if (!mModel.isLoadPlanValid(mRequestedLoadPlanId)) { - mRequestedLoadPlanId = mModel.loadTasks(mRunningTaskId, this::applyLoadPlan); + if (!mModel.isTaskListValid(mTaskListChangeId)) { + mTaskListChangeId = mModel.getTasks(this::applyLoadPlan); } } @@ -753,8 +754,8 @@ public abstract class RecentsView extends PagedView impl setCurrentPage(0); - // Load the tasks - reloadIfNeeded(); + // Load the tasks (if the loading is already + mTaskListChangeId = mModel.getTasks(this::applyLoadPlan); } public void showNextTask() { diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 56074f0f55..da5b79a9df 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -17,7 +17,6 @@ package com.android.quickstep.views; import static android.widget.Toast.LENGTH_SHORT; - import static com.android.launcher3.BaseActivity.fromContext; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.LINEAR; @@ -30,6 +29,7 @@ import android.app.ActivityOptions; import android.content.Context; import android.content.res.Resources; import android.graphics.Outline; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.util.AttributeSet; @@ -47,14 +47,15 @@ import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; +import com.android.quickstep.RecentsModel; +import com.android.quickstep.TaskIconCache; import com.android.quickstep.TaskOverlayFactory; import com.android.quickstep.TaskSystemShortcut; +import com.android.quickstep.TaskThumbnailCache; import com.android.quickstep.TaskUtils; import com.android.quickstep.views.RecentsView.PageCallbacks; import com.android.quickstep.views.RecentsView.ScrollState; import com.android.systemui.shared.recents.model.Task; -import com.android.systemui.shared.recents.model.Task.TaskCallbacks; -import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityOptionsCompat; @@ -64,7 +65,7 @@ import java.util.function.Consumer; /** * A task in the Recents view. */ -public class TaskView extends FrameLayout implements TaskCallbacks, PageCallbacks { +public class TaskView extends FrameLayout implements PageCallbacks { private static final String TAG = TaskView.class.getSimpleName(); @@ -137,6 +138,10 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback private Animator mIconAndDimAnimator; private float mFocusTransitionProgress = 1; + // The current background requests to load the task thumbnail and icon + private TaskThumbnailCache.ThumbnailLoadRequest mThumbnailLoadRequest; + private TaskIconCache.IconLoadRequest mIconLoadRequest; + public TaskView(Context context) { this(context, null); } @@ -170,13 +175,8 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback * Updates this task view to the given {@param task}. */ public void bind(Task task) { - if (mTask != null) { - mTask.removeCallback(this); - } mTask = task; mSnapshotView.bind(); - task.addCallback(this); - setContentDescription(task.titleDescription); } public Task getTask() { @@ -233,15 +233,34 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback } } - @Override - public void onTaskDataLoaded(Task task, ThumbnailData thumbnailData) { - mSnapshotView.setThumbnail(task, thumbnailData); - mIconView.setDrawable(task.icon); - mIconView.setOnClickListener(icon -> showTaskMenu()); - mIconView.setOnLongClickListener(icon -> { - requestDisallowInterceptTouchEvent(true); - return showTaskMenu(); - }); + public void onTaskListVisibilityChanged(boolean visible) { + if (mTask == null) { + return; + } + if (visible) { + // These calls are no-ops if the data is already loaded, try and load the high + // resolution thumbnail if the state permits + RecentsModel model = RecentsModel.INSTANCE.get(getContext()); + TaskThumbnailCache thumbnailCache = model.getThumbnailCache(); + TaskIconCache iconCache = model.getIconCache(); + mThumbnailLoadRequest = thumbnailCache.updateThumbnailInBackground(mTask, + !thumbnailCache.getHighResLoadingState().isEnabled() /* reducedResolution */, + (task) -> mSnapshotView.setThumbnail(task, task.thumbnail)); + mIconLoadRequest = iconCache.updateIconInBackground(mTask, + (task) -> { + setContentDescription(task.titleDescription); + setIcon(task.icon); + }); + } else { + if (mThumbnailLoadRequest != null) { + mThumbnailLoadRequest.cancel(); + } + if (mIconLoadRequest != null) { + mIconLoadRequest.cancel(); + } + mSnapshotView.setThumbnail(null, null); + setIcon(null); + } } private boolean showTaskMenu() { @@ -253,16 +272,18 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback return mMenuView != null; } - @Override - public void onTaskDataUnloaded() { - mSnapshotView.setThumbnail(null, null); - mIconView.setDrawable(null); - mIconView.setOnLongClickListener(null); - } - - @Override - public void onTaskWindowingModeChanged() { - // Do nothing + private void setIcon(Drawable icon) { + if (icon != null) { + mIconView.setDrawable(icon); + mIconView.setOnClickListener(v -> showTaskMenu()); + mIconView.setOnLongClickListener(v -> { + requestDisallowInterceptTouchEvent(true); + return showTaskMenu(); + }); + } else { + mIconView.setDrawable(null); + mIconView.setOnLongClickListener(null); + } } private void setIconAndDimTransitionProgress(float progress) { diff --git a/res/values/config.xml b/res/values/config.xml index 85c2e65c51..946afecf85 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -132,6 +132,4 @@ - 6 - 12 diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index e714a0bf8d..3ae9a49e70 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -768,7 +768,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } mAppWidgetHost.setListenIfResumed(true); NotificationListener.setNotificationsChangedListener(mPopupDataProvider); - UiFactory.onStart(this); } private void logOnDelayedResume() { diff --git a/src/com/android/launcher3/icons/HandlerRunnable.java b/src/com/android/launcher3/icons/HandlerRunnable.java new file mode 100644 index 0000000000..e7132cd694 --- /dev/null +++ b/src/com/android/launcher3/icons/HandlerRunnable.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.icons; + +import android.os.Handler; + +/** + * A runnable that can be posted to a {@link Handler} which can be canceled. + */ +public abstract class HandlerRunnable implements Runnable { + + private final Handler mHandler; + private final Runnable mEndRunnable; + + private boolean mEnded = false; + private boolean mCanceled = false; + + public HandlerRunnable(Handler handler, Runnable endRunnable) { + mHandler = handler; + mEndRunnable = endRunnable; + } + + /** + * Cancels this runnable from being run, only if it has not already run. + */ + public void cancel() { + mHandler.removeCallbacks(this); + // TODO: This can actually cause onEnd to be called twice if the handler is already running + // this runnable + // NOTE: This is currently run on whichever thread the caller is run on. + mCanceled = true; + onEnd(); + } + + /** + * @return whether this runnable was canceled. + */ + protected boolean isCanceled() { + return mCanceled; + } + + /** + * To be called by the implemention of this runnable. The end callback is done on whichever + * thread the caller is calling from. + */ + public void onEnd() { + if (!mEnded) { + mEnded = true; + if (mEndRunnable != null) { + mEndRunnable.run(); + } + } + } +} diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java index 41a53e572f..6e2ca28ec6 100644 --- a/src/com/android/launcher3/icons/IconCache.java +++ b/src/com/android/launcher3/icons/IconCache.java @@ -169,27 +169,9 @@ public class IconCache extends BaseIconCache { applyCacheEntry(entry, infoInOut); } - public static abstract class IconLoadRequest implements Runnable { - private final Handler mHandler; - private final Runnable mEndRunnable; - - private boolean mEnded = false; - + public static abstract class IconLoadRequest extends HandlerRunnable { IconLoadRequest(Handler handler, Runnable endRunnable) { - mHandler = handler; - mEndRunnable = endRunnable; - } - - public void cancel() { - mHandler.removeCallbacks(this); - onEnd(); - } - - public void onEnd() { - if (!mEnded) { - mEnded = true; - mEndRunnable.run(); - } + super(handler, endRunnable); } } -- GitLab From fd61e04424bfe06adb359a5f538f6e1fe353a3d0 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 19 Oct 2018 10:47:01 -0700 Subject: [PATCH 0222/1301] Updating shared lib Bug: 117603579 Change-Id: Ie4fbb962bc1ae3d13bfa7778aa505e1ad7ea8853 --- quickstep/libs/sysui_shared.jar | Bin 1576098 -> 185589 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index c5a7c051e93596a88ec43013c0cda6bc8738a320..f932a6b551d02de1e2b443ad7784c078d166b352 100644 GIT binary patch delta 40217 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

`_oK;#!ceEigWAFdX6fJ2e$Q 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

-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 hL#Yl1-7+V0@m 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


RpvKE?1+FI$qAA-olfLsIthapz(p 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

s`7_qmkz&DF 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 -- GitLab From ad6fd393f8bf20de9e12f7addad89ce214ac1e38 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 23 Oct 2018 14:51:12 -0700 Subject: [PATCH 0223/1301] Don't assume there will be a running task - During tests, if apps and launcher are killed, then there may be no running task Change-Id: Iaef1c4ad0b31cec3c8da7d868e3e7b49d3b09faa --- .../com/android/quickstep/OverviewCommandHelper.java | 2 +- .../src/com/android/quickstep/RecentsModel.java | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index 5b488ca6db..f8f09055f0 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -227,7 +227,7 @@ public class OverviewCommandHelper { public RecentsActivityCommand() { mHelper = getActivityControlHelper(); mCreateTime = SystemClock.elapsedRealtime(); - mRunningTaskId = mAM.getRunningTask().id; + mRunningTaskId = RecentsModel.getRunningTaskId(); // Preload the plan mRecentsModel.getTasks(null); diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index a9ce5ccf26..e184a9bb18 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -18,6 +18,7 @@ package com.android.quickstep; import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId; import android.annotation.TargetApi; +import android.app.ActivityManager; import android.content.ComponentCallbacks2; import android.content.Context; import android.os.Build; @@ -94,6 +95,15 @@ public class RecentsModel extends TaskStackChangeListener { return mTaskList.getTasks(-1, false /* loadKeysOnly */, callback); } + /** + * @return The task id of the running task, or -1 if there is no current running task. + */ + public static int getRunningTaskId() { + ActivityManager.RunningTaskInfo runningTask = + ActivityManagerWrapper.getInstance().getRunningTask(); + return runningTask != null ? runningTask.id : -1; + } + /** * @return Whether the provided {@param changeId} is the latest recent tasks list id. */ @@ -134,7 +144,7 @@ public class RecentsModel extends TaskStackChangeListener { // Keep the cache up to date with the latest thumbnails mTaskList.getTasks(mThumbnailCache.getCacheSize(), true /* keysOnly */, (tasks) -> { - int runningTaskId = ActivityManagerWrapper.getInstance().getRunningTask().id; + int runningTaskId = RecentsModel.getRunningTaskId(); for (Task task : tasks) { if (task.key.id == runningTaskId) { // Skip the running task, it's not going to have an up-to-date snapshot by the -- GitLab From 0d9275deba38a5f650b2323513bbdd5a5a823055 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 23 Oct 2018 15:42:41 -0700 Subject: [PATCH 0224/1301] Updating shared lib from package & class rename. Change-Id: If3003c6e454ea60f30372f985fa7f34c9b6ed46d --- quickstep/libs/sysui_shared.jar | Bin 185589 -> 185554 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index f932a6b551d02de1e2b443ad7784c078d166b352..6f3fa4be552bd57055bc12ca8b5d80dce8b08dd6 100644 GIT binary patch delta 7957 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 F^?z6sPpkj{ delta 8138 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

=*)QSsMvO+K-C|MvMC|Q6mBe=5;r5 z*q=UoDV41oVSR8t1ChLOSKSQ*_qKp|-l#_1M=wo@-g$a{Q_~iGr97w8?0lOw?iph5vYFv`naVeSrEca( zG7X5t>Tx=mi-t8!29ktXqmNwg1!`rWd z>~-vAORE(vRYa^Tt%6=_N;;v)?#Mrc$)2GUCI*=GvGaxXMZq4Ni+>#Pm+;7FVn2IS z+R`0ExHfdncG@`5Vq>@4Br9@lWuv9BvzgER@>(LUuaO?xK=tBrkz=lUl6oEExhmF= zhb`t6WBXX}9|s4#`UA(=r*i%22Vb_&!!$8Z-(BXuwW8#-C0;jV*Kz!+o)OS}I9=zhSNHtR;JXfPH@J z_YL!N-vU=FO9fp5|u)lXZ>(!SA?l2yx#I1t^1^9JaYsI4aRq}N4A#3 zOqw{ROJ#vx2im?-yuac)FB!tF$a*j)zmyqPd>Gcui9EpN7q%-wJ8Fm8hVofN(}xGG zcdl3Tce-N#!p1)2esw>HjT-_=m^b%{8V(ge>E0pqjBJ;vvuB zjuY`+AAY3X*T8DDeussts+**s>}eE?g`#dok7a<)&Vh}WNf8%%9<(tpoEEsLrci9S zso&QU!6}f)FeGKu5W!ifWNl`j!f92<99A*^&9b}wlg(AJ%BE4BZs7)~-NR{8a=7$~ zIwQSRJR6pHRqTpXdZ+P}uNwA&eYjvL-ClTiMjxoIGl}MWTN$xkghe{Tvhw=yF5{w~ z<3bosSv$W@-7-nZmjSLiif!)94!79t`LV{gAQ4UBwybll6;Z4(ReEW zNq}1R)<6UCD*+6!qypdrzCQRjRtC%!{!P%qluCdX@KpT^UsVDUz%%U|f_R`HgOA?> zvcQGj4Y^kZV1fyw02z4k9#My@;Vo7LAjY=_2G~`F$b95LJYFhA@+qm;+7DB33Z4vjnZxiZ#{ql?$;rra{iy7f`e(0yEg~u{sGZ*`|De8 zT5#e6APfZM-4a89^k00Pq?8FScz( zBoUbSFLs_lH2A3%kx6L!Z*3Yv3O;N@;IO&BaOE5VH~hhlpZ>y#o^V0Bc7PYs3~IFl z&Vb&@tx5%6A_PG6;+CL;rWX)0@O2krvV1!br~B*2jrPwT(p^HxLBlkJw*E&W`}LP5 z{tH3@()@{2?L=sF*S8uSXnGAn2j6ufN@GI&Tki#!!Rt;y8OTSzF%G%_a&QG1@r78I z9Uw=)#ioE0#;rjPMt1{JKs)9wAp=o+5cNkA-Vn1MKpuEcd}9ps01tpN(i>xp6fvPH zy@=#6@*9%b3*3irgR8xOCs083hlzo)eSi$WO7q7M1A7go7Q|za7ZI>~2Kx!XK@U`$jt$ zLfn;Ce26cxL4Y3^;QKcw`Ll)iVDBJs7jg=&4FVoOn#f-+Ln4S3Uk@RgWEQ{0DuA8D zt$_!oN&tj6WhV|JR>rz_qjBFu?9caML@2V{Ex`j-Mi9HZDSt!I6aeCz(B2V51s}k* z5x@aZR=!bRsR4B0<}e~n@hBp(v)U~d0IA0iiRCnJ2`v~ihDeOBe?v6K0c7y&7~-j_ zZ+J@-0d=!mgAAM=M-0xm-CqRL9&rE`9}$^}VSizD7-H7P{@`Md8%#F=C;$UbZj9d( z02Y`!fjH+-?^_}PFg?35EG7X~s@qo^8WPeyq`yCzaFAdM5C@kg0e*-Eh(8550v8c~ V7zaodiP)azDF7dJA^|`I{SU>H%BBDS -- GitLab From d7d692c2f9ee6081f5d586c582ddd1c344ff9e39 Mon Sep 17 00:00:00 2001 From: Brett Chabot Date: Tue, 23 Oct 2018 21:17:58 -0700 Subject: [PATCH 0225/1301] Replace use of deprecated target androidx-test Test: make Launcher3Tests Change-Id: Ib14fd9da1df3c022d39efb69660ff59b8a47db5d --- Android.bp | 3 ++- tests/Android.mk | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Android.bp b/Android.bp index 4b327020c3..e3dd5e56ad 100644 --- a/Android.bp +++ b/Android.bp @@ -16,7 +16,8 @@ java_library_static { name: "launcher-aosp-tapl", static_libs: [ "androidx.annotation_annotation", - "androidx-test", + "androidx.test.runner", + "androidx.test.rules", "androidx.test.uiautomator_uiautomator", "SystemUISharedLib", ], diff --git a/tests/Android.mk b/tests/Android.mk index d808873d11..a787537542 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -21,7 +21,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_STATIC_JAVA_LIBRARIES := \ androidx.annotation_annotation \ - androidx-test \ + androidx.test.runner \ + androidx.test.rules \ androidx.test.uiautomator_uiautomator \ libSharedSystemUI @@ -42,7 +43,8 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_STATIC_JAVA_LIBRARIES := \ - androidx-test \ + androidx.test.runner \ + androidx.test.rules \ androidx.test.uiautomator_uiautomator \ mockito-target-minus-junit4 -- GitLab From 0638949fe93317c207c0ed51da65b30274721413 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Tue, 23 Oct 2018 16:00:37 -0700 Subject: [PATCH 0226/1301] Increase the touch slop for noti shade pull down. Bug: 116879058 Change-Id: I3ff0491292e5238cd74bb6d97c0ab79711ad3af1 --- .../launcher3/uioverrides/StatusBarTouchController.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/StatusBarTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/StatusBarTouchController.java index 35f46cfc7f..8f33e40239 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/StatusBarTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/StatusBarTouchController.java @@ -51,7 +51,8 @@ public class StatusBarTouchController implements TouchController { public StatusBarTouchController(Launcher l) { mLauncher = l; - mTouchSlop = ViewConfiguration.get(l).getScaledTouchSlop(); + // Guard against TAPs by increasing the touch slop. + mTouchSlop = 2 * ViewConfiguration.get(l).getScaledTouchSlop(); mTranslator = new TouchEventTranslator((MotionEvent ev)-> dispatchTouchEvent(ev)); } @@ -90,6 +91,9 @@ public class StatusBarTouchController implements TouchController { mTranslator.processMotionEvent(ev); return true; } + if (Math.abs(dx) > mTouchSlop) { + mCanIntercept = false; + } } return false; } -- GitLab From 3514a2231394bf6d9bf22ee8ee7db25be87bb3e7 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 3 Oct 2018 16:34:41 -0700 Subject: [PATCH 0227/1301] Adding code to open DWP settings of a recent task Will transition to an API for opening settings if this CL lands: ag/5338673. Bug: 118319143 Test: manual test on a prototype Change-Id: Ia40576e0cd6196bfb0a0e8657916bbadff4c0b59 --- protos/launcher_log.proto | 1 + quickstep/res/values/strings.xml | 3 ++ .../com/android/quickstep/views/TaskView.java | 44 ++++++++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/protos/launcher_log.proto b/protos/launcher_log.proto index b3ed365b88..4129ae8ad9 100644 --- a/protos/launcher_log.proto +++ b/protos/launcher_log.proto @@ -113,6 +113,7 @@ enum ControlType { TASK_PREVIEW = 15; SPLIT_SCREEN_TARGET = 16; REMOTE_ACTION_SHORTCUT = 17; + APP_USAGE_SETTINGS = 18; } enum TipType { diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml index a76899d3da..c712703cba 100644 --- a/quickstep/res/values/strings.xml +++ b/quickstep/res/values/strings.xml @@ -36,6 +36,9 @@ Close + + App usage settings + Clear all diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index da5b79a9df..2a4226faa2 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -17,6 +17,7 @@ package com.android.quickstep.views; import static android.widget.Toast.LENGTH_SHORT; + import static com.android.launcher3.BaseActivity.fromContext; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.LINEAR; @@ -26,7 +27,9 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.app.ActivityOptions; +import android.content.ActivityNotFoundException; import android.content.Context; +import android.content.Intent; import android.content.res.Resources; import android.graphics.Outline; import android.graphics.drawable.Drawable; @@ -43,8 +46,10 @@ import android.widget.FrameLayout; import android.widget.Toast; import com.android.launcher3.BaseDraggingActivity; +import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.quickstep.RecentsModel; @@ -100,7 +105,7 @@ public class TaskView extends FrameLayout implements PageCallbacks { } }; - private static FloatProperty FOCUS_TRANSITION = + private static final FloatProperty FOCUS_TRANSITION = new FloatProperty("focusTransition") { @Override public void setValue(TaskView taskView, float v) { @@ -113,6 +118,9 @@ public class TaskView extends FrameLayout implements PageCallbacks { } }; + static final Intent SEE_TIME_IN_APP_TEMPLATE = + new Intent("com.android.settings.action.TIME_SPENT_IN_APP"); + private final OnAttachStateChangeListener mTaskMenuStateListener = new OnAttachStateChangeListener() { @Override @@ -142,6 +150,8 @@ public class TaskView extends FrameLayout implements PageCallbacks { private TaskThumbnailCache.ThumbnailLoadRequest mThumbnailLoadRequest; private TaskIconCache.IconLoadRequest mIconLoadRequest; + private long mAppRemainingTimeMs = -1; + public TaskView(Context context) { this(context, null); } @@ -195,6 +205,10 @@ public class TaskView extends FrameLayout implements PageCallbacks { return mSnapshotView.getTaskOverlay(); } + private boolean hasRemainingTime() { + return mAppRemainingTimeMs > 0; + } + public void launchTask(boolean animate) { launchTask(animate, (result) -> { if (!result) { @@ -421,6 +435,13 @@ public class TaskView extends FrameLayout implements PageCallbacks { } } + if (hasRemainingTime()) { + info.addAction( + new AccessibilityNodeInfo.AccessibilityAction( + R.string.accessibility_app_usage_settings, + getContext().getText(R.string.accessibility_app_usage_settings))); + } + final RecentsView recentsView = getRecentsView(); final AccessibilityNodeInfo.CollectionItemInfo itemInfo = AccessibilityNodeInfo.CollectionItemInfo.obtain( @@ -437,6 +458,11 @@ public class TaskView extends FrameLayout implements PageCallbacks { return true; } + if (action == R.string.accessibility_app_usage_settings) { + openAppUsageSettings(); + return true; + } + final List shortcuts = mSnapshotView.getTaskOverlay().getEnabledShortcuts(this); final int count = shortcuts.size(); @@ -455,6 +481,22 @@ public class TaskView extends FrameLayout implements PageCallbacks { return super.performAccessibilityAction(action, arguments); } + private void openAppUsageSettings() { + final Intent intent = new Intent(SEE_TIME_IN_APP_TEMPLATE) + .putExtra(Intent.EXTRA_PACKAGE_NAME, + mTask.getTopComponent().getPackageName()).addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + try { + final Launcher launcher = Launcher.getLauncher(getContext()); + launcher.startActivity(intent); + launcher.getUserEventDispatcher().logActionOnControl(LauncherLogProto.Action.Touch.TAP, + LauncherLogProto.ControlType.APP_USAGE_SETTINGS, this); + } catch (ActivityNotFoundException e) { + Log.e(TAG, "Failed to open app usage settings for task " + + mTask.getTopComponent().getPackageName(), e); + } + } + private RecentsView getRecentsView() { return (RecentsView) getParent(); } -- GitLab From d43e7c2fd40ed58edafa874bfae732a2edbca823 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Tue, 16 Oct 2018 14:49:55 -0700 Subject: [PATCH 0228/1301] Support Live Tile in Quickstep (Pt1) - Z ordering - Place Launcher above app surface. - Use LauncherLayoutListener to clear the area where the current task is in order to punch a hole and reveal the app view underneath Bug: 111697218 Test: Manual test Change-Id: I4d4e0f1113a8e60566257c030ae9b591789eb3b3 --- .../launcher3/uioverrides/AllAppsState.java | 3 +- .../launcher3/uioverrides/OverviewState.java | 3 +- .../quickstep/ActivityControlHelper.java | 6 +++ .../WindowTransformSwipeHandler.java | 7 +++- .../quickstep/util/ClipAnimationHelper.java | 29 ++++++++------ .../views/LauncherLayoutListener.java | 38 +++++++++++++++---- .../launcher3/AbstractFloatingView.java | 11 ++++++ 7 files changed, 75 insertions(+), 22 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java b/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java index 1eaa8bc92c..1906286030 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.uioverrides; +import static com.android.launcher3.AbstractFloatingView.TYPE_QUICKSTEP_PREVIEW; import static com.android.launcher3.LauncherAnimUtils.ALL_APPS_TRANSITION_MS; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; @@ -44,7 +45,7 @@ public class AllAppsState extends LauncherState { @Override public void onStateEnabled(Launcher launcher) { - AbstractFloatingView.closeAllOpenViews(launcher); + AbstractFloatingView.closeAllOpenViewsExcept(launcher, TYPE_QUICKSTEP_PREVIEW); dispatchWindowStateChanged(launcher); } diff --git a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java index 0d77bca58b..8f1d46c8d5 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.uioverrides; +import static com.android.launcher3.AbstractFloatingView.TYPE_QUICKSTEP_PREVIEW; import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; import static com.android.launcher3.states.RotationHelper.REQUEST_ROTATE; @@ -74,7 +75,7 @@ public class OverviewState extends LauncherState { public void onStateEnabled(Launcher launcher) { RecentsView rv = launcher.getOverviewPanel(); rv.setOverviewStateEnabled(true); - AbstractFloatingView.closeAllOpenViews(launcher); + AbstractFloatingView.closeAllOpenViewsExcept(launcher, TYPE_QUICKSTEP_PREVIEW); } @Override diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 2331a4e302..c809e28320 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -40,6 +40,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.Rect; +import android.graphics.RectF; import android.os.Build; import android.os.Handler; import android.os.Looper; @@ -537,6 +538,9 @@ public interface ActivityControlHelper { @Override public void finish() { } + + @Override + public void update(boolean shouldFinish, boolean isLongSwipe, RectF currentRect) { } }; } @@ -613,6 +617,8 @@ public interface ActivityControlHelper { void setHandler(WindowTransformSwipeHandler handler); void finish(); + + void update(boolean shouldFinish, boolean isLongSwipe, RectF currentRect); } interface ActivityInitListener { diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 6908b89783..9ea88842d7 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -597,6 +597,11 @@ public class WindowTransformSwipeHandler { } private void updateFinalShiftUi() { + if (mRecentsAnimationWrapper.getController() != null && mLayoutListener != null) { + mLayoutListener.update(mCurrentShift.value > 1, mUiLongSwipeMode, + mClipAnimationHelper.getCurrentRectWithInsets()); + } + final boolean passed = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW; if (passed != mPassedOverviewThreshold) { mPassedOverviewThreshold = passed; @@ -874,7 +879,6 @@ public class WindowTransformSwipeHandler { mLayoutListener.finish(); mActivityControlHelper.getAlphaProperty(mActivity).setValue(1); - mRecentsView.setRunningTaskHidden(false); mRecentsView.setRunningTaskIconScaledDown(false); mQuickScrubController.cancelActiveQuickscrub(); } @@ -895,6 +899,7 @@ public class WindowTransformSwipeHandler { if (mWasLauncherAlreadyVisible && mLauncherTransitionController != null) { mLauncherTransitionController.setPlayFraction(1); } + mRecentsView.setRunningTaskHidden(false); } private void switchToScreenshot() { diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index 8c84f29b7d..57a0e8f8f7 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -77,10 +77,11 @@ public class ClipAnimationHelper { public final Rect mHomeStackBounds = new Rect(); // The clip rect in source app window coordinates - private final Rect mClipRect = new Rect(); + private final RectF mClipRectF = new RectF(); private final RectFEvaluator mRectFEvaluator = new RectFEvaluator(); private final Matrix mTmpMatrix = new Matrix(); private final RectF mTmpRectF = new RectF(); + private final RectF mCurrentRectWithInsets = new RectF(); private float mTargetScale = 1f; private float mOffsetScale = 1f; @@ -153,12 +154,12 @@ public class ClipAnimationHelper { mTargetOffset.y * offsetYProgress); } - mClipRect.left = (int) (mSourceWindowClipInsets.left * progress); - mClipRect.top = (int) (mSourceWindowClipInsets.top * progress); - mClipRect.right = (int) - (mSourceStackBounds.width() - (mSourceWindowClipInsets.right * progress)); - mClipRect.bottom = (int) - (mSourceStackBounds.height() - (mSourceWindowClipInsets.bottom * progress)); + mClipRectF.left = mSourceWindowClipInsets.left * progress; + mClipRectF.top = mSourceWindowClipInsets.top * progress; + mClipRectF.right = + mSourceStackBounds.width() - (mSourceWindowClipInsets.right * progress); + mClipRectF.bottom = + mSourceStackBounds.height() - (mSourceWindowClipInsets.bottom * progress); SurfaceParams[] params = new SurfaceParams[targetSet.unfilteredApps.length]; for (int i = 0; i < targetSet.unfilteredApps.length; i++) { @@ -166,11 +167,12 @@ public class ClipAnimationHelper { mTmpMatrix.setTranslate(app.position.x, app.position.y); Rect crop = app.sourceContainerBounds; float alpha = 1f; + int layer; if (app.mode == targetSet.targetMode) { if (app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { mTmpMatrix.setRectToRect(mSourceRect, currentRect, ScaleToFit.FILL); mTmpMatrix.postTranslate(app.position.x, app.position.y); - crop = mClipRect; + mClipRectF.roundOut(crop); } if (app.isNotInRecents @@ -179,17 +181,22 @@ public class ClipAnimationHelper { } alpha = mTaskAlphaCallback.apply(app, alpha); + layer = RemoteAnimationProvider.getLayer(app, mBoostModeTargetLayers); } else { crop = null; + layer = Integer.MAX_VALUE; } - - params[i] = new SurfaceParams(app.leash, alpha, mTmpMatrix, crop, - RemoteAnimationProvider.getLayer(app, mBoostModeTargetLayers)); + params[i] = new SurfaceParams(app.leash, alpha, mTmpMatrix, crop, layer); } applyParams(syncTransactionApplier, params); return currentRect; } + public RectF getCurrentRectWithInsets() { + mTmpMatrix.mapRect(mCurrentRectWithInsets, mClipRectF); + return mCurrentRectWithInsets; + } + private void applyParams(@Nullable SyncRtSurfaceTransactionApplier syncTransactionApplier, SurfaceParams[] params) { if (syncTransactionApplier != null) { diff --git a/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java b/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java index 61740d729b..c12a579686 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java +++ b/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java @@ -15,11 +15,17 @@ */ package com.android.quickstep.views; -import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static com.android.launcher3.states.RotationHelper.REQUEST_NONE; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; import android.graphics.Rect; +import android.graphics.RectF; import android.view.MotionEvent; +import android.widget.FrameLayout; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Insettable; @@ -34,12 +40,28 @@ public class LauncherLayoutListener extends AbstractFloatingView implements Insettable, LayoutListener { private final Launcher mLauncher; + private final Paint mPaint = new Paint(); private WindowTransformSwipeHandler mHandler; + private RectF mCurrentRect; public LauncherLayoutListener(Launcher launcher) { super(launcher, null); mLauncher = launcher; - setVisibility(INVISIBLE); + mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + setLayoutParams(new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)); + } + + @Override + public void update(boolean shouldFinish, boolean isLongSwipe, RectF currentRect) { + if (shouldFinish) { + finish(); + return; + } + + mCurrentRect = currentRect; + + setWillNotDraw(mCurrentRect == null || isLongSwipe); + invalidate(); } @Override @@ -80,11 +102,6 @@ public class LauncherLayoutListener extends AbstractFloatingView } } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - setMeasuredDimension(1, 1); - } - @Override public void logActionCommand(int command) { // We should probably log the weather @@ -97,8 +114,13 @@ public class LauncherLayoutListener extends AbstractFloatingView @Override public void finish() { - setHandler(null); close(false); + setHandler(null); mLauncher.getRotationHelper().setStateHandlerRequest(REQUEST_NONE); } + + @Override + protected void onDraw(Canvas canvas) { + canvas.drawRect(mCurrentRect, mPaint); + } } diff --git a/src/com/android/launcher3/AbstractFloatingView.java b/src/com/android/launcher3/AbstractFloatingView.java index 45751328a8..7cab18d8d3 100644 --- a/src/com/android/launcher3/AbstractFloatingView.java +++ b/src/com/android/launcher3/AbstractFloatingView.java @@ -219,6 +219,17 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch closeAllOpenViews(activity, true); } + public static void closeAllOpenViewsExcept(ActivityContext activity, boolean animate, + @FloatingViewType int type) { + closeOpenViews(activity, animate, TYPE_ALL & ~type); + activity.finishAutoCancelActionMode(); + } + + public static void closeAllOpenViewsExcept(ActivityContext activity, + @FloatingViewType int type) { + closeAllOpenViewsExcept(activity, true, type); + } + public static AbstractFloatingView getTopOpenView(ActivityContext activity) { return getTopOpenViewWithType(activity, TYPE_ALL); } -- GitLab From eaa010a13061dde8dbefe3bd52cb201a8a7a355e Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Wed, 24 Oct 2018 16:35:51 -0700 Subject: [PATCH 0229/1301] Update gradle version and buildToolsVersion in Launcher3 build.gradle file. Test: Gradle build of Launcher3 completed successully in Android Studio 3.2.1 Change-Id: If53639985613cde15a125b58e2c527ff864277ea --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index b59f264c83..1b9df53d6a 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.0-rc03' + classpath 'com.android.tools.build:gradle:3.2.1' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6' } } @@ -16,7 +16,7 @@ apply plugin: 'com.google.protobuf' android { compileSdkVersion 28 - buildToolsVersion '28.0.2' + buildToolsVersion '28.0.3' defaultConfig { minSdkVersion 21 -- GitLab From 934a1cb6f4a01bea9ac0073413e629395b4f1acb Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 25 Oct 2018 06:26:36 -0700 Subject: [PATCH 0230/1301] Import translations. DO NOT MERGE Change-Id: I598aeef629ca1a842172b6108c64f29aadb9f06a Auto-generated-cl: translation import --- quickstep/res/values-af/strings.xml | 2 ++ quickstep/res/values-ar/strings.xml | 1 + quickstep/res/values-az/strings.xml | 2 ++ quickstep/res/values-bs/strings.xml | 1 + quickstep/res/values-cs/strings.xml | 2 ++ quickstep/res/values-da/strings.xml | 4 +++- quickstep/res/values-de/strings.xml | 4 +++- quickstep/res/values-el/strings.xml | 1 + quickstep/res/values-en-rAU/strings.xml | 2 ++ quickstep/res/values-en-rGB/strings.xml | 2 ++ quickstep/res/values-en-rIN/strings.xml | 2 ++ quickstep/res/values-eu/strings.xml | 2 ++ quickstep/res/values-fa/strings.xml | 2 ++ quickstep/res/values-hr/strings.xml | 1 + quickstep/res/values-in/strings.xml | 2 ++ quickstep/res/values-it/strings.xml | 1 + quickstep/res/values-iw/strings.xml | 2 ++ quickstep/res/values-ka/strings.xml | 2 ++ quickstep/res/values-kn/strings.xml | 2 ++ quickstep/res/values-mr/strings.xml | 2 ++ quickstep/res/values-my/strings.xml | 2 ++ quickstep/res/values-sk/strings.xml | 2 ++ quickstep/res/values-sq/strings.xml | 2 ++ quickstep/res/values-uz/strings.xml | 2 ++ quickstep/res/values-zu/strings.xml | 2 ++ res/values-af/strings.xml | 1 + res/values-ar/strings.xml | 1 + res/values-az/strings.xml | 1 + res/values-bs/strings.xml | 1 + res/values-cs/strings.xml | 1 + res/values-da/strings.xml | 2 ++ res/values-de/strings.xml | 2 ++ res/values-el/strings.xml | 1 + res/values-en-rAU/strings.xml | 1 + res/values-en-rGB/strings.xml | 1 + res/values-en-rIN/strings.xml | 1 + res/values-eu/strings.xml | 1 + res/values-fa/strings.xml | 1 + res/values-hr/strings.xml | 1 + res/values-in/strings.xml | 1 + res/values-it/strings.xml | 1 + res/values-iw/strings.xml | 6 ++++-- res/values-ka/strings.xml | 1 + res/values-kn/strings.xml | 1 + res/values-mr/strings.xml | 2 ++ res/values-my/strings.xml | 1 + res/values-sk/strings.xml | 1 + res/values-sq/strings.xml | 1 + res/values-uz/strings.xml | 1 + res/values-zu/strings.xml | 1 + 50 files changed, 78 insertions(+), 4 deletions(-) diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index 8ae493fb6e..f9432ad512 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -24,6 +24,8 @@ "Oorsig" "Geen onlangse items nie" "Maak toe" + + "Vee alles uit" "Onlangse programme" diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index c04b618699..c203a4fd55 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -24,6 +24,7 @@ "نظرة عامة" "ليست هناك عناصر تم استخدامها مؤخرًا" "إغلاق" + "إعدادات استخدام التطبيق" "محو الكل" "التطبيقات التي تمّ استخدامها مؤخرًا" diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml index 832ed8c5f6..57ad30d30f 100644 --- a/quickstep/res/values-az/strings.xml +++ b/quickstep/res/values-az/strings.xml @@ -24,6 +24,8 @@ "İcmal" "Son elementlər yoxdur" "Bağlayın" + + "Hamısını silin" "Son tətbiqlər" diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index 6bf38eba15..3228de07f6 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -24,6 +24,7 @@ "Pregled" "Nema nedavnih stavki" "Zatvaranje" + "Postavke upotrebe aplikacija" "Obriši sve" "Nedavne aplikacije" diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml index a178df08b4..ec5095c737 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -24,6 +24,8 @@ "Přehled" "Žádné nedávné položky" "Zavřít" + + "Vymazat vše" "Poslední aplikace" diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index d0d629f5a1..13eb0cd9af 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -19,11 +19,13 @@ - "Delt skærm" + "Opdel skærm" "Fastgør" "Oversigt" "Ingen nye elementer" "Luk" + + "Ryd alt" "Seneste apps" diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index aee8b85b8c..2f50639a52 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -19,11 +19,13 @@ - "Bildschirm teilen" + "Splitscreen (Duden compliant spelling, sorry!) Splitscreenmodus (or spelling variations thereof) Splitscreen öffnen" "Fixieren" "Übersicht" "Keine kürzlich verwendeten Elemente" "Schließen" + + "Alle Apps schließen" "Zuletzt aktive Apps" diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index 7364b82823..7c116812d6 100644 --- a/quickstep/res/values-el/strings.xml +++ b/quickstep/res/values-el/strings.xml @@ -24,6 +24,7 @@ "Επισκόπηση" "Δεν υπάρχουν πρόσφατα στοιχεία" "Κλείσιμο" + "Ρυθμίσεις χρήσης εφαρμογής" "Διαγραφή όλων" "Πρόσφατες εφαρμογές" diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml index d0dc1e8cb8..e6cb731c1e 100644 --- a/quickstep/res/values-en-rAU/strings.xml +++ b/quickstep/res/values-en-rAU/strings.xml @@ -24,6 +24,8 @@ "Overview" "No recent items" "Close" + + "Clear all" "Recent apps" diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml index d0dc1e8cb8..e6cb731c1e 100644 --- a/quickstep/res/values-en-rGB/strings.xml +++ b/quickstep/res/values-en-rGB/strings.xml @@ -24,6 +24,8 @@ "Overview" "No recent items" "Close" + + "Clear all" "Recent apps" diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml index d0dc1e8cb8..e6cb731c1e 100644 --- a/quickstep/res/values-en-rIN/strings.xml +++ b/quickstep/res/values-en-rIN/strings.xml @@ -24,6 +24,8 @@ "Overview" "No recent items" "Close" + + "Clear all" "Recent apps" diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index 60943ccc4f..c54071f0c5 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -24,6 +24,8 @@ "Ikuspegi orokorra" "Ez dago azkenaldi honetako ezer" "Itxi" + + "Garbitu guztiak" "Azken aplikazioak" diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml index 4a30daa30c..976d656092 100644 --- a/quickstep/res/values-fa/strings.xml +++ b/quickstep/res/values-fa/strings.xml @@ -24,6 +24,8 @@ "نمای کلی" "بدون موارد اخیر" "بستن" + + "پاک کردن همه" "برنامه‌های اخیر" diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml index baa8d85acb..fbc3e48360 100644 --- a/quickstep/res/values-hr/strings.xml +++ b/quickstep/res/values-hr/strings.xml @@ -24,6 +24,7 @@ "Pregled" "Nema nedavnih stavki" "Zatvori" + "Postavke upotrebe aplikacija" "Izbriši sve" "Nedavne aplikacije" diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml index 787c14338e..d16d4e8eba 100644 --- a/quickstep/res/values-in/strings.xml +++ b/quickstep/res/values-in/strings.xml @@ -24,6 +24,8 @@ "Ringkasan" "Tidak ada item yang baru dibuka" "Tutup" + + "Hapus semua" "Aplikasi baru-baru ini" diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml index 192ec44c72..eda8363c85 100644 --- a/quickstep/res/values-it/strings.xml +++ b/quickstep/res/values-it/strings.xml @@ -24,6 +24,7 @@ "Panoramica" "Nessun elemento recente" "Chiudi" + "Impostazioni di utilizzo delle app" "Cancella tutto" "App recenti" diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index 64c35ec116..13cb7b42ee 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -24,6 +24,8 @@ "מסכים אחרונים" "אין פריטים אחרונים" "סגירה" + + "ניקוי הכול" "אפליקציות אחרונות" diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml index 5f061debb8..c5f823e6a3 100644 --- a/quickstep/res/values-ka/strings.xml +++ b/quickstep/res/values-ka/strings.xml @@ -24,6 +24,8 @@ "მიმოხილვა" "ბოლოს გამოყენებული ერთეულები არ არის" "დახურვა" + + "ყველას გასუფთავება" "ბოლოდროინდელი აპები" diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml index 591418b9c2..1caa220480 100644 --- a/quickstep/res/values-kn/strings.xml +++ b/quickstep/res/values-kn/strings.xml @@ -24,6 +24,8 @@ "ಅವಲೋಕನ" "ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ" "ಮುಚ್ಚಿ" + + "ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ" "ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು" diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index 7a669dd647..ffafbdb967 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -24,6 +24,8 @@ "अवलोकन" "कोणतेही अलीकडील आयटम नाहीत" "बंद" + + "सर्व साफ करा" "अलीकडील अॅप्स" diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml index ae6dc7d0a0..6eab2fccbe 100644 --- a/quickstep/res/values-my/strings.xml +++ b/quickstep/res/values-my/strings.xml @@ -24,6 +24,8 @@ "အနှစ်ချုပ်" "မကြာမီကဖွင့်ထားသည်များ မရှိပါ" "ပိတ်ရန်" + + "အားလုံးကို ရှင်းရန်" "လတ်တလောသုံး အက်ပ်များ" diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index 2cd394208e..78e072b6ec 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -24,6 +24,8 @@ "Prehľad" "Žiadne nedávne položky" "Zavrieť" + + "Vymazať všetko" "Nedávne aplikácie" diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml index 00231e1340..ef9afe0ebe 100644 --- a/quickstep/res/values-sq/strings.xml +++ b/quickstep/res/values-sq/strings.xml @@ -24,6 +24,8 @@ "Përmbledhja" "Nuk ka asnjë artikull të fundit" "Mbyll" + + "Pastroji të gjitha" "Aplikacionet e fundit" diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index 4911925984..7a78e3bca0 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -24,6 +24,8 @@ "Nazar" "Yaqinda ishlatilgan ilovalar yo‘q" "Yopish" + + "Hammasini tozalash" "Yaqinda ishlatilgan ilovalar" diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml index 3d4f37250a..afbc66f0ca 100644 --- a/quickstep/res/values-zu/strings.xml +++ b/quickstep/res/values-zu/strings.xml @@ -24,6 +24,8 @@ "Buka konke" "Azikho izinto zakamuva" "Vala" + + "Sula konke" "Izinhlelo zokusebenza zakamuva" diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 70b743f910..56d198c059 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -145,4 +145,5 @@ "Kennisgewings en programme is af" "Maak toe" "Toe" + "Misluk: %1$s" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 1a1b53a910..bebc7b3e9b 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -149,4 +149,5 @@ "الإشعارات والتطبيقات متوقفة." "إغلاق" "تمّ الإغلاق" + "تعذَّر %1$s." diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index 573971ec3e..f8aba177a4 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -145,4 +145,5 @@ "Bildiriş və tətbiqlər deaktivdir" "Bağlayın" "Bağlıdır" + "Alınmadı: %1$s" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index baaed88943..1e2b267ce0 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -146,4 +146,5 @@ "Notifikacije i aplikacije su isključene" "Zatvori" "Zatvoreno" + "Nije uspjelo: %1$s" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 256b0c9381..f26226c1b4 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -147,4 +147,5 @@ "Oznámení a aplikace jsou vypnuty" "Zavřít" "Zavřeno" + "Selhalo: %1$s" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index c30acadf36..6b787708b2 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -145,4 +145,6 @@ "Underretninger og apps er slået fra" "Luk" "Lukket" + + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index d8b6064ec6..20f2a9c07a 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -145,4 +145,6 @@ "Benachrichtigungen und Apps sind deaktiviert" "Schließen" "Geschlossen" + + diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 00717c51ac..eef66ff089 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -145,4 +145,5 @@ "Οι ειδοποιήσεις και οι εφαρμογές είναι απενεργοποιημένες" "Κλείσιμο" "Κλειστή" + "Αποτυχία: %1$s" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 181daefaa9..0494eb45dc 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -145,4 +145,5 @@ "Notifications and apps are off" "Close" "Closed" + "Failed: %1$s" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 181daefaa9..0494eb45dc 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -145,4 +145,5 @@ "Notifications and apps are off" "Close" "Closed" + "Failed: %1$s" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 181daefaa9..0494eb45dc 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -145,4 +145,5 @@ "Notifications and apps are off" "Close" "Closed" + "Failed: %1$s" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 4b2bc3cb9c..29d96f8552 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -145,4 +145,5 @@ "Jakinarazpenak eta aplikazioak desaktibatuta daude" "Itxi" "Itxita" + "Huts egin du: %1$s" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index ff7e749fb5..e78af1557b 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -145,4 +145,5 @@ "اعلان‌ها و برنامه‌ها خاموش هستند" "بستن" "بسته‌شده" + "ناموفق بود: %1$s" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 1f289a8d0c..a4b40280e2 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -146,4 +146,5 @@ "Obavijesti i aplikacije isključeni su" "Zatvori" "Zatvoreno" + "Nije uspjelo: %1$s" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 1ae2f28d52..a4c6a5451f 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -145,4 +145,5 @@ "Notifikasi dan aplikasi nonaktif" "Tutup" "Ditutup" + "Gagal: %1$s" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 2f393edf79..1c53c75942 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -145,4 +145,5 @@ "Le notifiche e le app non sono attive" "Chiudi" "Chiusa" + "Operazione non riuscita: %1$s" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 7de43887f5..a62cd90aef 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -39,7 +39,7 @@ "טוען אפליקציות…" "לא נמצאו אפליקציות התואמות ל-\"%1$s\"" "חפש אפליקציות נוספות" - "הודעות" + "התראות" "כדי להוסיף קיצור דרך, יש לגעת בו ולהחזיק אותו." "כדי להוסיף קיצור דרך או להשתמש בפעולות מותאמות אישית, יש להקיש על קיצור הדרך פעמיים ולהחזיק אותו." "אין עוד מקום במסך דף הבית הזה." @@ -91,7 +91,7 @@ "נדרשת גישה להתראות" "כדי להציג את סימני ההתראות,יש להפעיל התראות מהאפליקציה %1$s" "שנה את ההגדרות" - "הצגה של סימן ההודעות" + "הצגה של סימן ההתראות" "הוספת סמל במסך דף הבית" "לאפליקציות חדשות" "שינוי הצורה של הסמלים" @@ -147,4 +147,6 @@ "הודעות ואפליקציות כבויות" "סגירה" "סגור" + + diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 0199deaeef..8b4503ea1a 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -145,4 +145,5 @@ "შეტყობინებები და აპები გამორთულია" "დახურვა" "დახურული" + "ვერ მოხერხდა: %1$s" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index fac6ef9fc4..91b08dc933 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -145,4 +145,5 @@ "ಅಧಿಸೂಚನೆಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಆಫ್ ಆಗಿವೆ" "ಮುಚ್ಚಿ" "ಮುಚ್ಚಲಾಗಿದೆ" + "ವಿಫಲವಾಗಿದೆ: %1$s" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index f36b7d5149..df863c1196 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -145,4 +145,6 @@ "सूचना आणि अॅप्स बंद आहेत" "बंद करा" "बंद केले" + + diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index d5188c916d..0b07e30949 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -145,4 +145,5 @@ "အကြောင်းကြားချက်များနှင့် အက်ပ်များကို ပိတ်ထားသည်" "ပိတ်ရန်" "ပိတ်ထားသည်" + "မအောင်မြင်ပါ− %1$s" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index ff089b5979..c983fe152c 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -147,4 +147,5 @@ "Upozornenia a aplikácie sú vypnuté" "Zavrieť" "Zavreté" + "Zlyhalo: %1$s" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 2416780219..c26b7a5966 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -145,4 +145,5 @@ "Njoftimet dhe aplikacionet janë joaktive" "Mbyll" "Mbyllur" + "Dështoi: %1$s" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index be7cbf611b..c3b3ddee1e 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -145,4 +145,5 @@ "Bildirishnomalar va ilovalar faol emas" "Yopish" "Yopiq" + "Xato: %1$s" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 9283a13302..c25319e1f6 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -145,4 +145,5 @@ "Izaziso nezinhlelo zokusebenza kuvaliwe" "Vala" "Kuvaliwe" + "Yehlulekile: %1$s" -- GitLab From f908a2e50e44d828583aa35e37e22334a50fc300 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 24 Oct 2018 15:38:09 -0700 Subject: [PATCH 0231/1301] Adding test methods Bug: 117888000 Test: Running new Nexus tests Change-Id: I52a1f89add36dd38bbae8db262dd2e82280db130 --- .../launcher3/popup/PopupContainerWithArrow.java | 4 ++++ .../android/launcher3/views/OptionsPopupView.java | 2 +- .../launcher3/ui/AbstractLauncherUiTest.java | 15 +++++++++++++++ .../com/android/launcher3/ui/TestViewHelpers.java | 11 +++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index 4f1fcda122..12319f75e5 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -221,6 +221,10 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, factory.getEnabledShortcuts(mLauncher, item)); } + public ViewGroup getSystemShortcutContainerForTesting() { + return mSystemShortcutContainer; + } + @TargetApi(Build.VERSION_CODES.P) protected void populateAndShow(final BubbleTextView originalIcon, int shortcutCount, final List notificationKeys, List systemShortcuts) { diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index 3e58ea6739..c540b59c1c 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -136,7 +136,7 @@ public class OptionsPopupView extends ArrowPopup } @VisibleForTesting - public static OptionsPopupView getOptionsPopup(Launcher launcher) { + public static ArrowPopup getOptionsPopup(Launcher launcher) { return launcher.findViewById(R.id.deep_shortcuts_container); } diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index c878699c50..532d3e8b00 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -56,6 +56,7 @@ import org.junit.Rule; import org.junit.rules.TestRule; import org.junit.runners.model.Statement; +import java.io.IOException; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -168,6 +169,16 @@ public abstract class AbstractLauncherUiTest { } } + protected void clearLauncherData() throws IOException { + if (TestHelpers.isInLauncherProcess()) { + LauncherSettings.Settings.call(mTargetContext.getContentResolver(), + LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB); + resetLoaderState(); + } else { + mDevice.executeShellCommand("pm clear " + mDevice.getLauncherPackageName()); + } + } + /** * Scrolls the {@param container} until it finds an object matching {@param condition}. * @return the matching object. @@ -261,6 +272,10 @@ public abstract class AbstractLauncherUiTest { launcher -> launcher.getStateManager().getState() == state); } + protected void waitForResumed(String message) { + waitForLauncherCondition(message, launcher -> launcher.hasBeenResumed()); + } + // Cannot be used in TaplTests after injecting any gesture using Tapl because this can hide // flakiness. protected void waitForLauncherCondition(String message, Function condition) { diff --git a/tests/src/com/android/launcher3/ui/TestViewHelpers.java b/tests/src/com/android/launcher3/ui/TestViewHelpers.java index 524438642e..6fa28f1c91 100644 --- a/tests/src/com/android/launcher3/ui/TestViewHelpers.java +++ b/tests/src/com/android/launcher3/ui/TestViewHelpers.java @@ -28,6 +28,8 @@ import android.os.Process; import android.os.SystemClock; import android.util.Log; import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; import androidx.test.uiautomator.By; import androidx.test.uiautomator.BySelector; @@ -42,6 +44,7 @@ import com.android.launcher3.testcomponent.AppWidgetNoConfig; import com.android.launcher3.testcomponent.AppWidgetWithConfig; import java.util.concurrent.Callable; +import java.util.function.Function; public class TestViewHelpers { private static final String TAG = "TestViewHelpers"; @@ -183,4 +186,12 @@ public class TestViewHelpers { AbstractLauncherUiTest.DEFAULT_UI_TIMEOUT).click(); return findViewById(R.id.widgets_list_view); } + + public static View findChildView(ViewGroup parent, Function condition) { + for (int i = 0; i < parent.getChildCount(); ++i) { + final View child = parent.getChildAt(i); + if (condition.apply(child)) return child; + } + return null; + } } -- GitLab From eae0514f1a8bcb9d498e146e7de78ddc187cbb17 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 24 Oct 2018 16:20:37 -0700 Subject: [PATCH 0232/1301] Moving Plugin and feature flags UI to androidX > Combining both preference into a single screen > Adding plugin preference screen so quickstep build Change-Id: I3d2ff3ebdac3c774659e79ecb81be6f75f765eb0 --- .../plugins/PluginEnablerImpl.java | 24 ++- .../plugins/PluginInitializerImpl.java | 3 +- .../plugins/PluginManagerWrapper.java | 31 ++- res/values/config.xml | 7 +- res/xml/flag_preferences.xml | 24 --- res/xml/launcher_preferences.xml | 6 +- ...ceFragment.java => FlagTogglerPrefUi.java} | 118 +++++++----- .../settings/DeveloperOptionsFragment.java | 182 ++++++++++++------ .../launcher3/settings/SettingsActivity.java | 9 +- .../plugins/PluginManagerWrapper.java | 26 ++- 10 files changed, 278 insertions(+), 152 deletions(-) delete mode 100644 res/xml/flag_preferences.xml rename src/com/android/launcher3/config/{FlagTogglerPreferenceFragment.java => FlagTogglerPrefUi.java} (52%) rename quickstep/src/com/android/launcher3/uioverrides/plugins/PluginPreferencesFragment.java => src/com/android/launcher3/settings/DeveloperOptionsFragment.java (53%) diff --git a/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginEnablerImpl.java b/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginEnablerImpl.java index e9fac26bdb..eaf4183fdf 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginEnablerImpl.java +++ b/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginEnablerImpl.java @@ -21,7 +21,11 @@ import android.content.SharedPreferences; import com.android.launcher3.Utilities; import com.android.systemui.shared.plugins.PluginEnabler; -public class PluginEnablerImpl implements PluginEnabler { +import androidx.preference.PreferenceDataStore; + +public class PluginEnablerImpl extends PreferenceDataStore implements PluginEnabler { + + private static final String PREFIX_PLUGIN_ENABLED = "PLUGIN_ENABLED_"; final private SharedPreferences mSharedPrefs; @@ -31,15 +35,25 @@ public class PluginEnablerImpl implements PluginEnabler { @Override public void setEnabled(ComponentName component, boolean enabled) { - mSharedPrefs.edit().putBoolean(toPrefString(component), enabled).apply(); + putBoolean(pluginEnabledKey(component), enabled); } @Override public boolean isEnabled(ComponentName component) { - return mSharedPrefs.getBoolean(toPrefString(component), true); + return getBoolean(pluginEnabledKey(component), true); + } + + @Override + public void putBoolean(String key, boolean value) { + mSharedPrefs.edit().putBoolean(key, value).apply(); + } + + @Override + public boolean getBoolean(String key, boolean defValue) { + return mSharedPrefs.getBoolean(key, defValue); } - private String toPrefString(ComponentName component) { - return "PLUGIN_ENABLED_" + component.flattenToString(); + static String pluginEnabledKey(ComponentName cn) { + return PREFIX_PLUGIN_ENABLED + cn.flattenToString(); } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginInitializerImpl.java b/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginInitializerImpl.java index 8a6aa050cd..910fa0df6c 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginInitializerImpl.java +++ b/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginInitializerImpl.java @@ -18,7 +18,6 @@ import android.content.Context; import android.os.Looper; import com.android.launcher3.LauncherModel; -import com.android.systemui.shared.plugins.PluginEnabler; import com.android.systemui.shared.plugins.PluginInitializer; public class PluginInitializerImpl implements PluginInitializer { @@ -37,7 +36,7 @@ public class PluginInitializerImpl implements PluginInitializer { } @Override - public PluginEnabler getPluginEnabler(Context context) { + public PluginEnablerImpl getPluginEnabler(Context context) { return new PluginEnablerImpl(context); } diff --git a/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginManagerWrapper.java b/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginManagerWrapper.java index 88c362d32d..6e7c087bb7 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginManagerWrapper.java +++ b/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginManagerWrapper.java @@ -14,31 +14,37 @@ package com.android.launcher3.uioverrides.plugins; +import android.content.ComponentName; import android.content.Context; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.systemui.plugins.Plugin; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.shared.plugins.PluginEnabler; -import com.android.systemui.shared.plugins.PluginInitializer; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.plugins.PluginManagerImpl; +import com.android.systemui.shared.plugins.PluginPrefs; + +import java.util.Set; public class PluginManagerWrapper { public static final MainThreadInitializedObject INSTANCE = new MainThreadInitializedObject<>(PluginManagerWrapper::new); + public static final String PLUGIN_CHANGED = PluginManager.PLUGIN_CHANGED; + + private final Context mContext; private final PluginManager mPluginManager; - private final PluginEnabler mPluginEnabler; + private final PluginEnablerImpl mPluginEnabler; private PluginManagerWrapper(Context c) { - PluginInitializer pluginInitializer = new PluginInitializerImpl(); + mContext = c; + PluginInitializerImpl pluginInitializer = new PluginInitializerImpl(); mPluginManager = new PluginManagerImpl(c, pluginInitializer); mPluginEnabler = pluginInitializer.getPluginEnabler(c); } - PluginEnabler getPluginEnabler() { + public PluginEnablerImpl getPluginEnabler() { return mPluginEnabler; } @@ -54,4 +60,19 @@ public class PluginManagerWrapper { public void removePluginListener(PluginListener listener) { mPluginManager.removePluginListener(listener); } + + public Set getPluginActions() { + return new PluginPrefs(mContext).getPluginList(); + } + + /** + * Returns the string key used to store plugin enabled/disabled setting + */ + public static String pluginEnabledKey(ComponentName cn) { + return PluginEnablerImpl.pluginEnabledKey(cn); + } + + public static boolean hasPlugins(Context context) { + return PluginPrefs.hasPlugins(context); + } } diff --git a/res/values/config.xml b/res/values/config.xml index 946afecf85..5e83ab7666 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -19,7 +19,7 @@ #Intent;action=android.intent.action.DELETE;launchFlags=0x10800000;end - com.android.launcher3.SettingsActivity$LauncherSettingsFragment + com.android.launcher3.settings.SettingsActivity$LauncherSettingsFragment @@ -105,7 +105,10 @@ - + + + + 150 40 300 diff --git a/res/xml/flag_preferences.xml b/res/xml/flag_preferences.xml deleted file mode 100644 index aea1a6ab7b..0000000000 --- a/res/xml/flag_preferences.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/res/xml/launcher_preferences.xml b/res/xml/launcher_preferences.xml index c55cc49855..2c86f8ebf0 100644 --- a/res/xml/launcher_preferences.xml +++ b/res/xml/launcher_preferences.xml @@ -54,9 +54,9 @@ android:persistent="false" /> + android:title="Developer Options" + android:fragment="com.android.launcher3.settings.DeveloperOptionsFragment"/> diff --git a/src/com/android/launcher3/config/FlagTogglerPreferenceFragment.java b/src/com/android/launcher3/config/FlagTogglerPrefUi.java similarity index 52% rename from src/com/android/launcher3/config/FlagTogglerPreferenceFragment.java rename to src/com/android/launcher3/config/FlagTogglerPrefUi.java index 0a1fd2fe07..d3be51dda7 100644 --- a/src/com/android/launcher3/config/FlagTogglerPreferenceFragment.java +++ b/src/com/android/launcher3/config/FlagTogglerPrefUi.java @@ -18,103 +18,117 @@ package com.android.launcher3.config; import android.content.Context; import android.content.SharedPreferences; -import android.os.Bundle; import android.os.Process; -import android.preference.PreferenceDataStore; -import android.preference.PreferenceFragment; -import android.preference.SwitchPreference; import android.util.Log; import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; import com.android.launcher3.R; import com.android.launcher3.config.BaseFlags.TogglableFlag; +import androidx.preference.PreferenceDataStore; +import androidx.preference.PreferenceFragment; +import androidx.preference.PreferenceGroup; +import androidx.preference.SwitchPreference; + /** * Dev-build only UI allowing developers to toggle flag settings. See {@link FeatureFlags}. */ -public final class FlagTogglerPreferenceFragment extends PreferenceFragment { +public final class FlagTogglerPrefUi { + private static final String TAG = "FlagTogglerPrefFrag"; - private SharedPreferences mSharedPreferences; - private MenuItem saveButton; + private final PreferenceFragment mFragment; + private final Context mContext; + private final SharedPreferences mSharedPreferences; - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.flag_preferences); - mSharedPreferences = getContext().getSharedPreferences( + private final PreferenceDataStore mDataStore = new PreferenceDataStore() { + + @Override + public void putBoolean(String key, boolean value) { + for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { + if (flag.getKey().equals(key)) { + if (value == flag.getDefaultValue()) { + mSharedPreferences.edit().remove(key).apply(); + } else { + mSharedPreferences.edit().putBoolean(key, value).apply(); + } + updateMenu(); + } + } + } + + @Override + public boolean getBoolean(String key, boolean defValue) { + return mSharedPreferences.getBoolean(key, defValue); + } + }; + + public FlagTogglerPrefUi(PreferenceFragment fragment) { + mFragment = fragment; + mContext = fragment.getActivity(); + mSharedPreferences = mContext.getSharedPreferences( FeatureFlags.FLAGS_PREF_NAME, Context.MODE_PRIVATE); + } + public void applyTo(PreferenceGroup parent) { // For flag overrides we only want to store when the engineer chose to override the // flag with a different value than the default. That way, when we flip flags in // future, engineers will pick up the new value immediately. To accomplish this, we use a // custom preference data store. - getPreferenceManager().setPreferenceDataStore(new PreferenceDataStore() { - @Override - public void putBoolean(String key, boolean value) { - for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { - if (flag.getKey().equals(key)) { - if (value == flag.getDefaultValue()) { - mSharedPreferences.edit().remove(key).apply(); - } else { - mSharedPreferences.edit().putBoolean(key, value).apply(); - } - } - } - } - }); - for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { - SwitchPreference switchPreference = new SwitchPreference(getContext()); + SwitchPreference switchPreference = new SwitchPreference(mContext); switchPreference.setKey(flag.getKey()); switchPreference.setDefaultValue(flag.getDefaultValue()); switchPreference.setChecked(getFlagStateFromSharedPrefs(flag)); switchPreference.setTitle(flag.getKey()); switchPreference.setSummaryOn(flag.getDefaultValue() ? "" : "overridden"); switchPreference.setSummaryOff(flag.getDefaultValue() ? "overridden" : ""); - getPreferenceScreen().addPreference(switchPreference); + switchPreference.setPreferenceDataStore(mDataStore); + parent.addPreference(switchPreference); } - setHasOptionsMenu(true); + updateMenu(); } - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - saveButton = menu.add("Apply"); - saveButton.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + private void updateMenu() { + mFragment.setHasOptionsMenu(anyChanged()); + mFragment.getActivity().invalidateOptionsMenu(); } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item == saveButton) { + public void onCreateOptionsMenu(Menu menu) { + if (anyChanged()) { + menu.add(0, R.id.menu_apply_flags, 0, "Apply") + .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + } + } + + public void onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.menu_apply_flags) { mSharedPreferences.edit().commit(); Log.e(TAG, "Killing launcher process " + Process.myPid() + " to apply new flag values"); System.exit(0); } - return super.onOptionsItemSelected(item); } - @Override public void onStop() { - boolean anyChanged = false; - for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { - anyChanged = anyChanged || - getFlagStateFromSharedPrefs(flag) != flag.get(); - } - - if (anyChanged) { - Toast.makeText( - getContext(), - "Flag won't be applied until you restart launcher", + if (anyChanged()) { + Toast.makeText(mContext, "Flag won't be applied until you restart launcher", Toast.LENGTH_LONG).show(); } - super.onStop(); } private boolean getFlagStateFromSharedPrefs(TogglableFlag flag) { - return mSharedPreferences.getBoolean(flag.getKey(), flag.getDefaultValue()); + return mDataStore.getBoolean(flag.getKey(), flag.getDefaultValue()); + } + + private boolean anyChanged() { + for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { + if (getFlagStateFromSharedPrefs(flag) != flag.get()) { + return true; + } + } + return false; } } \ No newline at end of file diff --git a/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginPreferencesFragment.java b/src/com/android/launcher3/settings/DeveloperOptionsFragment.java similarity index 53% rename from quickstep/src/com/android/launcher3/uioverrides/plugins/PluginPreferencesFragment.java rename to src/com/android/launcher3/settings/DeveloperOptionsFragment.java index 3da4f84274..a9242f94e0 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/plugins/PluginPreferencesFragment.java +++ b/src/com/android/launcher3/settings/DeveloperOptionsFragment.java @@ -1,19 +1,24 @@ /* * Copyright (C) 2018 The Android Open Source Project * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of the License at + * 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. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ +package com.android.launcher3.settings; -package com.android.launcher3.uioverrides.plugins; +import static com.android.launcher3.uioverrides.plugins.PluginManagerWrapper.PLUGIN_CHANGED; +import static com.android.launcher3.uioverrides.plugins.PluginManagerWrapper.pluginEnabledKey; +import android.annotation.TargetApi; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -23,66 +28,132 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; +import android.os.Build; import android.os.Bundle; -import android.preference.PreferenceFragment; -import android.preference.PreferenceScreen; -import android.preference.SwitchPreference; import android.provider.Settings; import android.util.ArrayMap; import android.util.ArraySet; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import com.android.launcher3.R; -import com.android.systemui.shared.plugins.PluginEnabler; -import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.shared.plugins.PluginPrefs; +import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.config.FlagTogglerPrefUi; +import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper; import java.util.List; import java.util.Set; +import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceDataStore; +import androidx.preference.PreferenceFragment; +import androidx.preference.PreferenceScreen; +import androidx.preference.PreferenceViewHolder; +import androidx.preference.SwitchPreference; + /** - * This class is copied from System UI Tuner, except using our PluginEnablerImpl. The reason we - * can't share a common base class in the shared lib is because the androidx preference dependency - * interferes with our recyclerview and fragment dependencies. + * Dev-build only UI allowing developers to toggle flag settings and plugins. + * See {@link FeatureFlags}. */ -public class PluginPreferencesFragment extends PreferenceFragment { - public static final String ACTION_PLUGIN_SETTINGS - = "com.android.systemui.action.PLUGIN_SETTINGS"; +@TargetApi(Build.VERSION_CODES.O) +public class DeveloperOptionsFragment extends PreferenceFragment { + private static final String ACTION_PLUGIN_SETTINGS = "com.android.systemui.action.PLUGIN_SETTINGS"; private static final String PLUGIN_PERMISSION = "com.android.systemui.permission.PLUGIN"; - private PluginPrefs mPluginPrefs; - private PluginEnabler mPluginEnabler; + private final BroadcastReceiver mPluginReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + loadPluginPrefs(); + } + }; + + private PreferenceScreen mPreferenceScreen; + + private PreferenceCategory mPluginsCategory; + private FlagTogglerPrefUi mFlagTogglerPrefUi; @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); filter.addDataScheme("package"); - getContext().registerReceiver(mReceiver, filter); - filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED); - getContext().registerReceiver(mReceiver, filter); + getContext().registerReceiver(mPluginReceiver, filter); + getContext().registerReceiver(mPluginReceiver, + new IntentFilter(Intent.ACTION_USER_UNLOCKED)); + + mPreferenceScreen = getPreferenceManager().createPreferenceScreen(getContext()); + setPreferenceScreen(mPreferenceScreen); - mPluginEnabler = PluginManagerWrapper.INSTANCE.get(getContext()).getPluginEnabler(); - loadPrefs(); + initFlags(); + loadPluginPrefs(); } @Override public void onDestroy() { super.onDestroy(); - getContext().unregisterReceiver(mReceiver); + getContext().unregisterReceiver(mPluginReceiver); + } + + private PreferenceCategory newCategory(String title) { + PreferenceCategory category = new PreferenceCategory(getContext()); + category.setOrder(Preference.DEFAULT_ORDER); + category.setTitle(title); + mPreferenceScreen.addPreference(category); + return category; } - private void loadPrefs() { - PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getContext()); - screen.setOrderingAsAdded(false); + private void initFlags() { + if (!FeatureFlags.showFlagTogglerUi(getContext())) { + return; + } + + mFlagTogglerPrefUi = new FlagTogglerPrefUi(this); + mFlagTogglerPrefUi.applyTo(newCategory("Feature flags")); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + if (mFlagTogglerPrefUi != null) { + mFlagTogglerPrefUi.onCreateOptionsMenu(menu); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (mFlagTogglerPrefUi != null) { + mFlagTogglerPrefUi.onOptionsItemSelected(item); + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onStop() { + if (mFlagTogglerPrefUi != null) { + mFlagTogglerPrefUi.onStop(); + } + super.onStop(); + } + + private void loadPluginPrefs() { + if (mPluginsCategory != null) { + mPreferenceScreen.removePreference(mPluginsCategory); + } + if (!PluginManagerWrapper.hasPlugins(getActivity())) { + mPluginsCategory = null; + return; + } + mPluginsCategory = newCategory("Plugins"); + + PluginManagerWrapper manager = PluginManagerWrapper.INSTANCE.get(getContext()); Context prefContext = getContext(); - mPluginPrefs = new PluginPrefs(getContext()); PackageManager pm = getContext().getPackageManager(); - Set pluginActions = mPluginPrefs.getPluginList(); + Set pluginActions = manager.getPluginActions(); ArrayMap> plugins = new ArrayMap<>(); for (String action : pluginActions) { String name = toName(action); @@ -99,13 +170,13 @@ public class PluginPreferencesFragment extends PreferenceFragment { List apps = pm.getPackagesHoldingPermissions(new String[]{PLUGIN_PERMISSION}, PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.GET_SERVICES); + PreferenceDataStore enabled = manager.getPluginEnabler(); apps.forEach(app -> { if (!plugins.containsKey(app.packageName)) return; - SwitchPreference pref = new PluginPreference(prefContext, app, mPluginEnabler); + SwitchPreference pref = new PluginPreference(prefContext, app, enabled); pref.setSummary("Plugins: " + toString(plugins.get(app.packageName))); - screen.addPreference(pref); + mPluginsCategory.addPreference(pref); }); - setPreferenceScreen(screen); } private String toString(ArraySet plugins) { @@ -132,19 +203,13 @@ public class PluginPreferencesFragment extends PreferenceFragment { return b.toString(); } - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - loadPrefs(); - } - }; - private static class PluginPreference extends SwitchPreference { private final boolean mHasSettings; private final PackageInfo mInfo; - private final PluginEnabler mPluginEnabler; + private final PreferenceDataStore mPluginEnabler; - public PluginPreference(Context prefContext, PackageInfo info, PluginEnabler pluginEnabler) { + public PluginPreference(Context prefContext, PackageInfo info, + PreferenceDataStore pluginEnabler) { super(prefContext); PackageManager pm = prefContext.getPackageManager(); mHasSettings = pm.resolveActivity(new Intent(ACTION_PLUGIN_SETTINGS) @@ -156,11 +221,16 @@ public class PluginPreferencesFragment extends PreferenceFragment { setWidgetLayoutResource(R.layout.switch_preference_with_settings); } + private boolean isEnabled(ComponentName cn) { + return mPluginEnabler.getBoolean(pluginEnabledKey(cn), true); + + } + private boolean isPluginEnabled() { for (int i = 0; i < mInfo.services.length; i++) { ComponentName componentName = new ComponentName(mInfo.packageName, mInfo.services[i].name); - if (!mPluginEnabler.isEnabled(componentName)) { + if (!isEnabled(componentName)) { return false; } } @@ -174,14 +244,14 @@ public class PluginPreferencesFragment extends PreferenceFragment { ComponentName componentName = new ComponentName(mInfo.packageName, mInfo.services[i].name); - if (mPluginEnabler.isEnabled(componentName) != isEnabled) { - mPluginEnabler.setEnabled(componentName, isEnabled); + if (isEnabled(componentName) != isEnabled) { + mPluginEnabler.putBoolean(pluginEnabledKey(componentName), isEnabled); shouldSendBroadcast = true; } } if (shouldSendBroadcast) { final String pkg = mInfo.packageName; - final Intent intent = new Intent(PluginManager.PLUGIN_CHANGED, + final Intent intent = new Intent(PLUGIN_CHANGED, pkg != null ? Uri.fromParts("package", pkg, null) : null); getContext().sendBroadcast(intent); } @@ -190,13 +260,13 @@ public class PluginPreferencesFragment extends PreferenceFragment { } @Override - protected void onBindView(View view) { - super.onBindView(view); - view.findViewById(R.id.settings).setVisibility(mHasSettings ? View.VISIBLE + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + holder.findViewById(R.id.settings).setVisibility(mHasSettings ? View.VISIBLE : View.GONE); - view.findViewById(R.id.divider).setVisibility(mHasSettings ? View.VISIBLE + holder.findViewById(R.id.divider).setVisibility(mHasSettings ? View.VISIBLE : View.GONE); - view.findViewById(R.id.settings).setOnClickListener(v -> { + holder.findViewById(R.id.settings).setOnClickListener(v -> { ResolveInfo result = v.getContext().getPackageManager().resolveActivity( new Intent(ACTION_PLUGIN_SETTINGS).setPackage( mInfo.packageName), 0); @@ -206,7 +276,7 @@ public class PluginPreferencesFragment extends PreferenceFragment { result.activityInfo.name))); } }); - view.setOnLongClickListener(v -> { + holder.itemView.setOnLongClickListener(v -> { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", mInfo.packageName, null)); getContext().startActivity(intent); diff --git a/src/com/android/launcher3/settings/SettingsActivity.java b/src/com/android/launcher3/settings/SettingsActivity.java index 4c022b438f..7c158d9f73 100644 --- a/src/com/android/launcher3/settings/SettingsActivity.java +++ b/src/com/android/launcher3/settings/SettingsActivity.java @@ -24,17 +24,16 @@ import static com.android.launcher3.util.SecureSettingsObserver.newNotificationS import android.app.Activity; import android.app.DialogFragment; import android.app.Fragment; -import android.content.Intent; import android.os.Bundle; import android.provider.Settings; import android.text.TextUtils; -import android.util.Log; import com.android.launcher3.LauncherFiles; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.IconShapeOverride; +import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper; import com.android.launcher3.util.SecureSettingsObserver; import androidx.preference.ListPreference; @@ -52,6 +51,7 @@ import androidx.recyclerview.widget.RecyclerView; public class SettingsActivity extends Activity implements OnPreferenceStartFragmentCallback, OnPreferenceStartScreenCallback { + private static final String DEVELOPER_OPTIONS_KEY = "pref_developer_options"; private static final String FLAGS_PREFERENCE_KEY = "flag_toggler"; private static final String ICON_BADGING_PREFERENCE_KEY = "pref_icon_badging"; @@ -204,6 +204,11 @@ public class SettingsActivity extends Activity case FLAGS_PREFERENCE_KEY: // Only show flag toggler UI if this build variant implements that. return FeatureFlags.showFlagTogglerUi(getContext()); + + case DEVELOPER_OPTIONS_KEY: + // Show if plugins are enabled or flag UI is enabled. + return FeatureFlags.showFlagTogglerUi(getContext()) || + PluginManagerWrapper.hasPlugins(getContext()); } return true; diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/plugins/PluginManagerWrapper.java b/src_ui_overrides/com/android/launcher3/uioverrides/plugins/PluginManagerWrapper.java index 31dbb347ca..e1a35c963d 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/plugins/PluginManagerWrapper.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/plugins/PluginManagerWrapper.java @@ -14,17 +14,26 @@ package com.android.launcher3.uioverrides.plugins; +import android.content.ComponentName; import android.content.Context; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.systemui.plugins.Plugin; import com.android.systemui.plugins.PluginListener; +import java.util.Collections; +import java.util.Set; + +import androidx.preference.PreferenceDataStore; + public class PluginManagerWrapper { public static final MainThreadInitializedObject INSTANCE = new MainThreadInitializedObject<>(PluginManagerWrapper::new); + private static final String PREFIX_PLUGIN_ENABLED = "PLUGIN_ENABLED_"; + public static final String PLUGIN_CHANGED = "com.android.systemui.action.PLUGIN_CHANGED"; + private PluginManagerWrapper(Context c) { } @@ -35,6 +44,21 @@ public class PluginManagerWrapper { boolean allowMultiple) { } - public void removePluginListener(PluginListener listener) { + public void removePluginListener(PluginListener listener) { } + + public Set getPluginActions() { + return Collections.emptySet(); + } + + public PreferenceDataStore getPluginEnabler() { + return new PreferenceDataStore() { }; + } + + public static String pluginEnabledKey(ComponentName cn) { + return PREFIX_PLUGIN_ENABLED + cn.flattenToString(); + } + + public static boolean hasPlugins(Context context) { + return false; } } -- GitLab From cc4c61472e53838946af48de926b76dbf6bc4a36 Mon Sep 17 00:00:00 2001 From: Zak Cohen Date: Wed, 24 Oct 2018 13:26:47 -0700 Subject: [PATCH 0233/1301] DeepShortcut - show loading placeholder before content is available. Sometimes the deep shortcuts can take time to load, show an initial loading state before any text is set. Note: changed singleLine to lines=1 as the former causes issues with RTL layout and is deprecated. Bug: 78620208 Tested: manual test on pixel 3 Change-Id: I782addb8d64425a1a95cee4f104fc0bd44809815 --- .../ic_deepshortcut_placeholder.xml | 20 ++++++ .../deep_shortcuts_text_placeholder.xml | 21 +++++++ res/drawable/ic_deepshortcut_placeholder.xml | 22 +++++++ res/layout/deep_shortcut.xml | 3 +- res/values/styles.xml | 2 +- .../shortcuts/DeepShortcutTextView.java | 63 +++++++++++++++++++ 6 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 res/drawable-v26/ic_deepshortcut_placeholder.xml create mode 100644 res/drawable/deep_shortcuts_text_placeholder.xml create mode 100644 res/drawable/ic_deepshortcut_placeholder.xml diff --git a/res/drawable-v26/ic_deepshortcut_placeholder.xml b/res/drawable-v26/ic_deepshortcut_placeholder.xml new file mode 100644 index 0000000000..3fa85065bd --- /dev/null +++ b/res/drawable-v26/ic_deepshortcut_placeholder.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/res/drawable/deep_shortcuts_text_placeholder.xml b/res/drawable/deep_shortcuts_text_placeholder.xml new file mode 100644 index 0000000000..99da50fdca --- /dev/null +++ b/res/drawable/deep_shortcuts_text_placeholder.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/res/drawable/ic_deepshortcut_placeholder.xml b/res/drawable/ic_deepshortcut_placeholder.xml new file mode 100644 index 0000000000..85a9694501 --- /dev/null +++ b/res/drawable/ic_deepshortcut_placeholder.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/res/layout/deep_shortcut.xml b/res/layout/deep_shortcut.xml index 4a2ad42254..92f70e661a 100644 --- a/res/layout/deep_shortcut.xml +++ b/res/layout/deep_shortcut.xml @@ -43,7 +43,8 @@ android:layout_width="@dimen/deep_shortcut_icon_size" android:layout_height="@dimen/deep_shortcut_icon_size" android:layout_marginStart="@dimen/popup_padding_start" - android:layout_gravity="start|center_vertical" /> + android:layout_gravity="start|center_vertical" + android:background="@drawable/ic_deepshortcut_placeholder"/> center true center_horizontal - true + 1 ?android:attr/textColorSecondary sans-serif-condensed false diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java b/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java index c809f27cdc..2daa2fe78e 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java @@ -18,8 +18,10 @@ package com.android.launcher3.shortcuts; import android.content.Context; import android.content.res.Resources; +import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.text.TextUtils; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.Toast; @@ -38,6 +40,10 @@ public class DeepShortcutTextView extends BubbleTextView { private Toast mInstructionToast; + private boolean mShowLoadingState; + private Drawable mLoadingStatePlaceholder; + private final Rect mLoadingStateBounds = new Rect(); + public DeepShortcutTextView(Context context) { this(context, null, 0); } @@ -53,6 +59,7 @@ public class DeepShortcutTextView extends BubbleTextView { mDragHandleWidth = resources.getDimensionPixelSize(R.dimen.popup_padding_end) + resources.getDimensionPixelSize(R.dimen.deep_shortcut_drag_handle_size) + resources.getDimensionPixelSize(R.dimen.deep_shortcut_drawable_padding) / 2; + showLoadingState(true); } @Override @@ -63,6 +70,25 @@ public class DeepShortcutTextView extends BubbleTextView { if (!Utilities.isRtl(getResources())) { mDragHandleBounds.offset(getMeasuredWidth() - mDragHandleBounds.width(), 0); } + + setLoadingBounds(); + } + + private void setLoadingBounds() { + if (mLoadingStatePlaceholder == null) { + return; + } + mLoadingStateBounds.set( + 0, + 0, + getMeasuredWidth() - mDragHandleWidth - getPaddingStart(), + mLoadingStatePlaceholder.getIntrinsicHeight()); + mLoadingStateBounds.offset( + Utilities.isRtl(getResources()) ? mDragHandleWidth : getPaddingStart(), + (int) ((getMeasuredHeight() - mLoadingStatePlaceholder.getIntrinsicHeight()) + / 2.0f) + ); + mLoadingStatePlaceholder.setBounds(mLoadingStateBounds); } @Override @@ -70,6 +96,15 @@ public class DeepShortcutTextView extends BubbleTextView { // The icon is drawn in a separate view. } + @Override + public void setText(CharSequence text, BufferType type) { + super.setText(text, type); + + if (!TextUtils.isEmpty(text)) { + showLoadingState(false); + } + } + @Override public boolean onTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { @@ -88,6 +123,34 @@ public class DeepShortcutTextView extends BubbleTextView { return super.performClick(); } + @Override + public void onDraw(Canvas canvas) { + if (!mShowLoadingState) { + super.onDraw(canvas); + return; + } + + mLoadingStatePlaceholder.draw(canvas); + } + + private void showLoadingState(boolean loading) { + if (loading == mShowLoadingState) { + return; + } + + mShowLoadingState = loading; + + if (loading) { + mLoadingStatePlaceholder = getContext().getDrawable( + R.drawable.deep_shortcuts_text_placeholder); + setLoadingBounds(); + } else { + mLoadingStatePlaceholder = null; + } + + invalidate(); + } + private void showToast() { if (mInstructionToast != null) { mInstructionToast.cancel(); -- GitLab From d4dc9545c3a39d283e138cdb88a44f28521b786e Mon Sep 17 00:00:00 2001 From: Zak Cohen Date: Fri, 26 Oct 2018 10:59:25 -0700 Subject: [PATCH 0234/1301] Remove unused code from DeepShortcutView. Change-Id: I4df34c71912bdd91c3e5ef37ae4af7b185fd369a Tested: manual on pixel 3 --- .../android/launcher3/shortcuts/DeepShortcutView.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutView.java b/src/com/android/launcher3/shortcuts/DeepShortcutView.java index c856cdbe53..7b93ba2534 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutView.java @@ -40,8 +40,6 @@ public class DeepShortcutView extends FrameLayout { private static final Point sTempPoint = new Point(); - private final Rect mPillRect; - private BubbleTextView mBubbleText; private View mIconView; private View mDivider; @@ -59,8 +57,6 @@ public class DeepShortcutView extends FrameLayout { public DeepShortcutView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - - mPillRect = new Rect(); } @Override @@ -98,12 +94,6 @@ public class DeepShortcutView extends FrameLayout { return sTempPoint; } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - mPillRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); - } - /** package private **/ public void applyShortcutInfo(ShortcutInfo info, ShortcutInfoCompat detail, PopupContainerWithArrow container) { -- GitLab From f107c9ef6ddc59763c1b60507c6ea7b09ecee8f9 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 29 Oct 2018 10:45:25 -0700 Subject: [PATCH 0235/1301] Fixing regression in background task loading. Bug: 117603579 Test: Take systrace, ensure that we aren't loading thumbnails on the UI thread Change-Id: I4b522246a5ab12dc37c1dffdccd05232bbc1f6fe --- quickstep/src/com/android/quickstep/RecentsModel.java | 2 +- quickstep/src/com/android/quickstep/TaskThumbnailCache.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index e184a9bb18..2e4d4d2b83 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -143,8 +143,8 @@ public class RecentsModel extends TaskStackChangeListener { } // Keep the cache up to date with the latest thumbnails + int runningTaskId = RecentsModel.getRunningTaskId(); mTaskList.getTasks(mThumbnailCache.getCacheSize(), true /* keysOnly */, (tasks) -> { - int runningTaskId = RecentsModel.getRunningTaskId(); for (Task task : tasks) { if (task.key.id == runningTaskId) { // Skip the running task, it's not going to have an up-to-date snapshot by the diff --git a/quickstep/src/com/android/quickstep/TaskThumbnailCache.java b/quickstep/src/com/android/quickstep/TaskThumbnailCache.java index c47101b827..61a191f3fa 100644 --- a/quickstep/src/com/android/quickstep/TaskThumbnailCache.java +++ b/quickstep/src/com/android/quickstep/TaskThumbnailCache.java @@ -108,8 +108,9 @@ public class TaskThumbnailCache { Preconditions.assertUIThread(); // Fetch the thumbnail for this task and put it in the cache - mCache.put(task.key, ActivityManagerWrapper.getInstance().getTaskThumbnail( - task.key.id, true /* reducedResolution */)); + updateThumbnailInBackground(task, true /* reducedResolution */, (t) -> { + mCache.put(task.key, t.thumbnail); + }); } -- GitLab From 470da4e3e497caa8bc0f41e01e3e5da07c870ba0 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Mon, 29 Oct 2018 17:31:29 -0400 Subject: [PATCH 0236/1301] Finish LauncherLayoutListener when launcher transition animation ends. In QuickScrub mode, the right task gets clipped out at the end of the animation. This is because LauncherLayoutListener continues to clear out where CurrentRect is, while the app surface is not displaying. We want to finish the listener after the transition animation. Bug: 111697218 Test: Manual test Change-Id: I4dd5f5cbcec0574082fd1463e07c116a9e9305d3 --- .../src/com/android/quickstep/WindowTransformSwipeHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 9ea88842d7..7d1e8ddd6a 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -993,6 +993,7 @@ public class WindowTransformSwipeHandler { mLauncherTransitionController.getAnimationPlayer().end(); mLauncherTransitionController = null; } + mLayoutListener.finish(); mActivityControlHelper.onQuickInteractionStart(mActivity, mRunningTaskInfo, false, mTouchInteractionLog); -- GitLab From b3fe661860c6ec909d4726103e9c7d10434a0455 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 29 Oct 2018 10:45:25 -0700 Subject: [PATCH 0237/1301] Add kill-process call to TestCommandReceiver Bug: 117888000 Test: On Nexus side Change-Id: I4803a884ffe8ae6147fdbaf98e2f813934418b76 --- tests/AndroidManifest-common.xml | 2 ++ .../testcomponent/TestCommandReceiver.java | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/tests/AndroidManifest-common.xml b/tests/AndroidManifest-common.xml index 439058cbda..46b463b21d 100644 --- a/tests/AndroidManifest-common.xml +++ b/tests/AndroidManifest-common.xml @@ -18,6 +18,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.launcher3.tests"> + + diff --git a/tests/src/com/android/launcher3/testcomponent/TestCommandReceiver.java b/tests/src/com/android/launcher3/testcomponent/TestCommandReceiver.java index 04c04f5b11..0edb3d61bc 100644 --- a/tests/src/com/android/launcher3/testcomponent/TestCommandReceiver.java +++ b/tests/src/com/android/launcher3/testcomponent/TestCommandReceiver.java @@ -19,6 +19,8 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; import static android.content.pm.PackageManager.DONT_KILL_APP; +import android.app.Activity; +import android.app.ActivityManager; import android.app.Instrumentation; import android.content.ComponentName; import android.content.ContentProvider; @@ -36,6 +38,7 @@ public class TestCommandReceiver extends ContentProvider { public static final String ENABLE_TEST_LAUNCHER = "enable-test-launcher"; public static final String DISABLE_TEST_LAUNCHER = "disable-test-launcher"; + public static final String KILL_PROCESS = "kill-process"; @Override public boolean onCreate() { @@ -83,14 +86,22 @@ public class TestCommandReceiver extends ContentProvider { COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); return null; } - + case KILL_PROCESS: { + ((ActivityManager) getContext().getSystemService(Activity.ACTIVITY_SERVICE)). + killBackgroundProcesses(arg); + return null; + } } return super.call(method, arg, extras); } public static Bundle callCommand(String command) { + return callCommand(command, null); + } + + public static Bundle callCommand(String command, String arg) { Instrumentation inst = InstrumentationRegistry.getInstrumentation(); Uri uri = Uri.parse("content://" + inst.getContext().getPackageName() + ".commands"); - return inst.getTargetContext().getContentResolver().call(uri, command, null, null); + return inst.getTargetContext().getContentResolver().call(uri, command, arg, null); } } -- GitLab From c00a25970173681efe12377d67d858f37f30a1b4 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Tue, 30 Oct 2018 17:16:25 -0700 Subject: [PATCH 0238/1301] Rename go/src_flags directory as go/src This CL is preparation work to implement Modular shortcuts component in launcher using java/code swap. Bug: 112904271 Test: Manual test Change-Id: I35cf81e95fe487a384d4e9f17ea303093197318f --- Android.mk | 4 ++-- build.gradle | 2 +- .../com/android/launcher3/config/FeatureFlags.java | 0 3 files changed, 3 insertions(+), 3 deletions(-) rename go/{src_flags => src}/com/android/launcher3/config/FeatureFlags.java (100%) diff --git a/Android.mk b/Android.mk index fbe19b0b63..ba820fb7d5 100644 --- a/Android.mk +++ b/Android.mk @@ -131,7 +131,7 @@ LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3CommonDepsLib LOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ $(call all-java-files-under, src_ui_overrides) \ - $(call all-java-files-under, go/src_flags) + $(call all-java-files-under, go/src) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/go/res @@ -235,7 +235,7 @@ LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3CommonDepsLib LOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ $(call all-java-files-under, quickstep/src) \ - $(call all-java-files-under, go/src_flags) + $(call all-java-files-under, go/src) LOCAL_RESOURCE_DIR := \ $(LOCAL_PATH)/quickstep/res \ diff --git a/build.gradle b/build.gradle index 1b9df53d6a..affd85379d 100644 --- a/build.gradle +++ b/build.gradle @@ -100,7 +100,7 @@ android { l3go { res.srcDirs = ['go/res'] - java.srcDirs = ['go/src_flags', "src_ui_overrides"] + java.srcDirs = ['go/src', "src_ui_overrides"] manifest.srcFile "go/AndroidManifest.xml" } diff --git a/go/src_flags/com/android/launcher3/config/FeatureFlags.java b/go/src/com/android/launcher3/config/FeatureFlags.java similarity index 100% rename from go/src_flags/com/android/launcher3/config/FeatureFlags.java rename to go/src/com/android/launcher3/config/FeatureFlags.java -- GitLab From 51ca603ac4a4b170e41ea3afc6e3cdd29290b396 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Wed, 31 Oct 2018 12:54:15 -0700 Subject: [PATCH 0239/1301] Create a deep shortcuts override. This change disables deep shortcuts on Android Go devices. Bug: 112904271 Test: Manual test Change-Id: I6150a3500f67d8a8412b51796cc442e3384c2cbb --- Android.mk | 4 +- build.gradle | 2 +- .../shortcuts/DeepShortcutManager.java | 124 ++++++++++++++++++ .../shortcuts/DeepShortcutManager.java | 0 4 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java rename {src => src_shortcuts_overrides}/com/android/launcher3/shortcuts/DeepShortcutManager.java (100%) diff --git a/Android.mk b/Android.mk index ba820fb7d5..5614e25cac 100644 --- a/Android.mk +++ b/Android.mk @@ -101,6 +101,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3CommonDepsLib LOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ + $(call all-java-files-under, src_shortcuts_overrides) \ $(call all-java-files-under, src_ui_overrides) \ $(call all-java-files-under, src_flags) @@ -174,7 +175,8 @@ LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3CommonDepsLib LOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ $(call all-java-files-under, quickstep/src) \ - $(call all-java-files-under, src_flags) + $(call all-java-files-under, src_flags) \ + $(call all-java-files-under, src_shortcuts_overrides) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/quickstep/res LOCAL_PROGUARD_ENABLED := disabled diff --git a/build.gradle b/build.gradle index affd85379d..476e92bf67 100644 --- a/build.gradle +++ b/build.gradle @@ -72,7 +72,7 @@ android { sourceSets { main { res.srcDirs = ['res'] - java.srcDirs = ['src'] + java.srcDirs = ['src', 'src_shortcuts_overrides'] manifest.srcFile 'AndroidManifest-common.xml' proto { srcDir 'protos/' diff --git a/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java new file mode 100644 index 0000000000..ff0c907f55 --- /dev/null +++ b/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.shortcuts; + +import android.content.ComponentName; +import android.content.Context; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.UserHandle; + +import com.android.launcher3.ItemInfo; + +import java.util.Collections; +import java.util.List; + +/** + * Performs operations related to deep shortcuts, such as querying for them, pinning them, etc. + */ +public class DeepShortcutManager { + private static DeepShortcutManager sInstance; + private static final Object sInstanceLock = new Object(); + + public static DeepShortcutManager getInstance(Context context) { + synchronized (sInstanceLock) { + if (sInstance == null) { + sInstance = new DeepShortcutManager(context.getApplicationContext()); + } + return sInstance; + } + } + + private DeepShortcutManager(Context context) { + } + + public static boolean supportsShortcuts(ItemInfo info) { + return false; + } + + public boolean wasLastCallSuccess() { + return false; + } + + public void onShortcutsChanged(List shortcuts) { + } + + /** + * Queries for the shortcuts with the package name and provided ids. + * + * This method is intended to get the full details for shortcuts when they are added or updated, + * because we only get "key" fields in onShortcutsChanged(). + */ + public List queryForFullDetails(String packageName, + List shortcutIds, UserHandle user) { + return Collections.emptyList(); + } + + /** + * Gets all the manifest and dynamic shortcuts associated with the given package and user, + * to be displayed in the shortcuts container on long press. + */ + public List queryForShortcutsContainer(ComponentName activity, + UserHandle user) { + return Collections.emptyList(); + } + + /** + * Removes the given shortcut from the current list of pinned shortcuts. + * (Runs on background thread) + */ + public void unpinShortcut(final ShortcutKey key) { + } + + /** + * Adds the given shortcut to the current list of pinned shortcuts. + * (Runs on background thread) + */ + public void pinShortcut(final ShortcutKey key) { + } + + public void startShortcut(String packageName, String id, Rect sourceBounds, + Bundle startActivityOptions, UserHandle user) { + } + + public Drawable getShortcutIconDrawable(ShortcutInfoCompat shortcutInfo, int density) { + return null; + } + + /** + * Returns the id's of pinned shortcuts associated with the given package and user. + * + * If packageName is null, returns all pinned shortcuts regardless of package. + */ + public List queryForPinnedShortcuts(String packageName, UserHandle user) { + return Collections.emptyList(); + } + + public List queryForPinnedShortcuts(String packageName, + List shortcutIds, UserHandle user) { + return Collections.emptyList(); + } + + public List queryForAllShortcuts(UserHandle user) { + return Collections.emptyList(); + } + + public boolean hasHostPermission() { + return false; + } +} diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java similarity index 100% rename from src/com/android/launcher3/shortcuts/DeepShortcutManager.java rename to src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java -- GitLab From 56e56095f774a70591ab9b7724a7aa1a8a4ae57b Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 3 Oct 2018 16:34:41 -0700 Subject: [PATCH 0240/1301] Adding animation when opening app usage settings Bug: 118319143 Test: manual test on a prototype Change-Id: I33eab24f180daa60bba221df585469d141526b4b --- quickstep/src/com/android/quickstep/views/TaskView.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 2a4226faa2..a124fe478f 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -459,7 +459,7 @@ public class TaskView extends FrameLayout implements PageCallbacks { } if (action == R.string.accessibility_app_usage_settings) { - openAppUsageSettings(); + openAppUsageSettings(this); return true; } @@ -481,14 +481,16 @@ public class TaskView extends FrameLayout implements PageCallbacks { return super.performAccessibilityAction(action, arguments); } - private void openAppUsageSettings() { + private void openAppUsageSettings(View view) { final Intent intent = new Intent(SEE_TIME_IN_APP_TEMPLATE) .putExtra(Intent.EXTRA_PACKAGE_NAME, mTask.getTopComponent().getPackageName()).addFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); try { final Launcher launcher = Launcher.getLauncher(getContext()); - launcher.startActivity(intent); + final ActivityOptions options = ActivityOptions.makeScaleUpAnimation(view, 0, 0, + view.getWidth(), view.getHeight()); + launcher.startActivity(intent, options.toBundle()); launcher.getUserEventDispatcher().logActionOnControl(LauncherLogProto.Action.Touch.TAP, LauncherLogProto.ControlType.APP_USAGE_SETTINGS, this); } catch (ActivityNotFoundException e) { -- GitLab From 7fbc503b9a29fdc141218620d690334d5e38273c Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 31 Oct 2018 13:57:15 -0700 Subject: [PATCH 0241/1301] Simplifying scrim drawable initialization. Scrim drawable is initialized as null in certain cases in code, but it is also initialized as null in sytle. Only using the style definition as source of truth to avoid missing null checks Bug: 118450709 Change-Id: I9dab18405932d1b5c0e697838738a1392f97021c --- .../graphics/WorkspaceAndHotseatScrim.java | 40 ++++++++----------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java index 00cc1a7e2c..6c98d16b42 100644 --- a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java +++ b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java @@ -121,7 +121,6 @@ public class WorkspaceAndHotseatScrim implements private Workspace mWorkspace; - private final boolean mHasSysUiScrim; private boolean mDrawTopScrim, mDrawBottomScrim; private final RectF mFinalMaskRect = new RectF(); @@ -149,15 +148,9 @@ public class WorkspaceAndHotseatScrim implements mMaskHeight = Utilities.pxFromDp(ALPHA_MASK_BITMAP_DP, view.getResources().getDisplayMetrics()); - - mHasSysUiScrim = !mWallpaperColorInfo.supportsDarkText(); - if (mHasSysUiScrim) { - mTopScrim = Themes.getAttrDrawable(view.getContext(), R.attr.workspaceStatusBarScrim); - mBottomMask = createDitheredAlphaMask(); - } else { - mTopScrim = null; - mBottomMask = null; - } + mTopScrim = Themes.getAttrDrawable(view.getContext(), R.attr.workspaceStatusBarScrim); + mBottomMask = mTopScrim == null ? null : createDitheredAlphaMask(); + mHideSysUiScrim = mTopScrim == null; view.addOnAttachStateChangeListener(this); onExtractedColorsChanged(mWallpaperColorInfo); @@ -185,7 +178,7 @@ public class WorkspaceAndHotseatScrim implements canvas.restore(); } - if (!mHideSysUiScrim && mHasSysUiScrim) { + if (!mHideSysUiScrim) { if (mSysUiProgress <= 0) { mAnimateScrimOnNextDraw = false; return; @@ -213,8 +206,9 @@ public class WorkspaceAndHotseatScrim implements } public void onInsetsChanged(Rect insets) { - mDrawTopScrim = insets.top > 0; - mDrawBottomScrim = !mLauncher.getDeviceProfile().isVerticalBarLayout(); + mDrawTopScrim = mTopScrim != null && insets.top > 0; + mDrawBottomScrim = mBottomMask != null && + !mLauncher.getDeviceProfile().isVerticalBarLayout(); } private void setScrimProgress(float progress) { @@ -230,7 +224,7 @@ public class WorkspaceAndHotseatScrim implements mWallpaperColorInfo.addOnChangeListener(this); onExtractedColorsChanged(mWallpaperColorInfo); - if (mHasSysUiScrim) { + if (mTopScrim != null) { IntentFilter filter = new IntentFilter(ACTION_SCREEN_OFF); filter.addAction(ACTION_USER_PRESENT); // When the device wakes up + keyguard is gone mRoot.getContext().registerReceiver(mReceiver, filter); @@ -240,7 +234,7 @@ public class WorkspaceAndHotseatScrim implements @Override public void onViewDetachedFromWindow(View view) { mWallpaperColorInfo.removeOnChangeListener(this); - if (mHasSysUiScrim) { + if (mTopScrim != null) { mRoot.getContext().unregisterReceiver(mReceiver); } } @@ -259,14 +253,14 @@ public class WorkspaceAndHotseatScrim implements } public void setSize(int w, int h) { - if (mHasSysUiScrim) { + if (mTopScrim != null) { mTopScrim.setBounds(0, 0, w, h); mFinalMaskRect.set(0, h - mMaskHeight, w, h); } } public void hideSysUiScrim(boolean hideSysUiScrim) { - mHideSysUiScrim = hideSysUiScrim; + mHideSysUiScrim = hideSysUiScrim || (mTopScrim == null); if (!hideSysUiScrim) { mAnimateScrimOnNextDraw = true; } @@ -281,18 +275,18 @@ public class WorkspaceAndHotseatScrim implements } private void reapplySysUiAlpha() { - if (mHasSysUiScrim) { - reapplySysUiAlphaNoInvalidate(); - if (!mHideSysUiScrim) { - invalidate(); - } + reapplySysUiAlphaNoInvalidate(); + if (!mHideSysUiScrim) { + invalidate(); } } private void reapplySysUiAlphaNoInvalidate() { float factor = mSysUiProgress * mSysUiAnimMultiplier; mBottomMaskPaint.setAlpha(Math.round(MAX_HOTSEAT_SCRIM_ALPHA * factor)); - mTopScrim.setAlpha(Math.round(255 * factor)); + if (mTopScrim != null) { + mTopScrim.setAlpha(Math.round(255 * factor)); + } } public void invalidate() { -- GitLab From 6699eaf74d26b085deeaf300fc5bdb19272f3a14 Mon Sep 17 00:00:00 2001 From: Ryan Lothian Date: Tue, 30 Oct 2018 17:36:59 -0400 Subject: [PATCH 0242/1301] Add robolectric tests for launcher Bug: 117235618 Change-Id: Ia0441133a77069493b0a29a7a2d513a818dc7fe2 --- robolectric_tests/Android.mk | 53 ++++++++++++ .../android/launcher3/util/IntSetTest.java | 81 +++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 robolectric_tests/Android.mk create mode 100644 robolectric_tests/src/com/android/launcher3/util/IntSetTest.java diff --git a/robolectric_tests/Android.mk b/robolectric_tests/Android.mk new file mode 100644 index 0000000000..501176475a --- /dev/null +++ b/robolectric_tests/Android.mk @@ -0,0 +1,53 @@ +# Copyright (C) 2018 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +############################################# +# Launcher Robolectric test target. # +############################################# +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE := LauncherRoboTests +LOCAL_SDK_VERSION := current +LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_STATIC_JAVA_LIBRARIES := \ + androidx.test.runner \ + androidx.test.rules \ + mockito-robolectric-prebuilt \ + truth-prebuilt +LOCAL_JAVA_LIBRARIES := \ + platform-robolectric-3.6.1-prebuilt + +LOCAL_INSTRUMENTATION_FOR := Launcher3 +LOCAL_MODULE_TAGS := optional + +include $(BUILD_STATIC_JAVA_LIBRARY) + +############################################ +# Target to run the previous target. # +############################################ +include $(CLEAR_VARS) + +LOCAL_MODULE := RunLauncherRoboTests +LOCAL_SDK_VERSION := current +LOCAL_JAVA_LIBRARIES := \ + LauncherRoboTests + +LOCAL_TEST_PACKAGE := Launcher3 + +LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src \ + +LOCAL_ROBOTEST_TIMEOUT := 36000 + +include prebuilts/misc/common/robolectric/3.6.1/run_robotests.mk diff --git a/robolectric_tests/src/com/android/launcher3/util/IntSetTest.java b/robolectric_tests/src/com/android/launcher3/util/IntSetTest.java new file mode 100644 index 0000000000..faec380afd --- /dev/null +++ b/robolectric_tests/src/com/android/launcher3/util/IntSetTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.util; + +import static com.google.common.truth.Truth.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Robolectric unit tests for {@link IntSet} + */ +@RunWith(RobolectricTestRunner.class) +@Config(sdk = 26) +public class IntSetTest { + + @Test + public void shouldBeEmptyInitially() { + IntSet set = new IntSet(); + assertThat(set.size()).isEqualTo(0); + } + + @Test + public void oneElementSet() { + IntSet set = new IntSet(); + set.add(2); + assertThat(set.size()).isEqualTo(1); + assertTrue(set.contains(2)); + assertFalse(set.contains(1)); + } + + + @Test + public void twoElementSet() { + IntSet set = new IntSet(); + set.add(2); + set.add(1); + assertThat(set.size()).isEqualTo(2); + assertTrue(set.contains(2)); + assertTrue(set.contains(1)); + } + + @Test + public void threeElementSet() { + IntSet set = new IntSet(); + set.add(2); + set.add(1); + set.add(10); + assertThat(set.size()).isEqualTo(3); + assertEquals("1, 2, 10", set.mArray.toConcatString()); + } + + + @Test + public void duplicateEntries() { + IntSet set = new IntSet(); + set.add(2); + set.add(2); + assertEquals(1, set.size()); + } +} -- GitLab From 50876bfac7eba0c78d5bcc1d279755a314967fff Mon Sep 17 00:00:00 2001 From: Tony Date: Wed, 19 Sep 2018 23:09:14 -0400 Subject: [PATCH 0243/1301] FeatureFlag: quick scrub is now quick switch - Scale down current task and translate it to the left - Translate previous task in from the left - This is a toggle; quick switch again returns to the first task Currently this is implemented by repurposing onQuickScrub(progress) to update the positions of the first two pages. This makes tracking velocity a bit difficult; if we want to go down this path in the long run we should probably track velocity properly on MotionEvents. Change-Id: I4445b5f08b6e88e71cbb5e30b1f1d45c5f1edc68 --- .gitignore | 3 +- .../LauncherAppTransitionManagerImpl.java | 10 +- .../uioverrides/FastOverviewState.java | 18 ++- .../quickstep/ActivityControlHelper.java | 5 +- .../quickstep/QuickScrubController.java | 142 +++++++++++++++++- .../WindowTransformSwipeHandler.java | 17 ++- .../quickstep/views/TaskThumbnailView.java | 19 ++- .../com/android/quickstep/views/TaskView.java | 17 ++- src/com/android/launcher3/PagedView.java | 8 + .../android/launcher3/config/BaseFlags.java | 9 +- 10 files changed, 221 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 7240e4877b..694b40c7ef 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ bin/ local.properties gradle/ build/ -gradlew* \ No newline at end of file +gradlew* +.DS_Store diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 5680a67090..d7bbfe06e1 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -178,6 +178,14 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag @Override public ActivityOptions getActivityLaunchOptions(Launcher launcher, View v) { if (hasControlRemoteAppTransitionPermission()) { + boolean fromRecents = mLauncher.getStateManager().getState().overviewUi + && findTaskViewToLaunch(launcher, v, null) != null; + RecentsView recentsView = mLauncher.getOverviewPanel(); + if (fromRecents && recentsView.getQuickScrubController().isQuickSwitch()) { + return ActivityOptions.makeCustomAnimation(mLauncher, R.anim.no_anim, + R.anim.no_anim); + } + RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mHandler, true /* startAtFrontOfQueue */) { @@ -218,8 +226,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag } }; - boolean fromRecents = mLauncher.getStateManager().getState().overviewUi - && findTaskViewToLaunch(launcher, v, null) != null; int duration = fromRecents ? RECENTS_LAUNCH_DURATION : APP_LAUNCH_DURATION; diff --git a/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java index 26453022f0..1d65a54e7a 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java @@ -35,6 +35,7 @@ public class FastOverviewState extends OverviewState { * Vertical transition of the task previews relative to the full container. */ public static final float OVERVIEW_TRANSLATION_FACTOR = 0.4f; + public static final float OVERVIEW_CENTERED_TRANSLATION_FACTOR = 0.5f; private static final int STATE_FLAGS = FLAG_DISABLE_RESTORE | FLAG_DISABLE_INTERACTION | FLAG_OVERVIEW_UI | FLAG_HIDE_BACK_BUTTON | FLAG_DISABLE_ACCESSIBILITY; @@ -60,12 +61,17 @@ public class FastOverviewState extends OverviewState { RecentsView recentsView = launcher.getOverviewPanel(); recentsView.getTaskSize(sTempRect); - return new float[] {getOverviewScale(launcher.getDeviceProfile(), sTempRect, launcher), - OVERVIEW_TRANSLATION_FACTOR}; + boolean isQuickSwitch = recentsView.getQuickScrubController().isQuickSwitch(); + float translationYFactor = isQuickSwitch + ? OVERVIEW_CENTERED_TRANSLATION_FACTOR + : OVERVIEW_TRANSLATION_FACTOR; + return new float[] {getOverviewScale(launcher.getDeviceProfile(), sTempRect, launcher, + isQuickSwitch), translationYFactor}; } - public static float getOverviewScale(DeviceProfile dp, Rect taskRect, Context context) { - if (dp.isVerticalBarLayout()) { + public static float getOverviewScale(DeviceProfile dp, Rect taskRect, Context context, + boolean isQuickSwitch) { + if (dp.isVerticalBarLayout() && !isQuickSwitch) { return 1f; } @@ -73,6 +79,10 @@ public class FastOverviewState extends OverviewState { float usedHeight = taskRect.height() + res.getDimension(R.dimen.task_thumbnail_top_margin); float usedWidth = taskRect.width() + 2 * (res.getDimension(R.dimen.recents_page_spacing) + res.getDimension(R.dimen.quickscrub_adjacent_visible_width)); + if (isQuickSwitch) { + usedWidth = taskRect.width(); + return Math.max(dp.availableHeightPx / usedHeight, dp.availableWidthPx / usedWidth); + } return Math.min(Math.min(dp.availableHeightPx / usedHeight, dp.availableWidthPx / usedWidth), MAX_PREVIEW_SCALE_UP); } diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index c809e28320..85eed1fbfe 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -16,7 +16,6 @@ package com.android.quickstep; import static android.view.View.TRANSLATION_Y; - import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.LauncherState.BACKGROUND_APP; @@ -58,6 +57,7 @@ import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.compat.AccessibilityManagerCompat; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.uioverrides.FastOverviewState; import com.android.launcher3.userevent.nano.LauncherLogProto; @@ -192,7 +192,8 @@ public interface ActivityControlHelper { @InteractionType int interactionType, TransformedRect outRect) { LayoutUtils.calculateLauncherTaskSize(context, dp, outRect.rect); if (interactionType == INTERACTION_QUICK_SCRUB) { - outRect.scale = FastOverviewState.getOverviewScale(dp, outRect.rect, context); + outRect.scale = FastOverviewState.getOverviewScale(dp, outRect.rect, context, + FeatureFlags.QUICK_SWITCH.get()); } if (dp.isVerticalBarLayout()) { Rect targetInsets = dp.getInsets(); diff --git a/quickstep/src/com/android/quickstep/QuickScrubController.java b/quickstep/src/com/android/quickstep/QuickScrubController.java index 34207670e8..c44ccd3ded 100644 --- a/quickstep/src/com/android/quickstep/QuickScrubController.java +++ b/quickstep/src/com/android/quickstep/QuickScrubController.java @@ -16,8 +16,18 @@ package com.android.quickstep; +import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; +import static com.android.launcher3.anim.Interpolators.ACCEL; +import static com.android.launcher3.anim.Interpolators.DEACCEL_3; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; +import static com.android.launcher3.anim.Interpolators.LINEAR; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; +import android.annotation.TargetApi; +import android.os.Build; +import android.util.FloatProperty; import android.util.Log; import android.view.HapticFeedbackConstants; import android.view.animation.Interpolator; @@ -37,8 +47,10 @@ import com.android.quickstep.views.TaskView; * The behavior is to evenly divide the progress into sections, each of which scrolls one page. * The first and last section set an alarm to auto-advance backwards or forwards, respectively. */ +@TargetApi(Build.VERSION_CODES.P) public class QuickScrubController implements OnAlarmListener { + public static final int QUICK_SWITCH_FROM_APP_START_DURATION = 0; public static final int QUICK_SCRUB_FROM_APP_START_DURATION = 240; public static final int QUICK_SCRUB_FROM_HOME_START_DURATION = 200; // We want the translation y to finish faster than the rest of the animation. @@ -52,6 +64,19 @@ public class QuickScrubController implements OnAlarmListener { 0.05f, 0.20f, 0.35f, 0.50f, 0.65f, 0.80f, 0.95f }; + private static final FloatProperty PROGRESS + = new FloatProperty("progress") { + @Override + public void setValue(QuickScrubController quickScrubController, float progress) { + quickScrubController.onQuickScrubProgress(progress); + } + + @Override + public Float get(QuickScrubController quickScrubController) { + return quickScrubController.mEndProgress; + } + }; + private static final String TAG = "QuickScrubController"; private static final boolean ENABLE_AUTO_ADVANCE = true; private static final long AUTO_ADVANCE_DELAY = 500; @@ -72,6 +97,13 @@ public class QuickScrubController implements OnAlarmListener { private ActivityControlHelper mActivityControlHelper; private TouchInteractionLog mTouchInteractionLog; + private boolean mIsQuickSwitch; + private float mStartProgress; + private float mEndProgress; + private float mPrevProgressDelta; + private float mPrevPrevProgressDelta; + private boolean mShouldSwitchToNext; + public QuickScrubController(BaseActivity activity, RecentsView recentsView) { mActivity = activity; mRecentsView = recentsView; @@ -91,17 +123,26 @@ public class QuickScrubController implements OnAlarmListener { mActivityControlHelper = controlHelper; mTouchInteractionLog = touchInteractionLog; + if (mIsQuickSwitch) { + mShouldSwitchToNext = true; + mPrevProgressDelta = 0; + if (mRecentsView.getTaskViewCount() > 0) { + mRecentsView.getTaskViewAt(0).setFullscreen(true); + } + if (mRecentsView.getTaskViewCount() > 1) { + mRecentsView.getTaskViewAt(1).setFullscreen(true); + } + } + snapToNextTaskIfAvailable(); mActivity.getUserEventDispatcher().resetActionDurationMillis(); } public void onQuickScrubEnd() { mInQuickScrub = false; - if (ENABLE_AUTO_ADVANCE) { - mAutoAdvanceAlarm.cancelAlarm(); - } - int page = mRecentsView.getNextPage(); + Runnable launchTaskRunnable = () -> { + int page = mRecentsView.getPageNearestToCenterOfScreen(); TaskView taskView = mRecentsView.getTaskViewAt(page); if (taskView != null) { mWaitingForTaskLaunch = true; @@ -118,12 +159,49 @@ public class QuickScrubController implements OnAlarmListener { TaskUtils.getLaunchComponentKeyForTask(taskView.getTask().key)); } mWaitingForTaskLaunch = false; + if (mIsQuickSwitch) { + mIsQuickSwitch = false; + if (mRecentsView.getTaskViewCount() > 0) { + mRecentsView.getTaskViewAt(0).setFullscreen(false); + } + if (mRecentsView.getTaskViewCount() > 1) { + mRecentsView.getTaskViewAt(1).setFullscreen(false); + } + } + }, taskView.getHandler()); } else { breakOutOfQuickScrub(); } mActivityControlHelper = null; }; + + if (mIsQuickSwitch) { + float progressVelocity = mPrevPrevProgressDelta / SINGLE_FRAME_MS; + // Move to the next frame immediately, then start the animation from the + // following frame since it starts a frame later. + float singleFrameProgress = progressVelocity * SINGLE_FRAME_MS; + float fromProgress = mEndProgress + singleFrameProgress; + onQuickScrubProgress(fromProgress); + fromProgress += singleFrameProgress; + float toProgress = mShouldSwitchToNext ? 1 : 0; + int duration = (int) Math.abs((toProgress - fromProgress) / progressVelocity); + duration = Utilities.boundToRange(duration, 80, 300); + Animator anim = ObjectAnimator.ofFloat(this, PROGRESS, fromProgress, toProgress); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + launchTaskRunnable.run(); + } + }); + anim.setDuration(duration).start(); + return; + } + + if (ENABLE_AUTO_ADVANCE) { + mAutoAdvanceAlarm.cancelAlarm(); + } + int page = mRecentsView.getNextPage(); int snapDuration = Math.abs(page - mRecentsView.getPageNearestToCenterOfScreen()) * QUICKSCRUB_END_SNAP_DURATION_PER_PAGE; if (mRecentsView.getChildCount() > 0 && mRecentsView.snapToPage(page, snapDuration)) { @@ -151,19 +229,28 @@ public class QuickScrubController implements OnAlarmListener { mLaunchingTaskId = 0; } + public boolean prepareQuickScrub(String tag) { + return prepareQuickScrub(tag, mIsQuickSwitch); + } + /** * Initializes the UI for quick scrub, returns true if success. */ - public boolean prepareQuickScrub(String tag) { + public boolean prepareQuickScrub(String tag, boolean isQuickSwitch) { if (mWaitingForTaskLaunch || mInQuickScrub) { Log.d(tag, "Waiting for last scrub to finish, will skip this interaction"); return false; } mOnFinishedTransitionToQuickScrubRunnable = null; mRecentsView.setNextPageSwitchRunnable(null); + mIsQuickSwitch = isQuickSwitch; return true; } + public boolean isQuickSwitch() { + return mIsQuickSwitch; + } + public boolean isWaitingForTaskLaunch() { return mWaitingForTaskLaunch; } @@ -179,6 +266,40 @@ public class QuickScrubController implements OnAlarmListener { } public void onQuickScrubProgress(float progress) { + if (mIsQuickSwitch) { + TaskView currentPage = mRecentsView.getTaskViewAt(0); + TaskView nextPage = mRecentsView.getTaskViewAt(1); + if (currentPage == null || nextPage == null) { + return; + } + if (!mFinishedTransitionToQuickScrub) { + mStartProgress = mEndProgress = progress; + } else { + float progressDelta = progress - mEndProgress; + mEndProgress = progress; + progress = Utilities.boundToRange(progress, mStartProgress, 1); + progress = Utilities.mapToRange(progress, mStartProgress, 1, 0, 1, LINEAR); + if (mInQuickScrub) { + mShouldSwitchToNext = mPrevProgressDelta > 0.007f || progressDelta > 0.007f + || progress >= 0.5f; + } + mPrevPrevProgressDelta = mPrevProgressDelta; + mPrevProgressDelta = progressDelta; + float scrollDiff = nextPage.getWidth() + mRecentsView.getPageSpacing(); + int scrollDir = mRecentsView.isRtl() ? -1 : 1; + int linearScrollDiff = (int) (progress * scrollDiff * scrollDir); + float accelScrollDiff = ACCEL.getInterpolation(progress) * scrollDiff * scrollDir; + currentPage.setZoomScale(1 - DEACCEL_3.getInterpolation(progress) + * TaskView.EDGE_SCALE_DOWN_FACTOR); + currentPage.setTranslationX(linearScrollDiff + accelScrollDiff); + nextPage.setTranslationZ(1); + nextPage.setTranslationY(currentPage.getTranslationY()); + int startScroll = mRecentsView.isRtl() ? mRecentsView.getMaxScrollX() : 0; + mRecentsView.setScrollX(startScroll + linearScrollDiff); + } + return; + } + int quickScrubSection = 0; for (float threshold : QUICK_SCRUB_THRESHOLDS) { if (progress < threshold) { @@ -228,9 +349,14 @@ public class QuickScrubController implements OnAlarmListener { public void snapToNextTaskIfAvailable() { if (mInQuickScrub && mRecentsView.getChildCount() > 0) { - int duration = mStartedFromHome ? QUICK_SCRUB_FROM_HOME_START_DURATION - : QUICK_SCRUB_FROM_APP_START_DURATION; - int pageToGoTo = mStartedFromHome ? 0 : mRecentsView.getNextPage() + 1; + int duration = mIsQuickSwitch + ? QUICK_SWITCH_FROM_APP_START_DURATION + : mStartedFromHome + ? QUICK_SCRUB_FROM_HOME_START_DURATION + : QUICK_SCRUB_FROM_APP_START_DURATION; + int pageToGoTo = mStartedFromHome || mIsQuickSwitch + ? 0 + : mRecentsView.getNextPage() + 1; goToPageWithHaptic(pageToGoTo, duration, true /* forceHaptic */, QUICK_SCRUB_START_INTERPOLATOR); } diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 9ea88842d7..cc544178ca 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -23,6 +23,7 @@ import static com.android.launcher3.anim.Interpolators.DEACCEL; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2; import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_FROM_APP_START_DURATION; +import static com.android.quickstep.QuickScrubController.QUICK_SWITCH_FROM_APP_START_DURATION; import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL; import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB; import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD; @@ -59,6 +60,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.Interpolators; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; @@ -979,12 +981,14 @@ public class WindowTransformSwipeHandler { setStateOnUiThread(STATE_QUICK_SCRUB_START | STATE_GESTURE_COMPLETED); // Start the window animation without waiting for launcher. - animateToProgress(mCurrentShift.value, 1f, QUICK_SCRUB_FROM_APP_START_DURATION, LINEAR, - true /* goingToHome */); + long duration = FeatureFlags.QUICK_SWITCH.get() + ? QUICK_SWITCH_FROM_APP_START_DURATION + : QUICK_SCRUB_FROM_APP_START_DURATION; + animateToProgress(mCurrentShift.value, 1f, duration, LINEAR, true /* goingToHome */); } private void onQuickScrubStartUi() { - if (!mQuickScrubController.prepareQuickScrub(TAG)) { + if (!mQuickScrubController.prepareQuickScrub(TAG, FeatureFlags.QUICK_SWITCH.get())) { mQuickScrubBlocked = true; setStateOnUiThread(STATE_RESUME_LAST_TASK | STATE_HANDLER_INVALIDATED); return; @@ -1008,6 +1012,13 @@ public class WindowTransformSwipeHandler { mQuickScrubController.onFinishedTransitionToQuickScrub(); mRecentsView.animateUpRunningTaskIconScale(); + if (mQuickScrubController.isQuickSwitch()) { + TaskView runningTask = mRecentsView.getRunningTaskView(); + if (runningTask != null) { + runningTask.setTranslationY(-mActivity.getResources().getDimension( + R.dimen.task_thumbnail_half_top_margin) * 1f / mRecentsView.getScaleX()); + } + } RecentsModel.INSTANCE.get(mContext).onOverviewShown(false, TAG); } diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index ce65de1e09..c92c8d66b8 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -17,7 +17,6 @@ package com.android.quickstep.views; import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_FULLSCREEN; - import android.content.Context; import android.content.res.Configuration; import android.graphics.Bitmap; @@ -33,7 +32,7 @@ import android.util.AttributeSet; import android.util.FloatProperty; import android.util.Property; import android.view.View; - +import android.view.ViewGroup; import com.android.launcher3.BaseActivity; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; @@ -78,6 +77,7 @@ public class TaskThumbnailView extends View { private final Matrix mMatrix = new Matrix(); private float mClipBottom = -1; + private Rect mScaledInsets = new Rect(); private Task mTask; private ThumbnailData mThumbnailData; @@ -179,7 +179,17 @@ public class TaskThumbnailView extends View { @Override protected void onDraw(Canvas canvas) { - drawOnCanvas(canvas, 0, 0, getMeasuredWidth(), getMeasuredHeight(), mCornerRadius); + if (((TaskView) getParent()).isFullscreen()) { + // Draw the insets if we're being drawn fullscreen (we do this for quick switch). + drawOnCanvas(canvas, + -mScaledInsets.left, + -mScaledInsets.top, + getMeasuredWidth() + mScaledInsets.right, + getMeasuredHeight() + mScaledInsets.bottom, + mCornerRadius); + } else { + drawOnCanvas(canvas, 0, 0, getMeasuredWidth(), getMeasuredHeight(), mCornerRadius); + } } public float getCornerRadius() { @@ -253,6 +263,9 @@ public class TaskThumbnailView extends View { : getMeasuredWidth() / thumbnailWidth; } + mScaledInsets.set(thumbnailInsets); + Utilities.scaleRect(mScaledInsets, thumbnailScale); + if (rotate) { int rotationDir = profile.isVerticalBarLayout() && !profile.isSeascape() ? -1 : 1; mMatrix.setRotate(90 * rotationDir); diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 2a4226faa2..07d8b891dd 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -87,7 +87,7 @@ public class TaskView extends FrameLayout implements PageCallbacks { /** * How much to scale down pages near the edge of the screen. */ - private static final float EDGE_SCALE_DOWN_FACTOR = 0.03f; + public static final float EDGE_SCALE_DOWN_FACTOR = 0.03f; public static final long SCALE_ICON_DURATION = 120; private static final long DIM_ANIM_DURATION = 700; @@ -142,6 +142,7 @@ public class TaskView extends FrameLayout implements PageCallbacks { private IconView mIconView; private float mCurveScale; private float mZoomScale; + private boolean mIsFullscreen; private Animator mIconAndDimAnimator; private float mFocusTransitionProgress = 1; @@ -509,4 +510,18 @@ public class TaskView extends FrameLayout implements PageCallbacks { Log.w(tag, msg); Toast.makeText(getContext(), R.string.activity_not_available, LENGTH_SHORT).show(); } + + /** + * Hides the icon and shows insets when this TaskView is about to be shown fullscreen. + */ + public void setFullscreen(boolean isFullscreen) { + mIsFullscreen = isFullscreen; + mIconView.setVisibility(mIsFullscreen ? INVISIBLE : VISIBLE); + setClipChildren(!mIsFullscreen); + setClipToPadding(!mIsFullscreen); + } + + public boolean isFullscreen() { + return mIsFullscreen; + } } diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 36b9e97aa4..9470635cb1 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -625,6 +625,10 @@ public abstract class PagedView extends ViewGrou mMaxScrollX = computeMaxScrollX(); } + public int getMaxScrollX() { + return mMaxScrollX; + } + protected int computeMaxScrollX() { int childCount = getChildCount(); if (childCount > 0) { @@ -640,6 +644,10 @@ public abstract class PagedView extends ViewGrou requestLayout(); } + public int getPageSpacing() { + return mPageSpacing; + } + private void dispatchPageCountChanged() { if (mPageIndicator != null) { mPageIndicator.setMarkersCount(getChildCount()); diff --git a/src/com/android/launcher3/config/BaseFlags.java b/src/com/android/launcher3/config/BaseFlags.java index 64b5652c5c..e5a8a01f5d 100644 --- a/src/com/android/launcher3/config/BaseFlags.java +++ b/src/com/android/launcher3/config/BaseFlags.java @@ -22,9 +22,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.provider.Settings; -import androidx.annotation.GuardedBy; -import androidx.annotation.Keep; - import com.android.launcher3.Utilities; import java.util.ArrayList; @@ -32,6 +29,9 @@ import java.util.List; import java.util.SortedMap; import java.util.TreeMap; +import androidx.annotation.GuardedBy; +import androidx.annotation.Keep; + /** * Defines a set of flags used to control various launcher behaviors. * @@ -87,6 +87,9 @@ abstract class BaseFlags { // trying to make them fit the orientation the device is in. public static final boolean OVERVIEW_USE_SCREENSHOT_ORIENTATION = true; + public static final TogglableFlag QUICK_SWITCH = new TogglableFlag("QUICK_SWITCH", false, + "Swiping right on the nav bar while in an app switches to the previous app"); + /** * Feature flag to handle define config changes dynamically instead of killing the process. */ -- GitLab From ba8957b3c215cf92376cafbdd52d08c2b0852420 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Thu, 23 Aug 2018 13:37:38 -0700 Subject: [PATCH 0244/1301] Converting ShortcutsLaunchTest gesture-stable By converting to TAPL. Bug: 110103162 Test; TaplTests Change-Id: I788405f2e52cc0e29ebf69e58feda46b408e9eb9 --- .../launcher3/ui/AbstractLauncherUiTest.java | 5 -- .../launcher3/ui/ShortcutsLaunchTest.java | 64 +++++++------------ .../com/android/launcher3/tapl/AppIcon.java | 12 ++++ .../android/launcher3/tapl/AppIconMenu.java | 46 +++++++++++++ .../launcher3/tapl/AppIconMenuItem.java | 52 +++++++++++++++ .../tapl/LauncherInstrumentation.java | 19 ++++-- 6 files changed, 146 insertions(+), 52 deletions(-) create mode 100644 tests/tapl/com/android/launcher3/tapl/AppIconMenu.java create mode 100644 tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index 532d3e8b00..bc5aaeeb75 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -296,11 +296,6 @@ public abstract class AbstractLauncherUiTest { Process.myUserHandle()).get(0); } - protected LauncherActivityInfo getChromeApp() { - return LauncherAppsCompat.getInstance(mTargetContext) - .getActivityList("com.android.chrome", Process.myUserHandle()).get(0); - } - /** * Broadcast receiver which blocks until the result is received. */ diff --git a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java index d7a7f6bbe7..e95801a00e 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java @@ -1,22 +1,20 @@ package com.android.launcher3.ui; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import android.content.pm.LauncherActivityInfo; -import android.graphics.Point; + import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; import androidx.test.uiautomator.By; -import androidx.test.uiautomator.UiObject2; import androidx.test.uiautomator.Until; -import android.view.MotionEvent; -import com.android.launcher3.R; -import com.android.launcher3.util.Condition; -import com.android.launcher3.util.Wait; +import com.android.launcher3.Launcher; +import com.android.launcher3.popup.ArrowPopup; +import com.android.launcher3.tapl.AppIconMenu; +import com.android.launcher3.tapl.AppIconMenuItem; +import com.android.launcher3.views.OptionsPopupView; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -27,47 +25,33 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class ShortcutsLaunchTest extends AbstractLauncherUiTest { - @Test - @Ignore - public void testAppLauncher_portrait() throws Exception { - lockRotation(true); - performTest(); + private boolean isOptionsPopupVisible(Launcher launcher) { + final ArrowPopup popup = OptionsPopupView.getOptionsPopup(launcher); + return popup != null && popup.isShown(); } @Test - @Ignore - public void testAppLauncher_landscape() throws Exception { - lockRotation(false); - performTest(); - } - - private void performTest() throws Exception { + @PortraitLandscape + public void testAppLauncher() throws Exception { mActivityMonitor.startLauncher(); - LauncherActivityInfo testApp = getSettingsApp(); + final LauncherActivityInfo testApp = getSettingsApp(); - // Open all apps and wait for load complete - final UiObject2 appsContainer = TestViewHelpers.openAllApps(); - Wait.atMost(null, Condition.minChildCount(appsContainer, 2), DEFAULT_UI_TIMEOUT); + final AppIconMenu menu = mLauncher. + pressHome(). + switchToAllApps(). + getAppIcon(testApp.getLabel().toString()). + openMenu(); - // Find settings app and verify shortcuts appear when long pressed - UiObject2 icon = scrollAndFind(appsContainer, By.text(testApp.getLabel().toString())); - // Press icon center until shortcuts appear - Point iconCenter = icon.getVisibleCenter(); - TestViewHelpers.sendPointer(MotionEvent.ACTION_DOWN, iconCenter); - UiObject2 deepShortcutsContainer = TestViewHelpers.findViewById( - R.id.deep_shortcuts_container); - assertNotNull(deepShortcutsContainer); - TestViewHelpers.sendPointer(MotionEvent.ACTION_UP, iconCenter); + executeOnLauncher( + launcher -> assertTrue("Launcher internal state didn't switch to Showing Menu", + isOptionsPopupVisible(launcher))); - // Verify that launching a shortcut opens a page with the same text - assertTrue(deepShortcutsContainer.getChildCount() > 0); + final AppIconMenuItem menuItem = menu.getMenuItem(1); + final String itemName = menuItem.getText(); - // Pick second children as it starts showing shortcuts. - UiObject2 shortcut = deepShortcutsContainer.getChildren().get(1) - .findObject(TestViewHelpers.getSelectorForId(R.id.bubble_text)); - shortcut.click(); + menuItem.launch(); assertTrue(mDevice.wait(Until.hasObject(By.pkg( testApp.getComponentName().getPackageName()) - .text(shortcut.getText())), DEFAULT_UI_TIMEOUT)); + .text(itemName)), DEFAULT_UI_TIMEOUT)); } } diff --git a/tests/tapl/com/android/launcher3/tapl/AppIcon.java b/tests/tapl/com/android/launcher3/tapl/AppIcon.java index b7ae9f1497..1c0ecb9339 100644 --- a/tests/tapl/com/android/launcher3/tapl/AppIcon.java +++ b/tests/tapl/com/android/launcher3/tapl/AppIcon.java @@ -16,6 +16,7 @@ package com.android.launcher3.tapl; +import android.graphics.Point; import android.widget.TextView; import androidx.test.uiautomator.By; @@ -56,4 +57,15 @@ public final class AppIcon { UiObject2 getIcon() { return mIcon; } + + /** + * Long-clicks the icon to open its menu. + */ + public AppIconMenu openMenu() { + final Point iconCenter = mIcon.getVisibleCenter(); + mLauncher.longTap(iconCenter.x, iconCenter.y); + final UiObject2 deepShortcutsContainer = mLauncher.waitForLauncherObject( + "deep_shortcuts_container"); + return new AppIconMenu(mLauncher, deepShortcutsContainer); + } } diff --git a/tests/tapl/com/android/launcher3/tapl/AppIconMenu.java b/tests/tapl/com/android/launcher3/tapl/AppIconMenu.java new file mode 100644 index 0000000000..2a03f9a089 --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/AppIconMenu.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.tapl; + +import static org.junit.Assert.assertTrue; + +import androidx.test.uiautomator.UiObject2; + +/** + * Context menu of an app icon. + */ +public class AppIconMenu { + private final LauncherInstrumentation mLauncher; + private final UiObject2 mDeepShortcutsContainer; + + AppIconMenu(LauncherInstrumentation launcher, + UiObject2 deepShortcutsContainer) { + mLauncher = launcher; + mDeepShortcutsContainer = deepShortcutsContainer; + } + + /** + * Returns a menu item with a given number. Fails if it doesn't exist. + */ + public AppIconMenuItem getMenuItem(int itemNumber) { + assertTrue(mDeepShortcutsContainer.getChildCount() > itemNumber); + + final UiObject2 shortcut = mLauncher.waitForObjectInContainer( + mDeepShortcutsContainer.getChildren().get(itemNumber), "bubble_text"); + return new AppIconMenuItem(mLauncher, shortcut); + } +} diff --git a/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java b/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java new file mode 100644 index 0000000000..7b2abeb756 --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.tapl; + +import static org.junit.Assert.assertTrue; + +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; + +/** + * Menu item in an app icon menu. + */ +public class AppIconMenuItem { + private final LauncherInstrumentation mLauncher; + final UiObject2 mShortcut; + + AppIconMenuItem(LauncherInstrumentation launcher, + UiObject2 shortcut) { + mLauncher = launcher; + mShortcut = shortcut; + } + + /** + * Returns the visible text of the menu item. + */ + public String getText() { + return mShortcut.getText(); + } + + /** + * Launches the action for the menu item. + */ + public Background launch() { + assertTrue("Clicking a menu item didn't open a new window: " + mShortcut.getText(), + mShortcut.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS)); + return new Background(mLauncher); + } +} diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 31abc53c91..67106f7eac 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -28,6 +28,13 @@ import android.util.Log; import android.view.Surface; import android.view.accessibility.AccessibilityEvent; +import androidx.annotation.NonNull; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.BySelector; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; + import com.android.launcher3.TestProtocol; import com.android.quickstep.SwipeUpSetting; @@ -36,13 +43,6 @@ import org.junit.Assert; import java.lang.ref.WeakReference; import java.util.concurrent.TimeoutException; -import androidx.annotation.NonNull; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.BySelector; -import androidx.test.uiautomator.UiDevice; -import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; - /** * The main tapl object. The only object that can be explicitly constructed by the using code. It * produces all other objects. @@ -394,6 +394,11 @@ public final class LauncherInstrumentation { return mDevice; } + void longTap(int x, int y) { + mDevice.drag(x, y, x, y, 0); + } + + void swipe(int startX, int startY, int endX, int endY) { executeAndWaitForEvent( () -> mDevice.swipe(startX, startY, endX, endY, 60), -- GitLab From 719eee2be266bd84bba33ce35142b0cad46e40ea Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 1 Nov 2018 23:12:54 -0700 Subject: [PATCH 0245/1301] Create iconloader library Bug: 115891474 Test: Builds everything Change-Id: I1d75702d4e5a10d694eeb839784a629de2f74dd2 --- Android.bp | 20 -------- Android.mk | 3 +- build.gradle | 24 +++++---- gradle.properties | 13 +++++ iconloaderlib/Android.bp | 28 +++++++++++ iconloaderlib/AndroidManifest.xml | 20 ++++++++ iconloaderlib/build.gradle | 50 +++++++++++++++++++ .../adaptive_icon_drawable_wrapper.xml | 0 .../res}/drawable/ic_instant_app_badge.xml | 6 +-- iconloaderlib/res/values/colors.xml | 21 ++++++++ iconloaderlib/res/values/dimens.xml | 19 +++++++ .../icons/BaseIconFactory.java | 2 +- .../android.launcher3}/icons/BitmapInfo.java | 0 .../icons/ColorExtractor.java | 0 .../icons/FixedScaleDrawable.java | 0 .../icons/IconNormalizer.java | 3 -- .../icons/ShadowGenerator.java | 0 res/values/colors.xml | 1 - settings.gradle | 2 + 19 files changed, 171 insertions(+), 41 deletions(-) create mode 100644 gradle.properties create mode 100644 iconloaderlib/Android.bp create mode 100644 iconloaderlib/AndroidManifest.xml create mode 100644 iconloaderlib/build.gradle rename {res => iconloaderlib/res}/drawable-v26/adaptive_icon_drawable_wrapper.xml (100%) rename {res => iconloaderlib/res}/drawable/ic_instant_app_badge.xml (93%) create mode 100644 iconloaderlib/res/values/colors.xml create mode 100644 iconloaderlib/res/values/dimens.xml rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/BaseIconFactory.java (99%) rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/BitmapInfo.java (100%) rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/ColorExtractor.java (100%) rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/FixedScaleDrawable.java (100%) rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/IconNormalizer.java (98%) rename {src/com/android/launcher3 => iconloaderlib/src/com/android.launcher3}/icons/ShadowGenerator.java (100%) create mode 100644 settings.gradle diff --git a/Android.bp b/Android.bp index e3dd5e56ad..c5832441c7 100644 --- a/Android.bp +++ b/Android.bp @@ -29,23 +29,3 @@ java_library_static { ], platform_apis: true, } - - -android_library { - name: "icon-loader", - sdk_version: "28", - static_libs: [ - "androidx.core_core", - ], - resource_dirs: [ - "res", - ], - srcs: [ - "src/com/android/launcher3/icons/BaseIconFactory.java", - "src/com/android/launcher3/icons/BitmapInfo.java", - "src/com/android/launcher3/icons/IconNormalizer.java", - "src/com/android/launcher3/icons/FixedScaleDrawable.java", - "src/com/android/launcher3/icons/ShadowGenerator.java", - "src/com/android/launcher3/icons/ColorExtractor.java", - ], -} diff --git a/Android.mk b/Android.mk index 5614e25cac..9d6e629a0d 100644 --- a/Android.mk +++ b/Android.mk @@ -67,7 +67,8 @@ LOCAL_MODULE_TAGS := optional LOCAL_STATIC_ANDROID_LIBRARIES := \ androidx.recyclerview_recyclerview \ androidx.dynamicanimation_dynamicanimation \ - androidx.preference_preference + androidx.preference_preference \ + iconloader LOCAL_STATIC_JAVA_LIBRARIES := LauncherPluginLib diff --git a/build.gradle b/build.gradle index 476e92bf67..33409c5d02 100644 --- a/build.gradle +++ b/build.gradle @@ -4,19 +4,17 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6' + classpath GRADLE_CLASS_PATH + classpath PROTOBUF_CLASS_PATH } } -final String SUPPORT_LIBS_VERSION = '1.0.0-alpha1' - apply plugin: 'com.android.application' apply plugin: 'com.google.protobuf' android { - compileSdkVersion 28 - buildToolsVersion '28.0.3' + compileSdkVersion COMPILE_SDK.toInteger() + buildToolsVersion BUILD_TOOLS_VERSION defaultConfig { minSdkVersion 21 @@ -120,9 +118,15 @@ repositories { } dependencies { - implementation "androidx.dynamicanimation:dynamicanimation:${SUPPORT_LIBS_VERSION}" - implementation "androidx.recyclerview:recyclerview:${SUPPORT_LIBS_VERSION}" - implementation 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7' + implementation "androidx.dynamicanimation:dynamicanimation:${ANDROID_X_VERSION}" + implementation "androidx.recyclerview:recyclerview:${ANDROID_X_VERSION}" + implementation "androidx.preference:preference:${ANDROID_X_VERSION}" + implementation PROTOBUF_DEPENDENCY + implementation project(':IconLoader') + + // This is already included in sysui_shared + aospImplementation fileTree(dir: "libs", include: 'plugin_core.jar') + l3goImplementation fileTree(dir: "libs", include: 'plugin_core.jar') quickstepImplementation fileTree(dir: "quickstep/libs", include: 'sysui_shared.jar') @@ -133,7 +137,7 @@ dependencies { androidTestImplementation 'com.android.support.test:runner:1.0.0' androidTestImplementation 'com.android.support.test:rules:1.0.0' androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' - androidTestImplementation "androidx.annotation:annotation:${SUPPORT_LIBS_VERSION}" + androidTestImplementation "androidx.annotation:annotation:${ANDROID_X_VERSION}" } protobuf { diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000000..b299cfe516 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,13 @@ +# Until all the dependencies move to android X +android.useAndroidX = true +android.enableJetifier = true + +ANDROID_X_VERSION=1.0.0-beta01 + +GRADLE_CLASS_PATH=com.android.tools.build:gradle:3.2.0-rc03 + +PROTOBUF_CLASS_PATH=com.google.protobuf:protobuf-gradle-plugin:0.8.6 +PROTOBUF_DEPENDENCY=com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7 + +BUILD_TOOLS_VERSION=28.0.3 +COMPILE_SDK=28 \ No newline at end of file diff --git a/iconloaderlib/Android.bp b/iconloaderlib/Android.bp new file mode 100644 index 0000000000..8a71f94ed8 --- /dev/null +++ b/iconloaderlib/Android.bp @@ -0,0 +1,28 @@ +// Copyright (C) 2018 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +android_library { + name: "iconloader", + sdk_version: "28", + min_sdk_version: "21", + static_libs: [ + "androidx.core_core", + ], + resource_dirs: [ + "res", + ], + srcs: [ + "src/**/*.java", + ], +} diff --git a/iconloaderlib/AndroidManifest.xml b/iconloaderlib/AndroidManifest.xml new file mode 100644 index 0000000000..b30258da2a --- /dev/null +++ b/iconloaderlib/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/iconloaderlib/build.gradle b/iconloaderlib/build.gradle new file mode 100644 index 0000000000..d08029386a --- /dev/null +++ b/iconloaderlib/build.gradle @@ -0,0 +1,50 @@ +buildscript { + repositories { + mavenCentral() + google() + } + dependencies { + classpath GRADLE_CLASS_PATH + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion COMPILE_SDK.toInteger() + buildToolsVersion BUILD_TOOLS_VERSION + publishNonDefault true + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + } + + sourceSets { + main { + java.srcDirs = ['src'] + manifest.srcFile 'AndroidManifest.xml' + res.srcDirs = ['res'] + } + } + + lintOptions { + abortOnError false + } + + tasks.withType(JavaCompile) { + options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" + } +} + + +repositories { + mavenCentral() + google() +} + +dependencies { + implementation "androidx.core:core:${ANDROID_X_VERSION}" +} diff --git a/res/drawable-v26/adaptive_icon_drawable_wrapper.xml b/iconloaderlib/res/drawable-v26/adaptive_icon_drawable_wrapper.xml similarity index 100% rename from res/drawable-v26/adaptive_icon_drawable_wrapper.xml rename to iconloaderlib/res/drawable-v26/adaptive_icon_drawable_wrapper.xml diff --git a/res/drawable/ic_instant_app_badge.xml b/iconloaderlib/res/drawable/ic_instant_app_badge.xml similarity index 93% rename from res/drawable/ic_instant_app_badge.xml rename to iconloaderlib/res/drawable/ic_instant_app_badge.xml index cc532309c9..b74317e5f2 100644 --- a/res/drawable/ic_instant_app_badge.xml +++ b/iconloaderlib/res/drawable/ic_instant_app_badge.xml @@ -21,23 +21,19 @@ - \ No newline at end of file + diff --git a/iconloaderlib/res/values/colors.xml b/iconloaderlib/res/values/colors.xml new file mode 100644 index 0000000000..873b2fc5fb --- /dev/null +++ b/iconloaderlib/res/values/colors.xml @@ -0,0 +1,21 @@ + + + + #FFFFFF + diff --git a/iconloaderlib/res/values/dimens.xml b/iconloaderlib/res/values/dimens.xml new file mode 100644 index 0000000000..e8c0c44f72 --- /dev/null +++ b/iconloaderlib/res/values/dimens.xml @@ -0,0 +1,19 @@ + + + + + 24dp + diff --git a/src/com/android/launcher3/icons/BaseIconFactory.java b/iconloaderlib/src/com/android.launcher3/icons/BaseIconFactory.java similarity index 99% rename from src/com/android/launcher3/icons/BaseIconFactory.java rename to iconloaderlib/src/com/android.launcher3/icons/BaseIconFactory.java index cd60de55a8..681c03c7ca 100644 --- a/src/com/android/launcher3/icons/BaseIconFactory.java +++ b/iconloaderlib/src/com/android.launcher3/icons/BaseIconFactory.java @@ -18,7 +18,7 @@ import android.os.Build; import android.os.Process; import android.os.UserHandle; -import com.android.launcher3.R; +import com.android.launcher3.icons.R; import static android.graphics.Paint.DITHER_FLAG; import static android.graphics.Paint.FILTER_BITMAP_FLAG; diff --git a/src/com/android/launcher3/icons/BitmapInfo.java b/iconloaderlib/src/com/android.launcher3/icons/BitmapInfo.java similarity index 100% rename from src/com/android/launcher3/icons/BitmapInfo.java rename to iconloaderlib/src/com/android.launcher3/icons/BitmapInfo.java diff --git a/src/com/android/launcher3/icons/ColorExtractor.java b/iconloaderlib/src/com/android.launcher3/icons/ColorExtractor.java similarity index 100% rename from src/com/android/launcher3/icons/ColorExtractor.java rename to iconloaderlib/src/com/android.launcher3/icons/ColorExtractor.java diff --git a/src/com/android/launcher3/icons/FixedScaleDrawable.java b/iconloaderlib/src/com/android.launcher3/icons/FixedScaleDrawable.java similarity index 100% rename from src/com/android/launcher3/icons/FixedScaleDrawable.java rename to iconloaderlib/src/com/android.launcher3/icons/FixedScaleDrawable.java diff --git a/src/com/android/launcher3/icons/IconNormalizer.java b/iconloaderlib/src/com/android.launcher3/icons/IconNormalizer.java similarity index 98% rename from src/com/android/launcher3/icons/IconNormalizer.java rename to iconloaderlib/src/com/android.launcher3/icons/IconNormalizer.java index 8eb82524e8..05908df99b 100644 --- a/src/com/android/launcher3/icons/IconNormalizer.java +++ b/iconloaderlib/src/com/android.launcher3/icons/IconNormalizer.java @@ -20,9 +20,6 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.AdaptiveIconDrawable; diff --git a/src/com/android/launcher3/icons/ShadowGenerator.java b/iconloaderlib/src/com/android.launcher3/icons/ShadowGenerator.java similarity index 100% rename from src/com/android/launcher3/icons/ShadowGenerator.java rename to iconloaderlib/src/com/android.launcher3/icons/ShadowGenerator.java diff --git a/res/values/colors.xml b/res/values/colors.xml index eb207af1eb..3c8fe1e253 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -34,7 +34,6 @@ #757575 #E0E0E0 - #FFFFFF #E5E5E5 #9AA0A6 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000000..b52bd4f784 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +include ':IconLoader' +project(':IconLoader').projectDir = new File(rootDir, 'iconloaderlib') -- GitLab From 0a926c1d67e63a2b2cdc682b8ae69e06bff8ca07 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Thu, 1 Nov 2018 18:53:42 -0700 Subject: [PATCH 0246/1301] Create a launcher model override. This change disables shortcuts/widgets loading on Android Go devices. Bug: 112904271 Test: Manual test Change-Id: I2c40f87a8f5d752525c99d254693a4e0a9eeeb2b --- .../android/launcher3/model/WidgetsModel.java | 67 +++++++++++++++++++ .../android/launcher3/model/WidgetsModel.java | 0 2 files changed, 67 insertions(+) create mode 100644 go/src/com/android/launcher3/model/WidgetsModel.java rename {src => src_shortcuts_overrides}/com/android/launcher3/model/WidgetsModel.java (100%) diff --git a/go/src/com/android/launcher3/model/WidgetsModel.java b/go/src/com/android/launcher3/model/WidgetsModel.java new file mode 100644 index 0000000000..18f3f9d91c --- /dev/null +++ b/go/src/com/android/launcher3/model/WidgetsModel.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.model; + +import android.content.Context; +import android.os.UserHandle; + +import com.android.launcher3.icons.ComponentWithLabel; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.util.PackageUserKey; +import com.android.launcher3.widget.WidgetListRowEntry; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import androidx.annotation.Nullable; + +/** + * Widgets data model that is used by the adapters of the widget views and controllers. + * + *

The widgets and shortcuts are organized using package name as its index. + */ +public class WidgetsModel { + private static final ArrayList EMPTY_WIDGET_LIST = new ArrayList<>(); + + /** + * Returns a list of {@link WidgetListRowEntry}. All {@link WidgetItem} in a single row + * are sorted (based on label and user), but the overall list of {@link WidgetListRowEntry}s + * is not sorted. This list is sorted at the UI when using + * {@link com.android.launcher3.widget.WidgetsDiffReporter} + * + * @see com.android.launcher3.widget.WidgetsListAdapter#setWidgets(ArrayList) + */ + public synchronized ArrayList getWidgetsList(Context context) { + return EMPTY_WIDGET_LIST; + } + + /** + * @param packageUser If null, all widgets and shortcuts are updated and returned, otherwise + * only widgets and shortcuts associated with the package/user are. + */ + public List update(LauncherAppState app, + @Nullable PackageUserKey packageUser) { + return Collections.emptyList(); + } + + + public void onPackageIconsUpdated(Set packageNames, UserHandle user, + LauncherAppState app) { + } +} \ No newline at end of file diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java similarity index 100% rename from src/com/android/launcher3/model/WidgetsModel.java rename to src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java -- GitLab From f4c42bc79ab0ea3d4e39a20dacd596f94dbff3ce Mon Sep 17 00:00:00 2001 From: Ryan Lothian Date: Mon, 5 Nov 2018 10:52:40 -0500 Subject: [PATCH 0247/1301] Migrate GridOccupancyTest to Robolectric This allows it to run fast locally on the JVM without an emulator or physical device. Change-Id: I416877d7c335a7b9c8dc7a216ecfeb1013f66891 --- .../com/android/launcher3/util/GridOccupancyTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) rename {tests => robolectric_tests}/src/com/android/launcher3/util/GridOccupancyTest.java (92%) diff --git a/tests/src/com/android/launcher3/util/GridOccupancyTest.java b/robolectric_tests/src/com/android/launcher3/util/GridOccupancyTest.java similarity index 92% rename from tests/src/com/android/launcher3/util/GridOccupancyTest.java rename to robolectric_tests/src/com/android/launcher3/util/GridOccupancyTest.java index cbf30b1788..aa51ad20c6 100644 --- a/tests/src/com/android/launcher3/util/GridOccupancyTest.java +++ b/robolectric_tests/src/com/android/launcher3/util/GridOccupancyTest.java @@ -1,10 +1,8 @@ package com.android.launcher3.util; -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -13,8 +11,7 @@ import static org.junit.Assert.assertTrue; /** * Unit tests for {@link GridOccupancy} */ -@SmallTest -@RunWith(AndroidJUnit4.class) +@RunWith(RobolectricTestRunner.class) public class GridOccupancyTest { @Test @@ -24,7 +21,7 @@ public class GridOccupancyTest { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 - ); + ); int[] vacant = new int[2]; assertTrue(grid.findVacantCell(vacant, 2, 2)); -- GitLab From 499a0c932e7f8d3fe8236f9d0e073e693a3a6476 Mon Sep 17 00:00:00 2001 From: Ryan Lothian Date: Mon, 5 Nov 2018 10:38:17 -0500 Subject: [PATCH 0248/1301] Make FileLogTest use robolectric This allows it to run fast locally on the JVM without an emulator or physical device. Change-Id: Idb9c94e6f3fce94a86978ea0709eadd72280432c --- .../com/android/launcher3/logging/FileLogTest.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) rename {tests => robolectric_tests}/src/com/android/launcher3/logging/FileLogTest.java (89%) diff --git a/tests/src/com/android/launcher3/logging/FileLogTest.java b/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java similarity index 89% rename from tests/src/com/android/launcher3/logging/FileLogTest.java rename to robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java index e031f1d34a..096db57f90 100644 --- a/tests/src/com/android/launcher3/logging/FileLogTest.java +++ b/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java @@ -1,13 +1,11 @@ package com.android.launcher3.logging; -import androidx.test.InstrumentationRegistry; -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; import java.io.File; import java.io.PrintWriter; @@ -20,8 +18,7 @@ import static org.junit.Assert.assertTrue; /** * Tests for {@link FileLog} */ -@SmallTest -@RunWith(AndroidJUnit4.class) +@RunWith(RobolectricTestRunner.class) public class FileLogTest { private File mTempDir; @@ -30,9 +27,9 @@ public class FileLogTest { public void setUp() throws Exception { int count = 0; do { - mTempDir = new File(InstrumentationRegistry.getTargetContext().getCacheDir(), + mTempDir = new File(RuntimeEnvironment.application.getCacheDir(), "log-test-" + (count++)); - } while(!mTempDir.mkdir()); + } while (!mTempDir.mkdir()); FileLog.setDir(mTempDir); } -- GitLab From fdd1905e27c3741b6a9c6b4d2904047e21bca67f Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Fri, 2 Nov 2018 17:38:07 -0700 Subject: [PATCH 0249/1301] Convert more tests to TAPL Bug: 110103162 Test: running these tests Change-Id: I76b145eb4d16aca20ce30a5abca8f4568e3297e4 --- .../launcher3/ui/AllAppsIconToHomeTest.java | 48 +++-------- .../launcher3/ui/ShortcutsLaunchTest.java | 7 +- .../launcher3/ui/ShortcutsToHomeTest.java | 79 ++++++------------ .../com/android/launcher3/tapl/AppIcon.java | 29 +------ .../launcher3/tapl/AppIconMenuItem.java | 25 +----- .../android/launcher3/tapl/Launchable.java | 81 +++++++++++++++++++ .../com/android/launcher3/tapl/Workspace.java | 21 ++++- 7 files changed, 144 insertions(+), 146 deletions(-) create mode 100644 tests/tapl/com/android/launcher3/tapl/Launchable.java diff --git a/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java b/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java index 916007607f..9354862487 100644 --- a/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java +++ b/tests/src/com/android/launcher3/ui/AllAppsIconToHomeTest.java @@ -1,18 +1,10 @@ package com.android.launcher3.ui; -import static org.junit.Assert.assertTrue; - import android.content.pm.LauncherActivityInfo; + import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; - -import com.android.launcher3.util.Condition; -import com.android.launcher3.util.Wait; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -24,37 +16,23 @@ import org.junit.runner.RunWith; public class AllAppsIconToHomeTest extends AbstractLauncherUiTest { @Test - @Ignore - public void testDragIcon_portrait() throws Throwable { - lockRotation(true); - performTest(); - } - - @Test - @Ignore - public void testDragIcon_landscape() throws Throwable { - lockRotation(false); - performTest(); - } - - private void performTest() throws Throwable { + @PortraitLandscape + public void testDragIcon() throws Throwable { LauncherActivityInfo settingsApp = getSettingsApp(); clearHomescreen(); mDevice.pressHome(); mDevice.waitForIdle(); - // Open all apps and wait for load complete. - final UiObject2 appsContainer = TestViewHelpers.openAllApps(); - Wait.atMost(null, Condition.minChildCount(appsContainer, 2), DEFAULT_UI_TIMEOUT); - - // Drag icon to homescreen. - UiObject2 icon = scrollAndFind(appsContainer, By.text(settingsApp.getLabel().toString())); - TestViewHelpers.dragToWorkspace(icon, true); - - // Verify that the icon works on homescreen. - mDevice.findObject(By.text(settingsApp.getLabel().toString())).click(); - assertTrue(mDevice.wait(Until.hasObject(By.pkg( - settingsApp.getComponentName().getPackageName()).depth(0)), DEFAULT_UI_TIMEOUT)); + final String appName = settingsApp.getLabel().toString(); + // 1. Open all apps and wait for load complete. + // 2. Drag icon to homescreen. + // 3. Verify that the icon works on homescreen. + mLauncher.getWorkspace(). + switchToAllApps(). + getAppIcon(appName). + dragToWorkspace(). + getWorkspaceAppIcon(appName). + launch(settingsApp.getComponentName().getPackageName()); } } diff --git a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java index e95801a00e..1fea4d5c88 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsLaunchTest.java @@ -6,8 +6,6 @@ import android.content.pm.LauncherActivityInfo; import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.Until; import com.android.launcher3.Launcher; import com.android.launcher3.popup.ArrowPopup; @@ -49,9 +47,6 @@ public class ShortcutsLaunchTest extends AbstractLauncherUiTest { final AppIconMenuItem menuItem = menu.getMenuItem(1); final String itemName = menuItem.getText(); - menuItem.launch(); - assertTrue(mDevice.wait(Until.hasObject(By.pkg( - testApp.getComponentName().getPackageName()) - .text(itemName)), DEFAULT_UI_TIMEOUT)); + menuItem.launch(testApp.getComponentName().getPackageName(), itemName); } } diff --git a/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java b/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java index 436c6991db..4c2c959b72 100644 --- a/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java +++ b/tests/src/com/android/launcher3/ui/ShortcutsToHomeTest.java @@ -1,22 +1,12 @@ package com.android.launcher3.ui; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - import android.content.pm.LauncherActivityInfo; -import android.graphics.Point; + import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; -import android.view.MotionEvent; -import com.android.launcher3.R; -import com.android.launcher3.util.Condition; -import com.android.launcher3.util.Wait; +import com.android.launcher3.tapl.AppIconMenuItem; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -28,51 +18,30 @@ import org.junit.runner.RunWith; public class ShortcutsToHomeTest extends AbstractLauncherUiTest { @Test - @Ignore - public void testDragIcon_portrait() throws Throwable { - lockRotation(true); - performTest(); - } - - @Test - @Ignore - public void testDragIcon_landscape() throws Throwable { - lockRotation(false); - performTest(); - } - - private void performTest() throws Throwable { + @PortraitLandscape + public void testDragIcon() throws Throwable { clearHomescreen(); mActivityMonitor.startLauncher(); - LauncherActivityInfo testApp = getSettingsApp(); - - // Open all apps and wait for load complete. - final UiObject2 appsContainer = TestViewHelpers.openAllApps(); - Wait.atMost(null, Condition.minChildCount(appsContainer, 2), DEFAULT_UI_TIMEOUT); - - // Find the app and long press it to show shortcuts. - UiObject2 icon = scrollAndFind(appsContainer, By.text(testApp.getLabel().toString())); - // Press icon center until shortcuts appear - Point iconCenter = icon.getVisibleCenter(); - TestViewHelpers.sendPointer(MotionEvent.ACTION_DOWN, iconCenter); - UiObject2 deepShortcutsContainer = TestViewHelpers.findViewById( - R.id.deep_shortcuts_container); - assertNotNull(deepShortcutsContainer); - TestViewHelpers.sendPointer(MotionEvent.ACTION_UP, iconCenter); - - // Drag the first shortcut to the home screen. - assertTrue(deepShortcutsContainer.getChildCount() > 0); - UiObject2 shortcut = deepShortcutsContainer.getChildren().get(1) - .findObject(TestViewHelpers.getSelectorForId(R.id.bubble_text)); - String shortcutName = shortcut.getText(); - TestViewHelpers.dragToWorkspace(shortcut, false); - - // Verify that the shortcut works on home screen - // (the app opens and has the same text as the shortcut). - mDevice.findObject(By.text(shortcutName)).click(); - assertTrue(mDevice.wait(Until.hasObject(By.pkg( - testApp.getComponentName().getPackageName()) - .text(shortcutName)), DEFAULT_UI_TIMEOUT)); + LauncherActivityInfo testApp = getSettingsApp(); + + // 1. Open all apps and wait for load complete. + // 2. Find the app and long press it to show shortcuts. + // 3. Press icon center until shortcuts appear + final AppIconMenuItem menuItem = mLauncher. + getWorkspace(). + switchToAllApps(). + getAppIcon(testApp.getLabel().toString()). + openMenu(). + getMenuItem(0); + final String shortcutName = menuItem.getText(); + + // 4. Drag the first shortcut to the home screen. + // 5. Verify that the shortcut works on home screen + // (the app opens and has the same text as the shortcut). + menuItem. + dragToWorkspace(). + getWorkspaceAppIcon(shortcutName). + launch(testApp.getComponentName().getPackageName(), shortcutName); } } diff --git a/tests/tapl/com/android/launcher3/tapl/AppIcon.java b/tests/tapl/com/android/launcher3/tapl/AppIcon.java index 1c0ecb9339..efefc0dca2 100644 --- a/tests/tapl/com/android/launcher3/tapl/AppIcon.java +++ b/tests/tapl/com/android/launcher3/tapl/AppIcon.java @@ -22,47 +22,24 @@ import android.widget.TextView; import androidx.test.uiautomator.By; import androidx.test.uiautomator.BySelector; import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; /** * App icon, whether in all apps or in workspace/ */ -public final class AppIcon { - private final LauncherInstrumentation mLauncher; - private final UiObject2 mIcon; - +public final class AppIcon extends Launchable { AppIcon(LauncherInstrumentation launcher, UiObject2 icon) { - mLauncher = launcher; - mIcon = icon; + super(launcher, icon); } static BySelector getAppIconSelector(String appName) { return By.clazz(TextView.class).text(appName).pkg(LauncherInstrumentation.LAUNCHER_PKG); } - /** - * Clicks the icon to launch its app. - */ - public Background launch(String packageName) { - LauncherInstrumentation.log("AppIcon.launch before click " + mIcon.getVisibleCenter()); - LauncherInstrumentation.assertTrue( - "Launching an app didn't open a new window: " + mIcon.getText(), - mIcon.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS)); - LauncherInstrumentation.assertTrue( - "App didn't start: " + packageName, mLauncher.getDevice().wait(Until.hasObject( - By.pkg(packageName).depth(0)), LauncherInstrumentation.WAIT_TIME_MS)); - return new Background(mLauncher); - } - - UiObject2 getIcon() { - return mIcon; - } - /** * Long-clicks the icon to open its menu. */ public AppIconMenu openMenu() { - final Point iconCenter = mIcon.getVisibleCenter(); + final Point iconCenter = mObject.getVisibleCenter(); mLauncher.longTap(iconCenter.x, iconCenter.y); final UiObject2 deepShortcutsContainer = mLauncher.waitForLauncherObject( "deep_shortcuts_container"); diff --git a/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java b/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java index 7b2abeb756..c39f8d1675 100644 --- a/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java +++ b/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java @@ -16,37 +16,20 @@ package com.android.launcher3.tapl; -import static org.junit.Assert.assertTrue; - import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; /** * Menu item in an app icon menu. */ -public class AppIconMenuItem { - private final LauncherInstrumentation mLauncher; - final UiObject2 mShortcut; - - AppIconMenuItem(LauncherInstrumentation launcher, - UiObject2 shortcut) { - mLauncher = launcher; - mShortcut = shortcut; +public class AppIconMenuItem extends Launchable { + AppIconMenuItem(LauncherInstrumentation launcher, UiObject2 shortcut) { + super(launcher, shortcut); } /** * Returns the visible text of the menu item. */ public String getText() { - return mShortcut.getText(); - } - - /** - * Launches the action for the menu item. - */ - public Background launch() { - assertTrue("Clicking a menu item didn't open a new window: " + mShortcut.getText(), - mShortcut.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS)); - return new Background(mLauncher); + return mObject.getText(); } } diff --git a/tests/tapl/com/android/launcher3/tapl/Launchable.java b/tests/tapl/com/android/launcher3/tapl/Launchable.java new file mode 100644 index 0000000000..7e2c9660d5 --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/Launchable.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.tapl; + +import android.graphics.Point; + +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.BySelector; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.UiObject2; +import androidx.test.uiautomator.Until; + +/** + * Ancestor for AppIcon and AppMenuItem. + */ +class Launchable { + private static final int DRAG_SPEED = 500; + protected final LauncherInstrumentation mLauncher; + + protected final UiObject2 mObject; + + Launchable(LauncherInstrumentation launcher, UiObject2 object) { + mObject = object; + mLauncher = launcher; + } + + UiObject2 getObject() { + return mObject; + } + + /** + * Clicks the object to launch its app. + */ + public Background launch(String expectedPackageName) { + return launch(expectedPackageName, By.pkg(expectedPackageName).depth(0)); + } + + /** + * Clicks the object to launch its app. + */ + public Background launch(String expectedPackageName, String expectedAppText) { + return launch(expectedPackageName, By.pkg(expectedPackageName).text(expectedAppText)); + } + + private Background launch(String errorMessage, BySelector selector) { + LauncherInstrumentation.log("Launchable.launch before click " + + mObject.getVisibleCenter()); + LauncherInstrumentation.assertTrue( + "Launching an app didn't open a new window: " + mObject.getText(), + mObject.clickAndWait(Until.newWindow(), LauncherInstrumentation.WAIT_TIME_MS)); + LauncherInstrumentation.assertTrue( + "App didn't start: " + errorMessage, + mLauncher.getDevice().wait(Until.hasObject(selector), + LauncherInstrumentation.WAIT_TIME_MS)); + return new Background(mLauncher); + } + + /** + * Drags an object to the center of homescreen. + */ + public Workspace dragToWorkspace() { + final UiDevice device = mLauncher.getDevice(); + mObject.drag(new Point( + device.getDisplayWidth() / 2, device.getDisplayHeight() / 2), DRAG_SPEED); + return new Workspace(mLauncher); + } +} diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java index 493f26ae9c..c63822e2ea 100644 --- a/tests/tapl/com/android/launcher3/tapl/Workspace.java +++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java @@ -19,12 +19,12 @@ package com.android.launcher3.tapl; import static junit.framework.TestCase.assertTrue; import android.graphics.Point; -import androidx.test.uiautomator.Direction; -import androidx.test.uiautomator.UiObject2; import android.view.KeyEvent; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.test.uiautomator.Direction; +import androidx.test.uiautomator.UiObject2; /** * Operations on the workspace screen. @@ -85,6 +85,21 @@ public final class Workspace extends Home { return icon != null ? new AppIcon(mLauncher, icon) : null; } + + /** + * Returns an icon for the app; fails if the icon doesn't exist. + * + * @param appName name of the app + * @return app icon. + */ + @NonNull + public AppIcon getWorkspaceAppIcon(String appName) { + return new AppIcon(mLauncher, + mLauncher.getObjectInContainer( + verifyActiveContainer(), + AppIcon.getAppIconSelector(appName))); + } + /** * Ensures that workspace is scrollable. If it's not, drags an icon icons from hotseat to the * second screen. @@ -111,7 +126,7 @@ public final class Workspace extends Home { private void dragIconToNextScreen(AppIcon app, UiObject2 workspace) { final Point dest = new Point( mLauncher.getDevice().getDisplayWidth(), workspace.getVisibleBounds().centerY()); - app.getIcon().drag(dest, ICON_DRAG_SPEED); + app.getObject().drag(dest, ICON_DRAG_SPEED); verifyActiveContainer(); } -- GitLab From 1b4560cf2a680290f2fd4f3b439ee6393c43cad1 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Tue, 30 Oct 2018 15:37:33 -0700 Subject: [PATCH 0250/1301] Adding dummy app apk for tests Bug: 117888000 Test: In Nexus code Change-Id: Ibf0b803c9db6b344ffbe5b7761efb2a2d86867c6 --- tests/dummy_app/Android.mk | 18 +++++++ tests/dummy_app/AndroidManifest.xml | 36 +++++++++++++ tests/dummy_app/res/layout/empty_activity.xml | 24 +++++++++ .../res/mipmap-anydpi/ic_launcher1.xml | 21 ++++++++ .../res/mipmap-anydpi/ic_launcher2.xml | 19 +++++++ .../res/mipmap-xxhdpi/ic_launcher1.png | Bin 0 -> 7239 bytes .../res/mipmap-xxhdpi/ic_launcher2.png | Bin 0 -> 6078 bytes .../res/mipmap-xxhdpi/icon_back_1.png | Bin 0 -> 822 bytes .../res/mipmap-xxhdpi/icon_fore_1.png | Bin 0 -> 13639 bytes .../res/mipmap-xxxhdpi/ic_launcher1.png | Bin 0 -> 10535 bytes .../res/mipmap-xxxhdpi/ic_launcher2.png | Bin 0 -> 8131 bytes .../res/mipmap-xxxhdpi/icon_back_1.png | Bin 0 -> 1234 bytes .../res/mipmap-xxxhdpi/icon_fore_1.png | Bin 0 -> 21234 bytes tests/dummy_app/res/values/colors.xml | 4 ++ .../example/android/aardwolf/Activity1.java | 31 +++++++++++ tests/res/raw/aardwolf_dummy_app.apk | Bin 0 -> 83296 bytes .../com/android/launcher3/util/TestUtil.java | 51 ++++++++++++++++++ 17 files changed, 204 insertions(+) create mode 100644 tests/dummy_app/Android.mk create mode 100644 tests/dummy_app/AndroidManifest.xml create mode 100644 tests/dummy_app/res/layout/empty_activity.xml create mode 100644 tests/dummy_app/res/mipmap-anydpi/ic_launcher1.xml create mode 100644 tests/dummy_app/res/mipmap-anydpi/ic_launcher2.xml create mode 100644 tests/dummy_app/res/mipmap-xxhdpi/ic_launcher1.png create mode 100644 tests/dummy_app/res/mipmap-xxhdpi/ic_launcher2.png create mode 100644 tests/dummy_app/res/mipmap-xxhdpi/icon_back_1.png create mode 100644 tests/dummy_app/res/mipmap-xxhdpi/icon_fore_1.png create mode 100644 tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher1.png create mode 100644 tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher2.png create mode 100644 tests/dummy_app/res/mipmap-xxxhdpi/icon_back_1.png create mode 100644 tests/dummy_app/res/mipmap-xxxhdpi/icon_fore_1.png create mode 100644 tests/dummy_app/res/values/colors.xml create mode 100644 tests/dummy_app/src/com/example/android/aardwolf/Activity1.java create mode 100644 tests/res/raw/aardwolf_dummy_app.apk create mode 100644 tests/src/com/android/launcher3/util/TestUtil.java diff --git a/tests/dummy_app/Android.mk b/tests/dummy_app/Android.mk new file mode 100644 index 0000000000..f4ab582ebf --- /dev/null +++ b/tests/dummy_app/Android.mk @@ -0,0 +1,18 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := samples + +# Only compile source java files in this apk. +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := Aardwolf + +LOCAL_SDK_VERSION := current + +LOCAL_DEX_PREOPT := false + +include $(BUILD_PACKAGE) + +# Use the following include to make our test apk. +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/dummy_app/AndroidManifest.xml b/tests/dummy_app/AndroidManifest.xml new file mode 100644 index 0000000000..0546015a52 --- /dev/null +++ b/tests/dummy_app/AndroidManifest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + diff --git a/tests/dummy_app/res/layout/empty_activity.xml b/tests/dummy_app/res/layout/empty_activity.xml new file mode 100644 index 0000000000..377c56bc36 --- /dev/null +++ b/tests/dummy_app/res/layout/empty_activity.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/tests/dummy_app/res/mipmap-anydpi/ic_launcher1.xml b/tests/dummy_app/res/mipmap-anydpi/ic_launcher1.xml new file mode 100644 index 0000000000..37c8c7387a --- /dev/null +++ b/tests/dummy_app/res/mipmap-anydpi/ic_launcher1.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/tests/dummy_app/res/mipmap-anydpi/ic_launcher2.xml b/tests/dummy_app/res/mipmap-anydpi/ic_launcher2.xml new file mode 100644 index 0000000000..20b2986b6c --- /dev/null +++ b/tests/dummy_app/res/mipmap-anydpi/ic_launcher2.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/tests/dummy_app/res/mipmap-xxhdpi/ic_launcher1.png b/tests/dummy_app/res/mipmap-xxhdpi/ic_launcher1.png new file mode 100644 index 0000000000000000000000000000000000000000..73bc8e65b24153312ed82472f9db5fdf8f7600f2 GIT binary patch literal 7239 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 VegRgqgfajC002ovPDHLkV1ghQ%=!QT literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxhdpi/ic_launcher2.png b/tests/dummy_app/res/mipmap-xxhdpi/ic_launcher2.png new file mode 100644 index 0000000000000000000000000000000000000000..cd40b63c2073bb6c3f27307873cac2b535baae5f GIT binary patch literal 6078 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 E0C`Ft;{X5v literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxhdpi/icon_fore_1.png b/tests/dummy_app/res/mipmap-xxhdpi/icon_fore_1.png new file mode 100644 index 0000000000000000000000000000000000000000..de4079bd2843c2fd01729b162bd5030492ba4c76 GIT binary patch literal 13639 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 b|Kjxv21e%@O_I_t&umg+@}M%2Z@&KnjWfto literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher1.png b/tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher1.png new file mode 100644 index 0000000000000000000000000000000000000000..889a99cfb7a66080761565f59f392ac118243af8 GIT binary patch literal 10535 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 literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher2.png b/tests/dummy_app/res/mipmap-xxxhdpi/ic_launcher2.png new file mode 100644 index 0000000000000000000000000000000000000000..973bb794b27a148c5ca0b9803f6d916e09e5992d GIT binary patch literal 8131 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 literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxxhdpi/icon_back_1.png b/tests/dummy_app/res/mipmap-xxxhdpi/icon_back_1.png new file mode 100644 index 0000000000000000000000000000000000000000..70c0ebd783015990919efde179e4abe3cca1b16f GIT binary patch literal 1234 zcmeAS@N?(olHy`uVBq!ia0y~yVB7%0985qFcb(<6K#H@#BeIx*LB|_}8JF5lTL~1D zEOCt}3C>R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1YQw<567T8a7*cWT%@spI1_KV3 zgX;GT9DD0|FCILzu0?xYl^KJIKNEv9i-8Mm2p+)$0*o{wXyamNSkTVdK$B?|+F-ZS zD73)=LdzhZ!a%z)r=`1DXy@#~om3vo(?7tl#E&Jp%lxMvusmY$boFyt=akR{07-k_ ArT_o{ literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/mipmap-xxxhdpi/icon_fore_1.png b/tests/dummy_app/res/mipmap-xxxhdpi/icon_fore_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d91632113200be7bdff517a68084557e8587e7e GIT binary patch literal 21234 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�K96g5gQYZhWUm(2hOL`j2x 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 literal 0 HcmV?d00001 diff --git a/tests/dummy_app/res/values/colors.xml b/tests/dummy_app/res/values/colors.xml new file mode 100644 index 0000000000..b5ce66e9fb --- /dev/null +++ b/tests/dummy_app/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #455A64 + \ No newline at end of file diff --git a/tests/dummy_app/src/com/example/android/aardwolf/Activity1.java b/tests/dummy_app/src/com/example/android/aardwolf/Activity1.java new file mode 100644 index 0000000000..d4eab1545d --- /dev/null +++ b/tests/dummy_app/src/com/example/android/aardwolf/Activity1.java @@ -0,0 +1,31 @@ +/* + * 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.example.android.aardwolf; + +import android.app.Activity; +import android.os.Bundle; +import android.view.View; + +public class Activity1 extends Activity { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + View view = getLayoutInflater().inflate(R.layout.empty_activity, null); + setContentView(view); + } +} + diff --git a/tests/res/raw/aardwolf_dummy_app.apk b/tests/res/raw/aardwolf_dummy_app.apk new file mode 100644 index 0000000000000000000000000000000000000000..39fb368ca9fe16e9d641ea800fb8bad5499f7f22 GIT binary patch literal 83296 zcmeFYWo#u)5G{7i%*^aHv%TImGcz+Yv)9bNX2vx$ubG*dnVFf{@fW>Bijt=⁢Zl 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 literal 0 HcmV?d00001 diff --git a/tests/src/com/android/launcher3/util/TestUtil.java b/tests/src/com/android/launcher3/util/TestUtil.java new file mode 100644 index 0000000000..1338dcb108 --- /dev/null +++ b/tests/src/com/android/launcher3/util/TestUtil.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.util; + +import static androidx.test.InstrumentationRegistry.getContext; +import static androidx.test.InstrumentationRegistry.getInstrumentation; + +import android.content.res.Resources; + +import androidx.test.uiautomator.UiDevice; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +public class TestUtil { + public static void installDummyApp() throws IOException { + // Copy apk from resources to a local file and install from there. + final Resources resources = getContext().getResources(); + final InputStream in = resources.openRawResource( + resources.getIdentifier("aardwolf_dummy_app", + "raw", getContext().getPackageName())); + final String apkFilename = getInstrumentation().getTargetContext(). + getFilesDir().getPath() + "/dummy_app.apk"; + + final FileOutputStream out = new FileOutputStream(apkFilename); + byte[] buff = new byte[1024]; + int read; + + while ((read = in.read(buff)) > 0) { + out.write(buff, 0, read); + } + in.close(); + out.close(); + + UiDevice.getInstance(getInstrumentation()).executeShellCommand("pm install " + apkFilename); + } +} -- GitLab From fc007479090e3a64d6e24534605fe08e7dc5bc96 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 25 Oct 2018 14:09:50 -0700 Subject: [PATCH 0251/1301] Add StatsLog*Manager for logging. Bug: 113043444 Verification: (19) is our event classifier number 11-05 11:24:28.188 932 994 I statsd : { 1541445868000000000 766293363001 (19)0x10000->1[I] 0x20000->0[I] 0x30000->0[I] 0x40000->[S] 0x50000->1[I] } Change-Id: I75403837f9fa8e51efa012fb708bce7efc9c4488 --- quickstep/libs/sysui_shared.jar | Bin 185554 -> 200647 bytes quickstep/res/values/config.xml | 2 + .../logging/StatsLogCompatManager.java | 105 ++++++++++++++++++ .../logging/UserEventDispatcherExtension.java | 1 + .../com/android/quickstep/views/TaskView.java | 3 + res/values/config.xml | 1 + src/com/android/launcher3/BaseActivity.java | 15 ++- .../launcher3/BaseDraggingActivity.java | 1 + src/com/android/launcher3/DragSource.java | 2 +- src/com/android/launcher3/Hotseat.java | 2 +- src/com/android/launcher3/Launcher.java | 11 ++ .../allapps/AllAppsRecyclerView.java | 2 +- .../launcher3/logging/LoggerUtils.java | 1 + .../launcher3/logging/StatsLogManager.java | 46 ++++++++ .../launcher3/logging/StatsLogUtils.java | 67 +++++++++++ .../logging/UserEventDispatcher.java | 78 +++---------- 16 files changed, 271 insertions(+), 66 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java create mode 100644 src/com/android/launcher3/logging/StatsLogManager.java create mode 100644 src/com/android/launcher3/logging/StatsLogUtils.java diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 6f3fa4be552bd57055bc12ca8b5d80dce8b08dd6..163524e179cad2fcd61593bf6ad85ea896dcc030 100644 GIT binary patch delta 73274 zcma&MWl$wBvn`6dyTjlPgEQ#h?(Xhvba2=V?(XjH?y_-rcNlDNcer!z_s*$$_3GWa zzmn=sx+>L4ua%X|mm`kkBE=O!!GVE+#ZQxCp!{o%0cOq))@Cd&uEwq|EO7*cxc?uc zo$)V#sg=3&KQAfK|GyVt3~)&OoeoZzXw(A*{C~&&pAi2wh(+%I3CL_}XYAslm#`I+ zAxtzh1N;T;v<2wp`vAk!9jXim&oWK{}!u9U5OMFCatiBsZRIe?%m1C z%91;J%FXQs^BIOkykhL4*?jE}!gcETV?Yuf1QbR$KIeSsQUArKxs-nn4%Q#;8Sk+` zrKoBj#`+^YYr?y_29Dd0(lS2Da)koPG(N~0N2**r*XRu&^+V28UULqhB!^fBRiodh~o??6GaYQbz6;Srqs8=GAt;|;@{^}xdH{NBs&kL|l&-K8<| zu(@Vu<>!8e##~kH3zs@I{^NZsj6gMN6eLv5g|$3T1p2yQvI$l)*($r*a#qNBP-fk$i~?u(WuJ?7;kN3+nW}`iAP(mXV z9Bkw>5{I`PdJ3cFjG$Kh)F*}U!=!h9Vq<@HjK^#^OWx8v@ia1~Uqp$P_?~Wz0n?r@ zES0QuWdfDQrCI5|Ex_t2I4{Lw4t7&r32J3Wj?%bMYjJjg@(p-Z_G+>5w;vuub5jAv z>7CGf0of!==T(<*`%C?@D^y&njyQGkGD5E%-W96qr_x5f$#c*TbOVc_5iju8R^+9K z26#?Q_d^uxNpICgw0dZZ_k<;T=h)Ak-U@I8sv0^I*|T<{2Ef}maLajGIE;x$sl%teMm}w$(|;xpev;knAynO8h{B z)=-Xxb*4h)`>dQ5dC9tZ`nSU*I8m~M0D=j1rqx$|W;k-#+M)-#k-EtMkoZs4^>IaP zVqdXVWF||!B_KP+u=*C25FH%WW~`$@YvXI4{ULPv7moM59{GJmKs9BjMk03V{8SY? z9bEcrlV*UQBCP^uFZB@NS>9Ew9*{d-u6UR~9D)fvc z4lCZDU>xYXif_4Apyq7sQrD&Th?Cu4YQ}#7XuC=qBA*T$bnC1=2N4J;QNyz=EHDQ! zaqpWbw1Dlj1ldj1r}LBa(#Q<)M9fclMt2Pi5_NCsX+@se6Zq+cDrqgwk$DJ_**pGj zt{aQaR1Ck$eQ8E!s6!J9Ema5JP$#6{UCTP5!)*+MZYgbPGjQc?*NHgp^^W{EgtKRu zEuT_0UK=PEbiAC6MIM-dpYUq#A>QyGAl#^jZzn&G+zbO1jEyS z`1F9nV`yXdfYR!6{IU5JTblMDS~|~~WX5FG#XDp{f$aQ;rA;iNYL#LijEas?i+2u4 zKcGP(COVpPM!R=tXDIv~TP1oGc+Ktrtm~G9&-CAo=V8>ZwGYx8V8GW?*hy()kjk8* zDX=TLEgUsjUx_z{Lul;KYvMVz%fRY6ei7F!Kf;x_}#;2iql~WrW&M(K#i`K9}0Et~nWzV6{-4k?_qBs>EUB`)215`KnamNLxb_lp#3213`poW8#w`aA-M%zk zU!R)VfkH*%m-fD*H#2Y}5I4Lw4$p(q{B%9EiP1dYaY zK_4QP37B!Vw0o1(ua-LOy^{L)49P0ADMK_LvB1tonR zjtzFT?`HuL#xa`jxg|{~uUNzZk#W|yY1T>Jn1aN8@`2~&F)4xhe*lPN7xvm9)1s`%W(XG{3@O#mtf^!kji$U%*f>TW8BRDLh-i37r9 zV*}kRQ5Wf`&uGWdKZhy7$kolhl$_uF)EwmpUMD(QqvB`BAI~OU4_xyU+xifR88@pr zH!Hf0{IBwhS;o&b7Sa^p!Uub5?E)09D7R&JL47cMOT0Nv;=L*BAoTF4QwBc_4s=P| zFjY_Nlw#d8uejfox!(Xs?*T%qM<8F<7{9}ff2-#x-+Qq83+&1Z4fiwmRXEsHB8x(cvf!5p-Tqq2i9pRs*q^WmI^%Uu=L}sLfi}R_B8PJbl}!n$+fXn zO|QT`pF*7FYo^k`$-Xc~(iI*(KH5{5zeJw){Okqy!VsH3pEx(b(6}#{iNikagNPQJ zyw>BO@zeDE;7JQR`}pfK2*yGgNo>a|B zb!(J<({^=)x#y6@`s~4=GQ-LaUZ5XAfRjWs()d-Xfvau znu#`igPQeN6$lER%K7C25@*`}iyXP)1zzb*4g8pb%&@?zTKyAoXWA zMSbfh=@&G>1DBNFmu-%eOpVooF=3 z!Q`JvJS}Qgaa`iIQ!3AJ5@`N8L#<9@S+ud9Lxgjr$Q(cKF+SS}3V00}L%zS9re>nB zK$!ST;p9?gJ<9>BDxpekt8=s*Z{KcglOBE&mW*Go^Q0qjHriq@(W0uDIb}mkvfxL- z_`-}NLI!N20hm=4rIS25Yo+0Ehq6(m%$b@cdeM7E#-B)Uo2*s@LqF9KKZi!0=hf5O zqQJj?$p~Z#N**O*(&zbg6y^M73k{yvuTX$vmLyf7r(8*)sIgg60qDRpmjO=MGJD-*zLhYFD+VEDN|QX z>imV`SVo^aQIaZUQ#SXToFJ%GIyP53P&c@{?HDHPD!;*Tu-zQ>mw*sGAda!>nowpL z;Q+=km_<27V~+EcPkMLN-hh{O`ILPhl^nOj#gS7`$^R=?9|_np9%R}pU{|v9Uf#@R zVBqDj<_a#vES0wsyz<$*XBJ47bERViluX;D1k9xZC#)t$OCHpi$0DRANQ}tVy6vEGLE?(%J4*%H3q18kzlA@@Y&e9Ody_CadOj^WLEKAdl(EjJ;0-Lzc`@Xn-!6 z1GN@TP}SoEor$Mnll*t<`VO*0O5L|M^3@JJD~AG4A`ywR4@}{>8sF88S;{CP9lyh- z$s>PB5`**}=0*+|ufL#g_-)Eq!U)U0X`yke47?ZIXktYhDsl9bTfKtvyuk++>Sw7qAMx3+ZqwoLoB4Ewf1 zkq*@r=Z})lHh<6Eq8CE4-KrOAC`?+36*fQxOw$M7}nf%M?FA{O|H)nO!IGy zXbgHR+mY995AzWSfep}2`Rm*?e>VE%c2Q*7F{3-njsO;psEuu@?VFO2sC984jE6rn zc!e2I>qA0Mca>i~qrgdM`v1{M=?4BG07^rw=;i?X`LQ<1A#ctR>&&gl@2*f{Pg&kU zu1*zN&xsq~F{E@h^YQz?e{IBkMGxKbZND?i{8ZqKak+_*1#T<#%1tuEwF~|7@#zCo zg6@LTL-Mgt^%ldY>s=oy1A_^$QPNJc)Xi) z<=ENJoMb7$1&nn_+L$>S%L***G0ING7UT*ACLJ~M9>Efhw7W(%C?C(cXQtpW?ryMUz*{1(YbrEg?bZZ{8(h4fq{Axq~_4T1dUHd<4Q z%JKp6kjk~6#DMLBnf{o1!O-yB79#58D#yA9y<;O^y@M#Gv6tlUK%vGtYKZHg7>2DE|TH4S-K^+ka{09Y1sT@ z=DE8+T!0>nw&^;KENTgR7HMRY>p|0NX62$~hwvlm`jh_-lzijLuMj4KB@o#F%7)0X z%2Qdi>ZGVOc91aRl{609lN` z0T)>K*f)wY&t&MLDsVawGKrLOEI?2xiaJh2omMf3Pu%K9({+SiC!8$T1Xqs|{$<5y zI6{-snP06!GHE%_wYMk1@K4D$?sqwJ9S^Ug&0R5Q`CTuzLw4Q9DDf2 zI&M|8Szd7H7V9$K!Ct(=)1tCj55;Mvm0_{*%@@7(;fOKyWGekRumZXG_ zrz-~B60I`i0u>_{jW}@&;EV;$gmW<<`!8d-LNi$?$c{zxBhj9-1LN4|Q`9i_mNlF` z^C`%N1<52iR+Xvg6MG?}6}XL_Wx%HJ=Ecq^oGT}##~h-!eGHijTh-P!*}*fp>T}XC zF3CLOVGtB+FNogroEwF8R7w&u+m^f|eLH1Fgj(}~Mgsfe3jY!)CupnS;piJbbM<3z z|D0sYP1UhMuh`QK?Pvt_j@7Fh3Ia8~Ck5Aj(kxghjrAR`XozY*_7mPk|34-@(aQ_Swl7w$62blDrQq;t=T1iO1i-D&>2L;PnS-8R17*(W+FR6}Cl zTQ`1FBm{>-)_-hI6jt&EsuCV!4+AB?G{S~x2NU}7OiSCKe>2sY@`bE2eJd$JUoDSL zj2oV6@S|89+$DAyC@Jr}wCOwFAxO$M-J>pqj~6?J%}TUStZ-%jqsbKE~6 z@6gKj{mQ!IpW(goEbjffn%M!feC80%Nk_Tu%Gg6oZRX58O2w}MvaU$8^v)w1OemQM z4nSz~wGW?VXYH-LI&JMrgg`P9Y)-}cXiBZrXc?@j z_sn*ltZ5XgAhYZ=FWH)mW@Q%v2Lg8 zybpD)Q153yKTDtrI}TslhXDj4#vZ5}`tN6?R=en`h092$v~nL{NiGIxIyu!kR+-w% zznet70}zS#G?c!zvf$)5oA4>%k49vk(#-n3Nr!I@^eiX9{7%)n5jYr%;7BMph)}~laA!5rhAos z?<6+LMVw1tc_>l5?|~f{A&os^mWG~)%WGR_;!L=bXR)u$t;Oj{xKf&;)WwH5nVD1uJlH&=yA>UQv`K2l7`z?{k36(_brFq=c-%A+Euv3drMrI$5cLgcRgV80RTf%9?&6%Rh*9>7u2p4>IIs zO(!~$1sG(C}QpS2}rzuJ>C%M5+?XVp>q4(x_!h+ z`#8b}RNyn7=^U$jyT*0H;3_`2Ky=K1%tKlXoLNih3lBrIt_t&DB=-w2`-`q$gmeqT z65bDu{+t3HC>_ZDbu`#3Wnmnbs+;VT%md#?8x>fIt#UAT?G$@6SelG1sZ&JkEww%amlHMSSrnG6se<1K~HSuMl$? zY8{K&$+%^QrT6k;iNBEd(62JRFE|Gv&phKF3{uCe}u*s(X{=~55Lb8t@N_$#jvx&B!fq~s4psB149UR z5obBL#BdRj2eq3Ze<}^yQ!ai}sQfsEUl=VZ4Z)7Ti_2e6PkEY6{(wYg;D7!_CfCb6 zAo!M96yj(;EGWXmzxii?il6r{RlYMn=&f)7Z$}>}p`hB~T-2iJqT8gWXFqq}%nDlCs&6tG)xAw- zEl9l`QK6sEb4A|!tcMS3(vwY*IN!=HsGqmh3CNB4U*9E~R zR5^jthGwJ?*BJzB8L*ETMBCTRMuy9Xwhf8)TNvz?5H@e+^O()Qk9gix4@@aXuTNYL zT(~X5cGTnA7E8eT0-0@w%fUf^M*Yqq&esj-ugCd}{bJ+czl#f|t>}fW?Vn>5oS{`n zljGwq!b;`7gi!Mq!l`yG$ky`;rXDJeOlpG7YgnBh(p3xCrGV;rT|Ilp5^RUKR1sx3VkTYK>!X;x;dO1IWzn`Y+b%QuC}IT)v^bKAHvDL=z7fLzJ&M za@@1PC#u)qVnRvEKQ}z?D7Zh;zP3j*GtHh)k3^E@nAkpo+}ck|_40DZTp2#HxLey# zarO2MopS)G=tWy389&_}$-Q|L-JPGiyBu=GtUu=|R9P;L72Tbl1#6NzJzY>8E|X6L zw|)J4H)rxmcCGxV=4z?DX5~@Gtco(X?peQp-COd#@h7c-*KDy~_XX0;d&%t&n)Hkl zbncJzuTSw|9WONrI^sXHUpi8;a|gk$Fdxy}iq~^A<~BzKDf2t#UJ*G*YPobpmZzi` z0wYfEiS9xybCGP*g{i#v40?Tk)2qugLAADL#PLiu?n>EB2|EWdRm= zpD!1BVi>wAOZhq|{}u0q?mM3Ob$i6VO_YLXrZ*VIEmuN)w5zDV?b5Cd4oupd zoB|2}s9i1{+!{sFGt$XTnHUn*@VGQg4z}z9qRv*uwy|8UrMuG4ja9Y6qwZGK@a^p~ zLR%V70bHUc?B?%bQ~S{~fn07;lNP{6UbX-`W(S$Ab1iPZ821$H2Ir2_xMcR;L3&D! zF?98@XXwlk$;+duZX$7ElRNXx8Jtm9NWSeUobk3qrrX(XEoq9{=B&`B%!m}09 zn)!?W>f7tbm$fjjZ{dfpghY*URe!$6rErjk^ZbM#KG3o8R9pHbPb0_HZ|ARW!%wuN z5_AJm^esQ6c`-t2ao2Z2e%DBkd(lHmw{Un#fvH&p89#gxC7`g_jjDgcF{eWwS!~I} zGH*>vd_S8r==-n!qxA)Xzuf<-wUs`;9VHf%A{^te7w394I=>eTgR!wFEjnV^jUzoe zJnTJjNB&R;1$eity!D>2%5@&BoB<<=4V*LM!oNEuU{vmki+oPlp1$}}tB~3jF6T(f zQjfDkm0+*oT}k$CfmEvPTLGbto-ES?OC>&ZZ=kDYV^xR}*2H|X0-i0ZJ^(7!WusqhG`1gbnIkv@4P-FPwf7Oy^FhLX$Nlw zx)tQl`YJPhnX_4VM2Vk3ExElGyZo|Pm!|T$wMx$NklkqWwpcuLPJ(v-!XL(1WewCB zCyPlq+zlGJXhhH*cHKwkzV*FwiLrxx@WJ)!6@YZ?pAnpt7}5%k0o~j10!D7jXb341 z`{<_l`R#U6-gwZZYXPaXG(4#^Ac7sP__pO$;*F|eok{2?E=m!gjca#C#I<|ng0-vo z{haj=Sx!zUx}^F`kdzP&hAo+#b#&h=5SC->#!CYtA5PNcWQ%GmBIO0y$@E*+_iGOk_@AlX-MT6WCd5i<)MvRE9aP z4Xaa1Yttf{Mk+CHS&WuFw9V*bi{9R)mK|)q4J9T!ojCIEgrK>LiQm@2gUe`tCh-i* zuq9*d0YW(hpg|(0*Ov|?bWo^Nh6Ds-%G+Y0C7 z%Dro0Ds&s*goMZ_SEinezM`X~z3WIUjIM-%FUM^Rm>tB`fm*eRuQ1=R=Fa=CMh|LSOjRAm zdU?VwmgCrQ{-BJbSc{NTW!#tu84H2olaLIy29;kxN&GA3lRBH{bY5#KrT0}&zjy#; zg7%$2xJM$+JoyF(sK7X3_1$WU@w-KbYCs_$_TGya3{MUI?`5^1mBV~7#`G{-r$AN) zRBYQi<>;HP-&CeSyu3zZT7C4+Z!^$Y@o2GwSd?ud;a240j^ayGI!S%|neg-0Tk&OO zDHa>R=S4HN*)&#i;`lfzgCiYQel|%s)ewvncARf=g#K39IH;2Q*<4}lRRr|?@tgC~ zv|(X@a84P!>cM67VOJZ-$hO4LSPBir7c?3$sMwqnh2W+RsR$*!@nL??QQiX)WqEmI zqe323!b3thOwY>rp7#nL6%_(pmr}eM)pK^l+PB86+~|2@>Q7J`~}79cq+-reg9<*gtg2&&(FY#(-C# zsL_5&Z?;kvE=7NN$&X*4psvH%st}Qkni+joprG*<8Uc?=c&a&C;LQ8#%N_h>aemn^ zq;K4j#Qjutio%VoQwNOn9uSHc88H#5#d7{4l$m2*e0kxacTj9S(% z6V%ekj_oGMm&j@=-wJrgItr%(&Gfu5z!8ig&^*PX~$@qoqSJX|cr9R6F8*4fuX*N`1J(|1KgL*(c zGCbCQZ27EW>CSD5c9zc15VFN&vARMv;TJ+DJmC^=Q8ACSAnzt=1!flayM8rKDAww0 z_m;QR)bzwC{or4`Rd0@FkOW&%>$SM>LTNSnGhaJKsqv{q&czZa#6AKnA!F8m#n#phvu^xRNA%j2SKBSC=EVyOPse`vB0m@}@Sm7UH#+|E*@QoqkhjyYb z_?_y;LdSf^T%cRKWZ>$t&v*HiB?WoZ!6gs!Sw>0&)5mIAs;I$DaQ&bH@GFEj=(l1J z;5gy@C}Fez5lv5`m6m*SFR4R+i)abUjmFZX7W7!(1oGmEn_0Xp@xVFA^hk;#%&el+ zXlPT{V%cD+@5EXjxlCCVK~JTk z9Is0^6}IGudl$c9KZ3m_gZ!pQ)K*2$jX_EI)C}j`M7OP7FT`)%pwB)(amP%UlT3Nq zjEggsUxw~%RRlU(#y~S5c@npE!Qu_))vRt{PmI_&?q8LI?2Jox3_;PYf|sTk6ehDt z)l~`~P}W`*u(iCWy||@3m`v9~ml%%reCC`5!8?gKY1I(>5zkxC1V}-|U4&sH3i(S} z$(9%r2YENS@)$l?VC-|6_)PWv)H+8J6G%L)~@^<2<6A{?o) zNyz=9RGTV01QWbEH`XJBx3V#dlfx4&ip;rra5u;RsJ?3Jv(r7T5`>u=nRa-#h?H9f z=A#@RiC8^^c~f!m5xOL}06uxgSt_ywRX(4(Ij?=8x=MJi9^PGE*V-1!Je|3LX%Vz^ z(lUxOQ3^@!rFnUAwBm6qb3EpL|f=#5Z4 z@)KnfC}Ty$3;8kwQ(aKVR7^dDygKN!h2Wj*+h+|ds}nspL@004{uZ5r)+H#r*OQiU zpPU>rQ3?Bp%0i#49>{P`@mLQMH2#WTEk$@^G2EP4H68;O8Gp zjvCWKOFU#lLLA(V7&OTKK%uqV)u3Dl`mR7fVT$Qvbf$b}@@K)h<~b1_Aez`1Z1p!L z@&O&@8$P_TQ&2;fTS{pxtD6!UI}6|p*rb%yxClgNL=kkE_G<8YWdI3(F&a;d72%-X z`3e+W954HG2JYTvT_cCM6T&w}veq-=)>(udbUtV|qwWy@#<}n*TnZEW6@WE&W-4t8 zYrGD&*SV(jA|<$aA4T*pvtL<$lH~2BMj`Zs%sR%n+m zPOI%M;q_#(V`R2W;`V3&(A9*E%{J@gI~RNyc5M}K6; zR@sKUU{Ftv9e*}hhv|+vWoH~hSpeInuAz&1^n5Jo# zBFcU^s{IF?eUc0d$=1oB(xo_;qky5ApBjzhBefh8^z0{bj;4_z>F@KDz>BSkg4RFb zd)Q}N`92AIH$T~Zli_Pd8xZQf0dp5||EH_fB`}DNlwOETZd?e+W@jHSq^#^ZWfk*} zV6vKp#4x6Zw$~>AGn~y2MlDffD38MbqH3|Uu*bWp`c*DPj=e{x8efCIKhP(o*3~%_ zUCPtyk^)40h&l-3Mz->hzi(%CHkV zh-*(@v;Hij%mlWBKW!fgwg$$w9TD1m1d5{LHSGtoEQj*nW@nCZFF#>k$d!-PNJ*iZ z#TY|w*4Tv1zp)0jJ9ThnT7tQZhiK=m%Yjw1@R84kEqlJQF4{C)B4T>wsjsM5{Gy4m zB5e4AHR@wU#n@l;l&qfihG)2Y$;>}R`K@7w-+v_k5DjGT6s!Qu$t~y!kPERIF*Qt* zy%9Bql$z;>UucK2AGM1VBnof9jYN;0-A(awp||R7Iy)7~;aNU$ghzds%ex3F_+*rP z-w7{NWrs_qc)p!^#S`%+W*;0H!qoG40DR=S=iv=p5Q-H)Nc0&O?hD2d1z{JA zb~fWZae z4Uh}ZUv#kkoiOjg@h3#x#t!7z4y?O3D*v1CM{GkcYVd`C(qn$vms3=)3F+`F!;^7V z?_e|O0sPzU!^~i+H3(CSCp=xpRZ2X*ty8*6*E`=imgVA3-?nkxRIamK$H zs0(kbg4XnzgCTzA>Tu-S7jdtY(_ih_us;KE zqZ{CKY{(&k)tPOI>|Xg;fV0bt>G~- zPb=i#z?qC{YC-yb;ag^P_0wFOKz-ZO8frdmClLBc{c_|c$bfM(9kHd1bkYH&UR0lU z_Xmq#UL4$?IL--tc-Mt?1h)^KpNI`f} zh2Ck^&Z6a_83$9Kho(`-q0wbh;Qx#mr z>*DbbDmd2CXjb90?24GY4U)dAYy>exw(ogW1|fIK=vgnmJq6IeEJSbtsy~P_GjC`d zO>r&uEYl)&(felV(OS*d_Q`bv#9N>u?cj0JF~VqSRA?;nwX}*EY%7@?irCE4Q4645 zyQn7AjUZHcj~mH>(a9?Vo}mw2f58H*tBxG3v-|`ofv5zRb=+%|ZD5-y(4F70-Hn(Z z^N_ru?@E45*dI;EGmM%0c-C+q0~)ktafA{ zz!HDF8e;nvZ%VohS2NGknM=c7>H%kZ!%Dr+offlWF_eH$Jr(shd|jp@&q+;p3{NZk ztuJ6ZI@vl4m^fUL4VO0Iap_kUG+gnqDz_Rgt^S5i&aBa#*t!0yA8NQZMC~!tbiAZi zf)1#X5hbK4otulCwkZ{guE8iZ6(UD*obEm@u0I5uKENwDK$s7^Dv)Hm!vLk@-qin5 zAV4{Up#VaZ1Lf?KV`PP$Dlz zzxEqKO11V`dTZvWIf7eh@$TIYbTBij-K$f;tis)qJ6N|t9XX}F;qkhuwrL;S3O!pN zd%M5@w!`j7A9Pxu+Yy!}I6-IKoIUM&TW{{NI6dyZ@ztB4`qg0;6S0Y&g=#ltbw4{1 za9@HZ1={FHg;@ZAyB4iT*Y0bv$9?A!Qzi#^V8e22UXlMykNL_TuA6cHD9yXszuqO- z9)Lf*)G6OQC)V`4zmQ0Ou2Qh1BmZX<<_!>caZee_39a%*lVgu;{TffigNW}MN-&nj z3H~#N;To%EXrT>#W*3J)TK9(0>xSrZ_|5~3Wmmc@sPu+BXNbWAv35_OD@N1Qh|v08KwI_QcCaP6$ME4+a!0 zwscH0pr|7!=ZeS6lu>Aj(yPirSf#%WV{#)LE<|9~p)c@8yE`@0fq`9T%~Z%&-5U%{ zlWKM)*lfeDopr7VMC|rR_*;$w-9{KYhd>l025wi9j1`ory==vap4C z98@$!3*%jo?1`}r)?!WGn>7=PGdHj=0AF%EAe|!(+L|~Ug<7ug{y3SNkp7&owo0QoIx$(_vG;cft8~0$Oey2v%r48>x5ybwuEeNMJ!NfL2lpja9 z|IRl*Xw{8PZ7Sl6l*t;hej>-iwtX8^ZnUUC$oMm}3T?EKs@+8B(#QiY!38%fX2Z@+ z?1!Ri# zwNL?{GQ-F3{6!0LQhx?GG7=A;e6{^{z%yV98c&HBQrxvq=Ujn92KO2z^}Y3|?(n$U zds2n96|nA4xU}S^1qWoR+9~9v8!GapH%-!L*#J6~kQJ3b?IQ6(h(Ccv^A?exQ;u*% zej^R|8uN}67PqDN)|)P1{So6Fms{|ucP$e{O=s8aBE8yUQ0fI?6}yF=Y4XXmh0t7< zNF(z$6`1WYJ4bVh3$&CT_m)(x5nJqY>!fT%xdC%kin|T-QLJGcd|bI!OOE`siaW7y zaPCO+3nm^`(#s;FZr_0`KeHcW;wNA8=e_$pQ7;|bwRBE~Ag8*Y)d_mJ_((QmL*e-M zbpY;yKn%dso{eVl6F2ks&cUV4X;Ye;`)kvCk_}Q^_D8$P)c~P*Uq?z~Ng7slj_tfZw97ZA`jgK2EbN zf|NfdRS`J9+#LtsdsFlgE!;3ng+STnF%q&d_zOQ)E#$-l3;4V5`&JQ=vv&V1Rb}rp z-vOVNO1E7e=$;IG$MF@IFV1}<6WRuKLT`#!j#9QcN-QaEtQOvoGcXa+{tDk)iF<&p zN)jnYE#SuAFAOT^11SwCZkQXL$0t{2o-C!W!GFAo zuk~q4-*L9w{BpZSM!AuXxn)wgv7f%aYI}!OeWyXaC7!-9?8^D#;`J#YF{TJb<#c|I z`<9S4mn5?alC7C0t)9PIBxkrwql3}HikR2R{e(^1+;qX|e}F?SCb zyL^Lk2qe;$6&!Tu>GZ@AJ|!}x0lDS##n+Y*Cq%yb-Rmrx#UM^eP@5{z9*|a41EX&@sm`%Kn%-F z$~N_kHu((CWG$k290eJMC+P%f>q1(t=Y?j}8jR`j({;u{gdRK%*F4`zsz4L6&*8w=C#oWwo!?-Q59Sy%x zU{<+))j=q-ck*B550)+R9rLAx9HH@8v7Fw-w$qV|Ul!w5PRqVKm^<-ORLg?>1itYy zi(878Is3yrvDAM+#Vpg%bqa)94IE=!3Abz=htwJqQ+COjZQ?DNWPto|tTTDEjH-)h zvX;9-qVM%mck?%@pIQ22;k&R(~WD+Sc66xCUo*}fF8PCGFwM2_SgO!^c$|JyW@`sWpBZD zg!ZfFJMCi8U5~)DE0=)mi{P9BeT7A`axDrEr{L`wiO%#|=P=z7qx={bVdsY==Z3_T zV0`v9!aTmJx7nou2TJ{IJoU*@P zXy2Th|DpA2B5-Tmz=MEz;QiNPo^FQypS7B~9t^dej2|=s5xAdFC7l?+%EG{(3zWKd z#ByODa#P76ieeThkck)1AQXG~q3|u)g$pKEdJkI8l`M((n3(2YqF5U3>T~XqbvHZF z-chLL{7L}mn|JZIFPd@w$>lsOM{|kfIhyNfaW3kY`*(t>f6_JWq5VQm@_C;RqlefA_(kt<4dV+;w}!Zc1ixmhJ}QU=9t|WO86mrW0(FLYhY()63~{|Q?=z8xqd#Q#JQ zIRz%&F%T549l{q>4Dx>t`Og^If0$J{Niz;;npk5%5B{h1vEL>y*ixP(ArO}kwxXUt z!AM9*1{2y9RKOrag)DL+*#gx`d6_qJF5TN9yQ5BAtaV0}HzC z-JsdsU071eUn=VcGrywbtAgpv# zj@kqluf3|dIW~+HCMU<`e?sG%Oe!NsZf_x)uHe}Iyezi&S7FU!%l=tE?f0vUQ}_QA z2m4At;J~59ZN_y8TJ{=u8*&mM{i%gsp}O0|U|G*yC$Of~Zu`|`wPF`&a93sSx9~{t zN`STExB?4dL8tD}3pDMT>N}-R4|*4|tmn#6X|R5Ka-L|fZo`8rl{j0@oo@_YjGeJn zn{PgVJTTRI65z`D*}2((_hjn0S6la%cfk?#<~L~A*Tl00FQX~v(P{r)oXYV~r(Kn8 zU)wV8sNXqX(G#eJak(2ujNBK}b^wcdAz}ybu!;!QOgRXy4s`GWlEpAkNB# zP(|E$u#eHf(VM^&5fUor7Q(P06wP#m7kbF!2OBv_avIf4#htKA>6W@Dr;@&aDFP$vJmm@ zOfo^_2uMAy^edr!o)>T~K>=@EQ7wHB5I8pYV_h^+vb{pikc`r*IOls8VVj@l)-Q3h zBsn^FmtT9J7SK4#&Q2J{_j-^ z3v1y_8{(Va`K?S>k_CtO)**qUUpj)KCL4g_Bp2)>r89ScL8b>~g5tLKvukOOzX6``lTkscUm@7_5r^`HZ_g$|OKj6R5JGAv<1Gy22X**6nTeo%0 zO(uD(ZMwqFhcl&!r)p97;7FRkTfk%As*7i9-ld_plF5}zrIoSg>bYOJxOA5a_ttq; zO%-&iB~Q_A-hJ$q0_v@OmrLN~Ik{?7?<>BA+wg^M26*M6y9#M$<35s~zPiV=YNf=P z^Q~^z?Je^RHM*$+|2EDSq12B&6}6gA%?pL-4bpejNPZj90dUPZwIBI&jA43eyyDVnXDlU2~vE}j^`9^B-vb}c`j|iH;WZnf(qI_~7-+&c@ zm%xCv5CQ>xVNO^>*qmpe6QKbaHp1~CpVmC(^6+O!lG(ajien2NxI|wf#<&B1sDx1S z5AZBD2tmn$04UJiQ{Lc$Ym(;K2=fYiW=hcxoQU?%@A&=Ce-8Bl)~DZp`vRpWqJsh2 zHzmQ=WD>!!k-lpP5EBPGCJP4#3tO{q=O^s{3iSVD#L?No)xp@!{Cf%?=l?MEzZ{|d zD+geJ|M{-}^~wMCf&w_0nwd)5JG!}wdbyg3x|y4sIV*gdME%FWz!Tn6O|$jOAvbe^ z-#H1v3QC4DkmQ&JM+%($7^46=sRaNiOt?)6o0y(pX3mUcqY|zhN7%*5P|(k*=5zjA2kTUpBf`vQo5^Iagz>yP9;R z|I-mXz0W)zpyB-<|9QOLJ6iJB-TvImPo&SFe&+{yg98USAS3Uc2jkbl7)21YKPeKr zN{6`%fP@b%92&Y}0HEOPRG%F=4hSvjQWh28rZ-m^8kq{F;x_zX^lFHe$#spr8Yq=b z$F7++haTV{N{&>>`dwlppe0qxm^E$2gC>*=hlHtA8ePVGqDBd7V2rC+~0++13;;b0~IcI6-pp!0T!Lolbp&aT!I?UuI6&FRnDe}uMlk; z%1579){&A-yO#l#s$yYRPD1wFS;Tda<&GQ2HE?Y{Fm$$`G>9)$}FocJ(ANF_gy6K`SQK zIwW+^E_S7M!PUc#KR1r5bu&*+N73WSeWi@F()Fs!RW3SIRiM|~B)^UWF4R7@Wbp?C z-!qB~PzR0XYIXNofnf>rT+TXVan+SQX&ZZjyn`XLZFZM&=y1Pn%<<)??p)gSAJX+C zov8h3%ft-kat18|%Jsjwk@SVvKfxF`3nYuW*TlR_D)LVJlxrmwOH{R~7^qUjJggUX zYR91LqfB9+3_HBZ1{=feu1fH{lHIAibx?I!f##3)6zi^O^$C2dmK(O@b+A@ksQmPP zs$FZ$at&RP`{o+5tON^?<>H9eNac@^e}h_e5R-Bey?1;?3o~-o%SSsbT1NdC?K#Sp zq(Ph15AEmKBGqz~Fl+30FgDOCx@<`MR(DfKdIjU0bYyn^( zf%Udtl|9UD%-OYkcvRCpT{s~_jGWa6Mk;(uc`KToj7+)-%PLNSMs?raEa$cmw>MXL zTWgMdx25Z{zgeoiI}qyYGcDDn6B1lCv=*5^u4xX&-hLSfB1v#jtn+mFz$|C%&9PM^ z@Bg}%b9JiGmcN}qsfE>7w4SNdB26;J2bQ`JqA6FKs0cl2jj8cE7&Zk=h*CzwjIuCf z#aZd1-PI;?gEt+8!KO@Jn1J{=a&#LGE{f3>GEs5ICif&VlT@EyJQ$~uS*2KOEOEtz zF*!&i$Ect0rp&&dU!TuhvxA%G3$nJb7K<~iHC9M9gDGu8Y9R?J*?Ui@KmxQSi7gTQzLX`#22P3j$@ zgp3d#dWv4s-PM$(&>*=a;MWsA=65h->4R3OrR$A8v0|bDe;n7id>F$ibDGpcKZwGP z>FA1UmufO;=|K~3kZz=p=EIH?0`whh_-k2zwOuOiCfMWs6KTBT$N8?DnvJw0OjVDH zV^1Ea8hIkg^m{p=I_jaL;Bd-QSR9>zR>3Gym4G^20`rxSDmwf_ zc}?U6i(8g_$y@4w2B5XZ2|_A;S9hH?LfY$-TfJbz)y1?7o+CV#A6e+3`g$3X|Kn+)uUA8Mg=<3ZL*@C4rmao;k9cTw;iGFRk9vLFnq11?V zarUel?}gFv8gaK$CCQDfvan?-#Ci9cwNV)%phix{4z^4Aj7c8xiw|*>Ba9q&P_ia{ z2L&zMJ800daW{Pyc>T*>9>K#g2M$e!eEN((nn$7u)qyoPii`5mR@XaZluH<`(A2eI zS~CibW(S)V$2YzO*}NyTt1C@fJgJ6caA9|Ku`xo)exzEBR3C2#XTp@D*F9C46S*w% z{bZ8tg)$3wd-Y|NjPitX%~qeGY!qgxo-&rWqq|j3&t{?o*bTe2OZwbl-1dqon2`Nf z>qzCN##$HbwG<`VIooxb((V1Xwk(*!{%q)k<6^VTmEGRT=9`Fn9!K82m}$>oUV{0hI~Kx?yatM^$jqV%jT49GY|MT-r$as( z+^z#H>kob+GRO%+EA#pWQs9V=b&RMjVY)#xRY7mkv~0RTG1Wmm)rdwwOb+3IHQBhe zSU0TKktoImLj&?)1P>l%g5izYS z;07FF=L|a<>{|YAku}3XO#cD(-R*iA(o2l8*d>WC2i9q;L4pp{E ztV2A20o*(ZNj2eMkisZTzkxAWZu;Cdj9T=|T?CA-0XG~5hD9tQj03IzL{|h^qSahV z!HE@ke#_JkQc_C%8+Od+>`Ssu{wa$O5(HumO21#;m4ILg|6{OuVwVV4^uWB^D4(Pv zNE!Vesd$|S;Rcy<{oQVwZpZY7Xp93(?iKF<2-yJdk}$&WT8wB#FN%~#94ukF5Mr<$ zBcK)A+wsF^K1|Sdgs%a|!?=6?qCot#qS6KZhSkk|_}fl#Kp+s#+13{eQFeyI%H*dd zjG62|q+;gZL_s&$mllfpZ@Dx!G?yT81A))RVAlYeYpyl-0;xKf7kb@`z#mu#rCfnI zz|otr?&HIU((2Cju;GlC3I1n4>Qe~pUm7Joj`fjZlq%=Ulmgk|uD19k&-)Q#RjI5z zqJWO4O#X~=Ru!f&nzOm!*B5T)8$8vlAz!OJ0_c-ZmQtFT z^b^&ifgU0xsSF8N)e#v1gz|srmu(BeK;wZQy8BV|2FC#^9YM|sL?h7T_tNMQ1@l9{ zWd9X{$|3$J;C~`Fe<@U!jaZ-zohrr8nSdIwlG(!0#vKM9vbRbF5@bVWdRHUVLXfN4!c z!ScThuy6-j=0U3R_5(b2ATb@Y{KkpPW)OcEy_G42#?VPf+9EGWm>kM=fcip)zR=3t zy2*`kF=Nyh!0nA7^aK(2g}%PD9qUxE9Z3)f28D!LwSY{g(QGiIa_-8>Ac> zinYBmdo|WXFdDm`3TZ!vA*{k50!}NR18zZH1o2-$dpt4BUPvbI$mGW3QHB(iqVtVe z42GRQkbOL^yhy|>)4o@O2Z(U(4$ zx>jSj=kT+E*v&O{M?z4iE--m0*DjO}LjJJO{-KdCKPK;VA?|ojjyx*Hfp}UWdnPoW zme-OzlTPScp=cag3N6!zVhYq)%8Il26nPz80e5Roac7a$K_s})Cll3h*lNs()8DT@ z)wmI-Rm<2{Ws3~4S6;!q#yiRLI3b%1^wto`Qkaq*@Jm$5Se2vs0g?bfM(^?$4F0Eo z|MS47+4gSJBMQ3uOYbbu4>~<}Xp61`z+RI(TGTvqMn8M;7&#j%LB&NIW8g5_7d-Vb zu56`iaLya3av}&ODgI@Im)rF?#(bhzfgSq`?*QDA79TwzyR0ywE;zl+gmq@XjUAo? zeFUs(3@$5ng&i8N0&1%g(I)1TmgU#Vno>t1%H{ExVMB*0C)2>&-5?Y6)>+F|j zGw0fm$?3#ecR>PODpu6SqbJVBts3iHN_pYx#@P;$w^*Ph?`qV_vD^BG6`rCqBpikk zi^r+t=lrla3&%wdDC9;MnYdE!6bDNGVaWB=`9af(k9OY>)45yqKX3X$OA`2z4$s>; z&U<@Wg3DC=5VXcBTEmmgc*>7w8~P+%-ltaph`gOu$0^DV>lkJi ztG9|ETtWtRmymo!7$KJ*46tvp5#nj5jr9pc%tO9fWnQ`9^@JKyF{G|-{`-xobU33kckV%!=vt# z;6z%Bo+{zd=5j^6lH5dzsD;X0Kq(Vt2}DFGjS>UxVbs;Gu}4hn((`B7ZqXW+0JrnQ zw~J14C1|%x$uRTM(?#XX;dyP_TO237`eeHYKV3_ti;o_yy;SD1~Az>u+0^w#K%(Xh0_ee#Ps3Qn#Lg0M4qiVPVuDD_xKeSZ} zH_Cv*&3D>P8s)<@i_mNsS#U$AW9b&JX7|hRUVoU9Ph}gHrZQxH4!XY4R-M~?_3-D9 z8_~?!3Tq|Ko?QL&p!ZQkO}&NWXF8fvrZyfe_~N#3;4;|1EcYE>oCi5!deF=%scEq^vVD&?D$gGfuP+So4`Y4fpVf@2oJLkfz4Jy+R`2ZHG<4n@) z@Dz49H?@E(-6mBYDZi@y9NNI5vWy+Vfo9e&v3*c1VkM_-6k*RYF%Hh~g{w=jLyom@ z5z?N=qb}MjPWcRQej_Ve%2!eZjv2p2AG`I6!Rbd4e=-PRnUM5H@RbHI+>2ka%y0m^ z@D7th!MM?bbd~AhJ>{xBLm0SKUs0c=rU_78Q0X*yZ=ASO{C7zjMLxBF*L?a;!?m7D z73hQ2=(?Dh4sB+f=_tznWj$Fu$>MqNfNKUq*DTqb~^DW{5gEE1?vFSLY2CeGr!nyhBC8Oi-&^-~i_ zlk`PZqLi-~OkMV71Rs2u>p1fk^^NKXCK~d)(aPE|-AyozX0U3dpk|XQ5GiJ9Q*D#m ze`$RI{-TvhidYzEcW`aPVXWv!*=NX+N$ZSQFng>7_6b)Ef(Dsw0+Bj4+&bSVowC&u za#}{P#F481i}fu0&#*eyZQZ{%qKS(!qmwgQWg(5)oshXQ)uRVBM5TRpyg3Auhcv{# z(0i$O7I^rg&jF)HVj~C7nEg#{_jpY`bwbZa`HOL)W@IucGid|}TKIQO;}_4jex1K% z@4wq9sP`k1fdmpTG$yI1(QCjxWVN)BH+=k4nqR~6JoSO6mG8>_p zGF*RB*fD7ZEH!rHT4kWxX}WNzu!``75|9Snm!huH!VADTHO;8Mv9}q;a>WVijgL8- zQ-YP_lty^3e5@4k20G{imFpnIPCWHVfs9Igkz8jY4eIA&X|I7p&>3LaGf2 z&!$6xb9&@JGqY8%IMN~VOtOcX8Ai1{&Kz0eneFV*BsInE^io*I!h{>b1M zf>24}kZf}4rQ)6?M@iwRWikFV#p15V87f~jZ+L1F#6UTW9`CNJ6Q%x0@tW?L;lhq$J0` zHhthgl$QHz8hm@S7LD;rsttwSP%c;%WDQ!~$dD9aTS#Q7Mt#sYgttV-`U-8E-UcQT zTH@E^-S9h>&@!#jWue-lAnEU3;)*tyPW>H>kcloeV<8-1OQ_exRw1$4pRVCyOs+-0 z{2(45Vv`|Pvc^~gwnKuu-};hb8rI^}&@!;ic=z0xEC*J-#nApgFZ`)Lepyy;NzZBO zS?yW5<3+}zcDtC4DlA^WHqWIRbOv-tP)qQpk)goByec7vJf;YnfyE?S~w233m|sGGY93UW!gVUwel8B6PdyDG?(E zZ#W)XQ{TM9n72{xS?lt|+@QonV@$xdqd}Uw!PP+Gmm1g9t<#>gAhlt1!!wYdRIYqW z`U*Oh&2rVngMX}8s)EsIxcbXpwALGu_iw3$)?*N`{~x1{KoAVu?rSi|(4}|~!_aDf z{kIG{9SQkFc?<$39n_Q=7K}L*4rU1iF+m)2VDn9L{=&qRc7wzj9`Kva1n?VEUm2T} zOY9E&C|@-W2ZX{j;1X7&d5;A?AXdu}V=b^HYh1LdHB6kII2ggcWJk6m?FmihmO1?H zCnyNYfBMeEYM2v@-+4L%{$DtCn&|&;cliG+BmdJL*7NdJTlxEy$K~;qZkog#$P61I z4vR*bEn%7pF;5(QnGFYEm4-^nbVcie_N7_cz>g+;GG3TV&R$o4U_z3au1*sGQKyV6f(M3rJQ5- zN}HI=;2-}@ot)413YmPG`H?gMFXw+em! zXbTh>Yyq%NaP8pC!0K_>Y$>8llx7){)l2`&QlzVye#l5c@06l~&}l)`_;5f4z43epp+GeMdxc|(rTm^FMtkMbd7+QOM78Bz|DReQvgC7D7ljW^Yd@FPUfk#-8U z^r0K=K^N04ENh63izAc|Em13_fK#IQz!Tt8QBAikPMyi;_xgt-+CpASz~yyx>6F1b zM<`x6HY6xatA!3FiZU&1vl}?f3Bnm4UrvJ%4LZ`Iq_SfVU!5y>h( zCHhRH*ziLa-)h)VG{9zSI3$Uuu}tZGQHg(O&bwTyMZ62fV$LecEe2>GJF2raT+DaW zC}wNtF?D81jf*$qIP-mTxjT^trKh1qjnWWi>H>o(Hdg0wR4{Q*jx8Ju64*+)E`>F@ zT)4aI)bh*dlyVgY>O%L?k?!p+;iyYTck|{$Vs>{w5q@>E5K4zwjC7R>T&~2jmEcQyU4}!PcaZ(m^8XiG^!ld$;s-aL`W9ZhBW<=n1Q}3w7jsa)#NQ8 z@8+u=gS^x7pd!)Q$=FMB8P?Y?Ty1C}7|z{juRK>j^RtS)i~%wR6?ZwQ3lw*D6yg-F z1@uPe;apu4qg%prAQ=0b`<#c(^Z4X@eka0H&-$Sfors!jIM!e9MeKy#$4q{!nCWXX z79{k)T}v6XnyL-dDAqbcT+5Z=`i&c-Z_CEb`G5OFhc}>hCk;y3zs|`%|7;^Zk8Nf% z#kq;Mh>hK?y#v)YQ6gs(MY`G19bzak#p_^P94uAicD3q8JP)v7x(;|$F3G_{VFB`y zfZ6I*$bKT+xN+f|uozw(mOxXClrn{&-tT;LNn0j{F}Y_w zp2<_t=O1k2#H56fhhfFyl*k^=F7diB*;zPYY~J9v`N14iMKTjHGAs`pR4dSyxPMX? zZIWmi#LQjq&MJxr`_%dkMDqsq3M`^XbEjgQV<&Wq?PZcxzo(IVhK`=FC!(mcYMu!^ zSu^~60m?~}k{NTWo)J*soRdnHqXY=59{&3C=f_f+mZXITZ=_`-iDIlokRnmC)d+Uh zD8P!7Araf8dB(PkM0M@OY0TE@IjIF%-ph`;m~BS6#KZZMnOP&Nb>TjQGwuBsb0w8u z)y&m9j**Ji&759=YxQdBx5QXidu=Fh1x>~K2N1_*_EJ83T&o^-VLLrfGwoP!iDp6S zR+qq*mk!rw!zb64mqqS!)u?}Et8A$_ab9Ta=q==P!+uTjP21OjS4b}E>Fw)50VVll zjPT{B$yN)(lAx5$3PtTr`!%dfhwgN?OXK-Wp$F2hMu0P-*?J4TP5p1|U;B<8ciNm( z+rXjB79IG^HpitmuSRhkaJ>Up-0*q`4wg@T$vERrH!dQjKXwToiW@ zCD|nNZ>``S^%4#@6Lq@G4C`gO^=KcC^b~Z=@=#*^95v@m0!|>6RPZ^PZyBtMantgX zdp4D43EgA3%F^YSCFwRTQ@C|>8{n_>X7S*W0bX?L>HcX0QuxdIv-?3okjSyhYZ zJw=P`dCr2#=W>5CYXf!Jq|{SeWs+rn9%-=Es-IW$-(uw5o7rC#kYYG2Vy4y=YoxX< zVXDI}VGh-N`Mq{pJEl_3W429=)7ok3sNssY(*7u;6bXK=g-&CV0ssXB2W=Wui zWj#6j_;heA3kvLR?x4g`%C(1ot~QtT@h$F78wt2h9BQ|sRkd)zsn0YzYO1rRRai%o zSCKAMNwKpu%BZi>UCHsPQB*YmDr1zgv|GcnP!Bq)T$^MtWQ%eOrTDk?R#ph&$8`Xa zj_MJ2S;N`no5xkCnqAY?`ao<%j=A_YhgA(b9Xru;l~jAP;3`|w@R%YOm=!;UF?C$Y z)~Y7yjT%}_YF#z6>ZVvFb~&Kz^32Usn<$~w&#yj1mL3C;nTtm;Ky zN|%fpLuZ;~b@p_njLbLnqD$t!v-B zwce1VnCn-kOhPzTgDBLunTb4(NW*xmC7UXj*wf^*rOAL%mM2|5@`cjWuV&cL`^TU7 zHZhbf{vQ0mZImdnW4d<#6&xF>;!d&!sUni)9Sq7CR?W5Ot;5Dx5=J_SlS>NjtWD9o zbJ#1wd11#8UcTW4b5XlGT7ha=#j<1=jFn~~hxOEm(mlMV>e;+s;vskD0V|c?>oD3Z z+PTcBy!KNadB>)x{@av}kJLNH3Yq2#TF<>x-zOY!V|62!7@?wW?likdYOToizK4Jo#Afnb5l8W&bMMt1LN+*Y-M_y!u;H=tK#7@==MJc0grE!dv8WGJ z5QKRQnE!sk9eXZ3exQ;nb%!5+LPe#^HAO*q&Oxzm689*a1 zmmRLX#C|Xzk3Miy_TzZpLB&mO81zIIH%J3X9L`14gcD6Z_d(Z#I245;h{8P)p2+d1 zyhl@|UaXM0iR|Shg_dO-&2XDZR+%(q9FN*Pb+K3w?~BRxM09VJ;ASNe)WR?OrAR9` z@jnp9K_J6Iy4}_F`)O`MCp@})i>D*NPC@GHR=MmZvcr6@J7keD#1X| z#1Jm6+>p)gebLBPT*R6{EE2RnYkG~*8#mu?;1o&eR`T3`NKx3gBZGW{U79hCoj($+ zx&)JZ9*$}Ajrg1iQyMr5yse$QA4?jLvw2zv4^4%jKsT`?R!a(aP6HAG0Y)55@!2(rfL`S zgTNJsqXB+eRTKyvI&(}`zykF}#e)I1+rtee;)y4(LV^aFH%NR>LW7Tccq!EU^g7y_ zB!e*U`hjT8cjAepx)GAymy!!%yUh<19{CtlZgeDnpXv7|PrrnF+@1dOE zixl!}YrhfWq>LO<)zdbkAoNVRFnH_%A-Z`_DWI2>@t`%|ZRver19})a%QD<$STw&^ z;FmGzQ&JVU;tGd51T+=Pbd(MZA4aAU0aO)WlLW1`AikosLA7777*i!N&byMHEpTyw z;1&v88sR3854%GG%jjZefgL1hvQPz5#xg-#t&*fl%^rs|AHB5V388SbGd<~euCQUL zL6E6*L~BxQCm#`LAd$u`zF@jXO0J}z`F$0TrzD&QaXqIL8h6#ZWLRcw%IE^kLckokE7mlnLO$nTe}g-3>ro601LyWr7jB`+btt|J5}te3D+Mebx^}zt&jJ+uwd^RYX)OR z8X-N`{rXbGs(~_eK^j4^`N{B1FRcjh2$!YFM;qBVWsM|6Yw`xQ9m3KTsZoSb;Id!D zn=;>drii8_o~#T|Wlk+K;>?W?WhbbvAT+WTrkWYRU`N}s#H=fXcLbjqmS2w0XUFq7 zBYm95=NALI+%eCjQ~rd(s%l7jn?ke2fLa2<4<%sK101u4ry9clNTJe4(nBwRTW^35 zu1JEC_7E`cxIodKx4fne{YPGgx=^0+1{?J!7n|+ZZ+fKf`r_&j0I;7jew8{%WQcF% zY#3!{ZDvR`8I&qC;0Zap-iUOa%lU`rFV;0t{qq_Swx8PFh$xEASMyE0+2MATL)BYJ z3#CTxz}DVcZcY>8$!J|9r}>chj|TogCk0v(cl}|Oe+IUUu`{YFqT!!|sDEQ^IZ>nm zjDg9Fq1lYV>7o@St=JL_6=fPRrJOmED0;#dEcu&_2|5iqyiPQujj>&^aK`ju^T@cg zF8@-2>@i{Bj>c%YB!IElAFgFB4Op0VM$}sch+~;r|R`4>GbhMUu zVN32Y#RS~pb)w)`BjT<+6>A3#6 zauGa345=uvFIr+VKKjf^Pc9yp&k7yb=D46etX1vMBZeXC3no5<2Jz`O{C8~yVS z%UKw;&gqC=en9wGsa=6%3lAu+y=}o{lpp&5zB;~BD2IO|T_og`x1%0X%K^t|8=3!s zi|r1Hq;*u|FxL!I+s!=H=Ma<3>>j-0glqqLcvqIO_ZE|Hm08zZqni(5K)pIJiX%(M z!zAD*gvX|os*QNAKxk;Uve`~?YEh?0@>}R$-cS**q&$n@J)bW{W)gwm3h72-X*2-% zd)et;vDYFsErKXKIZv2`Vj&;Vkhv6@T;o|s8=8^1iKK>5k z9|Y4P8@I&V;oKuzPQhtKLYxYaLO^8r%!>>~2mv}a9p#pkaZz_%Nzr2JjE)KwK-hI%WoYV%YXxri|?E%HWuc!-{$yk*+` z3Tn$6c5ZP|lN@de{lUFnX?q9l^>=*FMxOIG^SOsfx}_~+4$pk6FZ$g;%o|swxyqj` z-r8KUAuBNtf>3cJHOUalIiF;%o7GZkvZ9)uw8*g6h|0D=U^Z+Nu zY3DM=(i1B78%s^;1m@{E+vn}iCs!9N=mkFq#hHd=nFl)24XmW%d*=rRY+i(U%bqW4718g4lQ)V$^UY;yHHfiiFCva|azq*+qQH59J$ z%#p`ws5;7qnzmlDXJ~1t-c5nLThxU%Nm?Y)69}$ey1!MloC<}VP8o`8QOoAl^oK&b zAUL#KBIwq$$Tf8C;P;i_4%DYTm>%pN{j5F^e0z+ylUm4t?ZjF%2XwT_T4osYNbaLZ z>NLq z29q%BseOCBf8N~{)g%V%mY-hp)(y`#eQuCS9HkM-VnSuVpO(7opzaY?Xn&I(HAthE z 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%0A9=ZgWc*~DJj^~}(w`rMO~sLa?yQFu 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 diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml index d8ca1c47c1..3fbfcdd6c4 100644 --- a/quickstep/res/values/config.xml +++ b/quickstep/res/values/config.xml @@ -20,6 +20,8 @@ com.android.quickstep.logging.UserEventDispatcherExtension + com.android.quickstep.logging.StatsLogCompatManager + 3 diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java new file mode 100644 index 0000000000..2f411efc7b --- /dev/null +++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.quickstep.logging; + +import android.content.Context; +import android.content.Intent; +import android.stats.launcher.nano.LauncherExtension; +import android.stats.launcher.nano.LauncherTarget; + +import static android.stats.launcher.nano.Launcher.ALLAPPS; +import static android.stats.launcher.nano.Launcher.HOME; +import static android.stats.launcher.nano.Launcher.LAUNCH_APP; +import static android.stats.launcher.nano.Launcher.LAUNCH_TASK; +import static android.stats.launcher.nano.Launcher.BACKGROUND; +import static android.stats.launcher.nano.Launcher.OVERVIEW; + +import android.view.View; + +import com.android.launcher3.ItemInfo; +import com.android.launcher3.logging.StatsLogManager; +import com.android.launcher3.logging.StatsLogUtils; +import com.android.launcher3.userevent.nano.LauncherLogProto.Target; +import com.android.launcher3.util.ComponentKey; +import com.android.systemui.shared.system.StatsLogCompat; +import com.google.protobuf.nano.MessageNano; + +import androidx.annotation.Nullable; + +/** + * This method calls the StatsLog hidden method until they are made available public. + * + * To see if the logs are properly sent to statsd, execute following command. + * $ adb root && adb shell statsd + * $ adb shell cmd stats print-logs + * $ adb logcat | grep statsd OR $ adb logcat -b stats + */ +public class StatsLogCompatManager extends StatsLogManager { + + private static final int SUPPORTED_TARGET_DEPTH = 2; + + public StatsLogCompatManager(Context context) { } + + @Override + public void logAppLaunch(View v, Intent intent) { + LauncherExtension ext = new LauncherExtension(); + ext.srcTarget = new LauncherTarget[SUPPORTED_TARGET_DEPTH]; + int srcState = mStateProvider.getCurrentState(); + fillInLauncherExtension(v, ext); + StatsLogCompat.write(LAUNCH_APP, srcState, BACKGROUND /* dstState */, + MessageNano.toByteArray(ext), true); + } + + @Override + public void logTaskLaunch(View v, ComponentKey componentKey) { + LauncherExtension ext = new LauncherExtension(); + ext.srcTarget = new LauncherTarget[SUPPORTED_TARGET_DEPTH]; + int srcState = OVERVIEW; + fillInLauncherExtension(v, ext); + StatsLogCompat.write(LAUNCH_TASK, srcState, BACKGROUND /* dstState */, + MessageNano.toByteArray(ext), true); + } + + public static boolean fillInLauncherExtension(View v, LauncherExtension extension) { + StatsLogUtils.LogContainerProvider provider = StatsLogUtils.getLaunchProviderRecursive(v); + if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) { + return false; + } + ItemInfo itemInfo = (ItemInfo) v.getTag(); + Target child = new Target(); + Target parent = new Target(); + provider.fillInLogContainerData(v, itemInfo, child, parent); + copy(child, extension.srcTarget[0]); + copy(parent, extension.srcTarget[1]); + return true; + } + + private static void copy(Target src, LauncherTarget dst) { + // fill in + } + + @Override + public void verify() { + if(!(StatsLogUtils.LAUNCHER_STATE_ALLAPPS == ALLAPPS && + StatsLogUtils.LAUNCHER_STATE_BACKGROUND == BACKGROUND && + StatsLogUtils.LAUNCHER_STATE_OVERVIEW == OVERVIEW && + StatsLogUtils.LAUNCHER_STATE_HOME == HOME)) { + throw new IllegalStateException( + "StatsLogUtil constants doesn't match enums in launcher.proto"); + } + } +} diff --git a/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java b/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java index 6dff187ea5..4392851c0e 100644 --- a/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java +++ b/quickstep/src/com/android/quickstep/logging/UserEventDispatcherExtension.java @@ -34,6 +34,7 @@ import com.android.systemui.shared.system.MetricsLoggerCompat; * quickstep interactions. */ @SuppressWarnings("unused") +@Deprecated public class UserEventDispatcherExtension extends UserEventDispatcher { private static final String TAG = "UserEventDispatcher"; diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 2a4226faa2..d34dc5b811 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -167,9 +167,12 @@ public class TaskView extends FrameLayout implements PageCallbacks { return; } launchTask(true /* animate */); + fromContext(context).getUserEventDispatcher().logTaskLaunchOrDismiss( Touch.TAP, Direction.NONE, getRecentsView().indexOfChild(this), TaskUtils.getLaunchComponentKeyForTask(getTask().key)); + fromContext(context).getStatsLogManager().logTaskLaunch(getRecentsView(), + TaskUtils.getLaunchComponentKeyForTask(getTask().key)); }); setOutlineProvider(new TaskOutlineProvider(getResources())); } diff --git a/res/values/config.xml b/res/values/config.xml index 5e83ab7666..4ab22741c6 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -84,6 +84,7 @@ + diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index 7b565273f2..77b6010c26 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -28,6 +28,9 @@ import android.view.ContextThemeWrapper; import android.view.View.AccessibilityDelegate; import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; +import com.android.launcher3.logging.StatsLogManager; +import com.android.launcher3.logging.StatsLogUtils; +import com.android.launcher3.logging.StatsLogUtils.LogStateProvider; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.logging.UserEventDispatcher.UserEventDelegate; import com.android.launcher3.uioverrides.UiFactory; @@ -41,7 +44,7 @@ import java.util.ArrayList; import androidx.annotation.IntDef; -public abstract class BaseActivity extends Activity implements UserEventDelegate{ +public abstract class BaseActivity extends Activity implements UserEventDelegate, LogStateProvider{ public static final int INVISIBLE_BY_STATE_HANDLER = 1 << 0; public static final int INVISIBLE_BY_APP_TRANSITIONS = 1 << 1; @@ -72,6 +75,7 @@ public abstract class BaseActivity extends Activity implements UserEventDelegate protected DeviceProfile mDeviceProfile; protected UserEventDispatcher mUserEventDispatcher; + protected StatsLogManager mStatsLogManager; protected SystemUiController mSystemUiController; private static final int ACTIVITY_STATE_STARTED = 1 << 0; @@ -104,8 +108,17 @@ public abstract class BaseActivity extends Activity implements UserEventDelegate return null; } + public int getCurrentState() { return StatsLogUtils.LAUNCHER_STATE_BACKGROUND; } + public void modifyUserEvent(LauncherLogProto.LauncherEvent event) {} + public final StatsLogManager getStatsLogManager() { + if (mStatsLogManager == null) { + mStatsLogManager = StatsLogManager.newInstance(this, this); + } + return mStatsLogManager; + } + public final UserEventDispatcher getUserEventDispatcher() { if (mUserEventDispatcher == null) { mUserEventDispatcher = UserEventDispatcher.newInstance(this, this); diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java index f5fbf80dcd..152dc84d01 100644 --- a/src/com/android/launcher3/BaseDraggingActivity.java +++ b/src/com/android/launcher3/BaseDraggingActivity.java @@ -200,6 +200,7 @@ public abstract class BaseDraggingActivity extends BaseActivity intent.getComponent(), user, intent.getSourceBounds(), optsBundle); } getUserEventDispatcher().logAppLaunch(v, intent); + getStatsLogManager().logAppLaunch(v, intent); return true; } catch (ActivityNotFoundException|SecurityException e) { Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); diff --git a/src/com/android/launcher3/DragSource.java b/src/com/android/launcher3/DragSource.java index 93f865c9f9..d4d7b99fd4 100644 --- a/src/com/android/launcher3/DragSource.java +++ b/src/com/android/launcher3/DragSource.java @@ -19,7 +19,7 @@ package com.android.launcher3; import android.view.View; import com.android.launcher3.DropTarget.DragObject; -import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; +import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider; /** * Interface defining an object that can originate a drag. diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index 15a9f2e06b..cb354a6f1c 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -26,7 +26,7 @@ import android.view.ViewDebug; import android.view.ViewGroup; import android.widget.FrameLayout; -import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; +import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3ae9a49e70..3a38c0fbc8 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -91,6 +91,7 @@ import com.android.launcher3.icons.IconCache; import com.android.launcher3.keyboard.CustomActionsPopup; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.logging.FileLog; +import com.android.launcher3.logging.StatsLogUtils; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.logging.UserEventDispatcher.UserEventDelegate; import com.android.launcher3.model.ModelWriter; @@ -1609,6 +1610,16 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } } + @Override + public int getCurrentState() { + if(mStateManager.getState() == LauncherState.ALL_APPS) { + return StatsLogUtils.LAUNCHER_STATE_ALLAPPS; + } else if (mStateManager.getState() == LauncherState.OVERVIEW) { + return StatsLogUtils.LAUNCHER_STATE_OVERVIEW; + } + return StatsLogUtils.LAUNCHER_STATE_BACKGROUND; + } + @Override public void modifyUserEvent(LauncherLogProto.LauncherEvent event) { if (event.srcTarget != null && event.srcTarget.length > 0 && diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index fa07d4d75c..180ca48166 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -33,7 +33,7 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; import com.android.launcher3.graphics.DrawableFactory; -import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider; +import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.views.RecyclerViewFastScroller; diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index 1c4327c499..4ef86265f5 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -40,6 +40,7 @@ import java.lang.reflect.Modifier; /** * Helper methods for logging. */ +@Deprecated public class LoggerUtils { private static final ArrayMap> sNameCache = new ArrayMap<>(); private static final String UNKNOWN = "UNKNOWN"; diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java new file mode 100644 index 0000000000..d332dc5ce3 --- /dev/null +++ b/src/com/android/launcher3/logging/StatsLogManager.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.logging; + +import android.content.Context; +import android.content.Intent; +import android.view.View; + +import com.android.launcher3.R; +import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.ResourceBasedOverride; +import com.android.launcher3.logging.StatsLogUtils.LogStateProvider; + +/** + * Handles the user event logging in Q. + * Since the AOSP Launcher3 doesn't take part in the StatsLog logging, the class + * itself is abstract. + */ +public abstract class StatsLogManager implements ResourceBasedOverride { + + protected LogStateProvider mStateProvider; + public static StatsLogManager newInstance(Context context, LogStateProvider stateProvider) { + StatsLogManager mgr = Overrides.getObject(StatsLogManager.class, + context.getApplicationContext(), R.string.stats_log_manager_class); + mgr.mStateProvider = stateProvider; + mgr.verify(); + return mgr; + } + + public void logAppLaunch(View v, Intent intent) { } + public void logTaskLaunch(View v, ComponentKey key) { } + public void verify() {} // TODO: should move into robo tests +} diff --git a/src/com/android/launcher3/logging/StatsLogUtils.java b/src/com/android/launcher3/logging/StatsLogUtils.java new file mode 100644 index 0000000000..647f255af3 --- /dev/null +++ b/src/com/android/launcher3/logging/StatsLogUtils.java @@ -0,0 +1,67 @@ +package com.android.launcher3.logging; + +import android.view.View; +import android.view.ViewParent; + +import com.android.launcher3.ItemInfo; +import com.android.launcher3.userevent.nano.LauncherLogProto.Target; + +import androidx.annotation.Nullable; + + +public class StatsLogUtils { + + // Defined in android.stats.launcher.nano + // As they cannot be linked in this file, defining again. + public final static int LAUNCHER_STATE_BACKGROUND = 0; + public final static int LAUNCHER_STATE_HOME = 1; + public final static int LAUNCHER_STATE_OVERVIEW = 2; + public final static int LAUNCHER_STATE_ALLAPPS = 3; + + private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5; + + public interface LogStateProvider { + int getCurrentState(); + } + + /** + * Implemented by containers to provide a container source for a given child. + * + * Currently, + */ + public interface LogContainerProvider { + + /** + * Copies data from the source to the destination proto. + * + * @param v source of the data + * @param info source of the data + * @param target dest of the data + * @param targetParent dest of the data + */ + void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent); + } + + /** + * Recursively finds the parent of the given child which implements IconLogInfoProvider + */ + public static LogContainerProvider getLaunchProviderRecursive(@Nullable View v) { + ViewParent parent; + if (v != null) { + parent = v.getParent(); + } else { + return null; + } + + // Optimization to only check up to 5 parents. + int count = MAXIMUM_VIEW_HIERARCHY_LEVEL; + while (parent != null && count-- > 0) { + if (parent instanceof LogContainerProvider) { + return (LogContainerProvider) parent; + } else { + parent = parent.getParent(); + } + } + return null; + } +} diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index a318dc0eb6..e11516890c 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -41,9 +41,9 @@ import com.android.launcher3.ItemInfo; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; -import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ComponentKey; @@ -62,10 +62,9 @@ import androidx.annotation.Nullable; * * $ adb shell setprop log.tag.UserEvent VERBOSE */ +@Deprecated public class UserEventDispatcher implements ResourceBasedOverride { - private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5; - private static final String TAG = "UserEvent"; private static final boolean IS_VERBOSE = FeatureFlags.IS_DOGFOOD_BUILD && Utilities.isPropertyEnabled(LogConfig.USEREVENT); @@ -96,42 +95,19 @@ public class UserEventDispatcher implements ResourceBasedOverride { } /** - * Implemented by containers to provide a container source for a given child. - */ - public interface LogContainerProvider { - - /** - * Copies data from the source to the destination proto. - * - * @param v source of the data - * @param info source of the data - * @param target dest of the data - * @param targetParent dest of the data - */ - void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent); - } - - /** - * Recursively finds the parent of the given child which implements IconLogInfoProvider + * Fills in the container data on the given event if the given view is not null. + * @return whether container data was added. */ - public static LogContainerProvider getLaunchProviderRecursive(@Nullable View v) { - ViewParent parent; - if (v != null) { - parent = v.getParent(); - } else { - return null; - } - - // Optimization to only check up to 5 parents. - int count = MAXIMUM_VIEW_HIERARCHY_LEVEL; - while (parent != null && count-- > 0) { - if (parent instanceof LogContainerProvider) { - return (LogContainerProvider) parent; - } else { - parent = parent.getParent(); - } + @Deprecated + public static boolean fillInLogContainerData(LauncherLogProto.LauncherEvent event, @Nullable View v) { + // Fill in grid(x,y), pageIndex of the child and container type of the parent + LogContainerProvider provider = StatsLogUtils.getLaunchProviderRecursive(v); + if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) { + return false; } - return null; + ItemInfo itemInfo = (ItemInfo) v.getTag(); + provider.fillInLogContainerData(v, itemInfo, event.srcTarget[0], event.srcTarget[1]); + return true; } private boolean mSessionStarted; @@ -150,21 +126,7 @@ public class UserEventDispatcher implements ResourceBasedOverride { // intentHash required // -------------------------------------------------------------- - /** - * Fills in the container data on the given event if the given view is not null. - * @return whether container data was added. - */ - protected 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) { - return false; - } - ItemInfo itemInfo = (ItemInfo) v.getTag(); - provider.fillInLogContainerData(v, itemInfo, event.srcTarget[0], event.srcTarget[1]); - return true; - } - + @Deprecated public void logAppLaunch(View v, Intent intent) { LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.TAP), newItemTarget(v, mInstantAppResolver), newTarget(Target.Type.CONTAINER)); @@ -181,6 +143,7 @@ public class UserEventDispatcher implements ResourceBasedOverride { public void logActionTip(int actionType, int viewType) { } + @Deprecated public void logTaskLaunchOrDismiss(int action, int direction, int taskIndex, ComponentKey componentKey) { LauncherEvent event = newLauncherEvent(newTouchAction(action), // TAP or SWIPE or FLING @@ -363,7 +326,7 @@ public class UserEventDispatcher implements ResourceBasedOverride { } public void logDeepShortcutsOpen(View icon) { - LogContainerProvider provider = getLaunchProviderRecursive(icon); + LogContainerProvider provider = StatsLogUtils.getLaunchProviderRecursive(icon); if (icon == null || !(icon.getTag() instanceof ItemInfo)) { return; } @@ -376,15 +339,6 @@ public class UserEventDispatcher implements ResourceBasedOverride { resetElapsedContainerMillis("deep shortcut open"); } - /* Currently we are only interested in whether this event happens or not and don't - * care about which screen moves to where. */ - public void logOverviewReorder() { - LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.DRAGDROP), - newContainerTarget(ContainerType.WORKSPACE), - newContainerTarget(ContainerType.OVERVIEW)); - dispatchUserEvent(event, null); - } - public void logDragNDrop(DropTarget.DragObject dragObj, View dropTargetAsView) { LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.DRAGDROP), newItemTarget(dragObj.originalDragInfo, mInstantAppResolver), -- GitLab From 876e462ffa47d297100a2c8c4427d749e1ed0ed8 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 2 Nov 2018 13:50:40 -0700 Subject: [PATCH 0252/1301] Removing separate hotseat widget, instead using a QSB acroll all UI. The QSB is responsible for updating its UI according to various states. Bug: 109828640 Change-Id: Ic8cbf3d404d5870de0f6b8fe25a332b8d21bae20 --- res/layout/all_apps.xml | 4 +- res/layout/hotseat.xml | 28 ----- res/layout/launcher.xml | 15 ++- res/values/config.xml | 1 - src/com/android/launcher3/Hotseat.java | 37 ++---- src/com/android/launcher3/Launcher.java | 22 +--- src/com/android/launcher3/Workspace.java | 116 +++++++----------- .../WorkspaceStateTransitionAnimation.java | 5 +- .../allapps/AllAppsTransitionController.java | 17 +-- .../launcher3/allapps/SearchUiManager.java | 9 ++ .../search/AppsSearchContainerLayout.java | 9 ++ .../graphics/WorkspaceAndHotseatScrim.java | 2 +- 12 files changed, 90 insertions(+), 175 deletions(-) delete mode 100644 res/layout/hotseat.xml diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index 02d793e1c0..b1e6f2efd7 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -26,7 +26,9 @@ android:focusable="false" android:saveEnabled="false" > - + diff --git a/res/layout/hotseat.xml b/res/layout/hotseat.xml deleted file mode 100644 index 00f0b5ff8a..0000000000 --- a/res/layout/hotseat.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - diff --git a/res/layout/launcher.xml b/res/layout/launcher.xml index 304d012d24..87078b93e3 100644 --- a/res/layout/launcher.xml +++ b/res/layout/launcher.xml @@ -56,22 +56,25 @@ android:id="@+id/drop_target_bar" layout="@layout/drop_target_bar" /> - + android:layout_height="match_parent" /> - + android:layout_height="match_parent" + android:theme="@style/HomeScreenElementTheme" + android:importantForAccessibility="no" + launcher:containerType="hotseat" /> + diff --git a/res/values/config.xml b/res/values/config.xml index 4ab22741c6..b33cfa113e 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -131,7 +131,6 @@ - diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index cb354a6f1c..6b5db307bc 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -27,13 +27,12 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider; -import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; -public class Hotseat extends FrameLayout implements LogContainerProvider, Insettable { +public class Hotseat extends CellLayout implements LogContainerProvider, Insettable { private final Launcher mLauncher; - private CellLayout mContent; @ViewDebug.ExportedProperty(category = "launcher") private boolean mHasVerticalHotseat; @@ -51,38 +50,23 @@ public class Hotseat extends FrameLayout implements LogContainerProvider, Insett mLauncher = Launcher.getLauncher(context); } - public CellLayout getLayout() { - return mContent; - } - - /* Get the orientation invariant order of the item in the hotseat for persistence. */ - int getOrderInHotseat(int x, int y) { - return mHasVerticalHotseat ? (mContent.getCountY() - y - 1) : x; - } - /* Get the orientation specific coordinates given an invariant order in the hotseat. */ int getCellXFromOrder(int rank) { return mHasVerticalHotseat ? 0 : rank; } int getCellYFromOrder(int rank) { - return mHasVerticalHotseat ? (mContent.getCountY() - (rank + 1)) : 0; - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mContent = findViewById(R.id.layout); + return mHasVerticalHotseat ? (getCountY() - (rank + 1)) : 0; } void resetLayout(boolean hasVerticalHotseat) { - mContent.removeAllViewsInLayout(); + removeAllViewsInLayout(); mHasVerticalHotseat = hasVerticalHotseat; InvariantDeviceProfile idp = mLauncher.getDeviceProfile().inv; if (hasVerticalHotseat) { - mContent.setGridSize(1, idp.numHotseatIcons); + setGridSize(1, idp.numHotseatIcons); } else { - mContent.setGridSize(idp.numHotseatIcons, 1); + setGridSize(idp.numHotseatIcons, 1); } } @@ -90,15 +74,16 @@ public class Hotseat extends FrameLayout implements LogContainerProvider, Insett public boolean onInterceptTouchEvent(MotionEvent ev) { // We don't want any clicks to go through to the hotseat unless the workspace is in // the normal state or an accessible drag is in progress. - return !mLauncher.getWorkspace().workspaceIconsCanBeDragged() && - !mLauncher.getAccessibilityDelegate().isInAccessibleDrag(); + return (!mLauncher.getWorkspace().workspaceIconsCanBeDragged() + && !mLauncher.getAccessibilityDelegate().isInAccessibleDrag()) + || super.onInterceptTouchEvent(ev); } @Override public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { target.gridX = info.cellX; target.gridY = info.cellY; - targetParent.containerType = ContainerType.HOTSEAT; + targetParent.containerType = LauncherLogProto.ContainerType.HOTSEAT; } @Override @@ -121,7 +106,7 @@ public class Hotseat extends FrameLayout implements LogContainerProvider, Insett lp.height = grid.hotseatBarSizePx + insets.bottom; } Rect padding = grid.getHotseatLayoutPadding(); - getLayout().setPadding(padding.left, padding.top, padding.right, padding.bottom); + setPadding(padding.left, padding.top, padding.right, padding.bottom); setLayoutParams(lp); InsettableFrameLayout.dispatchInsets(this, insets); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3a38c0fbc8..4090320c48 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -207,7 +207,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, private final int[] mTmpAddItemCellCoordinates = new int[2]; @Thunk Hotseat mHotseat; - @Nullable private View mHotseatSearchBox; private DropTargetBar mDropTargetBar; @@ -914,7 +913,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, mWorkspace.initParentViews(mDragLayer); mOverviewPanel = findViewById(R.id.overview_panel); mHotseat = findViewById(R.id.hotseat); - mHotseatSearchBox = findViewById(R.id.search_container_hotseat); mLauncherView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION @@ -1159,10 +1157,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, return mHotseat; } - public View getHotseatSearchBox() { - return mHotseatSearchBox; - } - public T getOverviewPanel() { return (T) mOverviewPanel; } @@ -1654,23 +1648,15 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, boolean isHotseatLayout(View layout) { // TODO: Remove this method - return mHotseat != null && layout != null && - (layout instanceof CellLayout) && (layout == mHotseat.getLayout()); + return mHotseat != null && (layout == mHotseat); } /** * Returns the CellLayout of the specified container at the specified screen. */ public CellLayout getCellLayout(int container, int screenId) { - if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - if (mHotseat != null) { - return mHotseat.getLayout(); - } else { - return null; - } - } else { - return mWorkspace.getScreenWithId(screenId); - } + return (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) + ? mHotseat : mWorkspace.getScreenWithId(screenId); } @Override @@ -2281,7 +2267,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } writer.println(prefix + " Hotseat"); - ViewGroup layout = mHotseat.getLayout().getShortcutsAndWidgets(); + ViewGroup layout = mHotseat.getShortcutsAndWidgets(); for (int j = 0; j < layout.getChildCount(); j++) { Object tag = layout.getChildAt(j).getTag(); if (tag != null) { diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 3f7d68d12f..7a8d984d74 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -85,8 +85,8 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.IntArray; -import com.android.launcher3.util.IntSparseArrayMap; import com.android.launcher3.util.IntSet; +import com.android.launcher3.util.IntSparseArrayMap; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.Thunk; @@ -880,7 +880,7 @@ public class Workspace extends PagedView final CellLayout layout; if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - layout = mLauncher.getHotseat().getLayout(); + layout = mLauncher.getHotseat(); // Hide folder title in the hotseat if (child instanceof FolderIcon) { @@ -1517,7 +1517,7 @@ public class Workspace extends PagedView @Override protected void enableAccessibleDrag(boolean enable) { super.enableAccessibleDrag(enable); - setEnableForLayout(mLauncher.getHotseat().getLayout(),enable); + setEnableForLayout(mLauncher.getHotseat(),enable); } }); } @@ -1625,11 +1625,7 @@ public class Workspace extends PagedView mDragViewVisualCenter = d.getVisualCenter(mDragViewVisualCenter); // We want the point to be mapped to the dragTarget. - if (mLauncher.isHotseatLayout(dropTargetLayout)) { - mapPointFromSelfToHotseatLayout(mLauncher.getHotseat(), mDragViewVisualCenter); - } else { - mapPointFromSelfToChild(dropTargetLayout, mDragViewVisualCenter); - } + mapPointFromDropLayout(mLauncher.getHotseat(), mDragViewVisualCenter); int spanX; int spanY; @@ -1831,11 +1827,7 @@ public class Workspace extends PagedView // We want the point to be mapped to the dragTarget. if (dropTargetLayout != null) { - if (mLauncher.isHotseatLayout(dropTargetLayout)) { - mapPointFromSelfToHotseatLayout(mLauncher.getHotseat(), mDragViewVisualCenter); - } else { - mapPointFromSelfToChild(dropTargetLayout, mDragViewVisualCenter); - } + mapPointFromDropLayout(mLauncher.getHotseat(), mDragViewVisualCenter); } boolean droppedOnOriginalCell = false; @@ -2195,7 +2187,7 @@ public class Workspace extends PagedView * Convert the 2D coordinate xy from the parent View's coordinate space to this CellLayout's * coordinate space. The argument xy is modified with the return result. */ - void mapPointFromSelfToChild(View v, float[] xy) { + private void mapPointFromSelfToChild(View v, float[] xy) { xy[0] = xy[0] - v.getLeft(); xy[1] = xy[1] - v.getTop(); } @@ -2211,14 +2203,23 @@ public class Workspace extends PagedView mTempXY[1] <= hotseat.getBottom(); } - void mapPointFromSelfToHotseatLayout(Hotseat hotseat, float[] xy) { - mTempXY[0] = (int) xy[0]; - mTempXY[1] = (int) xy[1]; - mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(this, mTempXY, true); - mLauncher.getDragLayer().mapCoordInSelfToDescendant(hotseat.getLayout(), mTempXY); - - xy[0] = mTempXY[0]; - xy[1] = mTempXY[1]; + /** + * Updates the point in {@param xy} to point to the co-ordinate space of {@param layout} + * @param layout either hotseat of a page in workspace + * @param xy the point location in workspace co-ordinate space + */ + private void mapPointFromDropLayout(CellLayout layout, float[] xy) { + if (mLauncher.isHotseatLayout(layout)) { + mTempXY[0] = (int) xy[0]; + mTempXY[1] = (int) xy[1]; + mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(this, mTempXY, true); + mLauncher.getDragLayer().mapCoordInSelfToDescendant(layout, mTempXY); + + xy[0] = mTempXY[0]; + xy[1] = mTempXY[1]; + } else { + mapPointFromSelfToChild(layout, xy); + } } private boolean isDragWidget(DragObject d) { @@ -2254,11 +2255,7 @@ public class Workspace extends PagedView // Handle the drag over if (mDragTargetLayout != null) { // We want the point to be mapped to the dragTarget. - if (mLauncher.isHotseatLayout(mDragTargetLayout)) { - mapPointFromSelfToHotseatLayout(mLauncher.getHotseat(), mDragViewVisualCenter); - } else { - mapPointFromSelfToChild(mDragTargetLayout, mDragViewVisualCenter); - } + mapPointFromDropLayout(mLauncher.getHotseat(), mDragViewVisualCenter); int minSpanX = item.spanX; int minSpanY = item.spanY; @@ -2329,7 +2326,7 @@ public class Workspace extends PagedView // Test to see if we are over the hotseat first if (mLauncher.getHotseat() != null && !isDragWidget(d)) { if (isPointInSelfOverHotseat(d.x, d.y)) { - layout = mLauncher.getHotseat().getLayout(); + layout = mLauncher.getHotseat(); } } @@ -2967,8 +2964,7 @@ public class Workspace extends PagedView * Returns a specific CellLayout */ CellLayout getParentCellLayoutForView(View v) { - ArrayList layouts = getWorkspaceAndHotseatCellLayouts(); - for (CellLayout layout : layouts) { + for (CellLayout layout : getWorkspaceAndHotseatCellLayouts()) { if (layout.getShortcutsAndWidgets().indexOfChild(v) > -1) { return layout; } @@ -2977,56 +2973,31 @@ public class Workspace extends PagedView } /** - * Returns a list of all the CellLayouts in the workspace. + * Returns a list of all the CellLayouts on the Homescreen. */ - ArrayList getWorkspaceAndHotseatCellLayouts() { - ArrayList layouts = new ArrayList<>(); + private CellLayout[] getWorkspaceAndHotseatCellLayouts() { int screenCount = getChildCount(); - for (int screen = 0; screen < screenCount; screen++) { - layouts.add(((CellLayout) getChildAt(screen))); - } + final CellLayout[] layouts; if (mLauncher.getHotseat() != null) { - layouts.add(mLauncher.getHotseat().getLayout()); + layouts = new CellLayout[screenCount + 1]; + layouts[screenCount] = mLauncher.getHotseat(); + } else { + layouts = new CellLayout[screenCount]; } - return layouts; - } - - /** - * We should only use this to search for specific children. Do not use this method to modify - * ShortcutsAndWidgetsContainer directly. Includes ShortcutAndWidgetContainers from - * the hotseat and workspace pages - */ - ArrayList getAllShortcutAndWidgetContainers() { - ArrayList childrenLayouts = new ArrayList<>(); - int screenCount = getChildCount(); for (int screen = 0; screen < screenCount; screen++) { - childrenLayouts.add(((CellLayout) getChildAt(screen)).getShortcutsAndWidgets()); + layouts[screen] = (CellLayout) getChildAt(screen); } - if (mLauncher.getHotseat() != null) { - childrenLayouts.add(mLauncher.getHotseat().getLayout().getShortcutsAndWidgets()); - } - return childrenLayouts; + return layouts; } public View getHomescreenIconByItemId(final int id) { - return getFirstMatch(new ItemOperator() { - - @Override - public boolean evaluate(ItemInfo info, View v) { - return info != null && info.id == id; - } - }); + return getFirstMatch((info, v) -> info != null && info.id == id); } public LauncherAppWidgetHostView getWidgetForAppWidgetId(final int appWidgetId) { - return (LauncherAppWidgetHostView) getFirstMatch(new ItemOperator() { - - @Override - public boolean evaluate(ItemInfo info, View v) { - return (info instanceof LauncherAppWidgetInfo) && - ((LauncherAppWidgetInfo) info).appWidgetId == appWidgetId; - } - }); + return (LauncherAppWidgetHostView) getFirstMatch((info, v) -> + (info instanceof LauncherAppWidgetInfo) && + ((LauncherAppWidgetInfo) info).appWidgetId == appWidgetId); } public View getFirstMatch(final ItemOperator operator) { @@ -3063,8 +3034,7 @@ public class Workspace extends PagedView * shortcuts are not removed. */ public void removeItemsByMatcher(final ItemInfoMatcher matcher) { - ArrayList cellLayouts = getWorkspaceAndHotseatCellLayouts(); - for (final CellLayout layoutParent: cellLayouts) { + for (final CellLayout layoutParent: getWorkspaceAndHotseatCellLayouts()) { final ViewGroup layout = layoutParent.getShortcutsAndWidgets(); IntSparseArrayMap idToViewMap = new IntSparseArrayMap<>(); @@ -3122,10 +3092,8 @@ public class Workspace extends PagedView * @param op the operator to map over the shortcuts */ public void mapOverItems(boolean recurse, ItemOperator op) { - ArrayList containers = getAllShortcutAndWidgetContainers(); - final int containerCount = containers.size(); - for (int containerIdx = 0; containerIdx < containerCount; containerIdx++) { - ShortcutAndWidgetContainer container = containers.get(containerIdx); + for (CellLayout layout : getWorkspaceAndHotseatCellLayouts()) { + ShortcutAndWidgetContainer container = layout.getShortcutsAndWidgets(); // map over all the shortcuts on the workspace final int itemCount = container.getChildCount(); for (int itemIdx = 0; itemIdx < itemCount; itemIdx++) { diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java index e734e70533..3e094935d9 100644 --- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java +++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java @@ -88,7 +88,7 @@ public class WorkspaceStateTransitionAnimation { Interpolator scaleInterpolator = builder.getInterpolator(ANIM_WORKSPACE_SCALE, ZOOM_OUT); propertySetter.setFloat(mWorkspace, SCALE_PROPERTY, mNewScale, scaleInterpolator); float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0; - propertySetter.setViewAlpha(mLauncher.getHotseat().getLayout(), hotseatIconsAlpha, + propertySetter.setViewAlpha(mLauncher.getHotseat(), hotseatIconsAlpha, fadeInterpolator); propertySetter.setViewAlpha(mLauncher.getWorkspace().getPageIndicator(), hotseatIconsAlpha, fadeInterpolator); @@ -105,9 +105,6 @@ public class WorkspaceStateTransitionAnimation { propertySetter.setFloat(mWorkspace, View.TRANSLATION_Y, scaleAndTranslation[2], translationInterpolator); - propertySetter.setViewAlpha(mLauncher.getHotseatSearchBox(), - (elements & HOTSEAT_SEARCH_BOX) != 0 ? 1 : 0, fadeInterpolator); - // Set scrim WorkspaceAndHotseatScrim scrim = mLauncher.getDragLayer().getScrim(); propertySetter.setFloat(scrim, SCRIM_PROGRESS, state.getWorkspaceScrimAlpha(mLauncher), diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index e7313e8411..2d6be7b08c 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -91,11 +91,6 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil return mShiftRange; } - private void onProgressAnimationStart() { - // Initialize values that should not change until #onDragEnd - mAppsView.setVisibility(View.VISIBLE); - } - @Override public void onDeviceProfileChanged(DeviceProfile dp) { mIsVerticalLayout = dp.isVerticalBarLayout(); @@ -195,16 +190,15 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil PropertySetter setter = config == null ? NO_ANIM_PROPERTY_SETTER : config.getPropertySetter(builder); int visibleElements = toState.getVisibleElements(mLauncher); - boolean hasHeader = (visibleElements & ALL_APPS_HEADER) != 0; boolean hasHeaderExtra = (visibleElements & ALL_APPS_HEADER_EXTRA) != 0; boolean hasContent = (visibleElements & ALL_APPS_CONTENT) != 0; Interpolator allAppsFade = builder.getInterpolator(ANIM_ALL_APPS_FADE, LINEAR); - setter.setViewAlpha(mAppsView.getSearchView(), hasHeader ? 1 : 0, allAppsFade); setter.setViewAlpha(mAppsView.getContentView(), hasContent ? 1 : 0, allAppsFade); setter.setViewAlpha(mAppsView.getScrollBar(), hasContent ? 1 : 0, allAppsFade); mAppsView.getFloatingHeaderView().setContentVisibility(hasHeaderExtra, hasContent, setter, allAppsFade); + mAppsView.getSearchUiManager().setContentVisibility(visibleElements, setter, allAppsFade); setter.setInt(mScrimView, ScrimView.DRAG_HANDLE_ALPHA, (visibleElements & VERTICAL_SWIPE_INDICATOR) != 0 ? 255 : 0, LINEAR); @@ -216,11 +210,6 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil public void onAnimationSuccess(Animator animator) { onProgressAnimationEnd(); } - - @Override - public void onAnimationStart(Animator animation) { - onProgressAnimationStart(); - } }; } @@ -247,13 +236,9 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil */ private void onProgressAnimationEnd() { if (Float.compare(mProgress, 1f) == 0) { - mAppsView.setVisibility(View.INVISIBLE); mAppsView.reset(false /* animate */); } else if (isAllAppsExpanded()) { - mAppsView.setVisibility(View.VISIBLE); mAppsView.onScrollUpEnd(); - } else { - mAppsView.setVisibility(View.VISIBLE); } } diff --git a/src/com/android/launcher3/allapps/SearchUiManager.java b/src/com/android/launcher3/allapps/SearchUiManager.java index 68193f5c1c..51b90f71eb 100644 --- a/src/com/android/launcher3/allapps/SearchUiManager.java +++ b/src/com/android/launcher3/allapps/SearchUiManager.java @@ -16,6 +16,9 @@ package com.android.launcher3.allapps; import android.view.KeyEvent; +import android.view.animation.Interpolator; + +import com.android.launcher3.anim.PropertySetter; /** * Interface for controlling the Apps search UI. @@ -37,4 +40,10 @@ public interface SearchUiManager { * some UI beforehand. */ void preDispatchKeyEvent(KeyEvent keyEvent); + + /** + * Called as part of state transition to update the content UI + */ + void setContentVisibility(int visibleElements, PropertySetter setter, + Interpolator interpolator); } diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java index 15cc2caae6..b1e23d4e22 100644 --- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java +++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java @@ -19,6 +19,7 @@ import static android.view.View.MeasureSpec.EXACTLY; import static android.view.View.MeasureSpec.getSize; import static android.view.View.MeasureSpec.makeMeasureSpec; +import static com.android.launcher3.LauncherState.ALL_APPS_HEADER; import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR; import android.content.Context; @@ -32,6 +33,7 @@ import android.util.AttributeSet; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup.MarginLayoutParams; +import android.view.animation.Interpolator; import com.android.launcher3.DeviceProfile; import com.android.launcher3.ExtendedEditText; @@ -42,6 +44,7 @@ import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsStore; import com.android.launcher3.allapps.AlphabeticalAppsList; import com.android.launcher3.allapps.SearchUiManager; +import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.graphics.TintedDrawableSpan; import com.android.launcher3.util.ComponentKey; @@ -214,4 +217,10 @@ public class AppsSearchContainerLayout extends ExtendedEditText insets.bottom + mlp.topMargin + mFixedTranslationY); } } + + @Override + public void setContentVisibility(int visibleElements, PropertySetter setter, + Interpolator interpolator) { + setter.setViewAlpha(this, (visibleElements & ALL_APPS_HEADER) != 0 ? 1 : 0, interpolator); + } } diff --git a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java index 6c98d16b42..23d647b441 100644 --- a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java +++ b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java @@ -167,7 +167,7 @@ public class WorkspaceAndHotseatScrim implements mWorkspace.computeScrollWithoutInvalidation(); CellLayout currCellLayout = mWorkspace.getCurrentDragOverlappingLayout(); canvas.save(); - if (currCellLayout != null && currCellLayout != mLauncher.getHotseat().getLayout()) { + if (currCellLayout != null && currCellLayout != mLauncher.getHotseat()) { // Cut a hole in the darkening scrim on the page that should be highlighted, if any. mLauncher.getDragLayer() .getDescendantRectRelativeToSelf(currCellLayout, mHighlightRect); -- GitLab From dad8d4434d3fad9856ad607848872d87e642e997 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 5 Nov 2018 15:09:09 -0800 Subject: [PATCH 0253/1301] Remove scrim fade animation when returning to launcher. Since the DragLayer translates downwards, we no longer need the scrim fade animation to avoid the hard scrim line. Bug: 117677608 Change-Id: I4cd524d798579289d61bfe296f6de42bd22b0cb7 --- .../launcher3/LauncherAppTransitionManagerImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index d7bbfe06e1..9e85469363 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -420,7 +420,10 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag mLauncher.getWorkspace().getPageIndicator().pauseAnimations(); mDragLayer.setLayerType(View.LAYER_TYPE_HARDWARE, null); - endListener = this::resetContentView; + endListener = () -> { + resetContentView(); + mDragLayer.getScrim().hideSysUiScrim(false); + }; } return new Pair<>(launcherAnimator, endListener); } @@ -794,8 +797,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag workspaceAnimator.setDuration(333); workspaceAnimator.setInterpolator(Interpolators.DEACCEL_1_7); - mDragLayer.getScrim().hideSysUiScrim(true); - // Pause page indicator animations as they lead to layer trashing. mLauncher.getWorkspace().getPageIndicator().pauseAnimations(); mDragLayer.setLayerType(View.LAYER_TYPE_HARDWARE, null); @@ -815,7 +816,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag mDragLayerAlpha.setValue(1f); mDragLayer.setLayerType(View.LAYER_TYPE_NONE, null); mDragLayer.setTranslationY(0f); - mDragLayer.getScrim().hideSysUiScrim(false); } private boolean hasControlRemoteAppTransitionPermission() { -- GitLab From 1baf8a78c67b8bc01fb1064f758bda5c4b66ccc6 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 5 Nov 2018 14:26:26 -0800 Subject: [PATCH 0254/1301] Create a launcher LoaderResults override. This change disables shortcuts/widgets binding on Android Go devices. Bug: 112904271 Test: Manual test Change-Id: I3dbcd23dc448ff9ca5fe6c32958dcffb51c4bcf5 --- .../launcher3/model/LoaderResults.java | 42 ++++++++++ ...derResults.java => BaseLoaderResults.java} | 81 +++++++------------ .../launcher3/model/LoaderResults.java | 67 +++++++++++++++ 3 files changed, 137 insertions(+), 53 deletions(-) create mode 100644 go/src/com/android/launcher3/model/LoaderResults.java rename src/com/android/launcher3/model/{LoaderResults.java => BaseLoaderResults.java} (85%) create mode 100644 src_shortcuts_overrides/com/android/launcher3/model/LoaderResults.java diff --git a/go/src/com/android/launcher3/model/LoaderResults.java b/go/src/com/android/launcher3/model/LoaderResults.java new file mode 100644 index 0000000000..b82f362496 --- /dev/null +++ b/go/src/com/android/launcher3/model/LoaderResults.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.model; + +import com.android.launcher3.AllAppsList; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherModel.Callbacks; + +import java.lang.ref.WeakReference; + +/** + * Helper class to handle results of {@link com.android.launcher3.model.LoaderTask}. + */ +public class LoaderResults extends BaseLoaderResults { + + public LoaderResults(LauncherAppState app, BgDataModel dataModel, + AllAppsList allAppsList, int pageToBindFirst, WeakReference callbacks) { + super(app, dataModel, allAppsList, pageToBindFirst, callbacks); + } + + @Override + public void bindDeepShortcuts() { + } + + @Override + public void bindWidgets() { + } +} diff --git a/src/com/android/launcher3/model/LoaderResults.java b/src/com/android/launcher3/model/BaseLoaderResults.java similarity index 85% rename from src/com/android/launcher3/model/LoaderResults.java rename to src/com/android/launcher3/model/BaseLoaderResults.java index 1d18e7667b..d3dc91f3be 100644 --- a/src/com/android/launcher3/model/LoaderResults.java +++ b/src/com/android/launcher3/model/BaseLoaderResults.java @@ -30,47 +30,44 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.PagedView; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.LooperIdleLock; import com.android.launcher3.util.ViewOnDrawExecutor; -import com.android.launcher3.widget.WidgetListRowEntry; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.Iterator; import java.util.concurrent.Executor; /** - * Helper class to handle results of {@link com.android.launcher3.model.LoaderTask}. + * Base Helper class to handle results of {@link com.android.launcher3.model.LoaderTask}. */ -public class LoaderResults { +public abstract class BaseLoaderResults { - private static final String TAG = "LoaderResults"; - private static final int INVALID_SCREEN_ID = -1; + protected static final String TAG = "LoaderResults"; + protected static final int INVALID_SCREEN_ID = -1; private static final int ITEMS_CHUNK = 6; // batch size for the workspace icons - private final Executor mUiExecutor; + protected final Executor mUiExecutor; - private final LauncherAppState mApp; - private final BgDataModel mBgDataModel; + protected final LauncherAppState mApp; + protected final BgDataModel mBgDataModel; private final AllAppsList mBgAllAppsList; - private final int mPageToBindFirst; + protected final int mPageToBindFirst; - private final WeakReference mCallbacks; + protected final WeakReference mCallbacks; - public LoaderResults(LauncherAppState app, BgDataModel dataModel, + public BaseLoaderResults(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; + mCallbacks = callbacks == null ? new WeakReference<>(null) : callbacks; } /** @@ -152,8 +149,8 @@ public class LoaderResults { Executor mainExecutor = mUiExecutor; // Load items on the current page. - bindWorkspaceItems(currentWorkspaceItems, currentAppWidgets, mainExecutor); - + bindWorkspaceItems(currentWorkspaceItems, mainExecutor); + bindAppWidgets(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). @@ -173,8 +170,8 @@ public class LoaderResults { } }); - bindWorkspaceItems(otherWorkspaceItems, otherAppWidgets, deferredExecutor); - + bindWorkspaceItems(otherWorkspaceItems, deferredExecutor); + bindAppWidgets(otherAppWidgets, deferredExecutor); // Tell the workspace that we're done binding items r = new Runnable() { public void run() { @@ -252,7 +249,7 @@ public class LoaderResults { /** Sorts the set of items by hotseat, workspace (spatially from top to bottom, left to * right) */ - private void sortWorkspaceItemsSpatially(ArrayList workspaceItems) { + protected void sortWorkspaceItemsSpatially(ArrayList workspaceItems) { final InvariantDeviceProfile profile = mApp.getInvariantDeviceProfile(); final int screenCols = profile.numColumns; final int screenCellCount = profile.numColumns * profile.numRows; @@ -288,14 +285,12 @@ public class LoaderResults { }); } - private void bindWorkspaceItems(final ArrayList workspaceItems, - final ArrayList appWidgets, + protected void bindWorkspaceItems(final ArrayList workspaceItems, final Executor executor) { if (com.android.launcher3.Utilities.IS_RUNNING_IN_TEST_HARNESS && com.android.launcher3.Utilities.IS_DEBUG_DEVICE) { - android.util.Log.d("b/117332845", - android.util.Log.getStackTraceString(new Throwable())); + Log.d("b/117332845", Log.getStackTraceString(new Throwable())); } // Bind the workspace items int N = workspaceItems.size(); @@ -307,22 +302,25 @@ public class LoaderResults { public void run() { Callbacks callbacks = mCallbacks.get(); if (callbacks != null) { - callbacks.bindItems(workspaceItems.subList(start, start+chunkSize), false); + callbacks.bindItems(workspaceItems.subList(start, start + chunkSize), + false); } } }; executor.execute(r); } + } - // Bind the widgets, one at a time + private void bindAppWidgets(ArrayList appWidgets, Executor executor) { + int N;// Bind the widgets, one at a time N = appWidgets.size(); for (int i = 0; i < N; i++) { final ItemInfo widget = appWidgets.get(i); final Runnable r = new Runnable() { public void run() { - Callbacks callbacks = mCallbacks.get(); - if (callbacks != null) { - callbacks.bindItems(Collections.singletonList(widget), false); + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindItems(Collections.singletonList(widget), false); } } }; @@ -330,18 +328,7 @@ public class LoaderResults { } } - public void bindDeepShortcuts() { - final HashMap shortcutMapCopy; - synchronized (mBgDataModel) { - shortcutMapCopy = new HashMap<>(mBgDataModel.deepShortcutMap); - } - mUiExecutor.execute(() -> { - Callbacks callbacks = mCallbacks.get(); - if (callbacks != null) { - callbacks.bindDeepShortcutMap(shortcutMapCopy); - } - }); - } + public abstract void bindDeepShortcuts(); public void bindAllApps() { // shallow copy @@ -359,19 +346,7 @@ public class LoaderResults { mUiExecutor.execute(r); } - public void bindWidgets() { - final ArrayList widgets = - mBgDataModel.widgetsModel.getWidgetsList(mApp.getContext()); - Runnable r = new Runnable() { - public void run() { - Callbacks callbacks = mCallbacks.get(); - if (callbacks != null) { - callbacks.bindAllWidgets(widgets); - } - } - }; - mUiExecutor.execute(r); - } + public abstract void bindWidgets(); public LooperIdleLock newIdleLock(Object lock) { LooperIdleLock idleLock = new LooperIdleLock(lock, Looper.getMainLooper()); diff --git a/src_shortcuts_overrides/com/android/launcher3/model/LoaderResults.java b/src_shortcuts_overrides/com/android/launcher3/model/LoaderResults.java new file mode 100644 index 0000000000..9785887ac7 --- /dev/null +++ b/src_shortcuts_overrides/com/android/launcher3/model/LoaderResults.java @@ -0,0 +1,67 @@ +/* + * 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 com.android.launcher3.AllAppsList; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherModel.Callbacks; +import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.widget.WidgetListRowEntry; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Helper class to handle results of {@link com.android.launcher3.model.LoaderTask}. + */ +public class LoaderResults extends BaseLoaderResults { + + public LoaderResults(LauncherAppState app, BgDataModel dataModel, + AllAppsList allAppsList, int pageToBindFirst, WeakReference callbacks) { + super(app, dataModel, allAppsList, pageToBindFirst, callbacks); + } + + @Override + public void bindDeepShortcuts() { + final HashMap shortcutMapCopy; + synchronized (mBgDataModel) { + shortcutMapCopy = new HashMap<>(mBgDataModel.deepShortcutMap); + } + mUiExecutor.execute(() -> { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindDeepShortcutMap(shortcutMapCopy); + } + }); + } + + @Override + public void bindWidgets() { + final ArrayList widgets = + mBgDataModel.widgetsModel.getWidgetsList(mApp.getContext()); + Runnable r = new Runnable() { + public void run() { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + callbacks.bindAllWidgets(widgets); + } + } + }; + mUiExecutor.execute(r); + } +} -- GitLab From 0ae3888ad1b50e1331f2785fad419288e40e7fda Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 5 Nov 2018 14:45:19 -0800 Subject: [PATCH 0255/1301] Split out launcherProtos from sysui_shared.jar Bug: 113043444 Change-Id: I3115cdc7871b0f77601e399df01cdde0dde87c6e --- Android.mk | 16 ++++++++++++---- libs/README.txt | 8 ++++++++ libs/launcher_protos.jar | Bin 0 -> 57919 bytes quickstep/libs/sysui_shared.jar | Bin 200647 -> 142726 bytes src/com/android/launcher3/Launcher.java | 2 +- 5 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 libs/README.txt create mode 100644 libs/launcher_protos.jar diff --git a/Android.mk b/Android.mk index fbe19b0b63..ca1bfdeb56 100644 --- a/Android.mk +++ b/Android.mk @@ -37,6 +37,14 @@ LOCAL_UNINSTALLABLE_MODULE := true LOCAL_SDK_VERSION := current include $(BUILD_PREBUILT) +include $(CLEAR_VARS) +LOCAL_MODULE := libLauncherProtos +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := JAVA_LIBRARIES +LOCAL_SRC_FILES := libs/launcher_protos.jar +LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_SDK_VERSION := current +include $(BUILD_PREBUILT) # # Build rule for plugin lib (needed to write a plugin). # @@ -160,10 +168,10 @@ LOCAL_AAPT2_ONLY := true LOCAL_MODULE_TAGS := optional ifneq (,$(wildcard frameworks/base)) - LOCAL_STATIC_JAVA_LIBRARIES := SystemUISharedLib + LOCAL_STATIC_JAVA_LIBRARIES := SystemUISharedLib launcherprotosnano LOCAL_PRIVATE_PLATFORM_APIS := true else - LOCAL_STATIC_JAVA_LIBRARIES := libSharedSystemUI + LOCAL_STATIC_JAVA_LIBRARIES := libSharedSystemUI libLauncherProtos LOCAL_SDK_VERSION := system_current LOCAL_MIN_SDK_VERSION := 26 endif @@ -223,10 +231,10 @@ LOCAL_USE_AAPT2 := true LOCAL_MODULE_TAGS := optional ifneq (,$(wildcard frameworks/base)) - LOCAL_STATIC_JAVA_LIBRARIES := SystemUISharedLib + LOCAL_STATIC_JAVA_LIBRARIES := SystemUISharedLib launcherprotosnano LOCAL_PRIVATE_PLATFORM_APIS := true else - LOCAL_STATIC_JAVA_LIBRARIES := libSharedSystemUI + LOCAL_STATIC_JAVA_LIBRARIES := libSharedSystemUI libLauncherProtos LOCAL_SDK_VERSION := system_current LOCAL_MIN_SDK_VERSION := 26 endif diff --git a/libs/README.txt b/libs/README.txt new file mode 100644 index 0000000000..9109592561 --- /dev/null +++ b/libs/README.txt @@ -0,0 +1,8 @@ +These jar are compiled in the frameworks/base of the platform tree. + +launcher_protos.jar is defined as launcherprotosnano in the following file: +frameworks/base/core/protos/android/stats/launcher/Android.bp + +plugin_core.jar is defined as PluginCoreLib in the following file: +frameworks/base/packages/SystemUI/plugin/Android.bp + diff --git a/libs/launcher_protos.jar b/libs/launcher_protos.jar new file mode 100644 index 0000000000000000000000000000000000000000..c0439363b867208522d54d8b4e54c3c822e98f3b GIT binary patch literal 57919 zcma&N19T2+qP}HcF7eg24e}l#NKd?52 zu6D*2rcVDR2={*uvNN=^|5qdcm+Q&W(eR8&G@@Q zIBwbXaDUj%pF1sJqjVV(;0>%F2>Cdd|)5 z0r44zgt?~aBHw)L3&C*w^;-`=B18bm@PhU6m#Qnb`cnP{C`ey~XS~M(nY^;?4+gIE ztO@Vx8UVW=sd;>o`3ecFaeRm+xDWN^!IWJ%?!?Yvq&K2|~n zb)bQFw)E`uY+30?(J!uA>po?6d8NH{wRPrlzFc9q>95(JE!UY`(bK+v-lEeC_H7Tk zmlo6OB-o*P2ONw+up~(##=J5CPUy$E-0{8O!;(BjZcgYPrtZtYYc-UVc zFjt3urDFWi)4lNi*x~!Y*>*W@^#=n1`TA0jh6Etcjxy?kf`BM~`%hB;cZ0_Ke>rHP z9xkSK|6un&N3SYb+W}?eV}xHEqn6a(#@OidmUT1Q7K+HY26TWQlR*`c%>Z&m2in>) z9-~ONQOi(>o;g3;44A%`ocdJ1aO$kjO&Kz+S#27c zreanR?%dSl{Htf;*_{*N*ZY940rd{d!LdXdQ5agRn8lF>IR6L<3ls5-*x_A=j@+mz zO@Av^>a*PVVbVJfo?!qp@>4dzoU=4fG>wqf6*tiw%hQb}Xxj6YzLJ5mjJNW*G%MY= zrFshBC11?KY^*H?RCHh|{W)qW%FJ870j11bEi(Rx%VTJ6D#$Rs6JjqY8-MAd>I$&G z)F-_{#-{9mUKcOL|JLDMp{#l;Y0#5A2k}Tbuoxcs3T0_QTneLy>DcrzM6#arr`mu* z2XXNMr)2K}?WNOO4uGw!rZtg0Ya^_8_Y>57o&tb8@kEw3eVReLy1CV8Q^jP96U%1> z<>pd4uf`YOTxBCCFSC|nEQ>mm`jcsO(qS&0iVKW6mQR7lU#~TsWnrDRQ1KxvXGK=L zuAb`8VG=-?Fd+zgLX~#)jfW0E3|U+BNI6nB8PqQ-sJuQdkA~+f(h5gwuCv5UGOW5q z#!m@A-Hdb4Yi)eXvps}J|3dek*CBqW2&yLSR7*rlou8^=rUazFHK_;riBCWWg`GCk z9dc$VTBwgg^($xS-W06Q`&t>i%6(_bD1`DU{f>GUq&y=&#mp%FAS5_(rgzj&BDTDk zRZtDnWFD;Z#nd26wfivvYg=2Dgj8u!`Y0&OwpmfTwdNw&SykRNTVYV4Ap^BP(NNG3 zNSBO>qpEk5Acb>Dh38aHS;p}|iKY+-JYte_>OG_e9p=y zbzO1~FWLRIX57_|qN}ta>iMuiyUx;c5E`2lAtKAn3}pZXu@7=Z$Eevm3z(l?A_@|sQ%1XYcxO1&JyRu8 z6===w0Hn*7n9uat#>+6m*V+fct$)zh^N*9##t@}Bd1L>sn6?OnWHqh;_~o|FxMl$u z)&MCu`aC6h5;&HHQ7%0bJcYO~q$%ig1PT{FK@g(wnqyJ^Z=fOt&j68QKK@lc5=CwZ?QlA6)v0@8e8q4@Rk9Ep=#nCH3(c z;#G)K`iMRv!JUn8n?82rgapG%K#}kfWj?Psj5lc$GMyiTlKbrt@rhUf|V6)#9@rnkh6BgxB%tCJE{%_Y&HYQ^smgb7%EH_Yj{W zY1YF|5rvkxlb9*Rp3+N_u{SUFqX1tz7`; z6lOP%D5wvGYKb=`Pkb0r@{S|WMm7M*B{W=2VI*MUMl$Rf|`dy*wSe$q~PBbgGA;<(f=gqoicW!hK8Yy(*G#3JqitcVxC<0ge2k|6 zPl+tW#rZ47r9K)@K3;B+zF}`DEsJg12QCE~ajnNe$D> zd>!GJcWZ3T()pnSs~DnxBiWRF122zbNhY8C=wg z7igtN`EVzIG;iPZtZDjT#%=v`;i=YbecEMR&iq0}%=Vbqn~jEA!^mv-yPu z`})`Qea`#)`7{5wl$&}24Da`gLv;Gq?`Z?JpgKPCeSebLbK}pBhTbYvVjD{@DA5_`au6W=y!egQgS!(9&*VUdD@&F(4BP z?bqth&cA|MB(u28SEcQaUkxZg^r6+&1>0+}DBV5RM7fM@ejEmu*KhN6r2r;XM~bZr zZ@D3e?zTV)>Au!LQ=`4}=BHe>uvX8-K;HmA&OPH}DHt*{MVxL1bm$^7;0s?EU6ujGH;{jTB^H&P;_M|`+bR`#YlAunK z#Wm^|Z|;F?-ue^?ksFtAt^yn(p|t?Ur23~8lg2l_y~rsf-t5tgF_DG3V(kH0N?%gE z9XpfEd9QVwNDf7r8F*~9#@&`DGuXcDrf8x*0``TJ92p$VzRLHibYv=LT-zgsVHq4t z>9W|1S@%;}N?zX8MPt*%(>}Al#5u?q2O$c)NgxVNc8fj$6}YOh!?1?BF&RRnB9>rT z=xkz9>DA0?3OM9V!QWZSH@{e&Xw=I=;h9K0EoxSBSYo$PD9>=@Z5EsXs*;-*ZLH_u zq94iA#m{?;&o=f4y@idzJzPx#X-UkWC(cM5oy#m|Ss<0gl!4Y-N6YcH?S@wA5hp*A zvFf#+wZzUxTWrNzl;tz0tnly`{77hC>0pHjo5<}+oK}qc8I6sjT6l-oB)Gv-rf15>cq~{5pzq&X~eO=XERO0Cds> zs8WfR-mg(T!stQ#h34Vep)^%Hn_OdEn^0Txp$SvfdN~+u{_K>~+$95;_{)$nJ~g~! zeNA>TCUASh_XyCJ_0cXum&ZYS6XcCG$x^rY&ZIc(YGh0GZ6_D-FpEShfco(X7;O5x z1jH@}zZgC?E1SLVF-wbNv$(*mSv>569tJbiBzjE|d&*CDS%3L3648 z6BZMrC66j}W04XQC7*!~<{WH@5iQl+onpuHcIXvi^V|zZR}U3M@ls72nQwRZ_KcmW zx~)rc5$Cs;uT+kQzpZ~F)=e02*wX$|qNqj)SJkbg`Xvb-=Xn1k2OGU)$=?|cE;EEF zlVZo$%l9R7C0_P2iNkwXXZxwj&`|2v+gi8t_4E`9I=bvz9n5xBKDkkagDh6dWYwH@ z-X91ZuwyDhL+{hzuq9J?a_7u}S~ExR>T&GO#8Z(;p8IuOdud#S?mH{lYI}~AL*8eh z$i&%4+6W9aMpZ-lGLk3`8tSCa71r37GP!F%YLc+V7|#;yYVo04>c?SWr<-hQyiJcM3(x zF&CYdQ3Qy%1I{1ICu-9i%0VNy6>Tb$u#XFN z9h-ua*wxAvwQAJc;mQmTIrI9zFaCsvV97D4NLV$kb)#Jpz@>+(SRID_o-Uir=Ux}P63hk_ZL0@MigVd1B{if^9Lp!no{e-))<1J95hd_$b@<^c1>u_pc@ zXU-AB%$-nRS2&)hH0K~&rxJzd#I5fbY&w(a_`}(mm58tKp9BZueZKU+J zLXXTO9iW}x)yJn7L;<1;pabh;o9ZosmP`p zx4OBl$j2R(nRvXLbM4UCN0(&I%NA#!v@vrumK9w3%OE=yjgKwdKk2BE^9T}Wq}?UD zLGg&9)eY7*=`>cGPb&RDE!wZ!%V;6S8R7=JxNBN$+XTfPn-X zjEeJ&jC4(sca6(?M&&w2&%99g?B>2F%)FwNzBU7Tkl1_B_6wsgmsp7 z$sL%^2YDJA&zNcME|;^v$D(z*mIJ*?!k$?g;pBSA^qNVzaM>Z$NV@Li-$zNdam6)^ zR&S}FZ~%To=ve8wEJk@!*b+2uMDc8rNxJUhljNddW9tjOy0C+ka#7!TbwhZf|dHWBPA^|L{Ej(bT_y4o>zi_C~H||0V+Ke~9>B%tQ8n z7ba|PVrn93=iurhLmBqjQp3R^?>nEQE&dT&rToXaY}%-{4NCyBsyfo zk^mz;M9V`=Xc89A|9O)XHa0oNz>prnOfFDyXjopYVNI<@JH$sp8)+Gu5wfcG^5^B* zs{7a3hMvA^tyi;JtzNC#U;D<_O>P=CU-0;k*=6_2_Mg@jE$_?b6+Zf}gV%eIGmBP8 zXuq>TYn{*Nv6(G}83%!m=;(4r1SA<<15Go}8)iC}ULgLgX5x)`Z!mzc}mV(C=Os!21*URHv{2)T^k zMb^9;62){Glct;~{E5&A=nBPAB@9O@Ku|p+Z22muIaj)js{*XajMKhcOZ1f>{P)m` zcJ#Yhn~Z^GY=oovN1aMjrqnSWgsD=lnkDA;z_D*Ym~ME;3P}%DmlP#JH8)yM1z zn*1yMZ*=Q<;su>6B3?yhIY+*V)#CC+%9`Y~ced> zi*P&>-N?PPkhPf19_+|gT~ca)axYt~*^t&iS+XPZ(D*8MtT4#bbwuo%sYx^8%|Vok z!doGfK0rJMHEY2qWW{@J`3U8wWv!MDwV5{!`O?|3mMlnuHmL5~%`!)*WGSFm*=?b% zp_I#tDcx!XZwOF~TC8msO>1+C)$&qz=}9;!1GhGW0T8t|p5b?R50oKNpo8`3!4ZnAn_JLR{ZmWNoZib6pp%N**(mySKnqSErgP zi^s&+tEkM=;jSq6hTlf@_z=X{$yPZ#ya9`8J2T8>iMyj$GA@o)nzA=zNYzlf@>Wyj z8pH`kxW&%+D2kQFO8ie6!zx_%1`PpYLcl1%5F>3ytfe-}ZFM{cSi?aWRMPmlF^IPV zYo|fqya-i3Jvm2AVplu^QRV6Ry-^B@Ws;TJ0(*2Ay}ejswCd@0()6FxtJA3~7BI71 zKBgw7LeYgS-fj}}N9ew0PBfA>uX)}CUF?-X(3zIf2N5SytMQ+m4a}KxPiN~LE^K`x znY%J3>Sx~y8EQ@o->vu8F$=d~>8>Hnbrv#-y+RZaVZ%d@QHwe|8ZzYS#20vdyTXTk z_oghoQOY&6y->%NjMZQcW9t|9quHd66S`>nkXX2lo(#1tM$-<%Fo)eIv|)Z$6dNsoATv!>kY$^j(a z7299Pk{Vy+E=-YNA(}HH#uO=8^3Ik+C~5KZ=QNP!&2Lz6CvK>o^+IZl;Dwa?EN?rh zg|yZtHhV&atBPpoJ^yfr1gwA~uL+bcr^*d|ySsn@h{nWg7!2NmQC$spszxfw4Dq(5 zT4zK)@Bc{bXhTxJ#mC)SmqWWgknPNUe)#a{m4q_8R=Opec*n$7zXgBJHn<~AOyv2b ztl^Cz2`PA5yi)P9r|O+17+rHYFhHz9suJm7>smJ238UsROkQrQNWX_O__3Acl zAvc6Yju?;WYnAXG7C+z-?Po289o%mNG9~;S5tMMRpgxQG?bPY3Q9D^!cZV!!6e-fl z6P_qeu?A#&rtC;|;De2}SI7{%07|}zOWmY;BnssgCKZ-XToa;MS7=8^ilk^l6;a>Z z_VRrF4+XoyN)=*VoGq*|6V`6GWJNZ_l88S?<0LP@4D8M2mt_**5pcyum$qaGuuuz( zA#CexmeH{uE9!*W*d~5%GirH7=lhxYsBxgAueQaAL^E(FIm9z?zp0YOQR92LvgDqp9Q#7HwC5kblsuIg@tyj_}Dw#g3E>MAI+)B0) zb_HBrdxWtukbzMh5-S$R$%y56MvHVPxK#^M+7IkVu#XLdO6v6uB+mgA;}Bj`%w&yn zqKwA4VbNrbY@&@~q8p8DWsH>8-G9G5U>*)N-wa6e5aljOiN%?9ss}`AO&A(5TdC$Jqh@>&y5)w zF!h6tftdyT&%jNHO|Zl2n{Yl6Dr`RzcEAB<)_{ZFt`$E>riLSQ7KmLC3cIi<=8(mZ zNR=SjvJtjjBLy>xcRhjt0SI@}zS1URGf>!2<13`OV#!Pfnpy64!LZ<5^NInrEx)mK&(J% zc1t^c!dk$<^)-%d6JQJNnROcG5|srhqTV4Cu5!X&BLY|d*iKS!nOqYLvtr1+;_N}x z!8rdMF!g8?r+#cFA+Zvils{y->X_)QRWjd@`%ultrwX-#w2Jk|oeI5vhu~*C0P<#ryV&3sJ@5VysYqtx6cTQGO6N%%p<#$+G}!ibWgs63Y@gwYZdRfXqdb`j zetqF!xW-Y===ZVA!Gk>dWGtqfNrB>?*9HCOnMQ$`bI zy*~yom?GC%?BP#1gX#msbQ*DTAxN+JZm*}zpgB_iu|nL8F{mCBi4A}%c0YKZrCA~n zPa`6HazF#5;|D~0gFk>ErGX$=c2o}oySHf;q#|cGz-66wwgs@}^9?tNsL?JYq zT1?yqaY4*@U#1Pz2O{)^O6tZ{W|*A;tu_yOXArh4i11hF>r2a_RvGhw7#?3xcxd;z zgNzOglU2%ZiFZJ(bi_;_u)jaX=F;@lNFCO2_--Pk^$>txf!jZ+cq)7Y^1_Gv0@~$) zX8J-jeoG=V5{J|;uMm}M#Hcsm^e$t8$dtm)+NNl=+l%a@VxbU=<$;P<7h@-&dG(zq zY^0cLX7o?fEz@!Oo*&C}Yy?LmWXG8D)8a~;bKDViBNT--L#}CZUqp@qLs5Pjmn^5PBj9$$G4>>) zGKdHp@@T9Q8dHS`qDk^3z?eTzd_w5%u4@)}xagN5PIkw`FvF2f8D`8V&K{Tr6)tK( zW=a0fn&8wDW2UKIR~8sn)WL5R!_XNqODvE$W#2c-(H%3QXr>1ADhB*2Mz&nQuJXCM z;?Va5wajw%_>%UF_mjSf%hvV~5R6zNcD2EXPkHphc8BsZ!@^S<8tZRhP!s6 z2<-e>s?~BRe5HbB`~LXC5pvlXUre_A5urUYnL#>w_M}_+-r^55nXVdNNNUlc&TB$y zH_M*qbzewvJYV90SzCu$FAobasWLb|D~y5_9O<;D+&Jd`PyEGQ8aZJ>s2~scQo~>b z)t4lNIjWo9AA6Qe&?3LN8A^JCxWH)<7b(jo{N1sv;8g%;u8(*XELPjUg!wuZyIZb* z&KRnI`G)&Ih_SA^j~=sBIRAlv)e&=5+{vGFru@ce8y;*I9?qp8#JyVxcwdaLL>;1u z%nxHR{LzY4kQvrCz#>v>`2&9ev9pNi{f8l9>0U3(W-L*b7^s;c^Yk7|R#~4H>;a1o zdT{%#B@aD;v+Et>30-SX_l2{L$pL@Eps+5uEmt}q8p zYEpBjm~T+(7KCqR2X5vaWr|R477_uol9L6c4B(d!$yHj`Qs$Q9lG; z{7d4uAv%8`HGYgR9zxKp-hD&2;|v!qjtZ|EO7)Kt2UEv4g z&K^?1?sdTyVTIFF%3muHXuQ>QR4W~zoQGsa%Yg1b9!@oXHN9Je@jRnXJeICom`Ib- z?{j&hsyMa&>f*^AF{GTa5zvUAKDzvHr}36YPQHQQp+A^Vq%a!F`{FRSXV=@kDD@ec zp9MLhzgN#PIf{g->U*E%tZK3_wD}WfSen}_TALr@7sm9)30$C8kn9mb`@m*CWk;_L zDp3=B_s>_w8mH0X%x`mQXaZBXNhm*1d{xo!U&A1`i0Q|IWY8?KxtA|sBBiPqWXUi# z3QqHZuK8(;7-R0tuQ`iDQLs~(^cmpvMpCknt03<`Z1fg&=-Mp;ts6=BNz0F6Ow{v( zyEuUMPV|y-inRl0KQZ(h2WpVEA`Og(Or=K%Er;?e@{`0Q9Q3}Rx5+yoA+-adcBa)c&7--V5d=8@+vcwA&K7p~5=(akO z>2z9RPgw257{WMBL4^?T6^*{b&J^#R8+{dP*1Wb}71mfyb~{Q@6VTZJpfiP1DF!ti zR{~EmO_^vJ-+ZL<5%v=*PmsqzL%D@+83U*XI%`!21@)G0VY(?O{@%d1$yHLLXdLs z>W|xtvd@jx%jJXJYYyr|$r6%cxak693CRpcI&yksu-j`;P02B=+PhO*)1%%v4|Bvx zJx{kWmKHMoOL!rto8Z(>u9eKy1GWrRtAMCNsTu5-z;6kOC|0Wt8UgnbOIux{ zYSCFkM?i`Hdbl0XNeRN|0&^Dg7RfZYdq@pI&2R)ShJS96NvJan_+ zDIP5vXCMw!UDvG5h^t=aS>xi!Os~jTZJ5`ltxl4n&P7jbRE2%w#&JiIkHR3T?%AJ* zSf+GC@)9zJ*<#t*ooBdEqKwXPpz_O3sM-sj>#~^{-!>AZfrueM&tw|{F~ZX_&2() zA|^4r$SvkUu5v6E2$@O11(aIj4kJuJjD`c+N?=pQh)_jym?#ZlFsxnCmULUn6N=Og zL-?)!-_*o^@{~{oeT?oeYp4FEF8@_;{T4P|8j_RJbhG_ z9=~$f-JeoT5*Pv*ph85UP>3_dOp?K838OADp@o?wzbB+~q}PoSt2QmGQCGY6RRk=T z4Rxr5ms8xFmn1K1J)<|PRqHmdhpH9d{K@*W-PPsEOj7>tc=XHr`ZdRS<}YELccS>* z@5Y2dhN(Mw9x#1(z%Y2P`j{U=aOk8uPC<%2b|HCgiW1@Pu9fAyGW-!3IVXPu62FY^ zgn|4Q;;j3~ivR-ESc zPWA%=0$m>Y%U-U`=g@DCsJGU{&x1Zpub?sS&3mXg-*JgtM$Wy0FQ$1(jO;rDI^W&C z0qC@!kaVJkM#jWxtLYqR9O-RoZRs9q9_eK=&}pbllt%l;N|Qw)l9Y*lGVe0uX%FU1 z0g{}FfmMP5+Gujc^Tn`td6|4Sv&Q2FKvf>55N%=J8;Sv&((Ugy1fX@f^PiWqIN}dE zt&jN+SziLySpmx&P~D*2^}_abKlfy&9jMH`Ze&ftCu-dGF~4G6s02T&9jOX=R;w59 z1~lbNn;_k(j9(0^l(CNc@J)I6v!;II0$pXMO_>76JmpLaAfKrdUksTNDP>BS(uaTh zlrm-epQp35C1JgDCyvnoF&Nr^N|Ge5$xkHRF@s_& z_HrTTrq85T_Bvf2)00cg$5R$reD;qoj+Gd!HCbbu#MX6JHpa7}4l=PKBoXD{=8qL` z!^82?Pz6NGxIomY2$6yN4({c!gD7F^je(E^&iWFCKl2Ja{WD&r5>28V0P`8kNY`k) zm?5o=fkN(sdJ!92_lXk=3T&JyhpE4}mc13BS9}~=P%jB?s><7kWNmp0O%8~Ca%f_m z6T?)WbtVch1MrQtU66PZJk`8ul74nIrlpz{E2grDp}3k)#IHG- zxMheEFyIfzB{mj8s=~1}P;O2-%f#_a&=Q;**Sn3?EA7|FNb4m15HF|>X*d&`g1pSP zIJc-)=gK4P@$X;tLKUF>PwT!rkrVA?Ua8%_j zY;ViQ%3lfSj>^Hhydp%kfMJC-@-y>34V&fk&h_|9f~T(4eFbVk73pw{N3VIzpW6@V zJeJXuSEh^zsE-{BX;kXUbreWeTKw#b<>9*ZYeR2~Mvb|Tzk~+XzHg7~6|;Pul6;&>oSx1VPju-4?LA8$tqKno5ob4@?W4ASG20ivL03CarN*AQx zLZO6ZBZQ}Odx&uDE#quiN9fQIOFWV) zlllqolNGK0i;N^Oi4lkL2_6~NDY1AdQUIUw{^;2m+(LvA)jk@E8=gOKK5MvGLcVjU-xoI ziATfuFZ#wCO|T1m64py()z__8P|j`IlbO!-r&Iav2&47FPVlCyO*GcEzcEL59o%m< z*~mBh)0?zl(pwxB-aP9?vA}fpT(HAydGS+B8`ZFAVQqh#Hiny66~4Kc7RI?C>D*~X zy4Xe!4n(oLhe3sQXhjKo5&oIC(K)wPRnT%(HlJ?SAu*j|4I<%nmm`h0K$wYU6Bkm9 z$gvK{hi+CjGc9s8ElW06TAUwic?DwG#dPKPS z&^}&%NR}M;ZM~G7Q~7UToRprDDwTnfgeVo7b7hEj@uEB#e{wlXJg}T4eGE0DVji`t zV4fw%i7)X~<}AHBP@7poHMv0&!zv|2PwcW}g890mHGBHABtFEPjE!s>4S3)JUbUN;&YN@)eLRL_vT%I9@9G3Cq z@1U;Al2T?BL0UmP zS0TZ|STCizOnoWCr9xIwCtMz_kfGTemVvz2R^iehg(h8)oiD+&sk5|%7dN6M9O0n) z<2GX;lXU&C0$IIdvQiflo^>X!#eP}MR?AlCR4LicG`PaXBs{vn8L;F_JFJQ=-dxcj zxmHD`PNA)0TGNm?cS%*iW5eof2!nlki^EAHX&JL<&l@*1Z<<%9ONq}2n4`uT< zN+dfzY1JAvw~BFADU9m}`g%_~#bj&CnhGDyb~)8w1v>H+)8h^mcdAEiY3OB5(J3fC z%e=+&LRume4Zp3DuM~cj%tN>seveBzRqfDi7c5R^p%yO5Nme}+W9ya5sGRo!I;T|` zI8i35vZN}crN5~jo{!5?>54R}TA4UuC3?!x<*$Y8`BE0DXh}({Xvs(eLZu7N3+rR% zsQ5t0)yh3EuFGFgKCAZaUj&Bq(|tnXRNu3;zjl}TZ|Tv#hW%Bt1}T$&km&wHOWg!Y zx!G~19rV1&43)mn;3>zio(#VNN8YN;De`HalNn=vdKQxXh`CiD-`Qziac{Tl4oQf< zdUZ_4hi1}?M1GqZ%VCW$h_hUI5O6SZcm{u@n;1b zLb$jG=FEg_Yp8fDrR7T!0ccB&{PwHKKZtIn|Gs=trcq9%j%78U zYDnAGg>>I0w7ez$pe>Q8FQIhZIsW>DURz$vCWI}knK{lZkXR{jx%@v6glvrn#F4* zp4T$h2l6@co48ic6*q)*VZ7NB8cCY;D(~?A>X+fNCW-AA2RAozkHWj6wO3%db+b)* zs$t7nd?RVLpo3_^sn_xrJ~Ona_T%UpCJaUnC?Nyl%pL`RA2M$jgJMq!R)ABF;qeRl z&|~i59hq36ZT8!qD#!#OA&5sXD_Sz;EGR|Xctq_OLLhX&*o^_S9wg#o$^Obq%sa#3 z&^-sR2g~dBd+hj{UROk6og|U{sZfeQyz%EQ=xPwFyZ|^sxCiVLDei>VP_o2}B_aob zos2mDqIA6}b|cX;y}FdcL92&01|$4kA*qg__KgDcv^cCv_(hKdarrv#JNyX9*jMcI z4uIRH>Qk^y4IB&&a<@f@CJ|9}odu7$+lfi7CV=BwIKB?XFfmFg7&JbFT_ZbWy>nM6 zq8S^$DiDJR<(CzW+R(MD&)?Nj1ce*%Q@?(B0iU)s(lr)Ix)c_kh;Nle=p3`q^y_bg zr}XHO{zH&!)(!PV6{OJB30%7ZsCt8cPY6d9_4wu#5my$0DfFR9RHH+q-mQWKKY;x$+RFW9@WmO;s=T294W> zujkW@kWgj)M*f++<5jFC$=(;Jd$W(@`_pBU_;lw*zJ-)q8ar8pzp_Ysuh;fw|A|lH zZIJj>*{4LhLnKuN8J5FE^3$LgB8j29g87bHFYRq)@R;*#LHO5oqzKtwGill|fc zK`QIWcLk6`IS50utLriQBVi3iI~eS`i4d^u9QV=8AliOT_i#>B&*uh#$qz&c`)X8> z!M175&|BuI&dcxhGT-d4(G!k6dFJEQNxebfdf@B5-@!;A=cd+BRVCaR1sTZbA(%D4!95f;Vc8Te%c`jk)sCcnh$ z1`bKiI2ox0;6_VV!24byyiSDDoEKMCT&LW_SBS0@AL~_4!yGu@i+A%KOcM4wkQ=j2 z48!nzYK{dYXgpsDLdxQ&q)Itag^C>(aV~0c*%NI3P&UAc(2@&r(&Fzf^>OqEcU!2OmN`F9x5+l3+ePpb4(Z?G=z$^5IxH*%%Nu0+8{#l z9MlS>+7uMV=_1XlylIBP8#*{H2!6Tb{v@iH%$~luHZ)0zn#z@6$ix?E#d*jwre-~Y zDI}849tN6qQ%wdKrfXW}X0pg-1Gb;UUKLBFF3#`#yqznIDYPj`*wk#ds|!KPI$-FW zB&>Ynlfj8jN`deLbcQ-NRYd)S6#_q%@!R*!5XO!OwF1~Y=iLIXq}lcpc@zcFL`7j` zhU5}Mw(Pi27QD(bd_yY%@~K`l7L*MO^qPDa2e7FD*~K5aEI8gL#1FH$JR;7w3{$B< zeE>#9UBcT0iVfQL1rXd&JUSiWL#FU#0~oj@a$N)+)I8|bI+)yhd&3NSd=2 zS5%=Nq$S96rD<=NLwpY1A_6OWd2?c zh@sVbgsW_}GtNhhD}vhR6{sExH$#F*Y9IAC(MJ25WmaV`1r4MsnLQgjE14N}@F&An z!K}u8!ZS78-gYvS1diJM48Jr?DI+IjWq5mqbH?2D`kz{LSzL~kL-jEoG0;XdVY7(XRL&pCEYV?L4n`>1M8d-{ za4scHbr?|CedsAE)PV=2T_THL;9+y6H>=?T!b>bl>?;-k4p5urN!B4Y*4~t|)$o=) zeT$U(KbIM%RKDtOm-9@@-U>YnB}rM=tvkU`e%@mb-VAIf7?g`EobRy-VZN9)EpySN z(+8Kl%B?eUg4_^~Ssm34D+(xzfLSw+Q|LBJ7%2;CDhr&j1-IxzJdW@hA+XCqQ5QJ$ z`Q{(0IMX+b}Uq1 z2C3N!siUGS@{+Yx0%m%D79}g%=2DfY>+5DPX5&7{(O6z~Pt_Ac`0EgEyD0|-3Zpu^ z9Ip?^Wnkh{!H=i>=&K=+H+ZTOzAQoBvJ!8`$g7d|2SngJSeghzLEx__vGus96GI)D zIBaf9)Gn749VajymW=OxVUjnBWHIrKZM_Wh->{?f&lpd_D720Tb#ep3hl_3V9GW;m zvF&W~#v^@MdT~{89Yb0D>Zv0jCcGSU5SsQ_hgwMd_MC0Dh{UZT>j&7U=v%I5$v^w) zrKWdaM0ojJ!7JeJV^lX6jwN@dIjABUv-F+>HbD!QIy-l&wXxc|$`x6-~Da zlMCA26W>C2a{3Fn#AO-z?znx((i8CbmWbEli=%}7e=j=T$#lzz5&gv@H6Wr~Yva{D( zd&~W7=rMaeo4uc)UEDNm|IEGoqT7jn?V>PKuFp7v-}b7b)2JW2v_=MPD|x@%{*LYJ z-;*uq%j)+>j+;>oVd}Z_cNoru@zasFLUqjDlk?bRtH$+DK4;sVKAl59b+704Cqv*p zSH^Xpi7!?6rTbWS+F0df0ItUi770h@b)Q{Np}TglRstr-U5Oih-CA6=9J#j)E0Ki6F&vHPjg*xKBDmR z4w`a5W$EX&AGmy}oC}H18?5DRf7` zpyry@OTksT%PdpN87TFJDm}dmAkL6TtRi!fWr#RTLDo_^+Mvj{ zPS7BV8iRH5)c&oc;g~PrcuZSZja)LTqT3(Z0nV!7{DXQmgH%oH7G_rgdQWxIo&MhT z!PoK~)~Cy8Gogv3l~99nkD4k`!xU{6!EFdZl``>L)AKt-Sim=3kkY;5@~@rlvp;U~Dq?*#i%+jPs|F|Q z-q#344wCRB(V^0R{~f<=uj(F_Z+D#;*+;39;VY?rwyQKf1(Q`?pJ_Hv)4eaf(Z|dX zIw4k6=QZUArs=1ySdyv0dp87aBJKUPR|0b)1SYNBJ&2vspFvYK+@;|kuMxw-ovIhC z4ETQ-d*>Kmg05S5Y}<3jwr$(C=Zx($w)q>|wr9@Rwr!lT@y&Ce!;@%@i-Jf}u{yklM98+tua8W?@v# z6Qh5Be~v!gf6g7FkNE@D*QC?Z)VVjtPt%08QlhWQK+|rls~L-Wj2Qe0mRzdt7s>(k zm$qzFO=kI9fP}yW%Zi-+t)@l6Mr(|*{tmWUbDU*n?HtJ8dKk+&U78~-70!^wW-(F79ZnIOGdgenM1}+pT1aH6MDKQ7PyGU#`}%BDgjx(ciAiO24>DIO($3 z!y;4?r~q7??X!b6X*ev-ZT3IN>vWwmHH#j>6)k)ZNL^4Btoogk zGrAcwDN|f9BV4#v+cIdG_ZlFrigiJ|w(_Z2%3gR|HVjyA6k~p->636K-w$ zBQ*7CDU9iZ#KvrHmuYPAt@QrWu>dr2Fj-tlg0~ikRa+Kj6aoslQB15eQ>0?R9*P{M zH)8~SCATvzJr~i^87shhNveP*jyuYzm9DCFhsy!|NGeRDY(xLAY#V|>l`+OhvV$N1L$;Swm%(k zTTgZ7vAvui=pjEL*fxd2FNHnw=pYT7=K#Fug`Q4@o;tokIKWHq&EqkB(!mN$P;>;g zXdYecpjCaiTipB}qM1`)FS(yt`VK531&Hpuq2Y->M<&8U*4^F|rcU1c%4+#nu=>P@ zTJTjbkc}NF)Wnx-y`;WGFjKys5^8;N{$UsMXMtJ9(T)c!?aE=;PCn=|kKqj64>P#Q zUJ-Py3-^diAat~rK7bU1w$Vql@e_t%L#C{uJ2IhVMb-$5wFX3}OF`qzUcff5B6?yN z;Q)h0&b^rhYc*vMeR&BlXuzDmBMYL3Wd#4&`hc8I&mf;i)8wG@ftu!K!(q+O0%W>t zK(lsM16Sh|_mSr3=;ycEwHOn}k)GE?Lyk{s6V8pVhwUH1_Ny5z+xN;vkxr{PrUxvO z&8877jw_~hIi63mhRxjkBl!c+w=5SvBskTgI<|Kw%Xcihjh$lMtDu&V_zNa}OYc*h ziBe|{z29K%2`Z55%BvY9<8c<3!qtbr-WvAa0AEvXl7CxG-tBru$Q_3Z`~3fnU;TJ_ zBoQni{3pv}e5Kn=HX0B-hCJY^Pr0pDd_JB6l(PlOv5)!%?z`q~$6Jj4F`vknCC~ zzzb@B)&myI`jsB^zBf*@#qlqcg7byjDx`1aF~g{Crv2(8N5x*7G;M$cqMrhU5+enR zbds=fhIP`RM13FI{KgEh=S6bTQzjw1lGjA*9?Q7eNL!cFWWbtD48EMT>)2w-Ed&?xI@WD+JVusKTWI@M_5 zq%yHm&I!|F`YWh-nTP&ruWtR?iVEuR9_!1N;GP~FK8Ngg`J@Lot)v_*#9B^V5mEfW z{*SN1VMezYtC=-H5$68;-=RC5uDx;duD9*{8tHvfJ|r^fREk5YaOfw6;sArpXy#;W zv%4;MR@Q-A4#56u$w>Vw>nz7hWF@U5Ee7BKV7I7nQM(`q;jbr?A2fI@)MKSn<2MRY zHwX=f+(A$(UQ6pgD~sFq)&i#1e-v5><@XX? z4(2|O<8b519QE^_CqnB*FbW8NWz_37*3-aYW}Dl&3~sQ5Mvd7#Mo&mH?M4w6|W7$PnlF{lEHibZ-_l zUzDG46W#P_D<3mQAgAgbafmn*J7En~gt;Mc(Mi$0MYKp*gV zdO)|^oZyNHAHQ*Dxq$SbW~u!Pnk5`gM3Lc=qe!o%_uu)Nik_g{6q+DGkDf@cCHHR$ zDr)%x-zm5Q1DqsK5J_)E5o1#IrVaBpsX7z+RF%BJyvaL$-f5tCCvnb-*l|tZ!zFhf zRjDGzPH5%)3?s4l%!B;5Owh+c;T06%WRJo@achdGU&a@>L0-`(*q$-iM}Sw(7pOyy z0S0;mF2%bPBta@|#HgrGsg!fwm)%fFiABkfs2Aqt(0zFa4tm7D=Gq2{TP!}*C+Jzf zcq)mQaa5IPnAasb{nkrB8{a4$6mX}^brHq~(DnvHRJg>1OMaHwm*C@+;eY>`z#kNW z>%P387pdXcO38n1xfvB1&yEDY?E0N<;dRM-BG?^SmZNkW+S|}|25ndA-Aqc`Ksh4q zP14$6TO&K`H7@(QjR^_Ro_8G`84$wXZ<e z{iN@QSek@+Wzxb=EUP)Cul7&SP-j$HU&!>R^z$kQqg=8*B6{fcOYFln&e(5pw&?Ur zefK#Ynr5ZvS`|Yl6a`xs?4WdGK{|qZ;Cb8%{I82TcmGyX=5?OYbKd@fu|&KIfmJB< zf11;CH~>eR;ijF8I6;d|8459q*r{o!-;t5?y`XZX;lg*lQF#((re1M3_vCjBU*1%$%K#EX@8739c#ax3kI!_Q)R^{4>dh zXh#%W9(MVC|GA+Ss9;^%kv@nd7$2f$#=hA^lQT^y8+^35G-n3?P zgUqQZ=^Q4nfo3|5#qFBYqgqUC)@_Q6srw-R4B69~!@#Z;J+$-i8|F*$tY|Y?D5PN< z&55igr!xb?hO3g91Z>e7?(9#B&2uL(z`Z#Pem^AI9?v^Hv}w`eU_1AZYB>sBtUJiO zeuwhb4QU3A-M%R5&L%cs+>vc$F~e$^@O!VxDwr{3QdbB6Wub7!xa^3dR_<&QGzBLn znvJ9uKS;JMqL0S)3{x_oHMM22g3f`rB~YYJ&!Js=P2_7Z%_J#q=W5KGPZRd0TO#pz z6C#EJDNIu~-=5ZPFPK&U>vI-Yf>xc>=IYDw_E!rV8ejqGZRfrqxT}&!5k1Eue87I z8jpt9O8HseKNo3?|G;1A{z1M9w(uw8^&Uva$GvDG)p*~V6)6PzjQtx1yQy10uR@oRRj-BYdwPTvyje{BQHlD^Hc8}3PC@HkkvyXVz9G9( zbu5S5!elc+L+Kc2qV2t9*Td4xv0f4+Zw`BmTv=zhiavWBZAB3?nV{{xAPoJAzdH?R z`J2Xcbr#9u1$!LmI#&e;z&KsoKNa5AS0+SY2|T%A>gY^=Z2DWhNrfi8SQwbKOQYV7 z!(8H0Y$K-f=T?~gA7?yRHu5R|gLcwYuLKURk4)%l z_t}l;G&?MpNl$@mR72?_5m@>ASxet}3pYP+HJ=cqp1)uc1PB*Qn0(ts+pNFev*97EuEG3)U%pDqc$+|}UJLhx zB`UtJ8E-8@&o#<~!FS<7MkMjdl`v#Z{}BJjWob&OXEf+TU9NtP3NLa>q&$Ofo7FD# zTf|;sC3iHv*P0BRlE}utS^i>DhtDVoqMm)n;0HzB$gd0$!i22WIlIOFe`Wp8ViO+d zZvysJB!7UjiG1*iLX0}F_M{L{jvZ3EVBqn@XU6}iG2C{=tL#7qjsA0SCB&R3^K@DyAZ~O^U&n^iH#9Um4o12Wnb8)EUZsS9! zY3m_)X7A7(Ucse9ZRwjC%^u{BcXQD$B~;MIR>FpJ_|QMhDd<8#^AQ!%?WNlk2v3 zF@J$8EtFgSgV~s1Wk9uDDd;vMh#V!V#DSXw!+HUbNk)cAO?!nUm2k=f+_DUa(}it9R&(y^T~{=}2^d-5I&*4I011s97b3yTif3IAt|>Qe5FZkkK1*&+XbcFOii3_7gk&9z(Z znfS`b=Bnvco%$tuI&^W!Eui+hdvZ9QQRLetA?~NUdR`uJzFjlG{D$#} zT;u5SH%u%(!jTGNjwvX)RMj)8^X1fCqogA#@=Z&M4WS(PiEDOIX9kF-9(hTlrExQ$T*%2-zCJNWv${HL;vv>(K+gFF41BI9B0w`wcE%Ws^y=^gntSW%uoT&?d{48C;ttF!efO+) zm_%J)?YT;KH#WkKp7TtQDlt{lvsVaD11sqBKziT)Kt)d&aRAhM%fEjJ`~US3IQVM& z`+szwAb()H|92?le}p#wuTaSUE!0TL^k48}@T8D5s1Q=fUT@;*ppr}Muf*mU53q<` zVO@{FY0VbYb?Wr%a0}->VBX}>Uu{!5z2EO&uOA>aTy~Z?vB6Js?k2UZBInPUQ|SAs=WTdkMWto+ZSr=T;>Fc-QVQa)&wWcF(Y(h;`qe%Sy2-GFq=6{_-|O9dH$dB)F30P;GY$waCewW?RD#8g zAakcDMewj60~AjwoS{7mX88yM%EfACJ$2B9!ILnwJCB9)VT-+MA- z{4p9++JzNWdNdNZ^%8-3a1;IUQjYsQ6LtHN{_)aI`n?ll(GBoFIUHdieJv)P>Aa<3 zknjI98fVaXi~IVn!*QM1%OH8jBc-2wNG9dSFgB6+(HEo9#fe_)btCcmoh8 zr?&GJlRm@Yign*=8_g@5#sG3EWMqJGzD)Or>V#nlT0&v0k zrl_gPV6+VrhCNHnsvs!=Ns}S1Icc(+i9cs`BS(*wHYWk1M2yvEL>u-$sVBLpv-%fS zi}^zzzG|n0t4|1}Roo>=$cS;?jR+7GyV)ehH~1}9VXze>wgI~B?c8Rsz7ZC)?K`sS ziL};f`;-caRmK^J$WG!tfE_t11QXFWfUf>h%Nr$>K)WcD+p*;Pg?$Vc8rmCWkG`W-N42|b;~I#MF$mm;WTov zf2=I0u7>|~Chg1ror}UMb|0Q5B2kfd4V6v(e69#)jc6ze?bl2>1I~(^4lze6_hB1a z_~0a0qfJ00Ucj^m?WS}xsWW)d!zA|82mtTQaFVrOydY)vjd&wEo@L<8*y{2}_#QZrH`|Ma6-wn=*S0PTrkFy$O7w6Aw5GHm7rbR1l4&1hbeIIyUz zy^qSDdDg1U-qF6wAFkW*FC~i!i?nlQ6l6XeY*yjru0%gyZ`PU(1Ff^Fm1C*rF~+)W z7~}UYGCIO|eGz6~S|$jHhdQEG`up>b%V$93j3z;L2Zf$Xnw*6V-LS=Op}JqAz0;)s6>ZGlJ>tVH!9&rw`L#F5K8&F0^IQu+|(> z$5gIWJHpQ_c<>8|s8)rK!AN-(H8alD5u4jwaCpg)sOHj9I@v8R4m=Jf3;Hsf+sL2K zd9mp4pmMCNjO^E!t2e9liY?}p z*$|&Q+03l7G;zSc9~nK=k4@DLKPt-vFrejkAm{}kt=(aOHUTbxxNADgZUerBvrJeJ=9>Nm=^=w$UjE|bN zLRrTGwcWQSOYY!alrC8kCh$u1&-Jo9)E8E-{3zgG;!8%Pkjw7lSIG2#6cO4cO!UQ)g#i0Ed|VE#Hgi>9~t>a)wsiia3#wvR1FC|44y@Y z!E+$gO2AZfigFr1nO+->ebR7}H%B!7CKz6&efQRs8>&^8gWjE`V{|RmDz%hQ!E#Pf zsPtM~UF*qg(Nw1X0GLJ`ge&8CavVEN2^p`(0V}7{0gG`NqG%$9I2ZL$-PPmHk>v;L z*nb*M!G2aUDIjXL%9wVs7rSZQFt7eQ8=&|278F%k>TyNM;2rqA;r(CcbE&9}swW*%`h6#cpvd%u`-y_bSjX?Qd>&VhBq5 zSfsKxKbufRT@WHPN;{yE#bC$rD&Zlifyj6;MUx5pK@1%offixI%=K}%Hq$W#>IH@n znX@W8J8mEioRIfaUMP3>6bc8Zp*U((UP^IfU29M?Wx$2fBvjXCUUaPla2I8tSequD z?v+g;PVNv{9<#JcM}=)6KV%*hTt~{WjAOcMA|7Jey1e^6utz3>;ARXeh};yUVq!q5 z_?b~Mbd_}e5`i|it2NG%mFmw;!;o3J{zYPof?VO9n<{ul3BnZ5)36_spX>;&g-mH4 zm>~!mo*-WmV3O{}8MowKcyixua_`r=CvspHR^=;K^N|+iAfBc51pSL6HT?+LIbLV> zl=}gUkG^dOuEstr5|{hJ)n?3KO`syAGNi^QQ*^)t{8mimR@-n4L!cd6N>7mW`&-SB zrfwL6){4drTN@+9ZjRsruxc@r`1XFcG|M}gl00M;#G)%ANE^mqdZ2e8UWi>Spjz!a z>uDXJ;>=~B2T&W}RcHs>d*o<696*M+D-IhKJ3C=t8-_;Sa>_8Y)nW-}%`4P!D;k6~ z>;fkfyg_7$brGeaPLcSz@{7bhvaF>er1h4StZX5FNLq3ntse_)b!SAe!XPSOG(vEO$};wB&nIX zR3WfSl3IB!vN5csNJ=C}0qag|D3V4g4MoI?I{CEe8U4m&D%fS!s?4QDj4ETQ;MSGN zlTB#kQnlVlrEY}%4;9!}lTE}{>Nt&vM$?5<$@IQRrLGEm!3%^b*O1%OJowMvz@@++ zyu4i~MEW66wZrE6ph+vn@hf{ye$X0s5V{k%jx6^5)tdo&UD#CHf!>}pPq*xN$5$TV z?z>Fe5vA?0GdFg;6Se!Tn=zQLu3h8aH{`tmz0QbVQ}+A5+cHiJTV1)u9~d-kacrA2 z5kCI#yn+IVPTUJwLvT7C0N7VOw;Lk2JENLi65S~h-HCrplOt^bI~D@DyKZ0pn72~f z)44bD{6l&lOe#L&ArmTCQBcwje0GAs5czxJn_!qVA)yQ=kTCVIICjGbXhwvrn}OL5 z2TYc2=sdf9jk6B8ZUtDi!UIJFA9Bu{4ewHuPZUxbF zvvs&UO4IU|FF0;_fxq+jE>K}Qrov{qM^a+01e<9%`d>S zvblz`5yDAo(A48+XNz(Kdm3Z4wt=fX+)&OP@=K1(P8_!%NA2;@ap7Dx1d1%j+#$X6(FqrKFP1O_r{>uDxi;j0( z>5)~tE8zn#aGZOKXE5^b#iFa9;|6DEaOXv%Yl1`SE1Ui+sn{p#;6-8i)}ZQS!{(4D zYpj(kO@b@#pEFb3End$IdY~>HOc^XDMMgX=6vYtdmu%KwgD6KIspu2J;5hqm?k|~_mmC1)FY*ZExnINK zQU&U=82q=;bHo{9nKx131yW#Qf-aHe`^-#RV`e-`LGP-2kN9El0Xlz;qiSJU43#>Kl<=t^B@_wC)bRZ~8+z2V10D4r z8#ietO`SPGKk!ihZx7{;5^P7P`K9+w?d;ArIeZQ2h5c!bZCbRF+|)oQGX=dGY;-y6 zp%hdTbk~swUEFC{U9+M6PaC9Rc8p9r1CU2~4V{?MiT+M%f2S)t!RvcmAXkmG#+IGx zdq$-mc9Yp`ea#gNrpk!E!d|=2!z9szBEQ!%lGg^5ix5N~(L=w_!zIxJ%j;=r=q&i_ zg&RWtK;lGV*WvyK>}tvw10ya{yLvFHxrq0n_En11y}Hx>0b{P%aC%;%)IFWp<|%5zQf3-vrAEHN>sx;0J>epVdLI?~Q$d z0)55Y1EY$*O0*N<#opQbAO~uCbI12)4$~d4t|;-F+i}m)oL}=mh`(A2L~SIBv4RzJ zgCQK5$fITolyn2r_my3r3Ee|p9Nzyyx_+f}C4>7oO6aE_sWrdiy zMnqUQ&UPO{m)x#jZGWOoYBO4Ah;Eh6Ziv7UmjKB?NPIJ3WRRYh>biesNaMC^HD)KO z_JGY1aT|@Qi|lE)tSwD=Q$lWYhWeK7ZIGWm{47HI}Ej*^f!kSRQG^;)u}@3%Xt#(zv}|BvzBZRSaY>vEI0BmIxz{g1)f zRF?>B-EHAP0j}LjQ2ozX_?vb7F*uK_*dl!WP7*DM+NA_ZdpG8Zysa<~z+Yf=4v|+= zMha$YMNc%M)Kr~s)~Po&Z!j{x`Ld#A>)UM)4~0yybn}{`@iRHFJ7jD{xC%C%PQ=dVwYMMLxL``r3&F zVGvQDaZ(8OT7lD35?Wii_YeI*plpwDz=uQ}dnWDf*N*CdK*+254{^3}{mU(S#FJ<^ z>LV({S7NHCvQ0now$?|X{v&h!#Sf5XLVL7>{t9XRVg&exx-Z1K_u%i3TY45)x-qbR z`G*Dnp#b=fxj}9A6RZAan5;C?kGknVxe<@f%Y%rJ5)8Cv>_<`FL17CXK#6dS5jE+e zWMWIEwo`#Oi_F)BM>i^mn}F++HD^}0yE3HCZM_p-f^UCNT$lgX+JUgHPM$k$9z36u z&Ec}uWq0v3EvFYq8q(0bCc73xfmf3V%^Jo)E6P^we6cJSiA1%zz12w9ZWcr=2HR@C+T!{S zABjS<+0;Cg*|cCL=LfVhaPp^miDZ1!$0Mu|C&=g6;!jv9gRCXEPi z-+&Vs+p9o^Q%ELn?WU<*4+f*9F>j|qF$XB!Ly!u%GJ?CPrVo&8DFNKm~w>_Ugpu-t8hlHpW z8)&b}-r{MnS0YatqrVF*&|_RSf2YegR^c|W#l~L$edML=4M~@8t+LvJ&dQspyYgDk*MG zJX+`Mu_ZMr4XfIA;qP{z)lM2Sy-LoWHorr~XQ|Qic67GSirsY+V*etZVxddszn^q0 zu+78`L@l&iM#JvhGKu>jM%(;cW~DXEJ}Wy#m(^(Z_JctmPO#nb&RnwizWiWvFAyLP zvSYvi;FgjV=`pgbO~RM=Y*c>{sCg6&9Nfo!`BX9SmGOHgSIJt;yM-}UYJzVrEml_C zR-bj%8RB5J!qP1m-oGCNx=K#4L(-mD>E%u!K*QqTA0zYdwOOig+qZJaHODHlC${q? z@x^Q9wm`h!3m+Y-^jAm~rC^43Z@I5^BxldJO>|tT?p$T64A?zhXGLFD>#Z&>6f#@= zZGcTUTUb9;Sfk2+rQ4*G)TSKMdQA}0=@u2MLUVRQ*R-F@=C^?siZSm)iz$IH_SUSx z+uS;v{5xt$eKLTLEqiq3isMacQT&#D7CH=jk*`1hWoqs*c+G37lTGseq{XFI6WPJV z8b1*W2Mb%OaTk0O--tGda{PWR%dMxY-K(ny`CetT0eu238x*uGXzd_pkef2|o^Fj- z;^L;{RGCX4O`{e}W-nrr?_&8;k7O<{l@#3I*KCMklR3Gnm486|l#N26GGDH-`lO<( z$SS^Aya(FeWcz3uVtSyO!%;u8jNB~PE z*Dw>OMtQ)PjaF%3KB}bn8)5G__iRJ6Y0=d}!pV2}t%-W+DCdC&z0%C;yC1s)r zB1JN(@S}tAdnyH`#?QF~T;-2p23|_Kbs3XXyrhFH#$x&7(Bkc6nL}k29Mc@C`y*x*jL{<_t+G)K z0Pi4Sg;rsmA-C8{GPx9Bo|dkpX*{L>qx^`KgRx+~Uq;AinNy`TTgC!{TVg)wlX`7j z_XGYM(>RDKsz?rABfUX0m2!a&9cR0$3iiIksokbV=sECgQcy(u{!t5l%@^L68uVdF zqY^evuB+}8RncK|5K^$reX#7Usz?)Dg5wm#c%1DHA&G*^$|*I;NXu><#)`wNn0XN$ zll5P$%d~dx6nwGGNPlI~K=RW0WU-3B+XmIf9TJsq4VxLfLM7)J>np25CU0TtZ?kMF zy$1QRtSkXc=Vpe4kh=)`07a(q8mQZXA@X$95YpAtSScb-!?lV#vM7NMZ^SiqeW=T8 zG-^m%Z(BD@&dhq|mV0$|4tBW&W}*tGtrBpJyMNv2IX6ui|=ex(k&daP*h3BSH)*h?l53tpKjofM` zftciIC?{bfKhy@dWg@wjAn(T_i}qi2?kMrZdyHDj1*3fY(lgcVm%xv2XA?o?Uth2; zV4cB3_T8_@)YHH&_j_G-n8*E=|?Fr$e+VNs=eDk^R+t=)QNSUg6|tZ(@7$0x|U;naw6R2nEy(+J|obeDs`I7zN8A zw0v~bhYzxX4`%mvVMHV{5LL`zoaW)V^~6Fkus@2h`qGm1-hq{TeM>clZ13pTiyf-> zm77u#h_a7hjJ@K5j|cRCION&Z8L6xiQYH6Dhk_%t1kq2bf(V=gw0cy660T&RLM)#^ z$~eX8Le+aL$Jkeg={-;%#e=Lucd?QzaNp8O= zL=ygAt^`QU&&a{v{!o31cdkb2oppYh{%=Nme-nw|Y;%H6C^tMa?xy-;-;Ntqp%5KC zojw-0lru7?J-183W5FX4_}b=ZP(;3aoWisr&pR_{h{QQGWbSq zeWTbJaKdNe1EIk6E!!!Jbh^!2*|p1;zo!hGhK=lY6H*n^NQ5TSSj`6|mGgglgp*IG zj(#uRyBeIgdRDZwS1hYc5jxanzRBM-d0IEW22zA4d*#7DnjppD5V=N)DW)+RVoa6!g(fAm~gn%>U!a>PxqXP-Q%b&>*%{5IdjDsfZ*r1BY6 zuRF@O-M-mz=vV5XOzHFHm?`<=ABb_3kbMSI>)(bLH;2_~pOmW{XIJ5lXk7i=XKKiU zePQ36WVsl1jf5~wLfjJ7Frb8I;SStX_Ia_c@>F?Jz+(4i~3*qlryf#g&a*$BW}`anm0AY z))y5IL&Z5hQrcQOioEsi6i2#Cv+*g5$R9HjH?A@`Zd16f8?WRW8?h^#*6E6apJ;~lJ&L}< z5|9u273eb(+|qgvHeMosIVGCK{Rq}dOC4<9y-hP#E5YT^0#fe5nzb@BX6m{~+9u1G z&It>8+J`v@BGL0bPO%^9Ly~v?F`GWbU=DZxfi{YlftCV2Vvf^JSIE{K_OZ%S!m#e< zrp(7kD)sP>_Y=Qf@DfTY6+u1G!_U|}g{t>g@R|ueyMAqk?hzLy{fewf&fT}t$lTae z&s&e!v@Gz9eloGv^|UdD{UsMnCY0Xvq7C#1h0E>nS@z&AND><&_vz4Y41Rj3PYw0b zBYh_}#Tj+lDLSRKYJT}+c+*kyUJa2l3VIZ!zad$=J!7pQ+N(V@n6_9>-Ge+^F6H+; z7A#*9{nIXkn;cGF%*<(vfb2cm&x3MP6rXHBxNe1w^-Xl?hRn6MOH!sxrB6g_ljOc$ zKB~Rl1-3f=f|dDX46el~r`s)QCYpL>#Aq|CG(~koD%t#ylh#bLQ}&8x%lVgF@q|-9 zw^TB`-JOj?(nUX1H+T9+xnq*TJyf5D+IB{YL$ZZlH6qG9K@8cs_WAEc#5mL>?OPf? zd&*B(WfPxeTSpV0>HnDR{}`dxHtQ!mgGDR7zi7@(;9D6VWIa{Ae}-`MtU+}v!Bi^< zDTTNrKL7m0*#8BYNK0c*@*@HP#gYF{G5L>b-v1qCBW`78V=Cn2WaRnZpgcO&)ok{l``+qV8)O;jibU)o@4cNrVgn|5HQgR-5W$iB2IjZbiP zpQDU5C;t)a+H+IM-<5TRj$Q^nE7bOyul zIj|zXAc?nY0NXu5E961*OHw;8h7|k_nSut1D_|5hdf==aI>2>sOumG|#+W?@#Mh^R z($W^cjQ}b!G@WLx-kD4UgrvCNP?pm5ak&LJAUpk(5Lbg#XX6Q)w%tNS$rPj({l_rYGE3?bUm0>2oY&RnFClzG?{&=<^fKnBvYQ~)^AJRyf=f`k)AV9T21%{q}5 z)QKQ;nV6P^*h0l5-&gK)@7m9ZmxNgH{vjkt1A%?Z7vm!r>qT&xV>bM0sS!@qyzN!cv8vsif%$3Q$sajvw`vqDi*79hN%BEWWLg@$LY4zLa!oku42{=n=I zSjiCYYdD64xhZjbn~>>qBnI^_LO{@CrUPd-52Q`vWLdv;NjiI2QY zQ7V2iP62wKFzGKSVPjF`-@D(#ibL6%Pz_Lh#)#QrANtiQr z93)tLo-iIHoYYMlO)&I$zBAeEs>7)(_lZ}miPB|8)Q1#5P~|q0b>_@qsLxh8kZPWJ z2?T~Buu7Jq^UZ~o$Ici^@Z|J=bC!4%uzG{crW_zaIPhTbl$pg3T`EuG$e8n5z*i|x z)1F(FV#h2=16>g}3mdnMsqA8Pym_XFGDNXp{ zw54HO(}*-q{--S{h7Jqs7K!DJ1u27&;4mdOdGE8lbUfy~z#ZoW&sv>cOx9s@4NSR; zuU?)uozsHX5!r|{xY`)f=n{9 zNd%Kb-v5OxZb>eZB~o?Fcri9VfTe?FK?AuapTGk!<&Z#IvR!3e=*LMlL^kgxrYv4N znCECu%0&0g)T>f^F!R)sfXhbutdf{dO=LBiL>_K{hB0!Ent}kv)Uq;K$At5|9$LOE$>) z241?=qD~RJ@~~ffYiY~Ef;4AZ#x^?8`csO{o-=UXbO_Nsy|^@73N5+el}&cilChG0 zN4r#>#2Qq~@0yqb6Xt~lDIIm4OZ{1+Nh^Z4Q>o}fnh~aY>j4#I^74uY%QbB*AHREF zwFm2RC)V+T66BN4^9u9+!VUQf0p2sD)HB7@GobNGU&=LP!aIrhO2CqJOx81l%iEvH zJ1*cE?VkQrpl=uyS=pzwJSzv6WI}qHk1PW*B=h~e`H)tqpPFZM8#|7wC)N#fK@2-| zw+eZAu2}>#A^z;J9jhp?oZN3(IXk(_bD@M-(fCAS<0ng|kdo4ggZbCGSwoe0b1NwZX&NDz- zpSCiQNTCwRSGtmU_S42SyDL0j7Oo~-Al52N@76i6l<~2VM*mmak91{L>3NfGLc2A& zIb*SQqiU{cgl+>WOEFqj@$sQr)xk@EfzcfbdoR)G#Nv%k|3|F2p8`v5UAo3vAB~x- z-7KiUsJ5L5k~!#xrSpX@ddXGiC`hK^hIsj#Kj!wx*7}B8iS|^WT{nd`cN-lWe1g&# zX~(%>D^E)y{)v`D-g_{4$%%f{WTE{q zHDj<-=-s7b*AdICIYv^0;RMytMFf2YI9Y16-|E8+i|*U~BOAdlkgi=~px<|ZvCIK8 zbGe**@|9O>aM9jya%(fTr9;;#@Ouqc#(afl{M>}|m}P!UI^9|C(w;9Y#yFFEjUqR~Il_w-C(60rZ0c0urc z1S!%^jpVmc(9`snnXtLPn|zSj-rWQCYMAdcf`YdgQ|wco96+ld$VF?XtAAZ7X|MnQ8j1G9UbUKg(S%A z+|$kjREWDfwIG^eAy5sHswxx}mPq-`{z{03o_3e{O29Vz1UOrh?J$O#AiBS5cj*5b z7*fk@nC_kVh3;;T(i(?Zhc?`uCX_;-c0VStu%_VLFhG-aL996DgoseMF!4Q~h#ung z4Ep5j%7cdw0SaRCG=)_~HK_|oMfvoI`^o1<)#r*lhSc0>T{j|ZH z@35=78yCO8dTo{pCN)9&fRFyZ{vU_V!|+we>!&PQ)Bjj5_kTQO`Cks5sF91&fBm_l zG+!TGwe*qRlW9^8mTp^exun!0_WHq$$se*cZltL;JJA($vD6lMvMuPi?QxUoF7ziK995Z@|ULJzV=sAAxZ0)e?}`=`=&kKiuu~(uT*M z@0>eLLGz*t5cA=l{PYn=K$N^`j9Q&JIdou^1(=|`Kw9yY-7EeawU037p1|HUF`VN; z-!mG_dx}oSo%52PFlCP%eJF4nq}~f$L{GdLxO}Ni8zh|gFv-%5xaP#;^-!nvl550< zaP1(Q(J)e@azuNLjG3EDNr{BD;0iH-fM6~G)p@o&61Ll{=2UOwvGFr zdJ$|Po%K~BA9Wpe#|ecUz#iv5F&0Bnyg45AvD!q(zG z(COkhFntWxI^(3ggAau0z$w3JD`Rs{V3P=`C2!I#v^p!#cy$u76J0x}@h&8qMDuX< z?qOPYx=Ren#t!=w#nOoq_b2Z!Q&;i|l9*nOo`4aoMsnW;4pEd_cXvS7?Y&#=`>6Ta z#bxSArO86FTv-&Rzi~zr9lgpW!G3%OmBuzxneC9PHwv$cMtf%Xkq9G1P57~OvsGk zGBWr^U1;)p^K1CiT9smAw>eBWdwj6P7iS!b*3+e=RW;hH7f+2ZNIvW@-qZTspKAp( zPvCk+pWwbn4dL|mC6enP5!ox!j?BYxG~83*S{(6c8kzEouUlRd;IugsRT z$ZGY*uc%pelhoK*ekf^q7e6%Sd+oh*Gd`o%VQdZTD-D=esfImR2P^s&-BtEmciG+W zzpKqPBaCDC1hBirj=jj`5OW=J#hvn$-T`LPz+_?OlMIIMTW5TBCdQX(+p}|$?)}KS z{S^>0uyrU4EuVJ0?X@%{M<+63bC78=K1$I*r&Od6FdA_*kH$S8c&eV?vURw)i?yb; z^{=Aq(2JI0+m0_mf=Z9ucj5hC$CP>#rg^V^DQQ#nXcD?X-WxLSTH`t`!5GF7q^t5L z-T~g7wTh#=Y#5C3_-M*Amno-w^m<;8X`t?1b}j@HIEU%_j{|E1>Bg1q@g#nd@LF&7 zvCVF9)h{=7Ky>h0&-US2hAOABHV#|Q(@x((`sb3q>_uj@pW@G~7b!8@SxkfIGA-KL z^RottYFe{oOmmyLDRlcmbkNQ9(chy{u`5^1$cQ=2%XI6Qnlr8BTlFwS9>a9wnYG<} zJ~T&(S)GZ@i2}*8nSyEq#nf0d@>6q(cN5Hj=&?6(tJ?{X_-yv zql5G0tRanAkC{UaH7`l4%QDY$@m-K}7LX1>y86{x2M#gxG zb6#{|<&qTAVJ4Pc-eL4!)`nTAEK`JP-A zm(J5TmIwu`$SByp<)_n-@~ch=!Y%(!uOv1Kkg9q~G~wFZ=q)yd{hrS5vC+Ol-qEid zofaBp#WM{1W3a~q-s>Pn21cDRvuX#M;?Ot5lRssPL%4gfGUE9>CcA7Wyl!XA^IZ0g zojJC2<{Xw}>zy{`CCMydVhBU=sgNir_ZdYssE8&`zClHz;eMr#R>{}c=yI#-Ve#p- z)CnO5g^)&#L4e-ZH5om#{6ob_~5SRcEM} z%I}~XMS9~F*~mjA268W2%ZGf>3k8N!J2Hu-tL1o3bP2`p0n*t9p{o(-f= zIIvoN%rW^)^=B`He%BOFdmRUhr}c-L(^y>_RkO27(b*Doh#X4@S?^AFWM}_{_VPTD zb+29nFWY!Wu0@xG^(Ejd$Vq#Zgi9HNM-sKnthrW+e3g-72oV&#gNndbtX*Z?-mXqZ z4mr7w(D4SPrBmK%+--fd1xoee_iO_N8TSc>Y6Eg*Nt(Q4#fYnt)vO{P8J#oOx?8d- zqq@JX=!!f72J(a7c5;3P5jIK)ObfngQB?EOki36z$IjXY6mZ~V5NrSQ*)PqWRx*q_ zs8-bWOITN5ckto0_SI335&EFS!%`yb6629~FB(DWD4p8;xR>7=L29U;aY1&ERSlr5 zXzfCRo$p38f>lv26y<}VNaF2FqDWNXt(<~1cflHe#BRhcJ!UD{q-%6vP=cTv^i9@| zD6f9(fMpj1nTOxdOumr8Wt-COntkj1N#8pENqg=e$ACY~6Yzi(d?$4J8%4b%Kfj^D zuCc@SbSS?8O}~k|_vo}2PWu~}og-4k8Tw%-J+wbZ>V+}tB0>65c7DXIx0P%C)<*1g zQ7Cm0zFmY&?{YYMPg2IK$On4oF9>9Ub|sV36qfo~Y$ zk=r!^!OwE&7j8|$gZ#23=!D-Om-kdhNJMsU^goxEKNPjDxULT1mn>cX%F~j%ARWNd z{8?H@IZOV^@d8^q_XST8je1{p8BeYnK8=RYW%_fYBxxh$khbx)|Mji3{+I45s}V$^ z_-#GBivCZ!EA>C=u99{xrcQQ-HvbDgnDX%SL0)b7da}rxx9B1u9t?n!BOoB@Ye3d9 z;s%YjCAtA#!-!5CFo-h+(?nXpU?7y0PGXUjS|LM`$YilRZ2r9pEE{d9CB#1V*L%B- z=E_=sqqNRfcQGaYhVN-cA~giZ;cn;T?sG1~dnTLnWb3Z`Y0LRxU{jyx#~!qoh!FNC z)t^7ohNKhyYxj>g={wHu|e`3nKYI1qPlpnM=#%J0)V^tkgh65;`^Q zCBB;ENg7It0@~)&DKbW~8Cq#*>rBbD^|XIxBNKI|HCb z6JFvc8v>iqWKN~kbsC#JcC1Mfl+rb_xVV#QEQ}e{CChW$>r4G4PG!r0h4gX|sjY03->8aqs7KeF=`1wl(w41!J9X-!eGOCj-b@KAuis9G zn&R=mxK~+d^m;DK-+XPu$;O!NEMVKf8Clw^Np-}nkupS9tV)|*r{I-AKF6hBMTWjm z{pUHWqV=?K4^|1Hcdt@MADYH$L~7x}z@kH5)$c=@YR>m-@5%z zAGDQCmTU+VGWDc`oh(7b1*8zfT!ZBLDnEkAb0OhF9&X%du@&Oj8R+%9*nBB!5uw4G zMI@|M4`mg38A-m46RcDZr>)}fq+t<{1XwCbQ^l7|5^IWrcW%+?vV80bu<)0#!(3_% z>+9sDZ$xbX_)CKc6Kbq_>^-5)hxMu1ylA4j1P-6Dz!jDyS4h86*j&*Mk_g5LJ80na z{T-^4zyLy~eb_b2$9M$wp7easf4qmGUwIxfSG%2}q!gW0x1x{8(I$FK93#QjEhF3~-RFt;0!G zby0$94n^>J(i=r&rVky_T(2CNUf@~v?%97AkL7kpvN4PK!>46d%HZn2I*L?N{pk5O zWEh1~?B-s?NYPf;#hRs+cmmN@#WiK_?x%H`Wm&DLx2C7na-t+_G3JF?(5nq=M1u$i zN^B+Kz;EP_+`YYqC#0d*-0<}QN!*5hk+>BcvleG1vx}Da-vT2sYqAu0lfUMX#@8Zn znQBUYVs18kvtO4e=eRK4_vFN`4UhQ5_$J1JnXdEc#8xIfaPmx!pv1y3Jrfh;Cq1&+ z7#3*f#4>_ha%5Hy5gJzByP0eYr-3Uj+eP#79xqWPjA!`kdq@F8i}wLsh1*M^cDNL!a|w01+>>gh?(FN zRPxhh9M4lNu}Mv&8WUoRLMG`d`$?zpdT-(i$QKE0(<~vbk}bpC#$AZ75*7a`8jGVDq=AxS;0ie>N%H%&Tny7N5scDP(rSD6yo%&XXvs}+j6 zQQuYM)Iy3-L9BQ*=ZnNNy;?0$=ldl@O5qoAL)s5#Ono`}A6Ek^u@~Eu_=pzu*pfO= z?J}+n+dI>cnD|DKJn(DM&ir1>qxJV)F?;*%!Mp@YAuRI*zMV1naT)B`VbEY)6iR=c z8Xgig1?ZZfshHAg7=uh=4A2Gg$pL%{A#AB)zAv5myu_^64M*TEv<2r4paotB-aLV6`KXixUW8)Q=VbjAm# zzkXV%fw4_|n;V|JacL=G?PO%EZ4JWaLdm*rFJ&DuN-UJN(L6%IP$!de5|n0*%Aq6e zhO~x*BD-u;@)F`iBkoBL+Cw^_5%R3J@xzhx+Av+>@vVyEj%NBGawXYTDpDj;=0>O5 zcE8toxt}O&KPJA+W0r2)v^5KbOhntU9h+7TRg9VYnUPSFO#}CDZk85K@+{_d*6ee| zjJlYR!d$-^bL*(gCGO=pFILMggE9jiGC3j>@-7L>ReqzG|>yh>hE^KTZ-@K7Ot0WBk2TB zqewTFe#F!}yq_n0{Q=x|hD|L(sooU81wcTn8N)$Z|InEG0hWXL&P8!Lv9~JR9|qfl z4b5hDBS-4+@&b?1BcIGx^Or8u436IPhZ>;F}-7Y6G`jUvMI z{DUIg?1qsd-27%UpCF;1yg*=f4?=O|RT;>%+88XqUM%1aZDlja0XaYl0Wx6Q9o8kp z|CJBuCmrmb8Bk+Ez|$cJQ1)6dd?xOHKq-Byrx zd&%Yv;i3{N&3lf8*7(Qg2j*_n*&qAaw{G6qr#5rnFT=YxZiliLUw)c;p!9uiuzB|b zpsi13gb(tc0`+i%X1qstaY7uReG@fk1JHYT9FFv*2Yzq@^lyBE@>YmEFck)&* z#K{j-Cmvo=vOTbr9ce}{KrHLvj~-t4M7lbhx^qL2_4`$PXh$!4npb^2yZxqaq}cnQ z6Kc3FmU|Wvst4=e{3LPp_->noaf8G>z?~2Ab=8@^e9$l7y$uZr>`nB%y==)q z&tx>uXwWydD2Ln>gHH_TyQ9GG2(HhFsr#hO2d1F6&@AtugzqSd@37z9Pwe}wThaPP z@P47%w_LNcTHzMMMwg>MI1obMAsm5#cU|%Og?Y@|4(WJ6gTUJM4XXpezyOH&qgWb> z(K#NV)&|0uL>?&C1}E(~F#}EU7MR^&=<`fmFog$5j+8l}GSO)98e?~#5nsff_=5f1 z#~-b z+d4-^Z`4Y*cGZeq_P*1=?TKGL(5Xs0*68MsTPCMBaaF2S{pK=5{MGol53TNSu2DPD z*iIWgHXFyW;yZQ$*EUmu zfLS(X(uE66H2~KQ_Ed?JvfAs{f#OC%Ic(wp#kRRQ{JI6x2!ZyAr5DJD&N~1b2$J&2 zb*HB}m8|atTi5U+_?=gO_YD6F8 z7#+DcgqXu>T7dDlvu&3^V?$ znFSnxIA_9D2Su=$i6}*@HM)3ulRA4eVl)tVnkuyIASsE`V?b0V{`pIq*aS z>wG}(tV#@Z&Kx~M#2q6>)h@kIM8AzYkvJV%6(Q<^%;y!AM z*Uz0e#^x&}$PH@pMNV3i4*Ovxj*g7D^%7A&9+o#6b>}_AvE_!)rbEy1BAn@=EcjBC zycNuWq)WmZv0V-7Y{Z4S07ab<)E4}jlYuv;$l?y z;l20t36I^Q^MZamv&`+&jb}urcEqvXGaBzlzlGJuhqxv6$tZgwklWMTiNP6?bcVtk zQulx}FRC*_-^GNuWvvbjj_ZkKMNkOuegj6t&iHheaSKjl%hE51zbNh)xy?_az!9)M#m&e%Oy^-y~?*Sw4iTRTrz6*^_ z0@V32swm45OAXoLmU=}E^@eCvBpQ-bUg1g+d*}gQpk@#}9HOO&C?}{gv`FCruI}1t z9anIzsohQ#UAS}IKzTrM&c4dwYx;;tvk$3%Xj~^=zcjiVXK;4Y4iQ^SSR+a(pg%zK z%5=O4MN??*2$v%g&=aQi%C$1jj!>+uaK<8Zk7IPtulInKUIFT2A;uXw3*PmZ)7K-S-&#KJTO-tK5TFEB(e zRLNJU)a6VNNElsqVHA<@v#Uz6z33=|E?*lcB zhMZMj?CkJE^DbQ}L(^w3#;Xgk9w9Y{Y9+i}_KO3YwH-0aO`&#+>7c=Y$Y4`}d*_|K z&tFiA)YU#!e;!`)4B*QDuxx!EYRF0GTfCR;Kbl6tuFNrSEHmn8pJbJ??lC85Z&qu#r_SJe z5c&0`Xv`gn`klPN2<0zfohk(EhTVfPfUMdf>!&#^_6Kn1 zl*d(lq+BRFcP|^lXcXB2T+brS?#ipr+BD{%UB{0Fidt3y?BNz~wpIANxA}XC zk|@xuVX$8%K!qg;&a|TCttf|9lO!}PfJKEVQA?~yaOb@6a@NkAlPM_7f1QnzbvKaO zs5XUx^#|;`S_tvUDXOPb^MXLV1 z8*yY(>dukyXXjV`X0BRT8TUFY(Mfaz_qM-f517ra_#nPNuEag!*dO7AnMJAv7+3m( z*ge!fgN(Z%n)fWN`ojk!u(~4uaA$wv{#$S(>ptVg_(q9Ue`{+0nWiQ9&w`tqp^c@9 zf|I?Ay|KNGkgJ)QsnfsIxBtubw>Wvy4o4Iv>??D~&D_ZN&;VrL4T+%P5I~Mb%|L?G zE+G~hfibG6R$h7`<6dxGsi^wE@rX>2$^%tR6gU)Qx)VYRAE3}Oiq>E*K+(yks-N?v z^ERyC`wqT`Y}3pbWz7u8H7JQet0mQtbs+B73d(|7K`w^kVg``b@2y*EUN_urWR7Y- zfextyJG*(d4$eLU#zkh4%N=e>7{Pa>@uX4U|ov&^{1d9$J?PuJ~@_ zh{Teiu!5`dN){R{i7l850ed*oYH$`j8%*u@56i_Zb*+lT@kdD|edh|L!fhe%2^(Fi zN)0R{Txd5GXv@$2ruba1sW7=rsn$T?VRqFxRTNxN;grW%h!s&e2zj?%g>f=?QK}nT z9E}##54T`rO~kCJ6|#EcheYn(DJ2yyw=VtD>ip{D4kOWiCBk1aqr!p>mKA+9{_6Qj z6$OUOY!!VYMarlpQ<(%UoY0mm94IDo)W0q-t*CC+GuUmGysm9{Ed)wXF|o@N38_y3 zxVKcO8r*jre3Zpp^Bb$NlsK?PV*J?!#F*73QkfuBo?|6(F|3!tY@Sm03U~@}#Mvd0=;c3}dy1Sl#an<{;IP-gnCWa&yB*WB@WA#!fEY9_pi=v4-e1q{ zhN(c!S&ObRgu_e$zlovk4`}mWys*;<-iC@;u?3_*)TaSb6*~ z0D;=c>XVPz=NAonBEMNQe&&|A=?C>QgY}1pvH;GD-fxTFn*jYB!0>~Bs+HT@G=8Q- z^5F>V)+#yXOUU;o7n+#4zRdOdl2 z{d@+sHg*H7@bxVMyC5Rg*$;{_RC_1Fr(oB zLc;-;&KHlj#7O1;@$WFO1D9b`f1l*}_xnGGf%pGA3?imxhORa){}Y;jcX=mn$}c*g zjPjRtqD%z9p`zF$3$ihy9Rv#{pu^7BpMjV}^n9@SMH^YB)iVFp-$#xh>&bi;$6T}{ zN=vw};63rNKWXm$^7(@5%C|}=vPmej`8!60%#WWnl|}PivRrj9f+JL}U<Mkn%>8`rCIG{pnL0MNI#9j+AZR4`%7P^4lUFW5zqMk#$92s<@LD6;Ri)-gq zxw))s*s=m0d+CPI%xmjDKmeWD?YpV&XOP#Rvz^mhcm(1HG_zSx{%ZzggJV>wC=F0W>&>ew~khSATMa@ zYCh&HhNR8kf66o1P(O6(Tr8YK`8PV&d$8mk--+`5gkj?(%#u8j;;o1w%SPRj0o)&0 zZSUL@L&ZY1m2_1~6*FnE%5~9nrZn1!+P4 z{Jt+>|JA*hoH%K>sDl#Pi%af!u=|pg>`nQUOa^JFRE|+B6kaHm4+Nq>5=MT^0&u#V za1-c4O%o)I_W;6!ChSx@h>YOg8nyPd9{2wGygNj{3D}gi()o5vSw6}P?RQPWCS#Yi zgL=Fpn47PyJJ1*vI?32kcjou3`1zEa6*6z0RBJ$M-k*sYR+E4|lWmD1=X-@CW{4zr z{3e$lG^gpogX^9aP%sziszhSti6~-i}(0iR!6wx-qk0K2O~y*k?eD0WY~mbMZw~x!%wbZKj3+E&P!jj zNqK&aTOKztQflg)3o}rp^nA^KA#;U2AV%3aC+Cc-52k$ba3s(fQLj0%feZOGNg2fr z(0)V$AN)-J!FnEWL-fHakOKbI6f`#ztB;WHcEbG^wS4Xe4OL$Nm3B4oV?#JIX5qNz z%CYOb%L}EkuML(u5D>?$6*#~8?_7x zy35+wyW9S7CCPD1(hF;!vV>V?%%SJFmHLa8`HPn=a*kSSI%bQI*sGc6Ip_Yl^X-{+ z&RypJdOK+gEb<}mr#n7~zBvOW?kdKkuNw6Un!V9%dCk`H-8q0kbBhiIg`%3!lO?FA zP}QwLqs_)xU4DcE+mM(WlHHqEs;kp@KDXHJD!XD%N$fUY&*Us8 znQ4DrmU~RAk;h-O)sXH&9aWQaBzW61QMH}BkXyJ0jc*2KUoKfKtS+gXgXHcY;=D0H z1`UO3qpm~a%-X^n$eykK7TvXmKIRWs8s833?9H@;=K1Zl@^rNs^!_$<{(zm6hk`Nf zrpvH5=~jjaNi^YBFCXwSt|VDOrlLBrdX?oie;ZkHRtt#?+++pOiqxuRJt@F27jMU_ zfueK9EwRf4+xu-X+otBdl%A7=Fl3(HVGV(+4;`D6iTelsQO3?qEnyBp{f$hQ>Oq$K z9MEwR>lcoOnC)j@m*~A{$FWR3p>d04ZPyLP)TJeBz*0<&;jN@9Rf4LkG~Ln-Q|EFi zrp>TjruLD8<*P|x6R3dz+q$az5wgAb84;SBrm;5-+H<%9w&`3%&AU;*?d3RJxm3r( zqYmxV&Ie;QuL;lA?Vzg$?D}Qi6|0|sj=Sut?bY?OVo);INIr4fB#~$Glcea}F`Y3g zOEMLZLLyH%ZucLfMsOyC$&gJ80zrflplq)%&X z&ARHJJl=@XD^r~A_*;746y;V$x;-x(d6GjSI-}K98Sbmt{qCPge{0%5B!0@?A6m6g zOXbJ9Ywbr8rZ4$dwa4uCfu!yhF3O(l1#MUEFHuvF??LU<-?$KiBNR^CEuHfNY`x)!wP{=hKMY*w zHkyt1Xw2eB#PWtKaGBx~dk-x}{60{l(_PYCl9dC>>sc6e&ms5%x`?(_iPYk*z?wmI zx;*m$oq&Vhwz~mBK`npK7l<5^AW+0RhzQ?bw1hW-km^RnA7YH-cP#Nboa4-w%i(Wp z_=U-cUi2wn$O(Cflk~<@6%V?7a|Xc}eT+0C5>AZ}45+|(bLOE;e4C;@A|g!^$7zi6 zzukL9O`f*t22tmlL^4SFIpMgvocKUvj1q{0`&5+aM11Lvuo+kC!JA9AglQJ0S>yx5 zA9-r82(Ig#voE0Ngv49CVuK-n{vZniP%eRf*FTRL#D$E~7+Hm+D4!|RX3(PtHsK@C zu4^XSBSTHXwdB`O#9cL_Ku0-Z=jMzF@9`NUfZt#;%J7&N?2Z?YnNq!m{6wv`-eDrr zTJ5B=;3fEa>YO)57;fwRW)VO(FhGY+8OCH=9e)|7V(g>6d8jIL4gxW1 zrBgXb$k*hq-Y;2YN0asDK`~);z|at_(i~(-Dj%VQ9rNQ#A;Yt-`_ye}Q=@v+h(~&` ztMNp;c4(`$xPy0~O58HiUXQv0nhXK{h8FEkTDAQOwFT|XmNZSI{`OlkS#iSit$YTX z#<=e3ImP$(VH~Aq?g1P(y0AUs(SMkS;Me-$*T>@|?u?n@^w%ggY*T!W4M%3XCP+0l=^4Sq|_Y8KCE5ACLW!4$WPP}-#V|GH9| zLEj;<+L`{st-66P9NB(n+Ju?3@hA3SltWKtWU8xLohn*WIaajUn!;ycsw7> zjZlbS$}^!4>W)@gk-{-!Pvea3#~74x#9>w;u+k)Y!3ST4Oh1-Nw`atGntvA#`%}}o z73Wnd)Xa^lcVxwZ8XGdx@DAeknUe7E>3?w>7y4QCch-ip>XRx&!kQ&jvhEk=c7PZ< zcz@abi}e@GzxPRy_~d*&;6OlY-`!OI`L4+LkDJc_^^Ex@qyMXs>c4kOY2H36zrSZ4 zW-}%;I5{QBgu@u(lfwfDk&zH!I07j^=On^6L=c4vlEx*OGN+1}k?qv9)SEZ2-8x$~ z?B*hgth-#gTZM0g1hpI5uC7;7_1rdHH*2-qI&E9FsiI8y|747l1PZSE&v?$>@%?fB z=$^gHw$JfN?oZ0-yGgKH0?UDN5Z{jq6p< z+EtG8SAh6b#6`Bq`M;7vSs=@|Vl(wxfh^|^A@xrn_C2NF5 z@z<*aQ)!R0hwO9t=lfps<=B&)CNgU$PI=$W@9myto}^h zlUut*?`m*#4*AO*+*8;AS6kJ6jx&0SwmB{CsC3VWLZ*} z(9bhpWP~3j{tD(!m1CnCo>W@_i3wp>-MiTnZ<^3ANWJ5Gr9fosTDOy;W?5c&rt_hv zv06w~qN{0E~DPKHlNL?A<7JyM)TSn&E$nW^CT zb2a45I%!;_af7a*!Na~qmwsTm6h%6MvgCldM8-$x^h*&nwEaXmQ08`$rKEi8i0`pV zRlq@|jv-|31#%2bdaklcHiHhebSgfdk~w8fbHa)kE8J6(l`=(%bc)77*EvNv z-nP_7z${Ct1`k~#be!HKmJ)qJNBLMXl5^T!pd^RG=}n-+Ib_A~W^3_qbH(!P6d zhl$00o|N0wlGQZ0Im4+%huFgT7_yf34vkh4l9_wAC{jJ!SUO$xRHH{?mSZ({FE3m{ zdP7QV0ZNszsYO7;L+`<=FdU;>jY~gd(i%FIO`eNUuWak1y>+i#bB;*Ir?vIg$oX2Z z@R~<;R0=E14mED+U$;W?i|=1q<*JGMDf+64U&ZMS zt5L7XpmZj|l(T`MJOcskS+9AcaeIvug_MH}evF=|VX-o2T%l?;QXkx@c|$ph3=$jx zK%E_@%5d3qD_OqZXgJGk0W(ZRE(v1ZnSgm+A<|I^*io7rqR~S6d8Mb!u;K~ptt_lt zfnx{EN()x-dm09Xjvirors;3@94V8 zGRo^xvwT|$#`G}0nck$c1QbP{5HeTeGgmHefX~lg_3s-|1)H_GR*dPR^||g8c3ElL z!%FRC%b2Fd6CWh^p-_8~Z^BWf%SzVqZDJOjqdo~{#Ku(>MUI8+WqqO*l2Y|_q^p|j zoi`+1WJxVHPPUIp(_cV|!#Op~N>W!xv?@Fo}BOR`8+n6TNsbw?Xzx7xN~2q4SR37fN)R2L+onKh+atu#ba zYs{qROslqjv~X0E24S!lHf-r_hm>BH=KaV|ZW)p!fIa?D^~MKF?1RmI#Xz;-;=_d~ zJlrW)))AbD)xZ*#jbASZ)b&N+HwzaW0>qokghy}SCZEokl4)I6dSreNbijUYD3+R1 zJV7ue+gIPIm#b3@M%PoHP9VT`2453PyN)W!_aV>0JJ6i|^q~9c9lQg}oQ8GIO09EL z2a9G}jy1wN;LzuA?YJ|00vtBmGS;iMaNq?b%wYf3BV*TQX(lNihRbuzVF4z zwZ|mH$@Cf!0@cKAtzX(jw>MS4G?U?Ecaz>s6rBE&H1FGoiBiG?55|d7KUo!a66-pF;z<(zNeW*-F$2kKXK`q=_E5qEy+9S`J81!aYocY!p zR$J`RW;?wlrLN+uZg^o)EX)9E-Q1GJa<>2i3c@Y;;02ZDTZ5`~e zF8^EyTQ)>rl6Lsr)y@6qYCD~?#{F>O>{Uo_72R=XP!^|26NPUM{e9q+Vtu1VKx-(TUa)l}U>w|%O| z`fY?+hjRqdo~U<0ahL+TYQpfoY6kQ6x}nI&vM(0FoBJMV*(Jx@o69mov!8FPws4%{ z1^cZNdaPid4kfS zdz@JM6c$ZVqD@KyulMm!7;Byk57`!3f8QD+g+8$_a}oYdD=H`oa61LWw4_K+U~Dd` z{N8NDw@$`|RsJ^! zQYom2L!?*&2gC3*%X|hY9vuojoY5SKs17L^u9A?93zE`^+wBRXC*j3&BW@;8)?NBm z|L!e-O80Uvf`_cEAgkAUXJ+<00xwu?pCelPwt#euoTld9!s1MN`kYd38u;z_|tTlVd_#S<0_(KkJH z3i`I7;0Zm1%NErVWN^iL+&^kQtMF7$AHVz@PU$@>yYB+A+wX)5P;p!iBx4(FQSLYcMuOsdCG-KwAzk?k8r;exnCi;uA72yD#%JI@ z2YBb9e~a4Jcc3+f!*&9FnBJY&^-3vWdA<#=w6iH6S6WB8V!PZ-8DY1JY7NlYFS1;D zQ;(E_vDc1(g1b_Gj#)nhz%q#78Dc!6fGCSg@e`IrjAE2zjHdIG$%_XdRv*zfmoLo9 zg0~No?n(W@EJ7i;Wr-%q1!oFi)RQsH#OMy!%%aFK$TqSi&3$pHVsrHQarG12-7(!f zSu2Pwb>*S}Gy1Pmq+5n#G^jD@Fb17<2)W7qs*liPof$at0?d7bMDA<*!k~E!EOS4} zz+^z^4fFtt`hr-G+(Tum^lnl^>}0Qzzw`(X-B(a|VW7DjLr+nD!}o{$*&F!g>yODL z+f1l9$HqP+Oum8Aegga?^HAWblcAbi$4aLZbwp^HTP!eGJqR3{&Oh$88*4B@4p%bQ zv&xiYcY`hOOG7=!Ee})7@@HQV^Q(;O1_5u;i#%mhCKCfkO!g#&F!p5jQU2c=(tlOn zIHb(VD8FkgMPUE53jeWnK;6>GRLtJV*3jjD=kc;rcIB{F(MJ3?jWIxkpASh!1rnXV zUl`>5Kb#WT2%Fh3m?9b?cm)DluMNP>fu{h6giuPV4~6pcRXY!*>SegX=ljy zagS>)aH=J2?AD$&_P)DXO^+*&^1Yuo#0=9gDZll?JT{~Q3t7Tgs28dq2{e+9GgvMb zY$Td0{wCbxSIJ0zMX->j$b*4cdl4E})0<0GRRrZSg9@SF&$i1=v*Y?NZ*kY70QDPG zxd{5FX7qZCABP$gr_7o;MU50K_>fi6pNX02p@o2&YlDdrt1?JMg}zTT4x#irz)T(; zZ%RDNUzL`b^hnRy7o$lF^3`Au&v;O(`Vd8_^b43-u4~YraTX<0p(tGh&6Uz&*c3Ot zY#DKXX)r8}(VN^={2T}}0Q{IbQD0b>!OlPz!It34n>ABvXKS7(LX8R9xklce>S55& z9OqrEAc^WR=T3pB898$$R(>y1THlg^dF4W=$U<|OU5mY%g-(8ct|Z_&vC|F;tiIA{ z5B{K?WS*+wm1f9xojl&DJX>e7BOCm5?j*yQP2K)58Fr=iR%<+O@9A`{PjZnNm91UR zZQ1jBE6roZeG1%@8U72`M07V|sA@Iz;HaDbY$nREB!F&XZQnVsmw%nrnMycc3&2}? zymC26P^Yaas61P)Mm1k`)aMKg-_v`qD@(%ftl?e;;rBh&J`2vlorF1F8f6F7Z507s z{6j!+I^9L5t-9-$lNm{gQKjM6U#V4UZwpaW!ZXV=r6o7)|2d;PVVa)9m5^!g_1UP6 ze2?zi)YWOCmh}rYgYpmSY)9KEo`99dq_;lPy5A~IVxJ-jD%?lF z7#2aqL5)u_gLvp8{!VW+#C3pZ6zw)-JOr3S)F&A!iGAK3dY-L#oy5IG6+3DTL~Ot5 z(y7?Vs-3H6pr^w1eBsf3Y`vCgy@YGN?fl5H4kp(GWJgvcJ* zW#5;|mZf1-Xr!227Zq-~h?w|)Q^`SQ&cwyu-N;t-Crsc5=m^=U?eCYf4_us<6*ShDXqMdErT+Z2m*LSW%H>Hkt zv$l1l9MS&m(9z!?)}9tYf_K9yaYX&LDUXL411~MnYxko#eNzT1D^Dmn=z2b<0-I{ z&*G(G)yw(P8m8G>G<_5i{(DFrNyaIgn4^F7`L~u!=`42gl4e^%@g3>h5235Z)L6D;H#!;V(FDk6K($xQ*Bqcb^w8wa6l&D zACFdrFM$`gFI%lBvBGdG5J=RqVIUFYznR@Hu@4EiJDj@=xq_3e#V}*wul)S_Dde)_ zY5T~hQ#mxZ72XKqYLn4Lyt4o) z=nkb6{XZl_@w2|Y;sec9pSpK+6!GwJiuPTIiEW@O(E=N1Pa;%03?Vb-xzgQwdK2#< zr*03N%I4dam`!MuW}9wJy9y7j<=|tH+EZNljM0v5n}FJqS4`Vj^=ml4er9i0yk9fk`3D(ta~S7q~hjqPPmG8@0yK&X0aQ8c5t zIHme`6x=-ZMeBu~yWSUqqW7Y1a@-l!tRT)F+tTAI4taccOuQ>cF1C=UYUH~Zatw^E z=a`RdKFAu!BvS`{x}bfU0YXO`cLm%kR@Xp(rl+to;K&8RdmY<^$ej+X>RD*~;@ple zpSaF_6;?IN(c2>+;L4a>#4!8VDw+KH$rizqcITer1IJ#<40rMO=e!zL7(2~$O44`e z6mY-4k7~)5iu2__B#i5ZkuX~Sw|!{2*`k5C&mTLUMK1s$GCNz;PZivG!jEUz&L+&x zOpgo}Khk%}Rp}REt+qx?x$jY2se4Y~d9_)4cVgJ2^=@LbXamtx@JgE7R##>oQS^c>Oa zQ6-{718Vh_q1bX8ge0E^DG-I-{`dnja1b}jc~x@+3kAg%?tZN<(;GW3C-18bdRmQ- zwzO>ad~mU>*2ah4I@?BX$*fBpB@Z#p7l;>L%0RIv#LD-(Rllo#5^=|T#*Bo@$xqwe zi0KM08L#^6=1cfwn7gmcE>Hi7_!*x@Oi7aMTz(9DP=~Ks=)P_K^>}5uAV=n9ep>mkiAKl!^4Q0eG%|ohO}Y zwOQ%CPQ)pzC{bcGD+xr$ok@qL7dg~>UeePuO-=MYNSe#$j?7%}mzNKUaw;<>VK}e- z#er(5t^#aon1}s~shc%{2nD6;-dvFe?&}FhBK19{Rg)%6=_}f*UJ)9`JG_-F3YbdW zP*4yy_tD$Mqv%?tE160X(F3JQ82i)xCNU0&x*xu*)^)(8a=%kpcyFNTjNw?VO#F+*yfXv?4h{P#m-iQguc(klR8>gB7gR{2sKh;=v=Vj5 zx~}(lVmt(=tn2H7Z@wc3&C*Tc2G5caqxNL8QJz|`?!_}P>6Fm4$OcKyQpu(B`WuLij8VsN(j$bh$O zMf10%$9EEQl@^TJ;7a*UsYKR;b_nhq1H1l`t*9iG_$o<~sd*2A=nbi=Ot*@>B%{w) z|44?O?)9!Qxbs)EtN5#QKF??s7?o40*2Tkz_+4G(fYD3)goT!Mx zVfbLi=)i46`^^!$8dY$rM$(l;<~EOy)7tm~POJENgM;U)b3^ST@UJgcT)m$y=%Od@ zQ?uplb2c%a%(M;^Din9W={ftjSe;^RT__V94J`v-1nZu9;W8j#M@~P4#=4G!cFPgz z8Ly)b<1TcITj-RxJBl&w5^a*7KSW@+td#9ANYm&rH+gxhJaMt6D_Q@ z`XE+s1rw1&swN^)JVPms^$46Ru9d&XcPY^=B-VlQS!OST*=))%AG7t>h=W;_!kl5*?%vrc63_N++-)tJm~gViYyv(WisRU(~$9mocL3@)L0jGyN~DiiK^Ils2q z)!f?4+`6-zA=VD`54c-sa+u-9Ot%H|ILaE>rS;3%#O8=kpP(#$Gc(>;S$X2Ug8aXx zgOfcHd{WKqQZ8F_9v7AOK4fg|g0tUoE3c@a*xlMnwmxg? zwjs!_WegfhvDtwM$a1m27vLv|Gmr-M9SLYGCg4M9{T(u`@+d&(1Te9s1nI7b!M`9G z{wUn{`N+3wQsE9y#dVniSuSS49$lTAlIRBpD^dABe)j(YO zBjCo%ts+Rfe;ONG9UQ7)S#&9?^b2KXqe(v9vb5C--`D7WPE4-I=47kfwB z4HZ|6n4-96=kFK58&UHuGk+`WiFFWuYYKHrO}<<}`r&Q~8XBdaFqDhy8^LI~*x1_W zIlFpbHGQzQD;bAW4NGMgLJ00QS;`^`umZzXB(wnSy374SZAsn$yQ`%QG zl{(Xx@~B#o2;2s!ziy|u7MME0P-6uZxZ0YsA@JtXhS$V_9;>v)+-|QbTe?9 zabK_Hr1n!$yp=1G+Wwz7fAL+eWul(;Q~X{l(m?osnO1qhjvLSes|p&LeZa>MaMbqq HQ2zQKjPHyY literal 0 HcmV?d00001 diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 163524e179cad2fcd61593bf6ad85ea896dcc030..a1b3476a6400f27016950d6bd873232e124fe62a 100644 GIT binary patch delta 2172 zcmYk6dsNL?6vsRJSGm1zPqzn6Su0(=A4r9igfU3dc+`x?Fb}U0i?N19iotkIjUVRh8u*Gr?)(!%}r7!_*s@_Equ#^{hTJge;c(D}RA<6okySEhL;GT^UOb0(ZqwS1U z_aF?es^#lG@8LQf49A@Nw5Ki(w5Y#NjYrv&9fh|msOc#WsOeM(0)evH*Aep`P;X_9 zip~gekaM+;BG9*t0=H`h92$9Mpo?&v;*Mf>?!fjkm<6APn1TWltZ`pCRs24DfZ5}X z3ecdcf|45JlGjH}G1*Fa35Y?45qR=H8 zJok|5&!1(4AAvSe$-2GLMsEE~BTC<@q)heP0f!c2swgRafs&M01!Ev`qq2eiDi{l& zY?kXV9GCw~gDg&0>^s~}*-myMCRS7KcRLk+wi?F4vE5{cp=%A@nUpNKu5c8ttASB) zl zm~p{qJK?fAS}FR95zzQJn0po1{Re@lt*2Uf17ce}%mmd9;UQs-N9$?+?hQ1LAMbD+ zD$i+f!A%X66rnQ$3#@E_(O`I>0Gvc&5LVB{a`>`|f9V7oAsWJ;nuHbZYJ^xg)nXzl zlpayy)ecUAaOoqu=65==z?Oxg{t+$c-o-@>MmLej?Gc_MO%MZFZ-toV#O!hCV{#`m zjC%}oAy@eZU~Drz+UmzN&s1~nQAjd8vlODJ8Ir--X2A0Vl0a)O#I+|75ABXZ1V1H_ z6i(wLl^icw%NdZ9&&U>zx_F#RNI3Z@YlUN+h#aECpk$=adR}Qlj zcRKDlo#ByWj)U-n6>KQxKc`+o=9!2cYI^Cghjmb(Q!2;4Sd_+G@t2qMn!e?@{A0es zk@!~!Oor!+gb02?b9lW(h%=j*I~HwZDqh|JZ@-|dzGWt#7q)d0j(SNr{R@Hfw=p-2 z-$H+AA%EytVZ!13zo7-*tpFRG_=-}dt}^-D&?b{PW6&!qcZvIQSDSpUxM;g^-`Y;{ zE!`k|_IuedEb5{Znd5yM1&-X$Ja}VtG~Wm^sf&&?ezOqmS$t1jp|6Luqe16nNap|QT$ zBgC^prp7t1A(q8rW)~$L&!_czIej;k#@Cddoy{}8h7&UX#^ajPw0ULxC2z>BJHl}s z2EV1(wLXW7F&J`=8cbu7173bhG5tpczH**9i6aW^B^;Y4@RnYBi;V?b_@beg-fhhZ zlThQlKB|1}XR*<;4Na0}F#KlTD_mqDF(9KfPxL8=4(a#S0ZHh26+tbNN{SRkYNfQ77 delta 59251 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

&IR-SIs&1H^&&?7;ICTQk@T{E7LbCgp`To^J|R_ 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 F_kTD6Sm6Kw diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3a38c0fbc8..285962d301 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1617,7 +1617,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } else if (mStateManager.getState() == LauncherState.OVERVIEW) { return StatsLogUtils.LAUNCHER_STATE_OVERVIEW; } - return StatsLogUtils.LAUNCHER_STATE_BACKGROUND; + return StatsLogUtils.LAUNCHER_STATE_HOME; } @Override -- GitLab From 678f47c0c962ab66503c21628301b0b93b6fe889 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 5 Nov 2018 17:05:35 -0800 Subject: [PATCH 0256/1301] Removing some launcher cross dependency in BaseIconCache so that it can eventually be moved to icon library Change-Id: I65e3ad34322a10695c1ba114f5e60c4418747f05 --- .../launcher3/icons/BaseIconCache.java | 45 +++----------- .../android/launcher3/icons/CachingLogic.java | 60 +------------------ .../launcher3/icons/ComponentWithLabel.java | 33 ++++++++++ .../android/launcher3/icons/IconCache.java | 54 ++++++++++++++--- .../icons/LauncherActivtiyCachingLogic.java | 54 +++++++++++++++++ .../android/launcher3/model/LoaderTask.java | 9 +-- 6 files changed, 146 insertions(+), 109 deletions(-) create mode 100644 src/com/android/launcher3/icons/LauncherActivtiyCachingLogic.java diff --git a/src/com/android/launcher3/icons/BaseIconCache.java b/src/com/android/launcher3/icons/BaseIconCache.java index 2afe7139fd..52233ef0da 100644 --- a/src/com/android/launcher3/icons/BaseIconCache.java +++ b/src/com/android/launcher3/icons/BaseIconCache.java @@ -22,7 +22,6 @@ import android.content.ContentValues; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; -import android.content.pm.LauncherActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -33,6 +32,7 @@ import android.database.sqlite.SQLiteException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; +import android.os.Build; import android.os.Build.VERSION; import android.os.Handler; import android.os.Process; @@ -41,15 +41,11 @@ import android.text.TextUtils; import android.util.Log; import com.android.launcher3.IconProvider; -import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.LauncherFiles; import com.android.launcher3.LauncherModel; -import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.Utilities; -import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.graphics.BitmapRenderer; -import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.InstantAppResolver; import com.android.launcher3.util.Preconditions; @@ -80,12 +76,10 @@ public class BaseIconCache { private final HashMap mDefaultIcons = new HashMap<>(); - final MainThreadExecutor mMainThreadExecutor = new MainThreadExecutor(); final Context mContext; final PackageManager mPackageManager; final IconProvider mIconProvider; final UserManagerCompat mUserManager; - final LauncherAppsCompat mLauncherApps; private final HashMap mCache = new HashMap<>(INITIAL_ICON_CACHE_CAPACITY); @@ -101,13 +95,12 @@ public class BaseIconCache { mContext = context; mPackageManager = context.getPackageManager(); mUserManager = UserManagerCompat.getInstance(mContext); - mLauncherApps = LauncherAppsCompat.getInstance(mContext); mInstantAppResolver = InstantAppResolver.newInstance(mContext); mIconProvider = IconProvider.newInstance(context); mWorkerHandler = new Handler(LauncherModel.getWorkerLooper()); - if (BitmapRenderer.USE_HARDWARE_BITMAP) { + if (BitmapRenderer.USE_HARDWARE_BITMAP && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { mDecodeOptions = new BitmapFactory.Options(); mDecodeOptions.inPreferredConfig = Bitmap.Config.HARDWARE; } else { @@ -161,14 +154,6 @@ public class BaseIconCache { return getFullResDefaultActivityIcon(); } - public Drawable getFullResIcon(LauncherActivityInfo info) { - return getFullResIcon(info, true); - } - - public Drawable getFullResIcon(LauncherActivityInfo info, boolean flattenDrawable) { - return mIconProvider.getIcon(info, mIconDpi, flattenDrawable); - } - protected BitmapInfo makeDefaultIcon(UserHandle user) { try (LauncherIcons li = LauncherIcons.obtain(mContext)) { return li.createBadgedIconBitmap( @@ -238,9 +223,9 @@ public class BaseIconCache { } if (entry == null) { entry = new CacheEntry(); - cachingLogic.loadIcon(mContext, this, object, entry); + cachingLogic.loadIcon(mContext, object, entry); } - entry.title = cachingLogic.getLabel(object, mPackageManager); + entry.title = cachingLogic.getLabel(object); entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); mCache.put(key, entry); @@ -262,22 +247,6 @@ public class BaseIconCache { mIconDb.insertOrReplace(values); } - /** - * Fill in {@param infoInOut} with the corresponding icon and label. - */ - public synchronized void getTitleAndIconForApp( - PackageItemInfo infoInOut, boolean useLowResIcon) { - CacheEntry entry = getEntryForPackageLocked( - infoInOut.packageName, infoInOut.user, useLowResIcon); - applyCacheEntry(entry, infoInOut); - } - - protected void applyCacheEntry(CacheEntry entry, ItemInfoWithIcon info) { - info.title = Utilities.trim(entry.title); - info.contentDescription = entry.contentDescription; - info.applyFrom((entry.icon == null) ? getDefaultIcon(info.user) : entry); - } - public synchronized BitmapInfo getDefaultIcon(UserHandle user) { if (!mDefaultIcons.containsKey(user)) { mDefaultIcons.put(user, makeDefaultIcon(user)); @@ -323,7 +292,7 @@ public class BaseIconCache { providerFetchedOnce = true; if (object != null) { - cachingLogic.loadIcon(mContext, this, object, entry); + cachingLogic.loadIcon(mContext, object, entry); } else { if (usePackageIcon) { CacheEntry packageEntry = getEntryForPackageLocked( @@ -350,7 +319,7 @@ public class BaseIconCache { providerFetchedOnce = true; } if (object != null) { - entry.title = cachingLogic.getLabel(object, mPackageManager); + entry.title = cachingLogic.getLabel(object); entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); } } @@ -400,7 +369,7 @@ public class BaseIconCache { * Gets an entry for the package, which can be used as a fallback entry for various components. * This method is not thread safe, it must be called from a synchronized method. */ - private CacheEntry getEntryForPackageLocked(String packageName, UserHandle user, + protected CacheEntry getEntryForPackageLocked(String packageName, UserHandle user, boolean useLowResIcon) { Preconditions.assertWorkerThread(); ComponentKey cacheKey = getPackageKey(packageName, user); diff --git a/src/com/android/launcher3/icons/CachingLogic.java b/src/com/android/launcher3/icons/CachingLogic.java index 24186ef990..0a3da04d78 100644 --- a/src/com/android/launcher3/icons/CachingLogic.java +++ b/src/com/android/launcher3/icons/CachingLogic.java @@ -17,8 +17,6 @@ package com.android.launcher3.icons; import android.content.ComponentName; import android.content.Context; -import android.content.pm.LauncherActivityInfo; -import android.content.pm.PackageManager; import android.os.UserHandle; public interface CachingLogic { @@ -27,61 +25,7 @@ public interface CachingLogic { UserHandle getUser(T object); - CharSequence getLabel(T object, PackageManager pm); + CharSequence getLabel(T object); - void loadIcon(Context context, BaseIconCache cache, T object, BitmapInfo target); - - CachingLogic LAUNCHER_ACTIVITY_INFO = - new CachingLogic() { - - @Override - public ComponentName getComponent(LauncherActivityInfo object) { - return object.getComponentName(); - } - - @Override - public UserHandle getUser(LauncherActivityInfo object) { - return object.getUser(); - } - - @Override - public CharSequence getLabel(LauncherActivityInfo object, PackageManager pm) { - return object.getLabel(); - } - - @Override - public void loadIcon(Context context, BaseIconCache cache, LauncherActivityInfo object, - BitmapInfo target) { - LauncherIcons li = LauncherIcons.obtain(context); - li.createBadgedIconBitmap(cache.getFullResIcon(object), object.getUser(), - object.getApplicationInfo().targetSdkVersion).applyTo(target); - li.recycle(); - } - }; - - CachingLogic COMPONENT_WITH_LABEL = - new CachingLogic() { - - @Override - public ComponentName getComponent(ComponentWithLabel object) { - return object.getComponent(); - } - - @Override - public UserHandle getUser(ComponentWithLabel object) { - return object.getUser(); - } - - @Override - public CharSequence getLabel(ComponentWithLabel object, PackageManager pm) { - return object.getLabel(pm); - } - - @Override - public void loadIcon(Context context, BaseIconCache cache, - ComponentWithLabel object, BitmapInfo target) { - // Do not load icon. - target.icon = BitmapInfo.LOW_RES_ICON; - } - }; + void loadIcon(Context context, T object, BitmapInfo target); } diff --git a/src/com/android/launcher3/icons/ComponentWithLabel.java b/src/com/android/launcher3/icons/ComponentWithLabel.java index 2badb4c373..7bb8832eed 100644 --- a/src/com/android/launcher3/icons/ComponentWithLabel.java +++ b/src/com/android/launcher3/icons/ComponentWithLabel.java @@ -16,6 +16,7 @@ package com.android.launcher3.icons; import android.content.ComponentName; +import android.content.Context; import android.content.pm.PackageManager; import android.os.UserHandle; @@ -26,4 +27,36 @@ public interface ComponentWithLabel { UserHandle getUser(); CharSequence getLabel(PackageManager pm); + + + class ComponentCachingLogic implements CachingLogic { + + private final PackageManager mPackageManager; + + public ComponentCachingLogic(Context context) { + mPackageManager = context.getPackageManager(); + } + + @Override + public ComponentName getComponent(ComponentWithLabel object) { + return object.getComponent(); + } + + @Override + public UserHandle getUser(ComponentWithLabel object) { + return object.getUser(); + } + + @Override + public CharSequence getLabel(ComponentWithLabel object) { + return object.getLabel(mPackageManager); + } + + @Override + public void loadIcon(Context context, + ComponentWithLabel object, BitmapInfo target) { + // Do not load icon. + target.icon = BitmapInfo.LOW_RES_ICON; + } + } } diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java index 6e2ca28ec6..e10ff5b1b8 100644 --- a/src/com/android/launcher3/icons/IconCache.java +++ b/src/com/android/launcher3/icons/IconCache.java @@ -16,15 +16,13 @@ package com.android.launcher3.icons; -import static com.android.launcher3.icons.CachingLogic.COMPONENT_WITH_LABEL; -import static com.android.launcher3.icons.CachingLogic.LAUNCHER_ACTIVITY_INFO; - import android.content.Context; import android.content.Intent; import android.content.pm.LauncherActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Process; import android.os.UserHandle; @@ -34,8 +32,11 @@ import com.android.launcher3.AppInfo; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.LauncherModel; +import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; +import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.icons.ComponentWithLabel.ComponentCachingLogic; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Provider; @@ -49,10 +50,21 @@ public class IconCache extends BaseIconCache { private static final String TAG = "Launcher.IconCache"; + private final MainThreadExecutor mMainThreadExecutor = new MainThreadExecutor(); + + private final CachingLogic mComponentWithLabelCachingLogic; + private final CachingLogic mLauncherActivityInfoCachingLogic; + + private final LauncherAppsCompat mLauncherApps; + private int mPendingIconRequestCount = 0; public IconCache(Context context, InvariantDeviceProfile inv) { super(context, inv.fillResIconDpi, inv.iconBitmapSize); + mComponentWithLabelCachingLogic = new ComponentCachingLogic(context); + mLauncherActivityInfoCachingLogic = new LauncherActivtiyCachingLogic(this); + mLauncherApps = LauncherAppsCompat.getInstance(mContext); + } /** @@ -65,7 +77,7 @@ public class IconCache extends BaseIconCache { PackageManager.GET_UNINSTALLED_PACKAGES); long userSerial = mUserManager.getSerialNumberForUser(user); for (LauncherActivityInfo app : mLauncherApps.getActivityList(packageName, user)) { - addIconToDBAndMemCache(app, LAUNCHER_ACTIVITY_INFO, info, userSerial, + addIconToDBAndMemCache(app, mLauncherActivityInfoCachingLogic, info, userSerial, false /*replace existing*/); } } catch (NameNotFoundException e) { @@ -115,7 +127,7 @@ public class IconCache extends BaseIconCache { */ public synchronized void updateTitleAndIcon(AppInfo application) { CacheEntry entry = cacheLocked(application.componentName, - application.user, Provider.of(null), LAUNCHER_ACTIVITY_INFO, + application.user, Provider.of(null), mLauncherActivityInfoCachingLogic, false, application.usingLowResIcon()); if (entry.icon != null && !isDefaultIcon(entry.icon, application.user)) { applyCacheEntry(entry, application); @@ -151,8 +163,8 @@ public class IconCache extends BaseIconCache { public synchronized String getTitleNoCache(ComponentWithLabel info) { CacheEntry entry = cacheLocked(info.getComponent(), info.getUser(), Provider.of(info), - COMPONENT_WITH_LABEL, false /* usePackageIcon */, true /* useLowResIcon */, - false /* addToMemCache */); + mComponentWithLabelCachingLogic, false /* usePackageIcon */, + true /* useLowResIcon */, false /* addToMemCache */); return Utilities.trim(entry.title); } @@ -164,11 +176,35 @@ public class IconCache extends BaseIconCache { @NonNull Provider activityInfoProvider, boolean usePkgIcon, boolean useLowResIcon) { CacheEntry entry = cacheLocked(infoInOut.getTargetComponent(), infoInOut.user, - activityInfoProvider, - LAUNCHER_ACTIVITY_INFO, usePkgIcon, useLowResIcon); + activityInfoProvider, mLauncherActivityInfoCachingLogic, usePkgIcon, useLowResIcon); applyCacheEntry(entry, infoInOut); } + + /** + * Fill in {@param infoInOut} with the corresponding icon and label. + */ + public synchronized void getTitleAndIconForApp( + PackageItemInfo infoInOut, boolean useLowResIcon) { + CacheEntry entry = getEntryForPackageLocked( + infoInOut.packageName, infoInOut.user, useLowResIcon); + applyCacheEntry(entry, infoInOut); + } + + protected void applyCacheEntry(CacheEntry entry, ItemInfoWithIcon info) { + info.title = Utilities.trim(entry.title); + info.contentDescription = entry.contentDescription; + info.applyFrom((entry.icon == null) ? getDefaultIcon(info.user) : entry); + } + + public Drawable getFullResIcon(LauncherActivityInfo info) { + return getFullResIcon(info, true); + } + + public Drawable getFullResIcon(LauncherActivityInfo info, boolean flattenDrawable) { + return mIconProvider.getIcon(info, mIconDpi, flattenDrawable); + } + public static abstract class IconLoadRequest extends HandlerRunnable { IconLoadRequest(Handler handler, Runnable endRunnable) { super(handler, endRunnable); diff --git a/src/com/android/launcher3/icons/LauncherActivtiyCachingLogic.java b/src/com/android/launcher3/icons/LauncherActivtiyCachingLogic.java new file mode 100644 index 0000000000..8c85b1c799 --- /dev/null +++ b/src/com/android/launcher3/icons/LauncherActivtiyCachingLogic.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.icons; + +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.LauncherActivityInfo; +import android.os.UserHandle; + +public class LauncherActivtiyCachingLogic implements CachingLogic { + + private final IconCache mCache; + + public LauncherActivtiyCachingLogic(IconCache cache) { + mCache = cache; + } + + @Override + public ComponentName getComponent(LauncherActivityInfo object) { + return object.getComponentName(); + } + + @Override + public UserHandle getUser(LauncherActivityInfo object) { + return object.getUser(); + } + + @Override + public CharSequence getLabel(LauncherActivityInfo object) { + return object.getLabel(); + } + + @Override + public void loadIcon(Context context, LauncherActivityInfo object, + BitmapInfo target) { + LauncherIcons li = LauncherIcons.obtain(context); + li.createBadgedIconBitmap(mCache.getFullResIcon(object), + object.getUser(), object.getApplicationInfo().targetSdkVersion).applyTo(target); + li.recycle(); + } +} \ No newline at end of file diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index 8b3e2c9a86..8551e6fbc0 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -20,8 +20,6 @@ import static com.android.launcher3.ItemInfoWithIcon.FLAG_DISABLED_LOCKED_USER; import static com.android.launcher3.ItemInfoWithIcon.FLAG_DISABLED_SAFEMODE; import static com.android.launcher3.ItemInfoWithIcon.FLAG_DISABLED_SUSPENDED; import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; -import static com.android.launcher3.icons.CachingLogic.COMPONENT_WITH_LABEL; -import static com.android.launcher3.icons.CachingLogic.LAUNCHER_ACTIVITY_INFO; import static com.android.launcher3.model.LoaderResults.filterCurrentWorkspaceItems; import android.appwidget.AppWidgetProviderInfo; @@ -46,6 +44,7 @@ import com.android.launcher3.AllAppsList; import com.android.launcher3.AppInfo; import com.android.launcher3.FolderInfo; import com.android.launcher3.icons.ComponentWithLabel; +import com.android.launcher3.icons.ComponentWithLabel.ComponentCachingLogic; import com.android.launcher3.icons.IconCacheUpdateHandler; import com.android.launcher3.icons.IconCache; import com.android.launcher3.InstallShortcutReceiver; @@ -63,6 +62,7 @@ import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIconPreviewVerifier; +import com.android.launcher3.icons.LauncherActivtiyCachingLogic; import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.logging.FileLog; import com.android.launcher3.provider.ImportDataTask; @@ -202,7 +202,8 @@ public class LoaderTask implements Runnable { TraceHelper.partitionSection(TAG, "step 2.3: Update icon cache"); IconCacheUpdateHandler updateHandler = mIconCache.getUpdateHandler(); setIgnorePackages(updateHandler); - updateHandler.updateIcons(allActivityList, LAUNCHER_ACTIVITY_INFO, + updateHandler.updateIcons(allActivityList, + new LauncherActivtiyCachingLogic(mApp.getIconCache()), mApp.getModel()::onPackageIconsUpdated); // Take a break @@ -233,7 +234,7 @@ public class LoaderTask implements Runnable { verifyNotStopped(); TraceHelper.partitionSection(TAG, "step 4.3: Update icon cache"); - updateHandler.updateIcons(allWidgetsList, COMPONENT_WITH_LABEL, + updateHandler.updateIcons(allWidgetsList, new ComponentCachingLogic(mApp.getContext()), mApp.getModel()::onWidgetLabelsUpdated); verifyNotStopped(); -- GitLab From 9ed67ddc5036caaafe211ae20d9f63b125c1e607 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 5 Nov 2018 17:32:16 -0800 Subject: [PATCH 0257/1301] Disable Shortcuts menu item for Android Go devices. Bug: 112904271 Test: Manual test Change-Id: I423afd62063babcda52d3907bbd608049238f065 --- src/com/android/launcher3/views/OptionsPopupView.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index c540b59c1c..6ba2f4069c 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -34,6 +34,7 @@ import android.widget.Toast; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.popup.ArrowPopup; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; @@ -151,8 +152,10 @@ public class OptionsPopupView extends ArrowPopup ArrayList options = new ArrayList<>(); options.add(new OptionItem(R.string.wallpaper_button_text, R.drawable.ic_wallpaper, ControlType.WALLPAPER_BUTTON, OptionsPopupView::startWallpaperPicker)); - options.add(new OptionItem(R.string.widget_button_text, R.drawable.ic_widget, - ControlType.WIDGETS_BUTTON, OptionsPopupView::onWidgetsClicked)); + if (!FeatureFlags.GO_DISABLE_WIDGETS) { + options.add(new OptionItem(R.string.widget_button_text, R.drawable.ic_widget, + ControlType.WIDGETS_BUTTON, OptionsPopupView::onWidgetsClicked)); + } options.add(new OptionItem(R.string.settings_button_text, R.drawable.ic_setting, ControlType.SETTINGS_BUTTON, OptionsPopupView::startSettings)); -- GitLab From d7239fcc52efbc85de7a73d666a44eaac3543637 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 5 Nov 2018 17:19:45 -0800 Subject: [PATCH 0258/1301] Removing UserManagerCompat wrapper for getting baded label This removes some crass dependency on Launcher compat implementation making it easier to move iconCache to a separate library Change-Id: If5fab0c82d98089cde6f54b6a374fb7bb2db5ae8 --- quickstep/src/com/android/quickstep/TaskUtils.java | 3 +-- .../android/launcher3/InstallShortcutReceiver.java | 4 ++-- src/com/android/launcher3/ShortcutInfo.java | 4 +--- .../android/launcher3/compat/UserManagerCompat.java | 1 - .../android/launcher3/compat/UserManagerCompatVL.java | 11 ----------- src/com/android/launcher3/icons/BaseIconCache.java | 8 ++++---- src/com/android/launcher3/model/LoaderCursor.java | 10 +++++----- 7 files changed, 13 insertions(+), 28 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TaskUtils.java b/quickstep/src/com/android/quickstep/TaskUtils.java index 5cae2b9199..4b86a7fa88 100644 --- a/quickstep/src/com/android/quickstep/TaskUtils.java +++ b/quickstep/src/com/android/quickstep/TaskUtils.java @@ -59,7 +59,6 @@ public class TaskUtils { */ public static CharSequence getTitle(Context context, Task task) { LauncherAppsCompat launcherAppsCompat = LauncherAppsCompat.getInstance(context); - UserManagerCompat userManagerCompat = UserManagerCompat.getInstance(context); PackageManager packageManager = context.getPackageManager(); UserHandle user = UserHandle.of(task.key.userId); ApplicationInfo applicationInfo = launcherAppsCompat.getApplicationInfo( @@ -68,7 +67,7 @@ public class TaskUtils { Log.e(TAG, "Failed to get title for task " + task); return ""; } - return userManagerCompat.getBadgedLabelForUser( + return packageManager.getUserBadgedLabel( applicationInfo.loadLabel(packageManager), user); } diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index 851454b77b..73c999a923 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -659,8 +659,8 @@ public class InstallShortcutReceiver extends BroadcastReceiver { info.applyFrom(iconInfo); info.title = Utilities.trim(name); - info.contentDescription = UserManagerCompat.getInstance(app.getContext()) - .getBadgedLabelForUser(info.title, info.user); + info.contentDescription = app.getContext().getPackageManager() + .getUserBadgedLabel(info.title, info.user); info.intent = intent; return info; } diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 7717d91883..19c647fd74 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -24,7 +24,6 @@ import android.os.Build; import android.text.TextUtils; import com.android.launcher3.LauncherSettings.Favorites; -import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.icons.IconCache; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.ContentWriter; @@ -172,8 +171,7 @@ public class ShortcutInfo extends ItemInfoWithIcon { if (TextUtils.isEmpty(label)) { label = shortcutInfo.getShortLabel(); } - contentDescription = UserManagerCompat.getInstance(context) - .getBadgedLabelForUser(label, user); + contentDescription = context.getPackageManager().getUserBadgedLabel(label, user); if (shortcutInfo.isEnabled()) { runtimeStatusFlags &= ~FLAG_DISABLED_BY_PUBLISHER; } else { diff --git a/src/com/android/launcher3/compat/UserManagerCompat.java b/src/com/android/launcher3/compat/UserManagerCompat.java index ad5147734e..e13d2a6e17 100644 --- a/src/com/android/launcher3/compat/UserManagerCompat.java +++ b/src/com/android/launcher3/compat/UserManagerCompat.java @@ -57,7 +57,6 @@ public abstract class UserManagerCompat { public abstract List getUserProfiles(); public abstract long getSerialNumberForUser(UserHandle user); public abstract UserHandle getUserForSerialNumber(long serialNumber); - public abstract CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user); public abstract boolean isQuietModeEnabled(UserHandle user); public abstract boolean isUserUnlocked(UserHandle user); diff --git a/src/com/android/launcher3/compat/UserManagerCompatVL.java b/src/com/android/launcher3/compat/UserManagerCompatVL.java index ef7284226b..4688052830 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVL.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java @@ -17,7 +17,6 @@ package com.android.launcher3.compat; import android.content.Context; -import android.content.pm.PackageManager; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; @@ -30,7 +29,6 @@ import java.util.List; public class UserManagerCompatVL extends UserManagerCompat { protected final UserManager mUserManager; - private final PackageManager mPm; protected LongSparseArray mUsers; // Create a separate reverse map as LongSparseArray.indexOfValue checks if objects are same @@ -39,7 +37,6 @@ public class UserManagerCompatVL extends UserManagerCompat { UserManagerCompatVL(Context context) { mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); - mPm = context.getPackageManager(); } @Override @@ -125,13 +122,5 @@ public class UserManagerCompatVL extends UserManagerCompat { } return getUserProfiles().size() > 1; } - - @Override - public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) { - if (user == null) { - return label; - } - return mPm.getUserBadgedLabel(label, user); - } } diff --git a/src/com/android/launcher3/icons/BaseIconCache.java b/src/com/android/launcher3/icons/BaseIconCache.java index 52233ef0da..8f3b2bb77d 100644 --- a/src/com/android/launcher3/icons/BaseIconCache.java +++ b/src/com/android/launcher3/icons/BaseIconCache.java @@ -226,7 +226,7 @@ public class BaseIconCache { cachingLogic.loadIcon(mContext, object, entry); } entry.title = cachingLogic.getLabel(object); - entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); + entry.contentDescription = mPackageManager.getUserBadgedLabel(entry.title, user); mCache.put(key, entry); ContentValues values = newContentValues(entry, entry.title.toString(), @@ -320,7 +320,7 @@ public class BaseIconCache { } if (object != null) { entry.title = cachingLogic.getLabel(object); - entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); + entry.contentDescription = mPackageManager.getUserBadgedLabel(entry.title, user); } } } @@ -399,7 +399,7 @@ public class BaseIconCache { li.recycle(); entry.title = appInfo.loadLabel(mPackageManager); - entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user); + entry.contentDescription = mPackageManager.getUserBadgedLabel(entry.title, user); entry.icon = useLowResIcon ? LOW_RES_ICON : iconInfo.icon; entry.color = iconInfo.color; @@ -441,7 +441,7 @@ public class BaseIconCache { entry.title = ""; entry.contentDescription = ""; } else { - entry.contentDescription = mUserManager.getBadgedLabelForUser( + entry.contentDescription = mPackageManager.getUserBadgedLabel( entry.title, cacheKey.user); } diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java index ea4d32b282..3aeb1c078c 100644 --- a/src/com/android/launcher3/model/LoaderCursor.java +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.content.pm.LauncherActivityInfo; +import android.content.pm.PackageManager; import android.database.Cursor; import android.database.CursorWrapper; import android.graphics.BitmapFactory; @@ -41,7 +42,6 @@ import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.compat.LauncherAppsCompat; -import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.LauncherIcons; @@ -64,7 +64,7 @@ public class LoaderCursor extends CursorWrapper { public final LongSparseArray allUsers = new LongSparseArray<>(); private final Context mContext; - private final UserManagerCompat mUserManager; + private final PackageManager mPM; private final IconCache mIconCache; private final InvariantDeviceProfile mIDP; @@ -100,7 +100,7 @@ public class LoaderCursor extends CursorWrapper { mContext = app.getContext(); mIconCache = app.getIconCache(); mIDP = app.getInvariantDeviceProfile(); - mUserManager = UserManagerCompat.getInstance(mContext); + mPM = mContext.getPackageManager(); // Init column indices iconIndex = getColumnIndexOrThrow(LauncherSettings.Favorites.ICON); @@ -228,7 +228,7 @@ public class LoaderCursor extends CursorWrapper { throw new InvalidParameterException("Invalid restoreType " + restoreFlag); } - info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); + info.contentDescription = mPM.getUserBadgedLabel(info.title, info.user); info.itemType = itemType; info.status = restoreFlag; return info; @@ -284,7 +284,7 @@ public class LoaderCursor extends CursorWrapper { info.title = componentName.getClassName(); } - info.contentDescription = mUserManager.getBadgedLabelForUser(info.title, info.user); + info.contentDescription = mPM.getUserBadgedLabel(info.title, info.user); return info; } -- GitLab From 97fab14d8f5c208bc60a8200dd0916ee8dacc589 Mon Sep 17 00:00:00 2001 From: Rajeev Kumar Date: Mon, 5 Nov 2018 18:27:07 -0800 Subject: [PATCH 0259/1301] Get rid of unused resources from Launcher3 running on Android Go devices. Bug: 112904271 Test: Manual test Change-Id: Ia19e92801f4d1a47b0dab47185d23b10e2412328 --- go/res/drawable/ic_widget.xml | 25 ---------------------- go/res/values-af/strings.xml | 26 ----------------------- go/res/values-am/strings.xml | 26 ----------------------- go/res/values-ar/strings.xml | 26 ----------------------- go/res/values-as/strings.xml | 26 ----------------------- go/res/values-az/strings.xml | 26 ----------------------- go/res/values-b+sr+Latn/strings.xml | 26 ----------------------- go/res/values-be/strings.xml | 26 ----------------------- go/res/values-bg/strings.xml | 26 ----------------------- go/res/values-bn/strings.xml | 26 ----------------------- go/res/values-bs/strings.xml | 26 ----------------------- go/res/values-ca/strings.xml | 26 ----------------------- go/res/values-cs/strings.xml | 26 ----------------------- go/res/values-da/strings.xml | 26 ----------------------- go/res/values-de/strings.xml | 26 ----------------------- go/res/values-el/strings.xml | 26 ----------------------- go/res/values-en-rAU/strings.xml | 26 ----------------------- go/res/values-en-rGB/strings.xml | 26 ----------------------- go/res/values-en-rIN/strings.xml | 26 ----------------------- go/res/values-es-rUS/strings.xml | 26 ----------------------- go/res/values-es/strings.xml | 26 ----------------------- go/res/values-et/strings.xml | 26 ----------------------- go/res/values-eu/strings.xml | 26 ----------------------- go/res/values-fa/strings.xml | 26 ----------------------- go/res/values-fi/strings.xml | 26 ----------------------- go/res/values-fr-rCA/strings.xml | 26 ----------------------- go/res/values-fr/strings.xml | 26 ----------------------- go/res/values-gl/strings.xml | 26 ----------------------- go/res/values-gu/strings.xml | 26 ----------------------- go/res/values-hi/strings.xml | 26 ----------------------- go/res/values-hr/strings.xml | 26 ----------------------- go/res/values-hu/strings.xml | 26 ----------------------- go/res/values-hy/strings.xml | 26 ----------------------- go/res/values-in/strings.xml | 26 ----------------------- go/res/values-is/strings.xml | 26 ----------------------- go/res/values-it/strings.xml | 26 ----------------------- go/res/values-iw/strings.xml | 26 ----------------------- go/res/values-ja/strings.xml | 26 ----------------------- go/res/values-ka/strings.xml | 26 ----------------------- go/res/values-kk/strings.xml | 26 ----------------------- go/res/values-km/strings.xml | 26 ----------------------- go/res/values-kn/strings.xml | 26 ----------------------- go/res/values-ko/strings.xml | 26 ----------------------- go/res/values-ky/strings.xml | 26 ----------------------- go/res/values-lo/strings.xml | 26 ----------------------- go/res/values-lt/strings.xml | 26 ----------------------- go/res/values-lv/strings.xml | 26 ----------------------- go/res/values-mk/strings.xml | 26 ----------------------- go/res/values-ml/strings.xml | 26 ----------------------- go/res/values-mn/strings.xml | 26 ----------------------- go/res/values-mr/strings.xml | 26 ----------------------- go/res/values-ms/strings.xml | 26 ----------------------- go/res/values-my/strings.xml | 26 ----------------------- go/res/values-nb/strings.xml | 26 ----------------------- go/res/values-ne/strings.xml | 26 ----------------------- go/res/values-nl/strings.xml | 26 ----------------------- go/res/values-or/strings.xml | 26 ----------------------- go/res/values-pa/strings.xml | 26 ----------------------- go/res/values-pl/strings.xml | 26 ----------------------- go/res/values-pt-rPT/strings.xml | 26 ----------------------- go/res/values-pt/strings.xml | 26 ----------------------- go/res/values-ro/strings.xml | 26 ----------------------- go/res/values-ru/strings.xml | 26 ----------------------- go/res/values-si/strings.xml | 26 ----------------------- go/res/values-sk/strings.xml | 26 ----------------------- go/res/values-sl/strings.xml | 26 ----------------------- go/res/values-sq/strings.xml | 26 ----------------------- go/res/values-sr/strings.xml | 26 ----------------------- go/res/values-sv/strings.xml | 26 ----------------------- go/res/values-sw/strings.xml | 26 ----------------------- go/res/values-ta/strings.xml | 26 ----------------------- go/res/values-te/strings.xml | 26 ----------------------- go/res/values-th/strings.xml | 26 ----------------------- go/res/values-tl/strings.xml | 26 ----------------------- go/res/values-tr/strings.xml | 26 ----------------------- go/res/values-uk/strings.xml | 26 ----------------------- go/res/values-ur/strings.xml | 26 ----------------------- go/res/values-uz/strings.xml | 26 ----------------------- go/res/values-vi/strings.xml | 26 ----------------------- go/res/values-zh-rCN/strings.xml | 26 ----------------------- go/res/values-zh-rHK/strings.xml | 26 ----------------------- go/res/values-zh-rTW/strings.xml | 26 ----------------------- go/res/values-zu/strings.xml | 26 ----------------------- go/res/values/strings.xml | 33 ----------------------------- 84 files changed, 2190 deletions(-) delete mode 100644 go/res/drawable/ic_widget.xml delete mode 100644 go/res/values-af/strings.xml delete mode 100644 go/res/values-am/strings.xml delete mode 100644 go/res/values-ar/strings.xml delete mode 100644 go/res/values-as/strings.xml delete mode 100644 go/res/values-az/strings.xml delete mode 100644 go/res/values-b+sr+Latn/strings.xml delete mode 100644 go/res/values-be/strings.xml delete mode 100644 go/res/values-bg/strings.xml delete mode 100644 go/res/values-bn/strings.xml delete mode 100644 go/res/values-bs/strings.xml delete mode 100644 go/res/values-ca/strings.xml delete mode 100644 go/res/values-cs/strings.xml delete mode 100644 go/res/values-da/strings.xml delete mode 100644 go/res/values-de/strings.xml delete mode 100644 go/res/values-el/strings.xml delete mode 100644 go/res/values-en-rAU/strings.xml delete mode 100644 go/res/values-en-rGB/strings.xml delete mode 100644 go/res/values-en-rIN/strings.xml delete mode 100644 go/res/values-es-rUS/strings.xml delete mode 100644 go/res/values-es/strings.xml delete mode 100644 go/res/values-et/strings.xml delete mode 100644 go/res/values-eu/strings.xml delete mode 100644 go/res/values-fa/strings.xml delete mode 100644 go/res/values-fi/strings.xml delete mode 100644 go/res/values-fr-rCA/strings.xml delete mode 100644 go/res/values-fr/strings.xml delete mode 100644 go/res/values-gl/strings.xml delete mode 100644 go/res/values-gu/strings.xml delete mode 100644 go/res/values-hi/strings.xml delete mode 100644 go/res/values-hr/strings.xml delete mode 100644 go/res/values-hu/strings.xml delete mode 100644 go/res/values-hy/strings.xml delete mode 100644 go/res/values-in/strings.xml delete mode 100644 go/res/values-is/strings.xml delete mode 100644 go/res/values-it/strings.xml delete mode 100644 go/res/values-iw/strings.xml delete mode 100644 go/res/values-ja/strings.xml delete mode 100644 go/res/values-ka/strings.xml delete mode 100644 go/res/values-kk/strings.xml delete mode 100644 go/res/values-km/strings.xml delete mode 100644 go/res/values-kn/strings.xml delete mode 100644 go/res/values-ko/strings.xml delete mode 100644 go/res/values-ky/strings.xml delete mode 100644 go/res/values-lo/strings.xml delete mode 100644 go/res/values-lt/strings.xml delete mode 100644 go/res/values-lv/strings.xml delete mode 100644 go/res/values-mk/strings.xml delete mode 100644 go/res/values-ml/strings.xml delete mode 100644 go/res/values-mn/strings.xml delete mode 100644 go/res/values-mr/strings.xml delete mode 100644 go/res/values-ms/strings.xml delete mode 100644 go/res/values-my/strings.xml delete mode 100644 go/res/values-nb/strings.xml delete mode 100644 go/res/values-ne/strings.xml delete mode 100644 go/res/values-nl/strings.xml delete mode 100644 go/res/values-or/strings.xml delete mode 100644 go/res/values-pa/strings.xml delete mode 100644 go/res/values-pl/strings.xml delete mode 100644 go/res/values-pt-rPT/strings.xml delete mode 100644 go/res/values-pt/strings.xml delete mode 100644 go/res/values-ro/strings.xml delete mode 100644 go/res/values-ru/strings.xml delete mode 100644 go/res/values-si/strings.xml delete mode 100644 go/res/values-sk/strings.xml delete mode 100644 go/res/values-sl/strings.xml delete mode 100644 go/res/values-sq/strings.xml delete mode 100644 go/res/values-sr/strings.xml delete mode 100644 go/res/values-sv/strings.xml delete mode 100644 go/res/values-sw/strings.xml delete mode 100644 go/res/values-ta/strings.xml delete mode 100644 go/res/values-te/strings.xml delete mode 100644 go/res/values-th/strings.xml delete mode 100644 go/res/values-tl/strings.xml delete mode 100644 go/res/values-tr/strings.xml delete mode 100644 go/res/values-uk/strings.xml delete mode 100644 go/res/values-ur/strings.xml delete mode 100644 go/res/values-uz/strings.xml delete mode 100644 go/res/values-vi/strings.xml delete mode 100644 go/res/values-zh-rCN/strings.xml delete mode 100644 go/res/values-zh-rHK/strings.xml delete mode 100644 go/res/values-zh-rTW/strings.xml delete mode 100644 go/res/values-zu/strings.xml delete mode 100644 go/res/values/strings.xml diff --git a/go/res/drawable/ic_widget.xml b/go/res/drawable/ic_widget.xml deleted file mode 100644 index 53368760ee..0000000000 --- a/go/res/drawable/ic_widget.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - diff --git a/go/res/values-af/strings.xml b/go/res/values-af/strings.xml deleted file mode 100644 index 10ac473c1f..0000000000 --- a/go/res/values-af/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Raak en hou om \'n kortpad op te tel." - "Dubbeltik en hou om \'n kortpad op te tel of gebruik gepasmaakte handelinge." - "Kortpaaie" - "%1$s-kortpaaie" - diff --git a/go/res/values-am/strings.xml b/go/res/values-am/strings.xml deleted file mode 100644 index b3b253f423..0000000000 --- a/go/res/values-am/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "አንድ አቋራጭ ለመውሰድ ነክተው ይያዙ" - "አንድ አቋራጭ ለመውሰድ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ አድርገው ይያዙ።" - "አቋራጮች" - "%1$s አቋራጮች" - diff --git a/go/res/values-ar/strings.xml b/go/res/values-ar/strings.xml deleted file mode 100644 index 9888d0f7ca..0000000000 --- a/go/res/values-ar/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "المس مع الاستمرار لاختيار اختصار." - "يمكنك النقر مرّتين مع الاستمرار لاختيار اختصار أو استخدام الإجراءات المخصصة." - "الاختصارات" - "اختصارات %1$s" - diff --git a/go/res/values-as/strings.xml b/go/res/values-as/strings.xml deleted file mode 100644 index 6b5807f97b..0000000000 --- a/go/res/values-as/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ স্পৰ্শ কৰি ৰাখক।" - "কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ দুবাৰ টিপি ৰাখক বা নিজৰ উপযোগিতা অনুসৰি বনোৱা কাৰ্যসমূহ ব্যৱহাৰ কৰক।" - "শ্বৰ্টকাটসমূহ" - "%1$s শ্বৰ্টকাটসমূহ" - diff --git a/go/res/values-az/strings.xml b/go/res/values-az/strings.xml deleted file mode 100644 index c4b8cb7801..0000000000 --- a/go/res/values-az/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Qısayolu seçmək üçün toxunub saxlayın." - "Qısayolu seçmək üçün iki dəfə basıb saxlayın və ya fərdi əməliyyatlardan istifadə edin." - "Qısayollar" - "%1$s qısayolları" - diff --git a/go/res/values-b+sr+Latn/strings.xml b/go/res/values-b+sr+Latn/strings.xml deleted file mode 100644 index 0da5699410..0000000000 --- a/go/res/values-b+sr+Latn/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Dodirnite i zadržite da biste izabrali prečicu." - "Dvaput dodirnite i zadržite da biste izabrali prečicu ili koristite prilagođene radnje." - "Prečice" - "Prečice za %1$s" - diff --git a/go/res/values-be/strings.xml b/go/res/values-be/strings.xml deleted file mode 100644 index 4189e35fa0..0000000000 --- a/go/res/values-be/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Дакраніцеся і ўтрымлiвайце ярлык, каб дадаць яго." - "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць ярлык або выкарыстоўваць спецыяльныя дзеянні." - "Ярлыкі" - "Ярлыкі %1$s" - diff --git a/go/res/values-bg/strings.xml b/go/res/values-bg/strings.xml deleted file mode 100644 index 1b85992d99..0000000000 --- a/go/res/values-bg/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Докоснете и задръжте за избор на пряк път." - "Докоснете двукратно и задръжте за избор на пряк път или използвайте персонализирани действия." - "Преки пътища" - "Преки пътища за %1$s" - diff --git a/go/res/values-bn/strings.xml b/go/res/values-bn/strings.xml deleted file mode 100644 index c56c925a29..0000000000 --- a/go/res/values-bn/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "কোনও শর্টকাট বেছে নিতে টাচ করে ধরে রাখুন।" - "কোনও শর্টকাট বেছে নিতে ডাবল ট্যাপ করে ধরে রাখুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন।" - "শর্টকাট" - "%1$s এর শর্টকাট" - diff --git a/go/res/values-bs/strings.xml b/go/res/values-bs/strings.xml deleted file mode 100644 index 3141b9d8fd..0000000000 --- a/go/res/values-bs/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Dodirnite i držite da uzmete prečicu." - "Dodirnite dvaput i držite da uzmete prečicu ili koristite prilagođene akcije." - "Prečice" - "Prečice aplikacije %1$s" - diff --git a/go/res/values-ca/strings.xml b/go/res/values-ca/strings.xml deleted file mode 100644 index 3b5c3f7b56..0000000000 --- a/go/res/values-ca/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Mantén premuda una drecera per seleccionar-la." - "Fes doble toc i mantén premut per seleccionar una drecera o per utilitzar accions personalitzades." - "Dreceres" - "Dreceres de l\'aplicació %1$s" - diff --git a/go/res/values-cs/strings.xml b/go/res/values-cs/strings.xml deleted file mode 100644 index e4018f2c0f..0000000000 --- a/go/res/values-cs/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Zkratku vyberete podržením." - "Dvojitým klepnutím a podržením vyberte zkratku, případně použijte vlastní akce." - "Zkratky" - "Zkratky aplikace %1$s" - diff --git a/go/res/values-da/strings.xml b/go/res/values-da/strings.xml deleted file mode 100644 index 821d36a7da..0000000000 --- a/go/res/values-da/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Hold en genvej nede for at samle den op." - "Tryk to gange, og hold en genvej nede for at samle den op og bruge tilpassede handlinger." - "Genveje" - "%1$s-genveje" - diff --git a/go/res/values-de/strings.xml b/go/res/values-de/strings.xml deleted file mode 100644 index 43a1b3a9e1..0000000000 --- a/go/res/values-de/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Doppeltippen und halten, um eine Verknüpfung auszuwählen." - "Doppeltippen und halten, um eine Verknüpfung auszuwählen oder benutzerdefinierte Aktionen zu nutzen." - "Verknüpfungen" - "%1$s-Verknüpfungen" - diff --git a/go/res/values-el/strings.xml b/go/res/values-el/strings.xml deleted file mode 100644 index ae59907d16..0000000000 --- a/go/res/values-el/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Αγγίξτε παρατεταμένα για να σηκώσετε μια συντόμευση." - "Πατήσετε δύο φορές παρατεταμένα για να σηκώσετε μια συντόμευση ή για να χρησιμοποιήσετε προσαρμοσμένες ενέργειες." - "Συντομεύσεις" - "Συντομεύσεις %1$s" - diff --git a/go/res/values-en-rAU/strings.xml b/go/res/values-en-rAU/strings.xml deleted file mode 100644 index 2ee2c26457..0000000000 --- a/go/res/values-en-rAU/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Touch & hold to pick up a shortcut." - "Double-tap & hold to pick up a shortcut or use custom actions." - "Shortcuts" - "%1$s shortcuts" - diff --git a/go/res/values-en-rGB/strings.xml b/go/res/values-en-rGB/strings.xml deleted file mode 100644 index 2ee2c26457..0000000000 --- a/go/res/values-en-rGB/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Touch & hold to pick up a shortcut." - "Double-tap & hold to pick up a shortcut or use custom actions." - "Shortcuts" - "%1$s shortcuts" - diff --git a/go/res/values-en-rIN/strings.xml b/go/res/values-en-rIN/strings.xml deleted file mode 100644 index 2ee2c26457..0000000000 --- a/go/res/values-en-rIN/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Touch & hold to pick up a shortcut." - "Double-tap & hold to pick up a shortcut or use custom actions." - "Shortcuts" - "%1$s shortcuts" - diff --git a/go/res/values-es-rUS/strings.xml b/go/res/values-es-rUS/strings.xml deleted file mode 100644 index 5212c035d3..0000000000 --- a/go/res/values-es-rUS/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Mantén presionado para elegir un acceso directo." - "Presiona dos veces y mantén presionado para elegir un acceso directo o usar acciones personalizadas." - "Accesos directos" - "Accesos directos de %1$s" - diff --git a/go/res/values-es/strings.xml b/go/res/values-es/strings.xml deleted file mode 100644 index 3ae45889cf..0000000000 --- a/go/res/values-es/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Mantén pulsado el acceso directo que quieras." - "Toca dos veces y mantén pulsado el acceso directo o utiliza acciones personalizadas." - "Accesos directos" - "Accesos directos de %1$s" - diff --git a/go/res/values-et/strings.xml b/go/res/values-et/strings.xml deleted file mode 100644 index 2513e65a33..0000000000 --- a/go/res/values-et/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Otsetee valimiseks puudutage seda pikalt." - "Topeltpuudutage ja hoidke otsetee valimiseks või kohandatud toimingute kasutamiseks." - "Otseteed" - "Rakenduse %1$s otseteed" - diff --git a/go/res/values-eu/strings.xml b/go/res/values-eu/strings.xml deleted file mode 100644 index 9949ef091d..0000000000 --- a/go/res/values-eu/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Eduki sakatuta lasterbide bat aukeratzeko." - "Sakatu birritan eta eduki sakatuta lasterbide bat aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." - "Lasterbideak" - "%1$s aplikazioaren lasterbidea" - diff --git a/go/res/values-fa/strings.xml b/go/res/values-fa/strings.xml deleted file mode 100644 index f1584d9ff7..0000000000 --- a/go/res/values-fa/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "برای انتخاب یک میان‌بر، لمس کنید و نگه‌دارید." - "برای انتخاب میان‌بر، دو ضربه سریع بزنید و نگه دارید یا از کنش‌های سفارشی استفاده کنید." - "میان‌برها" - "میان‌برهای %1$s" - diff --git a/go/res/values-fi/strings.xml b/go/res/values-fi/strings.xml deleted file mode 100644 index da9b0e1c42..0000000000 --- a/go/res/values-fi/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Valitse pikakuvake painamalla sitä pitkään." - "Valitse pikakuvake tai käytä muokattuja toimintoja kaksoisnapauttamalla ja painamalla pitkään." - "Pikakuvakkeet" - "Kohteen %1$s pikakuvakkeet" - diff --git a/go/res/values-fr-rCA/strings.xml b/go/res/values-fr-rCA/strings.xml deleted file mode 100644 index c7fd6d6423..0000000000 --- a/go/res/values-fr-rCA/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Maintenez un doigt sur le raccourci pour l\'ajouter" - "Touchez 2x un raccourci et maintenez doigt dessus pour l’aj. ou utiliser des actions personnalisées." - "Raccourcis" - "Raccourcis : %1$s" - diff --git a/go/res/values-fr/strings.xml b/go/res/values-fr/strings.xml deleted file mode 100644 index 238fe73d75..0000000000 --- a/go/res/values-fr/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Appui prolongé pour sélectionner raccourci." - "Appuyez 2 fois et maintenez pression pour sélectionner raccourci ou utilisez actions personnalisées." - "Raccourcis" - "Raccourcis %1$s" - diff --git a/go/res/values-gl/strings.xml b/go/res/values-gl/strings.xml deleted file mode 100644 index 31621d5c2c..0000000000 --- a/go/res/values-gl/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Mantén premido un atallo para seleccionalo." - "Toca dúas veces e mantén premido para seleccionar un atallo ou utiliza accións personalizadas." - "Atallos" - "Atallos da aplicación %1$s" - diff --git a/go/res/values-gu/strings.xml b/go/res/values-gu/strings.xml deleted file mode 100644 index bdb549ff7f..0000000000 --- a/go/res/values-gu/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "એક શૉર્ટકટ ચૂંટવા ટૅપ કરી રાખો." - "એક શૉર્ટકટ ચૂંટવા અથવા કોઈ કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટૅપ કરી રાખો." - "શૉર્ટકટ" - "%1$s શૉર્ટકટ" - diff --git a/go/res/values-hi/strings.xml b/go/res/values-hi/strings.xml deleted file mode 100644 index 2c1650a0dd..0000000000 --- a/go/res/values-hi/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "शॉर्टकट चुनने के लिए छूकर रखें." - "शॉर्टकट चुनने के लिए दो बार छूएं और कुछ देर दबाएं रखें या अपने मुताबिक कार्रवाइयों का इस्तेमाल करें." - "शॉर्टकट" - "%1$s शॉर्टकट" - diff --git a/go/res/values-hr/strings.xml b/go/res/values-hr/strings.xml deleted file mode 100644 index fccdeb59d7..0000000000 --- a/go/res/values-hr/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Dodirnite i zadržite kako biste podigli prečac." - "Dvaput dodirnite i zadržite pritisak kako biste podigli prečac ili pokušajte prilagođenim radnjama." - "Prečaci" - "Prečaci za aplikaciju %1$s" - diff --git a/go/res/values-hu/strings.xml b/go/res/values-hu/strings.xml deleted file mode 100644 index 369c22745a..0000000000 --- a/go/res/values-hu/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Felvételhez tartsa nyomva a parancsikont." - "Parancsikon felvételéhez koppintson rá duplán és tartsa nyomva, vagy használjon egyéni műveleteket." - "Parancsikonok" - "%1$s-parancsikonok" - diff --git a/go/res/values-hy/strings.xml b/go/res/values-hy/strings.xml deleted file mode 100644 index 4747f6df35..0000000000 --- a/go/res/values-hy/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար։" - "Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար կամ օգտվեք հարմարեցրած գործողություններից:" - "Դյուրանցումներ" - "%1$s դյուրանցումներ" - diff --git a/go/res/values-in/strings.xml b/go/res/values-in/strings.xml deleted file mode 100644 index c8b9da306d..0000000000 --- a/go/res/values-in/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Tap lama untuk memilih pintasan." - "Tap dua kali & tahan untuk memilih pintasan atau menggunakan tindakan khusus." - "Pintasan" - "Pintasan %1$s" - diff --git a/go/res/values-is/strings.xml b/go/res/values-is/strings.xml deleted file mode 100644 index b8bb923746..0000000000 --- a/go/res/values-is/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Haltu fingri á flýtileið til að grípa hana." - "Ýttu tvisvar og haltu fingri á flýtileið til að grípa hana eða notaðu sérsniðnar aðgerðir." - "Flýtileiðir" - "%1$s flýtileiðir" - diff --git a/go/res/values-it/strings.xml b/go/res/values-it/strings.xml deleted file mode 100644 index bc5d99863d..0000000000 --- a/go/res/values-it/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Tocca e tieni premuto per scegliere la scorciatoia" - "Tocca due volte e tieni premuto per scegliere una scorciatoia o per usare azioni personalizzate." - "Scorciatoie" - "Scorciatoie di %1$s" - diff --git a/go/res/values-iw/strings.xml b/go/res/values-iw/strings.xml deleted file mode 100644 index f541d4d316..0000000000 --- a/go/res/values-iw/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "כדי להוסיף קיצור דרך, מקישים עליו פעמיים ומחזיקים." - "כדי להוסיף קיצור דרך או להשתמש בפעולות מותאמות אישית, מקישים על קיצור הדרך פעמיים ומחזיקים." - "קיצורי דרך" - "קיצורי דרך לאפליקציה %1$s" - diff --git a/go/res/values-ja/strings.xml b/go/res/values-ja/strings.xml deleted file mode 100644 index 8f02d7f4eb..0000000000 --- a/go/res/values-ja/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ショートカットを追加するには押し続けます。" - "ダブルタップ後に押し続けてショートカットを選択するか、カスタム操作を使用してください。" - "ショートカット" - "「%1$s」のショートカット" - diff --git a/go/res/values-ka/strings.xml b/go/res/values-ka/strings.xml deleted file mode 100644 index 1b46534788..0000000000 --- a/go/res/values-ka/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "შეეხეთ და დააყოვნეთ მალსახმობის ასარჩევად." - "ორმაგად შეეხეთ და გეჭიროთ მალსახმობის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." - "მალსახმობები" - "%1$s-ის მალსახმობები" - diff --git a/go/res/values-kk/strings.xml b/go/res/values-kk/strings.xml deleted file mode 100644 index e909818afc..0000000000 --- a/go/res/values-kk/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Таңбашаны таңдау үшін оны түртіп, ұстап тұрыңыз." - "Таңбашаны таңдау немесе арнаулы әрекеттерді пайдалану үшін екі рет түртіп, ұстап тұрыңыз." - "Таңбашалар" - "%1$s таңбаша" - diff --git a/go/res/values-km/strings.xml b/go/res/values-km/strings.xml deleted file mode 100644 index 40082a4b9d..0000000000 --- a/go/res/values-km/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ប៉ះ ហើយចុចឲ្យជាប់ដើម្បីរើសផ្លូវកាត់មួយ។" - "ប៉ះពីរដង ហើយចុចឱ្យជាប់ដើម្បីរើសផ្លូវកាត់មួយ ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" - "ផ្លូវកាត់" - "ផ្លូវកាត់សម្រាប់ %1$s" - diff --git a/go/res/values-kn/strings.xml b/go/res/values-kn/strings.xml deleted file mode 100644 index 9c121fd294..0000000000 --- a/go/res/values-kn/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಶಾರ್ಟ್‌ಕಟ್ ಆರಿಸಲು ಹೋಲ್ಡ್ ಮಾಡಿ." - "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಶಾರ್ಟ್‌ಕಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ." - "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" - "%1$s ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" - diff --git a/go/res/values-ko/strings.xml b/go/res/values-ko/strings.xml deleted file mode 100644 index 60f925e36b..0000000000 --- a/go/res/values-ko/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "바로가기를 선택하려면 길게 터치하세요." - "바로가기를 선택하려면 두 번 탭한 다음 길게 터치하거나 맞춤 액션을 사용합니다." - "바로가기" - "%1$s 바로가기" - diff --git a/go/res/values-ky/strings.xml b/go/res/values-ky/strings.xml deleted file mode 100644 index 4c7e973cef..0000000000 --- a/go/res/values-ky/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Кыска жолду тандоо үчүн басып туруңуз." - "Кыска жолду тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." - "Кыска жолдор" - "%1$s кыска жол" - diff --git a/go/res/values-lo/strings.xml b/go/res/values-lo/strings.xml deleted file mode 100644 index 7864884acc..0000000000 --- a/go/res/values-lo/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ແຕະຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ." - "ແຕະສອງເທື່ອຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ ຫຼື ໃຊ້ຄຳສັ່ງແບບກຳນົດເອງ." - "ປຸ່ມລັດ" - "ປຸ່ມລັດ %1$s" - diff --git a/go/res/values-lt/strings.xml b/go/res/values-lt/strings.xml deleted file mode 100644 index 8f49032cfb..0000000000 --- a/go/res/values-lt/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Dukart pal. ir palaik., kad pasir. spart. klav." - "Dukart palieskite ir palaikykite, kad pasirinkt. spartųjį klavišą ar naudotumėte tinkintus veiksmus." - "Spartieji klavišai" - "„%1$s“ spartieji klavišai" - diff --git a/go/res/values-lv/strings.xml b/go/res/values-lv/strings.xml deleted file mode 100644 index 04315ebaa0..0000000000 --- a/go/res/values-lv/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Lai izvēlētos saīsni, pieskarieties un turiet to." - "Lai atlasītu saīsni, veiciet dubultskārienu uz tās un turiet to vai arī veiciet pielāgotas darbības." - "Saīsnes" - "Lietotnes %1$s saīsnes" - diff --git a/go/res/values-mk/strings.xml b/go/res/values-mk/strings.xml deleted file mode 100644 index 52d66b5e28..0000000000 --- a/go/res/values-mk/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Допрете двапати и задржете за да изберете кратенка." - "Допрете двапати и задржете за да изберете кратенка или да користите приспособени дејства." - "Кратенки" - "Кратенки за %1$s" - diff --git a/go/res/values-ml/strings.xml b/go/res/values-ml/strings.xml deleted file mode 100644 index b3c12e16e1..0000000000 --- a/go/res/values-ml/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ഒരു കുറുക്കുവഴി ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." - "ഒരു കുറുക്കുവഴി തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." - "കുറുക്കുവഴികൾ" - "%1$s കുറുക്കുവഴികൾ" - diff --git a/go/res/values-mn/strings.xml b/go/res/values-mn/strings.xml deleted file mode 100644 index c89dfd1bdc..0000000000 --- a/go/res/values-mn/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Товчлол авах бол удаан дарна уу." - "Товчлол авах болон тохируулсан үйлдлийг ашиглахын тулд хоёр товшоод хүлээнэ үү." - "Товчлол" - "%1$s-н товчлол" - diff --git a/go/res/values-mr/strings.xml b/go/res/values-mr/strings.xml deleted file mode 100644 index 2c767b4f19..0000000000 --- a/go/res/values-mr/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "शॉर्टकट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." - "शॉर्टकट निवडण्यासाठी किंवा कस्टम क्रिया वापरण्यासाठी दोनदा टॅप करा आणि धरून ठेवा." - "शॉर्टकट" - "%1$s शॉर्टकट" - diff --git a/go/res/values-ms/strings.xml b/go/res/values-ms/strings.xml deleted file mode 100644 index 42add9a197..0000000000 --- a/go/res/values-ms/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Sentuh & tahan untuk mengambil pintasan." - "Ketik dua kali & tahan untuk mengambil pintasan atau menggunakan tindakan tersuai." - "Pintasan" - "Pintasan %1$s" - diff --git a/go/res/values-my/strings.xml b/go/res/values-my/strings.xml deleted file mode 100644 index 5784df63bf..0000000000 --- a/go/res/values-my/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "လက်ကွက်ဖြတ်လမ်းတစ်ခုကို ရွေးရန် ထိပြီး ဖိထားပါ" - "လက်ကွက်ဖြတ်လမ်းကို ရွေးရန် (သို့) စိတ်ကြိုက်လုပ်ဆောင်ချက်များကို သုံးရန်နှစ်ချက်တို့ပြီး ဖိထားပါ။" - "ဖြတ်လမ်းလင့်ခ်များ" - "%1$s ဖြတ်လမ်းလင့်ခ်များ" - diff --git a/go/res/values-nb/strings.xml b/go/res/values-nb/strings.xml deleted file mode 100644 index 2a5ffb6e7c..0000000000 --- a/go/res/values-nb/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Trykk og hold for å velge en snarvei." - "Dobbelttrykk og hold for å velge en snarvei eller bruke tilpassede handlinger." - "Snarveier" - "%1$s-snarveier" - diff --git a/go/res/values-ne/strings.xml b/go/res/values-ne/strings.xml deleted file mode 100644 index 0be0375f3a..0000000000 --- a/go/res/values-ne/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "कुनै सटकर्ट छनौट गर्न छोइराख्नुहोस्।" - "कुनै सर्टकट छनौट गर्न दुईपटक ट्याप गरेर होल्ड गर्नुहोस् वा रोजेका कारबाहीहरू प्रयोग गर्नुहोस्।" - "सर्टकटहरू" - "%1$s सर्टकटहरू" - diff --git a/go/res/values-nl/strings.xml b/go/res/values-nl/strings.xml deleted file mode 100644 index 5bcd016b4a..0000000000 --- a/go/res/values-nl/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Tik en houd vast om snelkoppeling toe te voegen." - "Dubbeltik en houd vast om een snelkoppeling toe te voegen of aangepaste acties te gebruiken." - "Snelkoppelingen" - "%1$s-snelkoppelingen" - diff --git a/go/res/values-or/strings.xml b/go/res/values-or/strings.xml deleted file mode 100644 index 3ec8a72038..0000000000 --- a/go/res/values-or/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ଦାବି ଧରନ୍ତୁ।" - "ଡବଲ୍‌-ଟାପ୍‌ କରନ୍ତୁ ଏବଂ ଏକ ଶର୍ଟକଟ୍ ଚୟନ କରିବାକୁ ଧରି ରଖନ୍ତୁ କିମ୍ୱା କଷ୍ଟମ୍ ପ୍ରକ୍ରିୟା ବ୍ୟବହାର କରନ୍ତୁ।" - "ଶର୍ଟକଟ୍‍" - "%1$sର ଶର୍ଟକଟ୍" - diff --git a/go/res/values-pa/strings.xml b/go/res/values-pa/strings.xml deleted file mode 100644 index c7e4abf3a8..0000000000 --- a/go/res/values-pa/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਚੁਣਨ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।" - "ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਚੁਣਨ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ ਜਾਂ ਵਿਉਂਂਤੀ ਕਾਰਵਾਈਆਂ ਵਰਤੋ।" - "ਸ਼ਾਰਟਕੱਟ" - "%1$s ਸ਼ਾਰਟਕੱਟ" - diff --git a/go/res/values-pl/strings.xml b/go/res/values-pl/strings.xml deleted file mode 100644 index 0861daaa57..0000000000 --- a/go/res/values-pl/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Naciśnij i przytrzymaj, by wybrać skrót." - "Kliknij dwukrotnie i przytrzymaj, by wybrać skrót lub użyć działań niestandardowych." - "Skróty" - "%1$s – skróty" - diff --git a/go/res/values-pt-rPT/strings.xml b/go/res/values-pt-rPT/strings.xml deleted file mode 100644 index 7a75a05456..0000000000 --- a/go/res/values-pt-rPT/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Toque sem soltar para escolher um atalho." - "Toque duas vezes sem soltar para escolher um atalho ou utilize ações personalizadas." - "Atalhos" - "Atalhos da aplicação %1$s" - diff --git a/go/res/values-pt/strings.xml b/go/res/values-pt/strings.xml deleted file mode 100644 index 53bbfc41a6..0000000000 --- a/go/res/values-pt/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Toque e segure para selecionar um atalho." - "Toque duas vezes na tela e segure para selecionar um atalho ou usar ações personalizadas." - "Atalhos" - "Atalhos do app %1$s" - diff --git a/go/res/values-ro/strings.xml b/go/res/values-ro/strings.xml deleted file mode 100644 index 75d1796b57..0000000000 --- a/go/res/values-ro/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Atingeți și țineți apăsat pentru a selecta o comandă rapidă." - "Atingeți de două ori și țineți apăsat pentru comandă rapidă sau folosiți acțiuni personalizate." - "Comenzi rapide" - "Comenzi rapide pentru %1$s" - diff --git a/go/res/values-ru/strings.xml b/go/res/values-ru/strings.xml deleted file mode 100644 index 9c5c8cd340..0000000000 --- a/go/res/values-ru/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Чтобы выбрать ярлык, нажмите на него и удерживайте." - "Чтобы выбрать ярлык или использовать специальные действия, нажмите на него дважды и не отпускайте." - "Ярлыки" - "%1$s: ярлыки" - diff --git a/go/res/values-si/strings.xml b/go/res/values-si/strings.xml deleted file mode 100644 index 4b25c90b0b..0000000000 --- a/go/res/values-si/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "කෙටි මගක් තෝරා ගැනීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න." - "විජට් එකක් තෝරා ගැනීමට හෝ අභිරුචි භාවිත කිරීමට දෙවරක් තට්ටු කර අල්ලා ගෙන සිටින්න." - "කෙටි මං" - "කෙටි මං %1$s" - diff --git a/go/res/values-sk/strings.xml b/go/res/values-sk/strings.xml deleted file mode 100644 index fc02933734..0000000000 --- a/go/res/values-sk/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Skratku pridáte pridržaním." - "Skratku pridáte dvojitým klepnutím a pridržaním alebo pomocou vlastných akcií." - "Skratky" - "Skratky aplikácie %1$s" - diff --git a/go/res/values-sl/strings.xml b/go/res/values-sl/strings.xml deleted file mode 100644 index 6ecedfb166..0000000000 --- a/go/res/values-sl/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Pridržite bližnjico, da jo izberete." - "Dvakrat se dotaknite bližnjice in jo pridržite, da jo izberete, ali pa uporabite dejanja po meri." - "Bližnjice" - "Bližnjice za %1$s" - diff --git a/go/res/values-sq/strings.xml b/go/res/values-sq/strings.xml deleted file mode 100644 index bb74db6b55..0000000000 --- a/go/res/values-sq/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Prek dhe mbaj prekur për të zgjedhur një shkurtore." - "Prek dy herë dhe mbaj prekur për të zgjedhur një shkurtore ose për të përdorur veprimet e personalizuara." - "Shkurtoret" - "%1$s shkurtore" - diff --git a/go/res/values-sr/strings.xml b/go/res/values-sr/strings.xml deleted file mode 100644 index 0b9aea2f9a..0000000000 --- a/go/res/values-sr/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Додирните и задржите да бисте изабрали пречицу." - "Двапут додирните и задржите да бисте изабрали пречицу или користите прилагођене радње." - "Пречице" - "Пречице за %1$s" - diff --git a/go/res/values-sv/strings.xml b/go/res/values-sv/strings.xml deleted file mode 100644 index c3f434c276..0000000000 --- a/go/res/values-sv/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Tryck länge om du vill ta upp en genväg." - "Tryck snabbt två gånger och håll kvar om du vill ta upp en genväg eller använda anpassade åtgärder." - "Genvägar" - "Genvägar för %1$s" - diff --git a/go/res/values-sw/strings.xml b/go/res/values-sw/strings.xml deleted file mode 100644 index 13c12e4a6c..0000000000 --- a/go/res/values-sw/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Gusa na ushikilie ili uchague njia ya mkato." - "Gusa mara mbili na ushikilie ile uchague njia ya mkato au utumie vitendo maalum." - "Njia za mkato" - "Njia za mkato za %1$s" - diff --git a/go/res/values-ta/strings.xml b/go/res/values-ta/strings.xml deleted file mode 100644 index 50059b65f9..0000000000 --- a/go/res/values-ta/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "குறுக்குவழியைச் சேர்க்க, தொட்டு பிடித்திருக்கவும்." - "குறுக்குவழியை சேர்க்க, இருமுறை தட்டிப் பிடித்திருக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." - "குறுக்குவழிகள்" - "%1$s குறுக்குவழிகள்" - diff --git a/go/res/values-te/strings.xml b/go/res/values-te/strings.xml deleted file mode 100644 index 0bdf743342..0000000000 --- a/go/res/values-te/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "సత్వరమార్గాన్ని ఎంచుకోవడానికి తాకి & నొక్కి ఉంచండి." - "సత్వరమార్గాన్ని ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి &ఉంచండి." - "సత్వరమార్గాలు" - "%1$s సత్వరమార్గాలు" - diff --git a/go/res/values-th/strings.xml b/go/res/values-th/strings.xml deleted file mode 100644 index e73d89fb0e..0000000000 --- a/go/res/values-th/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "แตะค้างไว้เพื่อเลือกทางลัด" - "แตะสองครั้งค้างไว้เพื่อเลือกทางลัดหรือใช้การกระทำที่กำหนดเอง" - "ทางลัด" - "ทางลัด %1$s" - diff --git a/go/res/values-tl/strings.xml b/go/res/values-tl/strings.xml deleted file mode 100644 index 8f44ec5742..0000000000 --- a/go/res/values-tl/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Pindutin nang matagal upang kumuha ng shortcut." - "I-double tap nang matagal upang kumuha ng shortcut o gumamit ng mga custom na pagkilos." - "Mga Shortcut" - "Mga shortcut sa %1$s" - diff --git a/go/res/values-tr/strings.xml b/go/res/values-tr/strings.xml deleted file mode 100644 index f0f3cce6d1..0000000000 --- a/go/res/values-tr/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Kısayol seçmek için dokunun ve basılı tutun." - "Bir kısayolu seçmek veya özel işlemleri kullanmak için iki kez dokunun ve basılı tutun." - "Kısayollar" - "%1$s kısayolları" - diff --git a/go/res/values-uk/strings.xml b/go/res/values-uk/strings.xml deleted file mode 100644 index 8d1f58395b..0000000000 --- a/go/res/values-uk/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Натисніть і утримуйте, щоб вибрати ярлик." - "Двічі натисніть і утримуйте, щоб вибрати ярлик, або виконайте іншу дію." - "Ярлики" - "Ярлики додатка %1$s" - diff --git a/go/res/values-ur/strings.xml b/go/res/values-ur/strings.xml deleted file mode 100644 index 46bd823d8e..0000000000 --- a/go/res/values-ur/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "کوئی شارٹ کٹ منتخب کرنے کیلئے ٹچ کریں اور دبائے رکھیں۔" - "کوئی شارٹ کٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور دبائے رکھیں۔" - "شارٹ کٹس" - "%1$s شارٹ کٹس" - diff --git a/go/res/values-uz/strings.xml b/go/res/values-uz/strings.xml deleted file mode 100644 index 318bc15722..0000000000 --- a/go/res/values-uz/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Yorliqni tanlab olish uchun bosib turing." - "Ikki marta bosib va bosib turgan holatda yorliqni tanlang yoki maxsus amaldan foydalaning." - "Yorliqlar" - "%1$s ilovasi yorliqlari" - diff --git a/go/res/values-vi/strings.xml b/go/res/values-vi/strings.xml deleted file mode 100644 index 1197619c57..0000000000 --- a/go/res/values-vi/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Chạm và giữ để chọn lối tắt." - "Nhấn đúp và giữ để chọn lối tắt hoặc sử dụng hành động tùy chỉnh." - "Lối tắt" - "Lối tắt %1$s" - diff --git a/go/res/values-zh-rCN/strings.xml b/go/res/values-zh-rCN/strings.xml deleted file mode 100644 index 57351d37f5..0000000000 --- a/go/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "触摸并按住快捷方式即可选择快捷方式。" - "点按两次并按住快捷方式即可选择快捷方式,您也可以使用自定义操作。" - "快捷方式" - "%1$s快捷方式" - diff --git a/go/res/values-zh-rHK/strings.xml b/go/res/values-zh-rHK/strings.xml deleted file mode 100644 index dea7749f68..0000000000 --- a/go/res/values-zh-rHK/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "按住捷徑即可選取捷徑。" - "扲兩下然後扲住就可以揀選捷徑,或者用自訂嘅操作。" - "捷徑" - "%1$s 捷徑" - diff --git a/go/res/values-zh-rTW/strings.xml b/go/res/values-zh-rTW/strings.xml deleted file mode 100644 index 07ae2ed5b4..0000000000 --- a/go/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "按住捷徑即可選取。" - "輕觸兩下並按住捷徑即可選取,你也可以使用自訂動作。" - "捷徑" - "「%1$s」捷徑" - diff --git a/go/res/values-zu/strings.xml b/go/res/values-zu/strings.xml deleted file mode 100644 index e5051df1f1..0000000000 --- a/go/res/values-zu/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - "Thinta futhi ubambe ukuze ukhethe isinqamuleli." - "Thepha kabulu futhi ubambe ukuze ukhethe isinqamuleli noma usebenzise izenzo zangokwezifiso." - "Izinqamuleli" - "%1$s izinqamuleli" - diff --git a/go/res/values/strings.xml b/go/res/values/strings.xml deleted file mode 100644 index 8ef2e62430..0000000000 --- a/go/res/values/strings.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - Touch & hold to pick up a shortcut. - - Double-tap & hold to pick up a shortcut or use custom actions. - - Shortcuts - - - - %1$s shortcuts - - -- GitLab From 3ebe28a82b162475a22af425ae7742654ccd9c52 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 5 Nov 2018 22:27:32 -0800 Subject: [PATCH 0260/1301] Fixing wrong directory pack for icon lib classes Change-Id: Ic3690198b1c6204e322ba7b0f46ccef5dfa97181 --- .../launcher3}/icons/BaseIconFactory.java | 0 .../launcher3}/icons/BitmapInfo.java | 0 .../launcher3}/icons/ColorExtractor.java | 0 .../launcher3}/icons/FixedScaleDrawable.java | 0 .../launcher3}/icons/IconNormalizer.java | 0 .../launcher3}/icons/ShadowGenerator.java | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/BaseIconFactory.java (100%) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/BitmapInfo.java (100%) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/ColorExtractor.java (100%) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/FixedScaleDrawable.java (100%) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/IconNormalizer.java (100%) rename iconloaderlib/src/com/{android.launcher3 => android/launcher3}/icons/ShadowGenerator.java (100%) diff --git a/iconloaderlib/src/com/android.launcher3/icons/BaseIconFactory.java b/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/BaseIconFactory.java rename to iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java diff --git a/iconloaderlib/src/com/android.launcher3/icons/BitmapInfo.java b/iconloaderlib/src/com/android/launcher3/icons/BitmapInfo.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/BitmapInfo.java rename to iconloaderlib/src/com/android/launcher3/icons/BitmapInfo.java diff --git a/iconloaderlib/src/com/android.launcher3/icons/ColorExtractor.java b/iconloaderlib/src/com/android/launcher3/icons/ColorExtractor.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/ColorExtractor.java rename to iconloaderlib/src/com/android/launcher3/icons/ColorExtractor.java diff --git a/iconloaderlib/src/com/android.launcher3/icons/FixedScaleDrawable.java b/iconloaderlib/src/com/android/launcher3/icons/FixedScaleDrawable.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/FixedScaleDrawable.java rename to iconloaderlib/src/com/android/launcher3/icons/FixedScaleDrawable.java diff --git a/iconloaderlib/src/com/android.launcher3/icons/IconNormalizer.java b/iconloaderlib/src/com/android/launcher3/icons/IconNormalizer.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/IconNormalizer.java rename to iconloaderlib/src/com/android/launcher3/icons/IconNormalizer.java diff --git a/iconloaderlib/src/com/android.launcher3/icons/ShadowGenerator.java b/iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java similarity index 100% rename from iconloaderlib/src/com/android.launcher3/icons/ShadowGenerator.java rename to iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java -- GitLab From bb80025ef45b8318fe43f3ed22092ae944cb44bd Mon Sep 17 00:00:00 2001 From: Ryan Lothian Date: Tue, 6 Nov 2018 10:57:17 -0500 Subject: [PATCH 0261/1301] Remove duplicate test I cloned the existing Instrumentation-based IntSetTest class to be our first Robolectric test. Now Robolectric is working, we can delete the Instrumentation test version. Change-Id: I3adcfc451988a908c002b769b398348cb1782f1d --- .../android/launcher3/util/IntSetTest.java | 58 ------------------- 1 file changed, 58 deletions(-) delete mode 100644 tests/src/com/android/launcher3/util/IntSetTest.java diff --git a/tests/src/com/android/launcher3/util/IntSetTest.java b/tests/src/com/android/launcher3/util/IntSetTest.java deleted file mode 100644 index 934b749f5e..0000000000 --- a/tests/src/com/android/launcher3/util/IntSetTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.launcher3.util; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * Unit tests for {@link IntSet} - */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class IntSetTest { - - @Test - public void testDuplicateEntries() { - IntSet set = new IntSet(); - - set.add(2); - assertEquals(1, set.size()); - - set.add(2); - assertEquals(1, set.size()); - assertTrue(set.contains(2)); - assertFalse(set.contains(1)); - - set.add(1); - assertEquals(2, set.size()); - assertTrue(set.contains(2)); - assertTrue(set.contains(1)); - - - set.add(10); - assertEquals(3, set.size()); - - assertEquals("1, 2, 10", set.mArray.toConcatString()); - } -} -- GitLab From 066ace1b8897229445c0fb3515156ef70bdb05e2 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 5 Nov 2018 11:08:31 -0800 Subject: [PATCH 0262/1301] Replacing setAlphaComponent with setAlphaComponentBound for better animation interpolation setAlphaComponent throws expetion for invalid range, which can cause brashes in overshoot interpolation Bug: 118390004 Change-Id: Ic9c5ff3d660eba353b982c4c47ccfaf329b3e296 --- .../launcher3/icons/BaseIconFactory.java | 8 ++--- .../launcher3/icons/GraphicsUtils.java | 36 +++++++++++++++++++ .../launcher3/icons/ShadowGenerator.java | 8 ++--- .../quickstep/views/ShelfScrimView.java | 9 +++-- src/com/android/launcher3/BubbleTextView.java | 7 ++-- .../folder/FolderAnimationManager.java | 7 ++-- .../launcher3/folder/PreviewBackground.java | 7 ++-- .../launcher3/graphics/IconPalette.java | 4 ++- .../graphics/WorkspaceAndHotseatScrim.java | 6 ++-- .../launcher3/icons/BaseIconCache.java | 4 +-- .../settings/PreferenceHighlighter.java | 6 ++-- .../views/DoubleShadowBubbleTextView.java | 12 +++---- .../android/launcher3/views/ScrimView.java | 6 ++-- .../launcher3/widget/BaseWidgetSheet.java | 7 ++-- 14 files changed, 80 insertions(+), 47 deletions(-) create mode 100644 iconloaderlib/src/com/android/launcher3/icons/GraphicsUtils.java diff --git a/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java b/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java index 681c03c7ca..243903cc8c 100644 --- a/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java +++ b/iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java @@ -18,8 +18,6 @@ import android.os.Build; import android.os.Process; import android.os.UserHandle; -import com.android.launcher3.icons.R; - import static android.graphics.Paint.DITHER_FLAG; import static android.graphics.Paint.FILTER_BITMAP_FLAG; import static com.android.launcher3.icons.ShadowGenerator.BLUR_FACTOR; @@ -81,6 +79,7 @@ public class BaseIconFactory { return mNormalizer; } + @SuppressWarnings("deprecation") public BitmapInfo createIconBitmap(Intent.ShortcutIconResource iconRes) { try { Resources resources = mPm.getResourcesForApplication(iconRes.packageName); @@ -184,8 +183,7 @@ public class BaseIconFactory { RectF outIconBounds, float[] outScale) { float scale = 1f; - if (shrinkNonAdaptiveIcons) { - boolean[] outShape = new boolean[1]; + if (shrinkNonAdaptiveIcons && ATLEAST_OREO) { if (mWrapperIcon == null) { mWrapperIcon = mContext.getDrawable(R.drawable.adaptive_icon_drawable_wrapper) .mutate(); @@ -193,7 +191,7 @@ public class BaseIconFactory { AdaptiveIconDrawable dr = (AdaptiveIconDrawable) mWrapperIcon; dr.setBounds(0, 0, 1, 1); scale = getNormalizer().getScale(icon, outIconBounds); - if (ATLEAST_OREO && !(icon instanceof AdaptiveIconDrawable)) { + if (!(icon instanceof AdaptiveIconDrawable)) { FixedScaleDrawable fsd = ((FixedScaleDrawable) dr.getForeground()); fsd.setDrawable(icon); fsd.setScale(scale); diff --git a/iconloaderlib/src/com/android/launcher3/icons/GraphicsUtils.java b/iconloaderlib/src/com/android/launcher3/icons/GraphicsUtils.java new file mode 100644 index 0000000000..b096cecb5c --- /dev/null +++ b/iconloaderlib/src/com/android/launcher3/icons/GraphicsUtils.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.icons; + +import androidx.annotation.ColorInt; + +public class GraphicsUtils { + + /** + * Set the alpha component of {@code color} to be {@code alpha}. Unlike the support lib version, + * it bounds the alpha in valid range instead of throwing an exception to allow for safer + * interpolation of color animations + */ + @ColorInt + public static int setColorAlphaBound(int color, int alpha) { + if (alpha < 0) { + alpha = 0; + } else if (alpha > 255) { + alpha = 255; + } + return (color & 0x00ffffff) | (alpha << 24); + } +} diff --git a/iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java b/iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java index 6491b7ec15..455c58c91b 100644 --- a/iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java +++ b/iconloaderlib/src/com/android/launcher3/icons/ShadowGenerator.java @@ -16,6 +16,8 @@ package com.android.launcher3.icons; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; + import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BlurMaskFilter; @@ -27,8 +29,6 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; -import androidx.core.graphics.ColorUtils; - /** * Utility class to add shadows to bitmaps. */ @@ -142,12 +142,12 @@ public class ShadowGenerator { // Key shadow p.setShadowLayer(shadowBlur, 0, keyShadowDistance, - ColorUtils.setAlphaComponent(Color.BLACK, keyShadowAlpha)); + setColorAlphaBound(Color.BLACK, keyShadowAlpha)); c.drawRoundRect(bounds, radius, radius, p); // Ambient shadow p.setShadowLayer(shadowBlur, 0, 0, - ColorUtils.setAlphaComponent(Color.BLACK, ambientShadowAlpha)); + setColorAlphaBound(Color.BLACK, ambientShadowAlpha)); c.drawRoundRect(bounds, radius, radius, p); if (Color.alpha(color) < 255) { diff --git a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java index 896557550a..d2b3bcc170 100644 --- a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java +++ b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java @@ -18,8 +18,7 @@ package com.android.quickstep.views; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.anim.Interpolators.ACCEL; import static com.android.launcher3.anim.Interpolators.LINEAR; - -import static androidx.core.graphics.ColorUtils.setAlphaComponent; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.content.Context; import android.graphics.Canvas; @@ -141,7 +140,7 @@ public class ShelfScrimView extends ScrimView { int alpha = Math.round(Utilities.mapToRange( mProgress, mMidProgress, 1, mMidAlpha, 0, ACCEL)); - mShelfColor = setAlphaComponent(mEndScrim, alpha); + mShelfColor = setColorAlphaBound(mEndScrim, alpha); } else { mDragHandleOffset += mShiftRange * (mMidProgress - mProgress); @@ -149,12 +148,12 @@ public class ShelfScrimView extends ScrimView { int alpha = Math.round( Utilities.mapToRange(mProgress, (float) 0, mMidProgress, (float) mEndAlpha, (float) mMidAlpha, Interpolators.clampToProgress(ACCEL, 0.5f, 1f))); - mShelfColor = setAlphaComponent(mEndScrim, alpha); + mShelfColor = setColorAlphaBound(mEndScrim, alpha); int remainingScrimAlpha = Math.round( Utilities.mapToRange(mProgress, (float) 0, mMidProgress, mMaxScrimAlpha, (float) 0, LINEAR)); - mRemainingScreenColor = setAlphaComponent(mScrimColor, remainingScrimAlpha); + mRemainingScreenColor = setColorAlphaBound(mScrimColor, remainingScrimAlpha); } } diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 8513d63a78..455fd1866d 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -16,6 +16,8 @@ package com.android.launcher3; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; @@ -53,8 +55,6 @@ import com.android.launcher3.model.PackageItemInfo; import java.text.NumberFormat; -import androidx.core.graphics.ColorUtils; - /** * TextView that draws a bubble behind the text. We cannot use a LineBackgroundSpan * because we want to make the bubble taller than the text and TextView's clip is @@ -473,8 +473,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, // Special case to prevent text shadows in high contrast mode return Color.TRANSPARENT; } - return ColorUtils.setAlphaComponent( - mTextColor, Math.round(Color.alpha(mTextColor) * mTextAlpha)); + return setColorAlphaBound(mTextColor, Math.round(Color.alpha(mTextColor) * mTextAlpha)); } /** diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index fa890b99df..2461e284dc 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -20,6 +20,7 @@ import static com.android.launcher3.BubbleTextView.TEXT_ALPHA_PROPERTY; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; import static com.android.launcher3.folder.FolderShape.getShape; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -46,8 +47,6 @@ import com.android.launcher3.util.Themes; import java.util.List; -import androidx.core.graphics.ColorUtils; - /** * Manages the opening and closing animations for a {@link Folder}. * @@ -153,8 +152,8 @@ public class FolderAnimationManager { // Set up the Folder background. final int finalColor = Themes.getAttrColor(mContext, android.R.attr.colorPrimary); - final int initialColor = - ColorUtils.setAlphaComponent(finalColor, mPreviewBackground.getBackgroundAlpha()); + final int initialColor = setColorAlphaBound( + finalColor, mPreviewBackground.getBackgroundAlpha()); mFolderBackground.mutate(); mFolderBackground.setColor(mIsOpening ? initialColor : finalColor); diff --git a/src/com/android/launcher3/folder/PreviewBackground.java b/src/com/android/launcher3/folder/PreviewBackground.java index 8443953bd9..f2683a5f9a 100644 --- a/src/com/android/launcher3/folder/PreviewBackground.java +++ b/src/com/android/launcher3/folder/PreviewBackground.java @@ -17,6 +17,7 @@ package com.android.launcher3.folder; import static com.android.launcher3.folder.FolderShape.getShape; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -41,8 +42,6 @@ import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.util.Themes; -import androidx.core.graphics.ColorUtils; - /** * This object represents a FolderIcon preview background. It stores drawing / measurement * information, handles drawing, and animation (accept state <--> rest state). @@ -189,7 +188,7 @@ public class PreviewBackground { public int getBgColor() { int alpha = (int) Math.min(MAX_BG_OPACITY, BG_OPACITY * mColorMultiplier); - return ColorUtils.setAlphaComponent(mBgColor, alpha); + return setColorAlphaBound(mBgColor, alpha); } public int getBadgeColor() { @@ -275,7 +274,7 @@ public class PreviewBackground { } public void drawBackgroundStroke(Canvas canvas) { - mPaint.setColor(ColorUtils.setAlphaComponent(mBgColor, mStrokeAlpha)); + mPaint.setColor(setColorAlphaBound(mBgColor, mStrokeAlpha)); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(mStrokeWidth); diff --git a/src/com/android/launcher3/graphics/IconPalette.java b/src/com/android/launcher3/graphics/IconPalette.java index cda07c31a2..3d4a1001a2 100644 --- a/src/com/android/launcher3/graphics/IconPalette.java +++ b/src/com/android/launcher3/graphics/IconPalette.java @@ -16,6 +16,8 @@ package com.android.launcher3.graphics; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; + import android.app.Notification; import android.content.Context; import android.graphics.Color; @@ -147,7 +149,7 @@ public class IconPalette { } public static int getMutedColor(int color, float whiteScrimAlpha) { - int whiteScrim = ColorUtils.setAlphaComponent(Color.WHITE, (int) (255 * whiteScrimAlpha)); + int whiteScrim = setColorAlphaBound(Color.WHITE, (int) (255 * whiteScrimAlpha)); return ColorUtils.compositeColors(whiteScrim, color); } } diff --git a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java index 23d647b441..66f9dbfcdc 100644 --- a/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java +++ b/src/com/android/launcher3/graphics/WorkspaceAndHotseatScrim.java @@ -19,6 +19,8 @@ package com.android.launcher3.graphics; import static android.content.Intent.ACTION_SCREEN_OFF; import static android.content.Intent.ACTION_USER_PRESENT; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; + import android.animation.ObjectAnimator; import android.content.BroadcastReceiver; import android.content.Context; @@ -174,7 +176,7 @@ public class WorkspaceAndHotseatScrim implements canvas.clipRect(mHighlightRect, Region.Op.DIFFERENCE); } - canvas.drawColor(ColorUtils.setAlphaComponent(mFullScrimColor, mScrimAlpha)); + canvas.drawColor(setColorAlphaBound(mFullScrimColor, mScrimAlpha)); canvas.restore(); } @@ -303,7 +305,7 @@ public class WorkspaceAndHotseatScrim implements LinearGradient lg = new LinearGradient(0, 0, 0, gradientHeight, new int[]{ 0x00FFFFFF, - ColorUtils.setAlphaComponent(Color.WHITE, (int) (0xFF * 0.95)), + setColorAlphaBound(Color.WHITE, (int) (0xFF * 0.95)), 0xFFFFFFFF}, new float[]{0f, 0.8f, 1f}, Shader.TileMode.CLAMP); diff --git a/src/com/android/launcher3/icons/BaseIconCache.java b/src/com/android/launcher3/icons/BaseIconCache.java index 8f3b2bb77d..1f810b39f1 100644 --- a/src/com/android/launcher3/icons/BaseIconCache.java +++ b/src/com/android/launcher3/icons/BaseIconCache.java @@ -16,6 +16,7 @@ package com.android.launcher3.icons; import static com.android.launcher3.icons.BitmapInfo.LOW_RES_ICON; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.content.ComponentName; import android.content.ContentValues; @@ -56,7 +57,6 @@ import java.util.HashMap; import java.util.HashSet; import androidx.annotation.NonNull; -import androidx.core.graphics.ColorUtils; public class BaseIconCache { @@ -435,7 +435,7 @@ public class BaseIconCache { Long.toString(mUserManager.getSerialNumberForUser(cacheKey.user))}); if (c.moveToNext()) { // Set the alpha to be 255, so that we never have a wrong color - entry.color = ColorUtils.setAlphaComponent(c.getInt(0), 255); + entry.color = setColorAlphaBound(c.getInt(0), 255); entry.title = c.getString(1); if (entry.title == null) { entry.title = ""; diff --git a/src/com/android/launcher3/settings/PreferenceHighlighter.java b/src/com/android/launcher3/settings/PreferenceHighlighter.java index 4ed4cf1133..8ba814686f 100644 --- a/src/com/android/launcher3/settings/PreferenceHighlighter.java +++ b/src/com/android/launcher3/settings/PreferenceHighlighter.java @@ -15,7 +15,7 @@ */ package com.android.launcher3.settings; -import static androidx.core.graphics.ColorUtils.setAlphaComponent; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -57,7 +57,7 @@ public class PreferenceHighlighter extends ItemDecoration implements Runnable { private static final long HIGHLIGHT_DURATION = 15000L; private static final long HIGHLIGHT_FADE_OUT_DURATION = 500L; private static final long HIGHLIGHT_FADE_IN_DURATION = 200L; - private static final int END_COLOR = setAlphaComponent(Color.WHITE, 0); + private static final int END_COLOR = setColorAlphaBound(Color.WHITE, 0); private final Paint mPaint = new Paint(); private final RecyclerView mRv; @@ -91,7 +91,7 @@ public class PreferenceHighlighter extends ItemDecoration implements Runnable { if (!mHighLightStarted) { // Start highlight - int colorTo = setAlphaComponent(Themes.getColorAccent(mRv.getContext()), 66); + int colorTo = setColorAlphaBound(Themes.getColorAccent(mRv.getContext()), 66); ObjectAnimator anim = ObjectAnimator.ofArgb(this, HIGHLIGHT_COLOR, END_COLOR, colorTo); anim.setDuration(HIGHLIGHT_FADE_IN_DURATION); anim.setRepeatMode(ValueAnimator.REVERSE); diff --git a/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java b/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java index 64e166eeb8..323eecb91b 100644 --- a/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java +++ b/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java @@ -16,6 +16,8 @@ package com.android.launcher3.views; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; + import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; @@ -26,8 +28,6 @@ import android.widget.TextView; import com.android.launcher3.BubbleTextView; import com.android.launcher3.R; -import androidx.core.graphics.ColorUtils; - /** * Extension of {@link BubbleTextView} which draws two shadows on the text (ambient and key shadows} */ @@ -60,7 +60,7 @@ public class DoubleShadowBubbleTextView extends BubbleTextView { // We enhance the shadow by drawing the shadow twice getPaint().setShadowLayer(mShadowInfo.ambientShadowBlur, 0, 0, - ColorUtils.setAlphaComponent(mShadowInfo.ambientShadowColor, alpha)); + setColorAlphaBound(mShadowInfo.ambientShadowColor, alpha)); drawWithoutBadge(canvas); canvas.save(); @@ -69,7 +69,7 @@ public class DoubleShadowBubbleTextView extends BubbleTextView { getScrollY() + getHeight()); getPaint().setShadowLayer(mShadowInfo.keyShadowBlur, 0.0f, mShadowInfo.keyShadowOffset, - ColorUtils.setAlphaComponent(mShadowInfo.keyShadowColor, alpha)); + setColorAlphaBound(mShadowInfo.keyShadowColor, alpha)); drawWithoutBadge(canvas); canvas.restore(); @@ -107,11 +107,11 @@ public class DoubleShadowBubbleTextView extends BubbleTextView { return true; } else if (ambientShadowAlpha > 0) { textView.getPaint().setShadowLayer(ambientShadowBlur, 0, 0, - ColorUtils.setAlphaComponent(ambientShadowColor, textAlpha)); + setColorAlphaBound(ambientShadowColor, textAlpha)); return true; } else if (keyShadowAlpha > 0) { textView.getPaint().setShadowLayer(keyShadowBlur, 0.0f, keyShadowOffset, - ColorUtils.setAlphaComponent(keyShadowColor, textAlpha)); + setColorAlphaBound(keyShadowColor, textAlpha)); return true; } else { return false; diff --git a/src/com/android/launcher3/views/ScrimView.java b/src/com/android/launcher3/views/ScrimView.java index 6fd84db26a..deb09654cf 100644 --- a/src/com/android/launcher3/views/ScrimView.java +++ b/src/com/android/launcher3/views/ScrimView.java @@ -22,9 +22,9 @@ import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.anim.Interpolators.ACCEL; import static com.android.launcher3.anim.Interpolators.DEACCEL; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import static androidx.core.graphics.ColorUtils.compositeColors; -import static androidx.core.graphics.ColorUtils.setAlphaComponent; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -182,7 +182,7 @@ public class ScrimView extends View implements Insettable, OnChangeListener, @Override public void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo) { mScrimColor = wallpaperColorInfo.getMainColor(); - mEndFlatColor = compositeColors(mEndScrim, setAlphaComponent( + mEndFlatColor = compositeColors(mEndScrim, setColorAlphaBound( mScrimColor, Math.round(mMaxScrimAlpha * 255))); mEndFlatColorAlpha = Color.alpha(mEndFlatColor); updateColors(); @@ -201,7 +201,7 @@ public class ScrimView extends View implements Insettable, OnChangeListener, public void reInitUi() { } protected void updateColors() { - mCurrentFlatColor = mProgress >= 1 ? 0 : setAlphaComponent( + mCurrentFlatColor = mProgress >= 1 ? 0 : setColorAlphaBound( mEndFlatColor, Math.round((1 - mProgress) * mEndFlatColorAlpha)); } diff --git a/src/com/android/launcher3/widget/BaseWidgetSheet.java b/src/com/android/launcher3/widget/BaseWidgetSheet.java index 48c18f8538..673b3cc14f 100644 --- a/src/com/android/launcher3/widget/BaseWidgetSheet.java +++ b/src/com/android/launcher3/widget/BaseWidgetSheet.java @@ -17,6 +17,7 @@ package com.android.launcher3.widget; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import static com.android.launcher3.logging.LoggerUtils.newContainerTarget; import android.content.Context; @@ -42,8 +43,6 @@ import com.android.launcher3.util.Themes; import com.android.launcher3.views.AbstractSlideInView; import com.android.launcher3.views.BaseDragLayer; -import androidx.core.graphics.ColorUtils; - /** * Base class for various widgets popup */ @@ -162,11 +161,11 @@ abstract class BaseWidgetSheet extends AbstractSlideInView private static View createColorScrim(Context context) { View view = new View(context); - view.forceHasOverlappingRendering(false); + if (Utilities.ATLEAST_NOUGAT) view.forceHasOverlappingRendering(false); WallpaperColorInfo colors = WallpaperColorInfo.getInstance(context); int alpha = context.getResources().getInteger(R.integer.extracted_color_gradient_alpha); - view.setBackgroundColor(ColorUtils.setAlphaComponent(colors.getSecondaryColor(), alpha)); + view.setBackgroundColor(setColorAlphaBound(colors.getSecondaryColor(), alpha)); BaseDragLayer.LayoutParams lp = new BaseDragLayer.LayoutParams(MATCH_PARENT, MATCH_PARENT); lp.ignoreInsets = true; -- GitLab From 41e8da3ceef3470a6b67759981044720efa565ea Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 6 Nov 2018 10:15:44 -0800 Subject: [PATCH 0263/1301] Removing Launcher3 util class dependency in IconCacheUpdateHandler Change-Id: I7317c11cd2aa54b4b7647aa5644b23c91a240d19 --- .../icons/IconCacheUpdateHandler.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/com/android/launcher3/icons/IconCacheUpdateHandler.java b/src/com/android/launcher3/icons/IconCacheUpdateHandler.java index 07451b9504..5c12c8b446 100644 --- a/src/com/android/launcher3/icons/IconCacheUpdateHandler.java +++ b/src/com/android/launcher3/icons/IconCacheUpdateHandler.java @@ -27,11 +27,8 @@ import android.text.TextUtils; import android.util.Log; import android.util.SparseBooleanArray; -import com.android.launcher3.Utilities; import com.android.launcher3.icons.BaseIconCache.IconDB; -import com.android.launcher3.util.IntArray; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -204,18 +201,31 @@ public class IconCacheUpdateHandler { } } + /** + * Commits all updates as part of the update handler to disk. Not more calls should be made + * to this class after this. + */ public void finish() { // Commit all deletes - IntArray deleteIds = new IntArray(); + int deleteCount = 0; + StringBuilder queryBuilder = new StringBuilder() + .append(IconDB.COLUMN_ROWID) + .append(" IN ("); + int count = mItemsToDelete.size(); for (int i = 0; i < count; i++) { if (mItemsToDelete.valueAt(i)) { - deleteIds.add(mItemsToDelete.keyAt(i)); + if (deleteCount > 0) { + queryBuilder.append(", "); + } + queryBuilder.append(mItemsToDelete.keyAt(i)); + deleteCount++; } } - if (!deleteIds.isEmpty()) { - mIconCache.mIconDb.delete( - Utilities.createDbSelectionQuery(IconDB.COLUMN_ROWID, deleteIds), null); + queryBuilder.append(')'); + + if (deleteCount > 0) { + mIconCache.mIconDb.delete(queryBuilder.toString(), null); } } -- GitLab From dcf917b1336dd21a9cfdfcf1d7c61c98b3f949d1 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 1 Nov 2018 16:37:03 -0700 Subject: [PATCH 0264/1301] Adding an interface to allow adding custom views in FloatingHeaderView Bug: 109828640 Change-Id: I9bde5d4fab47eb3e5787bbb741b5b9051a15c0c2 --- res/layout/all_apps.xml | 45 ++++- res/layout/all_apps_floating_header.xml | 58 ------ res/layout/floating_header_content.xml | 16 ++ .../launcher3/allapps/FloatingHeaderRow.java | 58 ++++++ .../launcher3/allapps/FloatingHeaderView.java | 188 ++++++++++++++---- .../launcher3/allapps/PluginHeaderRow.java | 85 ++++++++ 6 files changed, 349 insertions(+), 101 deletions(-) delete mode 100644 res/layout/all_apps_floating_header.xml create mode 100644 res/layout/floating_header_content.xml create mode 100644 src/com/android/launcher3/allapps/FloatingHeaderRow.java create mode 100644 src/com/android/launcher3/allapps/PluginHeaderRow.java diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index b1e6f2efd7..33ff46b910 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -30,7 +30,50 @@ layout="@layout/all_apps_rv_layout" android:visibility="gone" /> - + + + + + + +

Nuaf~U*$bt2byd2rel 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�eT^D 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 z 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�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%0D_y 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