From 59f2094dd64cb62f60b66fe69eb3abba74992c8b Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 9 Apr 2018 11:02:03 -0700 Subject: [PATCH 001/257] Automatically switching the ActivityController based on the default home app preference Bug: 75979063 Change-Id: If7a173cc56da021094ab9770dee26fb61ac20dd3 --- quickstep/libs/sysui_shared.jar | Bin 120304 -> 119867 bytes .../quickstep/OverviewCommandHelper.java | 117 ++++++++++++++---- .../quickstep/TouchInteractionService.java | 5 +- 3 files changed, 99 insertions(+), 23 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index cebeea2b46cd952d12d0c41746a1870c6f1c7d3b..69ce74a7a105b4a14ceb4dd309d8cecc06fba197 100644 GIT binary patch delta 3415 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 diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index d76c49a09f..e7ed5172df 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -15,18 +15,29 @@ */ package com.android.quickstep; +import static android.content.Intent.ACTION_PACKAGE_ADDED; +import static android.content.Intent.ACTION_PACKAGE_CHANGED; +import static android.content.Intent.ACTION_PACKAGE_REMOVED; + import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; +import static com.android.systemui.shared.system.ActivityManagerWrapper + .CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; +import static com.android.systemui.shared.system.PackageManagerWrapper + .ACTION_PREFERRED_ACTIVITY_CHANGED; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.annotation.TargetApi; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ResolveInfo; import android.graphics.Rect; import android.os.Build; +import android.os.PatternMatcher; import android.os.SystemClock; import android.util.Log; import android.view.View; @@ -44,8 +55,11 @@ import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.util.SysuiEventLogger; import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.PackageManagerWrapper; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import java.util.ArrayList; + /** * Helper class to handle various atomic commands for switching between Overview. */ @@ -55,15 +69,30 @@ public class OverviewCommandHelper { private static final long RECENTS_LAUNCH_DURATION = 200; private static final String TAG = "OverviewCommandHelper"; - private static final boolean DEBUG_START_FALLBACK_ACTIVITY = false; private final Context mContext; private final ActivityManagerWrapper mAM; private final RecentsModel mRecentsModel; private final MainThreadExecutor mMainThreadExecutor; + private final ComponentName mMyHomeComponent; - public final Intent homeIntent; - public final ComponentName launcher; + private final BroadcastReceiver mUserPreferenceChangeReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + initOverviewTargets(); + } + }; + private final BroadcastReceiver mOtherHomeAppUpdateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + initOverviewTargets(); + } + }; + private String mUpdateRegisteredPackage; + + public Intent overviewIntent; + public ComponentName overviewComponent; + private ActivityControlHelper mActivityControlHelper; private long mLastToggleTime; @@ -73,22 +102,72 @@ public class OverviewCommandHelper { mMainThreadExecutor = new MainThreadExecutor(); mRecentsModel = RecentsModel.getInstance(mContext); - homeIntent = new Intent(Intent.ACTION_MAIN) + Intent myHomeIntent = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME) - .setPackage(context.getPackageName()) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - ResolveInfo info = context.getPackageManager().resolveActivity(homeIntent, 0); + .setPackage(mContext.getPackageName()); + ResolveInfo info = context.getPackageManager().resolveActivity(myHomeIntent, 0); + mMyHomeComponent = new ComponentName(context.getPackageName(), info.activityInfo.name); - if (DEBUG_START_FALLBACK_ACTIVITY) { - launcher = new ComponentName(context, RecentsActivity.class); - homeIntent.addCategory(Intent.CATEGORY_DEFAULT) - .removeCategory(Intent.CATEGORY_HOME); + mContext.registerReceiver(mUserPreferenceChangeReceiver, + new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED)); + initOverviewTargets(); + } + + private void initOverviewTargets() { + ComponentName defaultHome = PackageManagerWrapper.getInstance() + .getHomeActivities(new ArrayList<>()); + + final String overviewIntentCategory; + if (defaultHome == null || mMyHomeComponent.equals(defaultHome)) { + // User default home is same as out home app. Use Overview integrated in Launcher. + overviewComponent = mMyHomeComponent; + mActivityControlHelper = new LauncherActivityControllerHelper(); + overviewIntentCategory = Intent.CATEGORY_HOME; + + if (mUpdateRegisteredPackage != null) { + // Remove any update listener as we don't care about other packages. + mContext.unregisterReceiver(mOtherHomeAppUpdateReceiver); + mUpdateRegisteredPackage = null; + } } else { - launcher = new ComponentName(context.getPackageName(), info.activityInfo.name); + // The default home app is a different launcher. Use the fallback Overview instead. + overviewComponent = new ComponentName(mContext, RecentsActivity.class); + mActivityControlHelper = new FallbackActivityControllerHelper(); + overviewIntentCategory = Intent.CATEGORY_DEFAULT; + + // User's default home app can change as a result of package updates of this app (such + // as uninstalling the app or removing the "Launcher" feature in an update). + // Listen for package updates of this app (and remove any previously attached + // package listener). + if (!defaultHome.getPackageName().equals(mUpdateRegisteredPackage)) { + if (mUpdateRegisteredPackage != null) { + mContext.unregisterReceiver(mOtherHomeAppUpdateReceiver); + } + + mUpdateRegisteredPackage = defaultHome.getPackageName(); + IntentFilter updateReceiver = new IntentFilter(ACTION_PACKAGE_ADDED); + updateReceiver.addAction(ACTION_PACKAGE_CHANGED); + updateReceiver.addAction(ACTION_PACKAGE_REMOVED); + updateReceiver.addDataScheme("package"); + updateReceiver.addDataSchemeSpecificPart(mUpdateRegisteredPackage, + PatternMatcher.PATTERN_LITERAL); + mContext.registerReceiver(mOtherHomeAppUpdateReceiver, updateReceiver); + } } - // Clear the packageName as system can fail to dedupe it b/64108432 - homeIntent.setComponent(launcher).setPackage(null); + overviewIntent = new Intent(Intent.ACTION_MAIN) + .addCategory(overviewIntentCategory) + .setComponent(overviewComponent) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + } + + public void onDestroy() { + mContext.unregisterReceiver(mUserPreferenceChangeReceiver); + + if (mUpdateRegisteredPackage != null) { + mContext.unregisterReceiver(mOtherHomeAppUpdateReceiver); + mUpdateRegisteredPackage = null; + } } public void onOverviewToggle() { @@ -97,7 +176,7 @@ public class OverviewCommandHelper { return; } - mAM.closeSystemWindows("recentapps"); + mAM.closeSystemWindows(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS); mMainThreadExecutor.execute(new RecentsActivityCommand<>()); } @@ -106,11 +185,7 @@ public class OverviewCommandHelper { } public ActivityControlHelper getActivityControlHelper() { - if (DEBUG_START_FALLBACK_ACTIVITY) { - return new FallbackActivityControllerHelper(); - } else { - return new LauncherActivityControllerHelper(); - } + return mActivityControlHelper; } private class ShowRecentsCommand extends RecentsActivityCommand { @@ -157,7 +232,7 @@ public class OverviewCommandHelper { // Do nothing } else { mListener = mHelper.createActivityInitListener(this::onActivityReady); - mListener.registerAndStartActivity(homeIntent, this::createWindowAnimation, + mListener.registerAndStartActivity(overviewIntent, this::createWindowAnimation, mContext, mMainThreadExecutor.getHandler(), RECENTS_LAUNCH_DURATION); } } diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 84d8983e03..33b922d965 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -191,6 +191,7 @@ public class TouchInteractionService extends Service { @Override public void onDestroy() { + mOverviewCommandHelper.onDestroy(); sConnected = false; super.onDestroy(); } @@ -222,14 +223,14 @@ public class TouchInteractionService extends Service { if (runningTaskInfo == null && !forceToLauncher) { return mNoOpTouchConsumer; } else if (forceToLauncher || - runningTaskInfo.topActivity.equals(mOverviewCommandHelper.launcher)) { + runningTaskInfo.topActivity.equals(mOverviewCommandHelper.overviewComponent)) { return getOverviewConsumer(); } else { if (tracker == null) { tracker = VelocityTracker.obtain(); } return new OtherActivityTouchConsumer(this, runningTaskInfo, mRecentsModel, - mOverviewCommandHelper.homeIntent, + mOverviewCommandHelper.overviewIntent, mOverviewCommandHelper.getActivityControlHelper(), mMainThreadExecutor, mBackgroundThreadChoreographer, downHitTarget, tracker); } From 681bab045a346c6e1ec3c448b5f98a82e6ce7359 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 6 Apr 2018 15:10:50 -0700 Subject: [PATCH 002/257] Fallback recents activity fixes: > Always deferring the start activity call > Fixing quickscrub when start activtiy is deferred > Preventing finish() call on the activity > Fixing initTrack to work when the activity already exists Bug: 75979063 Change-Id: Id6038c1f6c2680ec920222fb6a85c0ecc0172ed4 --- .../quickstep/ActivityControlHelper.java | 39 ++++---- .../quickstep/OtherActivityTouchConsumer.java | 20 ++-- .../android/quickstep/RecentsActivity.java | 19 ++++ .../quickstep/RecentsActivityTracker.java | 94 +++++++++++++------ .../WindowTransformSwipeHandler.java | 16 ++-- .../fallback/FallbackRecentsView.java | 2 +- 6 files changed, 124 insertions(+), 66 deletions(-) diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 584128585f..95947d7f5e 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -19,6 +19,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.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; @@ -46,9 +47,6 @@ import com.android.quickstep.views.LauncherLayoutListener; import com.android.quickstep.views.LauncherRecentsView; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; -import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.AssistDataReceiver; -import com.android.systemui.shared.system.RecentsAnimationListener; import java.util.function.BiPredicate; @@ -85,9 +83,6 @@ public interface ActivityControlHelper { ActivityInitListener createActivityInitListener(BiPredicate onInitListener); - void startRecentsFromSwipe(Intent intent, AssistDataReceiver assistDataReceiver, - final RecentsAnimationListener remoteAnimationListener); - @Nullable T getCreatedActivity(); @@ -98,6 +93,12 @@ public interface ActivityControlHelper { @UiThread boolean switchToRecentsIfVisible(); + /** + * @return {@code true} if recents activity should be started immediately on touchDown, + * {@code false} if it should deferred until some threshold is crossed. + */ + boolean deferStartingActivity(int downHitTarget); + class LauncherActivityControllerHelper implements ActivityControlHelper { @Override @@ -220,13 +221,6 @@ public interface ActivityControlHelper { return new LauncherInitListener(onInitListener); } - @Override - public void startRecentsFromSwipe(Intent intent, AssistDataReceiver assistDataReceiver, - final RecentsAnimationListener remoteAnimationListener) { - ActivityManagerWrapper.getInstance().startRecentsActivity( - intent, assistDataReceiver, remoteAnimationListener, null, null); - } - @Nullable @Override public Launcher getCreatedActivity() { @@ -262,6 +256,11 @@ public interface ActivityControlHelper { } return false; } + + @Override + public boolean deferStartingActivity(int downHitTarget) { + return downHitTarget == HIT_TARGET_BACK; + } } class FallbackActivityControllerHelper implements ActivityControlHelper { @@ -353,14 +352,6 @@ public interface ActivityControlHelper { return new RecentsActivityTracker(onInitListener); } - @Override - public void startRecentsFromSwipe(Intent intent, AssistDataReceiver assistDataReceiver, - final RecentsAnimationListener remoteAnimationListener) { - // We can use the normal recents animation for swipe up - ActivityManagerWrapper.getInstance().startRecentsActivity( - intent, assistDataReceiver, remoteAnimationListener, null, null); - } - @Nullable @Override public RecentsActivity getCreatedActivity() { @@ -381,6 +372,12 @@ public interface ActivityControlHelper { public boolean switchToRecentsIfVisible() { return false; } + + @Override + public boolean deferStartingActivity(int downHitTarget) { + // Always defer starting the activity when using fallback + return true; + } } interface LayoutListener { diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index 4d695de907..28c950b2e8 100644 --- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java +++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java @@ -21,8 +21,7 @@ import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; import static android.view.MotionEvent.INVALID_POINTER_ID; -import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK; -import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_OVERVIEW; + import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_STEP_DRAG_SLOP_PX; import android.annotation.TargetApi; @@ -55,7 +54,6 @@ import com.android.systemui.shared.system.RecentsAnimationListener; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.WindowManagerWrapper; -import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -66,8 +64,6 @@ import java.util.concurrent.TimeUnit; public class OtherActivityTouchConsumer extends ContextWrapper implements TouchConsumer { private static final long LAUNCHER_DRAW_TIMEOUT_MS = 150; - private static final int[] DEFERRED_HIT_TARGETS = false - ? new int[] {HIT_TARGET_BACK, HIT_TARGET_OVERVIEW} : new int[] {HIT_TARGET_BACK}; private final RunningTaskInfo mRunningTask; private final RecentsModel mRecentsModel; @@ -102,7 +98,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC mActivityControlHelper = activityControl; mMainThreadExecutor = mainThreadExecutor; mBackgroundThreadChoreographer = backgroundThreadChoreographer; - mIsDeferredDownTarget = Arrays.binarySearch(DEFERRED_HIT_TARGETS, downHitTarget) >= 0; + mIsDeferredDownTarget = activityControl.deferStartingActivity(downHitTarget); } @Override @@ -218,7 +214,8 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC handler.initWhenReady(); TraceHelper.beginSection("RecentsController"); - Runnable startActivity = () -> mActivityControlHelper.startRecentsFromSwipe(mHomeIntent, + Runnable startActivity = () -> ActivityManagerWrapper.getInstance().startRecentsActivity( + mHomeIntent, new AssistDataReceiver() { @Override public void onHandleAssistData(Bundle bundle) { @@ -247,7 +244,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC handler.onRecentsAnimationCanceled(); } } - }); + }, null, null); if (Looper.myLooper() != Looper.getMainLooper()) { startActivity.run(); @@ -305,6 +302,13 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC @Override public void updateTouchTracking(int interactionType) { + if (!mPassedInitialSlop && mIsDeferredDownTarget && mInteractionHandler == null) { + // If we deferred starting the window animation on touch down, then + // start tracking now + startTouchTrackingForWindowAnimation(SystemClock.uptimeMillis()); + mPassedInitialSlop = true; + } + notifyGestureStarted(); if (mInteractionHandler != null) { mInteractionHandler.updateInteractionType(interactionType); diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index cf60fdff65..19ef8ab4c1 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -16,6 +16,7 @@ package com.android.quickstep; import android.app.ActivityOptions; +import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -102,9 +103,27 @@ public class RecentsActivity extends BaseDraggingActivity { UiFactory.onTrimMemory(this, level); } + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + RecentsActivityTracker.onRecentsActivityNewIntent(this); + } + @Override protected void onDestroy() { super.onDestroy(); RecentsActivityTracker.onRecentsActivityDestroy(this); } + + @Override + public void onBackPressed() { + // TODO: Launch the task we came from + startHome(); + } + + public void startHome() { + startActivity(new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_HOME) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + } } diff --git a/quickstep/src/com/android/quickstep/RecentsActivityTracker.java b/quickstep/src/com/android/quickstep/RecentsActivityTracker.java index 77f0e7a53f..fb6090e2a5 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivityTracker.java +++ b/quickstep/src/com/android/quickstep/RecentsActivityTracker.java @@ -22,6 +22,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; +import com.android.launcher3.MainThreadExecutor; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; import com.android.quickstep.util.RemoteAnimationProvider; @@ -34,9 +35,8 @@ import java.util.function.BiPredicate; @TargetApi(Build.VERSION_CODES.P) public class RecentsActivityTracker implements ActivityInitListener { - private static final Object LOCK = new Object(); - private static WeakReference sTracker = new WeakReference<>(null); private static WeakReference sCurrentActivity = new WeakReference<>(null); + private static final Scheduler sScheduler = new Scheduler(); private final BiPredicate mOnInitListener; @@ -46,42 +46,20 @@ public class RecentsActivityTracker implements ActivityInitListener { @Override public void register() { - synchronized (LOCK) { - sTracker = new WeakReference<>(this); - } + sScheduler.schedule(this); } @Override public void unregister() { - synchronized (LOCK) { - if (sTracker.get() == this) { - sTracker.clear(); - } - } + sScheduler.clearReference(this); } - public static void onRecentsActivityCreate(RecentsActivity activity) { - synchronized (LOCK) { - RecentsActivityTracker tracker = sTracker.get(); - if (tracker != null && tracker.mOnInitListener.test(activity, false)) { - sTracker.clear(); - } - sCurrentActivity = new WeakReference<>(activity); - } - } - - public static void onRecentsActivityDestroy(RecentsActivity activity) { - synchronized (LOCK) { - if (sCurrentActivity.get() == activity) { - sCurrentActivity.clear(); - } - } + private boolean init(RecentsActivity activity, boolean visible) { + return mOnInitListener.test(activity, visible); } public static RecentsActivity getCurrentActivity() { - synchronized (LOCK) { - return sCurrentActivity.get(); - } + return sCurrentActivity.get(); } @Override @@ -92,4 +70,62 @@ public class RecentsActivityTracker implements ActivityInitListener { Bundle options = animProvider.toActivityOptions(handler, duration).toBundle(); context.startActivity(intent, options); } + + public static void onRecentsActivityCreate(RecentsActivity activity) { + sCurrentActivity = new WeakReference<>(activity); + sScheduler.initIfPending(activity, false); + } + + + public static void onRecentsActivityNewIntent(RecentsActivity activity) { + sScheduler.initIfPending(activity, activity.isStarted()); + } + + public static void onRecentsActivityDestroy(RecentsActivity activity) { + if (sCurrentActivity.get() == activity) { + sCurrentActivity.clear(); + } + } + + + private static class Scheduler implements Runnable { + + private WeakReference mPendingTracker = new WeakReference<>(null); + private MainThreadExecutor mMainThreadExecutor; + + public synchronized void schedule(RecentsActivityTracker tracker) { + mPendingTracker = new WeakReference<>(tracker); + if (mMainThreadExecutor == null) { + mMainThreadExecutor = new MainThreadExecutor(); + } + mMainThreadExecutor.execute(this); + } + + @Override + public void run() { + RecentsActivity activity = sCurrentActivity.get(); + if (activity != null) { + initIfPending(activity, activity.isStarted()); + } + } + + public synchronized boolean initIfPending(RecentsActivity activity, boolean alreadyOnHome) { + RecentsActivityTracker tracker = mPendingTracker.get(); + if (tracker != null) { + if (!tracker.init(activity, alreadyOnHome)) { + mPendingTracker.clear(); + } + return true; + } + return false; + } + + public synchronized boolean clearReference(RecentsActivityTracker tracker) { + if (mPendingTracker.get() == tracker) { + mPendingTracker.clear(); + return true; + } + return false; + } + } } diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index d4c35e0b1e..fb061d0565 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -164,6 +164,7 @@ public class WindowTransformSwipeHandler { private float mCurrentDisplacement; private boolean mGestureStarted; private int mLogAction = Touch.SWIPE; + private float mCurrentQuickScrubProgress; private @InteractionType int mInteractionType = INTERACTION_NORMAL; @@ -228,11 +229,11 @@ public class WindowTransformSwipeHandler { mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_HANDLER_INVALIDATED, this::invalidateHandlerWithLauncher); - mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_QUICK_SCRUB_START, + mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_QUICK_SCRUB_START, this::onQuickScrubStart); - mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_QUICK_SCRUB_START + mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_QUICK_SCRUB_START | STATE_SCALED_CONTROLLER_RECENTS, this::onFinishedTransitionToQuickScrub); - mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_SWITCH_TO_SCREENSHOT_COMPLETE + mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_SWITCH_TO_SCREENSHOT_COMPLETE | STATE_QUICK_SCRUB_END, this::switchToFinalAppAfterQuickScrub); } @@ -308,7 +309,6 @@ public class WindowTransformSwipeHandler { return; } - mStateCallback.setState(STATE_LAUNCHER_STARTED); mActivityControlHelper.prepareRecentsUI(mActivity, mWasLauncherAlreadyVisible); AbstractFloatingView.closeAllOpenViews(activity, mWasLauncherAlreadyVisible); @@ -343,6 +343,7 @@ public class WindowTransformSwipeHandler { mRecentsView.showTask(mRunningTaskId); mRecentsView.setFirstTaskIconScaledDown(true /* isScaledDown */, false /* animate */); mLayoutListener.open(); + mStateCallback.setState(STATE_LAUNCHER_STARTED); } public void setLauncherOnDrawCallback(Runnable callback) { @@ -684,6 +685,9 @@ public class WindowTransformSwipeHandler { private void onQuickScrubStart() { mActivityControlHelper.onQuickInteractionStart(mActivity, mWasLauncherAlreadyVisible); mQuickScrubController.onQuickScrubStart(false); + + // Inform the last progress in case we skipped before. + mQuickScrubController.onQuickScrubProgress(mCurrentQuickScrubProgress); } private void onFinishedTransitionToQuickScrub() { @@ -691,10 +695,8 @@ public class WindowTransformSwipeHandler { } public void onQuickScrubProgress(float progress) { + mCurrentQuickScrubProgress = progress; if (Looper.myLooper() != Looper.getMainLooper() || mQuickScrubController == null) { - // TODO: We can still get progress events while launcher is not ready on the worker - // thread. Keep track of last received progress and apply that progress when launcher - // is ready return; } mQuickScrubController.onQuickScrubProgress(progress); diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 4ed165699e..89422afddc 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -41,7 +41,7 @@ public class FallbackRecentsView extends RecentsView { @Override protected void onAllTasksRemoved() { - mActivity.finish(); + mActivity.startHome(); } @Override From 52c7b8c6acae1e70b27144900bd3a13949622e58 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 6 Apr 2018 16:24:44 -0700 Subject: [PATCH 003/257] Can now swipe away to dismiss second task Previously we only allowed dragging the forefront task. Now you can swipe up to dismiss the second task as well, but can't drag it down to launch. Also cleaned up page-scroll-while-dismissing logic to ensure it works correctly in RTL and for new cases with dismissing adjacent pages. Bug: 73187449 Change-Id: I1fe873c4cf1380b951dd3b2e396ab401ca1f7470 --- .../uioverrides/TaskViewTouchController.java | 38 +++++++++++------ .../android/quickstep/views/RecentsView.java | 41 +++++++++++++++---- .../launcher3/touch/SwipeDetector.java | 4 ++ 3 files changed, 62 insertions(+), 21 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java index e73b2197fb..42f81057ce 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java @@ -22,7 +22,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.util.Log; import android.view.MotionEvent; -import android.view.View; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; @@ -32,9 +31,9 @@ import com.android.launcher3.anim.Interpolators; import com.android.launcher3.touch.SwipeDetector; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; +import com.android.launcher3.util.PendingAnimation; import com.android.launcher3.util.TouchController; import com.android.launcher3.views.BaseDragLayer; -import com.android.launcher3.util.PendingAnimation; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; @@ -107,7 +106,7 @@ public abstract class TaskViewTouchController // Now figure out which direction scroll events the controller will start // calling the callbacks. - final int directionsToDetectScroll; + int directionsToDetectScroll = 0; boolean ignoreSlopWhenSettling = false; if (mCurrentAnimation != null) { directionsToDetectScroll = SwipeDetector.DIRECTION_BOTH; @@ -115,12 +114,19 @@ public abstract class TaskViewTouchController } else { mTaskBeingDragged = null; - View view = mRecentsView.getChildAt(mRecentsView.getCurrentPage()); - if (view instanceof TaskView && mActivity.getDragLayer().isEventOverView(view, ev)) { - // The tile can be dragged down to open the task. - mTaskBeingDragged = (TaskView) view; - directionsToDetectScroll = SwipeDetector.DIRECTION_BOTH; - } else { + for (int i = 0; i < mRecentsView.getChildCount(); i++) { + TaskView view = mRecentsView.getPageAt(i); + if (mRecentsView.isTaskViewVisible(view) && mActivity.getDragLayer() + .isEventOverView(view, ev)) { + // The task can be dragged up to dismiss it, + // and down to open if it's the current page. + mTaskBeingDragged = view; + directionsToDetectScroll = i == mRecentsView.getCurrentPage() + ? SwipeDetector.DIRECTION_BOTH : SwipeDetector.DIRECTION_POSITIVE; + break; + } + } + if (mTaskBeingDragged == null) { mNoIntercept = true; return false; } @@ -143,10 +149,16 @@ public abstract class TaskViewTouchController return mDetector.onTouchEvent(ev); } - private void reInitAnimationController(boolean goingUp) { + private boolean reInitAnimationController(boolean goingUp) { if (mCurrentAnimation != null && mCurrentAnimationIsGoingUp == goingUp) { // No need to init - return; + return false; + } + int scrollDirections = mDetector.getScrollDirections(); + if (goingUp && ((scrollDirections & SwipeDetector.DIRECTION_POSITIVE) == 0) + || !goingUp && ((scrollDirections & SwipeDetector.DIRECTION_NEGATIVE) == 0)) { + // Trying to re-init in an unsupported direction. + return false; } if (mCurrentAnimation != null) { mCurrentAnimation.setPlayFraction(0); @@ -180,6 +192,7 @@ public abstract class TaskViewTouchController mCurrentAnimation.getTarget().addListener(this); mCurrentAnimation.dispatchOnStart(); mProgressMultiplier = 1 / mEndDisplacement; + return true; } @Override @@ -220,8 +233,7 @@ public abstract class TaskViewTouchController // Not allowed goingToEnd = false; } else { - reInitAnimationController(goingUp); - goingToEnd = true; + goingToEnd = reInitAnimationController(goingUp); } } else { goingToEnd = true; diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index d95619c055..644b098203 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -708,14 +708,14 @@ public abstract class RecentsView int[] newScroll = new int[count]; getPageScrolls(newScroll, false, (v) -> v.getVisibility() != GONE && v != taskView); - int maxScrollDiff = 0; - int lastPage = mIsRtl ? 0 : count - 1; - if (getChildAt(lastPage) == taskView) { - if (count > 1) { - int secondLastPage = mIsRtl ? 1 : count - 2; - maxScrollDiff = oldScroll[lastPage] - newScroll[secondLastPage]; - } + int scrollDiffPerPage = 0; + int leftmostPage = mIsRtl ? count -1 : 0; + int rightmostPage = mIsRtl ? 0 : count - 1; + if (count > 1) { + int secondRightmostPage = mIsRtl ? 1 : count - 2; + scrollDiffPerPage = oldScroll[rightmostPage] - oldScroll[secondRightmostPage]; } + int draggedIndex = indexOfChild(taskView); boolean needsCurveUpdates = false; for (int i = 0; i < count; i++) { @@ -727,7 +727,26 @@ public abstract class RecentsView duration, LINEAR, anim); } } else { - int scrollDiff = newScroll[i] - oldScroll[i] + maxScrollDiff; + // If we just take newScroll - oldScroll, everything to the right of dragged task + // translates to the left. We need to offset this in some cases: + // - In RTL, add page offset to all pages, since we want pages to move to the right + // Additionally, add a page offset if: + // - Current page is rightmost page (leftmost for RTL) + // - Dragging an adjacent page on the left side (right side for RTL) + int offset = mIsRtl ? scrollDiffPerPage : 0; + if (mCurrentPage == draggedIndex) { + int lastPage = mIsRtl ? leftmostPage : rightmostPage; + if (mCurrentPage == lastPage) { + offset += mIsRtl ? -scrollDiffPerPage : scrollDiffPerPage; + } + } else { + // Dragging an adjacent page. + int negativeAdjacent = mCurrentPage - 1; // (Right in RTL, left in LTR) + if (draggedIndex == negativeAdjacent) { + offset += mIsRtl ? -scrollDiffPerPage : scrollDiffPerPage; + } + } + int scrollDiff = newScroll[i] - oldScroll[i] + offset; if (scrollDiff != 0) { addAnim(ObjectAnimator.ofFloat(child, TRANSLATION_X, scrollDiff), duration, ACCEL, anim); @@ -753,9 +772,15 @@ public abstract class RecentsView if (removeTask) { ActivityManagerWrapper.getInstance().removeTask(taskView.getTask().key.id); } + int pageToSnapTo = mCurrentPage; + if (draggedIndex < pageToSnapTo) { + pageToSnapTo -= 1; + } removeView(taskView); if (getChildCount() == 0) { onAllTasksRemoved(); + } else { + snapToPageImmediately(pageToSnapTo); } } resetTaskVisuals(); diff --git a/src/com/android/launcher3/touch/SwipeDetector.java b/src/com/android/launcher3/touch/SwipeDetector.java index 4b36ad99db..703e4fdaba 100644 --- a/src/com/android/launcher3/touch/SwipeDetector.java +++ b/src/com/android/launcher3/touch/SwipeDetector.java @@ -194,6 +194,10 @@ public class SwipeDetector { mIgnoreSlopWhenSettling = ignoreSlop; } + public int getScrollDirections() { + return mScrollConditions; + } + private boolean shouldScrollStart(MotionEvent ev, int pointerIndex) { // reject cases where the angle or slop condition is not met. if (Math.max(mDir.getActiveTouchSlop(ev, pointerIndex, mDownPos), mTouchSlop) From f0f00b30b8821b00e889dad3926da7a47a82b9a8 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Mon, 9 Apr 2018 16:20:42 -0700 Subject: [PATCH 004/257] Check for eng build as a debug build Test: compile with eng lunch and see if you get debug settings Change-Id: If94c4d49b5fb12cd46d51197e0a60ea6d0b0a01e --- src/com/android/launcher3/Utilities.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index cabccbf656..ba96d4ae65 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -105,7 +105,8 @@ 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"); + public static final boolean IS_DEBUG_DEVICE = Build.TYPE.toLowerCase().contains("debug") + || Build.TYPE.toLowerCase().equals("eng"); // An intent extra to indicate the horizontal scroll of the wallpaper. public static final String EXTRA_WALLPAPER_OFFSET = "com.android.launcher3.WALLPAPER_OFFSET"; From b35f50cf55742a26c6e319ec324f9118c6886b88 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 9 Apr 2018 16:30:51 -0700 Subject: [PATCH 005/257] Do not reset the previous state animation, if it is a part of the new state animaiton Change-Id: Ic433db8cd2b0701923185d0a2db2a4361567437f --- .../launcher3/LauncherAppTransitionManagerImpl.java | 4 +++- src/com/android/launcher3/LauncherStateManager.java | 11 ++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index ad0b7344b6..74d455faa3 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -261,6 +261,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag return false; } + Animator childStateAnimation = null; // Found a visible recents task that matches the opening app, lets launch the app from there Animator launcherAnim; final AnimatorListenerAdapter windowAnimEndListener; @@ -276,6 +277,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag mLauncher.getStateManager() .createAnimationToNewWorkspace(NORMAL, RECENTS_LAUNCH_DURATION); controller.dispatchOnStart(); + childStateAnimation = controller.getOriginalTarget(); launcherAnim = controller.getAnimationPlayer().setDuration(RECENTS_LAUNCH_DURATION); windowAnimEndListener = new AnimatorListenerAdapter() { @Override @@ -291,7 +293,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag // Set the current animation first, before adding windowAnimEndListener. Setting current // animation adds some listeners which need to be called before windowAnimEndListener // (the ordering of listeners matter in this case). - mLauncher.getStateManager().setCurrentAnimation(target); + mLauncher.getStateManager().setCurrentAnimation(target, childStateAnimation); target.addListener(windowAnimEndListener); return true; } diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index 534c8ae351..d5e6a9ddde 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -354,8 +354,17 @@ public class LauncherStateManager { /** * Sets the animation as the current state animation, i.e., canceled when * starting another animation and may block some launcher interactions while running. + * + * @param childAnimations Set of animations with the new target is controlling. */ - public void setCurrentAnimation(AnimatorSet anim) { + public void setCurrentAnimation(AnimatorSet anim, Animator... childAnimations) { + for (Animator childAnim : childAnimations) { + if (childAnim != null && mConfig.mCurrentAnimation == childAnim) { + mConfig.mCurrentAnimation.removeListener(mConfig); + mConfig.mCurrentAnimation = null; + break; + } + } boolean reapplyNeeded = mConfig.mCurrentAnimation != null; cancelAnimation(); if (reapplyNeeded) { From 68c47c56208c1b38ac644d35c26e777beb51d735 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 9 Apr 2018 16:08:04 -0700 Subject: [PATCH 006/257] Adding task open animation in fallback activity Change-Id: I9a861cc4162b98c067061afad42631dc4fa0e3e2 --- .../LauncherAppTransitionManagerImpl.java | 230 +++--------------- .../android/quickstep/RecentsActivity.java | 65 ++++- .../src/com/android/quickstep/TaskUtils.java | 168 ++++++++++++- .../util/MultiValueUpdateListener.java | 68 ++++++ 4 files changed, 334 insertions(+), 197 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/util/MultiValueUpdateListener.java diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index ad0b7344b6..8fbb512dc7 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -19,6 +19,13 @@ package com.android.launcher3; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; +import static com.android.launcher3.anim.Interpolators.AGGRESSIVE_EASE; +import static com.android.launcher3.anim.Interpolators.AGGRESSIVE_EASE_IN_OUT; +import static com.android.launcher3.anim.Interpolators.APP_CLOSE_ALPHA; +import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.quickstep.TaskUtils.findTaskViewToLaunch; +import static com.android.quickstep.TaskUtils.getRecentsWindowAnimator; +import static com.android.quickstep.TaskUtils.taskIsATargetWithMode; import static com.android.systemui.shared.recents.utilities.Utilities.getNextFrameNumber; import static com.android.systemui.shared.recents.utilities.Utilities.getSurface; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; @@ -31,7 +38,6 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.app.ActivityOptions; -import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; @@ -45,7 +51,6 @@ import android.util.Log; import android.view.Surface; import android.view.View; import android.view.ViewGroup; -import android.view.animation.Interpolator; import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; import com.android.launcher3.InsettableFrameLayout.LayoutParams; @@ -55,12 +60,10 @@ import com.android.launcher3.anim.Interpolators; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.shortcuts.DeepShortcutView; -import com.android.quickstep.RecentsAnimationInterpolator; -import com.android.quickstep.RecentsAnimationInterpolator.TaskWindowBounds; +import com.android.quickstep.util.MultiValueUpdateListener; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; -import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ActivityCompat; import com.android.systemui.shared.system.ActivityOptionsCompat; import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; @@ -79,7 +82,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag implements OnDeviceProfileChangeListener { private static final String TAG = "LauncherTransition"; - private static final int STATUS_BAR_TRANSITION_DURATION = 120; + public static final int STATUS_BAR_TRANSITION_DURATION = 120; private static final String CONTROL_REMOTE_APP_TRANSITION_PERMISSION = "android.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS"; @@ -87,7 +90,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag private static final int APP_LAUNCH_DURATION = 500; // Use a shorter duration for x or y translation to create a curve effect private static final int APP_LAUNCH_CURVED_DURATION = 233; - private static final int RECENTS_LAUNCH_DURATION = 336; + public static final int RECENTS_LAUNCH_DURATION = 336; private static final int LAUNCHER_RESUME_START_DELAY = 100; private static final int CLOSING_TRANSITION_DURATION_MS = 350; @@ -184,64 +187,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag mRemoteAnimationProvider = animationProvider; } - /** - * Try to find a TaskView that corresponds with the component of the launched view. - * - * If this method returns a non-null TaskView, it will be used in composeRecentsLaunchAnimation. - * Otherwise, we will assume we are using a normal app transition, but it's possible that the - * opening remote target (which we don't get until onAnimationStart) will resolve to a TaskView. - */ - private TaskView findTaskViewToLaunch( - BaseDraggingActivity activity, View v, RemoteAnimationTargetCompat[] targets) { - if (v instanceof TaskView) { - return (TaskView) v; - } - RecentsView recentsView = activity.getOverviewPanel(); - - // It's possible that the launched view can still be resolved to a visible task view, check - // the task id of the opening task and see if we can find a match. - if (v.getTag() instanceof ItemInfo) { - ItemInfo itemInfo = (ItemInfo) v.getTag(); - ComponentName componentName = itemInfo.getTargetComponent(); - if (componentName != null) { - for (int i = 0; i < recentsView.getChildCount(); i++) { - TaskView taskView = (TaskView) recentsView.getPageAt(i); - if (recentsView.isTaskViewVisible(taskView)) { - Task task = taskView.getTask(); - if (componentName.equals(task.key.getComponent())) { - return taskView; - } - } - } - } - } - - if (targets == null) { - return null; - } - // Resolve the opening task id - int openingTaskId = -1; - for (RemoteAnimationTargetCompat target : targets) { - if (target.mode == MODE_OPENING) { - openingTaskId = target.taskId; - break; - } - } - - // If there is no opening task id, fall back to the normal app icon launch animation - if (openingTaskId == -1) { - return null; - } - - // If the opening task id is not currently visible in overview, then fall back to normal app - // icon launch animation - TaskView taskView = recentsView.getTaskView(openingTaskId); - if (taskView == null || !recentsView.isTaskViewVisible(taskView)) { - return null; - } - return taskView; - } - /** * Composes the animations for a launch from the recents list if possible. */ @@ -285,7 +230,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag }; } - target.play(getRecentsWindowAnimator(taskView, skipLauncherChanges, targets)); + target.play(getRecentsWindowAnimator(taskView, skipLauncherChanges, targets) + .setDuration(RECENTS_LAUNCH_DURATION)); target.play(launcherAnim); // Set the current animation first, before adding windowAnimEndListener. Setting current @@ -296,83 +242,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag return true; } - /** - * @return Animator that controls the window of the opening targets for the recents launch - * animation. - */ - private ValueAnimator getRecentsWindowAnimator(TaskView v, boolean skipLauncherChanges, - RemoteAnimationTargetCompat[] targets) { - final RecentsAnimationInterpolator recentsInterpolator = v.getRecentsInterpolator(); - - Rect crop = new Rect(); - Matrix matrix = new Matrix(); - - ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); - appAnimator.setDuration(RECENTS_LAUNCH_DURATION); - appAnimator.setInterpolator(Interpolators.TOUCH_RESPONSE_INTERPOLATOR); - appAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - boolean isFirstFrame = true; - - @Override - public void onAnimationUpdate(ValueAnimator animation) { - final Surface surface = getSurface(v); - final long frameNumber = surface != null ? getNextFrameNumber(surface) : -1; - if (frameNumber == -1) { - // Booo, not cool! Our surface got destroyed, so no reason to animate anything. - Log.w(TAG, "Failed to animate, surface got destroyed."); - return; - } - final float percent = animation.getAnimatedFraction(); - TaskWindowBounds tw = recentsInterpolator.interpolate(percent); - - float alphaDuration = 75; - if (!skipLauncherChanges) { - v.setScaleX(tw.taskScale); - v.setScaleY(tw.taskScale); - v.setTranslationX(tw.taskX); - v.setTranslationY(tw.taskY); - // Defer fading out the view until after the app window gets faded in - v.setAlpha(getValue(1f, 0f, alphaDuration, alphaDuration, - appAnimator.getDuration() * percent, Interpolators.LINEAR)); - } - - matrix.setScale(tw.winScale, tw.winScale); - matrix.postTranslate(tw.winX, tw.winY); - crop.set(tw.winCrop); - - // Fade in the app window. - float alpha = getValue(0f, 1f, 0, alphaDuration, - appAnimator.getDuration() * percent, Interpolators.LINEAR); - - TransactionCompat t = new TransactionCompat(); - for (RemoteAnimationTargetCompat target : targets) { - if (target.mode == RemoteAnimationTargetCompat.MODE_OPENING) { - t.setAlpha(target.leash, alpha); - - // TODO: This isn't correct at the beginning of the animation, but better - // than nothing. - matrix.postTranslate(target.position.x, target.position.y); - t.setMatrix(target.leash, matrix); - t.setWindowCrop(target.leash, crop); - - if (!skipLauncherChanges) { - t.deferTransactionUntil(target.leash, surface, frameNumber); - } - } - if (isFirstFrame) { - t.show(target.leash); - } - } - t.setEarlyWakeup(); - t.apply(); - - matrix.reset(); - isFirstFrame = false; - } - }); - return appAnimator; - } - /** * Content is everything on screen except the background and the floating view (if any). * @@ -399,9 +268,9 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag ObjectAnimator alpha = ObjectAnimator.ofFloat(appsView, View.ALPHA, alphas); alpha.setDuration(217); - alpha.setInterpolator(Interpolators.LINEAR); + alpha.setInterpolator(LINEAR); ObjectAnimator transY = ObjectAnimator.ofFloat(appsView, View.TRANSLATION_Y, trans); - transY.setInterpolator(Interpolators.AGGRESSIVE_EASE); + transY.setInterpolator(AGGRESSIVE_EASE); transY.setDuration(350); launcherAnimator.play(alpha); @@ -420,10 +289,10 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag ObjectAnimator dragLayerAlpha = ObjectAnimator.ofFloat(mDragLayer, View.ALPHA, alphas); dragLayerAlpha.setDuration(217); - dragLayerAlpha.setInterpolator(Interpolators.LINEAR); + dragLayerAlpha.setInterpolator(LINEAR); ObjectAnimator dragLayerTransY = ObjectAnimator.ofFloat(mDragLayer, View.TRANSLATION_Y, trans); - dragLayerTransY.setInterpolator(Interpolators.AGGRESSIVE_EASE); + dragLayerTransY.setInterpolator(AGGRESSIVE_EASE); dragLayerTransY.setDuration(350); launcherAnimator.play(dragLayerAlpha); @@ -515,8 +384,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag boolean isBelowCenterY = lp.topMargin < centerY; x.setDuration(isBelowCenterY ? APP_LAUNCH_DURATION : APP_LAUNCH_CURVED_DURATION); y.setDuration(isBelowCenterY ? APP_LAUNCH_CURVED_DURATION : APP_LAUNCH_DURATION); - x.setInterpolator(Interpolators.AGGRESSIVE_EASE); - y.setInterpolator(Interpolators.AGGRESSIVE_EASE); + x.setInterpolator(AGGRESSIVE_EASE); + y.setInterpolator(AGGRESSIVE_EASE); appIconAnimatorSet.play(x); appIconAnimatorSet.play(y); @@ -534,7 +403,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag ObjectAnimator alpha = ObjectAnimator.ofFloat(mFloatingView, View.ALPHA, 1f, 0f); alpha.setStartDelay(32); alpha.setDuration(50); - alpha.setInterpolator(Interpolators.LINEAR); + alpha.setInterpolator(LINEAR); appIconAnimatorSet.play(alpha); appIconAnimatorSet.addListener(new AnimatorListenerAdapter() { @@ -569,11 +438,14 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); appAnimator.setDuration(APP_LAUNCH_DURATION); - appAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + appAnimator.addUpdateListener(new MultiValueUpdateListener() { + // Fade alpha for the app window. + FloatProp mAlpha = new FloatProp(0f, 1f, 0, 60, LINEAR); + boolean isFirstFrame = true; @Override - public void onAnimationUpdate(ValueAnimator animation) { + public void onUpdate(float percent) { final Surface surface = getSurface(mFloatingView); final long frameNumber = surface != null ? getNextFrameNumber(surface) : -1; if (frameNumber == -1) { @@ -581,8 +453,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag Log.w(TAG, "Failed to animate, surface got destroyed."); return; } - final float percent = animation.getAnimatedFraction(); - final float easePercent = Interpolators.AGGRESSIVE_EASE.getInterpolation(percent); + final float easePercent = AGGRESSIVE_EASE.getInterpolation(percent); // Calculate app icon size. float iconWidth = bounds.width() * mFloatingView.getScaleX(); @@ -607,11 +478,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag float transY0 = floatingViewBounds[1] - offsetY; matrix.postTranslate(transX0, transY0); - // Fade in the app window. - float alphaDuration = 60; - float alpha = getValue(0f, 1f, 0, alphaDuration, - appAnimator.getDuration() * percent, Interpolators.LINEAR); - // Animate the window crop so that it starts off as a square, and then reveals // horizontally. float cropHeight = deviceHeight * easePercent + deviceWidth * (1 - easePercent); @@ -624,7 +490,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag TransactionCompat t = new TransactionCompat(); for (RemoteAnimationTargetCompat target : targets) { if (target.mode == MODE_OPENING) { - t.setAlpha(target.leash, alpha); + t.setAlpha(target.leash, mAlpha.value); // TODO: This isn't correct at the beginning of the animation, but better // than nothing. @@ -670,13 +536,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag } private boolean launcherIsATargetWithMode(RemoteAnimationTargetCompat[] targets, int mode) { - int launcherTaskId = mLauncher.getTaskId(); - for (RemoteAnimationTargetCompat target : targets) { - if (target.mode == mode && target.taskId == launcherTaskId) { - return true; - } - } - return false; + return taskIsATargetWithMode(targets, mLauncher.getTaskId(), mode); } /** @@ -730,30 +590,23 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag ValueAnimator closingAnimator = ValueAnimator.ofFloat(0, 1); closingAnimator.setDuration(CLOSING_TRANSITION_DURATION_MS); + closingAnimator.addUpdateListener(new MultiValueUpdateListener() { + FloatProp mDx = new FloatProp(0, endX, 0, 350, AGGRESSIVE_EASE_IN_OUT); + FloatProp mScale = new FloatProp(1f, 0.8f, 0, 267, AGGRESSIVE_EASE); + FloatProp mAlpha = new FloatProp(1f, 0f, 0, 350, APP_CLOSE_ALPHA); - closingAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { boolean isFirstFrame = true; @Override - public void onAnimationUpdate(ValueAnimator animation) { - final float percent = animation.getAnimatedFraction(); - float currentPlayTime = percent * closingAnimator.getDuration(); - - float scale = getValue(1f, 0.8f, 0, 267, currentPlayTime, - Interpolators.AGGRESSIVE_EASE); - - float dX = getValue(0, endX, 0, 350, currentPlayTime, - Interpolators.AGGRESSIVE_EASE_IN_OUT); - + public void onUpdate(float percent) { TransactionCompat t = new TransactionCompat(); for (RemoteAnimationTargetCompat app : targets) { if (app.mode == RemoteAnimationTargetCompat.MODE_CLOSING) { - t.setAlpha(app.leash, getValue(1f, 0f, 0, 350, currentPlayTime, - Interpolators.APP_CLOSE_ALPHA)); - matrix.setScale(scale, scale, + t.setAlpha(app.leash, mAlpha.value); + matrix.setScale(mScale.value, mScale.value, app.sourceContainerBounds.centerX(), app.sourceContainerBounds.centerY()); - matrix.postTranslate(dX, 0); + matrix.postTranslate(mDx.value, 0); matrix.postTranslate(app.position.x, app.position.y); t.setMatrix(app.leash, matrix); } @@ -772,6 +625,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag isFirstFrame = false; } }); + return closingAnimator; } @@ -832,16 +686,4 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag return mLauncher.checkSelfPermission(CONTROL_REMOTE_APP_TRANSITION_PERMISSION) == PackageManager.PERMISSION_GRANTED; } - - /** - * Helper method that allows us to get interpolated values for embedded - * animations with a delay and/or different duration. - */ - private static float getValue(float start, float end, float delay, float duration, - float currentPlayTime, Interpolator i) { - float time = Math.max(0, currentPlayTime - delay); - float newPercent = Math.min(1f, time / duration); - newPercent = i.getInterpolation(newPercent); - return end * newPercent + start * (1 - newPercent); - } } diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 19ef8ab4c1..eb0be89122 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -15,16 +15,29 @@ */ package com.android.quickstep; +import static com.android.launcher3.LauncherAppTransitionManagerImpl.RECENTS_LAUNCH_DURATION; +import static com.android.launcher3.LauncherAppTransitionManagerImpl.STATUS_BAR_TRANSITION_DURATION; +import static com.android.quickstep.TaskUtils.getRecentsWindowAnimator; +import static com.android.quickstep.TaskUtils.taskIsATargetWithMode; +import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; import android.app.ActivityOptions; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.view.View; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherAnimationRunner; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; +import com.android.launcher3.anim.Interpolators; import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.uioverrides.UiFactory; import com.android.launcher3.util.SystemUiController; @@ -32,12 +45,18 @@ import com.android.launcher3.util.Themes; import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.fallback.FallbackRecentsView; import com.android.quickstep.fallback.RecentsRootView; +import com.android.quickstep.views.TaskView; +import com.android.systemui.shared.system.ActivityOptionsCompat; +import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; +import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; +import com.android.systemui.shared.system.RemoteAnimationTargetCompat; /** * A simple activity to show the recently launched tasks */ public class RecentsActivity extends BaseDraggingActivity { + private Handler mUiHandler = new Handler(Looper.getMainLooper()); private RecentsRootView mRecentsRootView; private FallbackRecentsView mFallbackRecentsView; @@ -84,8 +103,49 @@ public class RecentsActivity extends BaseDraggingActivity { } @Override - public ActivityOptions getActivityLaunchOptions(View v, boolean useDefaultLaunchOptions) { - return null; + public ActivityOptions getActivityLaunchOptions(final View v, boolean useDefaultLaunchOptions) { + if (useDefaultLaunchOptions || !(v instanceof TaskView)) { + return null; + } + + final TaskView taskView = (TaskView) v; + RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mUiHandler) { + + @Override + public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { + return composeRecentsLaunchAnimator(taskView, targetCompats); + } + }; + return ActivityOptionsCompat.makeRemoteAnimation(new RemoteAnimationAdapterCompat( + runner, RECENTS_LAUNCH_DURATION, + RECENTS_LAUNCH_DURATION - STATUS_BAR_TRANSITION_DURATION)); + } + + /** + * Composes the animations for a launch from the recents list if possible. + */ + private AnimatorSet composeRecentsLaunchAnimator(TaskView taskView, + RemoteAnimationTargetCompat[] targets) { + AnimatorSet target = new AnimatorSet(); + boolean activityClosing = taskIsATargetWithMode(targets, getTaskId(), MODE_CLOSING); + target.play(getRecentsWindowAnimator(taskView, !activityClosing, targets) + .setDuration(RECENTS_LAUNCH_DURATION)); + + // Found a visible recents task that matches the opening app, lets launch the app from there + if (activityClosing) { + Animator adjacentAnimation = mFallbackRecentsView + .createAdjacentPageAnimForTaskLaunch(taskView); + adjacentAnimation.setInterpolator(Interpolators.TOUCH_RESPONSE_INTERPOLATOR); + adjacentAnimation.setDuration(RECENTS_LAUNCH_DURATION); + adjacentAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mFallbackRecentsView.resetTaskVisuals(); + } + }); + target.play(adjacentAnimation); + } + return target; } @Override @@ -95,6 +155,7 @@ public class RecentsActivity extends BaseDraggingActivity { protected void onStart() { super.onStart(); UiFactory.onStart(this); + mFallbackRecentsView.resetTaskVisuals(); } @Override diff --git a/quickstep/src/com/android/quickstep/TaskUtils.java b/quickstep/src/com/android/quickstep/TaskUtils.java index 5bf1d07db4..c66f00fe33 100644 --- a/quickstep/src/com/android/quickstep/TaskUtils.java +++ b/quickstep/src/com/android/quickstep/TaskUtils.java @@ -16,25 +16,47 @@ package com.android.quickstep; +import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR; +import static com.android.systemui.shared.recents.utilities.Utilities.getNextFrameNumber; +import static com.android.systemui.shared.recents.utilities.Utilities.getSurface; +import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING; + +import android.animation.ValueAnimator; +import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.graphics.Matrix; +import android.graphics.Rect; import android.os.UserHandle; import android.util.Log; +import android.view.Surface; +import android.view.View; +import com.android.launcher3.BaseDraggingActivity; +import com.android.launcher3.ItemInfo; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.util.ComponentKey; +import com.android.quickstep.RecentsAnimationInterpolator.TaskWindowBounds; +import com.android.quickstep.util.MultiValueUpdateListener; +import com.android.quickstep.views.RecentsView; +import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import com.android.systemui.shared.system.TransactionCompat; /** * Contains helpful methods for retrieving data from {@link Task}s. - * TODO: remove this once we switch to getting the icon and label from IconCache. */ public class TaskUtils { private static final String TAG = "TaskUtils"; + /** + * TODO: remove this once we switch to getting the icon and label from IconCache. + */ public static CharSequence getTitle(Context context, Task task) { LauncherAppsCompat launcherAppsCompat = LauncherAppsCompat.getInstance(context); UserManagerCompat userManagerCompat = UserManagerCompat.getInstance(context); @@ -53,4 +75,148 @@ public class TaskUtils { public static ComponentKey getComponentKeyForTask(Task.TaskKey taskKey) { return new ComponentKey(taskKey.getComponent(), UserHandle.of(taskKey.userId)); } + + + /** + * Try to find a TaskView that corresponds with the component of the launched view. + * + * If this method returns a non-null TaskView, it will be used in composeRecentsLaunchAnimation. + * Otherwise, we will assume we are using a normal app transition, but it's possible that the + * opening remote target (which we don't get until onAnimationStart) will resolve to a TaskView. + */ + public static TaskView findTaskViewToLaunch( + BaseDraggingActivity activity, View v, RemoteAnimationTargetCompat[] targets) { + if (v instanceof TaskView) { + return (TaskView) v; + } + RecentsView recentsView = activity.getOverviewPanel(); + + // It's possible that the launched view can still be resolved to a visible task view, check + // the task id of the opening task and see if we can find a match. + if (v.getTag() instanceof ItemInfo) { + ItemInfo itemInfo = (ItemInfo) v.getTag(); + ComponentName componentName = itemInfo.getTargetComponent(); + if (componentName != null) { + for (int i = 0; i < recentsView.getChildCount(); i++) { + TaskView taskView = recentsView.getPageAt(i); + if (recentsView.isTaskViewVisible(taskView)) { + Task task = taskView.getTask(); + if (componentName.equals(task.key.getComponent())) { + return taskView; + } + } + } + } + } + + if (targets == null) { + return null; + } + // Resolve the opening task id + int openingTaskId = -1; + for (RemoteAnimationTargetCompat target : targets) { + if (target.mode == MODE_OPENING) { + openingTaskId = target.taskId; + break; + } + } + + // If there is no opening task id, fall back to the normal app icon launch animation + if (openingTaskId == -1) { + return null; + } + + // If the opening task id is not currently visible in overview, then fall back to normal app + // icon launch animation + TaskView taskView = recentsView.getTaskView(openingTaskId); + if (taskView == null || !recentsView.isTaskViewVisible(taskView)) { + return null; + } + return taskView; + } + + + /** + * @return Animator that controls the window of the opening targets for the recents launch + * animation. + */ + public static ValueAnimator getRecentsWindowAnimator(TaskView v, boolean skipViewChanges, + RemoteAnimationTargetCompat[] targets) { + final RecentsAnimationInterpolator recentsInterpolator = v.getRecentsInterpolator(); + + Rect crop = new Rect(); + Matrix matrix = new Matrix(); + + ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); + appAnimator.setInterpolator(TOUCH_RESPONSE_INTERPOLATOR); + appAnimator.addUpdateListener(new MultiValueUpdateListener() { + + // Defer fading out the view until after the app window gets faded in + FloatProp mViewAlpha = new FloatProp(1f, 0f, 75, 75, LINEAR); + FloatProp mTaskAlpha = new FloatProp(0f, 1f, 0, 75, LINEAR); + + boolean isFirstFrame = true; + + @Override + public void onUpdate(float percent) { + + final Surface surface = getSurface(v); + final long frameNumber = surface != null ? getNextFrameNumber(surface) : -1; + if (frameNumber == -1) { + // Booo, not cool! Our surface got destroyed, so no reason to animate anything. + Log.w(TAG, "Failed to animate, surface got destroyed."); + return; + } + TaskWindowBounds tw = recentsInterpolator.interpolate(percent); + + if (!skipViewChanges) { + v.setScaleX(tw.taskScale); + v.setScaleY(tw.taskScale); + v.setTranslationX(tw.taskX); + v.setTranslationY(tw.taskY); + v.setAlpha(mViewAlpha.value); + } + + matrix.setScale(tw.winScale, tw.winScale); + matrix.postTranslate(tw.winX, tw.winY); + crop.set(tw.winCrop); + + TransactionCompat t = new TransactionCompat(); + for (RemoteAnimationTargetCompat target : targets) { + if (target.mode == RemoteAnimationTargetCompat.MODE_OPENING) { + t.setAlpha(target.leash, mTaskAlpha.value); + + // TODO: This isn't correct at the beginning of the animation, but better + // than nothing. + matrix.postTranslate(target.position.x, target.position.y); + t.setMatrix(target.leash, matrix); + t.setWindowCrop(target.leash, crop); + + if (!skipViewChanges) { + t.deferTransactionUntil(target.leash, surface, frameNumber); + } + } + if (isFirstFrame) { + t.show(target.leash); + } + } + t.setEarlyWakeup(); + t.apply(); + + matrix.reset(); + isFirstFrame = false; + } + }); + return appAnimator; + } + + public static boolean taskIsATargetWithMode(RemoteAnimationTargetCompat[] targets, + int taskId, int mode) { + for (RemoteAnimationTargetCompat target : targets) { + if (target.mode == mode && target.taskId == taskId) { + return true; + } + } + return false; + } } diff --git a/quickstep/src/com/android/quickstep/util/MultiValueUpdateListener.java b/quickstep/src/com/android/quickstep/util/MultiValueUpdateListener.java new file mode 100644 index 0000000000..e798d5cbcc --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/MultiValueUpdateListener.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.util; + +import android.animation.ValueAnimator; +import android.view.animation.Interpolator; + +import java.util.ArrayList; + +/** + * Utility class to update multiple values with different interpolators and durations during + * the same animation. + */ +public abstract class MultiValueUpdateListener implements ValueAnimator.AnimatorUpdateListener { + + private final ArrayList mAllProperties = new ArrayList<>(); + + @Override + public final void onAnimationUpdate(ValueAnimator animator) { + final float percent = animator.getAnimatedFraction(); + final float currentPlayTime = percent * animator.getDuration(); + + for (int i = mAllProperties.size() - 1; i >= 0; i--) { + FloatProp prop = mAllProperties.get(i); + float time = Math.max(0, currentPlayTime - prop.mDelay); + float newPercent = Math.min(1f, time / prop.mDuration); + newPercent = prop.mInterpolator.getInterpolation(newPercent); + prop.value = prop.mEnd * newPercent + prop.mStart * (1 - newPercent); + } + onUpdate(percent); + } + + public abstract void onUpdate(float percent); + + public final class FloatProp { + + public float value; + + private final float mStart; + private final float mEnd; + private final float mDelay; + private final float mDuration; + private final Interpolator mInterpolator; + + public FloatProp(float start, float end, float delay, float duration, Interpolator i) { + value = mStart = start; + mEnd = end; + mDelay = delay; + mDuration = duration; + mInterpolator = i; + + mAllProperties.add(this); + } + } +} From 71ba448671f1051b913c448dd1a6ef21a6b73154 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 6 Apr 2018 14:47:31 -0700 Subject: [PATCH 007/257] Tweak button animation to be closer to what we had before. Bug: 77152886 Change-Id: Ibd70eeee8c9de78e6e0b996ed082f701171ce934 --- .../src/com/android/quickstep/OverviewCommandHelper.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index e7ed5172df..537d8df958 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -24,6 +24,7 @@ import static com.android.systemui.shared.system.ActivityManagerWrapper .CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; import static com.android.systemui.shared.system.PackageManagerWrapper .ACTION_PREFERRED_ACTIVITY_CHANGED; +import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; import android.animation.AnimatorSet; @@ -66,7 +67,7 @@ import java.util.ArrayList; @TargetApi(Build.VERSION_CODES.P) public class OverviewCommandHelper { - private static final long RECENTS_LAUNCH_DURATION = 200; + private static final long RECENTS_LAUNCH_DURATION = 250; private static final String TAG = "OverviewCommandHelper"; @@ -316,7 +317,8 @@ public class OverviewCommandHelper { ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1); - valueAnimator.setDuration(RECENTS_LAUNCH_DURATION).setInterpolator(FAST_OUT_SLOW_IN); + valueAnimator.setDuration(RECENTS_LAUNCH_DURATION); + valueAnimator.setInterpolator(TOUCH_RESPONSE_INTERPOLATOR); valueAnimator.addUpdateListener((v) -> { clipHelper.applyTransform(targetCompats, (float) v.getAnimatedValue()); }); From c477c373abd9ecf4a6eacb44ea40cd89a3c5bcbc Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 9 Apr 2018 21:06:21 -0700 Subject: [PATCH 008/257] Updating shared lib for icon loader change. Bug: 77747389 Change-Id: I84d56a016222d844ab311bd12ade6693b084bff0 --- quickstep/libs/sysui_shared.jar | Bin 119867 -> 120847 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 69ce74a7a105b4a14ceb4dd309d8cecc06fba197..f5c6149aee0d18a1a77d91dc4835d4600b396ba9 100644 GIT binary patch delta 8835 zcmZu%2Rv2%|G!7Ji;PQTM=2wFXOrwbk`;-_DywiKk?~j;hsUgl$m-(SBeGIf$qtF6 zP^oDCzvtebetDjMUY+kbpU?XtdORD`T?B~RfaGDvDu@~WSqY)> z94se(i@_aL5F6}O1<~R0oT>;J|ABuRB14zrhY#2yEw1{l9Nt;z8Vz`d+i4&tI>zzRbuwHOW;!x2~Jhi-=kjIgq}abl_dS9Opa=7W{W#GW5KVsecc}85apA0 zBfOO*^Zd@rzBk^2#!+q6;jMhr(?3E+E|y)oFk=5P%&fv5+e8?2FdKDnNxNHOlb2Td z%BCUs!%bVUrjKOu@Pm+Ynvtyuva9BW-01H*57{n!d>y#pn0i|h&Bl$hVQcW}_gA>H z{V=mvqMBb*Cl-!2aFO=5Z@5PLSw%xYddPX5C2Nq)nKtR1oIpp)`aZ6hXq^j@PUxRP z)=S*n33aD;%CRx6OVQW0xHa|oYocUM_!{AKgHrnD#!V~7|6W)c@?Gh+7?slRyHFHX z)B2L-yrx}+qTI*jkU*^g8Q9AzJV5Id*_-YbtNKQ#;C{H>NqaeH^(EZ}Gi$vv(Qjio+K!s`+{2RNW!`i;V&r9Jv~{}nI*yxOtLW@xqL&Rb>hva4&X35D@{Q@i@CUP` zmv>&Rx>@N$L6DiDbTA(K$#_CK_Yw~u=DEaD!2&A>!$s#wwEv?ttJ`T_K~MS@i?jQ^ zN;nt-Z!Y_>Tn#|HE^WVIw{y z;XGZ1eUf4WJ(jRH$5hNx6!$RKchGH$*}Ocx=-GAS{p$+nJ!R0*8akYB)+n2&MSOo+ z3~=1qqI_=TyUl~vm%BArC@6IfBhjB#d#^zE^D8Fal23J~er(4DO6crhjxjPR-zv(O z;7p%!?PmYr^~y+O&6KzBD2%<{y+;sx!$=Z67R-BT_3JUL<+m%)48N?JKtjRhk%%6> z&HYTm9gq~Q#)d>v3e!Ef(@aYHlVhjk{rw&MQ_8x!%N{|#4VfCMX-dZChsb)3nPZGk z+RpbWKhe()Sy%nCPDwV}FsDA!+L1zeN<~W0_)67SQnHNoF*kqo zSu(-;g8D>Pfm)YHU1kBD0o=~Fa5TEg#Sd?S^)bziPcQakTZ#H;StN=%vewxQ^@P&i zQ>nL2IY59g{C_GN{ePUAAg5P@Q{Q^6j(U z(BVYe^Qj6>slDmE)WJx>o4R}}VkXusJGebQ`Hq5RtmH_5wl#MK zc9}(L`-%*s{)ZEo0%jM+of^&p>vz@hL&90@{rjHaX%2B3*tH%$<}*QCTY82g$V79< zEisX7sGgo(*yGLYt&On*G_#!X-htj@oUg5ihjI6$l6(}Ex3tGiO<}iKS1vzR@=Jjt zJ|%-8f(IQkS^63Mv(*m2zO*$V@$BN~9&>EJo=bqc;ER3zcRBjeYxPXY6S|3B(y4Ao zd;|riw+81D{z`RJUK77v`lVtyrC8Z6Cv9ue;G~VVvfJ9Ki*#mO_xbSlHf0xWxtC5& zLnUoJOEFol>(Y6trLtKAIn|{NN^4nhdNeJOuMe!1rQi%pMB6^Dow(I}S|Kkn{dM3C z?Dlwe=4x(L2d&Y-NBn#cbI!?N;muEe*PO@BQ1V4j=SmnKycgG z8afAk>oJEjN3!nJogP|AE8nEpM`5j_jE`8JCKu7|%~#++8%etxpCrG2$e3Fym)<(; zvQnk8?rKB)P+FtPX$qTYcaO6M5uU+oG^tqAWQ$>ZQ2ja9C*7hHB?VX54wjg=i`c5t zhtS(|AFC&rm^6e*!iw#Y% zpDR5BtX_0uE)MF+ROm}+X;Xc*NNT<%tTFk(+qG#>EOC-D?v?x}I-I?E{oRtA7tK4f zpPpVekD;XEW67rtTkax5+3zo2G~e7NG>z0fV0BzhD#$Mv9LN$h*|)(dw?N0)RAb!r!LKa_ zOFvP%kPu?{0G0{kaB^`j=#auVJ>8TIbLdii^K6qo%%bz}Nv<84k}X%W(Ah>wuY)tG zPp8FRs83y2)K&2~!xHCw*Uy?zR>ZgxiX}Y(7b@Xsp<&F&0lH^nj91hMX#!Gb)Iu*mOsp9?LHBGZK5Qfz=)> z+d^A4zDawkm`_GAuaQ;C_;vfHFU`ZB!ddb>Wbm6gtyqx>shqxZcLF9?b7vJxombN{ z;^TiF@yO}4K3iy#W{D9k4Y1v8p*cZODv80!UMP<}LRbHux$Mq49sNkwVrQLFLaxv4 z8}Z`fmnKc`~A6MFj#c;ma2iv1S`er}HaB@9Zi1l5NWR$x`IAf#P-JlCqC+ zWCpZ2)0eY^x|<>enN1IuZCt9uBJywpf$vJ`tc;fuLs^bxa;D*00#0MH?y{?_iq1CG z)0TQFU3xlLPc6HiK_4)8*Vmf%Qo)1p;&_S+dG8;M%YP+nNUP;;ojAAu8k~u9T&FWq0$d*BK=ZU4GqD|2Z4NHJ$v0p^#c0ttC`7Yg2`jS^q z?%U7AjfoM)jl4E8w!HV(TQojcd=a%#j6H=v6)c)oZa5j4l5o??;%kvqb*=evOEty; z&$pEqhq@2r%5Z&7QV;lho5y85K8wf3$f8%Ajk%z<>ZGWcuHU~ql_^;yzg0k!Oypkcq8v|wi$rVSFKKhBqZZKE6 zad%q}AA1~;syZx3>EyJ%_uO=Ep=x5&kEG)@JHoH0rx`lcVl2K)Cu^K}KF||GC3$w9 zdRgxA{;sgcKHjG~V1~9tmjyGKx0bpNir6=vbCZ%MW&A1V_Z+?}w7pYQ9XAZKSc&k?$8b>DGx>)#FahVzsYm; z=sdT>CHBl~(^JRDGuLugjOjvXlDhO2t6|z3uYLeIzJXW<*$6$ z7PpF+mQy{Oj4ul+LfL{xh6-I&1+!3TiAU)SQkF&cpYM~vxHUfd?Ee6glGF655+K;% zu9x?X%Iduvmx)@Na2#si@3-Hln|tP4@S-)mBXYRzuahk4Z*SEKr58l$XaDu&y;M(M z(DogXu94|&p}}%Z?-3iSgf=DWLmTB+wXs5N?-v{!S4TNG*AL!j`m%HKl2g$2p^wi` zmzuc7-CP{_e#9|Ce_kQezsh56)vQY38Nd9?ckx-tk2UmDj!key>@BAXXj3kEOPzn= zWbAg2kX296e8!jZco{+lG5GjjYKQ*Wd?f?FMnMvFyp%`jESMKR$XO5bR%~l@Ng5vkAHRl00PC+_k`BsP)e|K05i5~xM^fl7rB=Y4D1`Gb+cmL zQJe!$IaA7nh*!UTNrANRhZdrgn4KIvLd4_n1>&hje0FfVd z?tm!q(ckY8IY|6Ko*f?QfT#$G5adhL@|&#I3CL#TknTTZ0zj`L9|Ukk!;R#SFvke( zBm0$hS=f&QVkc-bLsxf`VCOENi3X|v7KTrSLCZiZxSu282-m|Q1EL+^ zx-9&47~&)dMnP(b9b|UOVl4s#++AGHSbLrc*77~?=W%rlIq_*;m+C2RzHmHm*$t zQ)Ip#_40h~X;+f;<=l6tN@};~O8G47)S{J#^m57u=)`pI__`ENu3k*`+e*{)VlgAm z1I2M~dty_0%DS0h$ZKI{uTOYpi4-FX3)gK$ zR)xWp)UF2g9VMKYL~yDN*oo$3HU9EY3~Rlr+IA*XA!i z9o1!DR6cWfrqDyTT%>Ov^1+&0zq%n2XRn?<+r#P)j=qCdUHihXm`zQ*5s)?fbX~4O z$L--UTTSDq5)IH>G4K)J4kOJ0NK;cZ@` zCUJED(@~5Dp@2o`0FeS_NeZ%#BfE(#A+ZReCGHqmcOgZDI(8RQM_Nn;WP-Hr6<}Qk z?XwEV6KORoAvdHgtt8Posz~(cDnJKI;_E6X25AGTAwQ&Ds)oFg*1QI~h_rn*Pyh|O zG|rHCZ3JuGgZ%lB&p&s3C2*JYzkl_HI3_t!aL>+#*yTZ5X&Z!ulkj5vT?laS(E}}U zRGgO;AQVajWX}A5D!^N~-Jc>tL^Mm$^ZX}h6iSE}h0@xEmbL$l_N#^15X0ANf#FLY zzvxWxi&}`dlFK_70>YlG3mP0b(cS+9ms@nbjT?>LfJ^rLoJ1Nj3siMhX{JBGk*!Hhcp>wtx}S zT~L-h5>&MTIzaTtR9H4KmjZ=qphuz9c0sSeR~jH=B#FZfz@NAxqCdE>A|}{_K+2YS zBVfdqAq)vPsS&6|x^s4T-)A;pnG85g z%vEWC)GOf7v0aj@a7`0rh)DiKBprHi(3k{l)C?U)Xd%sjHrdC(+VA@&!mG;L`5=h>a6{ z*xL$mBessV0$Vhb|IldRSWv7Xj9i34HS-UHCT)fi-f8`%9-m?}69`l*(VU1UDIx$bv_mXJD{bikN?AZ;7KrQ~TLIty6d~4)%)|ka&(54{ z1ssd|PqweasU46RQLlyD7gbRJGW-w7h#dCshInAUPDqNVPr=~Q+j;;M27zksO4=&y z-}y`5mdWN?4FJ@D`)&1IAVylEzRdfO1krLG&u!&8FkUM`RPwu!;(HOK7#w~dq!^jK z+Sz|$P6Nw3K=JN5sK<;zRp6yskSF4r5EVSO2gH&MdUiLI14Dv>0+$3e#+9+^0ML!+zb6IT1vtFcLHb zalfMax9MVO z-A?QIU^xY%ExkbWk{%)|1pn-XNZUxy?GNGnK$I4^tGY|n zLZ1W$75gFL0O@>$;iCXa!T~EPyP)%izo9Jft3J}I^Q{lqGchG`K9r?jwX89EKPXO5Nj_(R&_QD_dxeH+U%swU=T6+xC9SZ)<7DsG20<~oQ zp(J8uC>R6Cm?GMcSl!eZ1iE!Vvb1;Eunzl;XN2{`z#k|e!4QQSLyd0mf;klk9NR6F z9{z_=)-c3_m~R*c=7pk29B}j@b<>}P;_fn_?kW*V_s5Y49`5^23qS3$9% zzRTeUF|fu6X}eAx0T!<&Am1vm?{$b~SG|Jl&`Gg&3im9~oA9)!Q< ogG1y$GrSMs5K2gi0u?SNo2dZ>7=nfn6HO}v9K?gtt*BQbP^`q->cbiI@SZSTbeQmu5k29K9uI!;GOGpKKgZ=i#LG~f zHgvm7O|LN+CTC}Ii!D2QI5xZ7EPt3+KrC-TU5@pF*!B75wdV4g4X?YJT?si%)0At< z`@f|ch36h~R$rHYThT|7zOb}(dwnr$>L-;KhrPJW%?0KC!dVRrlee-?u`h|q&-*4*HSbdcHgwH+w&uQ zVU!`2f)rKk$o?gv>!Dln!h#MmHKWv}S?|8iZkIuK<6t;t(wj5M>2-6%+_8E;-0Ccb zMduZ{UyLX@jV0r6H6GWS6`9{YKC)6;yZDwq_rySYl-bb3x~gxVW$G}kUi*%p$*0RwFHaOC-%M_NPU*xo68HYeSJ+& z>X(ZA&7rHDq$pNZ64hDthHgYcPA1f${}T1L7AL#C5ob^6x8#`z;s+PGXHttTzU+H2 z>siH1tt;~M;ZXZ(faeNJ(x76$4WgJ=#d;!=sz+wsTukP@_2(x6S2Hb}>6P^xJ+wt4 z19#57=yiW_?NDFK)t24P;h${Fu^MLsoH!m+uEp~e|ne>L(Jo~)v z^!whY+Fw$=c3qx+nD1iM#=pZ)19|rTr`90Dg)D0Q7E6Y)JY}75VSXz`9UG!+QvRzn z{=cdoD=P)f@imtmf6nK5kI45?NMq!*Rr$=a<_nq2p>71%0gL#Z`@i9}CnZ(b6t3Sq z7ZCN?qsE}~!J%S$>2~?56K&5}RXz{0X9`5bhfMS~xv(!d-&S}%>Uohpytbm!aWu2f z<3zjvrE?n*o&u^@rM@ig(rX=L4ZnS}W=VXBGh&|vYg6DE?hD^F=nsCMS6jL=y070QJ6e2WGV$H7hqo(T?prAU*3oc33{CdsD7HrW>{8oKA5FH6`M?&3Ab z5PQ(kP$D08m%zcH{F$TNELX`_@ajiuiowb{^?|Yr>T@Q~pY` z$miz`x>-AQCZ)e@$NMf-O&`3|CDtEGUU%YaIoC6@IVz3o)b4yp4^A_p6f%?76{zJ- zk>!whPj}^Q`z%*4jsANXj}8Z^GKW-MmfZ%OtYhzkR^vR+oT)a(yPGCQCyIIl&d@LC zviEXJEjEsWR#E!W!xdKX!g|bk!r!SLY5nuIXL`j@_$P&lAq{Oq>eQhnRw^70$B4uI z`9wz=L$Rl*5Pluc_L}?W@zODaWV&E=itQm$yTgt(X||ZNnhV)j6P&3-8c*|I7Vl{I z*e$2hWoj*brQda^;>F1;3RfayZMrKE5$D`7P)t7&Wf%dw;9v#gw+~iHA zA@5f=S0@W+_mx-Lw@`xTbH%4?EHasnu9)l-NPas`;jc2eYh3U_^L_sdxTU6Qi^F2l zdX$Mj1-JtqDJ*TDW~{MqRTZjbikxMlURGA+YtUOZbx{=~8t1QtMH-LH5_kXbExoLr zChqikWiU`9%~1*;+m$(hJ2@K`Nsy|`Kl4@B(WFmg!nwQRiu(~yW%{ywC+_2Zn#OrC zWg+iAERrOg-;dp28WE;@$rI`B%m0k$otep$hqa3(Y2wH@z<&N+_Gt z-Cb&Hyj0t${Cw_QO%Iy|sfVxhlG2<>f@+X~+ji$0d`Awrw+`N_yf4`ACm!A2YLmBk z=$)HUaom$P*Pb0=E8q6vHr)z+wR~~vO}0kf{KLcwih~`A9wj4r;xWag3+8fWg(IP} z_HL(huVzp@bkZ!g$5W74N6YTn2R}-O&xqBO8I`Kh;F$wc9Y3gjieWI=>y97%pb#)Yd%WY1cRO%;NqXsq>Qf%2kRonS<;DG%%u3aDhf0+y@hqe`=GvT~Qj_`MFCjE|;sM1#ZB-5vckdv} z5!-694vQpS%YIeSfik>QBLg%4d!p@IDdZI)xqjZSfUs)au(c8j*W2C4i8n%p6#RGokOLfd&q})3;%T@*{(CJbgb9v zlcv;}5>v(8S!sGZyT%hrPOL_%;je}ZgdV$ueDWe?7{s3&-?1a@yUXKfWlzQLg@ub;=#9{89<>C;nI@4&WN6DA!>&!JG6 zbEC-bd(QcTE*oP)(Wh&52QT|@ZZsv+EBO|0>nwU(6&Ug@)>pwg_BDm=?(+G^FBaMv zll`sN_gnfW9cgE&t~|+0x`Tfxk(C%|<6~WMy2{07=!xpSYIgU6omK;MiRPUL*46Ub zxdk6S?JRv=IUWfW`9AcDzoWgS^;3LNrOLv1SPIYgC#XK&GqRv7C-)tlKc{FR! zUjl6-SLQ}OXNcO*1o6KcwU68J-p}_HZIKQ!$s%ND{oUWDslVC_H}t z`D2gQor)hXwiy*Z<nA0g$rr2e!Cg=?r7}7^m~D9H-|l9k+Vh6A zuG9{b>dUnv9^x7?sfSHu0&tI>_JrAlei&`FXBTyEVO%}&^?2{d{qH)3CV1~C`Y%2+ zcwDs)$E308P@pbtL0YRq+}TN&?j;YEC>@7@x6<<}!PK?u)MYLXs(~?>5tQW=XP&FW41C{Kbf_~b=E30 z<%Zv}laAn`UaaLp%g%32Ih5PBNmgfOa?jdjUC`n$=)D`ExcAMynHuKKx!c9BS54^% zjC7eg83!8E_o zy{Vgxz-pFu*Kx+e_?#KJV24PT534jA7y6BuC!MYHc+9UKvdDkdbWEgRgKkaVoc+P5 zHsMkG5#;sFah;KniZusK*QK%1sO$PZNylc*tXke$jJEN+R85MS(r^df@YCFM&)zz66ZfqzchxQ5anICOlhCX^u1C&V%oI&W-lw+Y z%Xwb7Czd6qvMEmQ)w6gTH~;wduLChIXA>!>zfBNv@1m^o^S!?2>-W)SHlG!s_TcA# zbK=!XW0&*axt-KgLZa==Zj4z?oxryh-=mAAh3fy|TL|?3HvlTr>C9;~r7XQlA2SEiU=0NH`<94S7@v zm=GHh;3j@JWrn?UYglXTKouI+hRCr>Ku;WZ_C>o8P27svVOtvPh`qu~C#nC$Tv7A|*-)X1HOm_wjqc zeyj%~Qw_EgM>1h&m;72@RY2hbrCVps=Q zh}zA(xh@y3dW&Be;%MG0WhZ^AnP8h6V{ioVM5UBnS_48f86C3YV+i{|x z;(w?UB*5P&OoAmkh|WmF{wO$5p#gF*G*1iEVABd-93Z9XfOnV;=|plMq-uR|59LX) zSJV~?8R`P8B!y!@6b*)CZ305Ei|G@<80#Tx0ghuA@Y7S(uWwfekknqlLyEQoc_>Gy zKD;^NDF?ttx^@OgVeoX(rhf?QVaTtD5Qwmnyc~fF>J1wVV$%3^<&qAP%Rs zMKpFAxl013f@om)%R8>0f@XTD|E&^0m@9!9X3BfM^@|2O4i~P1!)a_WHSbC=wN^pu zDghg2ZYHJt-5026h0$qlQKlfDDuF3xuA^La@CE!_FbMaM!&^if!Dup&*e5^$O+@h% zm6XZ{_uu()NWEujL5ahiru}#PD=C;E zxN``jhD@uWA=2$%*iPhOHQ0?3eJCN4`HNseBx(Q)N*u0%#J+5d2(JMmC{~DKdkRpD z&{x3AxHTL^uolw(MHtOjyc>zCC6_%F#c3a5c;O?ae|1Z)gKSI_=ICf05JVlhp%`d| zm>BY?4#;CA;JKq8<_!m`2Me~f1b770ZjMA!@y@9$J4r zh+2nx89gE985<(hK#p~P1LOvVFz(_oFA}qfr=xh$C>GIF0}w~;&^AKs;rOPO72UsB zuz5g?x19J3&bvd~aX9TQ^C0^Ja;tH3@@XwhCTqY@Q(>saTU1digvPHrh<+2`!t4c| z71iQ|N_l8=>#{KT3YF%F!60D3lobU=A1dI4xCLk6R^{{>R31Y&N>)r+m*{gS1u9=c zrO6iW92-z+gmgEPC&F|y9OYhs>}mx9o7*8LqVg1ArwEg$ko-jXCn@l+`XUXeCT828 z8cu|_g=|2k1(HO%KS>TGvW4tA6D0?kP;wu#(6X5g?bI0dvoIU$FdJJJ?R#caYK)DK zKE&@CCCqFptie`QEgPyjjC8k>LzroWUZlCnpi0~3z}g`AikA!)Y=ZSDm@GgBx!VD@ zjmoq`aMvy}7}-wlo`r%FB4jXL6woAhkmna;2PCG%$%JzUSsjFe5_?ck1sU!j5B?nr zI;x}KK7>{Sup%|Ts%*Swy>0;?L2GK#gLa;fD;+-Ci|@KgqAk6QAQMj zTRRuR(?w<^x*#K=r_oU z%=eR{ckYJFiZPjqHvuxgqgg;1{}aC%E@YoM;6dzq$RWA+K)S>H5Biz~9Q!YN9;LbA z7J`li+T}zvdpB2|rcc`W7?_n(82XVdVGr4o_3+3chA!O3UTCDpo(!S~4g?-Jm=OKW z%~dq_fMzEZwA2ZIMq4atI{fY=`R{rDs1I6gIQv_`iony!HsoVJd0^cAkk&a*rr}9N z9LsgQ%IBLwaGF}v<8TIBTl2YqgCF(2$pmI_<~BFHkF518KR$BdIS)F;8x>uk|?T_)=py#e3v zDt8V-ryc>n87B0sgzYQp&mi;t>K_a|GO=Joz#KgZICfVMj{7ednD!P&%0Yj0qIwPl zFum-Q46i6G$7lH4THKCcvi`zzAcjdx_T77G0!=T#l&WtreJYeJ?M;O9#;Rv?-nl;X;VRo9@*HAHeen4)+?SU2Th{#M@*&JPk@ Date: Tue, 10 Apr 2018 10:50:32 -0700 Subject: [PATCH 009/257] Make a copy of DeviceProfile before updating its insets Change-Id: Ic0fb6dd103ac7af810373c8454cb0bad84e7fddd --- .../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 fb061d0565..e672dc7938 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -487,6 +487,7 @@ public class WindowTransformSwipeHandler { // not valid immediately after rotation, just use the stable insets for now Rect insets = new Rect(); WindowManagerWrapper.getInstance().getStableInsets(insets); + dp = dp.copy(mContext); dp.updateInsets(insets); } From 2d6208065a0d36d26783ba5b286bb8878e1b5d77 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 10 Apr 2018 12:35:27 -0700 Subject: [PATCH 010/257] Adding some utility callbacks in TaskOverlayManager Change-Id: Id2ef8f1c2bf4c6eab4170c32cfafad0b448e63db --- quickstep/res/values/config.xml | 1 + .../launcher3/LauncherInitListener.java | 2 + .../android/quickstep/OverviewCallbacks.java | 43 +++++++++++++++++++ .../android/quickstep/views/RecentsView.java | 3 ++ 4 files changed, 49 insertions(+) create mode 100644 quickstep/src/com/android/quickstep/OverviewCallbacks.java diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml index 94211c62fe..37929b65e2 100644 --- a/quickstep/res/values/config.xml +++ b/quickstep/res/values/config.xml @@ -16,4 +16,5 @@ + diff --git a/quickstep/src/com/android/launcher3/LauncherInitListener.java b/quickstep/src/com/android/launcher3/LauncherInitListener.java index 27f169834d..e5e377f83b 100644 --- a/quickstep/src/com/android/launcher3/LauncherInitListener.java +++ b/quickstep/src/com/android/launcher3/LauncherInitListener.java @@ -24,6 +24,7 @@ import android.os.Handler; import com.android.launcher3.states.InternalStateHandler; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; +import com.android.quickstep.OverviewCallbacks; import com.android.quickstep.util.RemoteAnimationProvider; import java.util.function.BiPredicate; @@ -60,6 +61,7 @@ public class LauncherInitListener extends InternalStateHandler implements Activi return null; }); } + OverviewCallbacks.get(launcher).onInitOverviewTransition(); return mOnInitListener.test(launcher, alreadyOnHome); } diff --git a/quickstep/src/com/android/quickstep/OverviewCallbacks.java b/quickstep/src/com/android/quickstep/OverviewCallbacks.java new file mode 100644 index 0000000000..62938a7720 --- /dev/null +++ b/quickstep/src/com/android/quickstep/OverviewCallbacks.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.quickstep; + +import android.content.Context; + +import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.util.Preconditions; + +/** + * Callbacks related to overview/quicksteps. + */ +public class OverviewCallbacks { + + private static OverviewCallbacks sInstance; + + public static OverviewCallbacks get(Context context) { + Preconditions.assertUIThread(); + if (sInstance == null) { + sInstance = Utilities.getOverrideObject(OverviewCallbacks.class, + context.getApplicationContext(), R.string.overview_callbacks_class); + } + return sInstance; + } + + public void onInitOverviewTransition() { } + + public void onResetOverview() { } +} diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index faaa40de88..74e5959922 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -64,6 +64,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.util.PendingAnimation; import com.android.launcher3.util.Themes; +import com.android.quickstep.OverviewCallbacks; import com.android.quickstep.QuickScrubController; import com.android.quickstep.RecentsAnimationInterpolator; import com.android.quickstep.RecentsAnimationInterpolator.TaskWindowBounds; @@ -513,6 +514,8 @@ public abstract class RecentsView unloadVisibleTaskData(); mRunningTaskId = -1; setCurrentPage(0); + + OverviewCallbacks.get(getContext()).onResetOverview(); } /** From 96cf14317ae25ce3f79be4489656d05a7cfe5089 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 10 Apr 2018 10:47:41 -0700 Subject: [PATCH 011/257] Close system windows when starting the swipe up gesture. Bug: 77725504 Change-Id: If8ca7f8b192d365c06f30fe33d108a88378a9d2d --- .../com/android/quickstep/WindowTransformSwipeHandler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index e672dc7938..fe9f0c3276 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -22,6 +22,7 @@ import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL; import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB; import static com.android.systemui.shared.recents.utilities.Utilities .postAtFrontOfQueueAsynchronously; +import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; import android.animation.Animator; @@ -66,6 +67,7 @@ import com.android.quickstep.util.SysuiEventLogger; 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; @@ -511,6 +513,8 @@ public class WindowTransformSwipeHandler { setStateOnUiThread(STATE_GESTURE_STARTED); mGestureStarted = true; mRecentsAnimationWrapper.enableInputConsumer(); + ActivityManagerWrapper.getInstance().closeSystemWindows( + CLOSE_SYSTEM_WINDOWS_REASON_RECENTS); } /** From f62a69b43babd482f30668b17270b7ba78931d0b Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 10 Apr 2018 14:28:00 -0700 Subject: [PATCH 012/257] Do not change page as a result of showOverview command Bug: 77723744 Change-Id: I7166e8da36c700cd66bbe4c20bf8618926c65b9c --- .../src/com/android/quickstep/OverviewCommandHelper.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index 537d8df958..5563aed18d 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -193,13 +193,7 @@ public class OverviewCommandHelper { @Override protected boolean handleCommand(long elapsedTime) { - RecentsView recents = mHelper.getVisibleRecentsView(); - if (recents != null) { - recents.snapToTaskAfterNext(); - return true; - } else { - return false; - } + return mHelper.getVisibleRecentsView() != null; } } From eeb084cb4b5fe19841289e8b3adf56e0a13ce614 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 10 Apr 2018 17:20:39 -0700 Subject: [PATCH 013/257] Handle configuration changes in fallback activity Change-Id: I1b6dd28ab3766948a7613192d0283689707c73a4 --- .../android/quickstep/RecentsActivity.java | 45 +++++++++++++++++++ .../quickstep/fallback/RecentsRootView.java | 4 ++ 2 files changed, 49 insertions(+) diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index eb0be89122..9ec9f52c42 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -15,6 +15,9 @@ */ package com.android.quickstep; +import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; +import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE; + import static com.android.launcher3.LauncherAppTransitionManagerImpl.RECENTS_LAUNCH_DURATION; import static com.android.launcher3.LauncherAppTransitionManagerImpl.STATUS_BAR_TRANSITION_DURATION; import static com.android.quickstep.TaskUtils.getRecentsWindowAnimator; @@ -26,11 +29,14 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.app.ActivityOptions; import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.View; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; @@ -60,10 +66,13 @@ public class RecentsActivity extends BaseDraggingActivity { private RecentsRootView mRecentsRootView; private FallbackRecentsView mFallbackRecentsView; + private Configuration mOldConfig; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + mOldConfig = new Configuration(getResources().getConfiguration()); // In case we are reusing IDP, create a copy so that we dont conflict with Launcher // activity. LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); @@ -82,6 +91,42 @@ public class RecentsActivity extends BaseDraggingActivity { RecentsActivityTracker.onRecentsActivityCreate(this); } + @Override + public void onConfigurationChanged(Configuration newConfig) { + int diff = newConfig.diff(mOldConfig); + if ((diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0) { + onHandleConfigChanged(); + } + mOldConfig.setTo(newConfig); + super.onConfigurationChanged(newConfig); + } + + @Override + public void onMultiWindowModeChanged(boolean isInMultiWindowMode, Configuration newConfig) { + mOldConfig.setTo(newConfig); + onHandleConfigChanged(); + super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig); + } + + private void onHandleConfigChanged() { + mUserEventDispatcher = null; + + // In case we are reusing IDP, create a copy so that we dont conflict with Launcher + // activity. + LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); + setDeviceProfile(appState != null + ? appState.getInvariantDeviceProfile().getDeviceProfile(this).copy(this) + : new InvariantDeviceProfile(this).getDeviceProfile(this)); + + AbstractFloatingView.closeOpenViews(this, true, + AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE); + dispatchDeviceProfileChanged(); + + mRecentsRootView.setup(); + mRecentsRootView.dispatchInsets(); + mRecentsRootView.requestLayout(); + } + @Override public BaseDragLayer getDragLayer() { return mRecentsRootView; diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java b/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java index 7aaa88c38d..1dc6fcff10 100644 --- a/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java +++ b/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java @@ -62,4 +62,8 @@ public class RecentsRootView extends BaseDragLayer { setBackground(insets.top == 0 ? null : Themes.getAttrDrawable(getContext(), R.attr.workspaceStatusBarScrim)); } + + public void dispatchInsets() { + super.setInsets(mInsets); + } } \ No newline at end of file From 8e26fe9ae9a206bfed1cad05049b93c65530ae69 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 11 Apr 2018 09:51:25 -0700 Subject: [PATCH 014/257] Add haptic when entering quick scrub Bug: 77905939 Change-Id: Iaf16c0de9bc82ed903151c6782781a1487bfe922 --- .../android/quickstep/QuickScrubController.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/quickstep/src/com/android/quickstep/QuickScrubController.java b/quickstep/src/com/android/quickstep/QuickScrubController.java index fd089b5927..ea9d009e34 100644 --- a/quickstep/src/com/android/quickstep/QuickScrubController.java +++ b/quickstep/src/com/android/quickstep/QuickScrubController.java @@ -138,17 +138,26 @@ public class QuickScrubController implements OnAlarmListener { } public void snapToNextTaskIfAvailable() { - if (!mStartedFromHome && mInQuickScrub && mRecentsView.getChildCount() > 0) { - mRecentsView.snapToPage(mRecentsView.getNextPage() + 1, QUICK_SCRUB_START_DURATION); + if (mInQuickScrub && mRecentsView.getChildCount() > 0) { + int pageToGoTo = mStartedFromHome ? 0 : mRecentsView.getNextPage() + 1; + goToPageWithHaptic(pageToGoTo, QUICK_SCRUB_START_DURATION, true /* forceHaptic */); } } private void goToPageWithHaptic(int pageToGoTo) { + goToPageWithHaptic(pageToGoTo, -1 /* overrideDuration */, false /* forceHaptic */); + } + + private void goToPageWithHaptic(int pageToGoTo, int overrideDuration, boolean forceHaptic) { pageToGoTo = Utilities.boundToRange(pageToGoTo, 0, mRecentsView.getPageCount() - 1); - if (pageToGoTo != mRecentsView.getNextPage()) { - int duration = Math.abs(pageToGoTo - mRecentsView.getNextPage()) + boolean snappingToPage = pageToGoTo != mRecentsView.getNextPage(); + if (snappingToPage) { + int duration = overrideDuration > -1 ? overrideDuration + : Math.abs(pageToGoTo - mRecentsView.getNextPage()) * QUICKSCRUB_SNAP_DURATION_PER_PAGE; mRecentsView.snapToPage(pageToGoTo, duration); + } + if (snappingToPage || forceHaptic) { mRecentsView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); } From eeaa8ee6c2fa58bbdc64bf374a467cd1be2ce316 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 11 Apr 2018 12:23:42 -0700 Subject: [PATCH 015/257] a11y: disabling animation for task list swipes Bug: 77632611 Test: Manual Change-Id: Ibbfba5f3219d63a5604544eea33422ee91f54c01 --- src/com/android/launcher3/PagedView.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 15bf76da50..9da5cf07b7 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -695,7 +695,11 @@ public abstract class PagedView extends ViewGrou public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) { int page = indexToPage(indexOfChild(child)); if (page != mCurrentPage || !mScroller.isFinished()) { - snapToPage(page); + if (immediate) { + setCurrentPage(page); + } else { + snapToPage(page); + } return true; } return false; From fceb82d4a71d094fc058b9cdd404ce9787292b0f Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 10 Apr 2018 16:07:02 -0700 Subject: [PATCH 016/257] Waiting until post draw before calling finish on the recent transition Bug: 77695434 Change-Id: I7c3c668de7c3986760f26890fa062dee0ddb3805 --- quickstep/libs/sysui_shared.jar | Bin 120847 -> 122318 bytes .../WindowTransformSwipeHandler.java | 20 ++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index f5c6149aee0d18a1a77d91dc4835d4600b396ba9..fec73179cefac7ac364c83db9d6057640b198994 100644 GIT binary patch delta 4761 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
yKFM@A^@F<2UGFTN@eu29Mq{j#u4(2j`XI0 zrP$9{4n3&=O=^*Oy&R$2ceB>iVyig9P}O#)r!bOupu`p}sRBc)+*u$?nDKPNOrZp; zET@n{9K4*R2uSuWok*92q2f32l^6x*PY7}RhN!@KfL zoe?n)6O3VTunSW%;Vdd{mbamZfd^(a*aWRZLWOs4`~ zrII44;r~{#QIowbi7qx9))i-s2q@)u)_+x~tdTypGJ~wo?D>>rtejPt{Ba~LdH^7n zb%7}wQ$e48u?CKO=pYo0kDZ??iul6(O96j(QJlcO4EYS6PpiR5#gWVUln4dxS%!CkfUcT^s+!#u~uqQc+ zP2dCJX}n|B8l?ArE?`l%6bjfn3!R{fJ$M*dpfwM0^vlbjnQe?PgRPjZS^;_F%+Ppw z^5-H-X#ySEW)^9OZ$pC8O+`GFEHY0Nvb)I=R9G(%EGLNqE0od>%5--)l*o{|;C5b~;q_2&B#e@yflZazO81!JAEWJe|!xVeQWCA^w5E zo?*eeoFcbI`R_0b+~OY-ll2eZHEK)M7q69U^DZ)30U*09U)KA?=m}lbmZbdrH=^{> z!n#;NakuY+s%0bI_9tiCznA{#UcZ;_F4YVbbUhw?)wA%)>576vg^@Vw#O&JXz+jL$K)Mt~e z_DV4S{NGpnRCHUxboseR|AJ2S6<%YRhN8+x=iX(#J=4tp&x3*!=PDyz={co!<8K0N z>|&)vXlHlihImQ;e8IY^N9$`ZwHA%{(XF%guDcd*=(Ih!b8(nx#MM{6y0T|`g2&UO zl!zJyrvGqQjzByG@DipKYOcD zVI{3m@2j?cqyFx?>Tbbkf1cf<=*FUklo zr^=?a%rID`f80n?U{-%<_t7iG>TfdllqY?Sh6V#R-Vgc8dGuGI{=B%nz>t%v8X?WT z`QKZX74G!RcYifgO=)415dUlMe_<9JR%Gt?CeHs(g2BRHhflw!&BI1iD{}c7@1A;$ znmRw;+&_3Z?NqPm(BUM<{+XUXSLQxne^e&4_2TM~wXG`#O`1w59npuN5S>Q};O5E~ zIPp?n6iV@UJLGu0&%QAxjr{&@{6bYqf+#W)G=35C<;j>Nr@>P8ZS(2ni*0An1{okB zR~B;>S)kY5phvIDg67X>2>JA2zgu(Q8*;bMc+~9KRUV~a%>+QlN?{2Bjis=f0E05v zMnGB_gc9(v3<3!VpgF09<|O-aEHT$@emNW@V15Ne5|CX15dc#R~efZw;_OJ=zfPQ@cINWzsoV%6F})6?jh5befK!&ePd3HA}2ubW{%0hP_Ln*gg8F6aCft{YQZ@kwAD z9%$tnKGw?l+1$o?ZfS!Z#Kxr^XUG^=v~!HG1GW>Upo7~u?M{5g7@L$%w$GVeT)($> zK`6O`C(oe`dfo*V3X`rFw6qtriHF`Um@akm5UOniW5f(5(y9PeBDqSibl~VGNgLfg z3<6Xl0Y#!$Gy1WNNxEh?7!%398%s@@pQO2jEn!$*F3aK}HX*ET4`z+?SQd}45n+9L bF-xCi+3a30RQBQd@T5(6ytfwse_s3vKKvB- diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index fe9f0c3276..06e6556b53 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -31,6 +31,7 @@ import android.annotation.TargetApi; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.content.res.Resources; +import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; import android.os.Build; @@ -73,6 +74,7 @@ import com.android.systemui.shared.system.LatencyTrackerCompat; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.TransactionCompat; +import com.android.systemui.shared.system.WindowCallbacksCompat; import com.android.systemui.shared.system.WindowManagerWrapper; import java.util.StringJoiner; @@ -645,24 +647,30 @@ public class WindowTransformSwipeHandler { synchronized (mRecentsAnimationWrapper) { if (mRecentsAnimationWrapper.controller != null) { - TransactionCompat transaction = new TransactionCompat(); for (RemoteAnimationTargetCompat app : mRecentsAnimationWrapper.targets) { if (app.mode == MODE_CLOSING) { // Update the screenshot of the task ThumbnailData thumbnail = mRecentsAnimationWrapper.controller.screenshotTask(app.taskId); - TaskView taskView = mRecentsView.updateThumbnail(app.taskId, thumbnail); + final TaskView taskView = + mRecentsView.updateThumbnail(app.taskId, thumbnail); if (taskView != null) { taskView.setAlpha(1); + // Defer finishing the animation until the next launcher frame with the // new thumbnail - mActivityControlHelper.executeOnNextDraw(mActivity, taskView, - finishTransitionRunnable); - finishTransitionPosted = true; + finishTransitionPosted = new WindowCallbacksCompat(taskView) { + + @Override + public void onPostDraw(Canvas canvas) { + finishTransitionRunnable.run(); + detach(); + } + }.attach(); + break; } } } - transaction.apply(); } } if (!finishTransitionPosted) { From 1a77c3dce1925bdba572341c973e30ca7bb8e693 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 11 Apr 2018 12:47:47 -0700 Subject: [PATCH 017/257] Reload the task list when multiwindow mode changes Bug: 73097187 Change-Id: I05d8635f78451600cbb8a9c03515e60d3c32e1ae --- .../android/quickstep/views/RecentsView.java | 11 +++++++++ src/com/android/launcher3/BaseActivity.java | 23 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 74e5959922..d214b13f43 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -79,6 +79,7 @@ import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; +import java.util.function.Consumer; /** * A list of recent tasks. @@ -188,6 +189,14 @@ public abstract class RecentsView private boolean mShowEmptyMessage; private Layout mEmptyTextLayout; + private BaseActivity.MultiWindowModeChangedListener mMultiWindowModeChangedListener = + (inMultiWindowMode) -> { + if (!inMultiWindowMode && mOverviewStateEnabled) { + // TODO: Re-enable layout transitions for addition of the unpinned task + reloadIfNeeded(); + } + }; + public RecentsView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setPageSpacing(getResources().getDimensionPixelSize(R.dimen.recents_page_spacing)); @@ -251,6 +260,7 @@ public abstract class RecentsView super.onAttachedToWindow(); updateTaskStackListenerState(); Utilities.getPrefs(getContext()).registerOnSharedPreferenceChangeListener(this); + mActivity.addMultiWindowModeChangedListener(mMultiWindowModeChangedListener); } @Override @@ -258,6 +268,7 @@ public abstract class RecentsView super.onDetachedFromWindow(); updateTaskStackListenerState(); Utilities.getPrefs(getContext()).unregisterOnSharedPreferenceChangeListener(this); + mActivity.removeMultiWindowModeChangedListener(mMultiWindowModeChangedListener); } @Override diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index ae631a4466..c15cde5f94 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -20,6 +20,7 @@ import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; +import android.content.res.Configuration; import android.graphics.Point; import android.view.Display; import android.view.View.AccessibilityDelegate; @@ -33,6 +34,8 @@ import java.util.ArrayList; public abstract class BaseActivity extends Activity { private final ArrayList mDPChangeListeners = new ArrayList<>(); + private final ArrayList mMultiWindowModeChangedListeners = + new ArrayList<>(); protected DeviceProfile mDeviceProfile; protected UserEventDispatcher mUserEventDispatcher; @@ -100,6 +103,14 @@ public abstract class BaseActivity extends Activity { super.onUserLeaveHint(); } + @Override + public void onMultiWindowModeChanged(boolean isInMultiWindowMode, Configuration newConfig) { + super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig); + for (int i = mMultiWindowModeChangedListeners.size() - 1; i >= 0; i--) { + mMultiWindowModeChangedListeners.get(i).onMultiWindowModeChanged(isInMultiWindowMode); + } + } + @Override protected void onStop() { mStarted = false; @@ -129,6 +140,14 @@ public abstract class BaseActivity extends Activity { } } + public void addMultiWindowModeChangedListener(MultiWindowModeChangedListener listener) { + mMultiWindowModeChangedListeners.add(listener); + } + + public void removeMultiWindowModeChangedListener(MultiWindowModeChangedListener listener) { + mMultiWindowModeChangedListeners.remove(listener); + } + /** * Used to set the override visibility state, used only to handle the transition home with the * recents animation. @@ -157,4 +176,8 @@ public abstract class BaseActivity extends Activity { mDeviceProfile = mDeviceProfile.getMultiWindowProfile(this, mwSize); } } + + public interface MultiWindowModeChangedListener { + void onMultiWindowModeChanged(boolean isInMultiWindowMode); + } } From e833bf3ef567a072cf26b0711085c1b8d6d89175 Mon Sep 17 00:00:00 2001 From: Mehdi Alizadeh Date: Tue, 3 Apr 2018 18:14:08 -0700 Subject: [PATCH 018/257] Adds ContentObserver for Swipe Up enabled setting Registers a ContentObserver to handle Swipe Up gesture enable/disable changes from Settings App. Also provides a static method to get the current state of settings for the Swipe Up feature. Bug: 77549883 Test: Manual Test Change-Id: I5aa13cebdcb78be4869e8a5ae7f570490c8ac05c --- .../launcher3/uioverrides/UiFactory.java | 6 +- .../quickstep/OverviewInteractionState.java | 56 +++++++++++++------ 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index c1590f63de..a10583cf86 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -18,8 +18,6 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; -import static com.android.launcher3.Utilities.getPrefs; -import static com.android.quickstep.OverviewInteractionState.KEY_SWIPE_UP_ENABLED; import static com.android.launcher3.LauncherState.ALL_APPS; import android.content.Context; @@ -39,8 +37,8 @@ import com.android.systemui.shared.system.WindowManagerWrapper; public class UiFactory { public static TouchController[] createTouchControllers(Launcher launcher) { - SharedPreferences prefs = getPrefs(launcher); - boolean swipeUpEnabled = prefs.getBoolean(KEY_SWIPE_UP_ENABLED, true); + boolean swipeUpEnabled = OverviewInteractionState.getInstance(launcher) + .isSwipeUpGestureEnabled(); if (!swipeUpEnabled) { return new TouchController[] { launcher.getDragController(), diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index 22b175779d..471262ba6d 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -21,13 +21,14 @@ import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABL import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_HIDE_BACK_BUTTON; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON; +import android.content.ContentResolver; import android.content.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +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; @@ -47,7 +48,7 @@ import java.util.concurrent.ExecutionException; * * @see com.android.systemui.shared.system.NavigationBarCompat.InteractionType and associated flags. */ -public class OverviewInteractionState implements OnSharedPreferenceChangeListener { +public class OverviewInteractionState { private static final String TAG = "OverviewFlags"; @@ -70,12 +71,13 @@ public class OverviewInteractionState implements OnSharedPreferenceChangeListene return INSTANCE; } - public static final String KEY_SWIPE_UP_ENABLED = "pref_enable_quickstep"; - private static final int MSG_SET_PROXY = 200; private static final int MSG_SET_BACK_BUTTON_VISIBLE = 201; private static final int MSG_SET_SWIPE_UP_ENABLED = 202; + private static final String SWIPE_UP_SETTING_NAME = "swipe_up_to_switch_apps_enabled"; + private final SwipeUpGestureEnabledSettingObserver mSwipeUpSettingObserver; + private final Handler mUiHandler; private final Handler mBgHandler; @@ -88,19 +90,13 @@ public class OverviewInteractionState implements OnSharedPreferenceChangeListene mUiHandler = new Handler(this::handleUiMessage); mBgHandler = new Handler(UiThreadHelper.getBackgroundLooper(), this::handleBgMessage); - SharedPreferences prefs = getPrefs(context); - prefs.registerOnSharedPreferenceChangeListener(this); - onSharedPreferenceChanged(prefs, KEY_SWIPE_UP_ENABLED); + mSwipeUpSettingObserver = new SwipeUpGestureEnabledSettingObserver(mUiHandler, + context.getContentResolver()); + mSwipeUpSettingObserver.register(); } - @Override - public void onSharedPreferenceChanged(SharedPreferences prefs, String s) { - if (KEY_SWIPE_UP_ENABLED.equals(s)) { - mUiHandler.removeMessages(MSG_SET_SWIPE_UP_ENABLED); - boolean swipeUpEnabled = prefs.getBoolean(s, true); - mUiHandler.obtainMessage(MSG_SET_SWIPE_UP_ENABLED, - swipeUpEnabled ? 1 : 0, 0).sendToTarget(); - } + public boolean isSwipeUpGestureEnabled() { + return mSwipeUpEnabled; } public void setBackButtonVisible(boolean visible) { @@ -152,4 +148,32 @@ public class OverviewInteractionState implements OnSharedPreferenceChangeListene Log.w(TAG, "Unable to update overview interaction flags", e); } } + + private class SwipeUpGestureEnabledSettingObserver extends ContentObserver { + private Handler mHandler; + private ContentResolver mResolver; + + SwipeUpGestureEnabledSettingObserver(Handler handler, ContentResolver resolver) { + super(handler); + mHandler = handler; + mResolver = resolver; + } + + public void register() { + mResolver.registerContentObserver(Settings.Secure.getUriFor(SWIPE_UP_SETTING_NAME), + false, this); + mSwipeUpEnabled = getValue(); + } + + @Override + public void onChange(boolean selfChange) { + super.onChange(selfChange); + mHandler.removeMessages(MSG_SET_SWIPE_UP_ENABLED); + mHandler.obtainMessage(MSG_SET_SWIPE_UP_ENABLED, getValue() ? 1 : 0, 0).sendToTarget(); + } + + private boolean getValue() { + return Settings.Secure.getInt(mResolver, SWIPE_UP_SETTING_NAME, 0) == 1; + } + } } From 52b2b43c5676c43f2ef2cd928281f7d109d2cb76 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 11 Apr 2018 13:43:36 -0700 Subject: [PATCH 019/257] a11y: disabling accessibility scrolling of the home screen Bug: 77914605 Test: Manual Change-Id: I5dcfe7479d7239b1f66bd2e805a1aa8978f5ca5b --- src/com/android/launcher3/Workspace.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 1e2e3b10bf..7ecafdbf72 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -53,6 +53,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; @@ -3477,4 +3478,10 @@ public class Workspace extends PagedView onEndStateTransition(); } } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setScrollable(false); + } } From 76257f2535c43ff6ee67bf8ef20feab3fb6255d4 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 11 Apr 2018 13:27:49 -0700 Subject: [PATCH 020/257] Fixing multi-window task sizes in Recents activity > In recents activity, getting the DeviceProfile size from the root view, instead of the Display (as recents activtiy can be resized) > The task size in Recents activity is now proportional to the activity size instead of 50% screen size Bug: 77875376 Change-Id: Ib417c31fc7ec8569876368134ef021452d60aa12 --- .../quickstep/ActivityControlHelper.java | 7 ++- .../android/quickstep/RecentsActivity.java | 41 ++++++++++------ .../fallback/FallbackRecentsView.java | 6 +-- .../quickstep/fallback/RecentsRootView.java | 20 ++++++++ .../android/quickstep/util/LayoutUtils.java | 48 ++++++++++++++----- .../quickstep/views/LauncherRecentsView.java | 6 --- 6 files changed, 86 insertions(+), 42 deletions(-) diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 95947d7f5e..f44def2d25 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -41,10 +41,9 @@ import com.android.launcher3.LauncherState; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.util.ViewOnDrawExecutor; -import com.android.quickstep.fallback.FallbackRecentsView; +import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.views.LauncherLayoutListener; -import com.android.quickstep.views.LauncherRecentsView; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; @@ -142,7 +141,7 @@ public interface ActivityControlHelper { @Override public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) { - LauncherRecentsView.getPageRect(dp, context, outRect); + LayoutUtils.calculateLauncherTaskSize(context, dp, outRect); if (dp.isVerticalBarLayout()) { Rect targetInsets = dp.getInsets(); int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right; @@ -295,7 +294,7 @@ public interface ActivityControlHelper { @Override public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) { - FallbackRecentsView.getPageRect(dp, context, outRect); + LayoutUtils.calculateFallbackTaskSize(context, dp, outRect); if (dp.isVerticalBarLayout()) { Rect targetInsets = dp.getInsets(); int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right; diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 9ec9f52c42..0c49f16b66 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -29,7 +29,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.app.ActivityOptions; import android.content.Intent; -import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; @@ -38,6 +37,7 @@ import android.view.View; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; +import com.android.launcher3.DeviceProfile; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAnimationRunner; @@ -73,12 +73,7 @@ public class RecentsActivity extends BaseDraggingActivity { super.onCreate(savedInstanceState); mOldConfig = new Configuration(getResources().getConfiguration()); - // In case we are reusing IDP, create a copy so that we dont conflict with Launcher - // activity. - LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); - setDeviceProfile(appState != null - ? appState.getInvariantDeviceProfile().getDeviceProfile(this).copy(this) - : new InvariantDeviceProfile(this).getDeviceProfile(this)); + initDeviceProfile(); setContentView(R.layout.fallback_recents_activity); mRecentsRootView = findViewById(R.id.drag_layer); @@ -108,15 +103,15 @@ public class RecentsActivity extends BaseDraggingActivity { super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig); } + public void onRootViewSizeChanged() { + if (isInMultiWindowModeCompat()) { + onHandleConfigChanged(); + } + } + private void onHandleConfigChanged() { mUserEventDispatcher = null; - - // In case we are reusing IDP, create a copy so that we dont conflict with Launcher - // activity. - LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); - setDeviceProfile(appState != null - ? appState.getInvariantDeviceProfile().getDeviceProfile(this).copy(this) - : new InvariantDeviceProfile(this).getDeviceProfile(this)); + initDeviceProfile(); AbstractFloatingView.closeOpenViews(this, true, AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE); @@ -124,7 +119,23 @@ public class RecentsActivity extends BaseDraggingActivity { mRecentsRootView.setup(); mRecentsRootView.dispatchInsets(); - mRecentsRootView.requestLayout(); + } + + private void initDeviceProfile() { + // In case we are reusing IDP, create a copy so that we dont conflict with Launcher + // activity. + LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); + if (isInMultiWindowModeCompat()) { + InvariantDeviceProfile idp = appState == null + ? new InvariantDeviceProfile(this) : appState.getInvariantDeviceProfile(); + DeviceProfile dp = idp.getDeviceProfile(this); + mDeviceProfile = 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); + } } @Override diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 89422afddc..5a8ce160a2 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -64,11 +64,7 @@ public class FallbackRecentsView extends RecentsView { @Override protected void getTaskSize(DeviceProfile dp, Rect outRect) { - LayoutUtils.calculateTaskSize(getContext(), dp, 0, outRect); + LayoutUtils.calculateFallbackTaskSize(getContext(), dp, outRect); } - @AnyThread - public static void getPageRect(DeviceProfile grid, Context context, Rect outRect) { - LayoutUtils.calculateTaskSize(context, grid, 0, outRect); - } } diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java b/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java index 1dc6fcff10..ad7d19a5f9 100644 --- a/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java +++ b/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java @@ -17,6 +17,7 @@ package com.android.quickstep.fallback; import android.annotation.TargetApi; import android.content.Context; +import android.graphics.Point; import android.graphics.Rect; import android.util.AttributeSet; @@ -31,6 +32,8 @@ public class RecentsRootView extends BaseDragLayer { private final RecentsActivity mActivity; + private final Point mLastKnownSize = new Point(10, 10); + public RecentsRootView(Context context, AttributeSet attrs) { super(context, attrs); mActivity = (RecentsActivity) BaseActivity.fromContext(context); @@ -39,10 +42,27 @@ public class RecentsRootView extends BaseDragLayer { | SYSTEM_UI_FLAG_LAYOUT_STABLE); } + public Point getLastKnownSize() { + return mLastKnownSize; + } + public void setup() { mControllers = new TouchController[] { new RecentsTaskController(mActivity) }; } + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // Check size changes before the actual measure, to avoid multiple measure calls. + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (mLastKnownSize.x != width || mLastKnownSize.y != height) { + mLastKnownSize.set(width, height); + mActivity.onRootViewSizeChanged(); + } + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + @TargetApi(23) @Override protected boolean fitSystemWindows(Rect insets) { diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java index f29f9e4e92..aeaebea448 100644 --- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java +++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java @@ -15,39 +15,63 @@ */ package com.android.quickstep.util; +import static java.lang.annotation.RetentionPolicy.SOURCE; + import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; -import android.graphics.RectF; +import android.support.annotation.AnyThread; +import android.support.annotation.IntDef; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; +import java.lang.annotation.Retention; + public class LayoutUtils { + private static final int MULTI_WINDOW_STRATEGY_HALF_SCREEN = 1; + private static final int MULTI_WINDOW_STRATEGY_DEVICE_PROFILE = 2; + + @Retention(SOURCE) + @IntDef({MULTI_WINDOW_STRATEGY_HALF_SCREEN, MULTI_WINDOW_STRATEGY_DEVICE_PROFILE}) + private @interface MultiWindowStrategy {} + public static void calculateLauncherTaskSize(Context context, DeviceProfile dp, Rect outRect) { float extraSpace = dp.isVerticalBarLayout() ? 0 : dp.hotseatBarSizePx; - calculateTaskSize(context, dp, extraSpace, outRect); + calculateTaskSize(context, dp, extraSpace, MULTI_WINDOW_STRATEGY_HALF_SCREEN, outRect); } + public static void calculateFallbackTaskSize(Context context, DeviceProfile dp, Rect outRect) { + calculateTaskSize(context, dp, 0, MULTI_WINDOW_STRATEGY_DEVICE_PROFILE, outRect); + } + + @AnyThread public static void calculateTaskSize(Context context, DeviceProfile dp, - float extraVerticalSpace, Rect outRect) { + float extraVerticalSpace, @MultiWindowStrategy int multiWindowStrategy, Rect outRect) { float taskWidth, taskHeight, paddingHorz; Resources res = context.getResources(); Rect insets = dp.getInsets(); if (dp.isMultiWindowMode) { - DeviceProfile fullDp = dp.getFullScreenProfile(); - // Use availableWidthPx and availableHeightPx instead of widthPx and heightPx to - // account for system insets - taskWidth = fullDp.availableWidthPx; - taskHeight = fullDp.availableHeightPx; - float halfDividerSize = res.getDimension(R.dimen.multi_window_task_divider_size) / 2; + if (multiWindowStrategy == MULTI_WINDOW_STRATEGY_HALF_SCREEN) { + DeviceProfile fullDp = dp.getFullScreenProfile(); + // Use availableWidthPx and availableHeightPx instead of widthPx and heightPx to + // account for system insets + taskWidth = fullDp.availableWidthPx; + taskHeight = fullDp.availableHeightPx; + float halfDividerSize = res.getDimension(R.dimen.multi_window_task_divider_size) + / 2; - if (fullDp.isLandscape) { - taskWidth = taskWidth / 2 - halfDividerSize; + if (fullDp.isLandscape) { + taskWidth = taskWidth / 2 - halfDividerSize; + } else { + taskHeight = taskHeight / 2 - halfDividerSize; + } } else { - taskHeight = taskHeight / 2 - halfDividerSize; + // multiWindowStrategy == MULTI_WINDOW_STRATEGY_DEVICE_PROFILE + taskWidth = dp.widthPx; + taskHeight = dp.heightPx; } paddingHorz = res.getDimension(R.dimen.multi_window_task_card_horz_space); } else { diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 4b4af3fa7e..280fd467b6 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -27,7 +27,6 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; import android.os.Build; -import android.support.annotation.AnyThread; import android.util.AttributeSet; import android.util.FloatProperty; import android.view.View; @@ -131,9 +130,4 @@ public class LauncherRecentsView extends RecentsView { protected void getTaskSize(DeviceProfile dp, Rect outRect) { LayoutUtils.calculateLauncherTaskSize(getContext(), dp, outRect); } - - @AnyThread - public static void getPageRect(DeviceProfile grid, Context context, Rect outRect) { - LayoutUtils.calculateLauncherTaskSize(context, grid, outRect); - } } From c8f3ee9be1dfedf99d059f0a99dfded6e1ff0967 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 11 Apr 2018 14:39:49 -0700 Subject: [PATCH 021/257] Import translations. DO NOT MERGE Change-Id: I19182d20a9bfe17b92ee7e10dd17d6dc2e5ba118 Auto-generated-cl: translation import --- go/res/values-bs/strings.xml | 2 +- quickstep/res/values-af/strings.xml | 3 +-- quickstep/res/values-am/strings.xml | 3 +-- quickstep/res/values-ar/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 | 9 +++------ quickstep/res/values-bs/strings.xml | 3 +-- quickstep/res/values-ca/strings.xml | 9 +++------ 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 | 3 +-- quickstep/res/values-en-rGB/strings.xml | 3 +-- quickstep/res/values-en-rIN/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-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 | 9 +++------ quickstep/res/values-hi/strings.xml | 9 +++------ 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 | 5 ++--- quickstep/res/values-is/strings.xml | 7 +++---- 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-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 | 3 +-- quickstep/res/values-ru/strings.xml | 5 ++--- quickstep/res/values-si/strings.xml | 3 +-- 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 | 7 +++---- 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 | 9 +++------ 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-ar/strings.xml | 2 +- res/values-bs/strings.xml | 4 ++-- res/values-es/strings.xml | 2 +- res/values-gl/strings.xml | 2 +- res/values-sw/strings.xml | 2 +- res/values-ta/strings.xml | 6 ++---- 87 files changed, 105 insertions(+), 197 deletions(-) diff --git a/go/res/values-bs/strings.xml b/go/res/values-bs/strings.xml index 7042468b47..3141b9d8fd 100644 --- a/go/res/values-bs/strings.xml +++ b/go/res/values-bs/strings.xml @@ -20,7 +20,7 @@ "Dodirnite i držite da uzmete prečicu." - "Dvaput dodirnite i držite da uzmete prečicu ili koristite prilagođene akcije." + "Dodirnite dvaput i držite da uzmete prečicu ili koristite prilagođene akcije." "Prečice" "Prečice aplikacije %1$s" diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index fa8f9dc589..db15d07a4b 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -24,6 +24,5 @@ "Swiep van onder af op om programme te wissel" "Oorsig" "Geen onlangse items nie" - - + "Maak toe" diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml index d14e06c9e0..8d4444623a 100644 --- a/quickstep/res/values-am/strings.xml +++ b/quickstep/res/values-am/strings.xml @@ -24,6 +24,5 @@ "መተግበሪያዎችን ለመቀያየር ከግርጌ ወደ ላይ በጣት ጠረግ ያድርጉ" "ማጠቃለያ" "ምንም የቅርብ ጊዜ ንጥሎች የሉም" - - + "ዝጋ" diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index 8efffd26db..5c3b84c306 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-az/strings.xml b/quickstep/res/values-az/strings.xml index a832f9aa0e..19d0f6b75c 100644 --- a/quickstep/res/values-az/strings.xml +++ b/quickstep/res/values-az/strings.xml @@ -24,6 +24,5 @@ "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" diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml index ba44830be4..9a5aed02ce 100644 --- a/quickstep/res/values-b+sr+Latn/strings.xml +++ b/quickstep/res/values-b+sr+Latn/strings.xml @@ -24,6 +24,5 @@ "Prevucite nagore da biste prešli na drugu aplikaciju" "Pregled" "Nema nedavnih stavki" - - + "Zatvori" diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml index df55803afe..fab5d03d0f 100644 --- a/quickstep/res/values-be/strings.xml +++ b/quickstep/res/values-be/strings.xml @@ -24,6 +24,5 @@ "Для пераключэння праграм правядзіце па экране пальцам знізу ўверх" "Агляд" "Няма новых элементаў" - - + "Закрыць" diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml index c46245c83b..05a1dacf6b 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 9080072316..4856e90ddb 100644 --- a/quickstep/res/values-bn/strings.xml +++ b/quickstep/res/values-bn/strings.xml @@ -22,10 +22,7 @@ "স্ক্রিন স্প্লিট করুন" "পিন করুন" "অ্যাপগুলির মধ্যে সুইচ করতে উপর থেকে নিচের দিকে সোয়াইপ করুন" - - - - - - + "এক নজরে" + "কোনো সাম্প্রতিক আইটেম নেই" + "বন্ধ করুন" diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index 7e61277d59..fa07794428 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -24,6 +24,5 @@ "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 ac77992132..967fa1f760 100644 --- a/quickstep/res/values-ca/strings.xml +++ b/quickstep/res/values-ca/strings.xml @@ -22,10 +22,7 @@ "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-cs/strings.xml b/quickstep/res/values-cs/strings.xml index e8c0cb055e..e8d661c577 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -24,6 +24,5 @@ "Aplikace můžete přepínat přejetím zdola nahoru" "Přehled" "Žádné nedávné položky" - - + "Zavřít" diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index 6ddb31b364..72db09d75a 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -24,6 +24,5 @@ "Stryg opad fra bunden for at skifte apps" "Oversigt" "Ingen nye elementer" - - + "Luk" diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index 01c785e60a..ddc83c620e 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -24,6 +24,5 @@ "Zum Wechseln zwischen Apps vom unteren Bildschirmrand nach oben wischen" "Übersicht" "Keine kürzlich verwendeten Elemente" - - + "Schließen" diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index 6b2a25f909..7c5c260630 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 402499e65d..a8cbc3f02a 100644 --- a/quickstep/res/values-en-rAU/strings.xml +++ b/quickstep/res/values-en-rAU/strings.xml @@ -24,6 +24,5 @@ "Swipe up from the bottom to switch apps" "Overview" "No recent items" - - + "Close" diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml index 402499e65d..a8cbc3f02a 100644 --- a/quickstep/res/values-en-rGB/strings.xml +++ b/quickstep/res/values-en-rGB/strings.xml @@ -24,6 +24,5 @@ "Swipe up from the bottom to switch apps" "Overview" "No recent items" - - + "Close" diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml index 402499e65d..a8cbc3f02a 100644 --- a/quickstep/res/values-en-rIN/strings.xml +++ b/quickstep/res/values-en-rIN/strings.xml @@ -24,6 +24,5 @@ "Swipe up from the bottom to switch apps" "Overview" "No recent items" - - + "Close" diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml index 1b9f926dbb..1b888c0e52 100644 --- a/quickstep/res/values-es-rUS/strings.xml +++ b/quickstep/res/values-es-rUS/strings.xml @@ -24,6 +24,5 @@ "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 c63f1d3ea5..b0883199f2 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -24,6 +24,5 @@ "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 30199b91ca..1b30a0111d 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -24,6 +24,5 @@ "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 b6386cd48d..e7fc91580b 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -24,6 +24,5 @@ "Aplikazioak aldatzeko, pasatu hatza pantailako behealdetik gora" "Ikuspegi orokorra" "Ez dago azkenaldi honetako ezer" - - + "Itxi" diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml index 52beadd791..b58cdb9da8 100644 --- a/quickstep/res/values-fa/strings.xml +++ b/quickstep/res/values-fa/strings.xml @@ -24,6 +24,5 @@ "برای تغییر برنامه‌ها،‌ از پایین تند به بالا بکشید" "نمای کلی" "بدون موارد اخیر" - - + "بستن" diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml index a27a9cb497..9c7375df79 100644 --- a/quickstep/res/values-fi/strings.xml +++ b/quickstep/res/values-fi/strings.xml @@ -24,6 +24,5 @@ "Vaihda sovellusta pyyhkäisemällä alareunasta ylös." "Viimeisimmät" "Ei viimeaikaisia kohteita" - - + "Sulje" diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml index 8a603e98ea..cd738227f8 100644 --- a/quickstep/res/values-fr-rCA/strings.xml +++ b/quickstep/res/values-fr-rCA/strings.xml @@ -24,6 +24,5 @@ "Balayez l\'écran du bas vers le haut pour changer d\'application" "Aperçu" "Aucun élément récent" - - + "Fermer" diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index 91922872c6..5647648541 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -24,6 +24,5 @@ "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 25d3796b49..20de491d7d 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -24,6 +24,5 @@ "Pasa o dedo cara arriba desde a parte inferior para cambiar de aplicacións" "Visión xeral" "Non hai elementos recentes" - - + "Pechar" diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index f463e130c9..9337909204 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -22,10 +22,7 @@ "સ્ક્રીનને વિભાજિત કરો" "પિન કરો" "ઍપને સ્વિચ કરવા માટે નીચેથી ઉપર સ્વાઇપ કરો" - - - - - - + "ઝલક" + "તાજેતરની કોઈ આઇટમ નથી" + "બંધ કરો" diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml index ee933d1bd0..10dcc30f15 100644 --- a/quickstep/res/values-hi/strings.xml +++ b/quickstep/res/values-hi/strings.xml @@ -22,10 +22,7 @@ "स्क्रीन को दो हिस्सों में बाँटना (स्प्लिट स्क्रीन)" "पिन करना" "ऐप्लिकेशन स्विच करने के लिए सबसे नीचे से ऊपर की ओर स्वाइप करें" - - - - - - + "खास जानकारी" + "हाल ही में इस्तेमाल किया गया कोई ऐप्लिकेशन नहीं है" + "बंद करें" diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml index a0b734f5ef..a1deed3c09 100644 --- a/quickstep/res/values-hr/strings.xml +++ b/quickstep/res/values-hr/strings.xml @@ -24,6 +24,5 @@ "Prijeđite prstom od dna prema gore da biste promijenili aplikaciju" "Pregled" "Nema nedavnih stavki" - - + "Zatvori" diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml index 8a465e2a3c..ab5d2fc91e 100644 --- a/quickstep/res/values-hu/strings.xml +++ b/quickstep/res/values-hu/strings.xml @@ -24,6 +24,5 @@ "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-hy/strings.xml b/quickstep/res/values-hy/strings.xml index fdfe81895e..94178da7af 100644 --- a/quickstep/res/values-hy/strings.xml +++ b/quickstep/res/values-hy/strings.xml @@ -24,6 +24,5 @@ "Սահեցրեք ներքևից վերև՝ մյուս հավելվածին անցնելու համար" "Ընդհանուր տեղեկություններ" "Վերջին տարրեր չկան" - - + "Փակել" diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml index 786a10ccda..a1b86ec69a 100644 --- a/quickstep/res/values-in/strings.xml +++ b/quickstep/res/values-in/strings.xml @@ -23,7 +23,6 @@ "Pasang pin" "Geser dari bawah ke atas untuk beralih aplikasi" "Ringkasan" - "Tidak ada item baru-baru ini" - - + "Tidak ada item yang baru dibuka" + "Tutup" diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml index b01a749245..3f894113a4 100644 --- a/quickstep/res/values-is/strings.xml +++ b/quickstep/res/values-is/strings.xml @@ -22,8 +22,7 @@ "Skipta skjá" "Festa" "Strjúktu upp til að skipta um forrit" - - - - + "Yfirlit" + "Engin nýleg atriði" + "Loka" diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml index 0da2251be2..8af4ea8a90 100644 --- a/quickstep/res/values-it/strings.xml +++ b/quickstep/res/values-it/strings.xml @@ -24,6 +24,5 @@ "Scorri verso l\'alto dalla parte inferiore per cambiare app" "Panoramica" "Nessun elemento recente" - - + "Chiudi" diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index f7e8338781..662c467191 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -24,6 +24,5 @@ "יש להחליק כלפי מעלה מהחלק התחתון כדי לעבור בין אפליקציות" "מסכים אחרונים" "אין פריטים אחרונים" - - + "סגירה" diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml index 7e14d2c689..0dabd3f694 100644 --- a/quickstep/res/values-ja/strings.xml +++ b/quickstep/res/values-ja/strings.xml @@ -24,6 +24,5 @@ "アプリを切り替えるには、下から上にスワイプします" "概要" "最近のアイテムはありません" - - + "閉じる" diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml index cf4c661d3d..729175a85b 100644 --- a/quickstep/res/values-ka/strings.xml +++ b/quickstep/res/values-ka/strings.xml @@ -24,6 +24,5 @@ "აპების გადასართავად გადაფურცლეთ ქვედა კიდედან ზემოთ" "მიმოხილვა" "ბოლოს გამოყენებული ერთეულები არ არის" - - + "დახურვა" diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml index f865a0405e..9894ed33c9 100644 --- a/quickstep/res/values-kk/strings.xml +++ b/quickstep/res/values-kk/strings.xml @@ -24,6 +24,5 @@ "Қолданбалар арасында ауысу үшін төменнен жоғары қарай саусақпен сырғытыңыз" "Шолу" "Соңғы элементтер жоқ" - - + "Жабу" diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml index a35ab26aad..71cdbe006e 100644 --- a/quickstep/res/values-km/strings.xml +++ b/quickstep/res/values-km/strings.xml @@ -24,6 +24,5 @@ "អូស​ពី​ក្រោម​ឡើង​លើ ដើម្បី​ប្ដូរ​កម្មវិធី" "ទិដ្ឋភាពរួម" "មិនមានធាតុថ្មីៗទេ" - - + "បិទ" diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml index dc57df1d35..ab7506928c 100644 --- a/quickstep/res/values-kn/strings.xml +++ b/quickstep/res/values-kn/strings.xml @@ -24,6 +24,5 @@ "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಬದಲಿಸಲು ಕೆಳಗಿನಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ" "ಅವಲೋಕನ" "ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ" - - + "ಮುಚ್ಚಿ" diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml index 36fd122d73..181314e98b 100644 --- a/quickstep/res/values-ko/strings.xml +++ b/quickstep/res/values-ko/strings.xml @@ -24,6 +24,5 @@ "아래에서 위로 스와이프하여 앱을 전환합니다." "최근 사용" "최근 항목이 없습니다." - - + "닫기" diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml index 060a8dd21c..44b7abb7da 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 1abb856d97..847dceaf4e 100644 --- a/quickstep/res/values-lo/strings.xml +++ b/quickstep/res/values-lo/strings.xml @@ -24,6 +24,5 @@ "ປັດຂຶ້ນຈາກລຸ່ມສຸດເພື່ອສະຫຼັບແອັບ" "ພາບຮວມ" "ບໍ່ມີລາຍການຫຼ້າສຸດ" - - + "ປິດ" diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml index 0c09a94500..c0eeb6fee9 100644 --- a/quickstep/res/values-lt/strings.xml +++ b/quickstep/res/values-lt/strings.xml @@ -24,6 +24,5 @@ "Perbraukite aukštyn iš apačios, kad perjungtumėte programas" "Apžvalga" "Nėra jokių naujausių elementų" - - + "Uždaryti" diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml index 72d1cb575d..d053798510 100644 --- a/quickstep/res/values-lv/strings.xml +++ b/quickstep/res/values-lv/strings.xml @@ -24,6 +24,5 @@ "Lai pārslēgtu lietotnes, velciet augšup no apakšdaļas." "Pārskats" "Nav nesenu vienumu." - - + "Aizvērt" diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml index 06bf5d0c11..74dc5aa501 100644 --- a/quickstep/res/values-mk/strings.xml +++ b/quickstep/res/values-mk/strings.xml @@ -24,6 +24,5 @@ "Повлечете нагоре од дното за да ги смените апликациите" "Преглед" "Нема неодамнешни ставки" - - + "Затвори" diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml index b936906560..b8a4d6ec44 100644 --- a/quickstep/res/values-ml/strings.xml +++ b/quickstep/res/values-ml/strings.xml @@ -24,6 +24,5 @@ "ആപ്പുകൾ മാറാൻ താഴെ നിന്ന് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക" "അവലോകനം" "സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല" - - + "അവസാനിപ്പിക്കുക" diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml index 8b92214916..114c050271 100644 --- a/quickstep/res/values-mn/strings.xml +++ b/quickstep/res/values-mn/strings.xml @@ -24,6 +24,5 @@ "Аппыг сэлгэхийн тулд доороос дээш шударна уу" "Тойм" "Сүүлийн үеийн зүйл алга" - - + "Хаах" diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index 596792d103..fa80874287 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 336aaf6594..0e4fa3f7b9 100644 --- a/quickstep/res/values-ms/strings.xml +++ b/quickstep/res/values-ms/strings.xml @@ -24,6 +24,5 @@ "Leret ke atas dari bawah untuk menukar apl" "Ikhtisar" "Tiada item terbaharu" - - + "Tutup" diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml index d71e5fc93f..e10cd4f545 100644 --- a/quickstep/res/values-my/strings.xml +++ b/quickstep/res/values-my/strings.xml @@ -24,6 +24,5 @@ "အက်ပ်များပြောင်းရန် အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ" "အနှစ်ချုပ်" "မကြာမီကဖွင့်ထားသည်များ မရှိပါ" - - + "ပိတ်ရန်" diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml index 504f43ae80..64c47c416c 100644 --- a/quickstep/res/values-nb/strings.xml +++ b/quickstep/res/values-nb/strings.xml @@ -24,6 +24,5 @@ "Sveip opp fra bunnen for å bytte app" "Oversikt" "Ingen nylige elementer" - - + "Lukk" diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml index 7500213890..99f90bbbd4 100644 --- a/quickstep/res/values-ne/strings.xml +++ b/quickstep/res/values-ne/strings.xml @@ -24,6 +24,5 @@ "अनुप्रयोगहरू बदल्न तलबाट माथितिर स्वाइप गर्नुहोस्" "परिदृश्य" "हालसालैको कुनै पनि वस्तु छैन" - - + "बन्द गर्नुहोस्" diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml index 2ba24a6e28..23f42bffbb 100644 --- a/quickstep/res/values-nl/strings.xml +++ b/quickstep/res/values-nl/strings.xml @@ -24,6 +24,5 @@ "Veeg omhoog vanaf de onderkant om tussen apps te wisselen" "Overzicht" "Geen recente items" - - + "Sluiten" diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml index fbcb60cd6f..6e0c5a2bb3 100644 --- a/quickstep/res/values-pa/strings.xml +++ b/quickstep/res/values-pa/strings.xml @@ -24,6 +24,5 @@ "ਐਪਾਂ ਵਿੱਚ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ" "ਰੂਪ-ਰੇਖਾ" "ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ" - - + "ਬੰਦ ਕਰੋ" diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml index 1ad7070bd5..5cfdc68eb6 100644 --- a/quickstep/res/values-pl/strings.xml +++ b/quickstep/res/values-pl/strings.xml @@ -24,6 +24,5 @@ "Przesuń palcem z dołu ekranu, by przełączać aplikacje" "Przegląd" "Brak ostatnich elementów" - - + "Zamknij" diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml index a63d32998d..36ec3eb7ae 100644 --- a/quickstep/res/values-pt-rPT/strings.xml +++ b/quickstep/res/values-pt-rPT/strings.xml @@ -24,6 +24,5 @@ "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-pt/strings.xml b/quickstep/res/values-pt/strings.xml index 05d20e08e0..6a5bea904e 100644 --- a/quickstep/res/values-pt/strings.xml +++ b/quickstep/res/values-pt/strings.xml @@ -24,6 +24,5 @@ "Deslize de baixo para cima para alternar entre apps" "Visão geral" "Nenhum item recente" - - + "Fechar" diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml index 4264370f40..2c05f908e1 100644 --- a/quickstep/res/values-ro/strings.xml +++ b/quickstep/res/values-ro/strings.xml @@ -24,6 +24,5 @@ "Glisați de jos în sus pentru a schimba aplicațiile" "Recente" "Niciun element recent" - - + "Închideți" diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml index 47ddff53ca..0b0349ad08 100644 --- a/quickstep/res/values-ru/strings.xml +++ b/quickstep/res/values-ru/strings.xml @@ -23,7 +23,6 @@ "Блокировать" "Чтобы переключить приложение, проведите по экрану снизу вверх" "Обзор" - "Недавних приложений нет." - - + "Здесь пока ничего нет." + "Закрыть" diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml index a9b1493bb5..d81344fe48 100644 --- a/quickstep/res/values-si/strings.xml +++ b/quickstep/res/values-si/strings.xml @@ -24,6 +24,5 @@ "යෙදුම් මාරු කිරීම සඳහා පහළ සිට ස්වයිප් කරන්න" "දළ විශ්ලේෂණය" "මෑත අයිතම නැත" - - + "වසන්න" diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index fe028554f6..25c6e9eb8b 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -24,6 +24,5 @@ "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-sl/strings.xml b/quickstep/res/values-sl/strings.xml index 72d52a51c6..9e4b970b3c 100644 --- a/quickstep/res/values-sl/strings.xml +++ b/quickstep/res/values-sl/strings.xml @@ -24,6 +24,5 @@ "Če želite preklopiti med aplikacijami, z dna zaslona s prstom povlecite navzgor" "Pregled" "Ni nedavnih elementov" - - + "Zapri" diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml index 954342cd93..62dbf0175a 100644 --- a/quickstep/res/values-sq/strings.xml +++ b/quickstep/res/values-sq/strings.xml @@ -24,6 +24,5 @@ "Rrëshqit larg nga poshtë për të ndryshuar aplikacionet" "Përmbledhja" "Nuk ka asnjë artikull të fundit" - - + "Mbyll" diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml index 51a9586e64..ae22cfc2b2 100644 --- a/quickstep/res/values-sr/strings.xml +++ b/quickstep/res/values-sr/strings.xml @@ -24,6 +24,5 @@ "Превуците нагоре да бисте прешли на другу апликацију" "Преглед" "Нема недавних ставки" - - + "Затвори" diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml index 266cf60ef7..1434f27d89 100644 --- a/quickstep/res/values-sv/strings.xml +++ b/quickstep/res/values-sv/strings.xml @@ -24,6 +24,5 @@ "Växla mellan appar genom att svepa uppåt från nederkanten" "Översikt" "Listan med de senaste åtgärderna är tom" - - + "Stäng" diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml index e85fa45bbd..7e311b958d 100644 --- a/quickstep/res/values-sw/strings.xml +++ b/quickstep/res/values-sw/strings.xml @@ -24,6 +24,5 @@ "Telezesha kidole juu kuanzia chini ili ubadilishe programu" "Muhtasari" "Hakuna vipengee vya hivi karibuni" - - + "Funga" diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml index de03ae62e8..95d233d625 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -22,8 +22,7 @@ "திரைப் பிரிப்பு" "பின் செய்தல்" "ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, கீழிருந்து மேல்நோக்கி ஸ்வைப் செய்க" - - - - + "மேலோட்டப் பார்வை" + "சமீபத்தியவை எதுவுமில்லை" + "மூடும்" diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml index 108f35042c..7cd88c824e 100644 --- a/quickstep/res/values-te/strings.xml +++ b/quickstep/res/values-te/strings.xml @@ -24,6 +24,5 @@ "యాప్‌లను మార్చడానికి దిగువ నుండి పైకి స్వైప్ చేయండి" "అవలోకనం" "ఇటీవలి అంశాలు ఏవీ లేవు" - - + "మూసివేయండి" diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml index 80f91b087b..03f77e21ae 100644 --- a/quickstep/res/values-th/strings.xml +++ b/quickstep/res/values-th/strings.xml @@ -24,6 +24,5 @@ "เลื่อนขึ้นจากด้านล่างเพื่อสลับแอป" "ภาพรวม" "ไม่มีรายการล่าสุด" - - + "ปิด" diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml index b28e04e72d..368a1d10d9 100644 --- a/quickstep/res/values-tl/strings.xml +++ b/quickstep/res/values-tl/strings.xml @@ -24,6 +24,5 @@ "Mag-swipe pataas mula sa ibaba para lumipat ng app" "Overview" "Walang kamakailang item" - - + "Isara" diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml index 1399353561..a51acc2601 100644 --- a/quickstep/res/values-tr/strings.xml +++ b/quickstep/res/values-tr/strings.xml @@ -24,6 +24,5 @@ "Uygulamaları değiştirmek için alttan yukarı kaydırın" "Genel bakış" "Yeni öğe yok" - - + "Kapat" diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml index 929bbe795d..0b0ad16113 100644 --- a/quickstep/res/values-uk/strings.xml +++ b/quickstep/res/values-uk/strings.xml @@ -24,6 +24,5 @@ "Щоб переходити між додатками, проводьте пальцем знизу вгору" "Огляд" "Немає нещодавніх додатків" - - + "Закрити" diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml index 0271fe4d24..7285b26c56 100644 --- a/quickstep/res/values-ur/strings.xml +++ b/quickstep/res/values-ur/strings.xml @@ -22,10 +22,7 @@ "اسپلٹ اسکرین وضع" "پن کریں" "ایپس کو سوئچ کرنے کیلئے نیچے سے اوپر سوائپ کریں" - - - - - - + "مجموعی جائزہ" + "کوئی حالیہ آئٹم نہیں" + "بند کریں" diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index 91e11d3dca..260798f54b 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -24,6 +24,5 @@ "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 809517a58b..0254c3390b 100644 --- a/quickstep/res/values-vi/strings.xml +++ b/quickstep/res/values-vi/strings.xml @@ -24,6 +24,5 @@ "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 a44dd2db06..078bc83201 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 3879bc568e..86fce7b4e6 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 f275168f67..53efe9a023 100644 --- a/quickstep/res/values-zh-rTW/strings.xml +++ b/quickstep/res/values-zh-rTW/strings.xml @@ -24,6 +24,5 @@ "從畫面底部向上滑動以切換應用程式" "總覽" "最近沒有任何項目" - - + "關閉" diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml index 206718eff8..6e48dc02e9 100644 --- a/quickstep/res/values-zu/strings.xml +++ b/quickstep/res/values-zu/strings.xml @@ -24,6 +24,5 @@ "Swayiphela phezulu kusukela phansi ukuze ushintshe izinhlelo zokusebenza" "Buka konke" "Azikho izinto zakamuva" - - + "Vala" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 8598a8bb85..3163bcb783 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -96,7 +96,7 @@ "للتطبيقات الجديدة" "تغيير شكل الرمز" "على الشاشة الرئيسية" - "استخدام الإعداد الافتراضي للنظام" + "استخدام الإعداد التلقائي للنظام" "مربّع" "رمز دائري مربّع" "دائرة" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 08a453360d..7eeb652136 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -30,7 +30,7 @@ "Početni ekran" "Prilagođene akcije" "Dodirnite & i držite da biste uzeli dodatak." - "Dvaput dodirnite & i držite da biste uzeli vidžet ili koristite prilagođene radnje." + "Dodirnite dvaput & i držite da biste uzeli vidžet ili koristite prilagođene radnje." "%1$d × %2$d" "Širina %1$d, visina %2$d" "Dodirnite i držite da postavite ručno" @@ -41,7 +41,7 @@ "Pretraži više aplikacija" "Obavještenja" "Dodirnite i držite da uzmete prečicu." - "Dvaput dodirnite i držite da uzmete prečicu ili koristite prilagođene akcije." + "Dodirnite dvaput i držite da uzmete prečicu ili koristite prilagođene akcije." "Na ovom početnom ekranu nema više prostora." "Nema više prostora u ladici Omiljeno" "Spisak aplikacija" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 5b948da351..78f87344fe 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -79,7 +79,7 @@ "Carpeta: %1$s" "Widgets" "Fondos de pantalla" - "Ajustes de Home" + "Ajustes de la pantalla de inicio" "Inhabilitada por el administrador" "Puntos de notificación" "Activada" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 0cfdfa8991..3817f075ea 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -79,7 +79,7 @@ "Cartafol: %1$s" "Widgets" "Fondos de pantalla" - "Configuración de inicio" + "Configuración da pantalla de Inicio" "Función desactivada polo administrador" "Puntos de notificacións" "Activado" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 61d7f8bed3..f074ed4b91 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -94,7 +94,7 @@ "Kwa ajili ya programu mpya" "Badilisha umbo la aikoni" "kwenye Skrini ya mwanzo" - "Tumia umbo chaguo-msingi la mfumo" + "Tumia umbo chaguomsingi la mfumo" "Mraba" "Mstatili wenye pembe duara" "Mduara" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 13358c09ce..717c80f8ba 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -40,10 +40,8 @@ "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" "கூடுதல் பயன்பாடுகளைத் தேடு" "அறிவிப்புகள்" - - - - + "ஷார்ட்கட்டைச் சேர்க்க, தொட்டு பிடித்திருக்கவும்." + "ஷார்ட்கட்டைச் சேர்க்க, இருமுறை தட்டிப் பிடித்திருக்கவும் (அ) தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." "முகப்புத் திரையில் இடமில்லை." "பிடித்தவை ட்ரேயில் இடமில்லை" "பயன்பாடுகளின் பட்டியல்" From 3477804c7297bbdc33943bbfa2be4712ec840a58 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 11 Apr 2018 16:31:31 -0700 Subject: [PATCH 022/257] Using correct window bounds in multi-window for fallback activity Also fixing a bug where insets were not updated when recreating deviceprofile Bug: 77875376 Change-Id: I7806cf949da415ef171ccf2f4ab3e8f2b7606220 --- .../quickstep/ActivityControlHelper.java | 27 +++++++++++++++++++ .../android/quickstep/RecentsActivity.java | 4 +-- .../WindowTransformSwipeHandler.java | 14 ++++++---- .../quickstep/fallback/RecentsRootView.java | 1 + .../android/launcher3/LauncherRootView.java | 1 + 5 files changed, 40 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index f44def2d25..0ea729f280 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -46,6 +46,7 @@ import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.views.LauncherLayoutListener; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; +import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import java.util.function.BiPredicate; @@ -92,6 +93,10 @@ public interface ActivityControlHelper { @UiThread boolean switchToRecentsIfVisible(); + Rect getOverviewWindowBounds(Rect homeBounds, RemoteAnimationTargetCompat target); + + boolean shouldMinimizeSplitScreen(); + /** * @return {@code true} if recents activity should be started immediately on touchDown, * {@code false} if it should deferred until some threshold is crossed. @@ -260,6 +265,16 @@ public interface ActivityControlHelper { public boolean deferStartingActivity(int downHitTarget) { return downHitTarget == HIT_TARGET_BACK; } + + @Override + public Rect getOverviewWindowBounds(Rect homeBounds, RemoteAnimationTargetCompat target) { + return homeBounds; + } + + @Override + public boolean shouldMinimizeSplitScreen() { + return true; + } } class FallbackActivityControllerHelper implements ActivityControlHelper { @@ -377,6 +392,18 @@ public interface ActivityControlHelper { // Always defer starting the activity when using fallback return true; } + + @Override + public Rect getOverviewWindowBounds(Rect homeBounds, RemoteAnimationTargetCompat target) { + // TODO: Remove this once b/77875376 is fixed + return target.sourceContainerBounds; + } + + @Override + public boolean shouldMinimizeSplitScreen() { + // TODO: Remove this once b/77875376 is fixed + return false; + } } interface LayoutListener { diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 0c49f16b66..820875cc87 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -98,7 +98,6 @@ public class RecentsActivity extends BaseDraggingActivity { @Override public void onMultiWindowModeChanged(boolean isInMultiWindowMode, Configuration newConfig) { - mOldConfig.setTo(newConfig); onHandleConfigChanged(); super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig); } @@ -129,7 +128,8 @@ public class RecentsActivity extends BaseDraggingActivity { InvariantDeviceProfile idp = appState == null ? new InvariantDeviceProfile(this) : appState.getInvariantDeviceProfile(); DeviceProfile dp = idp.getDeviceProfile(this); - mDeviceProfile = dp.getMultiWindowProfile(this, mRecentsRootView.getLastKnownSize()); + 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 diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 06e6556b53..1255a02514 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -459,7 +459,10 @@ public class WindowTransformSwipeHandler { // TODO: This logic is spartanic! boolean passedThreshold = shift > 0.12f; mRecentsAnimationWrapper.setAnimationTargetsBehindSystemBars(!passedThreshold); - mRecentsAnimationWrapper.setSplitScreenMinimizedForTransaction(passedThreshold); + if (mActivityControlHelper.shouldMinimizeSplitScreen()) { + mRecentsAnimationWrapper + .setSplitScreenMinimizedForTransaction(passedThreshold); + } } }; if (Looper.getMainLooper() == Looper.myLooper()) { @@ -478,15 +481,16 @@ public class WindowTransformSwipeHandler { for (RemoteAnimationTargetCompat target : apps) { if (target.mode == MODE_CLOSING) { DeviceProfile dp = LauncherAppState.getIDP(mContext).getDeviceProfile(mContext); - final Rect homeStackBounds; + final Rect overviewStackBounds; if (minimizedHomeBounds != null) { - homeStackBounds = minimizedHomeBounds; + overviewStackBounds = mActivityControlHelper + .getOverviewWindowBounds(minimizedHomeBounds, target); dp = dp.getMultiWindowProfile(mContext, new Point(minimizedHomeBounds.width(), minimizedHomeBounds.height())); dp.updateInsets(homeContentInsets); } else { - homeStackBounds = new Rect(0, 0, dp.widthPx, dp.heightPx); + overviewStackBounds = new Rect(0, 0, dp.widthPx, dp.heightPx); // TODO: Workaround for an existing issue where the home content insets are // not valid immediately after rotation, just use the stable insets for now Rect insets = new Rect(); @@ -495,7 +499,7 @@ public class WindowTransformSwipeHandler { dp.updateInsets(insets); } - mClipAnimationHelper.updateSource(homeStackBounds, target); + mClipAnimationHelper.updateSource(overviewStackBounds, target); initTransitionEndpoints(dp); } } diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java b/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java index ad7d19a5f9..878a593482 100644 --- a/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java +++ b/quickstep/src/com/android/quickstep/fallback/RecentsRootView.java @@ -84,6 +84,7 @@ public class RecentsRootView extends BaseDragLayer { } public void dispatchInsets() { + mActivity.getDeviceProfile().updateInsets(mInsets); super.setInsets(mInsets); } } \ No newline at end of file diff --git a/src/com/android/launcher3/LauncherRootView.java b/src/com/android/launcher3/LauncherRootView.java index b1273b64c3..f204c16e28 100644 --- a/src/com/android/launcher3/LauncherRootView.java +++ b/src/com/android/launcher3/LauncherRootView.java @@ -100,6 +100,7 @@ public class LauncherRootView extends InsettableFrameLayout { } public void dispatchInsets() { + mLauncher.getDeviceProfile().updateInsets(mInsets); super.setInsets(mInsets); } From 6e3591469a62de14cb1d2d980a8781cec21e6a9c Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 11 Apr 2018 16:58:10 -0700 Subject: [PATCH 023/257] Don't allow swiping down from overview in fallback recents Bug: 77921295 Change-Id: I5a374bed865f03a715cb852e99c86c6e2e119273 --- .../launcher3/uioverrides/PortraitStatesTouchController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java index 012b545212..9f21a950f7 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java @@ -131,7 +131,9 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr directionsToDetectScroll = SwipeDetector.DIRECTION_POSITIVE; mStartContainerType = ContainerType.HOTSEAT; } else if (mLauncher.isInState(OVERVIEW)) { - directionsToDetectScroll = SwipeDetector.DIRECTION_BOTH; + boolean canSwipeDownFromOverview = getTargetState(OVERVIEW, false) != OVERVIEW; + directionsToDetectScroll = canSwipeDownFromOverview ? SwipeDetector.DIRECTION_BOTH + : SwipeDetector.DIRECTION_POSITIVE; mStartContainerType = ContainerType.TASKSWITCHER; } else { return 0; From 23972338ac3005a110eed1b12ada0cb3908e49b7 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 11 Apr 2018 16:44:23 -0700 Subject: [PATCH 024/257] Rename LandscapeStatesTouchController -> OverviewToAllAppsTouchController I find this less confusing, as the controller is also used in portrait mode when swipe down is disabled. Change-Id: Ifd6b4453a1b59e1f8305c1461d89ed99de2fe7d6 --- ...roller.java => OverviewToAllAppsTouchController.java} | 9 ++++++--- .../src/com/android/launcher3/uioverrides/UiFactory.java | 5 ++--- 2 files changed, 8 insertions(+), 6 deletions(-) rename quickstep/src/com/android/launcher3/uioverrides/{LandscapeStatesTouchController.java => OverviewToAllAppsTouchController.java} (89%) diff --git a/quickstep/src/com/android/launcher3/uioverrides/LandscapeStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewToAllAppsTouchController.java similarity index 89% rename from quickstep/src/com/android/launcher3/uioverrides/LandscapeStatesTouchController.java rename to quickstep/src/com/android/launcher3/uioverrides/OverviewToAllAppsTouchController.java index 30ceb43f93..e7816be3a3 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/LandscapeStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewToAllAppsTouchController.java @@ -28,11 +28,13 @@ import com.android.quickstep.TouchInteractionService; import com.android.quickstep.views.RecentsView; /** - * Touch controller from going from OVERVIEW to ALL_APPS + * Touch controller from going from OVERVIEW to ALL_APPS. + * + * This is used in landscape mode. It is also used in portrait mode for the fallback recents. */ -public class LandscapeStatesTouchController extends PortraitStatesTouchController { +public class OverviewToAllAppsTouchController extends PortraitStatesTouchController { - public LandscapeStatesTouchController(Launcher l) { + public OverviewToAllAppsTouchController(Launcher l) { super(l); } @@ -69,4 +71,5 @@ public class LandscapeStatesTouchController extends PortraitStatesTouchControlle } return fromState; } + } diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index a10583cf86..2744bbc99b 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -21,7 +21,6 @@ import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.LauncherState.ALL_APPS; import android.content.Context; -import android.content.SharedPreferences; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; @@ -42,13 +41,13 @@ public class UiFactory { if (!swipeUpEnabled) { return new TouchController[] { launcher.getDragController(), - new LandscapeStatesTouchController(launcher), + new OverviewToAllAppsTouchController(launcher), new LauncherTaskViewcontroller(launcher)}; } if (launcher.getDeviceProfile().isVerticalBarLayout()) { return new TouchController[] { launcher.getDragController(), - new LandscapeStatesTouchController(launcher), + new OverviewToAllAppsTouchController(launcher), new LandscapeEdgeSwipeController(launcher), new LauncherTaskViewcontroller(launcher)}; } else { From 7eff40ff2df3acea49aeba04dc78322a2b4b6208 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 11 Apr 2018 15:30:46 -0700 Subject: [PATCH 025/257] Several app transition fixes: > If launcher already started, creating the state transition only after threshold crossed, so that previous animations are not cancelled > Not posting animaiton callbacks at the front of the queue, as that sometimes causes it get executed before onNewIntent > Farking the activity as forceInvisible while launching an opaque app, so that quickly pressing home/back runs the reverse animation > Not running state animations when force-invisible is true Bug: 77830325 Bug: 77898806 Change-Id: I50a7e915ca35fd6aeb284c8f321ecca74396fe98 --- .../launcher3/LauncherAnimationRunner.java | 8 +- .../LauncherAppTransitionManagerImpl.java | 88 +++++++++++-------- .../WindowTransformSwipeHandler.java | 35 +++++--- src/com/android/launcher3/BaseActivity.java | 33 +++++-- .../launcher3/LauncherStateManager.java | 2 +- 5 files changed, 104 insertions(+), 62 deletions(-) diff --git a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java index f91933979e..cd673000d9 100644 --- a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java +++ b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java @@ -15,9 +15,6 @@ */ package com.android.launcher3; -import static com.android.systemui.shared.recents.utilities.Utilities - .postAtFrontOfQueueAsynchronously; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; @@ -49,7 +46,7 @@ public abstract class LauncherAnimationRunner extends AnimatorListenerAdapter @BinderThread @Override public void onAnimationStart(RemoteAnimationTargetCompat[] targetCompats, Runnable runnable) { - postAtFrontOfQueueAsynchronously(mHandler, () -> { + mHandler.post(() -> { // Finish any previous animation finishSystemAnimation(); @@ -68,7 +65,6 @@ public abstract class LauncherAnimationRunner extends AnimatorListenerAdapter }); } - @UiThread public abstract AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats); @@ -87,7 +83,7 @@ public abstract class LauncherAnimationRunner extends AnimatorListenerAdapter @BinderThread @Override public void onAnimationCancelled() { - postAtFrontOfQueueAsynchronously(mHandler, () -> { + mHandler.post(() -> { if (mAnimator != null) { mAnimator.removeListener(this); mAnimator.end(); diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 162035233d..299e7d51c1 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -16,6 +16,8 @@ package com.android.launcher3; +import static com.android.launcher3.BaseActivity.INVISIBLE_ALL; +import static com.android.launcher3.BaseActivity.INVISIBLE_BY_APP_TRANSITIONS; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; @@ -119,6 +121,18 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag } }; + private final AnimatorListenerAdapter mForceInvisibleListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mLauncher.addForceInvisibleFlag(INVISIBLE_BY_APP_TRANSITIONS); + } + + @Override + public void onAnimationEnd(Animator animation) { + mLauncher.clearForceInvisibleFlag(INVISIBLE_BY_APP_TRANSITIONS); + } + }; + public LauncherAppTransitionManagerImpl(Context context) { mLauncher = Launcher.getLauncher(context); mDragLayer = mLauncher.getDragLayer(); @@ -126,7 +140,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag mIsRtl = Utilities.isRtl(mLauncher.getResources()); mDeviceProfile = mLauncher.getDeviceProfile(); - Resources res = mLauncher.getResources(); mContentTransY = res.getDimensionPixelSize(R.dimen.content_trans_y); mWorkspaceTransY = res.getDimensionPixelSize(R.dimen.workspace_trans_y); @@ -147,38 +160,40 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag @Override public ActivityOptions getActivityLaunchOptions(Launcher launcher, View v) { if (hasControlRemoteAppTransitionPermission()) { - try { - RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mHandler) { + RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mHandler) { - @Override - public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { - AnimatorSet anim = new AnimatorSet(); + @Override + public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { + AnimatorSet anim = new AnimatorSet(); + boolean launcherClosing = + launcherIsATargetWithMode(targetCompats, MODE_CLOSING); - if (!composeRecentsLaunchAnimator(v, targetCompats, anim)) { - // Set the state animation first so that any state listeners are called - // before our internal listeners. - mLauncher.getStateManager().setCurrentAnimation(anim); + if (!composeRecentsLaunchAnimator(v, targetCompats, anim)) { + // Set the state animation first so that any state listeners are called + // before our internal listeners. + mLauncher.getStateManager().setCurrentAnimation(anim); - anim.play(getIconAnimator(v)); - if (launcherIsATargetWithMode(targetCompats, MODE_CLOSING)) { - anim.play(getLauncherContentAnimator(false /* show */)); - } - anim.play(getWindowAnimators(v, targetCompats)); + anim.play(getIconAnimator(v)); + if (launcherClosing) { + anim.play(getLauncherContentAnimator(false /* show */)); } - return anim; + anim.play(getWindowAnimators(v, targetCompats)); } - }; - int duration = findTaskViewToLaunch(launcher, v, null) != null - ? RECENTS_LAUNCH_DURATION : APP_LAUNCH_DURATION; - int statusBarTransitionDelay = duration - STATUS_BAR_TRANSITION_DURATION; - return ActivityOptionsCompat.makeRemoteAnimation(new RemoteAnimationAdapterCompat( - runner, duration, statusBarTransitionDelay)); - } catch (NoClassDefFoundError e) { - // Gracefully fall back to default launch options if the user's platform doesn't - // have the latest changes. - } + if (launcherClosing) { + anim.addListener(mForceInvisibleListener); + } + + return anim; + } + }; + + int duration = findTaskViewToLaunch(launcher, v, null) != null + ? RECENTS_LAUNCH_DURATION : APP_LAUNCH_DURATION; + int statusBarTransitionDelay = duration - STATUS_BAR_TRANSITION_DURATION; + return ActivityOptionsCompat.makeRemoteAnimation(new RemoteAnimationAdapterCompat( + runner, duration, statusBarTransitionDelay)); } return getDefaultActivityLaunchOptions(launcher, v); } @@ -521,19 +536,14 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag private void registerRemoteAnimations() { // Unregister this if (hasControlRemoteAppTransitionPermission()) { - try { - RemoteAnimationDefinitionCompat definition = new RemoteAnimationDefinitionCompat(); - definition.addRemoteAnimation(WindowManagerWrapper.TRANSIT_WALLPAPER_OPEN, - WindowManagerWrapper.ACTIVITY_TYPE_STANDARD, - new RemoteAnimationAdapterCompat(getWallpaperOpenRunner(), - CLOSING_TRANSITION_DURATION_MS, 0 /* statusBarTransitionDelay */)); + RemoteAnimationDefinitionCompat definition = new RemoteAnimationDefinitionCompat(); + definition.addRemoteAnimation(WindowManagerWrapper.TRANSIT_WALLPAPER_OPEN, + WindowManagerWrapper.ACTIVITY_TYPE_STANDARD, + new RemoteAnimationAdapterCompat(getWallpaperOpenRunner(), + CLOSING_TRANSITION_DURATION_MS, 0 /* statusBarTransitionDelay */)); -// TODO: App controlled transition for unlock to home TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER - - new ActivityCompat(mLauncher).registerRemoteAnimations(definition); - } catch (NoClassDefFoundError e) { - // Gracefully fall back if the user's platform doesn't have the latest changes - } + // TODO: Transition for unlock to home TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER + new ActivityCompat(mLauncher).registerRemoteAnimations(definition); } } @@ -575,7 +585,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag } } - mLauncher.setForceInvisible(false); + mLauncher.clearForceInvisibleFlag(INVISIBLE_ALL); return anim; } }; diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 1255a02514..ce16adf93b 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -15,6 +15,7 @@ */ package com.android.quickstep; +import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER; import static com.android.launcher3.anim.Interpolators.ACCEL_2; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_START_DURATION; @@ -38,6 +39,7 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.SystemClock; +import android.support.annotation.AnyThread; import android.support.annotation.UiThread; import android.support.annotation.WorkerThread; import android.util.Log; @@ -46,6 +48,7 @@ import android.view.ViewTreeObserver.OnDrawListener; import android.view.animation.Interpolator; import com.android.launcher3.AbstractFloatingView; +import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherAppState; @@ -208,7 +211,7 @@ public class WindowTransformSwipeHandler { mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN, this::launcherFrameDrawn); mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_GESTURE_STARTED, - this::notifyGestureStarted); + this::onGestureStartedWithLauncher); mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_STARTED | STATE_GESTURE_CANCELLED, this::resetStateForAnimationCancel); @@ -290,7 +293,11 @@ public class WindowTransformSwipeHandler { mActivity = activity; // Override the visibility of the activity until the gesture actually starts and we swipe // up, or until we transition home and the home animation is composed - mActivity.setForceInvisible(true); + if (alreadyOnHome) { + mActivity.clearForceInvisibleFlag(INVISIBLE_BY_STATE_HANDLER); + } else { + mActivity.addForceInvisibleFlag(INVISIBLE_BY_STATE_HANDLER); + } mRecentsView = activity.getOverviewPanel(); mQuickScrubController = mRecentsView.getQuickScrubController(); @@ -317,11 +324,6 @@ public class WindowTransformSwipeHandler { AbstractFloatingView.closeAllOpenViews(activity, mWasLauncherAlreadyVisible); if (mWasLauncherAlreadyVisible) { - mLauncherTransitionController = mActivityControlHelper - .createControllerForVisibleActivity(activity); - mLauncherTransitionController.dispatchOnStart(); - mLauncherTransitionController.setPlayFraction(mCurrentShift.value); - mStateCallback.setState(STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_LAUNCHER_DRAWN); } else { TraceHelper.beginSection("WTS-init"); @@ -420,6 +422,7 @@ public class WindowTransformSwipeHandler { if (!mWasLauncherAlreadyVisible) { mLauncherTransitionController = mActivityControlHelper .createControllerForHiddenActivity(mActivity, mTransitionDragLength); + mLauncherTransitionController.dispatchOnStart(); mLauncherTransitionController.setPlayFraction(mCurrentShift.value); } } @@ -515,7 +518,7 @@ public class WindowTransformSwipeHandler { } public void onGestureStarted() { - notifyGestureStarted(); + notifyGestureStartedAsync(); setStateOnUiThread(STATE_GESTURE_STARTED); mGestureStarted = true; mRecentsAnimationWrapper.enableInputConsumer(); @@ -527,17 +530,29 @@ public class WindowTransformSwipeHandler { * Notifies the launcher that the swipe gesture has started. This can be called multiple times * on both background and UI threads */ - private void notifyGestureStarted() { + @AnyThread + private void notifyGestureStartedAsync() { final T curActivity = mActivity; if (curActivity != null) { // Once the gesture starts, we can no longer transition home through the button, so // reset the force override of the activity visibility - mActivity.setForceInvisible(false); + mActivity.clearForceInvisibleFlag(INVISIBLE_BY_STATE_HANDLER); mActivityControlHelper.onQuickstepGestureStarted( curActivity, mWasLauncherAlreadyVisible); } } + private void onGestureStartedWithLauncher() { + notifyGestureStartedAsync(); + + if (mWasLauncherAlreadyVisible) { + mLauncherTransitionController = mActivityControlHelper + .createControllerForVisibleActivity(mActivity); + mLauncherTransitionController.dispatchOnStart(); + mLauncherTransitionController.setPlayFraction(mCurrentShift.value); + } + } + @WorkerThread public void onGestureEnded(float endVelocity) { Resources res = mContext.getResources(); diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index c15cde5f94..1f1ef9ad7f 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -16,12 +16,15 @@ package com.android.launcher3; +import static java.lang.annotation.RetentionPolicy.SOURCE; + import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Point; +import android.support.annotation.IntDef; import android.view.Display; import android.view.View.AccessibilityDelegate; @@ -29,10 +32,22 @@ import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.util.SystemUiController; +import java.lang.annotation.Retention; import java.util.ArrayList; public abstract class BaseActivity extends Activity { + public static final int INVISIBLE_BY_STATE_HANDLER = 1 << 0; + public static final int INVISIBLE_BY_APP_TRANSITIONS = 1 << 1; + public static final int INVISIBLE_ALL = + INVISIBLE_BY_STATE_HANDLER | INVISIBLE_BY_APP_TRANSITIONS; + + @Retention(SOURCE) + @IntDef( + flag = true, + value = {INVISIBLE_BY_STATE_HANDLER, INVISIBLE_BY_APP_TRANSITIONS}) + public @interface InvisibilityFlags{} + private final ArrayList mDPChangeListeners = new ArrayList<>(); private final ArrayList mMultiWindowModeChangedListeners = new ArrayList<>(); @@ -42,10 +57,11 @@ public abstract class BaseActivity extends Activity { protected SystemUiController mSystemUiController; private boolean mStarted; + private boolean mUserActive; + // When the recents animation is running, the visibility of the Launcher is managed by the // animation - private boolean mForceInvisible; - private boolean mUserActive; + @InvisibilityFlags private int mForceInvisible; public DeviceProfile getDeviceProfile() { return mDeviceProfile; @@ -114,7 +130,7 @@ public abstract class BaseActivity extends Activity { @Override protected void onStop() { mStarted = false; - mForceInvisible = false; + mForceInvisible = 0; super.onStop(); } @@ -153,15 +169,20 @@ public abstract class BaseActivity extends Activity { * recents animation. * @see LauncherAppTransitionManagerImpl.getWallpaperOpenRunner() */ - public void setForceInvisible(boolean invisible) { - mForceInvisible = invisible; + public void addForceInvisibleFlag(@InvisibilityFlags int flag) { + mForceInvisible |= flag; } + public void clearForceInvisibleFlag(@InvisibilityFlags int flag) { + mForceInvisible &= ~flag; + } + + /** * @return Wether this activity should be considered invisible regardless of actual visibility. */ public boolean isForceInvisible() { - return mForceInvisible; + return mForceInvisible != 0; } /** diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index d5e6a9ddde..01166a15db 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -121,7 +121,7 @@ public class LauncherStateManager { * @see #goToState(LauncherState, boolean, Runnable) */ public void goToState(LauncherState state) { - goToState(state, mLauncher.isStarted() /* animated */, 0, null); + goToState(state, !mLauncher.isForceInvisible() && mLauncher.isStarted() /* animated */); } /** From 6c4eced65de09441aac6d120e4eab9c4c4c827b9 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 11 Apr 2018 17:16:44 -0700 Subject: [PATCH 026/257] Don't allow swiping down on task to launch when swipe up is disabled Bug: 77921295 Change-Id: I6800f81a5f3edcbed2db1138375f78c5900c6cd4 --- .../uioverrides/TaskViewTouchController.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java index 4c9fd5ae38..5765256290 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/TaskViewTouchController.java @@ -33,6 +33,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.util.PendingAnimation; import com.android.launcher3.util.TouchController; import com.android.launcher3.views.BaseDragLayer; +import com.android.quickstep.OverviewInteractionState; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; @@ -117,11 +118,18 @@ public abstract class TaskViewTouchController TaskView view = mRecentsView.getPageAt(i); if (mRecentsView.isTaskViewVisible(view) && mActivity.getDragLayer() .isEventOverView(view, ev)) { - // The task can be dragged up to dismiss it, - // and down to open if it's the current page. mTaskBeingDragged = view; - directionsToDetectScroll = i == mRecentsView.getCurrentPage() - ? SwipeDetector.DIRECTION_BOTH : SwipeDetector.DIRECTION_POSITIVE; + if (!OverviewInteractionState.getInstance(mActivity) + .isSwipeUpGestureEnabled()) { + // Don't allow swipe down to open if we don't support swipe up + // to enter overview. + directionsToDetectScroll = SwipeDetector.DIRECTION_POSITIVE; + } else { + // The task can be dragged up to dismiss it, + // and down to open if it's the current page. + directionsToDetectScroll = i == mRecentsView.getCurrentPage() + ? SwipeDetector.DIRECTION_BOTH : SwipeDetector.DIRECTION_POSITIVE; + } break; } } From a006830f0a8af9d67d42ebb27785a0de1b023563 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 11 Apr 2018 16:16:11 -0700 Subject: [PATCH 027/257] Listen for cases where touch controllers change, and update them Otherwise we'd be stuck using the old touch controllers until DragLayer is setup again (e.g. launcher is killed). Bug: 77921826 Change-Id: I8aac6fc453839902cb2d99279a6bd1549ee17d79 --- .../com/android/launcher3/uioverrides/UiFactory.java | 7 +++++-- .../android/quickstep/OverviewInteractionState.java | 10 +++++++++- src/com/android/launcher3/Launcher.java | 8 +++++--- .../com/android/launcher3/uioverrides/UiFactory.java | 4 ++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index a10583cf86..9507a366b3 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -16,12 +16,11 @@ package com.android.launcher3.uioverrides; +import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; -import static com.android.launcher3.LauncherState.ALL_APPS; import android.content.Context; -import android.content.SharedPreferences; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; @@ -59,6 +58,10 @@ public class UiFactory { } } + public static void setOnTouchControllersChangedListener(Context context, Runnable listener) { + OverviewInteractionState.getInstance(context).setOnSwipeUpSettingChangedListener(listener); + } + public static StateHandler[] getStateHandler(Launcher launcher) { return new StateHandler[] { launcher.getAllAppsController(), launcher.getWorkspace(), diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index 471262ba6d..0c24e220bc 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -15,7 +15,6 @@ */ package com.android.quickstep; -import static com.android.launcher3.Utilities.getPrefs; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_QUICK_SCRUB; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_SWIPE_UP; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_HIDE_BACK_BUTTON; @@ -86,6 +85,8 @@ public class OverviewInteractionState { private boolean mBackButtonVisible = true; private boolean mSwipeUpEnabled = true; + private Runnable mOnSwipeUpSettingChangedListener; + private OverviewInteractionState(Context context) { mUiHandler = new Handler(this::handleUiMessage); mBgHandler = new Handler(UiThreadHelper.getBackgroundLooper(), this::handleBgMessage); @@ -124,12 +125,19 @@ public class OverviewInteractionState { break; case MSG_SET_SWIPE_UP_ENABLED: mSwipeUpEnabled = msg.arg1 != 0; + if (mOnSwipeUpSettingChangedListener != null) { + mOnSwipeUpSettingChangedListener.run(); + } break; } applyFlags(); return true; } + public void setOnSwipeUpSettingChangedListener(Runnable listener) { + mOnSwipeUpSettingChangedListener = listener; + } + @WorkerThread private void applyFlags() { if (mISystemUiProxy == null) { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 90c55c983a..88408606f5 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -18,7 +18,6 @@ package com.android.launcher3; import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE; - import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; @@ -81,7 +80,6 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragView; -import com.android.launcher3.dynamicui.WallpaperColorInfo; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.folder.FolderIconPreviewVerifier; import com.android.launcher3.keyboard.CustomActionsPopup; @@ -923,7 +921,9 @@ public class Launcher extends BaseDraggingActivity | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); // Setup the drag layer - mDragLayer.setup(mDragController); + Runnable setupDragLayer = () -> mDragLayer.setup(mDragController); + UiFactory.setOnTouchControllersChangedListener(this, setupDragLayer); + setupDragLayer.run(); mWorkspace.setup(mDragController); // Until the workspace is bound, ensure that we keep the wallpaper offset locked to the @@ -1327,6 +1327,8 @@ public class Launcher extends BaseDraggingActivity unregisterReceiver(mReceiver); mWorkspace.removeFolderListeners(); + UiFactory.setOnTouchControllersChangedListener(this, null); + // Stop callbacks from LauncherModel // It's possible to receive onDestroy after a new Launcher activity has // been created. In this case, don't interfere with the new Launcher. diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java b/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java index be9d5b734b..bd1a96e536 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java @@ -16,6 +16,8 @@ package com.android.launcher3.uioverrides; +import android.content.Context; + import com.android.launcher3.Launcher; import com.android.launcher3.LauncherStateManager.StateHandler; import com.android.launcher3.util.TouchController; @@ -27,6 +29,8 @@ public class UiFactory { launcher.getDragController(), new AllAppsSwipeController(launcher)}; } + public static void setOnTouchControllersChangedListener(Context context, Runnable listener) { } + public static StateHandler[] getStateHandler(Launcher launcher) { return new StateHandler[] { launcher.getAllAppsController(), launcher.getWorkspace() }; From fd21de44896b4153f91b7b080d7866af4f98af2f Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Wed, 11 Apr 2018 20:51:43 -0700 Subject: [PATCH 028/257] Move QuickStep onboarding strings from Launcher to SysUI (Pt. Launcher) Bug: 70180942 Test: N/A Change-Id: I05e6ce27630d478a40a52bf59a9dfd25881213be --- quickstep/libs/sysui_shared.jar | Bin 122318 -> 121893 bytes quickstep/res/values/strings.xml | 3 --- .../quickstep/TouchInteractionService.java | 2 -- 3 files changed, 5 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index fec73179cefac7ac364c83db9d6057640b198994..454260ee9950690ee3a8d23bba828b3f66b58b72 100644 GIT binary patch delta 8263 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 HCoum9%aLF$ diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml index 7ba91b3db5..bafa294f42 100644 --- a/quickstep/res/values/strings.xml +++ b/quickstep/res/values/strings.xml @@ -27,9 +27,6 @@ Pin - - Swipe up from the bottom to switch apps - Overview diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 33b922d965..4f0187c47f 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -99,8 +99,6 @@ public class TouchInteractionService extends Service { public void onBind(ISystemUiProxy iSystemUiProxy) { mISystemUiProxy = iSystemUiProxy; mRecentsModel.setSystemUiProxy(mISystemUiProxy); - RemoteRunnable.executeSafely(() -> mISystemUiProxy.setRecentsOnboardingText( - getResources().getString(R.string.recents_swipe_up_onboarding))); mOverviewInteractionState.setSystemUiProxy(mISystemUiProxy); } From d754dcd5d975f840addce3a149fcc33742404c38 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 12 Apr 2018 14:16:42 -0700 Subject: [PATCH 029/257] Only skip the animation, if we are going to the same state Bug: 77487950 Change-Id: I2d3e376094b0fb0d3120ab6c4d6569f52ab8273f --- src/com/android/launcher3/LauncherStateManager.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index 01166a15db..e611af7df7 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -173,7 +173,7 @@ public class LauncherStateManager { onCompleteRunnable.run(); } return; - } else if (!mConfig.userControlled && animated) { + } else if (!mConfig.userControlled && animated && mConfig.mTargetState == state) { // We are running the same animation as requested if (onCompleteRunnable != null) { mConfig.mCurrentAnimation.addListener(new AnimationSuccessListener() { @@ -280,7 +280,7 @@ public class LauncherStateManager { onStateTransitionEnd(state); } }); - mConfig.setAnimation(animation); + mConfig.setAnimation(animation, state); return mConfig.mCurrentAnimation; } @@ -370,7 +370,7 @@ public class LauncherStateManager { if (reapplyNeeded) { reapplyState(); } - mConfig.setAnimation(anim); + mConfig.setAnimation(anim, null); } private class StartAnimRunnable implements Runnable { @@ -401,11 +401,13 @@ public class LauncherStateManager { private PropertySetter mProperSetter; private AnimatorSet mCurrentAnimation; + private LauncherState mTargetState; public void reset() { duration = 0; userControlled = false; mProperSetter = null; + mTargetState = null; if (mCurrentAnimation != null) { mCurrentAnimation.setDuration(0); @@ -429,8 +431,9 @@ public class LauncherStateManager { } } - public void setAnimation(AnimatorSet animation) { + public void setAnimation(AnimatorSet animation, LauncherState targetState) { mCurrentAnimation = animation; + mTargetState = targetState; mCurrentAnimation.addListener(this); } } From 2dcb4f66980856dddc1b5e2cd538025217adda68 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Thu, 12 Apr 2018 15:28:36 -0700 Subject: [PATCH 030/257] Take padding/insets into account to center empty recents message Bug: 77930613 Change-Id: I31afbc6182d45809eb1caa0f5162cbbce48d1c01 --- .../src/com/android/quickstep/views/RecentsView.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index d214b13f43..8f82ad11e2 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -79,7 +79,6 @@ import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; -import java.util.function.Consumer; /** * A list of recent tasks. @@ -948,8 +947,13 @@ public abstract class RecentsView protected void maybeDrawEmptyMessage(Canvas canvas) { if (mShowEmptyMessage && mEmptyTextLayout != null) { - mEmptyIcon.draw(canvas); + // Offset to center in the visible (non-padded) part of RecentsView + mTempRect.set(mInsets.left + getPaddingLeft(), mInsets.top + getPaddingTop(), + mInsets.right + getPaddingRight(), mInsets.bottom + getPaddingBottom()); canvas.save(); + canvas.translate((mTempRect.left - mTempRect.right) / 2, + (mTempRect.top - mTempRect.bottom) / 2); + mEmptyIcon.draw(canvas); canvas.translate(mEmptyMessagePadding, mEmptyIcon.getBounds().bottom + mEmptyMessagePadding); mEmptyTextLayout.draw(canvas); From df1eb8bb86cbf3eddba54f9f78718ab6e5734185 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Thu, 12 Apr 2018 17:26:18 -0700 Subject: [PATCH 031/257] Don't show back button when discovery bounce is playing Bug: 74766552 Change-Id: Ib3b514f4a2bfaa8593b82cd5acb16f02dd09dcc7 --- .../com/android/launcher3/uioverrides/UiFactory.java | 5 ++++- src/com/android/launcher3/AbstractFloatingView.java | 10 +++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index 9507a366b3..a180456de0 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -16,6 +16,8 @@ package com.android.launcher3.uioverrides; +import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; +import static com.android.launcher3.AbstractFloatingView.TYPE_HIDE_BACK_BUTTON; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; @@ -74,7 +76,8 @@ public class UiFactory { && launcher.hasWindowFocus(); if (shouldBackButtonBeHidden) { // Show the back button if there is a floating view visible. - shouldBackButtonBeHidden = AbstractFloatingView.getTopOpenView(launcher) == null; + shouldBackButtonBeHidden = AbstractFloatingView.getTopOpenViewWithType(launcher, + TYPE_ALL & ~TYPE_HIDE_BACK_BUTTON) == null; } OverviewInteractionState.getInstance(launcher) .setBackButtonVisible(!shouldBackButtonBeHidden); diff --git a/src/com/android/launcher3/AbstractFloatingView.java b/src/com/android/launcher3/AbstractFloatingView.java index b0c5baf6b5..693cf31375 100644 --- a/src/com/android/launcher3/AbstractFloatingView.java +++ b/src/com/android/launcher3/AbstractFloatingView.java @@ -70,6 +70,9 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch public static final int TYPE_REBIND_SAFE = TYPE_WIDGETS_FULL_SHEET | TYPE_QUICKSTEP_PREVIEW | TYPE_ON_BOARD_POPUP; + // Usually we show the back button when a floating view is open. Instead, hide for these types. + public static final int TYPE_HIDE_BACK_BUTTON = TYPE_ON_BOARD_POPUP; + protected boolean mIsOpen; public AbstractFloatingView(Context context, AttributeSet attrs) { @@ -170,6 +173,11 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch } public static AbstractFloatingView getTopOpenView(BaseDraggingActivity activity) { - return getOpenView(activity, TYPE_ALL); + return getTopOpenViewWithType(activity, TYPE_ALL); + } + + public static AbstractFloatingView getTopOpenViewWithType(BaseDraggingActivity activity, + @FloatingViewType int type) { + return getOpenView(activity, type); } } From c7ee6802c588868dcdaadd3c9a2be004d55d7134 Mon Sep 17 00:00:00 2001 From: Mehdi Alizadeh Date: Thu, 12 Apr 2018 19:13:12 -0700 Subject: [PATCH 032/257] Uses definitions in sysui_shared lib for Settings names Also drops a new sysui_shared.jar Bug: 77732469 Test: verifty it builds Change-Id: I080672be4df746ecd3124cc22ccec3ceea3b0742 --- quickstep/libs/sysui_shared.jar | Bin 121893 -> 122453 bytes .../quickstep/OverviewInteractionState.java | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 454260ee9950690ee3a8d23bba828b3f66b58b72..41f5bb8bab5f6aa368c6a47359f5611ba21aa453 100644 GIT binary patch delta 2876 zcmY*bdsvO>7XMb4y?0Ghx}Z%|6Un7bLvo%_GYqD!i!|icM5<|!$n9~Nq!E%-n|W&- zG{aFYjreMRp{q(o=`uT|&hwPRIfL>v55lR=Jm+2SyUnOS`n~U3zqQtHy|-`wqfp*b zBsU9C8yeXN3WY*&%uF-$G@$>#{La83^IGjVpdj{wkDQ_=P3b|V6o9RmWU>GaV)L-y zk)Y`X4-%~fD`KGqGf`>1Lx$coWhcX}4k8$g$rLAi63j5(>6Qu3=epX;DUvC>K&A2a z94B6y5g|iEatNqIZ_mx9$h!7LgfXI0y~h-5l~vBvI9!xz?1F7b@=f?yeDzf~Q`xm# zs~7X0U@iW(;Vo6Dw;@Gg*i)qr!$`={y5Krm0BcoKURBzJbpN z_Zy&$>xoN0LbFmmn>3byk>+GtubxIiOX$+*(*J2h4J^CZMNSyfiMZp`29_*UHxpSO zi_WJjjZp)Z3==co-)@wG2_0deOQKh|D#Zh|#dN>idBIq5A2EAdph6SBp! z%DqV9^0V4a)2qzIJ>F@iX8%i>c(&&vDi(cS7BNoOad{lcol@^8SkLP9f{F~Q z1A9_(4;0d+F)(8&lc?%w`sof3!J5GgQlk^p4P{Bsone6GOVz2!w0kgy_=ST^nl%ZY z+F++87kFib^tBh9MyB+~XHdlUkq+F+h5KMDnaqb~mN;%LHCZ%(QkuLFjxZKxkh&Ma zvcCv)W-T36!+4Y?UH5|oHt+}pe+-chF9mj-G;>{5q{|P+O5?tQX#MS0kpM5cKy#X5 zl=OHtWU~l*8DrT1LV+DJi7H`PSqDGpV6+qz4uq}6w9WVu=wO_*C<=%XR;0`0%i^ie zoQd(?3X9kvX**=GzUd2a6bJOQsfa@>xDbmy@ShJ1BP7qgpvHWJZoYfm((rBDqM{>X z=WX5;vv!**Y~$M4*po|q)rM|1e{VaUTk!4ww7Ub!6L!Z~7Ee5IV$#8tAFb-%^5xEX zqaQk}({ta6vrWbh!XGYfw^mjq$fs&NUWFt+Dwf`o<-&xvZFxZp#$GmmV0Xp(%C4RD zeifxJ-i4g&*rdHW_@-)mLg=;a{&Cg1V>z~kXO^rs^D~L)4*X``!Dme_Ysc#pNs+5# zV*OG(I(jXibbq?u=#{G~*i+e;`MmkN%0Mq=W6r|i{{JNz9`k-NNm&(dcO&R~pO=j- z$J_Ik++H*1e3EZrw_Dgo(>3H=#;DO3dTQqz_oQe0sY^Q!MeUN0HtMkM2(ERr$c*cs z+1?kN>M|hBnmEbVG2_z0pbZx$XDrCMoKa1@CbeM zd14_7>BuQ~!O|+#ddn}TVI@8btPmbx$?F{KV+V|0kZe}*y(&UoGBVHsHj?%-{4S@T zI+7#8-w+>*;7!wz@%iA7xFeswO%#92hbY9r0{T8sEG*#miCS(yp`~{E{Pb%f5%GWo zF^I1v*oe5U5Vj$<6~b1;#W!FV;+-21f%#N7VJBktO~8*XnQ)8e&(Nbu5o|*Kt|Ev= zd|CwGAO;pgC}Msw%|p?ygxeEKIKQt1_M$zu6gFVqu2LQ!PzGCYUQtGMP@Gc^;mA8* z&ik>r&Gj6iLRPwlyRkUx)J5mLE5M_6GKZ$yjRZ~6G z{(Uvi^IDJVYxrDOL)VM?Kd*%_)RSGy`xtST<3U8~f33%`dwiXA_qcst9mnf>bgbw4 zQtIJbjO(w5NW`%F9P94$zGgOX|IZD4Zq^8K$UD{u@rc8kU^ilN6W7<@#QP0zru#|l z51aWqF8!6q7yruhP1M15^k?a~E{hgEPi%o$v=6lKeTaTQ&j+19dBE3iSu4a?I%Fm< z{_u`@kk(dkm+@zhbk>6sLuy*V&S2pI5`PcI6MErBk)C=mbHLzhu0K}>7zx5NQ$g?+ zKKyGKxj3iisf19g=xp&Y%3@=f>3HD2y=$;opb->vlqk8JVXc)+Fb-8ynsp<{tt{M9Blvq delta 2407 zcmZ8jdr;I>6uxH>*hL@^R91u~L30WgYVs8bs5zP|2tEeMP#RM+MGR6*EkYW@G;>+= zP7(uZmX49aZ{Q-YU7m_BSX@9>EVP=6wA6I6a-8nDmuLL3-#y>&JKsI$-22<5y~_D` zxwC7W!C{0qQLEKNpI~$iSMkqR-shji%|XC{9?1cHuICt2rpA%l8MrDhs~$S>2PUI- znn~m7retd3oq4RZdE6aHpkd|UtGIdXLZxEVelIXBKtYA_%!K6vvjQtM7)OTqpaTuw z26|I;co6-h0@O;$iz_jU?pq0ZB|1FS1*OGv*E%9<4LdM4SsJFA0!}(n{~CCTF0O)6 z%Ad=A6Xrb$WrO8-)PNr~RD+9hC-HYzbj7wPr**WZns4^Px^xxNH&Y}%QTb>6iqXiN zQ2}n@qR`AhG&Jd2Wc>I86_!%6d&x+owT1}VYz7b05#tX-Wlg!gBX}&Fl^%M~fd|Ug zybZ$ZfK7PO0t<{(^!Zh2IJjf*F+nK3Ck&WnDxMobuhqc><+E?XM33i+vc2$uQHwUt zw4$C5Ag?x1>|trxDFz@KD73reHoDW(4dA5YHtkho5xSOa(R06m?q~#W<&pIevdRIQ z9no~awm>QCED>wIk5Xu_^+Y}^aH{Ep`%X&1?UUj}7Tm8Anw|vYbxP91=%KMG>7iPA z{8y)FWNV(#aL!qI{&6{S*mX?lbl8eXj0cBtAz1dgBXkO{$PmnPWJPMYg_|;?JNO74 zKes8Y$D=O`Bg&((?7SBQ^^d=gddUaY4dh7GALHN+LGfGBr#j*XGykUw4uBL4v4CU{SBUXSgrO|{VmtV< zrE7qSVT7f^G`Q}7mJU#K%r=yzwmo;!7r1Z zhIN33-Q5n3qR@VZa>k8??*s$74pd9S?J$lV-33uX&D%QE&ASTy5H^e5`9Z4jyM>)H z!fY`oc_)nELv`K!JZ2vRJH7>YRy3JDOe!GZ4Qmg=oaPrLYKbRvDxsmXyJIL_fx_9LH=X`3Fq$tI8$c zSPr}KdCXbZjA%X!8xcb);2p$c6_AEFwi31>8Y^Kf;@_2!ftXeW_$^NFS4scX)e>#h zkb?Z28rX!W)WDmFer8BU%rr}%pUskww@AIk0z2_}WG!q!JXI_6ee2+DjQ7{cI@I;B z2IJIv*^j+m*0ZER>gyY%Z%Ctz^Bbj~OOwQmCYg7uN%p<;9PB_p>p9s^{CSDi^Rk{r z&C;T?NJqY@Q=Y?&Yw~`az9#4QbeF_OT`-=W?t;lQ!VVJy z^a=YG7Ka>dh#Nu3uP%f{lc9gEyJ(gjV$s)Xhw-WlyD^TScXB`z9A^NPH|hVEVc)|2 zA0HzWcuD-#aJUL2>yI>-%IRT?-@(u8o z&Oe5S&g5*N0llwq68hd)hktF(gqTMWGIN-I#i;?k6HO@sZyNO-sNIuD O64^4Dki!bEpZo_=93Y?o diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index 0c24e220bc..89236085eb 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -19,6 +19,7 @@ import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABL import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_SWIPE_UP; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_HIDE_BACK_BUTTON; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON; +import static com.android.systemui.shared.system.SettingsCompat.SWIPE_UP_SETTING_NAME; import android.content.ContentResolver; import android.content.Context; @@ -74,7 +75,6 @@ public class OverviewInteractionState { private static final int MSG_SET_BACK_BUTTON_VISIBLE = 201; private static final int MSG_SET_SWIPE_UP_ENABLED = 202; - private static final String SWIPE_UP_SETTING_NAME = "swipe_up_to_switch_apps_enabled"; private final SwipeUpGestureEnabledSettingObserver mSwipeUpSettingObserver; private final Handler mUiHandler; From f3dbad134b4bc2958b84d90bc1ae9376d656c348 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 13 Apr 2018 09:18:19 -0700 Subject: [PATCH 033/257] Fixing wrong cliping height when screenshot is rotated Bug: 77979532 Change-Id: I41aa5dc85a035e7936861412f3d77e22143eaf81 --- .../src/com/android/quickstep/views/TaskThumbnailView.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index 58b7db7b22..326eb9f093 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -167,9 +167,9 @@ public class TaskThumbnailView extends View { if (mBitmapShader != null && mThumbnailData != null) { float scale = mThumbnailData.scale; Rect thumbnailInsets = mThumbnailData.insets; - float thumbnailWidth = mThumbnailData.thumbnail.getWidth() - + final float thumbnailWidth = mThumbnailData.thumbnail.getWidth() - (thumbnailInsets.left + thumbnailInsets.right) * scale; - float thumbnailHeight = mThumbnailData.thumbnail.getHeight() - + final float thumbnailHeight = mThumbnailData.thumbnail.getHeight() - (thumbnailInsets.top + thumbnailInsets.bottom) * scale; final float thumbnailScale; @@ -216,7 +216,8 @@ public class TaskThumbnailView extends View { mMatrix.postScale(thumbnailScale, thumbnailScale); mBitmapShader.setLocalMatrix(mMatrix); - float bitmapHeight = Math.max(thumbnailHeight * thumbnailScale, 0); + float bitmapHeight = Math.max((rotate ? thumbnailWidth : thumbnailHeight) + * thumbnailScale, 0); if (Math.round(bitmapHeight) < getMeasuredHeight()) { mClipBottom = bitmapHeight; } From 3ee9f57eb6900bda3a17c1632075a34252b3dc9f Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 13 Apr 2018 10:33:31 -0700 Subject: [PATCH 034/257] Close out of recents when clicking it if it's empty Bug: 77977813 Change-Id: Iadc95e47c68ed54b6f98bb053a543c0b240117c2 --- quickstep/src/com/android/quickstep/views/RecentsView.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index d214b13f43..dfaa94b2f8 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -79,7 +79,6 @@ import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; -import java.util.function.Consumer; /** * A list of recent tasks. @@ -324,6 +323,9 @@ public abstract class RecentsView @Override public boolean onTouchEvent(MotionEvent ev) { super.onTouchEvent(ev); + if (ev.getAction() == MotionEvent.ACTION_UP && mShowEmptyMessage) { + onAllTasksRemoved(); + } // Do not let touch escape to siblings below this view. return true; } From a6f5869d8f75baeef70ae8509a812b6778a60879 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 13 Apr 2018 10:57:09 -0700 Subject: [PATCH 035/257] Ignore null notifications There seems to be an edge case where we can get a null notification in onNotificationRemoved(); there's nothing actionable about that, so just ignore it to prevent NPE. Also add null check to onNotificationPosted() for good measure. Bug: 69140873 Change-Id: I3586bf435d05aee38b99dffd3d01315b433e8476 --- .../launcher3/notification/NotificationListener.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/com/android/launcher3/notification/NotificationListener.java b/src/com/android/launcher3/notification/NotificationListener.java index 1fd70780bd..117287ba7b 100644 --- a/src/com/android/launcher3/notification/NotificationListener.java +++ b/src/com/android/launcher3/notification/NotificationListener.java @@ -219,6 +219,10 @@ public class NotificationListener extends NotificationListenerService { @Override public void onNotificationPosted(final StatusBarNotification sbn) { super.onNotificationPosted(sbn); + if (sbn == null) { + // There is a bug in platform where we can get a null notification; just ignore it. + return; + } mWorkerHandler.obtainMessage(MSG_NOTIFICATION_POSTED, new NotificationPostedMsg(sbn)) .sendToTarget(); if (sStatusBarNotificationsChangedListener != null) { @@ -244,6 +248,10 @@ public class NotificationListener extends NotificationListenerService { @Override public void onNotificationRemoved(final StatusBarNotification sbn) { super.onNotificationRemoved(sbn); + if (sbn == null) { + // There is a bug in platform where we can get a null notification; just ignore it. + return; + } Pair packageUserKeyAndNotificationKey = new Pair<>(PackageUserKey.fromNotification(sbn), NotificationKeyData.fromNotification(sbn)); From f009493dd46787037a81b91c9be1169ced478fd3 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 13 Apr 2018 11:10:18 -0700 Subject: [PATCH 036/257] Close floating views when entering overview Bug: 77995763 Change-Id: I9554b3d4925e208472de06d9e754d0aee369d75b --- .../android/launcher3/uioverrides/FastOverviewState.java | 6 ------ .../com/android/launcher3/uioverrides/OverviewState.java | 2 ++ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java index f98f7a5ffa..496fa96b36 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java @@ -15,7 +15,6 @@ */ package com.android.launcher3.uioverrides; -import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.quickstep.QuickScrubController; import com.android.quickstep.views.RecentsView; @@ -39,11 +38,6 @@ public class FastOverviewState extends OverviewState { recentsView.getQuickScrubController().onFinishedTransitionToQuickScrub(); } - public void onStateEnabled(Launcher launcher) { - super.onStateEnabled(launcher); - AbstractFloatingView.closeAllOpenViews(launcher); - } - @Override public int getVisibleElements(Launcher launcher) { return NONE; diff --git a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java index 9c7db3093a..026f059f76 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java @@ -21,6 +21,7 @@ import static com.android.launcher3.states.RotationHelper.REQUEST_ROTATE; import android.view.View; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; @@ -58,6 +59,7 @@ public class OverviewState extends LauncherState { public void onStateEnabled(Launcher launcher) { RecentsView rv = launcher.getOverviewPanel(); rv.setOverviewStateEnabled(true); + AbstractFloatingView.closeAllOpenViews(launcher); } @Override From 9162f8187c3a1f9dfe6fecaf248121eb9cc6fd78 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 13 Apr 2018 10:29:20 -0700 Subject: [PATCH 037/257] Better handling transparent activities > Only hiding the task associated with the current task, instead of hiding all tasks > Maintaining a state for hidden task so that it does not get reset when alpha is changed due to some other reason. Bug: 77830202 Change-Id: I202e99b153c6f9e3a8d9c68d6844672b3bff41e9 --- quickstep/libs/sysui_shared.jar | Bin 122453 -> 122460 bytes .../quickstep/OtherActivityTouchConsumer.java | 7 +- .../quickstep/OverviewCommandHelper.java | 23 ++-- .../quickstep/RecentsAnimationWrapper.java | 8 +- .../WindowTransformSwipeHandler.java | 102 +++++++++--------- .../quickstep/util/ClipAnimationHelper.java | 24 ++--- .../util/RemoteAnimationTargetSet.java | 55 ++++++++++ .../android/quickstep/views/RecentsView.java | 47 +++++--- 8 files changed, 164 insertions(+), 102 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 41f5bb8bab5f6aa368c6a47359f5611ba21aa453..8e2f2f1fc0f5b48660585b761f2de3b3a2a32edf 100644 GIT binary patch delta 3727 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 delta 3626 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 aZ_27)^3}@1$U&iuIXwnNR!A9;8UF{ms=r { - clipHelper.applyTransform(targetCompats, (float) v.getAnimatedValue()); - }); + valueAnimator.addUpdateListener((v) -> + clipHelper.applyTransform(targetSet, (float) v.getAnimatedValue())); anim.play(valueAnimator); return anim; } diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java b/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java index 12f8d52b82..ebe2311a43 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java @@ -16,9 +16,9 @@ package com.android.quickstep; import com.android.launcher3.util.TraceHelper; +import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.systemui.shared.system.BackgroundExecutor; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; -import com.android.systemui.shared.system.RemoteAnimationTargetCompat; /** * Wrapper around RecentsAnimationController to help with some synchronization @@ -26,17 +26,17 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat; public class RecentsAnimationWrapper { public RecentsAnimationControllerCompat controller; - public RemoteAnimationTargetCompat[] targets; + public RemoteAnimationTargetSet targetSet; private boolean mInputConsumerEnabled = false; private boolean mBehindSystemBars = true; private boolean mSplitScreenMinimized = false; public synchronized void setController( - RecentsAnimationControllerCompat controller, RemoteAnimationTargetCompat[] targets) { + RecentsAnimationControllerCompat controller, RemoteAnimationTargetSet targetSet) { TraceHelper.partitionSection("RecentsController", "Set controller " + controller); this.controller = controller; - this.targets = targets; + this.targetSet = targetSet; if (mInputConsumerEnabled) { enableInputConsumer(); diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index ce16adf93b..27095239d1 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -24,7 +24,6 @@ import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB; import static com.android.systemui.shared.recents.utilities.Utilities .postAtFrontOfQueueAsynchronously; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; -import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; import android.animation.Animator; import android.animation.ObjectAnimator; @@ -48,9 +47,9 @@ import android.view.ViewTreeObserver.OnDrawListener; import android.view.animation.Interpolator; import com.android.launcher3.AbstractFloatingView; -import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.DeviceProfile; +import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.R; @@ -67,6 +66,7 @@ import com.android.quickstep.ActivityControlHelper.ActivityInitListener; import com.android.quickstep.ActivityControlHelper.LayoutListener; import com.android.quickstep.TouchConsumer.InteractionType; import com.android.quickstep.util.ClipAnimationHelper; +import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.util.SysuiEventLogger; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; @@ -76,7 +76,6 @@ import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.LatencyTrackerCompat; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; -import com.android.systemui.shared.system.TransactionCompat; import com.android.systemui.shared.system.WindowCallbacksCompat; import com.android.systemui.shared.system.WindowManagerWrapper; @@ -347,6 +346,7 @@ public class WindowTransformSwipeHandler { } mRecentsView.showTask(mRunningTaskId); + mRecentsView.setRunningTaskHidden(true); mRecentsView.setFirstTaskIconScaledDown(true /* isScaledDown */, false /* animate */); mLayoutListener.open(); mStateCallback.setState(STATE_LAUNCHER_STARTED); @@ -436,7 +436,8 @@ public class WindowTransformSwipeHandler { Interpolator interpolator = mInteractionType == INTERACTION_QUICK_SCRUB ? ACCEL_2 : LINEAR; float interpolated = interpolator.getInterpolation(shift); - mClipAnimationHelper.applyTransform(mRecentsAnimationWrapper.targets, interpolated); + mClipAnimationHelper.applyTransform( + mRecentsAnimationWrapper.targetSet, interpolated); } } @@ -478,36 +479,37 @@ public class WindowTransformSwipeHandler { } public void onRecentsAnimationStart(RecentsAnimationControllerCompat controller, - RemoteAnimationTargetCompat[] apps, Rect homeContentInsets, Rect minimizedHomeBounds) { - if (apps != null) { - // Use the top closing app to determine the insets for the animation - for (RemoteAnimationTargetCompat target : apps) { - if (target.mode == MODE_CLOSING) { - DeviceProfile dp = LauncherAppState.getIDP(mContext).getDeviceProfile(mContext); - final Rect overviewStackBounds; + RemoteAnimationTargetSet targets, Rect homeContentInsets, Rect minimizedHomeBounds) { + LauncherAppState appState = LauncherAppState.getInstanceNoCreate(); + InvariantDeviceProfile idp = appState == null ? + new InvariantDeviceProfile(mContext) : appState.getInvariantDeviceProfile(); + DeviceProfile dp = idp.getDeviceProfile(mContext); + final Rect overviewStackBounds; + RemoteAnimationTargetCompat runningTaskTarget = targets.findTask(mRunningTaskId); - if (minimizedHomeBounds != null) { - overviewStackBounds = mActivityControlHelper - .getOverviewWindowBounds(minimizedHomeBounds, target); - dp = dp.getMultiWindowProfile(mContext, - new Point(minimizedHomeBounds.width(), minimizedHomeBounds.height())); - dp.updateInsets(homeContentInsets); - } else { - overviewStackBounds = new Rect(0, 0, dp.widthPx, dp.heightPx); - // TODO: Workaround for an existing issue where the home content insets are - // not valid immediately after rotation, just use the stable insets for now - Rect insets = new Rect(); - WindowManagerWrapper.getInstance().getStableInsets(insets); - dp = dp.copy(mContext); - dp.updateInsets(insets); - } - - mClipAnimationHelper.updateSource(overviewStackBounds, target); - initTransitionEndpoints(dp); - } - } + if (minimizedHomeBounds != null && runningTaskTarget != null) { + overviewStackBounds = mActivityControlHelper + .getOverviewWindowBounds(minimizedHomeBounds, runningTaskTarget); + dp = dp.getMultiWindowProfile(mContext, + new Point(minimizedHomeBounds.width(), minimizedHomeBounds.height())); + dp.updateInsets(homeContentInsets); + } else { + overviewStackBounds = new Rect(0, 0, dp.widthPx, dp.heightPx); + // TODO: Workaround for an existing issue where the home content insets are + // not valid immediately after rotation, just use the stable insets for now + Rect insets = new Rect(); + WindowManagerWrapper.getInstance().getStableInsets(insets); + dp = dp.copy(mContext); + dp.updateInsets(insets); } - mRecentsAnimationWrapper.setController(controller, apps); + + if (runningTaskTarget != null) { + mClipAnimationHelper.updateSource(overviewStackBounds, runningTaskTarget); + } + initTransitionEndpoints(dp); + + + mRecentsAnimationWrapper.setController(controller, targets); setStateOnUiThread(STATE_APP_CONTROLLER_RECEIVED); } @@ -641,6 +643,7 @@ public class WindowTransformSwipeHandler { mLauncherTransitionController = null; mLayoutListener.finish(); + mRecentsView.setRunningTaskHidden(false); mRecentsView.setFirstTaskIconScaledDown(false /* isScaledDown */, false /* animate */); } @@ -666,29 +669,22 @@ public class WindowTransformSwipeHandler { synchronized (mRecentsAnimationWrapper) { if (mRecentsAnimationWrapper.controller != null) { - for (RemoteAnimationTargetCompat app : mRecentsAnimationWrapper.targets) { - if (app.mode == MODE_CLOSING) { - // Update the screenshot of the task - ThumbnailData thumbnail = - mRecentsAnimationWrapper.controller.screenshotTask(app.taskId); - final TaskView taskView = - mRecentsView.updateThumbnail(app.taskId, thumbnail); - if (taskView != null) { - taskView.setAlpha(1); + // Update the screenshot of the task + ThumbnailData thumbnail = + mRecentsAnimationWrapper.controller.screenshotTask(mRunningTaskId); + final TaskView taskView = mRecentsView.updateThumbnail(mRunningTaskId, thumbnail); + mRecentsView.setRunningTaskHidden(false); + if (taskView != null) { + // Defer finishing the animation until the next launcher frame with the + // new thumbnail + finishTransitionPosted = new WindowCallbacksCompat(taskView) { - // Defer finishing the animation until the next launcher frame with the - // new thumbnail - finishTransitionPosted = new WindowCallbacksCompat(taskView) { - - @Override - public void onPostDraw(Canvas canvas) { - finishTransitionRunnable.run(); - detach(); - } - }.attach(); - break; + @Override + public void onPostDraw(Canvas canvas) { + finishTransitionRunnable.run(); + detach(); } - } + }.attach(); } } } diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index 493e9e2386..9276d23810 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -15,8 +15,6 @@ */ package com.android.quickstep.util; -import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; - import android.graphics.Matrix; import android.graphics.Matrix.ScaleToFit; import android.graphics.Rect; @@ -55,10 +53,9 @@ public class ClipAnimationHelper { private final RectFEvaluator mRectFEvaluator = new RectFEvaluator(); private final Matrix mTmpMatrix = new Matrix(); - public void updateSource(Rect homeStackBounds, RemoteAnimationTargetCompat target) { mHomeStackBounds.set(homeStackBounds); - mSourceInsets.set(target.getContentInsets()); + mSourceInsets.set(target.contentInsets); mSourceStackBounds.set(target.sourceContainerBounds); // TODO: Should sourceContainerBounds already have this offset? @@ -91,7 +88,7 @@ public class ClipAnimationHelper { mSourceRect.set(scaledTargetRect); } - public void applyTransform(RemoteAnimationTargetCompat[] targets, float progress) { + public void applyTransform(RemoteAnimationTargetSet targetSet, float progress) { RectF currentRect; synchronized (mTargetRect) { currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTargetRect); @@ -109,17 +106,14 @@ public class ClipAnimationHelper { mTmpMatrix.setRectToRect(mSourceRect, currentRect, ScaleToFit.FILL); TransactionCompat transaction = new TransactionCompat(); - for (RemoteAnimationTargetCompat app : targets) { - if (app.mode == MODE_CLOSING) { - mTmpMatrix.postTranslate(app.position.x, app.position.y); - transaction.setMatrix(app.leash, mTmpMatrix) - .setWindowCrop(app.leash, mClipRect); - if (app.isNotInRecents) { - transaction.setAlpha(app.leash, 1 - progress); - } - - transaction.show(app.leash); + for (RemoteAnimationTargetCompat app : targetSet.apps) { + mTmpMatrix.postTranslate(app.position.x, app.position.y); + transaction.setMatrix(app.leash, mTmpMatrix) + .setWindowCrop(app.leash, mClipRect); + if (app.isNotInRecents) { + transaction.setAlpha(app.leash, 1 - progress); } + transaction.show(app.leash); } transaction.setEarlyWakeup(); transaction.apply(); diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java new file mode 100644 index 0000000000..fc889e54e6 --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.util; + +import com.android.systemui.shared.system.RemoteAnimationTargetCompat; + +import java.util.ArrayList; + +/** + * Holds a collection of RemoteAnimationTargets, filtered by different properties. + */ +public class RemoteAnimationTargetSet { + + public final boolean allTransparent; + public final RemoteAnimationTargetCompat[] apps; + + public RemoteAnimationTargetSet(RemoteAnimationTargetCompat[] apps, int targetMode) { + boolean allTransparent = true; + + ArrayList filteredApps = new ArrayList<>(); + if (apps != null) { + for (RemoteAnimationTargetCompat target : apps) { + if (target.mode == targetMode) { + allTransparent &= target.isTranslucent; + filteredApps.add(target); + } + } + } + + this.allTransparent = allTransparent; + this.apps = filteredApps.toArray(new RemoteAnimationTargetCompat[filteredApps.size()]); + } + + public RemoteAnimationTargetCompat findTask(int taskId) { + for (RemoteAnimationTargetCompat target : apps) { + if (target.taskId == taskId) { + return target; + } + } + return null; + } +} diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index a3f10f0188..2e70e45da1 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -160,6 +160,7 @@ public abstract class RecentsView // Only valid until the launcher state changes to NORMAL private int mRunningTaskId = -1; + private boolean mRunningTaskTileHidden; private Task mTmpRunningTask; private boolean mFirstTaskIconScaledDown = false; @@ -238,14 +239,11 @@ public abstract class RecentsView } public TaskView updateThumbnail(int taskId, ThumbnailData thumbnailData) { - for (int i = 0; i < getChildCount(); i++) { - final TaskView taskView = (TaskView) getChildAt(i); - if (taskView.getTask().key.id == taskId) { - taskView.onTaskDataLoaded(taskView.getTask(), thumbnailData); - return taskView; - } + TaskView taskView = getTaskView(taskId); + if (taskView != null) { + taskView.onTaskDataLoaded(taskView.getTask(), thumbnailData); } - return null; + return taskView; } @Override @@ -387,6 +385,9 @@ public abstract class RecentsView taskView.resetVisualProperties(); } } + if (mRunningTaskTileHidden) { + setRunningTaskHidden(mRunningTaskTileHidden); + } updateCurveProperties(); // Update the set of visible task's data @@ -524,8 +525,10 @@ public abstract class RecentsView protected abstract void onAllTasksRemoved(); public void reset() { - unloadVisibleTaskData(); mRunningTaskId = -1; + mRunningTaskTileHidden = false; + + unloadVisibleTaskData(); setCurrentPage(0); OverviewCallbacks.get(getContext()).onResetOverview(); @@ -562,12 +565,17 @@ public abstract class RecentsView new ActivityManager.TaskDescription(), 0, new ComponentName("", ""), false); taskView.bind(mTmpRunningTask); } - setCurrentTask(mRunningTaskId); + setCurrentTask(runningTaskId); + } - // Hide the task that we are animating into, ignore if there is no associated task (ie. the - // assistant) - if (getPageAt(mCurrentPage) != null) { - getPageAt(mCurrentPage).setAlpha(0); + /** + * Hides the tile associated with {@link #mRunningTaskId} + */ + public void setRunningTaskHidden(boolean isHidden) { + mRunningTaskTileHidden = isHidden; + TaskView runningTask = getTaskView(mRunningTaskId); + if (runningTask != null) { + runningTask.setAlpha(isHidden ? 0 : mContentAlpha); } } @@ -575,7 +583,13 @@ public abstract class RecentsView * Similar to {@link #showTask(int)} but does not put any restrictions on the first tile. */ public void setCurrentTask(int runningTaskId) { - mRunningTaskId = runningTaskId; + if (mRunningTaskTileHidden) { + setRunningTaskHidden(false); + mRunningTaskId = runningTaskId; + setRunningTaskHidden(true); + } else { + mRunningTaskId = runningTaskId; + } setCurrentPage(0); // Load the tasks (if the loading is already @@ -837,7 +851,10 @@ public abstract class RecentsView mContentAlpha = alpha; for (int i = getChildCount() - 1; i >= 0; i--) { - getChildAt(i).setAlpha(alpha); + TaskView child = getPageAt(i); + if (!mRunningTaskTileHidden || child.getTask().key.id != mRunningTaskId) { + getChildAt(i).setAlpha(alpha); + } } int alphaInt = Math.round(alpha * 255); From 3483c52e6bd81b7c37eb0089940e90a6f3e6d80c Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 12 Apr 2018 11:23:33 -0700 Subject: [PATCH 038/257] Waiting until onResume before creating the wallpaper-open animation. Bug: 77853906 Change-Id: I5126855492da59c9dbfef0ce2a97f94662a6522b --- .../launcher3/LauncherAnimationRunner.java | 105 +++++++++++------- .../LauncherAppTransitionManagerImpl.java | 19 +++- .../android/quickstep/RecentsActivity.java | 5 +- .../WindowTransformSwipeHandler.java | 5 +- .../util/RemoteAnimationProvider.java | 6 +- src/com/android/launcher3/BaseActivity.java | 44 ++++++-- src/com/android/launcher3/Utilities.java | 10 ++ 7 files changed, 135 insertions(+), 59 deletions(-) diff --git a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java index cd673000d9..c9853545f2 100644 --- a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java +++ b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java @@ -15,6 +15,8 @@ */ package com.android.launcher3; +import static com.android.launcher3.Utilities.postAsyncCallback; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; @@ -28,16 +30,12 @@ import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; @TargetApi(Build.VERSION_CODES.P) -public abstract class LauncherAnimationRunner extends AnimatorListenerAdapter - implements RemoteAnimationRunnerCompat { +public abstract class LauncherAnimationRunner implements RemoteAnimationRunnerCompat { private static final int REFRESH_RATE_MS = 16; private final Handler mHandler; - - private Runnable mSysFinishRunnable; - - private AnimatorSet mAnimator; + private AnimationResult mAnimationResult; public LauncherAnimationRunner(Handler handler) { mHandler = handler; @@ -46,34 +44,26 @@ public abstract class LauncherAnimationRunner extends AnimatorListenerAdapter @BinderThread @Override public void onAnimationStart(RemoteAnimationTargetCompat[] targetCompats, Runnable runnable) { - mHandler.post(() -> { - // Finish any previous animation - finishSystemAnimation(); - - mSysFinishRunnable = runnable; - mAnimator = getAnimator(targetCompats); - if (mAnimator == null) { - finishSystemAnimation(); - return; - } - mAnimator.addListener(this); - mAnimator.start(); - // Because t=0 has the app icon in its original spot, we can skip the - // first frame and have the same movement one frame earlier. - mAnimator.setCurrentPlayTime(REFRESH_RATE_MS); - + postAsyncCallback(mHandler, () -> { + finishExistingAnimation(); + mAnimationResult = new AnimationResult(runnable); + onCreateAnimation(targetCompats, mAnimationResult); }); } + /** + * Called on the UI thread when the animation targets are received. The implementation must + * call {@link AnimationResult#setAnimation(AnimatorSet)} with the target animation to be run. + */ @UiThread - public abstract AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats); + public abstract void onCreateAnimation( + RemoteAnimationTargetCompat[] targetCompats, AnimationResult result); @UiThread - @Override - public void onAnimationEnd(Animator animation) { - if (animation == mAnimator) { - mAnimator = null; - finishSystemAnimation(); + private void finishExistingAnimation() { + if (mAnimationResult != null) { + mAnimationResult.finish(); + mAnimationResult = null; } } @@ -83,20 +73,55 @@ public abstract class LauncherAnimationRunner extends AnimatorListenerAdapter @BinderThread @Override public void onAnimationCancelled() { - mHandler.post(() -> { - if (mAnimator != null) { - mAnimator.removeListener(this); - mAnimator.end(); - mAnimator = null; - } - }); + postAsyncCallback(mHandler, this::finishExistingAnimation); } - @UiThread - private void finishSystemAnimation() { - if (mSysFinishRunnable != null) { - mSysFinishRunnable.run(); - mSysFinishRunnable = null; + public static final class AnimationResult { + + private final Runnable mFinishRunnable; + + private AnimatorSet mAnimator; + private boolean mFinished = false; + private boolean mInitialized = false; + + private AnimationResult(Runnable finishRunnable) { + mFinishRunnable = finishRunnable; + } + + @UiThread + private void finish() { + if (!mFinished) { + mFinishRunnable.run(); + mFinished = true; + } + } + + @UiThread + public void setAnimation(AnimatorSet animation) { + if (mInitialized) { + throw new IllegalStateException("Animation already initialized"); + } + mInitialized = true; + mAnimator = animation; + if (mAnimator == null) { + finish(); + } else if (mFinished) { + // Animation callback was already finished, skip the animation. + mAnimator.end(); + } else { + // Start the animation + mAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + finish(); + } + }); + mAnimator.start(); + + // Because t=0 has the app icon in its original spot, we can skip the + // first frame and have the same movement one frame earlier. + mAnimator.setCurrentPlayTime(REFRESH_RATE_MS); + } } } } \ No newline at end of file diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 299e7d51c1..3ff9921684 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -20,6 +20,7 @@ import static com.android.launcher3.BaseActivity.INVISIBLE_ALL; import static com.android.launcher3.BaseActivity.INVISIBLE_BY_APP_TRANSITIONS; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; import static com.android.launcher3.anim.Interpolators.AGGRESSIVE_EASE; import static com.android.launcher3.anim.Interpolators.AGGRESSIVE_EASE_IN_OUT; @@ -163,7 +164,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mHandler) { @Override - public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { + public void onCreateAnimation(RemoteAnimationTargetCompat[] targetCompats, + AnimationResult result) { AnimatorSet anim = new AnimatorSet(); boolean launcherClosing = @@ -185,7 +187,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag anim.addListener(mForceInvisibleListener); } - return anim; + result.setAnimation(anim); } }; @@ -558,7 +560,16 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag private RemoteAnimationRunnerCompat getWallpaperOpenRunner() { return new LauncherAnimationRunner(mHandler) { @Override - public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { + public void onCreateAnimation(RemoteAnimationTargetCompat[] targetCompats, + AnimationResult result) { + if (!mLauncher.hasBeenResumed()) { + // If launcher is not resumed, wait until new async-frame after resume + mLauncher.setOnResumeCallback(() -> + postAsyncCallback(mHandler, () -> + onCreateAnimation(targetCompats, result))); + return; + } + AnimatorSet anim = null; RemoteAnimationProvider provider = mRemoteAnimationProvider; if (provider != null) { @@ -586,7 +597,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag } mLauncher.clearForceInvisibleFlag(INVISIBLE_ALL); - return anim; + result.setAnimation(anim); } }; } diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 820875cc87..551984aa4d 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -168,8 +168,9 @@ public class RecentsActivity extends BaseDraggingActivity { RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mUiHandler) { @Override - public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { - return composeRecentsLaunchAnimator(taskView, targetCompats); + public void onCreateAnimation(RemoteAnimationTargetCompat[] targetCompats, + AnimationResult result) { + result.setAnimation(composeRecentsLaunchAnimator(taskView, targetCompats)); } }; return ActivityOptionsCompat.makeRemoteAnimation(new RemoteAnimationAdapterCompat( diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 27095239d1..d456367527 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -16,13 +16,12 @@ package com.android.quickstep; import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER; +import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.anim.Interpolators.ACCEL_2; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_START_DURATION; import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL; import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB; -import static com.android.systemui.shared.recents.utilities.Utilities - .postAtFrontOfQueueAsynchronously; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; import android.animation.Animator; @@ -248,7 +247,7 @@ public class WindowTransformSwipeHandler { if (Looper.myLooper() == handler.getLooper()) { mStateCallback.setState(stateFlag); } else { - postAtFrontOfQueueAsynchronously(handler, () -> mStateCallback.setState(stateFlag)); + postAsyncCallback(handler, () -> mStateCallback.setState(stateFlag)); } } diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java index 2ffcae38ef..7ee16c1a46 100644 --- a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java +++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java @@ -32,9 +32,11 @@ public interface RemoteAnimationProvider { default ActivityOptions toActivityOptions(Handler handler, long duration) { LauncherAnimationRunner runner = new LauncherAnimationRunner(handler) { + @Override - public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { - return createWindowAnimation(targetCompats); + public void onCreateAnimation(RemoteAnimationTargetCompat[] targetCompats, + AnimationResult result) { + result.setAnimation(createWindowAnimation(targetCompats)); } }; return ActivityOptionsCompat.makeRemoteAnimation( diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index 1f1ef9ad7f..f197921cee 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -56,8 +56,23 @@ public abstract class BaseActivity extends Activity { protected UserEventDispatcher mUserEventDispatcher; protected SystemUiController mSystemUiController; - private boolean mStarted; - private boolean mUserActive; + private static final int ACTIVITY_STATE_STARTED = 1 << 0; + private static final int ACTIVITY_STATE_RESUMED = 1 << 1; + /** + * State flag indicating if the user is active or the actitvity when to background as a result + * of user action. + * @see #isUserActive() + */ + private static final int ACTIVITY_STATE_USER_ACTIVE = 1 << 2; + + @Retention(SOURCE) + @IntDef( + flag = true, + value = {ACTIVITY_STATE_STARTED, ACTIVITY_STATE_RESUMED, ACTIVITY_STATE_USER_ACTIVE}) + public @interface ActivityFlags{} + + @ActivityFlags + private int mActivityFlags; // When the recents animation is running, the visibility of the Launcher is managed by the // animation @@ -103,19 +118,19 @@ public abstract class BaseActivity extends Activity { @Override protected void onStart() { - mStarted = true; + mActivityFlags |= ACTIVITY_STATE_STARTED; super.onStart(); } @Override protected void onResume() { - mUserActive = true; + mActivityFlags |= ACTIVITY_STATE_RESUMED | ACTIVITY_STATE_USER_ACTIVE; super.onResume(); } @Override protected void onUserLeaveHint() { - mUserActive = false; + mActivityFlags &= ~ACTIVITY_STATE_USER_ACTIVE; super.onUserLeaveHint(); } @@ -129,17 +144,30 @@ public abstract class BaseActivity extends Activity { @Override protected void onStop() { - mStarted = false; + mActivityFlags &= ~ACTIVITY_STATE_STARTED; mForceInvisible = 0; super.onStop(); } + @Override + protected void onPause() { + mActivityFlags &= ~ACTIVITY_STATE_RESUMED; + super.onPause(); + } + public boolean isStarted() { - return mStarted; + return (mActivityFlags & ACTIVITY_STATE_STARTED) != 0; + } + + /** + * isResumed in already defined as a hidden final method in Activity.java + */ + public boolean hasBeenResumed() { + return (mActivityFlags & ACTIVITY_STATE_RESUMED) != 0; } public boolean isUserActive() { - return mUserActive; + return (mActivityFlags & ACTIVITY_STATE_USER_ACTIVE) != 0; } public void addOnDeviceProfileChangeListener(OnDeviceProfileChangeListener listener) { diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index ba96d4ae65..98440fff5d 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -35,6 +35,8 @@ import android.graphics.RectF; import android.os.Build; import android.os.Bundle; import android.os.DeadObjectException; +import android.os.Handler; +import android.os.Message; import android.os.PowerManager; import android.os.TransactionTooLargeException; import android.support.v4.os.BuildCompat; @@ -575,4 +577,12 @@ public final class Utilities { return hashSet; } + /** + * Utility method to post a runnable on the handler, skipping the synchronization barriers. + */ + public static void postAsyncCallback(Handler handler, Runnable callback) { + Message msg = Message.obtain(handler, callback); + msg.setAsynchronous(true); + handler.sendMessage(msg); + } } From c879dbf7646b244c32df99ad0f04c0e4e67af2ba Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 16 Apr 2018 16:31:07 -0700 Subject: [PATCH 039/257] 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 (cherry picked from commit 291bfd9c952de61290fd5fed81947aeeeb6eaeeb) --- .../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); From a2adac6a91859b394fdb9025cc842945bb183077 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 16 Apr 2018 15:43:24 -0700 Subject: [PATCH 040/257] 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 Change-Id: I8ba3bd9d068954df51d6de45da79133ede12c96d Test: Manual Merged-In: 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) { From 71142fa4ac1172bca342630792c96999ae46db76 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Mon, 16 Apr 2018 16:09:00 +0200 Subject: [PATCH 041/257] 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 (cherry picked from commit 197808681dafa986b3e5aaf86b06768b94b53a8c) --- .../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 3ff9921684..ce17d257ec 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -50,7 +50,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; @@ -178,7 +180,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)); } @@ -267,8 +277,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} @@ -288,6 +299,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); @@ -295,13 +313,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]); @@ -316,15 +332,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); } /** @@ -658,9 +673,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(); From de967a2355752c2653ed14a1d57a7a8c8c2eef57 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 17 Apr 2018 10:45:24 -0700 Subject: [PATCH 042/257] Disabling alpha layer on some views Change-Id: Ide1d5951ea80080f8fea8f32a76487b646b4f958 (cherry picked from commit 2020b20cd908d64863474ae53de64e6554fd85c9) --- 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; + } } From cc35bb88daf36fb73882dc25f7e56f62c353e410 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 17 Apr 2018 11:56:34 -0700 Subject: [PATCH 043/257] Linking swipe animate to stateTransition to that it gets properly reset afterwards Bug: 77848165 Change-Id: Ie4ae2fe933b37b66568c0a8eb29c85b9869a9987 --- quickstep/src/com/android/quickstep/ActivityControlHelper.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 0ea729f280..52db0017b8 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -213,9 +213,8 @@ public interface ActivityControlHelper { anim.play(shiftAnim); } - // TODO: Link this animation to state animation, so that it is cancelled - // automatically on state change anim.setDuration(transitionLength * 2); + activity.getStateManager().setCurrentAnimation(anim); return AnimatorPlaybackController.wrap(anim, transitionLength * 2); } From 864d688ff36774c40a7882b972e166cdd1f729ba Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 13 Apr 2018 18:19:16 -0700 Subject: [PATCH 044/257] Do not send proxy touch events to children. Call onIntercept and ontouch direclty, so that the touch is only handled by touch handlers Bug: 77912191 Change-Id: I8b583da2394282c757348818470dbb4bee095b33 --- .../android/quickstep/TouchInteractionService.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 4f0187c47f..57f46b87ac 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -39,13 +39,12 @@ import android.util.SparseArray; import android.view.Choreographer; import android.view.MotionEvent; import android.view.VelocityTracker; -import android.view.View; import android.view.ViewConfiguration; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.MainThreadExecutor; -import com.android.launcher3.R; import com.android.launcher3.util.TraceHelper; +import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.ISystemUiProxy; @@ -248,7 +247,7 @@ public class TouchInteractionService extends Service { private final ActivityControlHelper mActivityHelper; private final T mActivity; - private final View mTarget; + private final BaseDragLayer mTarget; private final int[] mLocationOnScreen = new int[2]; private final PointF mDownPos = new PointF(); private final int mTouchSlop; @@ -293,7 +292,6 @@ public class TouchInteractionService extends Service { case ACTION_MOVE: { float displacement = ev.getY() - mDownPos.y; if (Math.abs(displacement) >= mTouchSlop) { - mTrackingStarted = true; mTarget.getLocationOnScreen(mLocationOnScreen); // Send a down event only when mTouchSlop is crossed. @@ -301,6 +299,7 @@ public class TouchInteractionService extends Service { down.setAction(ACTION_DOWN); sendEvent(down); down.recycle(); + mTrackingStarted = true; } } } @@ -319,7 +318,10 @@ public class TouchInteractionService extends Service { int flags = ev.getEdgeFlags(); ev.setEdgeFlags(flags | EDGE_NAV_BAR); ev.offsetLocation(-mLocationOnScreen[0], -mLocationOnScreen[1]); - mTarget.dispatchTouchEvent(ev); + if (!mTrackingStarted) { + mTarget.onInterceptTouchEvent(ev); + } + mTarget.onTouchEvent(ev); ev.offsetLocation(mLocationOnScreen[0], mLocationOnScreen[1]); ev.setEdgeFlags(flags); } From ed7a6937cbe11179403b31079d8c54ffa8f30019 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 13 Apr 2018 11:41:50 -0700 Subject: [PATCH 045/257] Unifying and maintaining the text-alpha and text visibility property Bug: 76228194 Change-Id: I70be5f9fd22c53864a9a0308f256baa7dc1f3ab7 --- src/com/android/launcher3/BubbleTextView.java | 97 +++++++++++-------- .../folder/FolderAnimationManager.java | 6 +- 2 files changed, 57 insertions(+), 46 deletions(-) diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 41bfcb7ae9..fb7c0ced4a 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -65,27 +65,6 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, private static final int[] STATE_PRESSED = new int[] {android.R.attr.state_pressed}; - private final BaseDraggingActivity mActivity; - private Drawable mIcon; - private final boolean mCenterVertically; - - private final CheckLongPressHelper mLongPressHelper; - private final StylusEventHelper mStylusEventHelper; - private final float mSlop; - - private final boolean mLayoutHorizontal; - private final int mIconSize; - @ViewDebug.ExportedProperty(category = "launcher") - private int mTextColor; - private boolean mIsIconVisible = true; - - private BadgeInfo mBadgeInfo; - private BadgeRenderer mBadgeRenderer; - private int mBadgeColor; - private float mBadgeScale; - private boolean mForceHideBadge; - private Point mTempSpaceForBadgeOffset = new Point(); - private Rect mTempIconBounds = new Rect(); private static final Property BADGE_SCALE_PROPERTY = new Property(Float.TYPE, "badgeScale") { @@ -101,19 +80,45 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } }; - public static final Property TEXT_ALPHA_PROPERTY - = new Property(Integer.class, "textAlpha") { + public static final Property TEXT_ALPHA_PROPERTY + = new Property(Float.class, "textAlpha") { @Override - public Integer get(BubbleTextView bubbleTextView) { - return bubbleTextView.getTextAlpha(); + public Float get(BubbleTextView bubbleTextView) { + return bubbleTextView.mTextAlpha; } @Override - public void set(BubbleTextView bubbleTextView, Integer alpha) { + public void set(BubbleTextView bubbleTextView, Float alpha) { bubbleTextView.setTextAlpha(alpha); } }; + private final BaseDraggingActivity mActivity; + private Drawable mIcon; + private final boolean mCenterVertically; + + private final CheckLongPressHelper mLongPressHelper; + private final StylusEventHelper mStylusEventHelper; + private final float mSlop; + + private final boolean mLayoutHorizontal; + private final int mIconSize; + + @ViewDebug.ExportedProperty(category = "launcher") + private boolean mIsIconVisible = true; + @ViewDebug.ExportedProperty(category = "launcher") + private int mTextColor; + @ViewDebug.ExportedProperty(category = "launcher") + private float mTextAlpha = 1; + + private BadgeInfo mBadgeInfo; + private BadgeRenderer mBadgeRenderer; + private int mBadgeColor; + private float mBadgeScale; + private boolean mForceHideBadge; + private Point mTempSpaceForBadgeOffset = new Point(); + private Rect mTempIconBounds = new Rect(); + @ViewDebug.ExportedProperty(category = "launcher") private boolean mStayPressed; @ViewDebug.ExportedProperty(category = "launcher") @@ -166,7 +171,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, setEllipsize(TruncateAt.END); setAccessibilityDelegate(mActivity.getAccessibilityDelegate()); - + setTextAlpha(1f); } @Override @@ -404,13 +409,17 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, @Override public void setTextColor(int color) { mTextColor = color; - super.setTextColor(color); + super.setTextColor(getModifiedColor()); } @Override public void setTextColor(ColorStateList colors) { mTextColor = colors.getDefaultColor(); - super.setTextColor(colors); + if (Float.compare(mTextAlpha, 1) == 0) { + super.setTextColor(colors); + } else { + super.setTextColor(getModifiedColor()); + } } public boolean shouldTextBeVisible() { @@ -421,19 +430,21 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } public void setTextVisibility(boolean visible) { - if (visible) { - super.setTextColor(mTextColor); - } else { - setTextAlpha(0); + setTextAlpha(visible ? 1 : 0); + } + + private void setTextAlpha(float alpha) { + mTextAlpha = alpha; + super.setTextColor(getModifiedColor()); + } + + private int getModifiedColor() { + if (mTextAlpha == 0) { + // Special case to prevent text shadows in high contrast mode + return Color.TRANSPARENT; } - } - - public void setTextAlpha(int alpha) { - super.setTextColor(ColorUtils.setAlphaComponent(mTextColor, alpha)); - } - - private int getTextAlpha() { - return Color.alpha(getCurrentTextColor()); + return ColorUtils.setAlphaComponent( + mTextColor, Math.round(Color.alpha(mTextColor) * mTextAlpha)); } /** @@ -441,8 +452,8 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, * @param fadeIn Whether the text should fade in or fade out. */ public ObjectAnimator createTextAlphaAnimator(boolean fadeIn) { - int toAlpha = shouldTextBeVisible() && fadeIn ? Color.alpha(mTextColor) : 0; - return ObjectAnimator.ofInt(this, TEXT_ALPHA_PROPERTY, toAlpha); + float toAlpha = shouldTextBeVisible() && fadeIn ? 1 : 0; + return ObjectAnimator.ofFloat(this, TEXT_ALPHA_PROPERTY, toAlpha); } @Override diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index ec448e9978..9ae3775356 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -16,6 +16,7 @@ package com.android.launcher3.folder; +import static com.android.launcher3.BubbleTextView.TEXT_ALPHA_PROPERTY; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; @@ -172,9 +173,8 @@ public class FolderAnimationManager { AnimatorSet a = LauncherAnimUtils.createAnimatorSet(); // Initialize the Folder items' text. - PropertyResetListener colorResetListener = new PropertyResetListener<>( - BubbleTextView.TEXT_ALPHA_PROPERTY, - Color.alpha(Themes.getAttrColor(mContext, android.R.attr.textColorSecondary))); + PropertyResetListener colorResetListener = + new PropertyResetListener<>(TEXT_ALPHA_PROPERTY, 1f); for (BubbleTextView icon : mFolder.getItemsOnPage(mFolder.mContent.getCurrentPage())) { if (mIsOpening) { icon.setTextVisibility(false); From 7aa922c912230ada9812f9f61c93594635d1b0ec Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 17 Apr 2018 18:54:10 -0700 Subject: [PATCH 046/257] Make sure notification listener stays unbound on reboot when badging disabled We were requesting unbind in onCreate(), but the NotificationListenerService documentation for requestUnbind() clearly states "The service should wait for the {@link #onListenerConnected()} event before performing this operation. I know it's tempting, but you must wait." I was tempted, and I did not wait. :( The fact that the notification listener was binding even though the setting was off was not only inefficient, but also had at least one user-visible bug: because secure settings are set per user, the global badging setting actually only applies canShowBadge = false for user 0; other users such as work profile still show badges. Repro steps: 1. Have a work profile 2. Get a notification on work profile app and normal app 3. Turn off global badging setting ("Allow notification dots" from home settings) 4. Reboot the device In this case, we get onCreate, call requestUnbind() which is ignored since we aren't bound, then get onBind() and onListenerConnected() etc. Thus the work profile app has a notification dot and other apps don't. Bug: 71545493 Change-Id: I7f7dc219b25c28257f8b98fba7e362b99d3cba45 --- .../notification/NotificationListener.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/com/android/launcher3/notification/NotificationListener.java b/src/com/android/launcher3/notification/NotificationListener.java index 117287ba7b..b527b6a8d2 100644 --- a/src/com/android/launcher3/notification/NotificationListener.java +++ b/src/com/android/launcher3/notification/NotificationListener.java @@ -150,22 +150,12 @@ public class NotificationListener extends NotificationListenerService { public void onCreate() { super.onCreate(); sIsCreated = true; - mNotificationBadgingObserver = new SettingsObserver.Secure(getContentResolver()) { - @Override - public void onSettingChanged(boolean isNotificationBadgingEnabled) { - if (!isNotificationBadgingEnabled) { - requestUnbind(); - } - } - }; - mNotificationBadgingObserver.register(NOTIFICATION_BADGING); } @Override public void onDestroy() { super.onDestroy(); sIsCreated = false; - mNotificationBadgingObserver.unregister(); } public static @Nullable NotificationListener getInstanceIfConnected() { @@ -203,6 +193,17 @@ public class NotificationListener extends NotificationListenerService { public void onListenerConnected() { super.onListenerConnected(); sIsConnected = true; + + mNotificationBadgingObserver = new SettingsObserver.Secure(getContentResolver()) { + @Override + public void onSettingChanged(boolean isNotificationBadgingEnabled) { + if (!isNotificationBadgingEnabled) { + requestUnbind(); + } + } + }; + mNotificationBadgingObserver.register(NOTIFICATION_BADGING); + onNotificationFullRefresh(); } @@ -214,6 +215,7 @@ public class NotificationListener extends NotificationListenerService { public void onListenerDisconnected() { super.onListenerDisconnected(); sIsConnected = false; + mNotificationBadgingObserver.unregister(); } @Override From b67e35337b9a46e8804afee8513c1c627882115e Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Tue, 17 Apr 2018 23:45:47 -0700 Subject: [PATCH 047/257] Reset PIP position when canceling swipe up onStop() is a confirmed signal of user leaving Launcher. In most use cases, we use onUserLeaveHint() to move PIP. However, in some cases, onUserLeaveHint() does not get triggered. It's still a good signal for those use cases because it happens sooner than onStop() and is not interrupted by focus change. In order to address cases that onUserLeaveHint() is not triggered (e.g. cancelling swipe up), onStop() pushes PIP to the right position. In other cases, we simply set it twice, which does not hurt. Change-Id: Ia206590d10d673b16196bbab927a24aaae3ba46b Fixes: 77648293 Test: manual test --- src/com/android/launcher3/BaseActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index f197921cee..a41edc08b4 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -144,7 +144,7 @@ public abstract class BaseActivity extends Activity { @Override protected void onStop() { - mActivityFlags &= ~ACTIVITY_STATE_STARTED; + mActivityFlags &= ~ACTIVITY_STATE_STARTED & ~ACTIVITY_STATE_USER_ACTIVE; mForceInvisible = 0; super.onStop(); } From 4b03a1e5a2e07ca0ee2ba3bc9a0f1d7352375630 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 18 Apr 2018 09:56:58 -0700 Subject: [PATCH 048/257] Restricting the max duration used for the swipe-down animation > Also changing the interpolator from t^5 to t^2 so that it settles faster. Bug: 78059672 Change-Id: Iae6e6f56eb2e249c11a8e069f04ab0f26a683063 --- .../quickstep/WindowTransformSwipeHandler.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index d456367527..82e64ab845 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -18,7 +18,9 @@ package com.android.quickstep; import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER; import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.anim.Interpolators.ACCEL_2; +import static com.android.launcher3.anim.Interpolators.DEACCEL; import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR; import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_START_DURATION; import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL; import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB; @@ -55,7 +57,6 @@ import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; -import com.android.launcher3.anim.Interpolators; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; @@ -400,7 +401,7 @@ public class WindowTransformSwipeHandler { setStateOnUiThread(STATE_QUICK_SCRUB_START); // Start the window animation without waiting for launcher. - animateToProgress(1f, QUICK_SCRUB_START_DURATION); + animateToProgress(1f, QUICK_SCRUB_START_DURATION, TOUCH_RESPONSE_INTERPOLATOR); } @WorkerThread @@ -573,13 +574,14 @@ public class WindowTransformSwipeHandler { // we want the page's snap velocity to approximately match the velocity at // which the user flings, so we scale the duration by a value near to the - // derivative of the scroll interpolator at zero, ie. 5. - duration = 5 * Math.round(1000 * Math.abs(distanceToTravel / endVelocity)); + // derivative of the scroll interpolator at zero, ie. 2. + long baseDuration = Math.round(1000 * Math.abs(distanceToTravel / endVelocity)); + duration = Math.min(MAX_SWIPE_DURATION, 2 * baseDuration); } mLogAction = Touch.FLING; } - animateToProgress(endShift, duration); + animateToProgress(endShift, duration, DEACCEL); } private void doLogGesture(boolean toLauncher) { @@ -599,10 +601,10 @@ public class WindowTransformSwipeHandler { } /** Animates to the given progress, where 0 is the current app and 1 is overview. */ - private void animateToProgress(float progress, long duration) { + private void animateToProgress(float progress, long duration, Interpolator interpolator) { mIsGoingToHome = Float.compare(progress, 1) == 0; ObjectAnimator anim = mCurrentShift.animateToValue(progress).setDuration(duration); - anim.setInterpolator(Interpolators.SCROLL); + anim.setInterpolator(interpolator); anim.addListener(new AnimationSuccessListener() { @Override public void onAnimationSuccess(Animator animator) { From 6d2321cb7dfe4eb72ee7bd52b1ee8d3a238ab865 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 11 Apr 2018 17:19:08 -0700 Subject: [PATCH 049/257] Introducing Clear-all button on Overview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It’s an initial implementation, i.e. no fancy effects. It shares a parent (LauncherRecentsViewContainer) with RecentsView. The button is centered in clear_all_button_container, which gets positioned programmatically to the right of the last task. (RTL polish will be a separate CL as well). Bug: 72222505 Change-Id: Ia912908a93a30c2f51450ccf0f97c7495e7916d5 Test: Manual --- .../res/layout/fallback_recents_activity.xml | 24 ++++-- .../res/layout/overview_clear_all_button.xml | 14 ++++ quickstep/res/layout/overview_panel.xml | 21 +++-- quickstep/res/values/dimens.xml | 3 + quickstep/res/values/strings.xml | 3 + .../RecentsViewStateController.java | 9 +- .../android/quickstep/views/RecentsView.java | 73 ++++++++++++----- .../quickstep/views/RecentsViewContainer.java | 82 +++++++++++++++++++ res/layout/launcher.xml | 2 +- res/values/config.xml | 1 + src/com/android/launcher3/Launcher.java | 8 ++ 11 files changed, 201 insertions(+), 39 deletions(-) create mode 100644 quickstep/res/layout/overview_clear_all_button.xml create mode 100644 quickstep/src/com/android/quickstep/views/RecentsViewContainer.java diff --git a/quickstep/res/layout/fallback_recents_activity.xml b/quickstep/res/layout/fallback_recents_activity.xml index 22f8b55a2a..7ecab32016 100644 --- a/quickstep/res/layout/fallback_recents_activity.xml +++ b/quickstep/res/layout/fallback_recents_activity.xml @@ -20,13 +20,23 @@ android:layout_height="match_parent" android:fitsSystemWindows="true"> - + > + - \ No newline at end of file + + + + + diff --git a/quickstep/res/layout/overview_clear_all_button.xml b/quickstep/res/layout/overview_clear_all_button.xml new file mode 100644 index 0000000000..8632f8bbd0 --- /dev/null +++ b/quickstep/res/layout/overview_clear_all_button.xml @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/quickstep/res/layout/overview_panel.xml b/quickstep/res/layout/overview_panel.xml index 89e057148f..6102c38aaf 100644 --- a/quickstep/res/layout/overview_panel.xml +++ b/quickstep/res/layout/overview_panel.xml @@ -14,14 +14,23 @@ See the License for the specific language governing permissions and limitations under the License. --> - +> + - \ No newline at end of file + + + + \ No newline at end of file diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index c741913953..0199cd9537 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -45,4 +45,7 @@ 10dp + + + 168dp diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml index bafa294f42..34cc0b7245 100644 --- a/quickstep/res/values/strings.xml +++ b/quickstep/res/values/strings.xml @@ -35,4 +35,7 @@ Close + + + Clear all \ No newline at end of file diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java index 124ec202d1..49d493145c 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java @@ -20,7 +20,7 @@ import static com.android.launcher3.anim.Interpolators.AGGRESSIVE_EASE_IN_OUT; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.quickstep.views.LauncherRecentsView.TRANSLATION_Y_FACTOR; import static com.android.quickstep.views.RecentsView.ADJACENT_SCALE; -import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA; +import static com.android.quickstep.views.RecentsViewContainer.CONTENT_ALPHA; import android.animation.ValueAnimator; import android.annotation.TargetApi; @@ -33,21 +33,24 @@ import com.android.launcher3.LauncherStateManager.StateHandler; import com.android.launcher3.anim.AnimatorSetBuilder; import com.android.launcher3.anim.PropertySetter; import com.android.quickstep.views.LauncherRecentsView; +import com.android.quickstep.views.RecentsViewContainer; @TargetApi(Build.VERSION_CODES.O) public class RecentsViewStateController implements StateHandler { private final Launcher mLauncher; private final LauncherRecentsView mRecentsView; + private final RecentsViewContainer mRecentsViewContainer; public RecentsViewStateController(Launcher launcher) { mLauncher = launcher; mRecentsView = launcher.getOverviewPanel(); + mRecentsViewContainer = launcher.getOverviewPanelContainer(); } @Override public void setState(LauncherState state) { - mRecentsView.setContentAlpha(state.overviewUi ? 1 : 0); + mRecentsViewContainer.setContentAlpha(state.overviewUi ? 1 : 0); float[] scaleTranslationYFactor = state.getOverviewScaleAndTranslationYFactor(mLauncher); mRecentsView.setAdjacentScale(scaleTranslationYFactor[0]); mRecentsView.setTranslationYFactor(scaleTranslationYFactor[1]); @@ -66,7 +69,7 @@ public class RecentsViewStateController implements StateHandler { builder.getInterpolator(ANIM_OVERVIEW_TRANSLATION, LINEAR)); setter.setFloat(mRecentsView, TRANSLATION_Y_FACTOR, scaleTranslationYFactor[1], builder.getInterpolator(ANIM_OVERVIEW_TRANSLATION, LINEAR)); - setter.setFloat(mRecentsView, CONTENT_ALPHA, toState.overviewUi ? 1 : 0, + setter.setFloat(mRecentsViewContainer, CONTENT_ALPHA, toState.overviewUi ? 1 : 0, AGGRESSIVE_EASE_IN_OUT); if (!toState.overviewUi) { diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 597e33368e..c602392d03 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -87,21 +87,10 @@ import java.util.ArrayList; public abstract class RecentsView extends PagedView implements OnSharedPreferenceChangeListener, Insettable { + public static final boolean DEBUG_SHOW_CLEAR_ALL_BUTTON = false; + private final Rect mTempRect = new Rect(); - public static final FloatProperty CONTENT_ALPHA = - new FloatProperty("contentAlpha") { - @Override - public void setValue(RecentsView recentsView, float v) { - recentsView.setContentAlpha(v); - } - - @Override - public Float get(RecentsView recentsView) { - return recentsView.mContentAlpha; - } - }; - public static final FloatProperty ADJACENT_SCALE = new FloatProperty("adjacentScale") { @Override @@ -180,6 +169,8 @@ public abstract class RecentsView // Keeps track of task views whose visual state should not be reset private ArraySet mIgnoreResetTaskViews = new ArraySet<>(); + private RecentsViewContainer mContainerView; + // Variables for empty state private final Drawable mEmptyIcon; private final CharSequence mEmptyMessage; @@ -320,12 +311,18 @@ public abstract class RecentsView @Override public boolean onTouchEvent(MotionEvent ev) { - super.onTouchEvent(ev); + if (DEBUG_SHOW_CLEAR_ALL_BUTTON && mTouchState == TOUCH_STATE_REST && mScroller.isFinished() + && getChildCount() != 0 + && ev.getX() > getChildAt(getChildCount() - 1).getRight() - getScrollX()) { + // If nothing is in motion, allow events to the right of the last task to go to the + // Clear All button. + return false; + } + if (ev.getAction() == MotionEvent.ACTION_UP && mShowEmptyMessage) { onAllTasksRemoved(); } - // Do not let touch escape to siblings below this view. - return true; + return super.onTouchEvent(ev); } private void applyLoadPlan(RecentsTaskLoadPlan loadPlan) { @@ -424,6 +421,10 @@ public abstract class RecentsView protected abstract void getTaskSize(DeviceProfile dp, Rect outRect); + public void getTaskSize(Rect outRect) { + getTaskSize(mActivity.getDeviceProfile(), outRect); + } + @Override protected boolean computeScrollHelper() { boolean scrolling = super.computeScrollHelper(); @@ -530,6 +531,7 @@ public abstract class RecentsView unloadVisibleTaskData(); setCurrentPage(0); + scrollTo(0, 0); OverviewCallbacks.get(getContext()).onResetOverview(); } @@ -844,11 +846,11 @@ public abstract class RecentsView snapToPageRelative(1); } - public void setContentAlpha(float alpha) { - if (mContentAlpha == alpha) { - return; - } + public float getContentAlpha() { + return mContentAlpha; + } + public void setContentAlpha(float alpha) { mContentAlpha = alpha; for (int i = getChildCount() - 1; i >= 0; i--) { TaskView child = getPageAt(i); @@ -860,8 +862,6 @@ public abstract class RecentsView int alphaInt = Math.round(alpha * 255); mEmptyMessagePaint.setAlpha(alphaInt); mEmptyIcon.setAlpha(alphaInt); - - setVisibility(alpha > 0 ? VISIBLE : GONE); } public void setAdjacentScale(float adjacentScale) { @@ -929,6 +929,9 @@ public abstract class RecentsView mShowEmptyMessage = isEmpty; updateEmptyStateUi(hasSizeChanged); invalidate(); + if (mContainerView != null) { + mContainerView.onEmptyStateChanged(!DEBUG_SHOW_CLEAR_ALL_BUTTON || mShowEmptyMessage); + } } @Override @@ -1095,4 +1098,30 @@ public abstract class RecentsView protected String getCurrentPageDescription() { return ""; } + + public void dismissAllTasks() { + for (int i = 0; i < getChildCount(); ++i) { + Task task = getPageAt(i).getTask(); + if (task != null) { + ActivityManagerWrapper.getInstance().removeTask(task.key.id); + } + } + onAllTasksRemoved(); + } + + @Override + protected int computeMaxScrollX() { + if (!DEBUG_SHOW_CLEAR_ALL_BUTTON || getChildCount() == 0) { + return super.computeMaxScrollX(); + } + + // Allow a clear_all_container_width-sized gap after the last task. + return super.computeMaxScrollX() + (int) getResources().getDimension( + R.dimen.clear_all_container_width) - getPaddingEnd(); + } + + public void setContainerView(RecentsViewContainer containerView) { + mContainerView = containerView; + mContainerView.onEmptyStateChanged(!DEBUG_SHOW_CLEAR_ALL_BUTTON || mShowEmptyMessage); + } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java new file mode 100644 index 0000000000..cd4a6ffc58 --- /dev/null +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -0,0 +1,82 @@ +package com.android.quickstep.views; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.util.FloatProperty; +import android.view.MotionEvent; +import android.view.View; + +import com.android.launcher3.InsettableFrameLayout; +import com.android.launcher3.R; + +public class RecentsViewContainer extends InsettableFrameLayout { + public static final FloatProperty CONTENT_ALPHA = + new FloatProperty("contentAlpha") { + @Override + public void setValue(RecentsViewContainer view, float v) { + view.setContentAlpha(v); + } + + @Override + public Float get(RecentsViewContainer view) { + return view.mRecentsView.getContentAlpha(); + } + }; + + private final Rect mTempRect = new Rect(); + + private RecentsView mRecentsView; + private View mClearAllButton; + + public RecentsViewContainer(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + mClearAllButton = findViewById(R.id.clear_all_button); + mClearAllButton.setOnClickListener((v) -> { + mRecentsView.dismissAllTasks(); + }); + + mRecentsView = (RecentsView) findViewById(R.id.overview_panel); + mRecentsView.setContainerView(this); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + mRecentsView.getTaskSize(mTempRect); + + mClearAllButton.setTranslationX( + (mClearAllButton.getMeasuredWidth() - getResources().getDimension( + R.dimen.clear_all_container_width)) / 2); + mClearAllButton.setTranslationY( + mTempRect.top + (mTempRect.height() - mClearAllButton.getMeasuredHeight()) / 2 + - mClearAllButton.getY()); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + super.onTouchEvent(ev); + // Do not let touch escape to siblings below this view. This prevents scrolling of the + // workspace while in Recents. + return true; + } + + public void setContentAlpha(float alpha) { + if (alpha == mRecentsView.getContentAlpha()) { + return; + } + mRecentsView.setContentAlpha(alpha); + setVisibility(alpha > 0 ? VISIBLE : GONE); + } + + public void onEmptyStateChanged(boolean isEmpty) { + mClearAllButton.setVisibility(isEmpty ? GONE : VISIBLE); + } +} \ No newline at end of file diff --git a/res/layout/launcher.xml b/res/layout/launcher.xml index a4acf06be5..6556adffc8 100644 --- a/res/layout/launcher.xml +++ b/res/layout/launcher.xml @@ -40,7 +40,7 @@ launcher:pageIndicator="@+id/page_indicator" /> diff --git a/res/values/config.xml b/res/values/config.xml index a40afe1138..9d1bb4110a 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -147,6 +147,7 @@ + 6 12 diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 88408606f5..ec0a8ffb3f 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -18,6 +18,7 @@ package com.android.launcher3; import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE; + import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; @@ -205,6 +206,8 @@ public class Launcher extends BaseDraggingActivity // UI and state for the overview panel private View mOverviewPanel; + private View mOverviewPanelContainer; + @Thunk boolean mWorkspaceLoading = true; private OnResumeCallback mOnResumeCallback; @@ -912,6 +915,7 @@ public class Launcher extends BaseDraggingActivity mWorkspace = mDragLayer.findViewById(R.id.workspace); mWorkspace.initParentViews(mDragLayer); mOverviewPanel = findViewById(R.id.overview_panel); + mOverviewPanelContainer = findViewById(R.id.overview_panel_container); mHotseat = findViewById(R.id.hotseat); mDragHandleIndicator = findViewById(R.id.drag_indicator); mHotseatSearchBox = findViewById(R.id.search_container_hotseat); @@ -1192,6 +1196,10 @@ public class Launcher extends BaseDraggingActivity return (T) mOverviewPanel; } + public T getOverviewPanelContainer() { + return (T) mOverviewPanelContainer; + } + public DropTargetBar getDropTargetBar() { return mDropTargetBar; } From 596d7f135d883323da4a8cedd74f838a359606e8 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 18 Apr 2018 11:44:48 -0700 Subject: [PATCH 050/257] WallpaperManagerCompat: correct build version check WallpaperManagerCompatVOMR1 is targeting API 27 (O MR1), but the api guard is checking, if we are running API 26 (O) or above. Correct the check to prevent using unavailable Wallpaper APIs. Change-Id: I83cceee8eb61b2d74e647d473d7d560d00be14d3 (cherry picked from commit Iaf510bb79010e640db04adbbc2ee44de9abd6913) Signed-off-by: Alexander Martinz --- src/com/android/launcher3/compat/WallpaperManagerCompat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/compat/WallpaperManagerCompat.java b/src/com/android/launcher3/compat/WallpaperManagerCompat.java index 00258c7da9..6605acecdb 100644 --- a/src/com/android/launcher3/compat/WallpaperManagerCompat.java +++ b/src/com/android/launcher3/compat/WallpaperManagerCompat.java @@ -31,7 +31,7 @@ public abstract class WallpaperManagerCompat { if (sInstance == null) { context = context.getApplicationContext(); - if (Utilities.ATLEAST_OREO) { + if (Utilities.ATLEAST_OREO_MR1) { try { sInstance = new WallpaperManagerCompatVOMR1(context); } catch (Throwable e) { From 5490445898536dc437432c0b440684b014958a2b Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 18 Apr 2018 11:39:26 -0700 Subject: [PATCH 051/257] Do not allow fling if we didn't get onGestureStarted Bug: 78232923 Change-Id: Ia37f54d7a0e2eb1d42641648ac7a5e7687e3dd0c --- .../android/quickstep/WindowTransformSwipeHandler.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 82e64ab845..99e9451534 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -134,6 +134,8 @@ public class WindowTransformSwipeHandler { private static final long MIN_SWIPE_DURATION = 80; private static final float MIN_PROGRESS_FOR_OVERVIEW = 0.5f; + private static final float SWIPE_DURATION_MULTIPLIER = + Math.min(1 / MIN_PROGRESS_FOR_OVERVIEW, 1 / (1 - MIN_PROGRESS_FOR_OVERVIEW)); private final ClipAnimationHelper mClipAnimationHelper = new ClipAnimationHelper(); @@ -559,12 +561,15 @@ public class WindowTransformSwipeHandler { public void onGestureEnded(float endVelocity) { Resources res = mContext.getResources(); float flingThreshold = res.getDimension(R.dimen.quickstep_fling_threshold_velocity); - boolean isFling = Math.abs(endVelocity) > flingThreshold; + boolean isFling = mGestureStarted && Math.abs(endVelocity) > flingThreshold; long duration = MAX_SWIPE_DURATION; final float endShift; if (!isFling) { - endShift = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW ? 1 : 0; + endShift = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW && mGestureStarted ? 1 : 0; + long expectedDuration = Math.abs(Math.round((endShift - mCurrentShift.value) + * MAX_SWIPE_DURATION * SWIPE_DURATION_MULTIPLIER)); + duration = Math.min(MAX_SWIPE_DURATION, expectedDuration); mLogAction = Touch.SWIPE; } else { endShift = endVelocity < 0 ? 1 : 0; From d837a329b8bfca9684a577d3bda7d02a3fd7b6a7 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 18 Apr 2018 13:34:33 -0700 Subject: [PATCH 052/257] Increasing the max fling/swipe duration Bug: 78059672 Change-Id: Iede9982b634f48f3f28732aa0d2c8413972c390b --- .../src/com/android/quickstep/WindowTransformSwipeHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 99e9451534..079e256fcb 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -130,7 +130,7 @@ public class WindowTransformSwipeHandler { "STATE_QUICK_SCRUB_END" }; - private static final long MAX_SWIPE_DURATION = 200; + private static final long MAX_SWIPE_DURATION = 350; private static final long MIN_SWIPE_DURATION = 80; private static final float MIN_PROGRESS_FOR_OVERVIEW = 0.5f; From d47f2d26cc7bc4dca6e6f10d6e1aa493960a1944 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 18 Apr 2018 14:11:37 -0700 Subject: [PATCH 053/257] Fixing preference highlight when opening notification access Bug: 77590799 Change-Id: Ife3f9d94cb9c469c6e9e000002c6277d5bf47189 --- src/com/android/launcher3/SettingsActivity.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/SettingsActivity.java b/src/com/android/launcher3/SettingsActivity.java index c9bd32b086..d7c20b8a91 100644 --- a/src/com/android/launcher3/SettingsActivity.java +++ b/src/com/android/launcher3/SettingsActivity.java @@ -59,6 +59,7 @@ public class SettingsActivity extends Activity { private static final String NOTIFICATION_ENABLED_LISTENERS = "enabled_notification_listeners"; private static final String EXTRA_FRAGMENT_ARG_KEY = ":settings:fragment_args_key"; + private static final String EXTRA_SHOW_FRAGMENT_ARGS = ":settings:show_fragment_args"; private static final int DELAY_HIGHLIGHT_DURATION_MILLIS = 600; private static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted"; @@ -273,9 +274,13 @@ public class SettingsActivity extends Activity { @Override public void onClick(DialogInterface dialogInterface, int i) { ComponentName cn = new ComponentName(getActivity(), NotificationListener.class); + Bundle showFragmentArgs = new Bundle(); + showFragmentArgs.putString(EXTRA_FRAGMENT_ARG_KEY, cn.flattenToString()); + Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra(":settings:fragment_args_key", cn.flattenToString()); + .putExtra(EXTRA_FRAGMENT_ARG_KEY, cn.flattenToString()) + .putExtra(EXTRA_SHOW_FRAGMENT_ARGS, showFragmentArgs); getActivity().startActivity(intent); } } From 5b87fa6af7f84255da095a93b1072460b9aa759b Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 18 Apr 2018 14:17:32 -0700 Subject: [PATCH 054/257] Fixing Clear-all crawling down with time + a small optimization. Bug: 72222505 Test: Manual Change-Id: I0fbdee0a85c123d201b0eb6951f244540ef48117 --- .../com/android/quickstep/views/RecentsViewContainer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index cd4a6ffc58..fe668c6f8e 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -1,5 +1,7 @@ package com.android.quickstep.views; +import static com.android.quickstep.views.RecentsView.DEBUG_SHOW_CLEAR_ALL_BUTTON; + import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; @@ -50,6 +52,8 @@ public class RecentsViewContainer extends InsettableFrameLayout { protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); + if (!changed || !DEBUG_SHOW_CLEAR_ALL_BUTTON) return; + mRecentsView.getTaskSize(mTempRect); mClearAllButton.setTranslationX( @@ -57,7 +61,7 @@ public class RecentsViewContainer extends InsettableFrameLayout { R.dimen.clear_all_container_width)) / 2); mClearAllButton.setTranslationY( mTempRect.top + (mTempRect.height() - mClearAllButton.getMeasuredHeight()) / 2 - - mClearAllButton.getY()); + - mClearAllButton.getTop()); } @Override From 174aae5dbdc8fefed556e9e37b6cfa241a9a5609 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 18 Apr 2018 16:32:32 -0700 Subject: [PATCH 055/257] Always draw the background color in the task views - Snapshots can now be translucent which means that we always have to draw the background for translucent apps Bug: 77813801 Change-Id: I70bd77aa56ee7988e2af1b602884739837478c39 --- .../quickstep/views/TaskThumbnailView.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index 6473d1645b..2f7199be91 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -148,20 +148,18 @@ public class TaskThumbnailView extends View { } int width = getMeasuredWidth(); int height = getMeasuredHeight(); - if (mClipBottom > 0 && !mTask.isLocked) { - canvas.save(); - canvas.clipRect(0, 0, width, mClipBottom); - canvas.drawRoundRect(0, 0, width, height, mCornerRadius, mCornerRadius, mPaint); - canvas.restore(); - canvas.save(); - canvas.clipRect(0, mClipBottom, width, height); - canvas.drawRoundRect(0, 0, width, height, mCornerRadius, mCornerRadius, - mBackgroundPaint); - canvas.restore(); - } else { - canvas.drawRoundRect(0, 0, width, height, mCornerRadius, - mCornerRadius, mTask.isLocked ? mBackgroundPaint : mPaint); + // Always draw the background since the snapshots may be translucent + canvas.drawRoundRect(0, 0, width, height, mCornerRadius, mCornerRadius, mBackgroundPaint); + if (!mTask.isLocked) { + if (mClipBottom > 0) { + canvas.save(); + canvas.clipRect(0, 0, width, mClipBottom); + canvas.drawRoundRect(0, 0, width, height, mCornerRadius, mCornerRadius, mPaint); + canvas.restore(); + } else { + canvas.drawRoundRect(0, 0, width, height, mCornerRadius, mCornerRadius, mPaint); + } } } From 6275b0ae7e3b12f7a5065ae920ac2313420457ba Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 18 Apr 2018 16:54:59 -0700 Subject: [PATCH 056/257] Fixing flakiness in shape detection The shape detection logic was setting a transform on the mask path, which overrides the original transform set by the drawable, which causes it to give different transforms depending on how many times the method is called. Bug: 77875383 Change-Id: I3054b8f48ba698a6c7866ed27e1129665b79c447 --- src/com/android/launcher3/graphics/IconNormalizer.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/graphics/IconNormalizer.java b/src/com/android/launcher3/graphics/IconNormalizer.java index 680c020228..81f3f90ea6 100644 --- a/src/com/android/launcher3/graphics/IconNormalizer.java +++ b/src/com/android/launcher3/graphics/IconNormalizer.java @@ -80,6 +80,7 @@ public class IconNormalizer { private final float[] mLeftBorder; private final float[] mRightBorder; private final Rect mBounds; + private final Path mShapePath; private final Matrix mMatrix; private final Paint mPaintIcon; @@ -116,6 +117,7 @@ public class IconNormalizer { mPaintMaskShapeOutline.setColor(Color.BLACK); mPaintMaskShapeOutline.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); + mShapePath = new Path(); mMatrix = new Matrix(); mAdaptiveIconScale = SCALE_NOT_INITIALIZED; } @@ -146,13 +148,13 @@ public class IconNormalizer { mMatrix.reset(); mMatrix.setScale(mBounds.width(), mBounds.height()); mMatrix.postTranslate(mBounds.left, mBounds.top); - maskPath.transform(mMatrix); + maskPath.transform(mMatrix, mShapePath); // XOR operation - mCanvasARGB.drawPath(maskPath, mPaintMaskShape); + mCanvasARGB.drawPath(mShapePath, mPaintMaskShape); // DST_OUT operation around the mask path outline - mCanvasARGB.drawPath(maskPath, mPaintMaskShapeOutline); + mCanvasARGB.drawPath(mShapePath, mPaintMaskShapeOutline); // Check if the result is almost transparent return isTransparentBitmap(mBitmapARGB); From f8f126c03e679ea455a0490ac8a4a42ed6a9c42f Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 18 Apr 2018 17:00:56 -0700 Subject: [PATCH 057/257] Removing scrolling to 0 This caused regressions in flip-order mode. Will figure our later what should replace it when clear-all is enabled. Bug: 72222505 Test: Manual Change-Id: Ie3d65f550935a26efa8e8e31594dbe8f35ba1f71 --- quickstep/src/com/android/quickstep/views/RecentsView.java | 1 - 1 file changed, 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index c602392d03..29d999dd3b 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -531,7 +531,6 @@ public abstract class RecentsView unloadVisibleTaskData(); setCurrentPage(0); - scrollTo(0, 0); OverviewCallbacks.get(getContext()).onResetOverview(); } From 5c74f7bb59b936d11c9562ce9b04663ea0dc6a7c Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Tue, 17 Apr 2018 22:03:54 -0700 Subject: [PATCH 058/257] Implement swipe up and quick scrub onboarding (Pt. Launcher) SysUI change: ag/3914771 Bug: 70180942 Test: manual test Change-Id: I42ade28ebad6dcbbcee6dfb80791f22f36e78290 --- quickstep/libs/sysui_shared.jar | Bin 122460 -> 122700 bytes .../LandscapeEdgeSwipeController.java | 4 ++++ .../PortraitStatesTouchController.java | 4 ++++ .../com/android/quickstep/RecentsModel.java | 15 +++++++++++++++ .../WindowTransformSwipeHandler.java | 1 + 5 files changed, 24 insertions(+) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 8e2f2f1fc0f5b48660585b761f2de3b3a2a32edf..19a9b179eae5bf0c62637a77f083f48cae08da8e 100644 GIT binary patch delta 8541 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 diff --git a/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java b/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java index 3622fc4250..a7cf545314 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java @@ -12,6 +12,7 @@ import com.android.launcher3.LauncherState; import com.android.launcher3.touch.AbstractStateChangeTouchController; import com.android.launcher3.touch.SwipeDetector; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; +import com.android.quickstep.RecentsModel; import com.android.quickstep.util.SysuiEventLogger; /** @@ -19,6 +20,8 @@ import com.android.quickstep.util.SysuiEventLogger; */ public class LandscapeEdgeSwipeController extends AbstractStateChangeTouchController { + private static final String TAG = "LandscapeEdgeSwipeCtrl"; + public LandscapeEdgeSwipeController(Launcher l) { super(l, SwipeDetector.HORIZONTAL); } @@ -69,6 +72,7 @@ public class LandscapeEdgeSwipeController extends AbstractStateChangeTouchContro protected void onSwipeInteractionCompleted(LauncherState targetState, int logAction) { super.onSwipeInteractionCompleted(targetState, logAction); if (mFromState == NORMAL && targetState == OVERVIEW) { + RecentsModel.getInstance(mLauncher).onOverviewShown(true, TAG); SysuiEventLogger.writeDummyRecentsTransition(0); } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java index 9f21a950f7..2e95c04e31 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java @@ -39,6 +39,7 @@ import com.android.launcher3.touch.AbstractStateChangeTouchController; import com.android.launcher3.touch.SwipeDetector; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.quickstep.RecentsModel; import com.android.quickstep.TouchInteractionService; import com.android.quickstep.util.SysuiEventLogger; import com.android.quickstep.views.RecentsView; @@ -49,6 +50,8 @@ import com.android.quickstep.views.TaskView; */ public class PortraitStatesTouchController extends AbstractStateChangeTouchController { + private static final String TAG = "PortraitStatesTouchCtrl"; + private static final float TOTAL_DISTANCE_MULTIPLIER = 3f; private static final float LINEAR_SCALE_LIMIT = 1 / TOTAL_DISTANCE_MULTIPLIER; @@ -284,6 +287,7 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr protected void onSwipeInteractionCompleted(LauncherState targetState, int logAction) { super.onSwipeInteractionCompleted(targetState, logAction); if (mFromState == NORMAL && targetState == OVERVIEW) { + RecentsModel.getInstance(mLauncher).onOverviewShown(true, TAG); SysuiEventLogger.writeDummyRecentsTransition(0); } } diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index 4652f2d656..70b0355b09 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -26,8 +26,10 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.os.Looper; +import android.os.RemoteException; import android.os.UserHandle; import android.support.annotation.WorkerThread; +import android.util.Log; import android.util.LruCache; import android.util.SparseArray; import android.view.accessibility.AccessibilityManager; @@ -234,6 +236,19 @@ public class RecentsModel extends TaskStackChangeListener { mRecentsTaskLoader.onTrimMemory(level); } + public void onOverviewShown(boolean fromHome, String tag) { + if (mSystemUiProxy == null) { + return; + } + try { + mSystemUiProxy.onOverviewShown(fromHome); + } catch (RemoteException e) { + Log.w(tag, + "Failed to notify SysUI of overview shown from " + (fromHome ? "home" : "app") + + ": ", e); + } + } + @WorkerThread public void preloadAssistData(int taskId, Bundle data) { mMainThreadExecutor.execute(() -> { diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 99e9451534..1d06752ca3 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -698,6 +698,7 @@ public class WindowTransformSwipeHandler { // If we haven't posted the transition end runnable, run it now finishTransitionRunnable.run(); } + RecentsModel.getInstance(mContext).onOverviewShown(false, TAG); doLogGesture(true /* toLauncher */); } From 9a68a9ea62f566a511a7750083c42ea74c2f4f4e Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 18 Apr 2018 18:49:39 -0700 Subject: [PATCH 059/257] Small tweaks to positioning Clear-all button Bug: 72222505 Test: Manual Change-Id: I920a1d712e4f72ed66cf0c31cb77cf949339b2c6 --- quickstep/res/layout/overview_clear_all_button.xml | 2 ++ .../android/quickstep/views/RecentsViewContainer.java | 11 +++-------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/quickstep/res/layout/overview_clear_all_button.xml b/quickstep/res/layout/overview_clear_all_button.xml index 8632f8bbd0..79d8a615e1 100644 --- a/quickstep/res/layout/overview_clear_all_button.xml +++ b/quickstep/res/layout/overview_clear_all_button.xml @@ -1,6 +1,7 @@ \ No newline at end of file diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index fe668c6f8e..ece78c1fdc 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -1,7 +1,5 @@ package com.android.quickstep.views; -import static com.android.quickstep.views.RecentsView.DEBUG_SHOW_CLEAR_ALL_BUTTON; - import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; @@ -49,10 +47,8 @@ public class RecentsViewContainer extends InsettableFrameLayout { } @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - - if (!changed || !DEBUG_SHOW_CLEAR_ALL_BUTTON) return; + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); mRecentsView.getTaskSize(mTempRect); @@ -60,8 +56,7 @@ public class RecentsViewContainer extends InsettableFrameLayout { (mClearAllButton.getMeasuredWidth() - getResources().getDimension( R.dimen.clear_all_container_width)) / 2); mClearAllButton.setTranslationY( - mTempRect.top + (mTempRect.height() - mClearAllButton.getMeasuredHeight()) / 2 - - mClearAllButton.getTop()); + mTempRect.top + (mTempRect.height() - mClearAllButton.getMeasuredHeight()) / 2); } @Override From 40253329c5c94088b8d4b16b8b9fd17af32fb0d7 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 19 Apr 2018 09:27:38 -0700 Subject: [PATCH 060/257] Bringing back auto-rotate settings Bug: 77654352 Change-Id: I0910fc8afe2fb7e125d57912abc35bbbd5df9d74 --- .../res/xml/indexable_launcher_prefs.xml | 10 +++- res/values/strings.xml | 6 ++ res/xml/launcher_preferences.xml | 9 ++- .../android/launcher3/SettingsActivity.java | 41 +++++++++++++ .../launcher3/states/RotationHelper.java | 60 ++++++++++++------- 5 files changed, 99 insertions(+), 27 deletions(-) diff --git a/quickstep/res/xml/indexable_launcher_prefs.xml b/quickstep/res/xml/indexable_launcher_prefs.xml index 2655402015..30f310021f 100644 --- a/quickstep/res/xml/indexable_launcher_prefs.xml +++ b/quickstep/res/xml/indexable_launcher_prefs.xml @@ -20,8 +20,14 @@ android:key="pref_add_icon_to_home" android:title="@string/auto_add_shortcuts_label" android:summary="@string/auto_add_shortcuts_description" - android:defaultValue="true" - /> + android:defaultValue="true" /> + + Disabled by your admin + + Allow Home screen rotation + + When phone is rotated + + Current Display setting doesn\'t permit rotation Notification dots diff --git a/res/xml/launcher_preferences.xml b/res/xml/launcher_preferences.xml index 7bb19f3343..dde2c5c170 100644 --- a/res/xml/launcher_preferences.xml +++ b/res/xml/launcher_preferences.xml @@ -34,8 +34,13 @@ android:title="@string/auto_add_shortcuts_label" android:summary="@string/auto_add_shortcuts_description" android:defaultValue="true" - android:persistent="true" - /> + android:persistent="true" /> + + = 600; + } + return false; + } public static final int REQUEST_NONE = 0; public static final int REQUEST_ROTATE = 1; public static final int REQUEST_LOCK = 2; private final Activity mActivity; - private final ContentResolver mCr; + private final SharedPreferences mPrefs; private final boolean mIgnoreAutoRotateSettings; private boolean mAutoRotateEnabled; @@ -60,23 +75,24 @@ public class RotationHelper extends ContentObserver { private int mLastActivityFlags = -1; public RotationHelper(Activity activity) { - super(new Handler()); mActivity = activity; // On large devices we do not handle auto-rotate differently. mIgnoreAutoRotateSettings = mActivity.getResources().getBoolean(R.bool.allow_rotation); if (!mIgnoreAutoRotateSettings) { - mCr = mActivity.getContentResolver(); - mCr.registerContentObserver(getUriFor(ACCELEROMETER_ROTATION), false, this); - mAutoRotateEnabled = Settings.System.getInt(mCr, ACCELEROMETER_ROTATION, 1) == 1; + mPrefs = Utilities.getPrefs(mActivity); + mPrefs.registerOnSharedPreferenceChangeListener(this); + mAutoRotateEnabled = mPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY, + getAllowRotationDefaultValue()); } else { - mCr = null; + mPrefs = null; } } @Override - public void onChange(boolean selfChange) { - mAutoRotateEnabled = Settings.System.getInt(mCr, ACCELEROMETER_ROTATION, 1) == 1; + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { + mAutoRotateEnabled = mPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY, + getAllowRotationDefaultValue()); notifyChange(); } @@ -104,8 +120,8 @@ public class RotationHelper extends ContentObserver { public void destroy() { if (!mDestroyed) { mDestroyed = true; - if (mCr != null) { - mCr.unregisterContentObserver(this); + if (mPrefs != null) { + mPrefs.unregisterOnSharedPreferenceChangeListener(this); } } } @@ -121,19 +137,17 @@ public class RotationHelper extends ContentObserver { SCREEN_ORIENTATION_LOCKED : SCREEN_ORIENTATION_UNSPECIFIED; } else if (mCurrentStateRequest == REQUEST_LOCK) { activityFlags = SCREEN_ORIENTATION_LOCKED; - } else if (mIgnoreAutoRotateSettings || mCurrentStateRequest == REQUEST_ROTATE) { + } else if (mIgnoreAutoRotateSettings || mCurrentStateRequest == REQUEST_ROTATE + || mAutoRotateEnabled) { activityFlags = SCREEN_ORIENTATION_UNSPECIFIED; - } else if (mAutoRotateEnabled) { - // If auto rotation is on, lock to device orientation - activityFlags = SCREEN_ORIENTATION_NOSENSOR; } else { // If auto rotation is off, allow rotation on the activity, in case the user is using // forced rotation. - activityFlags = SCREEN_ORIENTATION_UNSPECIFIED; + activityFlags = SCREEN_ORIENTATION_NOSENSOR; } if (activityFlags != mLastActivityFlags) { mLastActivityFlags = activityFlags; - mActivity.setRequestedOrientation(mLastActivityFlags); + mActivity.setRequestedOrientation(activityFlags); } } } From e8cf0ae61f277873f16def76d16f3107cb3ea49a Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Thu, 19 Apr 2018 12:33:57 -0700 Subject: [PATCH 061/257] Centering empty icon. This is more correct way that what was rolled back here: ag/3922402. Bug: 72222505 Test: Manual Change-Id: I2cc4549db9b6a5965523d13ffde768b3e28bc7a6 --- .../src/com/android/quickstep/views/RecentsView.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 29d999dd3b..5e55590d47 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -945,7 +945,14 @@ public abstract class RecentsView mEmptyTextLayout = null; } - if (mShowEmptyMessage && hasValidSize && mEmptyTextLayout == null) { + if (!mShowEmptyMessage) return; + + // The icon needs to be centered. Need to scoll to horizontal 0 because with Clear-All + // space on the right, it's not guaranteed that after deleting all tasks, the horizontal + // scroll position will be zero. + scrollTo(0, 0); + + if (hasValidSize && mEmptyTextLayout == null) { mLastMeasureSize.set(getWidth(), getHeight()); int availableWidth = mLastMeasureSize.x - mEmptyMessagePadding - mEmptyMessagePadding; mEmptyTextLayout = StaticLayout.Builder.obtain(mEmptyMessage, 0, mEmptyMessage.length(), From 7d2e40912eb7007e8378f106556b4cbcbc24d661 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 19 Apr 2018 15:50:31 -0700 Subject: [PATCH 062/257] Updating the task swipe-down UI Bug: 77281732 Change-Id: I1bbc1bbeee74983b3fde5e8218e08689f32ac717 --- .../fallback/FallbackRecentsView.java | 1 - .../quickstep/util/ClipAnimationHelper.java | 77 ++++++++++++++ .../quickstep/util/TaskViewDrawable.java | 100 ++++++++++++++++++ .../quickstep/views/LauncherRecentsView.java | 8 ++ .../android/quickstep/views/RecentsView.java | 38 ++++--- .../quickstep/views/TaskThumbnailView.java | 22 ++-- .../com/android/quickstep/views/TaskView.java | 4 + 7 files changed, 226 insertions(+), 24 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/util/TaskViewDrawable.java diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 5a8ce160a2..3d64cc8c71 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -18,7 +18,6 @@ package com.android.quickstep.fallback; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; -import android.support.annotation.AnyThread; import android.util.AttributeSet; import android.view.View; diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index 9276d23810..9dd83d20a6 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -15,15 +15,23 @@ */ package com.android.quickstep.util; +import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Matrix.ScaleToFit; import android.graphics.Rect; import android.graphics.RectF; +import com.android.launcher3.BaseDraggingActivity; +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.dragndrop.DragLayer; +import com.android.launcher3.views.BaseDragLayer; +import com.android.quickstep.views.TaskThumbnailView; import com.android.systemui.shared.recents.utilities.RectFEvaluator; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.TransactionCompat; +import com.android.systemui.shared.system.WindowManagerWrapper; /** * Utility class to handle window clip animation @@ -126,4 +134,73 @@ public class ClipAnimationHelper { mTargetRect.offset(offsetX, offsetY); } } + + public void fromTaskThumbnailView(TaskThumbnailView ttv) { + BaseDraggingActivity activity = BaseDraggingActivity.fromContext(ttv.getContext()); + BaseDragLayer dl = activity.getDragLayer(); + + int[] pos = new int[2]; + dl.getLocationOnScreen(pos); + mHomeStackBounds.set(0, 0, dl.getWidth(), dl.getHeight()); + mHomeStackBounds.offset(pos[0], pos[1]); + + if (activity.isInMultiWindowModeCompat()) { + // TODO: Fetch multi-window target bounds from system-ui + DeviceProfile fullDp = activity.getDeviceProfile().getFullScreenProfile(); + // Use availableWidthPx and availableHeightPx instead of widthPx and heightPx to + // account for system insets + int taskWidth = fullDp.availableWidthPx; + int taskHeight = fullDp.availableHeightPx; + int halfDividerSize = activity.getResources() + .getDimensionPixelSize(R.dimen.multi_window_task_divider_size) / 2; + + Rect insets = new Rect(); + WindowManagerWrapper.getInstance().getStableInsets(insets); + if (fullDp.isLandscape) { + taskWidth = taskWidth / 2 - halfDividerSize; + } else { + taskHeight = taskHeight / 2 - halfDividerSize; + } + + mSourceStackBounds.set(0, 0, taskWidth, taskHeight); + // Align the task to bottom right (probably not true for seascape). + mSourceStackBounds.offset(insets.left + fullDp.availableWidthPx - taskWidth, + insets.top + fullDp.availableHeightPx - taskHeight); + } else { + mSourceStackBounds.set(mHomeStackBounds); + mSourceInsets.set(activity.getDeviceProfile().getInsets()); + } + + Rect targetRect = new Rect(); + dl.getDescendantRectRelativeToSelf(ttv, targetRect); + updateTargetRect(targetRect); + + // Transform the clip relative to the target rect. + float scale = mTargetRect.width() / mSourceRect.width(); + mSourceWindowClipInsets.left = mSourceWindowClipInsets.left * scale; + mSourceWindowClipInsets.top = mSourceWindowClipInsets.top * scale; + mSourceWindowClipInsets.right = mSourceWindowClipInsets.right * scale; + mSourceWindowClipInsets.bottom = mSourceWindowClipInsets.bottom * scale; + } + + public void drawForProgress(TaskThumbnailView ttv, Canvas canvas, float progress) { + RectF currentRect; + synchronized (mTargetRect) { + currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTargetRect); + } + + canvas.translate(mSourceStackBounds.left - mHomeStackBounds.left, + mSourceStackBounds.top - mHomeStackBounds.top); + mTmpMatrix.setRectToRect(mTargetRect, currentRect, ScaleToFit.FILL); + canvas.concat(mTmpMatrix); + canvas.translate(mTargetRect.left, mTargetRect.top); + + float insetProgress = (1 - progress); + ttv.drawOnCanvas(canvas, + -mSourceWindowClipInsets.left * insetProgress, + -mSourceWindowClipInsets.top * insetProgress, + ttv.getMeasuredWidth() + mSourceWindowClipInsets.right * insetProgress, + ttv.getMeasuredHeight() + mSourceWindowClipInsets.bottom * insetProgress, + ttv.getCornerRadius() * progress); + } } diff --git a/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java b/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java new file mode 100644 index 0000000000..0fa0023aad --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.util; + +import android.animation.TimeInterpolator; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; +import android.util.FloatProperty; +import android.widget.ImageView; + +import com.android.launcher3.Utilities; +import com.android.quickstep.views.RecentsView; +import com.android.quickstep.views.TaskThumbnailView; +import com.android.quickstep.views.TaskView; + +public class TaskViewDrawable extends Drawable { + + public static FloatProperty PROGRESS = + new FloatProperty("progress") { + @Override + public void setValue(TaskViewDrawable taskViewDrawable, float v) { + taskViewDrawable.setProgress(v); + } + + @Override + public Float get(TaskViewDrawable taskViewDrawable) { + return taskViewDrawable.mProgress; + } + }; + + private static final TimeInterpolator ICON_SIZE_INTERPOLATOR = + (t) -> (Math.max(t, 0.3f) - 0.3f) / 0.7f; + + private final RecentsView mParent; + private final ImageView mIconView; + private final int[] mIconPos; + + private final TaskThumbnailView mThumbnailView; + + private final ClipAnimationHelper mClipAnimationHelper; + + private float mProgress = 1; + + public TaskViewDrawable(TaskView tv, RecentsView parent) { + mParent = parent; + mIconView = tv.getIconView(); + mIconPos = new int[2]; + Utilities.getDescendantCoordRelativeToAncestor(mIconView, parent, mIconPos, true); + + mThumbnailView = tv.getThumbnail(); + mClipAnimationHelper = new ClipAnimationHelper(); + mClipAnimationHelper.fromTaskThumbnailView(mThumbnailView); + } + + public void setProgress(float progress) { + mProgress = progress; + mParent.invalidate(); + } + + @Override + public void draw(Canvas canvas) { + canvas.save(); + canvas.translate(mParent.getScrollX(), mParent.getScrollY()); + mClipAnimationHelper.drawForProgress(mThumbnailView, canvas, mProgress); + canvas.restore(); + + canvas.save(); + canvas.translate(mIconPos[0], mIconPos[1]); + float scale = ICON_SIZE_INTERPOLATOR.getInterpolation(mProgress); + canvas.scale(scale, scale, mIconView.getWidth() / 2, mIconView.getHeight() / 2); + mIconView.draw(canvas); + canvas.restore(); + } + + @Override + public void setAlpha(int i) { } + + @Override + public void setColorFilter(ColorFilter colorFilter) { } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } +} diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 280fd467b6..90b4bd2c35 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -130,4 +130,12 @@ public class LauncherRecentsView extends RecentsView { protected void getTaskSize(DeviceProfile dp, Rect outRect) { LayoutUtils.calculateLauncherTaskSize(getContext(), dp, outRect); } + + @Override + protected void onTaskLaunched(boolean success) { + if (success) { + mActivity.getStateManager().goToState(NORMAL, false /* animate */); + } + super.onTaskLaunched(success); + } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 29d999dd3b..f369016c7a 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -66,10 +66,10 @@ import com.android.launcher3.util.PendingAnimation; import com.android.launcher3.util.Themes; import com.android.quickstep.OverviewCallbacks; import com.android.quickstep.QuickScrubController; -import com.android.quickstep.RecentsAnimationInterpolator; import com.android.quickstep.RecentsAnimationInterpolator.TaskWindowBounds; import com.android.quickstep.RecentsModel; import com.android.quickstep.TaskUtils; +import com.android.quickstep.util.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; @@ -79,6 +79,7 @@ import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; +import java.util.function.Consumer; /** * A list of recent tasks. @@ -522,7 +523,6 @@ public abstract class RecentsView mHasVisibleTaskData.clear(); } - protected abstract void onAllTasksRemoved(); public void reset() { @@ -1053,23 +1053,27 @@ public abstract class RecentsView return new PendingAnimation(anim); } - final RecentsAnimationInterpolator recentsInterpolator = tv.getRecentsInterpolator(); - ValueAnimator targetViewAnim = ValueAnimator.ofFloat(0, 1); - targetViewAnim.addUpdateListener((animation) -> { - float percent = animation.getAnimatedFraction(); - TaskWindowBounds tw = recentsInterpolator.interpolate(percent); - tv.setScaleX(tw.taskScale); - tv.setScaleY(tw.taskScale); - tv.setTranslationX(tw.taskX); - tv.setTranslationY(tw.taskY); - }); - anim.play(targetViewAnim); + tv.setVisibility(INVISIBLE); + TaskViewDrawable drawable = new TaskViewDrawable(tv, this); + getOverlay().add(drawable); + + ObjectAnimator drawableAnim = + ObjectAnimator.ofFloat(drawable, TaskViewDrawable.PROGRESS, 1, 0); + drawableAnim.setInterpolator(LINEAR); + + anim.play(drawableAnim); anim.setDuration(duration); + Consumer onTaskLaunchFinish = (r) -> { + onTaskLaunched(r); + tv.setVisibility(VISIBLE); + getOverlay().remove(drawable); + }; + mPendingAnimation = new PendingAnimation(anim); mPendingAnimation.addEndListener((onEndListener) -> { if (onEndListener.isSuccess) { - tv.launchTask(false); + tv.launchTask(false, onTaskLaunchFinish, getHandler()); Task task = tv.getTask(); if (task != null) { mActivity.getUserEventDispatcher().logTaskLaunchOrDismiss( @@ -1077,13 +1081,17 @@ public abstract class RecentsView TaskUtils.getComponentKeyForTask(task.key)); } } else { - resetTaskVisuals(); + onTaskLaunchFinish.accept(false); } mPendingAnimation = null; }); return mPendingAnimation; } + protected void onTaskLaunched(boolean success) { + resetTaskVisuals(); + } + @Override protected void notifyPageSwitchListener(int prevPage) { super.notifyPageSwitchListener(prevPage); diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index 2f7199be91..592166d806 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -143,22 +143,28 @@ public class TaskThumbnailView extends View { @Override protected void onDraw(Canvas canvas) { + drawOnCanvas(canvas, 0, 0, getMeasuredWidth(), getMeasuredHeight(), mCornerRadius); + } + + public float getCornerRadius() { + return mCornerRadius; + } + + public void drawOnCanvas(Canvas canvas, float x, float y, float width, float height, + float cornerRadius) { + // Always draw the background since the snapshots may be translucent + canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mBackgroundPaint); if (mTask == null) { return; } - int width = getMeasuredWidth(); - int height = getMeasuredHeight(); - - // Always draw the background since the snapshots may be translucent - canvas.drawRoundRect(0, 0, width, height, mCornerRadius, mCornerRadius, mBackgroundPaint); if (!mTask.isLocked) { if (mClipBottom > 0) { canvas.save(); - canvas.clipRect(0, 0, width, mClipBottom); - canvas.drawRoundRect(0, 0, width, height, mCornerRadius, mCornerRadius, mPaint); + canvas.clipRect(x, y, width, mClipBottom); + canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mPaint); canvas.restore(); } else { - canvas.drawRoundRect(0, 0, width, height, mCornerRadius, mCornerRadius, mPaint); + canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mPaint); } } } diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 2c1318c481..b32d8dd45d 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -131,6 +131,10 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback return mSnapshotView; } + public ImageView getIconView() { + return mIconView; + } + public void launchTask(boolean animate) { launchTask(animate, null, null); } From 4473658c2fbf2bc04ad457c8f7fb23036f9eb2a2 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Thu, 19 Apr 2018 18:43:04 -0700 Subject: [PATCH 063/257] Not ignoring insets for Clear-all button When in portrait mode with nav bar on the right , we need the right inset to be applied to the layout. Bug: 72222505 Test: Manual Change-Id: I06ac864097fb3cfb833de3e40921be4e19eb5f54 --- quickstep/res/layout/overview_clear_all_button.xml | 2 -- .../src/com/android/quickstep/views/RecentsViewContainer.java | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/quickstep/res/layout/overview_clear_all_button.xml b/quickstep/res/layout/overview_clear_all_button.xml index 79d8a615e1..8632f8bbd0 100644 --- a/quickstep/res/layout/overview_clear_all_button.xml +++ b/quickstep/res/layout/overview_clear_all_button.xml @@ -1,7 +1,6 @@ \ No newline at end of file diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index ece78c1fdc..5aface85e8 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -56,7 +56,8 @@ public class RecentsViewContainer extends InsettableFrameLayout { (mClearAllButton.getMeasuredWidth() - getResources().getDimension( R.dimen.clear_all_container_width)) / 2); mClearAllButton.setTranslationY( - mTempRect.top + (mTempRect.height() - mClearAllButton.getMeasuredHeight()) / 2); + mTempRect.top + (mTempRect.height() - mClearAllButton.getMeasuredHeight()) / 2 + - mClearAllButton.getTop()); } @Override From f3d7328518201927e364c7a7529e311a4bb00607 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 20 Apr 2018 09:29:45 -0700 Subject: [PATCH 064/257] Using the activity size for swipe-dow animation in fallback+multiWindow mode Bug: 77281732 Change-Id: I2d652b801bcecd339fed00a43677b20d782997c6 --- .../com/android/quickstep/fallback/FallbackRecentsView.java | 5 +++++ .../src/com/android/quickstep/util/ClipAnimationHelper.java | 5 +++-- .../src/com/android/quickstep/util/TaskViewDrawable.java | 2 +- .../src/com/android/quickstep/views/LauncherRecentsView.java | 5 +++++ quickstep/src/com/android/quickstep/views/RecentsView.java | 2 ++ 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 3d64cc8c71..a4d3a50ff0 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -66,4 +66,9 @@ public class FallbackRecentsView extends RecentsView { LayoutUtils.calculateFallbackTaskSize(getContext(), dp, outRect); } + @Override + public boolean shouldUseMultiWindowTaskSizeStrategy() { + // Just use the activity task size for multi-window as well. + return false; + } } diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index 9dd83d20a6..2b621e8dc2 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -27,6 +27,7 @@ import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.views.BaseDragLayer; +import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskThumbnailView; import com.android.systemui.shared.recents.utilities.RectFEvaluator; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; @@ -135,7 +136,7 @@ public class ClipAnimationHelper { } } - public void fromTaskThumbnailView(TaskThumbnailView ttv) { + public void fromTaskThumbnailView(TaskThumbnailView ttv, RecentsView rv) { BaseDraggingActivity activity = BaseDraggingActivity.fromContext(ttv.getContext()); BaseDragLayer dl = activity.getDragLayer(); @@ -144,7 +145,7 @@ public class ClipAnimationHelper { mHomeStackBounds.set(0, 0, dl.getWidth(), dl.getHeight()); mHomeStackBounds.offset(pos[0], pos[1]); - if (activity.isInMultiWindowModeCompat()) { + if (rv.shouldUseMultiWindowTaskSizeStrategy()) { // TODO: Fetch multi-window target bounds from system-ui DeviceProfile fullDp = activity.getDeviceProfile().getFullScreenProfile(); // Use availableWidthPx and availableHeightPx instead of widthPx and heightPx to diff --git a/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java b/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java index 0fa0023aad..e1910a62be 100644 --- a/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java +++ b/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java @@ -64,7 +64,7 @@ public class TaskViewDrawable extends Drawable { mThumbnailView = tv.getThumbnail(); mClipAnimationHelper = new ClipAnimationHelper(); - mClipAnimationHelper.fromTaskThumbnailView(mThumbnailView); + mClipAnimationHelper.fromTaskThumbnailView(mThumbnailView, parent); } public void setProgress(float progress) { diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 90b4bd2c35..06e5311410 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -138,4 +138,9 @@ public class LauncherRecentsView extends RecentsView { } super.onTaskLaunched(success); } + + @Override + public boolean shouldUseMultiWindowTaskSizeStrategy() { + return mActivity.isInMultiWindowModeCompat(); + } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 6a2df0b878..a41b36e393 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1095,6 +1095,8 @@ public abstract class RecentsView return mPendingAnimation; } + public abstract boolean shouldUseMultiWindowTaskSizeStrategy(); + protected void onTaskLaunched(boolean success) { resetTaskVisuals(); } From 6c5e169de610b0dee24813e7126818d47fc6fc96 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 20 Apr 2018 11:32:03 -0700 Subject: [PATCH 065/257] Prevent unecessary invalidates updateEmptyMessage() calls invalidate() whenever size has changed. We were only updating mLastMeasuredSize when showing the empty message, however, so we were invalidating whenever updateEmptyMessage was called. Change-Id: Ic9046738e4f53d53aded6347a273522c53394991 --- quickstep/src/com/android/quickstep/views/RecentsView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 6a2df0b878..2e45d8320b 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -943,6 +943,7 @@ public abstract class RecentsView boolean hasValidSize = getWidth() > 0 && getHeight() > 0; if (sizeChanged && hasValidSize) { mEmptyTextLayout = null; + mLastMeasureSize.set(getWidth(), getHeight()); } if (!mShowEmptyMessage) return; @@ -953,7 +954,6 @@ public abstract class RecentsView scrollTo(0, 0); if (hasValidSize && mEmptyTextLayout == null) { - mLastMeasureSize.set(getWidth(), getHeight()); int availableWidth = mLastMeasureSize.x - mEmptyMessagePadding - mEmptyMessagePadding; mEmptyTextLayout = StaticLayout.Builder.obtain(mEmptyMessage, 0, mEmptyMessage.length(), mEmptyMessagePaint, availableWidth) From dcbd321095c11b132b0c788e2e12ad144fe17edd Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 20 Apr 2018 12:00:33 -0700 Subject: [PATCH 066/257] Import translations. DO NOT MERGE Change-Id: Iaf7e186dfb94e7ff47c048c9b8d4e0e1fb829b26 Auto-generated-cl: translation import --- go/res/values-bs-rBA/strings.xml | 26 +++++ go/res/values-et-rEE/strings.xml | 26 +++++ go/res/values-eu-rES/strings.xml | 26 +++++ go/res/values-gl-rES/strings.xml | 26 +++++ go/res/values-gu-rIN/strings.xml | 26 +++++ go/res/values-ky-rKG/strings.xml | 26 +++++ go/res/values-mr-rIN/strings.xml | 26 +++++ go/res/values-ta-rIN/strings.xml | 26 +++++ go/res/values-uz-rUZ/strings.xml | 26 +++++ 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-rBA/strings.xml | 29 +++++ 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-rEE/strings.xml | 29 +++++ quickstep/res/values-eu-rES/strings.xml | 29 +++++ quickstep/res/values-fr/strings.xml | 3 +- quickstep/res/values-gl-rES/strings.xml | 29 +++++ quickstep/res/values-gu-rIN/strings.xml | 29 +++++ quickstep/res/values-hi/strings.xml | 3 +- quickstep/res/values-hu/strings.xml | 3 +- quickstep/res/values-ky-rKG/strings.xml | 29 +++++ quickstep/res/values-mr-rIN/strings.xml | 29 +++++ 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-rIN/strings.xml | 29 +++++ quickstep/res/values-uz-rUZ/strings.xml | 29 +++++ 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-rBA/strings.xml | 145 ++++++++++++++++++++++++ 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-rEE/strings.xml | 144 +++++++++++++++++++++++ res/values-eu-rES/strings.xml | 144 +++++++++++++++++++++++ res/values-fr/strings.xml | 2 +- res/values-gl-rES/strings.xml | 144 +++++++++++++++++++++++ res/values-gu-rIN/strings.xml | 144 +++++++++++++++++++++++ res/values-hi/strings.xml | 2 +- res/values-hu/strings.xml | 2 +- res/values-ky-rKG/strings.xml | 144 +++++++++++++++++++++++ res/values-mr-rIN/strings.xml | 144 +++++++++++++++++++++++ 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-rIN/strings.xml | 144 +++++++++++++++++++++++ res/values-uz-rUZ/strings.xml | 144 +++++++++++++++++++++++ res/values-vi/strings.xml | 2 +- res/values-zh-rHK/strings.xml | 2 +- 60 files changed, 1849 insertions(+), 40 deletions(-) create mode 100644 go/res/values-bs-rBA/strings.xml create mode 100644 go/res/values-et-rEE/strings.xml create mode 100644 go/res/values-eu-rES/strings.xml create mode 100644 go/res/values-gl-rES/strings.xml create mode 100644 go/res/values-gu-rIN/strings.xml create mode 100644 go/res/values-ky-rKG/strings.xml create mode 100644 go/res/values-mr-rIN/strings.xml create mode 100644 go/res/values-ta-rIN/strings.xml create mode 100644 go/res/values-uz-rUZ/strings.xml create mode 100644 quickstep/res/values-bs-rBA/strings.xml create mode 100644 quickstep/res/values-et-rEE/strings.xml create mode 100644 quickstep/res/values-eu-rES/strings.xml create mode 100644 quickstep/res/values-gl-rES/strings.xml create mode 100644 quickstep/res/values-gu-rIN/strings.xml create mode 100644 quickstep/res/values-ky-rKG/strings.xml create mode 100644 quickstep/res/values-mr-rIN/strings.xml create mode 100644 quickstep/res/values-ta-rIN/strings.xml create mode 100644 quickstep/res/values-uz-rUZ/strings.xml create mode 100644 res/values-bs-rBA/strings.xml create mode 100644 res/values-et-rEE/strings.xml create mode 100644 res/values-eu-rES/strings.xml create mode 100644 res/values-gl-rES/strings.xml create mode 100644 res/values-gu-rIN/strings.xml create mode 100644 res/values-ky-rKG/strings.xml create mode 100644 res/values-mr-rIN/strings.xml create mode 100644 res/values-ta-rIN/strings.xml create mode 100644 res/values-uz-rUZ/strings.xml diff --git a/go/res/values-bs-rBA/strings.xml b/go/res/values-bs-rBA/strings.xml new file mode 100644 index 0000000000..3141b9d8fd --- /dev/null +++ b/go/res/values-bs-rBA/strings.xml @@ -0,0 +1,26 @@ + + + + + "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-et-rEE/strings.xml b/go/res/values-et-rEE/strings.xml new file mode 100644 index 0000000000..2513e65a33 --- /dev/null +++ b/go/res/values-et-rEE/strings.xml @@ -0,0 +1,26 @@ + + + + + "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-rES/strings.xml b/go/res/values-eu-rES/strings.xml new file mode 100644 index 0000000000..9949ef091d --- /dev/null +++ b/go/res/values-eu-rES/strings.xml @@ -0,0 +1,26 @@ + + + + + "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-gl-rES/strings.xml b/go/res/values-gl-rES/strings.xml new file mode 100644 index 0000000000..31621d5c2c --- /dev/null +++ b/go/res/values-gl-rES/strings.xml @@ -0,0 +1,26 @@ + + + + + "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-rIN/strings.xml b/go/res/values-gu-rIN/strings.xml new file mode 100644 index 0000000000..bdb549ff7f --- /dev/null +++ b/go/res/values-gu-rIN/strings.xml @@ -0,0 +1,26 @@ + + + + + "એક શૉર્ટકટ ચૂંટવા ટૅપ કરી રાખો." + "એક શૉર્ટકટ ચૂંટવા અથવા કોઈ કસ્ટમ ક્રિયાઓનો ઉપયોગ કરવા માટે બે વાર ટૅપ કરી રાખો." + "શૉર્ટકટ" + "%1$s શૉર્ટકટ" + diff --git a/go/res/values-ky-rKG/strings.xml b/go/res/values-ky-rKG/strings.xml new file mode 100644 index 0000000000..4c7e973cef --- /dev/null +++ b/go/res/values-ky-rKG/strings.xml @@ -0,0 +1,26 @@ + + + + + "Кыска жолду тандоо үчүн басып туруңуз." + "Кыска жолду тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." + "Кыска жолдор" + "%1$s кыска жол" + diff --git a/go/res/values-mr-rIN/strings.xml b/go/res/values-mr-rIN/strings.xml new file mode 100644 index 0000000000..2c767b4f19 --- /dev/null +++ b/go/res/values-mr-rIN/strings.xml @@ -0,0 +1,26 @@ + + + + + "शॉर्टकट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." + "शॉर्टकट निवडण्यासाठी किंवा कस्टम क्रिया वापरण्यासाठी दोनदा टॅप करा आणि धरून ठेवा." + "शॉर्टकट" + "%1$s शॉर्टकट" + diff --git a/go/res/values-ta-rIN/strings.xml b/go/res/values-ta-rIN/strings.xml new file mode 100644 index 0000000000..50059b65f9 --- /dev/null +++ b/go/res/values-ta-rIN/strings.xml @@ -0,0 +1,26 @@ + + + + + "குறுக்குவழியைச் சேர்க்க, தொட்டு பிடித்திருக்கவும்." + "குறுக்குவழியை சேர்க்க, இருமுறை தட்டிப் பிடித்திருக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." + "குறுக்குவழிகள்" + "%1$s குறுக்குவழிகள்" + diff --git a/go/res/values-uz-rUZ/strings.xml b/go/res/values-uz-rUZ/strings.xml new file mode 100644 index 0000000000..318bc15722 --- /dev/null +++ b/go/res/values-uz-rUZ/strings.xml @@ -0,0 +1,26 @@ + + + + + "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/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-rBA/strings.xml b/quickstep/res/values-bs-rBA/strings.xml new file mode 100644 index 0000000000..95285d2584 --- /dev/null +++ b/quickstep/res/values-bs-rBA/strings.xml @@ -0,0 +1,29 @@ + + + + + "Način rada podijeljenog ekrana" + "Zakači" + "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-rEE/strings.xml b/quickstep/res/values-et-rEE/strings.xml new file mode 100644 index 0000000000..b9cb5872d5 --- /dev/null +++ b/quickstep/res/values-et-rEE/strings.xml @@ -0,0 +1,29 @@ + + + + + "Jagatud ekraan" + "Kinnita" + "Ülevaade" + "Hiljutisi üksusi pole" + "Sule" + + + diff --git a/quickstep/res/values-eu-rES/strings.xml b/quickstep/res/values-eu-rES/strings.xml new file mode 100644 index 0000000000..5c0dd8f7d2 --- /dev/null +++ b/quickstep/res/values-eu-rES/strings.xml @@ -0,0 +1,29 @@ + + + + + "Zatitu pantaila" + "Ainguratu" + "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-rES/strings.xml b/quickstep/res/values-gl-rES/strings.xml new file mode 100644 index 0000000000..e2883cbeb0 --- /dev/null +++ b/quickstep/res/values-gl-rES/strings.xml @@ -0,0 +1,29 @@ + + + + + "Pantalla dividida" + "Fixar" + "Visión xeral" + "Non hai elementos recentes" + "Pecha a aplicación" + + + diff --git a/quickstep/res/values-gu-rIN/strings.xml b/quickstep/res/values-gu-rIN/strings.xml new file mode 100644 index 0000000000..416b361996 --- /dev/null +++ b/quickstep/res/values-gu-rIN/strings.xml @@ -0,0 +1,29 @@ + + + + + "સ્ક્રીનને વિભાજિત કરો" + "પિન કરો" + "ઝલક" + "તાજેતરની કોઈ આઇટમ નથી" + "બંધ કરો" + + + 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-rKG/strings.xml b/quickstep/res/values-ky-rKG/strings.xml new file mode 100644 index 0000000000..7924b11e82 --- /dev/null +++ b/quickstep/res/values-ky-rKG/strings.xml @@ -0,0 +1,29 @@ + + + + + "Экранды бөлүү" + "Кадап коюу" + "Сереп салуу" + "Акыркы колдонмолор жок" + "Жабуу" + + + diff --git a/quickstep/res/values-mr-rIN/strings.xml b/quickstep/res/values-mr-rIN/strings.xml new file mode 100644 index 0000000000..4d941378bb --- /dev/null +++ b/quickstep/res/values-mr-rIN/strings.xml @@ -0,0 +1,29 @@ + + + + + "विभाजित स्क्रीन" + "पिन करा" + "अवलोकन" + "कोणतेही अलीकडील आयटम नाहीत" + "बंद" + + + 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-rIN/strings.xml b/quickstep/res/values-ta-rIN/strings.xml new file mode 100644 index 0000000000..e372eea4d2 --- /dev/null +++ b/quickstep/res/values-ta-rIN/strings.xml @@ -0,0 +1,29 @@ + + + + + "திரைப் பிரிப்பு" + "பின் செய்தல்" + "மேலோட்டப் பார்வை" + "சமீபத்தியவை எதுவுமில்லை" + "மூடும்" + + + diff --git a/quickstep/res/values-uz-rUZ/strings.xml b/quickstep/res/values-uz-rUZ/strings.xml new file mode 100644 index 0000000000..fe68d74ca1 --- /dev/null +++ b/quickstep/res/values-uz-rUZ/strings.xml @@ -0,0 +1,29 @@ + + + + + "Ekranni ikkiga ajratish" + "Mahkamlash" + "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-rBA/strings.xml b/res/values-bs-rBA/strings.xml new file mode 100644 index 0000000000..fa88665060 --- /dev/null +++ b/res/values-bs-rBA/strings.xml @@ -0,0 +1,145 @@ + + + + + "Launcher3" + + "Posao" + "Aplikacija nije instalirana." + "Aplikacija nije dostupna" + "Preuzeta aplikacija je onemogućena u sigurnom načinu rada" + "Vidžeti su onemogućeni u sigurnom načinu rada." + "Prečica nije dostupna" + "Početni ekran" + "Prilagođene akcije" + "Dodirnite & i držite da biste uzeli dodatak." + "Dodirnite dvaput & i držite da biste uzeli vidžet ili koristite prilagođene radnje." + "%1$d × %2$d" + "Širina %1$d, visina %2$d" + "Dodirnite i držite da postavite ručno" + "Dodaj automatski" + "Pretražite aplikacije" + "Aplikacije se učitavaju…" + "Nije pronađena nijedna aplikacija za upit \"%1$s\"" + "Pretraži više aplikacija" + "Obavještenja" + "Dodirnite i držite da uzmete prečicu." + "Dodirnite dvaput i držite da uzmete prečicu ili koristite prilagođene akcije." + "Na ovom početnom ekranu nema više prostora." + "Nema više prostora u ladici Omiljeno" + "Spisak aplikacija" + "Lista ličnih aplikacija" + "Lista poslovnih aplikacija" + "Početna" + "Ukloni" + "Deinstaliraj" + "Informacije o aplikaciji" + "Instaliraj" + "instaliraj prečice" + "Dopušta aplikaciji dodavanje prečica bez posredovanja korisnika." + "čitaj postavke na početnom ekranu i prečice" + "Dopušta aplikaciji čitanje postavki i prečica na početnom ekranu." + "zapisuj postavke na početnom ekranu i prečice" + "Dopušta aplikaciji promjenu postavki i prečica na početnom ekranu." + "%1$s nema odobrenje da uspostavlja telefonske pozive" + "Problem pri učitavanju dodatka" + "Postavljanje" + "Ovo je sistemska aplikacija i ne može se deinstalirati." + "Neimenovani folder" + "Aplikacija %1$s je onemogućena" + + %1$s ima %2$d obavještenje + %1$s ima %2$d obavještenja + %1$s ima %2$d obavještenja + + "Strana %1$d od %2$d" + "Početni ekran %1$d od %2$d" + "Nova stranica početnog ekrana" + "Folder je otvoren, (š) %1$d (v) %2$d" + "Dodirnite da zatvorite folder" + "Dodirnite da sačuvate promjenu naziva" + "Folder je zatvoren" + "Ime foldera je promijenjeno u %1$s" + "Folder: %1$s" + "Dodaci" + "Pozadinske slike" + "Postavke početnog ekrana" + "Onemogućio vaš administrator" + "Tačke za obavještenja" + "Uključeno" + "Isključeno" + "Potreban je pristup obavještenjima" + "Za prikaz tačaka obavještenja, uključite obavještenja za aplikacije za aplikaciju %1$s" + "Promijeni postavke" + "Prikaži tačke za obavještenja" + "Dodaj ikonu na početni ekran" + "Za nove aplikacije" + "Promjena oblika ikona" + "na Početnom ekranu" + "Koristite sistemski zadano" + "Kvadrat" + "Zaobljeni kvadrat" + "Krug" + "Suza" + "Primjenjivanje promjena oblika ikona" + "Nepoznato" + "Ukloni" + "Traž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" + "%1$s čeka da se instalira" + "Vidžeti za aplikaciju %1$s" + "Dodaj na početni ekran" + "Premjesti stavku ovdje" + "Stavka je dodana na Početni ekran." + "Stavka je uklonjena" + "Premjesti stavku" + "Pomjeri stavku u red %1$s kolonu %2$s" + "Pomjeri stavku na poziciju %1$s" + "Pomjeri stavku na poziciju %1$s među omiljenim" + "Stavka je premještena" + "Dodaj u folder: %1$s" + "Dodaj u folder sa aplikacijom %1$s" + "Stavka je dodana u folder" + "Kreirajte folder sa stavkom: %1$s" + "Folder je kreiran" + "Pomjeri na početni ekran" + "Promijeni veličinu" + "Povećaj širinu" + "Povećaj visinu" + "Smanji širinu" + "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" + "Poslovne" + "Radni profil" + "Pronađite poslovne aplikacije ovdje" + "Svaka poslovna aplikacija ima značku i osigurava je vaša organizacija. Premjestite aplikacije na Početni ekran, radi lakšeg pristupa." + "Upravlja vaša organizacija" + "Notifikacije i aplikacije su isključene" + "Zatvori" + "Zatvoreno" + 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-rEE/strings.xml b/res/values-et-rEE/strings.xml new file mode 100644 index 0000000000..715e396031 --- /dev/null +++ b/res/values-et-rEE/strings.xml @@ -0,0 +1,144 @@ + + + + + "Launcher3" + + "Töö" + "Rakendus pole installitud." + "Rakendus ei ole saadaval" + "Allalaetud rakendus on turvarežiimis keelatud" + "Turvarežiimis on vidinad keelatud" + "Otsetee pole saadaval" + "Avaekraan" + "Kohandatud toimingud" + "Vidina valimiseks vajutage ja hoidke seda all." + "Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks." + "%1$d × %2$d" + "%1$d lai ja %2$d kõrge" + "Puudutage pikalt, et käsitsi asetada" + "Lisa automaatselt" + "Otsige rakendusi" + "Rakenduste laadimine …" + "Päringule „%1$s” ei vastanud ükski rakendus" + "Otsi rohkem rakendusi" + "Märguanded" + "Otsetee valimiseks puudutage seda pikalt." + "Topeltpuudutage ja hoidke otsetee valimiseks või kohandatud toimingute kasutamiseks." + "Sellel avaekraanil pole enam ruumi." + "Salves Lemmikud pole rohkem ruumi" + "Rakenduste loend" + "Isiklike rakenduste loend" + "Töörakenduste loend" + "Avaekraan" + "Eemalda" + "Desinstalli" + "Rakenduse teave" + "Installimine" + "installi otseteed" + "Võimaldab rakendusel lisada otseteid kasutaja sekkumiseta." + "loe avaekraani seadeid ja otseteid" + "Võimaldab rakendusel lugeda avaekraanil seadeid ja otseteid." + "kirjuta avaekraani seaded ja otseteed" + "Võimaldab rakendusel muuta avaekraanil seadeid ja otseteid." + "Rakendusel %1$s pole lubatud helistada" + "Probleem vidina laadimisel" + "Seadistamine" + "See on süsteemirakendus ja seda ei saa desinstallida." + "Nimetu kaust" + "Rakendus %1$s on keelatud" + + %1$s, %2$d märguannet + %1$s%2$d märguanne + + "Leht %1$d/%2$d" + "Avaekraan %1$d/%2$d" + "Uus avaekraan" + "Kaust on avatud, %1$d x %2$d" + "Puudutage kausta sulgemiseks" + "Puudutage ümbernimetamise salvestamiseks" + "Kaust on suletud" + "Kausta uus nimi: %1$s" + "Kaust: %1$s" + "Vidinad" + "Taustapildid" + "Avaekraani seaded" + "Keelas administraator" + "Märguandetäpid" + "Sees" + "Väljas" + "Vaja on juurdepääsu märguannetele" + "Märguandetäppide kuvamiseks lülitage sisse rakenduse %1$s märguanded" + "Seadete muutmine" + "Kuva märguandetäpid" + "Lisa ikoon avaekraanile" + "Uute rakenduste puhul" + "Ikooni kuju muutmine" + "avaekraanil" + "Kasuta süsteemi vaikeseadet" + "Ruut" + "Ümarate nurkadega ruut" + "Ring" + "Tilk" + "Ikooni kuju muudatuste rakendamine" + "Teadmata" + "Eemalda" + "Otsing" + "See rakendus ei ole installitud" + "Selle ikooni rakendust pole installitud. Saate selle eemaldada või rakendust otsida ja käsitsi installida." + "Rakenduse %1$s allalaadimine, %2$s on valmis" + "%1$s on installimise ootel" + "Teenuse %1$s vidinad" + "Lisa avaekraanile" + "Teisalda üksus siia" + "Üksus lisati avaekraanile" + "Üksus eemaldati" + "Teisalda üksus" + "Teisaldamine %1$s. rea %2$s. veergu" + "Teisaldamine %1$s. positsioonile" + "Teisaldamine lemmikute %1$s. positsioonile" + "Üksus teisaldati" + "Lisamine kausta: %1$s" + "Lisamine kausta nimega %1$s" + "Üksus lisati kausta" + "Kausta loomine nimega %1$s" + "Kaust on loodud" + "Teisalda avaekraanile" + "Muuda suurust" + "Suurenda laiust" + "Suurenda kõrgust" + "Vähenda laiust" + "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" + "Töö" + "Tööprofiil" + "Töörakendused leiate siit" + "Igal töörakendusel on märk ja teie organisatsioon tagab selle turvalisuse. Teisaldage rakendused avaekraanile, et neile oleks lihtsam juurde pääseda." + "Haldab teie organisatsioon" + "Märguanded ja rakendused on välja lülitatud" + "Sule" + "Suletud" + diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml new file mode 100644 index 0000000000..e25af961c7 --- /dev/null +++ b/res/values-eu-rES/strings.xml @@ -0,0 +1,144 @@ + + + + + "Launcher3" + + "Lana" + "Aplikazioa instalatu gabe dago." + "Ez dago erabilgarri aplikazioa" + "Deskargatutako aplikazioa modu seguruan desgaitu da" + "Widgetak desgaitu egin dira modu seguruan" + "Lasterbideak ez daude erabilgarri" + "Hasierako pantaila" + "Ekintza pertsonalizatuak" + "Eduki sakatuta widgeta aukeratzeko." + "Sakatu birritan eta eduki sakatuta widgeta aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." + "%1$d × %2$d" + "%1$d zabal eta %2$d luze" + "Eduki sakatuta eskuz gehitzeko" + "Gehitu automatikoki" + "Bilatu aplikazioetan" + "Aplikazioak kargatzen…" + "Ez da aurkitu \"%1$s\" bilaketaren emaitzarik" + "Bilatu aplikazio gehiago" + "Jakinarazpenak" + "Eduki sakatuta lasterbide bat aukeratzeko." + "Sakatu birritan eta eduki sakatuta lasterbide bat aukeratzeko edo ekintza pertsonalizatuak erabiltzeko." + "Hasierako pantaila honetan ez dago toki gehiago." + "Ez dago toki gehiago Gogokoak erretiluan" + "Aplikazioen zerrenda" + "Aplikazio pertsonalen zerrenda" + "Laneko aplikazioen zerrenda" + "Hasiera" + "Kendu" + "Desinstalatu" + "Aplikazioaren datuak" + "Instalatu" + "Instalatu lasterbideak" + "Erabiltzaileak ezer egin gabe lasterbideak gehitzea baimentzen die aplikazioei." + "Irakurri hasierako ezarpenak eta lasterbideak" + "Hasierako pantailako ezarpenak eta lasterbideak irakurtzea baimentzen die aplikazioei." + "Idatzi hasierako ezarpenak eta lasterbideak" + "Hasierako pantailako ezarpenak eta lasterbideak aldatzea baimentzen die aplikazioei." + "%1$s aplikazioak ez du telefono-deiak egiteko baimenik" + "Arazo bat izan da widgeta kargatzean" + "Konfigurazioa" + "Sistema-aplikazioa da hau eta ezin da desinstalatu." + "Izenik gabeko karpeta" + "%1$s desgaituta dago" + + %2$d jakinarazpen dauzka %1$s aplikazioak + %2$d jakinarazpen dauka %1$s aplikazioak + + "%1$d/%2$d orria" + "%1$d/%2$d hasierako pantaila" + "Hasierako pantailaren orri berria" + "Karpeta ireki da: %1$d x %2$d" + "Karpeta ixteko, sakatu hau" + "Izen berria gordetzeko, sakatu hau" + "Karpeta itxi da" + "Karpetari %1$s izena eman zaio" + "Karpeta: %1$s" + "Widgetak" + "Horma-paperak" + "Hasierako pantailaren ezarpenak" + "Administratzaileak desgaitu du" + "Jakinarazpen-biribiltxoak" + "Aktibatuta" + "Desaktibatuta" + "Jakinarazpenetarako sarbidea behar da" + "Jakinarazpen-biribiltxoak ikusteko, aktibatu %1$s aplikazioaren jakinarazpenak" + "Aldatu ezarpenak" + "Erakutsi jakinarazpen-biribiltxoak" + "Gehitu ikonoa hasierako pantailan" + "Aplikazio berrietan" + "Aldatu ikonoaren forma" + "Hasierako pantailan" + "Erabili sistemaren balio lehenetsiak" + "Karratua" + "Ertz biribilduko karratua" + "Zirkulua" + "Malkoa" + "Ikonoaren forman egindako aldaketak aplikatzen" + "Ezezaguna" + "Kendu" + "Bilatu" + "Aplikazio hau ez dago instalatuta" + "Ikono honen aplikazioa ez dago instalatuta. Ikonoa ken dezakezu, edo aplikazioa bilatu eta eskuz instalatu." + "%1$s deskargatzen, %2$s osatuta" + "%1$s instalatzeko zain" + "%1$s widgetak" + "Gehitu hasierako pantailan" + "Ekarri elementua hona" + "Gehitu da elementua hasierako pantailan" + "Kendu da elementua" + "Mugitu elementua" + "Eraman %1$s. errenkadara, %2$s. zutabera" + "Eraman %1$s. postura" + "Eraman gogokoen %1$s. postura" + "Elementua mugitu da" + "Gehitu %1$s karpetan" + "Gehitu %1$s duen karpetan" + "Elementua karpetan gehitu da" + "Sortu karpeta %1$s elementuarekin" + "Karpeta sortu da" + "Eraman hasierako pantailara" + "Aldatu tamaina" + "Handitu zabalera" + "Handitu altuera" + "Txikitu zabalera" + "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" + "Lanekoak" + "Laneko profila" + "Hemen dituzu laneko aplikazioak" + "Laneko aplikazio bakoitzak bereizgarri bat dauka eta erakundeak babesten du. Aplikazioak errazago atzitzeko, eraman itzazu hasierako pantailara." + "Erakundeak kudeatzen du" + "Jakinarazpenak eta aplikazioak desaktibatuta daude" + "Itxi" + "Itxita" + 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-gl-rES/strings.xml b/res/values-gl-rES/strings.xml new file mode 100644 index 0000000000..3817f075ea --- /dev/null +++ b/res/values-gl-rES/strings.xml @@ -0,0 +1,144 @@ + + + + + "Launcher3" + + "Traballo" + "A aplicación non está instalada" + "A aplicación non está dispoñible" + "A aplicación que descargaches está desactivada no modo seguro" + "Os widgets están desactivados no modo seguro" + "O atallo non está dispoñible" + "Pantalla de inicio" + "Accións personalizadas" + "Mantén premido un widget para seleccionalo." + "Toca dúas veces e mantén premido para seleccionar un widget ou utiliza accións personalizadas." + "%1$d × %2$d" + "%1$d de largo por %2$d de alto" + "Mantén premido o elemento para colocalo manualmente" + "Engadir automaticamente" + "Buscar aplicacións" + "Cargando aplicacións…" + "Non se atoparon aplicacións que coincidan con \"%1$s\"" + "Buscar máis aplicacións" + "Notificacións" + "Mantén premido un atallo para seleccionalo." + "Toca dúas veces e mantén premido para seleccionar un atallo ou utiliza accións personalizadas." + "Non hai máis espazo nesta pantalla de inicio." + "Non hai máis espazo na bandexa de favoritos" + "Lista de aplicacións" + "Lista de aplicacións persoais" + "Lista de aplicacións de traballo" + "Inicio" + "Eliminar" + "Desinstalar" + "Info. da aplicación" + "Instalar" + "instalar atallos" + "Permite a unha aplicación engadir atallos sen intervención do usuario." + "ler a configuración e os atallos da pantalla de inicio" + "Permite a unha aplicación ler a configuración e os atallos da páxina de inicio." + "modificar a configuración e os atallos da pantalla de inicio" + "Permite a unha aplicación cambiar a configuración e os atallos da pantalla de inicio." + "%1$s non ten permiso para facer chamadas telefónicas" + "Produciuse un problema ao cargar o widget" + "Configuración" + "Esta aplicación é do sistema e non se pode desinstalar." + "Cartafol sen nome" + "Desactivouse %1$s" + + %1$s, ten %2$d notificacións + %1$s, ten %2$d notificación + + "Páxina %1$d de %2$d" + "Pantalla de inicio %1$d de %2$d" + "Nova páxina da pantalla de inicio" + "Abriuse o cartafol, %1$d por %2$d" + "Toca fóra para pechar o cartafol" + "Toca fóra para cambiar o nome do cartafol" + "Pechouse o cartafol" + "O cartafol cambiou o nome a %1$s" + "Cartafol: %1$s" + "Widgets" + "Fondos de pantalla" + "Configuración da pantalla de Inicio" + "Función desactivada polo administrador" + "Puntos de notificacións" + "Activado" + "Desactivado" + "Necesítase acceso ás notificacións" + "Para que se mostren os puntos de notificacións, activa as notificacións da aplicación %1$s" + "Cambiar configuración" + "Mostrar puntos de notificación" + "Engadir icona á pantalla de inicio" + "Para novas aplicacións" + "Cambiar forma das iconas" + "na pantalla de inicio" + "Usar valores predeterminados do sistema" + "Cadrado" + "Cadrado de bordos redondeados" + "Círculo" + "Bágoa" + "Aplicando cambios na forma das iconas" + "Descoñecido" + "Eliminar" + "Buscar" + "Esta aplicación non está instalada" + "A aplicación para esta icona non está instalada. Podes eliminala ou buscar a aplicación e instalala manualmente." + "Descargando %1$s (%2$s completado)" + "Esperando para instalar %1$s" + "Widgets de: %1$s" + "Engadir á pantalla de inicio" + "Mover elemento aquí" + "Engadiuse o elemento á pantalla de inicio" + "Eliminouse o elemento" + "Mover elemento" + "Mover á fila %1$s columna %2$s" + "Mover á posición %1$s" + "Mover á posición dos favoritos %1$s" + "Moveuse o elemento" + "Engadir ao cartafol: %1$s" + "Engadir ao cartafol con %1$s" + "Engadiuse o elemento ao cartafol" + "Crear cartafol con: %1$s" + "Creouse o cartafol" + "Mover á pantalla de inicio" + "Cambiar tamaño" + "Aumentar ancho" + "Aumentar altura" + "Reducir ancho" + "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" + "Traballo" + "Perfil de traballo" + "Buscar aplicacións do traballo aquí" + "As aplicacións do traballo teñen unha insignia e están protexidas pola túa organización. Traslada as aplicacións á pantalla de inicio para acceder a elas de forma máis fácil." + "Perfil xestionado pola túa organización" + "As notificacións e as aplicacións están desactivadas" + "Pechar" + "Pechada" + diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml new file mode 100644 index 0000000000..efc953c809 --- /dev/null +++ b/res/values-gu-rIN/strings.xml @@ -0,0 +1,144 @@ + + + + + "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 બાય %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-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-rKG/strings.xml b/res/values-ky-rKG/strings.xml new file mode 100644 index 0000000000..eedf7fd101 --- /dev/null +++ b/res/values-ky-rKG/strings.xml @@ -0,0 +1,144 @@ + + + + + "Launcher3" + + "Жумуш" + "Колдонмо орнотулган эмес." + "Колдонмо жеткиликтүү эмес" + "Жүктөп алынган колдонмо Коопсуз режиминде иштен чыгарылды" + "Виджеттер Коопсуз режимде өчүрүлгөн" + "Кыска жол жок" + "Башкы экран" + "Ыңгайлаштырылган аракеттер" + "Виджетти тандаш үчүн, басып туруңуз" + "Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." + "%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" + "Жаңы башкы экран барагы" + "Фолдер ачылды, туурасы %1$d, бийиктиги %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-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml new file mode 100644 index 0000000000..8506b299a3 --- /dev/null +++ b/res/values-mr-rIN/strings.xml @@ -0,0 +1,144 @@ + + + + + "Launcher3" + + "कार्य" + "अॅप इंस्टॉल केलेला नाही." + "अॅप उपलब्ध नाही" + "डाउनलोड केलेला अ‍ॅप सुरक्षित मोड मध्‍ये अक्षम केला" + "विजेट सुरक्षित मोडमध्ये अक्षम झाले" + "शॉर्टकट उपलब्ध नाही" + "होम स्क्रीन" + "कस्टम क्रिया" + "विजेट निवडण्यासाठी स्पर्श करा आणि धरून ठेवा." + "एक विजेट निवडण्यासाठी दोनदा टॅप करा आणि धरून ठेवा किंवा कस्टम क्रिया वापरा." + "%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 मुख्य स्क्रीन" + "नवीन मुख्य स्क्रीन पृष्ठ" + "फोल्डर उघडले, %1$d बाय %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-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-rIN/strings.xml b/res/values-ta-rIN/strings.xml new file mode 100644 index 0000000000..d507be46cd --- /dev/null +++ b/res/values-ta-rIN/strings.xml @@ -0,0 +1,144 @@ + + + + + "Launcher3" + + "பணியிடம்" + "பயன்பாடு நிறுவப்படவில்லை." + "பயன்பாடு இல்லை" + "இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது" + "பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன" + "குறுக்குவழி இல்லை" + "முகப்புத் திரை" + "தனிப்பயன் செயல்கள்" + "விட்ஜெட்டைத் தேர்வுசெய்ய தொட்டுப் பிடிக்கவும்." + "விட்ஜெட்டைத் தேர்ந்தெடுக்க இருமுறை தட்டிப் பிடிக்கவும் அல்லது தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." + "%1$d × %2$d" + "%1$d அகலத்திற்கு %2$d உயரம்" + "நீங்களே சேர்க்க, தொட்டுப் பிடித்திருக்கவும்" + "தானாகவே சேர்" + "பயன்பாடுகளில் தேடுக" + "பயன்பாடுகளை ஏற்றுகிறது…" + "\"%1$s\" உடன் பொருந்தும் பயன்பாடுகள் இல்லை" + "கூடுதல் பயன்பாடுகளைத் தேடு" + "அறிவிப்புகள்" + "ஷார்ட்கட்டைச் சேர்க்க, தொட்டு பிடித்திருக்கவும்." + "ஷார்ட்கட்டைச் சேர்க்க, இருமுறை தட்டிப் பிடித்திருக்கவும் (அ) தனிப்பயன் செயல்களைப் பயன்படுத்தவும்." + "முகப்புத் திரையில் இடமில்லை." + "பிடித்தவை ட்ரேயில் இடமில்லை" + "பயன்பாடுகளின் பட்டியல்" + "தனிப்பட்ட ஆப்ஸ் பட்டியல்" + "பணி ஆப்ஸ் பட்டியல்" + "முகப்பு" + "அகற்று" + "நிறுவல் நீக்கு" + "பயன்பாட்டுத் தகவல்" + "நிறுவு" + "குறுக்குவழிகளை நிறுவுதல்" + "பயனரின் அனுமதி இல்லாமல் குறுக்குவழிகளைச் சேர்க்கப் பயன்பாட்டை அனுமதிக்கிறது." + "முகப்பின் அமைப்பு மற்றும் குறுக்குவழிகளைப் படித்தல்" + "முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது." + "முகப்பின் அமைப்பு மற்றும் குறுக்குவழிகளை எழுதுதல்" + "முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளை மாற்ற பயன்பாட்டை அனுமதிக்கிறது." + "ஃபோன் அழைப்புகள் செய்ய, %1$s அனுமதிக்கப்படவில்லை" + "விட்ஜெட்டை ஏற்றுவதில் சிக்கல்" + "அமைவு" + "இது அமைப்பு பயன்பாடு என்பதால் நிறுவல் நீக்கம் செய்ய முடியாது." + "பெயரிடப்படாத கோப்புறை" + "%1$s முடக்கப்பட்டது" + + %1$s பயன்பாட்டில், %2$d அறிவிப்புகள் வந்துள்ளன + %1$s பயன்பாட்டில், %2$d அறிவிப்பு வந்துள்ளது + + "பக்கம் %1$d / %2$d" + "முகப்புத் திரை %1$d of %2$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-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml new file mode 100644 index 0000000000..72dbd9eb89 --- /dev/null +++ b/res/values-uz-rUZ/strings.xml @@ -0,0 +1,144 @@ + + + + + "Launcher3" + + "Ishga oid" + "Ilova o‘rnatilmadi." + "Ilova mavjud emas" + "Yuklab olingan ilova xavfsiz rejimda o‘chirib qo‘yildi" + "Xavfsiz rejimda vidjetlar o‘chirib qo‘yilgan" + "Tezkor tugmadan foydalanib bo‘lmaydi" + "Bosh ekran" + "Maxsus amallar" + "Vidjetni tanlash uchun bosib turing." + "Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning." + "%1$d × %2$d" + "Eni %1$d, bo‘yi %2$d" + "Qo‘lda joylashtirish uchun bosib turing" + "Avtomatik chiqarish" + "Ilovalarni qidirish" + "Ilovalar yuklanmoqda…" + "“%1$s” bilan mos hech qanday ilova topilmadi" + "Boshqa ilovalarni qidirish" + "Bildirishnomalar" + "Yorliqni tanlab olish uchun bosib turing." + "Ikki marta bosib va bosib turgan holatda yorliqni tanlang yoki maxsus amaldan foydalaning." + "Uy ekranida bitta ham xona yo‘q." + "Ajratilganlarda birorta ham xona yo‘q" + "Ilovalar ro‘yxati" + "Shaxsiy ilovalar ro‘yxati" + "Ishchi ilovalar ro‘yxati" + "Bosh sahifa" + "Olib tashlash" + "O‘chirib tashlash" + "Ilova haqida" + "O‘rnatish" + "yorliqlar yaratish" + "Ilovalarga foydalanuvchidan so‘ramasdan yorliqlar qo‘shishga ruxsat beradi." + "Uy sozlamalari va yorliqlarini o‘qish" + "Ilovaga \"Uy\" ekranidagi yorliqlar va sozlamalarni o‘qish uchun ruxsat beradi." + "Uy sozlamalari va yorliqlarini yozish" + "Ilovaga \"Uy\" ekranidagi yorliqlar va sozlamalrni o‘zgartirish uchun ruxsat beradi." + "%1$s ilovasiga qo‘ng‘iroqlarni amalga oshirishga ruxsat berilmagan" + "Vidjetni yuklashda muammo" + "Sozlash" + "Bu tizim ilovasi, shuning uchun o‘chirib bo‘lmaydi." + "Nomsiz jild" + "%1$s ilovasi o‘chirib qo‘yildi" + + %1$s, %2$d ta bildirishnoma bor + %1$s, %2$d ta bildirishnoma bor + + "%2$ddan %1$d ta sahifa" + "Uy ekrani %2$ddan %1$d" + "Yangi bosh ekran sahifasi" + "Jild ochildi, %1$d ga %2$d" + "Jildni yopish uchun ustiga bosing" + "O‘zgarishni saqlash uchun ustiga bosing" + "Jild yopildi" + "Jild nomi %1$sga o‘zgartirildi" + "Jild: %1$s" + "Vidjetlar" + "Fon rasmlari" + "Bosh ekran sozlamalari" + "Administrator tomonidan o‘chirilgan" + "Bildirishnoma belgilari" + "Yoniq" + "O‘chiq" + "Bildirishnomalarga ruxsat berilmagan" + "Bildirishnoma belgilarini ko‘rsatish uchun %1$s ilovasida bildirishnomalarni yoqing" + "Sozlamalarni o‘zgartirish" + "Bildirishnoma belgilarini ko‘rsatish" + "Bosh ekranga ikonka chiqarish" + "Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish" + "Ikonka shaklini o‘zgartirish" + "Bosh ekranda" + "Standart tizim parametrlaridan foydalanish" + "Kvadrat" + "Qirralari aylana kvadrat" + "Aylana" + "Tomchi" + "Ikonka shakli o‘zgartirilmoqda" + "Noma’lum" + "O‘chirish" + "Qidirish" + "Ushbu ilova o‘rnatilmagan" + "Ilova o‘rnatilmagan. Belgini o‘chirib tashlashingiz yoki ilovani topib, uni qo‘lda o‘rnatishingiz mumkin." + "%1$s yuklab olinmoqda, %2$s bajarildi" + "%1$s ilovasi o‘rnatilishi kutilmoqda" + "%1$s vidjetlari" + "Bosh ekranga qo‘shish" + "Obyektni bu yerga ko‘chirish" + "Obyekt bosh ekranga qo‘shildi" + "Obyekt o‘chirib tashlandi" + "Obyektni ko‘chirib o‘tkazish" + "%1$s %2$s katakka ko‘chirib o‘tkazish" + "%1$s-joyga ko‘chirib o‘tkazish" + "Sevimlilarga (%1$s) ko‘chirib o‘tkazish" + "Element ko‘chirib o‘tkazildi" + "%1$s jildiga qo‘shish" + "%1$s ilovasi bor jildga qo‘shish" + "Element jildga qo‘shildi" + "%1$s bilan jild yaratish" + "Jild yaratildi" + "Bosh ekranga ko‘chirish" + "O‘lchamini o‘zgartirish" + "Enini uzaytirish" + "Bo‘yini uzaytirish" + "Enini kichraytirish" + "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" + "Ishchi" + "Ishchi profil" + "Ishga oid ilovalarni shu yerdan topish mumkin" + "Nishonga ega har bir ishga oid ilova tashkilotingiz tomonidan himoyalanadi. Ishga oid ilovalarga osonroq kirish uchun ularni bosh ekranga chiqaring." + "Tashkilotingiz tomonidan boshqariladi" + "Bildirishnomalar va ilovalar faol emas" + "Yopish" + "Yopiq" + 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 設定" + "主螢幕設定" "已由您的管理員停用" "通知圓點" "開啟" From c919a4fa94cfbfaff9a90dddfbfff096741c1574 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 20 Apr 2018 12:00:17 -0700 Subject: [PATCH 067/257] Kepping the rotation setting UI always enabled and accessible Bug: 77654352 Change-Id: Iade9ef33bc70fdbdac9ab39d6fa77113fb21549a --- res/values/strings.xml | 2 -- res/xml/launcher_preferences.xml | 1 + .../android/launcher3/SettingsActivity.java | 28 ------------------- 3 files changed, 1 insertion(+), 30 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 65225b76f0..4fbd806ab0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -183,8 +183,6 @@ Allow Home screen rotation When phone is rotated - - Current Display setting doesn\'t permit rotation Notification dots diff --git a/res/xml/launcher_preferences.xml b/res/xml/launcher_preferences.xml index dde2c5c170..3bba73a6ce 100644 --- a/res/xml/launcher_preferences.xml +++ b/res/xml/launcher_preferences.xml @@ -39,6 +39,7 @@ diff --git a/src/com/android/launcher3/SettingsActivity.java b/src/com/android/launcher3/SettingsActivity.java index 738a8645a0..7bd65574ab 100644 --- a/src/com/android/launcher3/SettingsActivity.java +++ b/src/com/android/launcher3/SettingsActivity.java @@ -87,7 +87,6 @@ public class SettingsActivity extends Activity { public static class LauncherSettingsFragment extends PreferenceFragment { private IconBadgingObserver mIconBadgingObserver; - private RotationLockObserver mRotationLockObserver; private String mPreferenceKey; private boolean mPreferenceHighlighted = false; @@ -134,12 +133,6 @@ public class SettingsActivity extends Activity { // Launcher supports rotation by default. No need to show this setting. getPreferenceScreen().removePreference(rotationPref); } else { - mRotationLockObserver = new RotationLockObserver(rotationPref, resolver); - - // Register a content observer to listen for system setting changes while - // this UI is active. - mRotationLockObserver.register(Settings.System.ACCELEROMETER_ROTATION); - // Initialize the UI once rotationPref.setDefaultValue(getAllowRotationDefaultValue()); } @@ -201,10 +194,6 @@ public class SettingsActivity extends Activity { mIconBadgingObserver.unregister(); mIconBadgingObserver = null; } - if (mRotationLockObserver != null) { - mRotationLockObserver.unregister(); - mRotationLockObserver = null; - } super.onDestroy(); } @@ -228,23 +217,6 @@ public class SettingsActivity extends Activity { } } - private static class RotationLockObserver extends SettingsObserver.System { - - private final Preference mRotationPref; - - public RotationLockObserver(Preference rotationPref, ContentResolver resolver) { - super(resolver); - mRotationPref = rotationPref; - } - - @Override - public void onSettingChanged(boolean enabled) { - mRotationPref.setEnabled(enabled); - mRotationPref.setSummary(enabled - ? R.string.allow_rotation_desc : R.string.allow_rotation_blocked_desc); - } - } - /** * Content observer which listens for system badging setting changes, * and updates the launcher badging setting subtext accordingly. From 4d577fc1c5f4e6ad1285cbef828998adca43f2c2 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Fri, 20 Apr 2018 11:50:27 -0700 Subject: [PATCH 068/257] Not sharing same task view between shortcuts SplitScreen task shortcut was written with an expectation that only one instance would be created at a time. No that it's used by Accessibility, SplitScreen may be asked to provide multiple shortcuts at a time for multiple tasks, and they share same mTaskView. Fixing this. Bug: 78094307 Test: Manual Change-Id: Ib440ca862b0677ec4a012ec9f2a225183b2c91f4 --- .../android/quickstep/TaskSystemShortcut.java | 78 ++++++++++--------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java index 2ebf2525f5..e3f6543ce9 100644 --- a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java +++ b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java @@ -101,13 +101,9 @@ public class TaskSystemShortcut extends SystemShortcut } } - public static class SplitScreen extends TaskSystemShortcut implements OnPreDrawListener, - DeviceProfile.OnDeviceProfileChangeListener, View.OnLayoutChangeListener { + public static class SplitScreen extends TaskSystemShortcut { private Handler mHandler; - private RecentsView mRecentsView; - private TaskView mTaskView; - private BaseDraggingActivity mActivity; public SplitScreen() { super(R.drawable.ic_split_screen, R.string.recent_task_option_split_screen); @@ -125,11 +121,44 @@ public class TaskSystemShortcut extends SystemShortcut if (!task.isDockable) { return null; } - mActivity = activity; - mRecentsView = activity.getOverviewPanel(); - mTaskView = taskView; + final RecentsView recentsView = activity.getOverviewPanel(); + final TaskThumbnailView thumbnailView = taskView.getThumbnail(); return (v -> { + final View.OnLayoutChangeListener onLayoutChangeListener = + new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int l, int t, int r, int b, + int oldL, int oldT, int oldR, int oldB) { + taskView.getRootView().removeOnLayoutChangeListener(this); + recentsView.removeIgnoreResetTask(taskView); + + // Start animating in the side pages once launcher has been resized + recentsView.dismissTask(taskView, false, false); + } + }; + + final DeviceProfile.OnDeviceProfileChangeListener onDeviceProfileChangeListener = + new DeviceProfile.OnDeviceProfileChangeListener() { + @Override + public void onDeviceProfileChanged(DeviceProfile dp) { + activity.removeOnDeviceProfileChangeListener(this); + if (dp.isMultiWindowMode) { + taskView.getRootView().addOnLayoutChangeListener( + onLayoutChangeListener); + } + } + }; + + final OnPreDrawListener preDrawListener = new OnPreDrawListener() { + @Override + public boolean onPreDraw() { + taskView.getViewTreeObserver().removeOnPreDrawListener(this); + WindowManagerWrapper.getInstance().endProlongedAnimations(); + return true; + } + }; + AbstractFloatingView.closeOpenViews(activity, true, AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE); @@ -145,15 +174,15 @@ public class TaskSystemShortcut extends SystemShortcut // Add a device profile change listener to kick off animating the side tasks // once we enter multiwindow mode and relayout - activity.addOnDeviceProfileChangeListener(this); + activity.addOnDeviceProfileChangeListener(onDeviceProfileChangeListener); final Runnable animStartedListener = () -> { // Hide the task view and wait for the window to be resized // TODO: Consider animating in launcher and do an in-place start activity // afterwards - mRecentsView.addIgnoreResetTask(mTaskView); - mTaskView.setAlpha(0f); - mTaskView.getViewTreeObserver().addOnPreDrawListener(SplitScreen.this); + recentsView.addIgnoreResetTask(taskView); + taskView.setAlpha(0f); + taskView.getViewTreeObserver().addOnPreDrawListener(preDrawListener); }; final int[] position = new int[2]; @@ -179,31 +208,6 @@ public class TaskSystemShortcut extends SystemShortcut } }); } - - @Override - public boolean onPreDraw() { - mTaskView.getViewTreeObserver().removeOnPreDrawListener(this); - WindowManagerWrapper.getInstance().endProlongedAnimations(); - return true; - } - - @Override - public void onDeviceProfileChanged(DeviceProfile dp) { - mActivity.removeOnDeviceProfileChangeListener(this); - if (dp.isMultiWindowMode) { - mTaskView.getRootView().addOnLayoutChangeListener(this); - } - } - - @Override - public void onLayoutChange(View v, int l, int t, int r, int b, - int oldL, int oldT, int oldR, int oldB) { - mTaskView.getRootView().removeOnLayoutChangeListener(this); - mRecentsView.removeIgnoreResetTask(mTaskView); - - // Start animating in the side pages once launcher has been resized - mRecentsView.dismissTask(mTaskView, false, false); - } } public static class Pin extends TaskSystemShortcut { From d9e53c13b19ee479ad6006fbea20606442a189f6 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Tue, 17 Apr 2018 18:32:43 -0700 Subject: [PATCH 069/257] Making clear-all pressable correctly Bug: 72222505 Test: Manual Change-Id: I1ca35482a2090c329be6c906f5047612e6948ad2 --- .../android/quickstep/views/RecentsView.java | 32 ++++++++++++------- .../quickstep/views/RecentsViewContainer.java | 6 +--- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 29d999dd3b..647415e58f 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -169,7 +169,7 @@ public abstract class RecentsView // Keeps track of task views whose visual state should not be reset private ArraySet mIgnoreResetTaskViews = new ArraySet<>(); - private RecentsViewContainer mContainerView; + private View mClearAllButton; // Variables for empty state private final Drawable mEmptyIcon; @@ -311,12 +311,15 @@ public abstract class RecentsView @Override public boolean onTouchEvent(MotionEvent ev) { - if (DEBUG_SHOW_CLEAR_ALL_BUTTON && mTouchState == TOUCH_STATE_REST && mScroller.isFinished() - && getChildCount() != 0 - && ev.getX() > getChildAt(getChildCount() - 1).getRight() - getScrollX()) { - // If nothing is in motion, allow events to the right of the last task to go to the - // Clear All button. - return false; + if (DEBUG_SHOW_CLEAR_ALL_BUTTON && ev.getAction() == MotionEvent.ACTION_DOWN + && mTouchState == TOUCH_STATE_REST && mScroller.isFinished() + && mClearAllButton.getVisibility() == View.VISIBLE) { + mClearAllButton.getHitRect(mTempRect); + mTempRect.offset(-getLeft(), -getTop()); + if (mTempRect.contains((int) ev.getX(), (int) ev.getY())) { + // If nothing is in motion, let the Clear All button process the event. + return false; + } } if (ev.getAction() == MotionEvent.ACTION_UP && mShowEmptyMessage) { @@ -928,8 +931,8 @@ public abstract class RecentsView mShowEmptyMessage = isEmpty; updateEmptyStateUi(hasSizeChanged); invalidate(); - if (mContainerView != null) { - mContainerView.onEmptyStateChanged(!DEBUG_SHOW_CLEAR_ALL_BUTTON || mShowEmptyMessage); + if (mClearAllButton != null) { + updateClearAllButtonVisibility(); } } @@ -1119,8 +1122,13 @@ public abstract class RecentsView R.dimen.clear_all_container_width) - getPaddingEnd(); } - public void setContainerView(RecentsViewContainer containerView) { - mContainerView = containerView; - mContainerView.onEmptyStateChanged(!DEBUG_SHOW_CLEAR_ALL_BUTTON || mShowEmptyMessage); + private void updateClearAllButtonVisibility() { + mClearAllButton.setVisibility( + !DEBUG_SHOW_CLEAR_ALL_BUTTON || mShowEmptyMessage ? GONE : VISIBLE); + } + + public void setClearAllButton(View clearAllButton) { + mClearAllButton = clearAllButton; + updateClearAllButtonVisibility(); } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index ece78c1fdc..a949c89f2c 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -43,7 +43,7 @@ public class RecentsViewContainer extends InsettableFrameLayout { }); mRecentsView = (RecentsView) findViewById(R.id.overview_panel); - mRecentsView.setContainerView(this); + mRecentsView.setClearAllButton(mClearAllButton); } @Override @@ -74,8 +74,4 @@ public class RecentsViewContainer extends InsettableFrameLayout { mRecentsView.setContentAlpha(alpha); setVisibility(alpha > 0 ? VISIBLE : GONE); } - - public void onEmptyStateChanged(boolean isEmpty) { - mClearAllButton.setVisibility(isEmpty ? GONE : VISIBLE); - } } \ No newline at end of file From ed2d2bcbb8541eb811615638e6bcf93524c2b333 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 19 Apr 2018 12:34:43 -0700 Subject: [PATCH 070/257] Force finish any pending animations if the insets or orientation change Some animation might be running from a previous orientation, which can cuase property changes to get skipped. Bug: 77848165 Bug: 77774619 Change-Id: I3e198196192746abdd72a1970ff2ef407bf4aff9 --- .../LauncherAppTransitionManagerImpl.java | 3 +- src/com/android/launcher3/Launcher.java | 2 +- .../android/launcher3/LauncherRootView.java | 8 ++--- .../launcher3/LauncherStateManager.java | 7 ++++ .../anim/AnimatorPlaybackController.java | 32 +++++++++---------- .../AbstractStateChangeTouchController.java | 2 +- 6 files changed, 29 insertions(+), 25 deletions(-) diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index ce17d257ec..353ed84609 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -50,7 +50,6 @@ 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; @@ -249,7 +248,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag mLauncher.getStateManager() .createAnimationToNewWorkspace(NORMAL, RECENTS_LAUNCH_DURATION); controller.dispatchOnStart(); - childStateAnimation = controller.getOriginalTarget(); + childStateAnimation = controller.getTarget(); launcherAnim = controller.getAnimationPlayer().setDuration(RECENTS_LAUNCH_DURATION); windowAnimEndListener = new AnimatorListenerAdapter() { @Override diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index ec0a8ffb3f..5e06d92375 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -360,7 +360,7 @@ public class Launcher extends BaseDraggingActivity dispatchDeviceProfileChanged(); getRootView().dispatchInsets(); - getStateManager().reapplyState(); + getStateManager().reapplyState(true /* cancelCurrentAnimation */); // Recreate touch controllers mDragLayer.setup(mDragController); diff --git a/src/com/android/launcher3/LauncherRootView.java b/src/com/android/launcher3/LauncherRootView.java index f204c16e28..ad1456a2d7 100644 --- a/src/com/android/launcher3/LauncherRootView.java +++ b/src/com/android/launcher3/LauncherRootView.java @@ -1,5 +1,8 @@ package com.android.launcher3; +import static com.android.launcher3.util.SystemUiController.FLAG_DARK_NAV; +import static com.android.launcher3.util.SystemUiController.UI_STATE_ROOT_VIEW; + import android.annotation.TargetApi; import android.app.ActivityManager; import android.content.Context; @@ -13,9 +16,6 @@ import android.view.ViewDebug; import com.android.launcher3.util.Themes; -import static com.android.launcher3.util.SystemUiController.FLAG_DARK_NAV; -import static com.android.launcher3.util.SystemUiController.UI_STATE_ROOT_VIEW; - public class LauncherRootView extends InsettableFrameLayout { private final Launcher mLauncher; @@ -82,7 +82,7 @@ public class LauncherRootView extends InsettableFrameLayout { } } if (resetState) { - mLauncher.getStateManager().reapplyState(); + mLauncher.getStateManager().reapplyState(true /* cancelCurrentAnimation */); } return true; // I'll take it from here diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index e611af7df7..d196c37593 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -157,6 +157,13 @@ public class LauncherStateManager { } public void reapplyState() { + reapplyState(false); + } + + public void reapplyState(boolean cancelCurrentAnimation) { + if (cancelCurrentAnimation) { + cancelAnimation(); + } if (mConfig.mCurrentAnimation == null) { for (StateHandler handler : getStateHandlers()) { handler.setState(mState); diff --git a/src/com/android/launcher3/anim/AnimatorPlaybackController.java b/src/com/android/launcher3/anim/AnimatorPlaybackController.java index 087752df1e..1dba7d665a 100644 --- a/src/com/android/launcher3/anim/AnimatorPlaybackController.java +++ b/src/com/android/launcher3/anim/AnimatorPlaybackController.java @@ -17,6 +17,7 @@ package com.android.launcher3.anim; import android.animation.Animator; import android.animation.Animator.AnimatorListener; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; @@ -52,45 +53,37 @@ public abstract class AnimatorPlaybackController implements ValueAnimator.Animat private final long mDuration; protected final AnimatorSet mAnim; - private AnimatorSet mOriginalTarget; protected float mCurrentFraction; private Runnable mEndAction; + protected boolean mTargetCancelled = false; + protected AnimatorPlaybackController(AnimatorSet anim, long duration) { mAnim = anim; - mOriginalTarget = mAnim; mDuration = duration; mAnimationPlayer = ValueAnimator.ofFloat(0, 1); mAnimationPlayer.setInterpolator(Interpolators.LINEAR); mAnimationPlayer.addListener(new OnAnimationEndDispatcher()); mAnimationPlayer.addUpdateListener(this); + + mAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationCancel(Animator animation) { + mTargetCancelled = true; + } + }); } public AnimatorSet getTarget() { return mAnim; } - public void setOriginalTarget(AnimatorSet anim) { - mOriginalTarget = anim; - } - - public AnimatorSet getOriginalTarget() { - return mOriginalTarget; - } - public long getDuration() { return mDuration; } - public AnimatorPlaybackController cloneFor(AnimatorSet anim) { - AnimatorPlaybackController controller = AnimatorPlaybackController.wrap(anim, mDuration); - controller.setOriginalTarget(mOriginalTarget); - controller.setPlayFraction(mCurrentFraction); - return controller; - } - /** * Starts playing the animation forward from current position. */ @@ -206,6 +199,11 @@ public abstract class AnimatorPlaybackController implements ValueAnimator.Animat @Override public void setPlayFraction(float fraction) { mCurrentFraction = fraction; + // Let the animator report the progress but don't apply the progress to child + // animations if it has been cancelled. + if (mTargetCancelled) { + return; + } long playPos = clampDuration(fraction); for (ValueAnimator anim : mChildAnimations) { anim.setCurrentPlayTime(Math.min(playPos, anim.getDuration())); diff --git a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java index f1195edf34..4c7ce1fb44 100644 --- a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java +++ b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java @@ -279,7 +279,7 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene @Override public void onAnimationCancel(Animator animation) { - if (mCurrentAnimation != null && animation == mCurrentAnimation.getOriginalTarget()) { + if (mCurrentAnimation != null && animation == mCurrentAnimation.getTarget()) { Log.e(TAG, "Who dare cancel the animation when I am in control", new Exception()); clearState(); } From f23931f9153b30d730165752a52ea522b865f53a Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 10 Apr 2018 12:15:21 -0700 Subject: [PATCH 071/257] Reset the force-invisible flag after the animation into launcher completes. - In the case where an app auto-enters into PiP, we don't run the predefined remote animation, which means that the force-invisible flag is never reset. With ag/3876550, we can rely on enter animation complete to be called after the transition, and we can reset the flag here as well. Bug: 77730018 Change-Id: Ifa4cbe518047eed7ab327721ff6d17db1a2b8cd5 --- src/com/android/launcher3/BaseActivity.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index a41edc08b4..d1334722d6 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -142,6 +142,15 @@ public abstract class BaseActivity extends Activity { } } + @Override + public void onEnterAnimationComplete() { + super.onEnterAnimationComplete(); + + // Needed for activities that auto-enter PiP, which will not trigger a remote animation to + // be created + clearForceInvisibleFlag(INVISIBLE_BY_STATE_HANDLER); + } + @Override protected void onStop() { mActivityFlags &= ~ACTIVITY_STATE_STARTED & ~ACTIVITY_STATE_USER_ACTIVE; From 6dedc222beac9db305adf696f36fc5ada8b3d82f Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 17 Apr 2018 17:12:08 -0700 Subject: [PATCH 072/257] Handling swipe up on a third-party launcher Bug: 78125098 Change-Id: Iba4247987825bf9ce16d3494200bfea889c931e2 --- .../quickstep/ActivityControlHelper.java | 144 +++++++++--------- .../quickstep/OverviewCommandHelper.java | 39 +++-- .../android/quickstep/RecentsActivity.java | 10 ++ .../WindowTransformSwipeHandler.java | 40 +++-- .../quickstep/util/ClipAnimationHelper.java | 16 +- .../util/RemoteAnimationTargetSet.java | 14 +- .../views/LauncherLayoutListener.java | 2 +- 7 files changed, 153 insertions(+), 112 deletions(-) diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 52db0017b8..d3b05763ff 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -27,7 +27,6 @@ import android.content.Context; import android.content.Intent; import android.graphics.Rect; import android.os.Handler; -import android.os.Looper; import android.support.annotation.Nullable; import android.support.annotation.UiThread; import android.view.View; @@ -40,15 +39,16 @@ import com.android.launcher3.LauncherInitListener; import com.android.launcher3.LauncherState; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.AnimatorPlaybackController; -import com.android.launcher3.util.ViewOnDrawExecutor; import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.util.RemoteAnimationProvider; +import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.LauncherLayoutListener; import com.android.quickstep.views.RecentsView; -import com.android.quickstep.views.TaskView; +import com.android.quickstep.views.RecentsViewContainer; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import java.util.function.BiPredicate; +import java.util.function.Consumer; /** * Utility class which abstracts out the logical differences between Launcher and RecentsActivity. @@ -67,19 +67,14 @@ public interface ActivityControlHelper { void executeOnWindowAvailable(T activity, Runnable action); - void executeOnNextDraw(T activity, TaskView targetView, Runnable action); - void onTransitionCancelled(T activity, boolean activityVisible); int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect); void onSwipeUpComplete(T activity); - void prepareRecentsUI(T activity, boolean activityVisible); - - AnimatorPlaybackController createControllerForVisibleActivity(T activity); - - AnimatorPlaybackController createControllerForHiddenActivity(T activity, int transitionLength); + AnimationFactory prepareRecentsUI(T activity, boolean activityVisible, + Consumer callback); ActivityInitListener createActivityInitListener(BiPredicate onInitListener); @@ -130,20 +125,6 @@ public interface ActivityControlHelper { } } - @Override - public void executeOnNextDraw(Launcher activity, TaskView targetView, Runnable action) { - ViewOnDrawExecutor executor = new ViewOnDrawExecutor() { - @Override - public void onViewDetachedFromWindow(View v) { - if (!isCompleted()) { - runAllTasks(); - } - } - }; - executor.attachTo(activity, targetView, false /* waitForLoadAnimation */); - executor.execute(action); - } - @Override public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) { LayoutUtils.calculateLauncherTaskSize(context, dp, outRect); @@ -169,7 +150,8 @@ public interface ActivityControlHelper { } @Override - public void prepareRecentsUI(Launcher activity, boolean activityVisible) { + public AnimationFactory prepareRecentsUI(Launcher activity, boolean activityVisible, + Consumer callback) { LauncherState startState = activity.getStateManager().getState(); if (startState.disableRestore) { startState = activity.getStateManager().getRestState(); @@ -185,37 +167,41 @@ public interface ActivityControlHelper { // Optimization, hide the all apps view to prevent layout while initializing activity.getAppsView().getContentView().setVisibility(View.GONE); } + + return (transitionLength) -> + createActivityController(activity, activityVisible, transitionLength, callback); } - @Override - public AnimatorPlaybackController createControllerForVisibleActivity(Launcher activity) { - DeviceProfile dp = activity.getDeviceProfile(); - long accuracy = 2 * Math.max(dp.widthPx, dp.heightPx); - return activity.getStateManager().createAnimationToNewWorkspace(OVERVIEW, accuracy); - } + private void createActivityController(Launcher activity, boolean wasVisible, + long transitionLength, Consumer callback) { + if (wasVisible) { + DeviceProfile dp = activity.getDeviceProfile(); + long accuracy = 2 * Math.max(dp.widthPx, dp.heightPx); + callback.accept(activity.getStateManager() + .createAnimationToNewWorkspace(OVERVIEW, accuracy)); + return; + } + + if (activity.getDeviceProfile().isVerticalBarLayout()) { + return; + } - @Override - public AnimatorPlaybackController createControllerForHiddenActivity( - Launcher activity, int transitionLength) { AllAppsTransitionController controller = activity.getAllAppsController(); AnimatorSet anim = new AnimatorSet(); - if (activity.getDeviceProfile().isVerticalBarLayout()) { - // TODO: - } else { - float scrollRange = Math.max(controller.getShiftRange(), 1); - float progressDelta = (transitionLength / scrollRange); - float endProgress = OVERVIEW.getVerticalProgress(activity); - float startProgress = endProgress + progressDelta; - ObjectAnimator shiftAnim = ObjectAnimator.ofFloat( - controller, ALL_APPS_PROGRESS, startProgress, endProgress); - shiftAnim.setInterpolator(LINEAR); - anim.play(shiftAnim); - } + float scrollRange = Math.max(controller.getShiftRange(), 1); + float progressDelta = (transitionLength / scrollRange); + + float endProgress = OVERVIEW.getVerticalProgress(activity); + float startProgress = endProgress + progressDelta; + ObjectAnimator shiftAnim = ObjectAnimator.ofFloat( + controller, ALL_APPS_PROGRESS, startProgress, endProgress); + shiftAnim.setInterpolator(LINEAR); + anim.play(shiftAnim); anim.setDuration(transitionLength * 2); activity.getStateManager().setCurrentAnimation(anim); - return AnimatorPlaybackController.wrap(anim, transitionLength * 2); + callback.accept(AnimatorPlaybackController.wrap(anim, transitionLength * 2)); } @Override @@ -294,13 +280,6 @@ public interface ActivityControlHelper { action.run(); } - @Override - public void executeOnNextDraw(RecentsActivity activity, TaskView targetView, - Runnable action) { - // TODO: - new Handler(Looper.getMainLooper()).post(action); - } - @Override public void onTransitionCancelled(RecentsActivity activity, boolean activityVisible) { // TODO: @@ -324,23 +303,43 @@ public interface ActivityControlHelper { } @Override - public void prepareRecentsUI(RecentsActivity activity, boolean activityVisible) { - // TODO: - } + public AnimationFactory prepareRecentsUI(RecentsActivity activity, boolean activityVisible, + Consumer callback) { + if (activityVisible) { + return (transitionLength) -> { }; + } - @Override - public AnimatorPlaybackController createControllerForVisibleActivity( - RecentsActivity activity) { - DeviceProfile dp = activity.getDeviceProfile(); - return createControllerForHiddenActivity(activity, Math.max(dp.widthPx, dp.heightPx)); - } + RecentsViewContainer rv = activity.getOverviewPanelContainer(); + rv.setContentAlpha(0); - @Override - public AnimatorPlaybackController createControllerForHiddenActivity( - RecentsActivity activity, int transitionLength) { - // We do not animate anything. Create a empty controller - AnimatorSet anim = new AnimatorSet(); - return AnimatorPlaybackController.wrap(anim, transitionLength * 2); + return new AnimationFactory() { + + boolean isAnimatingHome = false; + + @Override + public void onRemoteAnimationReceived(RemoteAnimationTargetSet targets) { + isAnimatingHome = targets != null && targets.isAnimatingHome(); + if (!isAnimatingHome) { + rv.setContentAlpha(1); + } + createActivityController(getSwipeUpDestinationAndLength( + activity.getDeviceProfile(), activity, new Rect())); + } + + @Override + public void createActivityController(long transitionLength) { + if (!isAnimatingHome) { + return; + } + + ObjectAnimator anim = ObjectAnimator + .ofFloat(rv, RecentsViewContainer.CONTENT_ALPHA, 0, 1); + anim.setDuration(transitionLength).setInterpolator(LINEAR); + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.play(anim); + callback.accept(AnimatorPlaybackController.wrap(animatorSet, transitionLength)); + } + }; } @Override @@ -423,4 +422,11 @@ public interface ActivityControlHelper { void registerAndStartActivity(Intent intent, RemoteAnimationProvider animProvider, Context context, Handler handler, long duration); } + + interface AnimationFactory { + + default void onRemoteAnimationReceived(RemoteAnimationTargetSet targets) { } + + void createActivityController(long transitionLength); + } } diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index 663a005759..cac7606121 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -26,6 +26,7 @@ import static com.android.systemui.shared.system.PackageManagerWrapper .ACTION_PREFERRED_ACTIVITY_CHANGED; import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; +import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING; import android.animation.AnimatorSet; import android.animation.ValueAnimator; @@ -36,6 +37,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ResolveInfo; +import android.graphics.Matrix.ScaleToFit; import android.graphics.Rect; import android.os.Build; import android.os.PatternMatcher; @@ -49,6 +51,7 @@ import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; +import com.android.quickstep.ActivityControlHelper.AnimationFactory; import com.android.quickstep.ActivityControlHelper.FallbackActivityControllerHelper; import com.android.quickstep.ActivityControlHelper.LauncherActivityControllerHelper; import com.android.quickstep.util.ClipAnimationHelper; @@ -59,6 +62,7 @@ import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.PackageManagerWrapper; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import com.android.systemui.shared.system.TransactionCompat; import java.util.ArrayList; @@ -254,15 +258,17 @@ public class OverviewCommandHelper { private boolean onActivityReady(T activity, Boolean wasVisible) { activity.getOverviewPanel().setCurrentTask(mRunningTaskId); AbstractFloatingView.closeAllOpenViews(activity, wasVisible); - mHelper.prepareRecentsUI(activity, wasVisible); + AnimationFactory factory = mHelper.prepareRecentsUI(activity, wasVisible, + (controller) -> { + controller.dispatchOnStart(); + ValueAnimator anim = controller.getAnimationPlayer() + .setDuration(RECENTS_LAUNCH_DURATION); + anim.setInterpolator(FAST_OUT_SLOW_IN); + anim.start(); + }); + factory.onRemoteAnimationReceived(null); if (wasVisible) { - AnimatorPlaybackController controller = - mHelper.createControllerForVisibleActivity(activity); - controller.dispatchOnStart(); - ValueAnimator anim = - controller.getAnimationPlayer().setDuration(RECENTS_LAUNCH_DURATION); - anim.setInterpolator(FAST_OUT_SLOW_IN); - anim.start(); + factory.createActivityController(RECENTS_LAUNCH_DURATION); } mActivity = activity; return false; @@ -283,7 +289,6 @@ public class OverviewCommandHelper { RemoteAnimationTargetSet targetSet = new RemoteAnimationTargetSet(targetCompats, MODE_CLOSING); - // Use the top closing app to determine the insets for the animation RemoteAnimationTargetCompat runningTaskTarget = targetSet.findTask(mRunningTaskId); if (runningTaskTarget == null) { @@ -313,6 +318,22 @@ public class OverviewCommandHelper { valueAnimator.setInterpolator(TOUCH_RESPONSE_INTERPOLATOR); valueAnimator.addUpdateListener((v) -> clipHelper.applyTransform(targetSet, (float) v.getAnimatedValue())); + + if (targetSet.isAnimatingHome()) { + // If we are animating home, fade in the opening targets + RemoteAnimationTargetSet openingSet = + new RemoteAnimationTargetSet(targetCompats, MODE_OPENING); + + TransactionCompat transaction = new TransactionCompat(); + valueAnimator.addUpdateListener((v) -> { + for (RemoteAnimationTargetCompat app : openingSet.apps) { + transaction.setAlpha(app.leash, (float) v.getAnimatedValue()); + transaction.show(app.leash); + } + transaction.setEarlyWakeup(); + transaction.apply(); + }); + } anim.play(valueAnimator); return anim; } diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 551984aa4d..0185ab91d1 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -51,6 +51,7 @@ import com.android.launcher3.util.Themes; import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.fallback.FallbackRecentsView; import com.android.quickstep.fallback.RecentsRootView; +import com.android.quickstep.views.RecentsViewContainer; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.system.ActivityOptionsCompat; import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; @@ -65,6 +66,7 @@ public class RecentsActivity extends BaseDraggingActivity { private Handler mUiHandler = new Handler(Looper.getMainLooper()); private RecentsRootView mRecentsRootView; private FallbackRecentsView mFallbackRecentsView; + private RecentsViewContainer mOverviewPanelContainer; private Configuration mOldConfig; @@ -78,6 +80,7 @@ public class RecentsActivity extends BaseDraggingActivity { setContentView(R.layout.fallback_recents_activity); mRecentsRootView = findViewById(R.id.drag_layer); mFallbackRecentsView = findViewById(R.id.overview_panel); + mOverviewPanelContainer = findViewById(R.id.overview_panel_container); mRecentsRootView.setup(); @@ -153,6 +156,10 @@ public class RecentsActivity extends BaseDraggingActivity { return (T) mFallbackRecentsView; } + public RecentsViewContainer getOverviewPanelContainer() { + return mOverviewPanelContainer; + } + @Override public BadgeInfo getBadgeInfoForItem(ItemInfo info) { return null; @@ -210,6 +217,9 @@ public class RecentsActivity extends BaseDraggingActivity { @Override protected void onStart() { + // Set the alpha to 1 before calling super, as it may get set back to 0 due to + // onActivityStart callback. + mFallbackRecentsView.setContentAlpha(1); super.onStart(); UiFactory.onStart(this); mFallbackRecentsView.resetTaskVisuals(); diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 0944a7a26f..51848cc5cd 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -63,6 +63,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.TraceHelper; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; +import com.android.quickstep.ActivityControlHelper.AnimationFactory; import com.android.quickstep.ActivityControlHelper.LayoutListener; import com.android.quickstep.TouchConsumer.InteractionType; import com.android.quickstep.util.ClipAnimationHelper; @@ -164,6 +165,7 @@ public class WindowTransformSwipeHandler { private LayoutListener mLayoutListener; private RecentsView mRecentsView; private QuickScrubController mQuickScrubController; + private AnimationFactory mAnimationFactory = (t) -> { }; private Runnable mLauncherDrawnCallback; @@ -212,11 +214,13 @@ public class WindowTransformSwipeHandler { mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN, this::launcherFrameDrawn); mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_GESTURE_STARTED, - this::onGestureStartedWithLauncher); + this::notifyGestureStartedAsync); mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_STARTED | STATE_GESTURE_CANCELLED, this::resetStateForAnimationCancel); + mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_APP_CONTROLLER_RECEIVED, + this::sendRemoteAnimationsToAnimationFactory); mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_APP_CONTROLLER_RECEIVED | STATE_SCALED_CONTROLLER_APP, this::resumeLastTask); @@ -321,7 +325,8 @@ public class WindowTransformSwipeHandler { return; } - mActivityControlHelper.prepareRecentsUI(mActivity, mWasLauncherAlreadyVisible); + mAnimationFactory = mActivityControlHelper.prepareRecentsUI(mActivity, + mWasLauncherAlreadyVisible, this::onAnimatorPlaybackControllerCreated); AbstractFloatingView.closeAllOpenViews(activity, mWasLauncherAlreadyVisible); if (mWasLauncherAlreadyVisible) { @@ -377,9 +382,13 @@ public class WindowTransformSwipeHandler { mLauncherFrameDrawnTime = SystemClock.uptimeMillis(); } + private void sendRemoteAnimationsToAnimationFactory() { + mAnimationFactory.onRemoteAnimationReceived(mRecentsAnimationWrapper.targetSet); + } + private void initializeLauncherAnimationController() { mLayoutListener.setHandler(this); - onLauncherLayoutChanged(); + buildAnimationController(); final long transitionDelay = mLauncherFrameDrawnTime - mTouchTimeMs; SysuiEventLogger.writeDummyRecentsTransition(transitionDelay); @@ -418,15 +427,15 @@ public class WindowTransformSwipeHandler { /** * Called by {@link #mLayoutListener} when launcher layout changes */ - public void onLauncherLayoutChanged() { + public void buildAnimationController() { initTransitionEndpoints(mActivity.getDeviceProfile()); + mAnimationFactory.createActivityController(mTransitionDragLength); + } - if (!mWasLauncherAlreadyVisible) { - mLauncherTransitionController = mActivityControlHelper - .createControllerForHiddenActivity(mActivity, mTransitionDragLength); - mLauncherTransitionController.dispatchOnStart(); - mLauncherTransitionController.setPlayFraction(mCurrentShift.value); - } + private void onAnimatorPlaybackControllerCreated(AnimatorPlaybackController anim) { + mLauncherTransitionController = anim; + mLauncherTransitionController.dispatchOnStart(); + mLauncherTransitionController.setPlayFraction(mCurrentShift.value); } @WorkerThread @@ -546,17 +555,6 @@ public class WindowTransformSwipeHandler { } } - private void onGestureStartedWithLauncher() { - notifyGestureStartedAsync(); - - if (mWasLauncherAlreadyVisible) { - mLauncherTransitionController = mActivityControlHelper - .createControllerForVisibleActivity(mActivity); - mLauncherTransitionController.dispatchOnStart(); - mLauncherTransitionController.setPlayFraction(mCurrentShift.value); - } - } - @WorkerThread public void onGestureEnded(float endVelocity) { Resources res = mContext.getResources(); diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index 9dd83d20a6..20108ebb5e 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -25,7 +25,6 @@ import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.Utilities; -import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.views.TaskThumbnailView; import com.android.systemui.shared.recents.utilities.RectFEvaluator; @@ -111,14 +110,17 @@ public class ClipAnimationHelper { mClipRect.bottom = (int) (mSourceStackBounds.height() - (mSourceWindowClipInsets.bottom * progress)); - mTmpMatrix.setRectToRect(mSourceRect, currentRect, ScaleToFit.FILL); - TransactionCompat transaction = new TransactionCompat(); for (RemoteAnimationTargetCompat app : targetSet.apps) { - mTmpMatrix.postTranslate(app.position.x, app.position.y); - transaction.setMatrix(app.leash, mTmpMatrix) - .setWindowCrop(app.leash, mClipRect); - if (app.isNotInRecents) { + if (app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { + mTmpMatrix.setRectToRect(mSourceRect, currentRect, ScaleToFit.FILL); + mTmpMatrix.postTranslate(app.position.x, app.position.y); + transaction.setMatrix(app.leash, mTmpMatrix) + .setWindowCrop(app.leash, mClipRect); + } + + if (app.isNotInRecents + || app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { transaction.setAlpha(app.leash, 1 - progress); } transaction.show(app.leash); diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java index fc889e54e6..97d7fb9209 100644 --- a/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java +++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java @@ -24,23 +24,18 @@ import java.util.ArrayList; */ public class RemoteAnimationTargetSet { - public final boolean allTransparent; public final RemoteAnimationTargetCompat[] apps; public RemoteAnimationTargetSet(RemoteAnimationTargetCompat[] apps, int targetMode) { - boolean allTransparent = true; - ArrayList filteredApps = new ArrayList<>(); if (apps != null) { for (RemoteAnimationTargetCompat target : apps) { if (target.mode == targetMode) { - allTransparent &= target.isTranslucent; filteredApps.add(target); } } } - this.allTransparent = allTransparent; this.apps = filteredApps.toArray(new RemoteAnimationTargetCompat[filteredApps.size()]); } @@ -52,4 +47,13 @@ public class RemoteAnimationTargetSet { } return null; } + + public boolean isAnimatingHome() { + for (RemoteAnimationTargetCompat target : apps) { + if (target.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { + return true; + } + } + return false; + } } diff --git a/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java b/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java index ac34d90b1d..c149de54f0 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java +++ b/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java @@ -54,7 +54,7 @@ public class LauncherLayoutListener extends AbstractFloatingView @Override public void setInsets(Rect insets) { if (mHandler != null) { - mHandler.onLauncherLayoutChanged(); + mHandler.buildAnimationController(); } } From b882b171e0506fda111c5d69bdc4d21036155198 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 20 Apr 2018 14:26:42 -0700 Subject: [PATCH 073/257] Only preload tasks in background when service is connected Bug: 76162466 Test: Disable the component, ensure no task snapshots are preloaded Change-Id: I86b66c79eb2c33796fef09d4466bc313f1c6af69 --- quickstep/src/com/android/quickstep/RecentsModel.java | 9 +++++++-- .../com/android/quickstep/TouchInteractionService.java | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index 70b0355b09..7676a70eda 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -87,7 +87,8 @@ public class RecentsModel extends TaskStackChangeListener { private int mTaskChangeId; private ISystemUiProxy mSystemUiProxy; private boolean mClearAssistCacheOnStackChange = true; - private final boolean mPreloadTasksInBackground; + private final boolean mIsLowRamDevice; + private boolean mPreloadTasksInBackground; private final AccessibilityManager mAccessibilityManager; private RecentsModel(Context context) { @@ -95,7 +96,7 @@ public class RecentsModel extends TaskStackChangeListener { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - mPreloadTasksInBackground = !activityManager.isLowRamDevice(); + mIsLowRamDevice = activityManager.isLowRamDevice(); mMainThreadExecutor = new MainThreadExecutor(); Resources res = context.getResources(); @@ -160,6 +161,10 @@ public class RecentsModel extends TaskStackChangeListener { return requestId; } + public void setPreloadTasksInBackground(boolean preloadTasksInBackground) { + mPreloadTasksInBackground = preloadTasksInBackground && !mIsLowRamDevice; + } + @Override public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { mTaskChangeId++; diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 57f46b87ac..b89a835617 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -173,6 +173,7 @@ public class TouchInteractionService extends Service { super.onCreate(); mAM = ActivityManagerWrapper.getInstance(); mRecentsModel = RecentsModel.getInstance(this); + mRecentsModel.setPreloadTasksInBackground(true); mMainThreadExecutor = new MainThreadExecutor(); mOverviewCommandHelper = new OverviewCommandHelper(this); mMainThreadChoreographer = Choreographer.getInstance(); From de0e588a0731712b5238d3df1c779ca426272164 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 17 Apr 2018 11:54:48 -0700 Subject: [PATCH 074/257] Cleaning up some obsolete TODOs and methods Change-Id: I7c3f1a68fc555899e6a1270aa2ad973197a7ed85 --- .../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 51848cc5cd..25539aa754 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -333,7 +333,6 @@ public class WindowTransformSwipeHandler { mStateCallback.setState(STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_LAUNCHER_DRAWN); } else { TraceHelper.beginSection("WTS-init"); - // TODO: Implement a better animation for fading in View rootView = activity.getRootView(); rootView.setAlpha(0); rootView.getViewTreeObserver().addOnDrawListener(new OnDrawListener() { @@ -506,8 +505,7 @@ public class WindowTransformSwipeHandler { dp.updateInsets(homeContentInsets); } else { overviewStackBounds = new Rect(0, 0, dp.widthPx, dp.heightPx); - // TODO: Workaround for an existing issue where the home content insets are - // not valid immediately after rotation, just use the stable insets for now + // 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); From e5575f9fff4dc008611a93344e3b59fe2531f375 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Thu, 19 Apr 2018 11:12:53 -0700 Subject: [PATCH 075/257] Implement all apps discovery bounce. Mock: https://docs.google.com/presentation/d/1TCp1mREgsFAWq4hCnUaSRCpaqvDbzCVkN1mJuRMylIg/edit#slide=id.g36a3e190fb_0_6 Demo video: go/shelf_bounce_animation Fixes: 70180942 Test: manual test Change-Id: I6ecceb63612dd63cea62f2e6cb19d7522f3d76e0 --- .../launcher3/uioverrides/AllAppsState.java | 6 +- .../launcher3/uioverrides/OverviewState.java | 7 +++ .../quickstep/ActivityControlHelper.java | 13 +++++ .../WindowTransformSwipeHandler.java | 1 + src/com/android/launcher3/Launcher.java | 2 +- .../launcher3/allapps/DiscoveryBounce.java | 57 +++++++++++++++---- .../launcher3/uioverrides/AllAppsState.java | 6 +- 7 files changed, 75 insertions(+), 17 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java b/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java index d2f54874f5..7da50c8836 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java @@ -16,7 +16,7 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherAnimUtils.ALL_APPS_TRANSITION_MS; -import static com.android.launcher3.allapps.DiscoveryBounce.APPS_VIEW_SHOWN; +import static com.android.launcher3.allapps.DiscoveryBounce.SHELF_BOUNCE_SEEN; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; import android.view.View; @@ -47,8 +47,8 @@ public class AllAppsState extends LauncherState { @Override public void onStateEnabled(Launcher launcher) { - if (!launcher.getSharedPrefs().getBoolean(APPS_VIEW_SHOWN, false)) { - launcher.getSharedPrefs().edit().putBoolean(APPS_VIEW_SHOWN, true).apply(); + if (!launcher.getSharedPrefs().getBoolean(SHELF_BOUNCE_SEEN, false)) { + launcher.getSharedPrefs().edit().putBoolean(SHELF_BOUNCE_SEEN, true).apply(); } AbstractFloatingView.closeAllOpenViews(launcher); diff --git a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java index 026f059f76..61422e02fa 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java @@ -16,6 +16,7 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS; +import static com.android.launcher3.allapps.DiscoveryBounce.HOME_BOUNCE_SEEN; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; import static com.android.launcher3.states.RotationHelper.REQUEST_ROTATE; @@ -25,6 +26,7 @@ import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; +import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.quickstep.views.RecentsView; @@ -57,6 +59,10 @@ public class OverviewState extends LauncherState { @Override public void onStateEnabled(Launcher launcher) { + if (!launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false)) { + launcher.getSharedPrefs().edit().putBoolean(HOME_BOUNCE_SEEN, true).apply(); + } + RecentsView rv = launcher.getOverviewPanel(); rv.setOverviewStateEnabled(true); AbstractFloatingView.closeAllOpenViews(launcher); @@ -71,6 +77,7 @@ public class OverviewState extends LauncherState { @Override public void onStateTransitionEnd(Launcher launcher) { launcher.getRotationHelper().setCurrentStateRequest(REQUEST_ROTATE); + DiscoveryBounce.showForOverviewIfNeeded(launcher); } @Override diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 0ea729f280..7de19b8115 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -39,6 +39,7 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherInitListener; import com.android.launcher3.LauncherState; import com.android.launcher3.allapps.AllAppsTransitionController; +import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.util.ViewOnDrawExecutor; import com.android.quickstep.util.LayoutUtils; @@ -83,6 +84,8 @@ public interface ActivityControlHelper { ActivityInitListener createActivityInitListener(BiPredicate onInitListener); + void onOverviewShown(T activity); + @Nullable T getCreatedActivity(); @@ -225,6 +228,11 @@ public interface ActivityControlHelper { return new LauncherInitListener(onInitListener); } + @Override + public void onOverviewShown(Launcher launcher) { + DiscoveryBounce.showForOverviewIfNeeded(launcher); + } + @Nullable @Override public Launcher getCreatedActivity() { @@ -366,6 +374,11 @@ public interface ActivityControlHelper { return new RecentsActivityTracker(onInitListener); } + @Override + public void onOverviewShown(RecentsActivity activity) { + // Do nothing. + } + @Nullable @Override public RecentsActivity getCreatedActivity() { diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 0944a7a26f..51f6a6fca1 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -699,6 +699,7 @@ public class WindowTransformSwipeHandler { finishTransitionRunnable.run(); } RecentsModel.getInstance(mContext).onOverviewShown(false, TAG); + mActivityControlHelper.onOverviewShown(mActivity); doLogGesture(true /* toLauncher */); } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index ec0a8ffb3f..0eeec70f0f 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -787,7 +787,7 @@ public class Launcher extends BaseDraggingActivity // Refresh shortcuts if the permission changed. mModel.refreshShortcutsIfRequired(); - DiscoveryBounce.showIfNeeded(this); + DiscoveryBounce.showForHomeIfNeeded(this); if (mLauncherCallbacks != null) { mLauncherCallbacks.onResume(); } diff --git a/src/com/android/launcher3/allapps/DiscoveryBounce.java b/src/com/android/launcher3/allapps/DiscoveryBounce.java index fddafb2a65..0ce33bcc68 100644 --- a/src/com/android/launcher3/allapps/DiscoveryBounce.java +++ b/src/com/android/launcher3/allapps/DiscoveryBounce.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,13 +17,18 @@ package com.android.launcher3.allapps; import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.LauncherState.OVERVIEW; import android.animation.Animator; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; +import android.animation.Keyframe; +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; +import android.animation.TimeInterpolator; import android.app.ActivityManager; -import android.content.Context; import android.view.MotionEvent; +import android.view.animation.PathInterpolator; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; @@ -31,21 +36,21 @@ import com.android.launcher3.R; import com.android.launcher3.compat.UserManagerCompat; /** - * Floating view responsible for showing discovery bounce animation + * Abstract base class of floating view responsible for showing discovery bounce animation */ public class DiscoveryBounce extends AbstractFloatingView { - public static final String APPS_VIEW_SHOWN = "launcher.apps_view_shown"; + public static final String HOME_BOUNCE_SEEN = "launcher.apps_view_shown"; + public static final String SHELF_BOUNCE_SEEN = "launcher.shelf_bounce_seen"; private final Launcher mLauncher; private final Animator mDiscoBounceAnimation; - public DiscoveryBounce(Launcher launcher) { + public DiscoveryBounce(Launcher launcher, Animator animator) { super(launcher, null); mLauncher = launcher; - mDiscoBounceAnimation = AnimatorInflater.loadAnimator(mLauncher, - R.animator.discovery_bounce); + mDiscoBounceAnimation = animator; AllAppsTransitionController controller = mLauncher.getAllAppsController(); mDiscoBounceAnimation.setTarget(controller); mDiscoBounceAnimation.addListener(controller.getProgressAnimatorListener()); @@ -96,16 +101,48 @@ public class DiscoveryBounce extends AbstractFloatingView { return (type & TYPE_ON_BOARD_POPUP) != 0; } - public static void showIfNeeded(Launcher launcher) { + public static void showForHomeIfNeeded(Launcher launcher) { if (!launcher.isInState(NORMAL) - || launcher.getSharedPrefs().getBoolean(APPS_VIEW_SHOWN, false) + || launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false) || AbstractFloatingView.getTopOpenView(launcher) != null || UserManagerCompat.getInstance(launcher).isDemoUser() || ActivityManager.isRunningInTestHarness()) { return; } - DiscoveryBounce view = new DiscoveryBounce(launcher); + DiscoveryBounce view = new DiscoveryBounce(launcher, + AnimatorInflater.loadAnimator(launcher, R.animator.discovery_bounce)); + view.mIsOpen = true; + launcher.getDragLayer().addView(view); + } + + public static void showForOverviewIfNeeded(Launcher launcher) { + if (!launcher.isInState(OVERVIEW) + || launcher.getDeviceProfile().isVerticalBarLayout() + || launcher.getSharedPrefs().getBoolean(SHELF_BOUNCE_SEEN, false) + || UserManagerCompat.getInstance(launcher).isDemoUser() + || ActivityManager.isRunningInTestHarness()) { + return; + } + + float verticalProgress = OVERVIEW.getVerticalProgress(launcher); + + TimeInterpolator pathInterpolator = new PathInterpolator(0.35f, 0, 0.5f, 1); + Keyframe keyframe3 = Keyframe.ofFloat(0.423f, verticalProgress - (1 - 0.9438f)); + keyframe3.setInterpolator(pathInterpolator); + Keyframe keyframe4 = Keyframe.ofFloat(0.654f, verticalProgress); + keyframe4.setInterpolator(pathInterpolator); + + PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofKeyframe("progress", + Keyframe.ofFloat(0, verticalProgress), + Keyframe.ofFloat(0.346f, verticalProgress), keyframe3, keyframe4, + Keyframe.ofFloat(1f, verticalProgress)); + ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(null, + new PropertyValuesHolder[]{propertyValuesHolder}); + animator.setDuration(2166); + animator.setRepeatCount(5); + + DiscoveryBounce view = new DiscoveryBounce(launcher, animator); view.mIsOpen = true; launcher.getDragLayer().addView(view); } diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java b/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java index 49a9dc7c93..6366b2d8f8 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java @@ -16,7 +16,7 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherAnimUtils.ALL_APPS_TRANSITION_MS; -import static com.android.launcher3.allapps.DiscoveryBounce.APPS_VIEW_SHOWN; +import static com.android.launcher3.allapps.DiscoveryBounce.HOME_BOUNCE_SEEN; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; import android.view.View; @@ -49,8 +49,8 @@ public class AllAppsState extends LauncherState { @Override public void onStateEnabled(Launcher launcher) { - if (!launcher.getSharedPrefs().getBoolean(APPS_VIEW_SHOWN, false)) { - launcher.getSharedPrefs().edit().putBoolean(APPS_VIEW_SHOWN, true).apply(); + if (!launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false)) { + launcher.getSharedPrefs().edit().putBoolean(HOME_BOUNCE_SEEN, true).apply(); } AbstractFloatingView.closeAllOpenViews(launcher); From 78595cd7dea011bcfc9b40791a5f85bdaa122c23 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 16 Apr 2018 14:08:57 -0700 Subject: [PATCH 076/257] Compute window offset when quick scrub starts Instead of setting the window center to match the task center on every update, compute the final offset when quick scrub starts and interpolate alongside other factors such as window scale. Bug: 78027888 Change-Id: I33b115764d46ecd6907ecb82b1ba12aeefc583c5 --- .../quickstep/ActivityControlHelper.java | 15 +++++++ .../WindowTransformSwipeHandler.java | 33 +++++++++----- .../quickstep/util/ClipAnimationHelper.java | 45 +++++++++++-------- .../quickstep/views/LauncherRecentsView.java | 6 ++- .../com/android/quickstep/views/TaskView.java | 11 ++++- 5 files changed, 78 insertions(+), 32 deletions(-) diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index d3b05763ff..e83c2f3382 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -43,6 +43,7 @@ import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.LauncherLayoutListener; +import com.android.quickstep.views.LauncherRecentsView; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.RecentsViewContainer; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; @@ -65,6 +66,8 @@ public interface ActivityControlHelper { */ boolean onQuickInteractionStart(T activity, boolean activityVisible); + float getTranslationYForQuickScrub(T activity); + void executeOnWindowAvailable(T activity, Runnable action); void onTransitionCancelled(T activity, boolean activityVisible); @@ -117,6 +120,13 @@ public interface ActivityControlHelper { return !fromState.overviewUi; } + @Override + public float getTranslationYForQuickScrub(Launcher activity) { + LauncherRecentsView recentsView = activity.getOverviewPanel(); + float transYFactor = FAST_OVERVIEW.getOverviewScaleAndTranslationYFactor(activity)[1]; + return recentsView.computeTranslationYForFactor(transYFactor); + } + @Override public void executeOnWindowAvailable(Launcher activity, Runnable action) { if (activity.getWorkspace().runOnOverlayHidden(action)) { @@ -275,6 +285,11 @@ public interface ActivityControlHelper { return false; } + @Override + public float getTranslationYForQuickScrub(RecentsActivity activity) { + return 0; + } + @Override public void executeOnWindowAvailable(RecentsActivity activity, Runnable action) { action.run(); diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 25539aa754..dacae75cd9 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -458,17 +458,6 @@ public class WindowTransformSwipeHandler { } mLauncherTransitionController.setPlayFraction(shift); - // Make sure the window follows the first task if it moves, e.g. during quick scrub. - View firstTask = mRecentsView.getPageAt(0); - // The first task may be null if we are swiping up from a task that does not - // appear in the list (ie. the assistant) - if (firstTask != null) { - int scrollForFirstTask = mRecentsView.getScrollForPage(0); - int offsetFromFirstTask = (scrollForFirstTask - mRecentsView.getScrollX()); - mClipAnimationHelper.offsetTarget(firstTask.getScaleX(), - offsetFromFirstTask + firstTask.getTranslationX(), - mRecentsView.getTranslationY()); - } if (mRecentsAnimationWrapper.controller != null) { // TODO: This logic is spartanic! boolean passedThreshold = shift > 0.12f; @@ -714,11 +703,31 @@ public class WindowTransformSwipeHandler { } private void onQuickScrubStart() { - mActivityControlHelper.onQuickInteractionStart(mActivity, mWasLauncherAlreadyVisible); + if (mLauncherTransitionController != null) { + mLauncherTransitionController.getAnimationPlayer().end(); + mLauncherTransitionController = null; + } + + mActivityControlHelper.onQuickInteractionStart(mActivity, false); mQuickScrubController.onQuickScrubStart(false); // Inform the last progress in case we skipped before. mQuickScrubController.onQuickScrubProgress(mCurrentQuickScrubProgress); + + // Make sure the window follows the first task if it moves, e.g. during quick scrub. + TaskView firstTask = mRecentsView.getPageAt(0); + // The first task may be null if we are swiping up from a task that does not + // appear in the list (i.e. the assistant) + if (firstTask != null) { + int scrollForFirstTask = mRecentsView.getScrollForPage(0); + int scrollForSecondTask = mRecentsView.getChildCount() > 1 + ? mRecentsView.getScrollForPage(1) : scrollForFirstTask; + int offsetFromFirstTask = scrollForFirstTask - scrollForSecondTask; + float interpolation = offsetFromFirstTask / (mRecentsView.getWidth() / 2); + mClipAnimationHelper.offsetTarget( + firstTask.getCurveScaleForInterpolation(interpolation), offsetFromFirstTask, + mActivityControlHelper.getTranslationYForQuickScrub(mActivity)); + } } private void onFinishedTransitionToQuickScrub() { diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index fb7a850d75..eb67155579 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -15,9 +15,13 @@ */ package com.android.quickstep.util; +import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.launcher3.anim.Interpolators.SCROLL; + import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Matrix.ScaleToFit; +import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; @@ -46,8 +50,10 @@ public class ClipAnimationHelper { private final RectF mSourceRect = new RectF(); // The bounds of the task view in launcher window coordinates private final RectF mTargetRect = new RectF(); - // Doesn't change after initialized, used as an anchor when changing mTargetRect - private final RectF mInitialTargetRect = new RectF(); + // Doesn't change after initialized, used as an anchor when changing mTargetOffset + private final PointF mInitialTargetOffset = new PointF(); + // Set when the final window destination is changed, such as offsetting for quick scrub + private final PointF mTargetOffset = new PointF(); // The insets to be used for clipping the app window, which can be larger than mSourceInsets // if the aspect ratio of the target is smaller than the aspect ratio of the source rect. In // app window coordinates. @@ -60,6 +66,9 @@ public class ClipAnimationHelper { private final Rect mClipRect = new Rect(); private final RectFEvaluator mRectFEvaluator = new RectFEvaluator(); private final Matrix mTmpMatrix = new Matrix(); + private final RectF mTmpRectF = new RectF(); + + private float mTargetScale = 1f; public void updateSource(Rect homeStackBounds, RemoteAnimationTargetCompat target) { mHomeStackBounds.set(homeStackBounds); @@ -75,10 +84,9 @@ public class ClipAnimationHelper { mSourceStackBounds.width() - mSourceInsets.right, mSourceStackBounds.height() - mSourceInsets.bottom); mTargetRect.set(targetRect); - mTargetRect.offset(mHomeStackBounds.left - mSourceStackBounds.left, + mInitialTargetOffset.set(mHomeStackBounds.left - mSourceStackBounds.left, mHomeStackBounds.top - mSourceStackBounds.top); - - mInitialTargetRect.set(mTargetRect); + mTargetOffset.set(mInitialTargetOffset); // Calculate the clip based on the target rect (since the content insets and the // launcher insets may differ, so the aspect ratio of the target rect can differ @@ -98,10 +106,13 @@ public class ClipAnimationHelper { public void applyTransform(RemoteAnimationTargetSet targetSet, float progress) { RectF currentRect; - synchronized (mTargetRect) { - currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTargetRect); + mTmpRectF.set(mTargetRect); + Utilities.scaleRectFAboutCenter(mTmpRectF, mTargetScale); + currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTmpRectF); + synchronized (mTargetOffset) { // Stay lined up with the center of the target, since it moves for quick scrub. - currentRect.offset(mTargetRect.centerX() - currentRect.centerX(), 0); + currentRect.offset(mTargetOffset.x * SCROLL.getInterpolation(progress), + mTargetOffset.y * LINEAR.getInterpolation(progress)); } mClipRect.left = (int) (mSourceWindowClipInsets.left * progress); @@ -131,10 +142,10 @@ public class ClipAnimationHelper { } public void offsetTarget(float scale, float offsetX, float offsetY) { - synchronized (mTargetRect) { - mTargetRect.set(mInitialTargetRect); - Utilities.scaleRectFAboutCenter(mTargetRect, scale); - mTargetRect.offset(offsetX, offsetY); + synchronized (mTargetOffset) { + mTargetScale = scale; + mTargetOffset.set(mInitialTargetOffset); + mTargetOffset.offset(offsetX, offsetY); } } @@ -187,13 +198,11 @@ public class ClipAnimationHelper { } public void drawForProgress(TaskThumbnailView ttv, Canvas canvas, float progress) { - RectF currentRect; - synchronized (mTargetRect) { - currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTargetRect); - } + RectF currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTargetRect); - canvas.translate(mSourceStackBounds.left - mHomeStackBounds.left, - mSourceStackBounds.top - mHomeStackBounds.top); + synchronized (mTargetOffset) { + canvas.translate(-mTargetOffset.x, -mTargetOffset.y); + } mTmpMatrix.setRectToRect(mTargetRect, currentRect, ScaleToFit.FILL); canvas.concat(mTmpMatrix); canvas.translate(mTargetRect.left, mTargetRect.top); diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 06e5311410..d69beb6a51 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -86,7 +86,11 @@ public class LauncherRecentsView extends RecentsView { public void setTranslationYFactor(float translationFactor) { mTranslationYFactor = translationFactor; - setTranslationY(mTranslationYFactor * (getPaddingBottom() - getPaddingTop())); + setTranslationY(computeTranslationYForFactor(mTranslationYFactor)); + } + + public float computeTranslationYForFactor(float translationYFactor) { + return translationYFactor * (getPaddingBottom() - getPaddingTop()); } @Override diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index b32d8dd45d..8c1076a972 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -219,11 +219,20 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback mSnapshotView.setDimAlpha(mCurveDimAlpha); } - mCurveScale = 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR; + mCurveScale = getCurveScaleForCurveInterpolation(curveInterpolation); setScaleX(mCurveScale); setScaleY(mCurveScale); } + public float getCurveScaleForInterpolation(float linearInterpolation) { + float curveInterpolation = CURVE_INTERPOLATOR.getInterpolation(linearInterpolation); + return getCurveScaleForCurveInterpolation(curveInterpolation); + } + + private float getCurveScaleForCurveInterpolation(float curveInterpolation) { + return 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR; + } + public float getCurveScale() { return mCurveScale; } From cd95352ada7ea62b9340c0535a93a25a1744dbc6 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Fri, 20 Apr 2018 16:39:20 +0200 Subject: [PATCH 077/257] Remove prolonged animations Never worked in P, not needed. Test: Enter split screen Bug: 77993227 Change-Id: I092c4141c23dd7ded4e11a0f54156b1abfa2b1c6 --- quickstep/libs/sysui_shared.jar | Bin 122700 -> 123841 bytes .../android/quickstep/TaskSystemShortcut.java | 10 ---------- 2 files changed, 10 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 19a9b179eae5bf0c62637a77f083f48cae08da8e..d2989ef75fece8adf3705e63a530999ae4f5a8b9 100644 GIT binary patch delta 12512 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 bl9FqyV}MzXf?@&wyUBrqV&4c(D$4%@Id%&S delta 11674 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 diff --git a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java index e3f6543ce9..a82c679244 100644 --- a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java +++ b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java @@ -150,15 +150,6 @@ public class TaskSystemShortcut extends SystemShortcut } }; - final OnPreDrawListener preDrawListener = new OnPreDrawListener() { - @Override - public boolean onPreDraw() { - taskView.getViewTreeObserver().removeOnPreDrawListener(this); - WindowManagerWrapper.getInstance().endProlongedAnimations(); - return true; - } - }; - AbstractFloatingView.closeOpenViews(activity, true, AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE); @@ -182,7 +173,6 @@ public class TaskSystemShortcut extends SystemShortcut // afterwards recentsView.addIgnoreResetTask(taskView); taskView.setAlpha(0f); - taskView.getViewTreeObserver().addOnPreDrawListener(preDrawListener); }; final int[] position = new int[2]; From 0bbacc705cc7c11608549b5408e05a3c1726d074 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 23 Apr 2018 11:30:36 -0700 Subject: [PATCH 078/257] Moving some swipe up complete logic to when the handler is completed. Bug: 76449024 Change-Id: I136e665495ab7164c79e1dfa0ef61090ba50fc7a --- .../quickstep/ActivityControlHelper.java | 13 +-------- .../WindowTransformSwipeHandler.java | 7 ++--- .../launcher3/allapps/DiscoveryBounce.java | 28 +++++++++++++++++++ .../states/InternalStateHandler.java | 8 ++++++ 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index b784c033f3..84d97a9266 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -79,8 +79,6 @@ public interface ActivityControlHelper { ActivityInitListener createActivityInitListener(BiPredicate onInitListener); - void onOverviewShown(T activity); - @Nullable T getCreatedActivity(); @@ -150,6 +148,7 @@ public interface ActivityControlHelper { public void onSwipeUpComplete(Launcher activity) { // Re apply state in case we did something funky during the transition. activity.getStateManager().reapplyState(); + DiscoveryBounce.showForOverviewIfNeeded(activity); } @Override @@ -213,11 +212,6 @@ public interface ActivityControlHelper { return new LauncherInitListener(onInitListener); } - @Override - public void onOverviewShown(Launcher launcher) { - DiscoveryBounce.showForOverviewIfNeeded(launcher); - } - @Nullable @Override public Launcher getCreatedActivity() { @@ -372,11 +366,6 @@ public interface ActivityControlHelper { return new RecentsActivityTracker(onInitListener); } - @Override - public void onOverviewShown(RecentsActivity activity) { - // Do nothing. - } - @Nullable @Override public RecentsActivity getCreatedActivity() { diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 248aa41818..7b09b8ffee 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -694,9 +694,6 @@ public class WindowTransformSwipeHandler { // If we haven't posted the transition end runnable, run it now finishTransitionRunnable.run(); } - RecentsModel.getInstance(mContext).onOverviewShown(false, TAG); - mActivityControlHelper.onOverviewShown(mActivity); - doLogGesture(true /* toLauncher */); } private void setupLauncherUiAfterSwipeUpAnimation() { @@ -708,9 +705,11 @@ public class WindowTransformSwipeHandler { // Animate the first icon. mRecentsView.setFirstTaskIconScaledDown(false /* isScaledDown */, true /* animate */); - mRecentsView.setSwipeDownShouldLaunchApp(true); + RecentsModel.getInstance(mContext).onOverviewShown(false, TAG); + + doLogGesture(true /* toLauncher */); reset(); } diff --git a/src/com/android/launcher3/allapps/DiscoveryBounce.java b/src/com/android/launcher3/allapps/DiscoveryBounce.java index 0ce33bcc68..f73916c54c 100644 --- a/src/com/android/launcher3/allapps/DiscoveryBounce.java +++ b/src/com/android/launcher3/allapps/DiscoveryBounce.java @@ -27,6 +27,7 @@ import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.TimeInterpolator; import android.app.ActivityManager; +import android.os.Handler; import android.view.MotionEvent; import android.view.animation.PathInterpolator; @@ -34,12 +35,15 @@ import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.states.InternalStateHandler; /** * Abstract base class of floating view responsible for showing discovery bounce animation */ public class DiscoveryBounce extends AbstractFloatingView { + private static final long DELAY_MS = 200; + public static final String HOME_BOUNCE_SEEN = "launcher.apps_view_shown"; public static final String SHELF_BOUNCE_SEEN = "launcher.shelf_bounce_seen"; @@ -102,6 +106,10 @@ public class DiscoveryBounce extends AbstractFloatingView { } public static void showForHomeIfNeeded(Launcher launcher) { + showForHomeIfNeeded(launcher, true); + } + + private static void showForHomeIfNeeded(Launcher launcher, boolean withDelay) { if (!launcher.isInState(NORMAL) || launcher.getSharedPrefs().getBoolean(HOME_BOUNCE_SEEN, false) || AbstractFloatingView.getTopOpenView(launcher) != null @@ -110,6 +118,11 @@ public class DiscoveryBounce extends AbstractFloatingView { return; } + if (withDelay) { + new Handler().postDelayed(() -> showForHomeIfNeeded(launcher, false), DELAY_MS); + return; + } + DiscoveryBounce view = new DiscoveryBounce(launcher, AnimatorInflater.loadAnimator(launcher, R.animator.discovery_bounce)); view.mIsOpen = true; @@ -117,7 +130,13 @@ public class DiscoveryBounce extends AbstractFloatingView { } public static void showForOverviewIfNeeded(Launcher launcher) { + showForOverviewIfNeeded(launcher, true); + } + + private static void showForOverviewIfNeeded(Launcher launcher, boolean withDelay) { if (!launcher.isInState(OVERVIEW) + || !launcher.hasBeenResumed() + || launcher.isForceInvisible() || launcher.getDeviceProfile().isVerticalBarLayout() || launcher.getSharedPrefs().getBoolean(SHELF_BOUNCE_SEEN, false) || UserManagerCompat.getInstance(launcher).isDemoUser() @@ -125,6 +144,15 @@ public class DiscoveryBounce extends AbstractFloatingView { return; } + if (withDelay) { + new Handler().postDelayed(() -> showForOverviewIfNeeded(launcher, false), DELAY_MS); + return; + } else if (InternalStateHandler.hasPending() + || AbstractFloatingView.getTopOpenView(launcher) != null) { + // TODO: Move these checks to the top and call this method after invalidate handler. + return; + } + float verticalProgress = OVERVIEW.getVerticalProgress(launcher); TimeInterpolator pathInterpolator = new PathInterpolator(0.35f, 0, 0.5f, 1); diff --git a/src/com/android/launcher3/states/InternalStateHandler.java b/src/com/android/launcher3/states/InternalStateHandler.java index 0a2c3e4fa1..cf7c6ba398 100644 --- a/src/com/android/launcher3/states/InternalStateHandler.java +++ b/src/com/android/launcher3/states/InternalStateHandler.java @@ -60,6 +60,10 @@ public abstract class InternalStateHandler extends Binder { return sScheduler.clearReference(this); } + public static boolean hasPending() { + return sScheduler.hasPending(); + } + public static boolean handleCreate(Launcher launcher, Intent intent) { return handleIntent(launcher, intent, false, false); } @@ -132,5 +136,9 @@ public abstract class InternalStateHandler extends Binder { } return false; } + + public boolean hasPending() { + return mPendingHandler.get() != null; + } } } \ No newline at end of file From f86337e207cf96dfc9a768376c1f5437d3b2cf5d Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 23 Apr 2018 11:49:33 -0700 Subject: [PATCH 079/257] Update shared lib for fullscreen state to task snapshot. Change-Id: I9fa585f303f2613eeb5aa30cc0546230e743bbed --- quickstep/libs/sysui_shared.jar | Bin 123841 -> 124023 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index d2989ef75fece8adf3705e63a530999ae4f5a8b9..1b68ba1a19694a75c379d713e0a9701c496aacbb 100644 GIT binary patch delta 6750 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 bab*7Uk)*fEXv@PDKIJ||ib1Rb76kV{8yG`r delta 6507 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 From c6b977a42e2a05d7b0ad28e7d300a87d696611ad Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 23 Apr 2018 11:38:32 -0700 Subject: [PATCH 080/257] Remove preference to flip recents Now we always flip recents, and don't have a setting. Bug: 78231551 Change-Id: Icc991dbe4674e9238e1d7e39938009b51bde7bd5 --- .../android/quickstep/views/RecentsView.java | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index a7b018afb0..a2a93d71fb 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -30,8 +30,6 @@ import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; @@ -85,8 +83,7 @@ import java.util.function.Consumer; * A list of recent tasks. */ @TargetApi(Build.VERSION_CODES.P) -public abstract class RecentsView - extends PagedView implements OnSharedPreferenceChangeListener, Insettable { +public abstract class RecentsView extends PagedView implements Insettable { public static final boolean DEBUG_SHOW_CLEAR_ALL_BUTTON = false; @@ -104,7 +101,7 @@ public abstract class RecentsView return recentsView.mAdjacentScale; } }; - private static final String PREF_FLIP_RECENTS = "pref_flip_recents"; + private static final boolean FLIP_RECENTS = true; private static final int DISMISS_TASK_DURATION = 300; protected final T mActivity; @@ -201,7 +198,11 @@ public abstract class RecentsView mQuickScrubController = new QuickScrubController(mActivity, this); mModel = RecentsModel.getInstance(context); - onSharedPreferenceChanged(Utilities.getPrefs(context), PREF_FLIP_RECENTS); + mIsRtl = Utilities.isRtl(getResources()); + if (FLIP_RECENTS) { + mIsRtl = !mIsRtl; + } + setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR); mEmptyIcon = context.getDrawable(R.drawable.ic_empty_recents); mEmptyIcon.setCallback(this); @@ -215,17 +216,6 @@ public abstract class RecentsView setWillNotDraw(false); } - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { - if (s.equals(PREF_FLIP_RECENTS)) { - mIsRtl = Utilities.isRtl(getResources()); - if (sharedPreferences.getBoolean(PREF_FLIP_RECENTS, false)) { - mIsRtl = !mIsRtl; - } - setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR); - } - } - public boolean isRtl() { return mIsRtl; } @@ -248,7 +238,6 @@ public abstract class RecentsView protected void onAttachedToWindow() { super.onAttachedToWindow(); updateTaskStackListenerState(); - Utilities.getPrefs(getContext()).registerOnSharedPreferenceChangeListener(this); mActivity.addMultiWindowModeChangedListener(mMultiWindowModeChangedListener); } @@ -256,7 +245,6 @@ public abstract class RecentsView protected void onDetachedFromWindow() { super.onDetachedFromWindow(); updateTaskStackListenerState(); - Utilities.getPrefs(getContext()).unregisterOnSharedPreferenceChangeListener(this); mActivity.removeMultiWindowModeChangedListener(mMultiWindowModeChangedListener); } From 2670fde01e3429716dfcf28daff8f177e99124f6 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 18 Apr 2018 16:41:55 -0700 Subject: [PATCH 081/257] Setting transparency for clear-all button. See visual spec: https://gallery.googleplex.com/projects/MCHbtQVoQ2HCZdNNRhNUDzOW/files/MCEf7JcwkS_N8QTSAba7WiJQwMSJbxAVNpw Bug: 72222505 Test: Manual Change-Id: I61c7e4ccc89396827a17450db4a5e1017a5579a1 --- .../fallback/FallbackRecentsView.java | 1 - .../android/quickstep/views/RecentsView.java | 55 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 3d64cc8c71..f97ad0ae1b 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -35,7 +35,6 @@ public class FallbackRecentsView extends RecentsView { public FallbackRecentsView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setOverviewStateEnabled(true); - updateEmptyMessage(); } @Override diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index f59ddde2ec..a602d9a277 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -213,6 +213,7 @@ public abstract class RecentsView mEmptyMessagePadding = getResources() .getDimensionPixelSize(R.dimen.recents_empty_message_text_padding); setWillNotDraw(false); + updateEmptyMessage(); } @Override @@ -310,6 +311,56 @@ public abstract class RecentsView } } + private float calculateClearAllButtonAlpha() { + if (mClearAllButton.getVisibility() != View.VISIBLE) return 0; + + // Current visible coordinate of the right border of the rightmost task. + final int carouselCurrentRight = getChildAt(getChildCount() - 1).getRight() - getScrollX(); + + // As the right border (let's call it E aka carouselCurrentRight) of the carousel moves + // over Clear all button, the button changes trasparency. + // leftOfAlphaChange < rightOfAlphaChange; these are the points of the 100% and 0% alpha + // correspondingly. Alpha changes linearly between 100% and 0% as E moves through this + // range. It doesn't change outside of the range. + + // Once E hits the left border of the Clear-All button, the whole button is uncovered, + // and it should have alpha 100%. + final float leftOfAlphaChange = mClearAllButton.getX(); + + // The rightmost possible right coordinate of the carousel. + final int carouselMotionLimit = getScrollForPage(getChildCount() - 1) + getWidth() + - getPaddingRight() - mInsets.right; + + // The carousel might not be able to ever cover a part of the Clear-all button. Then + // always show the button as 100%. Technically, this check also prevents dividing by zero + // or a negative number when calculating the transparency ratio below. + if (carouselMotionLimit <= leftOfAlphaChange) return 1; + + // If the carousel is able to cover the button completely, we make the button completely + // transparent when E hits the right border of the button. + // Or, the carousel may not be able to move that far to the right so it completely covers + // the button. Then we set the rightmost possible position of the carousel as the point + // where the button reaches 0 alpha. + final float rightOfAlphaChange = Math.min( + mClearAllButton.getX() + mClearAllButton.getWidth(), carouselMotionLimit); + + return Utilities.boundToRange( + (rightOfAlphaChange - carouselCurrentRight) / + (rightOfAlphaChange - leftOfAlphaChange), 0, 1); + } + + private void updateClearAllButtonAlpha() { + if (mClearAllButton != null) { + mClearAllButton.setAlpha(calculateClearAllButtonAlpha() * mContentAlpha); + } + } + + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); + updateClearAllButtonAlpha(); + } + @Override public boolean onTouchEvent(MotionEvent ev) { if (DEBUG_SHOW_CLEAR_ALL_BUTTON && ev.getAction() == MotionEvent.ACTION_DOWN @@ -864,6 +915,7 @@ public abstract class RecentsView int alphaInt = Math.round(alpha * 255); mEmptyMessagePaint.setAlpha(alphaInt); mEmptyIcon.setAlpha(alphaInt); + updateClearAllButtonAlpha(); } public void setAdjacentScale(float adjacentScale) { @@ -948,6 +1000,7 @@ public abstract class RecentsView mEmptyTextLayout = null; mLastMeasureSize.set(getWidth(), getHeight()); } + updateClearAllButtonVisibility(); if (!mShowEmptyMessage) return; @@ -1138,8 +1191,10 @@ public abstract class RecentsView } private void updateClearAllButtonVisibility() { + if (mClearAllButton == null) return; mClearAllButton.setVisibility( !DEBUG_SHOW_CLEAR_ALL_BUTTON || mShowEmptyMessage ? GONE : VISIBLE); + updateClearAllButtonAlpha(); } public void setClearAllButton(View clearAllButton) { From 4213783716a46a21512fe149e89e53081539b9d4 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 23 Apr 2018 14:03:04 -0700 Subject: [PATCH 082/257] Updating gradle configuration Change-Id: I77c6ba057c751123bb40862a94a0027b7e0c87ef --- AndroidManifest-common.xml | 1 - build.gradle | 50 ++++++++++++++++++++------------ quickstep/AndroidManifest.xml | 2 -- tests/AndroidManifest-common.xml | 2 -- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml index c24850d847..fe8d65e3b1 100644 --- a/AndroidManifest-common.xml +++ b/AndroidManifest-common.xml @@ -20,7 +20,6 @@ - + + + "কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ স্পৰ্শ কৰি ৰাখক।" + "কোনো শ্বৰ্টকাট বাছনি কৰিবলৈ দুবাৰ টিপি ৰাখক বা নিজৰ উপযোগিতা অনুসৰি বনোৱা কাৰ্যসমূহ ব্যৱহাৰ কৰক।" + "শ্বৰ্টকাটসমূহ" + "%1$s শ্বৰ্টকাটসমূহ" + diff --git a/go/res/values-az-rAZ/strings.xml b/go/res/values-az-rAZ/strings.xml new file mode 100644 index 0000000000..c4b8cb7801 --- /dev/null +++ b/go/res/values-az-rAZ/strings.xml @@ -0,0 +1,26 @@ + + + + + "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-be-rBY/strings.xml b/go/res/values-be-rBY/strings.xml new file mode 100644 index 0000000000..4189e35fa0 --- /dev/null +++ b/go/res/values-be-rBY/strings.xml @@ -0,0 +1,26 @@ + + + + + "Дакраніцеся і ўтрымлiвайце ярлык, каб дадаць яго." + "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць ярлык або выкарыстоўваць спецыяльныя дзеянні." + "Ярлыкі" + "Ярлыкі %1$s" + diff --git a/go/res/values-bn-rBD/strings.xml b/go/res/values-bn-rBD/strings.xml new file mode 100644 index 0000000000..c56c925a29 --- /dev/null +++ b/go/res/values-bn-rBD/strings.xml @@ -0,0 +1,26 @@ + + + + + "কোনও শর্টকাট বেছে নিতে টাচ করে ধরে রাখুন।" + "কোনও শর্টকাট বেছে নিতে ডাবল ট্যাপ করে ধরে রাখুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন।" + "শর্টকাট" + "%1$s এর শর্টকাট" + diff --git a/go/res/values-hy-rAM/strings.xml b/go/res/values-hy-rAM/strings.xml new file mode 100644 index 0000000000..4747f6df35 --- /dev/null +++ b/go/res/values-hy-rAM/strings.xml @@ -0,0 +1,26 @@ + + + + + "Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար։" + "Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար կամ օգտվեք հարմարեցրած գործողություններից:" + "Դյուրանցումներ" + "%1$s դյուրանցումներ" + diff --git a/go/res/values-is-rIS/strings.xml b/go/res/values-is-rIS/strings.xml new file mode 100644 index 0000000000..b8bb923746 --- /dev/null +++ b/go/res/values-is-rIS/strings.xml @@ -0,0 +1,26 @@ + + + + + "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-ka-rGE/strings.xml b/go/res/values-ka-rGE/strings.xml new file mode 100644 index 0000000000..1b46534788 --- /dev/null +++ b/go/res/values-ka-rGE/strings.xml @@ -0,0 +1,26 @@ + + + + + "შეეხეთ და დააყოვნეთ მალსახმობის ასარჩევად." + "ორმაგად შეეხეთ და გეჭიროთ მალსახმობის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." + "მალსახმობები" + "%1$s-ის მალსახმობები" + diff --git a/go/res/values-kk-rKZ/strings.xml b/go/res/values-kk-rKZ/strings.xml new file mode 100644 index 0000000000..e909818afc --- /dev/null +++ b/go/res/values-kk-rKZ/strings.xml @@ -0,0 +1,26 @@ + + + + + "Таңбашаны таңдау үшін оны түртіп, ұстап тұрыңыз." + "Таңбашаны таңдау немесе арнаулы әрекеттерді пайдалану үшін екі рет түртіп, ұстап тұрыңыз." + "Таңбашалар" + "%1$s таңбаша" + diff --git a/go/res/values-km-rKH/strings.xml b/go/res/values-km-rKH/strings.xml new file mode 100644 index 0000000000..40082a4b9d --- /dev/null +++ b/go/res/values-km-rKH/strings.xml @@ -0,0 +1,26 @@ + + + + + "ប៉ះ ហើយចុចឲ្យជាប់ដើម្បីរើសផ្លូវកាត់មួយ។" + "ប៉ះពីរដង ហើយចុចឱ្យជាប់ដើម្បីរើសផ្លូវកាត់មួយ ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" + "ផ្លូវកាត់" + "ផ្លូវកាត់សម្រាប់ %1$s" + diff --git a/go/res/values-kn-rIN/strings.xml b/go/res/values-kn-rIN/strings.xml new file mode 100644 index 0000000000..9c121fd294 --- /dev/null +++ b/go/res/values-kn-rIN/strings.xml @@ -0,0 +1,26 @@ + + + + + "ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಶಾರ್ಟ್‌ಕಟ್ ಆರಿಸಲು ಹೋಲ್ಡ್ ಮಾಡಿ." + "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಶಾರ್ಟ್‌ಕಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ." + "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" + "%1$s ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" + diff --git a/go/res/values-lo-rLA/strings.xml b/go/res/values-lo-rLA/strings.xml new file mode 100644 index 0000000000..7864884acc --- /dev/null +++ b/go/res/values-lo-rLA/strings.xml @@ -0,0 +1,26 @@ + + + + + "ແຕະຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ." + "ແຕະສອງເທື່ອຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ ຫຼື ໃຊ້ຄຳສັ່ງແບບກຳນົດເອງ." + "ປຸ່ມລັດ" + "ປຸ່ມລັດ %1$s" + diff --git a/go/res/values-mk-rMK/strings.xml b/go/res/values-mk-rMK/strings.xml new file mode 100644 index 0000000000..52d66b5e28 --- /dev/null +++ b/go/res/values-mk-rMK/strings.xml @@ -0,0 +1,26 @@ + + + + + "Допрете двапати и задржете за да изберете кратенка." + "Допрете двапати и задржете за да изберете кратенка или да користите приспособени дејства." + "Кратенки" + "Кратенки за %1$s" + diff --git a/go/res/values-ml-rIN/strings.xml b/go/res/values-ml-rIN/strings.xml new file mode 100644 index 0000000000..b3c12e16e1 --- /dev/null +++ b/go/res/values-ml-rIN/strings.xml @@ -0,0 +1,26 @@ + + + + + "ഒരു കുറുക്കുവഴി ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." + "ഒരു കുറുക്കുവഴി തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." + "കുറുക്കുവഴികൾ" + "%1$s കുറുക്കുവഴികൾ" + diff --git a/go/res/values-mn-rMN/strings.xml b/go/res/values-mn-rMN/strings.xml new file mode 100644 index 0000000000..c89dfd1bdc --- /dev/null +++ b/go/res/values-mn-rMN/strings.xml @@ -0,0 +1,26 @@ + + + + + "Товчлол авах бол удаан дарна уу." + "Товчлол авах болон тохируулсан үйлдлийг ашиглахын тулд хоёр товшоод хүлээнэ үү." + "Товчлол" + "%1$s-н товчлол" + diff --git a/go/res/values-ms-rMY/strings.xml b/go/res/values-ms-rMY/strings.xml new file mode 100644 index 0000000000..42add9a197 --- /dev/null +++ b/go/res/values-ms-rMY/strings.xml @@ -0,0 +1,26 @@ + + + + + "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-rMM/strings.xml b/go/res/values-my-rMM/strings.xml new file mode 100644 index 0000000000..5784df63bf --- /dev/null +++ b/go/res/values-my-rMM/strings.xml @@ -0,0 +1,26 @@ + + + + + "လက်ကွက်ဖြတ်လမ်းတစ်ခုကို ရွေးရန် ထိပြီး ဖိထားပါ" + "လက်ကွက်ဖြတ်လမ်းကို ရွေးရန် (သို့) စိတ်ကြိုက်လုပ်ဆောင်ချက်များကို သုံးရန်နှစ်ချက်တို့ပြီး ဖိထားပါ။" + "ဖြတ်လမ်းလင့်ခ်များ" + "%1$s ဖြတ်လမ်းလင့်ခ်များ" + diff --git a/go/res/values-ne-rNP/strings.xml b/go/res/values-ne-rNP/strings.xml new file mode 100644 index 0000000000..0be0375f3a --- /dev/null +++ b/go/res/values-ne-rNP/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/go/res/values-pa-rIN/strings.xml b/go/res/values-pa-rIN/strings.xml new file mode 100644 index 0000000000..c7e4abf3a8 --- /dev/null +++ b/go/res/values-pa-rIN/strings.xml @@ -0,0 +1,26 @@ + + + + + "ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਚੁਣਨ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।" + "ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਚੁਣਨ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ ਜਾਂ ਵਿਉਂਂਤੀ ਕਾਰਵਾਈਆਂ ਵਰਤੋ।" + "ਸ਼ਾਰਟਕੱਟ" + "%1$s ਸ਼ਾਰਟਕੱਟ" + diff --git a/go/res/values-si-rLK/strings.xml b/go/res/values-si-rLK/strings.xml new file mode 100644 index 0000000000..4b25c90b0b --- /dev/null +++ b/go/res/values-si-rLK/strings.xml @@ -0,0 +1,26 @@ + + + + + "කෙටි මගක් තෝරා ගැනීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න." + "විජට් එකක් තෝරා ගැනීමට හෝ අභිරුචි භාවිත කිරීමට දෙවරක් තට්ටු කර අල්ලා ගෙන සිටින්න." + "කෙටි මං" + "කෙටි මං %1$s" + diff --git a/go/res/values-sq-rAL/strings.xml b/go/res/values-sq-rAL/strings.xml new file mode 100644 index 0000000000..bb74db6b55 --- /dev/null +++ b/go/res/values-sq-rAL/strings.xml @@ -0,0 +1,26 @@ + + + + + "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-te-rIN/strings.xml b/go/res/values-te-rIN/strings.xml new file mode 100644 index 0000000000..0bdf743342 --- /dev/null +++ b/go/res/values-te-rIN/strings.xml @@ -0,0 +1,26 @@ + + + + + "సత్వరమార్గాన్ని ఎంచుకోవడానికి తాకి & నొక్కి ఉంచండి." + "సత్వరమార్గాన్ని ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి &ఉంచండి." + "సత్వరమార్గాలు" + "%1$s సత్వరమార్గాలు" + diff --git a/go/res/values-ur-rPK/strings.xml b/go/res/values-ur-rPK/strings.xml new file mode 100644 index 0000000000..46bd823d8e --- /dev/null +++ b/go/res/values-ur-rPK/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-rAZ/strings.xml b/quickstep/res/values-az-rAZ/strings.xml new file mode 100644 index 0000000000..0546f46508 --- /dev/null +++ b/quickstep/res/values-az-rAZ/strings.xml @@ -0,0 +1,28 @@ + + + + + "Bölünmüş ekran" + "Sancı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-rBY/strings.xml b/quickstep/res/values-be-rBY/strings.xml new file mode 100644 index 0000000000..1e60dd36fd --- /dev/null +++ b/quickstep/res/values-be-rBY/strings.xml @@ -0,0 +1,28 @@ + + + + + "Падзяліць экран" + "Замацаваць" + "Агляд" + "Няма новых элементаў" + "Закрыць" + "Ачысціць усё" + 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-rBD/strings.xml b/quickstep/res/values-bn-rBD/strings.xml new file mode 100644 index 0000000000..a0605d8317 --- /dev/null +++ b/quickstep/res/values-bn-rBD/strings.xml @@ -0,0 +1,28 @@ + + + + + "স্ক্রিন স্প্লিট করুন" + "পিন করুন" + "এক নজরে" + "কোনো সাম্প্রতিক আইটেম নেই" + "বন্ধ করুন" + "সবকিছু খালি করুন" + diff --git a/quickstep/res/values-bs-rBA/strings.xml b/quickstep/res/values-bs-rBA/strings.xml index 95285d2584..9ffa84806c 100644 --- a/quickstep/res/values-bs-rBA/strings.xml +++ b/quickstep/res/values-bs-rBA/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-rEE/strings.xml b/quickstep/res/values-et-rEE/strings.xml index b9cb5872d5..efa68f9c43 100644 --- a/quickstep/res/values-et-rEE/strings.xml +++ b/quickstep/res/values-et-rEE/strings.xml @@ -24,6 +24,5 @@ "Ülevaade" "Hiljutisi üksusi pole" "Sule" - - + "Sule kõik" diff --git a/quickstep/res/values-eu-rES/strings.xml b/quickstep/res/values-eu-rES/strings.xml index 5c0dd8f7d2..d22242efab 100644 --- a/quickstep/res/values-eu-rES/strings.xml +++ b/quickstep/res/values-eu-rES/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-rES/strings.xml b/quickstep/res/values-gl-rES/strings.xml index e2883cbeb0..8efc773f49 100644 --- a/quickstep/res/values-gl-rES/strings.xml +++ b/quickstep/res/values-gl-rES/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-rIN/strings.xml b/quickstep/res/values-gu-rIN/strings.xml index 416b361996..cdae86feba 100644 --- a/quickstep/res/values-gu-rIN/strings.xml +++ b/quickstep/res/values-gu-rIN/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-rAM/strings.xml b/quickstep/res/values-hy-rAM/strings.xml new file mode 100644 index 0000000000..4afae7de7d --- /dev/null +++ b/quickstep/res/values-hy-rAM/strings.xml @@ -0,0 +1,28 @@ + + + + + "Տրոհել էկրանը" + "Ամրացնել" + "Ընդհանուր տեղեկություններ" + "Վերջին տարրեր չկան" + "Փակել" + "Փակել բոլորը" + 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-rIS/strings.xml b/quickstep/res/values-is-rIS/strings.xml new file mode 100644 index 0000000000..88a92ed96e --- /dev/null +++ b/quickstep/res/values-is-rIS/strings.xml @@ -0,0 +1,28 @@ + + + + + "Skipta skjá" + "Festa" + "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-rGE/strings.xml b/quickstep/res/values-ka-rGE/strings.xml new file mode 100644 index 0000000000..6de8ed9222 --- /dev/null +++ b/quickstep/res/values-ka-rGE/strings.xml @@ -0,0 +1,28 @@ + + + + + "ეკრანის გაყოფა" + "ჩამაგრება" + "მიმოხილვა" + "ბოლოს გამოყენებული ერთეულები არ არის" + "დახურვა" + "ყველას გასუფთავება" + diff --git a/quickstep/res/values-kk-rKZ/strings.xml b/quickstep/res/values-kk-rKZ/strings.xml new file mode 100644 index 0000000000..ddd4a77196 --- /dev/null +++ b/quickstep/res/values-kk-rKZ/strings.xml @@ -0,0 +1,28 @@ + + + + + "Экранды бөлу" + "Бекіту" + "Шолу" + "Соңғы элементтер жоқ" + "Жабу" + "Барлығын өшіру" + diff --git a/quickstep/res/values-km-rKH/strings.xml b/quickstep/res/values-km-rKH/strings.xml new file mode 100644 index 0000000000..65c1dccee3 --- /dev/null +++ b/quickstep/res/values-km-rKH/strings.xml @@ -0,0 +1,28 @@ + + + + + "មុខងារ​បំបែកអេក្រង់" + "ដៅ" + "ទិដ្ឋភាពរួម" + "មិនមានធាតុថ្មីៗទេ" + "បិទ" + "សម្អាត​ទាំងអស់" + diff --git a/quickstep/res/values-kn-rIN/strings.xml b/quickstep/res/values-kn-rIN/strings.xml new file mode 100644 index 0000000000..55ccbb0260 --- /dev/null +++ b/quickstep/res/values-kn-rIN/strings.xml @@ -0,0 +1,28 @@ + + + + + "ಪರದೆಯನ್ನು ಬೇರ್ಪಡಿಸಿ" + "ಪಿನ್ ಮಾಡಿ" + "ಅವಲೋಕನ" + "ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ" + "ಮುಚ್ಚಿ" + "ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ" + 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-rKG/strings.xml b/quickstep/res/values-ky-rKG/strings.xml index 7924b11e82..b788693824 100644 --- a/quickstep/res/values-ky-rKG/strings.xml +++ b/quickstep/res/values-ky-rKG/strings.xml @@ -24,6 +24,5 @@ "Сереп салуу" "Акыркы колдонмолор жок" "Жабуу" - - + "Баарын тазалоо" diff --git a/quickstep/res/values-lo-rLA/strings.xml b/quickstep/res/values-lo-rLA/strings.xml new file mode 100644 index 0000000000..a83743a7e9 --- /dev/null +++ b/quickstep/res/values-lo-rLA/strings.xml @@ -0,0 +1,28 @@ + + + + + "ແບ່ງໜ້າຈໍ" + "ປັກໝຸດ" + "ພາບຮວມ" + "ບໍ່ມີລາຍການຫຼ້າສຸດ" + "ປິດ" + "ລຶບລ້າງທັງໝົດ" + 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-rMK/strings.xml b/quickstep/res/values-mk-rMK/strings.xml new file mode 100644 index 0000000000..e428b4e1f8 --- /dev/null +++ b/quickstep/res/values-mk-rMK/strings.xml @@ -0,0 +1,28 @@ + + + + + "Поделен екран" + "Прикачување" + "Преглед" + "Нема неодамнешни ставки" + "Затвори" + "Исчисти ги сите" + diff --git a/quickstep/res/values-ml-rIN/strings.xml b/quickstep/res/values-ml-rIN/strings.xml new file mode 100644 index 0000000000..4cca447e7d --- /dev/null +++ b/quickstep/res/values-ml-rIN/strings.xml @@ -0,0 +1,28 @@ + + + + + "സ്‌ക്രീൻ വിഭജിക്കുക" + "പിൻ ചെയ്യുക" + "അവലോകനം" + "സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല" + "അവസാനിപ്പിക്കുക" + "എല്ലാം മായ്‌ക്കുക" + diff --git a/quickstep/res/values-mn-rMN/strings.xml b/quickstep/res/values-mn-rMN/strings.xml new file mode 100644 index 0000000000..f40f69e315 --- /dev/null +++ b/quickstep/res/values-mn-rMN/strings.xml @@ -0,0 +1,28 @@ + + + + + "Дэлгэцийг хуваах" + "Тогтоох" + "Тойм" + "Сүүлийн үеийн зүйл алга" + "Хаах" + "Бүгдийг устгах" + diff --git a/quickstep/res/values-mr-rIN/strings.xml b/quickstep/res/values-mr-rIN/strings.xml index 4d941378bb..938363db0f 100644 --- a/quickstep/res/values-mr-rIN/strings.xml +++ b/quickstep/res/values-mr-rIN/strings.xml @@ -24,6 +24,5 @@ "अवलोकन" "कोणतेही अलीकडील आयटम नाहीत" "बंद" - - + "सर्व साफ करा" diff --git a/quickstep/res/values-ms-rMY/strings.xml b/quickstep/res/values-ms-rMY/strings.xml new file mode 100644 index 0000000000..236fab25c8 --- /dev/null +++ b/quickstep/res/values-ms-rMY/strings.xml @@ -0,0 +1,28 @@ + + + + + "Skrin pisah" + "Semat" + "Ikhtisar" + "Tiada item terbaharu" + "Tutup" + "Kosongkan semua" + diff --git a/quickstep/res/values-my-rMM/strings.xml b/quickstep/res/values-my-rMM/strings.xml new file mode 100644 index 0000000000..e44b904beb --- /dev/null +++ b/quickstep/res/values-my-rMM/strings.xml @@ -0,0 +1,28 @@ + + + + + "မျက်နှာပြင် ခွဲ၍ပြသခြင်း" + "ပင်ထိုးခြင်း" + "အနှစ်ချုပ်" + "မကြာမီကဖွင့်ထားသည်များ မရှိပါ" + "ပိတ်ရန်" + "အားလုံးကို ရှင်းရန်" + 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-rNP/strings.xml b/quickstep/res/values-ne-rNP/strings.xml new file mode 100644 index 0000000000..bf52604fd2 --- /dev/null +++ b/quickstep/res/values-ne-rNP/strings.xml @@ -0,0 +1,28 @@ + + + + + "स्क्रिन विभाजन गर्नुहोस्" + "पिन गर्नुहोस्" + "परिदृश्य" + "हालसालैको कुनै पनि वस्तु छैन" + "बन्द गर्नुहोस्" + "सबै खाली गर्नुहोस्" + 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-rIN/strings.xml b/quickstep/res/values-pa-rIN/strings.xml new file mode 100644 index 0000000000..bc044c808f --- /dev/null +++ b/quickstep/res/values-pa-rIN/strings.xml @@ -0,0 +1,28 @@ + + + + + "ਸਪਲਿਟ ਸਕ੍ਰੀਨ" + "ਪਿੰਨ ਕਰੋ" + "ਰੂਪ-ਰੇਖਾ" + "ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ" + "ਬੰਦ ਕਰੋ" + "ਸਭ ਕਲੀਅਰ ਕਰੋ" + 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-rLK/strings.xml b/quickstep/res/values-si-rLK/strings.xml new file mode 100644 index 0000000000..61bb8ba81c --- /dev/null +++ b/quickstep/res/values-si-rLK/strings.xml @@ -0,0 +1,28 @@ + + + + + "බෙදුම් තිරය" + "අමුණන්න" + "දළ විශ්ලේෂණය" + "මෑත අයිතම නැත" + "වසන්න" + "සියල්ල හිස් කරන්න" + 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-rAL/strings.xml b/quickstep/res/values-sq-rAL/strings.xml new file mode 100644 index 0000000000..a0c3d781d0 --- /dev/null +++ b/quickstep/res/values-sq-rAL/strings.xml @@ -0,0 +1,28 @@ + + + + + "Ekrani i ndarë" + "Gozhdo" + "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-rIN/strings.xml b/quickstep/res/values-ta-rIN/strings.xml index e372eea4d2..0c800ca720 100644 --- a/quickstep/res/values-ta-rIN/strings.xml +++ b/quickstep/res/values-ta-rIN/strings.xml @@ -24,6 +24,5 @@ "மேலோட்டப் பார்வை" "சமீபத்தியவை எதுவுமில்லை" "மூடும்" - - + "எல்லாம் அழி" diff --git a/quickstep/res/values-te-rIN/strings.xml b/quickstep/res/values-te-rIN/strings.xml new file mode 100644 index 0000000000..416fbb848d --- /dev/null +++ b/quickstep/res/values-te-rIN/strings.xml @@ -0,0 +1,28 @@ + + + + + "స్క్రీన్‌ని విభజించు" + "పిన్ చేయి" + "అవలోకనం" + "ఇటీవలి అంశాలు ఏవీ లేవు" + "మూసివేయండి" + "అన్నీ తీసివేయండి" + 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-rPK/strings.xml b/quickstep/res/values-ur-rPK/strings.xml new file mode 100644 index 0000000000..0a546fd603 --- /dev/null +++ b/quickstep/res/values-ur-rPK/strings.xml @@ -0,0 +1,28 @@ + + + + + "اسپلٹ اسکرین وضع" + "پن کریں" + "مجموعی جائزہ" + "کوئی حالیہ آئٹم نہیں" + "بند کریں" + "سبھی کو صاف کریں" + diff --git a/quickstep/res/values-uz-rUZ/strings.xml b/quickstep/res/values-uz-rUZ/strings.xml index fe68d74ca1..efea34117f 100644 --- a/quickstep/res/values-uz-rUZ/strings.xml +++ b/quickstep/res/values-uz-rUZ/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-rAZ/strings.xml b/res/values-az-rAZ/strings.xml new file mode 100644 index 0000000000..ed86f91552 --- /dev/null +++ b/res/values-az-rAZ/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "İş" + "Tətbiq quraşdırılmayıb." + "Tətbiq əlçatmazdır" + "Güvənli rejimdə icazə verilməyən tətbiq endirildi" + "Vidcetlər Güvənli rejimdə deaktiv edilib" + "Qısayol əlçatan deyil" + "Əsas ekran" + "Fərdi əməliyyatlar" + "Vidceti götürmək üçün toxunub saxlayın." + "Vidceti götürmək üçün & iki dəfə toxunub saxlayın və ya fərdi fəaliyyətləri istifadə edin." + "%1$d × %2$d" + "%2$d hündürlük %1$d enində" + "Manual olaraq yerləşdirmək üçün toxunaraq basıb saxlayın" + "Avtomatik əlavə edin" + "Tətbiqləri axtarın" + "Tətbiqlər yüklənir…" + "%1$s sorğusuna uyğun tətbiq tapılmadı" + "Daha çox tətbiq üçün axtarış edin" + "Bildirişlər" + "Qısayolu seçmək üçün basıb saxlayın." + "Qısayolu seçmək üçün iki dəfə basıb saxlayın və ya fərdi əməliyyatlardan istifadə edin." + "Bu Əsas ekranda boş yer yoxdur." + "Favoritlər-də yer yoxdur" + "Tətbiq siyahısı" + "Şəxsi tətbiqlərin siyahısı" + "İş tətbiqlərinin siyahısı" + "Əsas səhifə" + "Silin" + "Sistemdən sil" + "Tətbiq məlumatı" + "Quraşdırın" + "qısayolları quraşdır" + "Tətbiqə istifadəçi müdaxiləsi olmadan qısayolları əlavə etməyə icazə verir." + "Əsas Səhifə ayarlarını və qısayolları oxuyun" + "Tətbiqə Əsas Səhifədə parametrləri və qısayolları oxumağa icazə verir." + "Əsas Səhifə ayarlarını və qısayolları yazın" + "Tətbiqə Əsas Səhifədə ayarları və qısayolları dəyişməyə icazə verir." + "%1$s tətbiqinə telefon zəngləri etmək üçün icazə verilmir" + "Vidcet yükləmə problemi" + "Quraşdırma" + "Bu sistem tətbiqi olduğu üçün sistemdən silinə bilməz." + "Adsız Qovluq" + "%1$s deaktiv edildi" + + %1$s tətbiqində %2$d bildiriş var + %1$s tətbiqində %2$d bildiriş var + + "Səhifə %1$d of %2$d" + "Əsas Səhifə ekranı %1$d of %2$d" + "Yeni əsas ekran səhifəsi" + "Qovluq açıldı, %2$d hündürlük ilə %1$d enində" + "Qovluq bağlamaq üçün toxunun" + "Ad dəyişikliyini yadda saxlamaq üçün toxunun" + "Qovluq bağlıdır" + "Qovluq adı %1$s ilə dəyişdirildi" + "Qovluq: %1$s" + "Vidcet" + "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" + "Bildiriş girişi tələb edilir" + "Bildiriş Nöqtələrini göstərmək üçün %1$s bildirişlərini aktiv edin" + "Ayarları dəyişin" + "Bildiriş nöqtələrini göstərin" + "Əsas ekrana ikona əlavə edin" + "Yeni tətbiqlər üçün" + "İkona formasını dəyişin" + "Əsas səhifə ekranında" + "Sistem defoltu istifadə edin" + "Kvadrat" + "Kənarları dairəvi kvadrat" + "Çevrə" + "Gözyaşı damlası" + "İkona formasına etdiyiniz dəyişikliklər tətbiq edilir" + "Naməlum" + "Yığışdır" + "Axtarış" + "Bu tətbiq quraşdırılmayıb" + "Bu ikona üçün tətbiq quraşdırılmayıb. Onu silə bilərsiniz, və ya tətbiqi taparaq manual yol ilə quraşdıra bilərsiniz." + "%1$s endirilir, %2$s tamamlandı" + "%1$s yüklənmək üçün gözləyir" + "%1$s vidcetləri" + "Əsas ekrana əlavə edin" + "Elementi bura köçürün" + "Element əsas ekrana əlavə edildi" + "Element silindi" + "Elementi köçürün" + "Sıra %1$s sütun %2$s köçürün" + "%1$s mövqeyinə köçürün" + "%1$s sevimlilər mövqeyinə köçürün" + "Elementin yeri dəyişildi" + "Qovluğa əlavə edin: %1$s" + "%1$s adlı qovluğa əlavə edin" + "Element qovluğa əlavə edildi" + "Qovluq yaradın: %1$s" + "Qovluq yaradıldı" + "Əsas ekrana köçürün" + "Ölçüsünü dəyişin" + "Eni artırın" + "Hündürlüyü artırın" + "Eni azaldın" + "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" + "İş" + "İş profili" + "Burada iş tətbiqləri axtarın" + "Hər bir iş tətbiqində təşkilat tərəfindən qorunduğunu göstərən narıncı nişan var. Tətbiqləri daha asan giriş üçün Əsas Səhifə Ekranına köçürün." + "Təşkilatınız tərəfindən idarə olunur" + "Bildiriş və tətbiqlər deaktivdir" + "Bağlayın" + "Bağlıdır" + 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-rBY/strings.xml b/res/values-be-rBY/strings.xml new file mode 100644 index 0000000000..399ae763e7 --- /dev/null +++ b/res/values-be-rBY/strings.xml @@ -0,0 +1,148 @@ + + + + + "Launcher3" + + "Працоўная" + "Праграма не ўсталявана." + "Праграма недаступная" + "Спампаваная праграма адключана ў Бяспечным рэжыме" + "Віджэты адключаны ў Бяспечным рэжыме" + "Ярлык недаступны" + "Галоўны экран" + "Спецыяльныя дзеянні" + "Дакраніцеся і ўтрымлiвайце віджэт, каб выбр. яго." + "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць віджэт або выкарыстоўваць карыстальніцкія дзеянні." + "%1$d × %2$d" + "Шырына: %1$d, вышыня: %2$d" + "Каб размясціць уручную, дакраніцеся і ўтрымлівайце" + "Дадаць аўтаматычна" + "Пошук праграм" + "Праграмы загружаюцца…" + "Праграм, якія адпавядаюць запыту \"%1$s\", не знойдзена" + "Шукаць іншыя праграмы" + "Апавяшчэнні" + "Дакраніцеся і ўтрымлiвайце ярлык, каб дадаць яго." + "Дакраніцеся двойчы і ўтрымлівайце, каб выбраць ярлык або выкарыстоўваць спецыяльныя дзеянні." + "На гэтым Галоўным экране больш няма месца." + "У латку \"Абранае\" больш няма месца" + "Спіс праграм" + "Спіс персанальных праграм" + "Спіс працоўных праграм" + "Галоўная" + "Выдаліць" + "Выдаліць" + "Звесткі пра праграмы" + "Усталяваць" + "усталёўваць ярлыкі" + "Дазваляе праграмам дадаваць ярлыкі без умяшання карыстальніка." + "счытваць налады і ярлыкі на Галоўнай старонцы" + "Дазваляе праграме счытваць налады і ярлыкі на Галоўнай старонцы." + "запісваць налады і ярлыкі на галоўнай старонцы" + "Дазваляе праграме змяняць налады і ярлыкі на Галоўнай старонцы." + "%1$s не мае дазволу на здзяйсненне тэлефонных званкоў" + "Праблема загрузкі віджэта" + "Наладжванне" + "Гэта сістэмная праграма, яе нельга выдаліць." + "Папка без назвы" + "%1$s адключана" + + %1$s: ёсць %2$d апавяшчэнне + %1$s: ёсць %2$d апавяшчэнні + %1$s: ёсць %2$d апавяшчэнняў + %1$s: ёсць %2$d апавяшчэння + + "Старонка %1$d з %2$d" + "Галоўны экран %1$d з %2$d" + "Новая старонка галоўнага экрана" + "Папка адкрыта, %1$d на %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" + "Ярлыкі" + "Ярлыкі (%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 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-rBD/strings.xml b/res/values-bn-rBD/strings.xml new file mode 100644 index 0000000000..ffeeed76ab --- /dev/null +++ b/res/values-bn-rBD/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "কাজ" + "অ্যাপ্লিকেশান ইনস্টল করা নেই৷" + "অ্যাপ্লিকেশান অনুপলব্ধ" + "ডাউনলোড করা অ্যাপ্লিকেশান নিরাপদ মোডে অক্ষম রয়েছে" + "সুরক্ষিত মোডে উইজেট নিষ্ক্রিয় থাকে" + "শর্টকাটগুলি অনুপলব্ধ" + "হোম স্ক্রিন" + "কাস্টম অ্যাকশন" + "একটি উইজেট তুলতে তা স্পর্শ করে ধরে রাখুন৷" + "কোনো উইজেট বেছে নিতে দুবার-আলতো চেপে ধরে থাকুন অথবা কাস্টম ক্রিয়াগুলি ব্যবহার করুন৷" + "%1$d × %2$d" + "%2$d উচ্চতা অনুযায়ী %1$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 বাই %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-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml index fa88665060..40c886603d 100644 --- a/res/values-bs-rBA/strings.xml +++ b/res/values-bs-rBA/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-rEE/strings.xml b/res/values-et-rEE/strings.xml index 715e396031..1bde8aac13 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/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-rES/strings.xml b/res/values-eu-rES/strings.xml index e25af961c7..128c6f42a3 100644 --- a/res/values-eu-rES/strings.xml +++ b/res/values-eu-rES/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-rES/strings.xml b/res/values-gl-rES/strings.xml index 3817f075ea..1efa5ceadd 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/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-rIN/strings.xml b/res/values-gu-rIN/strings.xml index efc953c809..234fadafcd 100644 --- a/res/values-gu-rIN/strings.xml +++ b/res/values-gu-rIN/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-rAM/strings.xml b/res/values-hy-rAM/strings.xml new file mode 100644 index 0000000000..6844a27573 --- /dev/null +++ b/res/values-hy-rAM/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "Աշխատանքային" + "Ծրագիրը տեղադրված չէ:" + "Հավելվածը հասանելի չէ" + "Ներբեռնված ծրագիրն անջատված է Անվտանգ ռեժիմում" + "Վիջեթներն անջատված են անվտանգ ռեժիմում" + "Դյուրանցումն անհասանելի է" + "Հիմնական էկրան" + "Հատուկ գործողություններ" + "Հպեք և պահեք՝ վիջեթն ընտրելու համար:" + "Կրկնակի հպեք և պահեք՝ վիջեթ ավելացնելու համար կամ օգտվեք հարմարեցրած գործողություններից:" + "%1$d × %2$d" + "Լայնությունը՝ %1$d, բարձրությունը՝ %2$d" + "Հպեք և պահեք՝ ձեռքով տեղադրելու համար" + "Ավելացնել ավտոմատ կերպով" + "Որոնել հավելվածներ" + "Հավելվածների բեռնում…" + %1$s» հարցմանը համապատասխանող հավելվածներ չեն գտնվել" + "Որոնել այլ հավելվածներ" + "Ծանուցումներ" + "Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար։" + "Կրկնակի հպեք և պահեք՝ դյուրանցում ընտրելու համար կամ օգտվեք հարմարեցրած գործողություններից:" + "Այլևս տեղ չկա այս հիմնական էկրանին:" + "Ընտրյալների ցուցակում այլևս ազատ տեղ չկա" + "Հավելվածների ցանկ" + "Անձնական հավելվածների ցանկ" + "Աշխատանքային հավելվածների ցանկ" + "Հիմնական" + "Հեռացնել" + "Հեռացնել" + "Հավելվածի տվյալներ" + "Տեղադրել" + "տեղադրել դյուրանցումներ" + "Ծրագրին թույլ է տալիս ավելացնել դյուրանցումներ՝ առանց օգտագործողի միջամտության:" + "կարդալ հիմնաէջի կարգավորումներն ու դյուրանցումները" + "Ծրագրին թույլ է տալիս կարդալ հիմնաէջի կարգավորումներն ու դյուրանցումները:" + "ստեղծել հիմնաէջի կարգավորումներ ու դյուրանցումներ" + "Ծրագրին թույլ է տալիս փոփոխել հիմնաէջի կարգավորումներն ու դյուրանցումները:" + "%1$s հավելվածին չի թույլատրվում հեռախոսազանգեր կատարել" + "Վիջեթի բեռնման խնդիր կա" + "Կարգավորում" + "Սա համակարգային ծրագիր է և չի կարող ապատեղադրվել:" + "Անանուն պանակ" + "%1$s հավելվածն անջատված է" + + %1$s, ունի %2$d ծանուցում + %1$s, ունի %2$d ծանուցում + + "Էջ %1$d՝ %2$d-ից" + "Հիմնական էկրան %1$d` %2$d-ից" + "Հիմնական էկրանի նոր էջ" + "Պանակը բաց է, %1$d-ից %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-ի" + "Դյուրանցումներ" + "%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 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-rIS/strings.xml b/res/values-is-rIS/strings.xml new file mode 100644 index 0000000000..3b5dabacce --- /dev/null +++ b/res/values-is-rIS/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "Vinna" + "Forritið er ekki uppsett." + "Forritið er ekki í boði" + "Sótt forrit er óvirkt í öryggisstillingu" + "Græjur eru óvirkar í öruggri stillingu" + "Flýtileið er ekki tiltæk" + "Heimaskjár" + "Sérsniðnar aðgerðir" + "Haltu fingri á græju til að grípa hana." + "Ýttu tvisvar og haltu fingri á græju til að grípa hana eða notaðu sérsniðnar aðgerðir." + "%1$d × %2$d" + "%1$d á breidd og %2$d á hæð" + "Haltu inni til að staðsetja handvirkt" + "Bæta sjálfkrafa við" + "Leita í forritum" + "Hleður forrit…" + "Ekki fundust forrit sem samsvara „%1$s“" + "Leita að fleiri forritum" + "Tilkynningar" + "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." + "Ekki meira pláss á þessum heimaskjá." + "Ekki meira pláss í bakka fyrir uppáhald" + "Forritalisti" + "Listi yfir eigin forrit" + "Listi yfir vinnuforrit" + "Heim" + "Fjarlægja" + "Fjarlægja" + "Forritsupplýsingar" + "Setja upp" + "setja upp flýtileiðir" + "Leyfir forriti að bæta við flýtileiðum án íhlutunar notanda." + "lesa stillingar og flýtileiðir heimaskjás" + "Leyfir forriti að lesa stillingar og flýtileiðir heimaskjás." + "skrifa stillingar og flýtileiðir heimaskjás" + "Leyfir forriti að breyta stillingum og flýtileiðum heimaskjás." + "%1$s hefur ekki leyfi til að hringja símtöl" + "Vandamál við að hlaða græju" + "Uppsetning" + "Þetta er kerfisforrit sem ekki er hægt að fjarlægja." + "Ónefnd mappa" + "Óvirkt %1$s" + + %1$s, er með %2$d tilkynningu + %1$s, er með %2$d tilkynningar + + "Síða %1$d af %2$d" + "Heimaskjár %1$d af %2$d" + "Ný síða á heimaskjá" + "Mappa opnuð, %1$d sinnum %2$d" + "Ýttu til að loka möppunni" + "Ýttu til að vista breytt heiti" + "Möppu lokað" + "Heiti möppu breytt í %1$s" + "Mappa: %1$s" + "Græjur" + "Veggfóður" + "Heimastillingar" + "Gert óvirkt af kerfisstjóra" + "Leyfa snúning fyrir heimaskjá" + "Þegar símanum er snúið" + "Tilkynningapunktar" + "Kveikt" + "Slökkt" + "Aðgangs að tilkynningum er krafist" + "Til að sýna tilkynningarpunkta skaltu kveikja á forritstilkynningum fyrir %1$s" + "Breyta stillingum" + "Sýna tilkynningapunkta" + "Bæta tákni á heimaskjáinn" + "Fyrir ný forrit" + "Breyta formi tákns" + "á heimaskjá" + "Nota sjálfgildi kerfis" + "Ferningur" + "Ferhringur" + "Hringur" + "Dropi" + "Breytir formi tákns" + "Óþekkt" + "Fjarlægja" + "Leita" + "Þetta forrit er ekki uppsett" + "Forritið fyrir þetta tákn er ekki uppsett. Þú getur fjarlægt það eða leitað að forritinu og sett það upp handvirkt." + "%1$s í niðurhali, %2$s lokið" + "%1$s bíður uppsetningar" + "%1$s-græjur" + "Bæta á heimaskjá" + "Færa atriði hingað" + "Atriði bætt á heimaskjáinn" + "Atriði fjarlægt" + "Færa atriði" + "Færa í línu %1$s, dálk %2$s" + "Færa í stöðu %1$s" + "Færa í stöðu %1$s á festisvæði" + "Atriði fært" + "Setja í möppu: %1$s" + "Setja í möppu með %1$s" + "Atriði sett í möppu" + "Búa til möppu með: %1$s" + "Mappa búin til" + "Færa á heimaskjá" + "Breyta stærð" + "Auka breidd" + "Auka hæð" + "Minnka breidd" + "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" + "Vinna" + "Vinnusnið" + "Hér finnurðu vinnuforrit" + "Öll vinnuforrit eru með merki og fyrirtækið þitt tryggir öryggi þeirra. Færðu forrit yfir á heimaskjáinn til að fá auðveldari aðgang að þeim." + "Stjórnað af fyrirtækinu þínu" + "Slökkt er á tilkynningum og forritum" + "Loka" + "Lokað" + 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-rGE/strings.xml b/res/values-ka-rGE/strings.xml new file mode 100644 index 0000000000..521ec80f8c --- /dev/null +++ b/res/values-ka-rGE/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "სამუშაო" + "აპი არ არის დაყენებული." + "აპი მიუწვდომელია" + "უსაფრთხო რეჟიმში ჩამოტვირთული აპი გაუქმებულია" + "უსაფრთხო რეჟიმში ვიჯეტი გამორთულია" + "მალსახმობი მიუწვდომელია" + "მთავარი ეკრანი" + "მორგებული ქმედებები" + "შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად." + "ორმაგად შეეხეთ და გეჭიროთ ვიჯეტის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." + "%1$d × %2$d" + "სიგრძე: %1$d, სიგანე: %2$d" + "ხანგრძლივად შეეხეთ ხელით განსათავსებლად" + "ავტომატურად დამატება" + "აპების ძიება" + "აპები იტვირთება…" + "„%1$s“-ის თანხვედრი აპები არ მოიძებნა" + "მეტი აპის პოვნა" + "შეტყობინებები" + "შეეხეთ და დააყოვნეთ მალსახმობის ასარჩევად." + "ორმაგად შეეხეთ და გეჭიროთ მალსახმობის ასარჩევად ან მორგებული მოქმედებების გამოსაყენებლად." + "ამ მთავარ ეკრანზე ადგილი აღარ არის." + "რჩეულების თაროზე ადგილი არ არის" + "აპების სია" + "პერსონალური აპების სია" + "სამსახურის აპების სია" + "მთავარი" + "ამოშლა" + "დეინსტალაცია" + "აპის შესახებ" + "ინსტალაცია" + "მალსახმობების დაყენება" + "აპისთვის მალსახმობების დამოუკიდებლად დამატების უფლების მიცემა." + "მთავარი ეკრანის პარამეტრებისა და მალსახმობების წაკითხვა" + "აპისთვის მთავარი ეკრანის პარამეტრებისა და მალსახმობების წაკითხვის უფლების მიცემა." + "მთავარი ეკრანის პარამეტრებისა და მალსახმობების ჩაწერა" + "აპისთვის მთავარი ეკრანის პარამეტრებისა და მალსახმობების შეცვლის უფლების მიცემა." + "%1$s-ს არ აქვს სატელეფონო ზარების განხორციელების უფლება" + "პრობლემა ვიჯეტის ჩატვირთვისას" + "დაყენება" + "ეს სისტემური აპია და მისი წაშლა შეუძლებელია." + "უსახელო საქაღალდე" + "%1$s გაითიშა" + + %1$s-ში %2$d შეტყობინებაა + %1$s-ში %2$d შეტყობინებაა + + "გვერდი %1$d %2$d-დან" + "მთავარი ეკრანი %1$d, %2$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-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml new file mode 100644 index 0000000000..7ab73d95dd --- /dev/null +++ b/res/values-kk-rKZ/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "Жұмыс" + "Қолданба орнатылмаған." + "Қолданба қол жетімді емес" + "Жүктелген қолданба қауіпсіз режимде өшірілген" + "Қауіпсіз режимде виджеттер өшіріледі" + "Таңбаша қолжетімді емес" + "Негізгі экран" + "Арнаулы әрекеттер" + "Виджетті таңдау үшін түртіп, мықтап ұстаңыз." + "Виджетті таңдау немесе арнаулы әрекеттерді таңдау үшін екі рет түртіп, ұстап тұрыңыз." + "%1$d × %2$d" + "Ені: %1$d, биіктігі: %2$d" + "Қолмен қою үшін басып тұрыңыз" + "Автоматты енгізу" + "Қолданбаларды іздеу" + "Қолданбалар жүктелуде…" + "\"%1$s\" сұрауына сәйкес келетін қолданбалар жоқ" + "Қосымша қолданбалар іздеу" + "Хабарландырулар" + "Таңбашаны таңдау үшін оны басып, ұстап тұрыңыз." + "Екі рет басып, ұстап тұрып, таңбашаны таңдаңыз немесе арнаулы әрекеттерді пайдаланыңыз." + "Бұл Негізгі экранда орын қалмады." + "Қалаулылар науасында орын қалмады" + "Қолданбалар тізімі" + "Жеке қолданбалар тізімі" + "Жұмыс қолданбаларының тізімі" + "Негізгі" + "Жою" + "Жою" + "Қолданба ақпараты" + "Орнату" + "төте пернелерді орнату" + "Қолданбаға пайдаланушының қатысуынсыз төте пернелерді қосу мүмкіндігін береді." + "Негізгі экрандағы параметрлер мен төте пернелерді оқу" + "Қолданбаға Негізгі экрандағы параметрлер мен төте пернелерді оқу мүмкіндігін береді." + "Негізгі экран параметрлері мен төте пернелерін жазу" + "Қолданбаға Негізгі экрандағы параметрлер мен төте пернелерді өзгерту мүмкіндігін береді." + "%1$s арқылы телефон қоңырауларын соғуға рұқсат етілмеген" + "Виджетті жүктеу барысында мәселе орын алды" + "Орнату" + "Бұл жүйе қолданбасы, сондықтан оны алу мүмкін емес." + "Атауы жоқ қалта" + "%1$s өшірілді" + + %1$s қолданбасында %2$d хабарландыру бар + %1$s қолданбасында %2$d хабарландыру бар + + "%1$d бет, барлығы %2$d" + "%1$d негізгі экран, барлығы %2$d" + "Жаңа негізгі экран беті" + "Қалта ашылды, %1$d және %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-km-rKH/strings.xml b/res/values-km-rKH/strings.xml new file mode 100644 index 0000000000..582bb33dd2 --- /dev/null +++ b/res/values-km-rKH/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "ការងារ" + "មិន​បាន​ដំឡើង​កម្មវិធី។" + "មិន​មាន​កម្មវិធី" + "បាន​បិទ​កម្មវិធី​ដែល​បាន​ទាញ​យក​ក្នុង​របៀប​សុវត្ថិភាព" + "បាន​បិទ​ធាតុ​ក្រាហ្វិក​ក្នុង​របៀប​សុវត្ថិភាព" + "ផ្លូវកាត់មិនអាចប្រើបានទេ" + "អេក្រង់ដើម" + "សកម្មភាព​ផ្ទាល់ខ្លួន" + "ប៉ះ & សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។" + "ប៉ះពីរដង ហើយចុចឲ្យជាប់ដើម្បីជ្រើសយកធាតុក្រាហ្វិក ឬប្រើសកម្មភាពផ្ទាល់ខ្លួន។" + "%1$d × %2$d" + "ទទឺង %1$d គុណនឹងកម្ពស់ %2$d" + "ចុច​ឲ្យជាប់​ដើម្បី​បញ្ចូលវា​ដោយផ្ទាល់" + "បញ្ចូល​ដោយ​ស្វ័យ​ប្រវត្តិ" + "ស្វែងរក​កម្មវិធី" + "កំពុងផ្ទុកកម្មវិធី…" + "រកមិនឃើញកម្មវិធី​ដែលត្រូវគ្នាជាមួយ \"%1$s\" ទេ" + "ស្វែងរកកម្មវិធីច្រើនទៀត" + "ការ​ជូនដំណឹង" + "ចុច​ឱ្យ​ជាប់​ដើម្បី​ជ្រើស​រើស​ផ្លូវកាត់​មួយ។" + "ចុច​ពីរ​ដង ហើយ​ចុច​ឱ្យ​ជាប់​ដើម្បី​ជ្រើសរើស​ផ្លូវកាត់​មួយ ឬ​ប្រើ​សកម្មភាព​ផ្ទាល់ខ្លួន។" + "គ្មាន​បន្ទប់​នៅ​លើ​អេក្រង់​ដើម​នេះ​ទៀត​ទេ។" + "គ្មាន​បន្ទប់​​ក្នុង​ថាស​និយម​ប្រើ" + "បញ្ជីកម្មវិធី" + "បញ្ជី​កម្មវិធី​ផ្ទាល់ខ្លួន" + "បញ្ជី​កម្មវិធី​ការងារ" + "ដើម" + "យកចេញ" + "លុបការដំឡើង" + "ព័ត៌មាន​កម្មវិធី" + "ដំឡើង" + "ដំឡើង​ផ្លូវកាត់" + "អនុញ្ញាត​ឲ្យ​កម្មវិធី​បន្ថែម​ផ្លូវកាត់​ ដោយ​មិន​ចាំបាច់​​អំពើ​ពី​អ្នក​ប្រើ។" + "អាន​ការ​កំណត់​ និង​ផ្លូវកាត់​​អេក្រង់​ដើម" + "អនុញ្ញាត​ឲ្យ​កម្មវិធី​អាន​ការ​កំណត់ និង​ផ្លូវកាត់​ក្នុង​អេក្រង់​ដើម។" + "សរសេរ​ការ​កំណត់ ​និង​ផ្លូវកាត់​​លើ​អេក្រង់​ដើម" + "អនុញ្ញាត​ឲ្យ​កម្មវិធី​ប្ដូរ​ការ​កំណត់ និង​ផ្លូវ​កាត់​ក្នុង​អេក្រង់​ដើម។" + "%1$s មិនត្រូវបានអនុញ្ញាតឲ្យធ្វើការហៅទូរស័ព្ទទេ" + "បញ្ហា​ក្នុង​ការ​ផ្ទុក​ធាតុ​​ក្រាហ្វិក" + "រៀបចំ" + "នេះ​​​ជា​កម្មវិធី​ប្រព័ន្ធ មិន​អាច​លុប​បាន​ទេ។" + "ថត​គ្មាន​ឈ្មោះ" + "បានបិទដំណើរការ %1$s" + + %1$s មាន​ការ​ជូន​ដំណឹង %2$d + %1$s មាន​ការ​ជូន​ដំណឹង %2$d + + "ទំព័រ %1$d នៃ %2$d" + "អេក្រង់​ដើម %1$d នៃ %2$d" + "ទំព័រអេក្រង់ដើមថ្មី" + "បាន​បើក​ថត %1$d ដោយ %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" + "ផ្លូវកាត់" + "%1$d ផ្លូវកាត់សម្រាប់ %2$s" + "ផ្លូវកាត់ចំនួន %1$d និង​ការជូនដំណឹងចំនួន %2$d សម្រាប់ %3$s" + "បដិសេធ" + "បាន​បដិសេធ​ការជូនដំណឹង" + "ផ្ទាល់ខ្លួន" + "ការងារ" + "កម្រងព័ត៌មានការងារ" + "ស្វែង​រក​កម្មវិធី​ការងារ​នៅទីនេះ" + "កម្មវិធី​ការងារ​នីមួយៗ​មាន​ស្លាកមួយ និងត្រូវ​បានរក្សាទុក​យ៉ាងមានសុវត្ថិភាព​ដោយស្ថាប័ន​របស់អ្នក។ សូម​ផ្លាស់ទី​កម្មវិធី​ទៅកាន់​អេក្រង់​ដើម​របស់អ្នក​ ដើម្បី​ងាយស្រួល​ចូលប្រើជាងមុន។" + "គ្រប់គ្រងដោយ​ស្ថាប័ន​របស់អ្នក" + "ការជូនដំណឹង​ និងកម្មវិធី​ត្រូវបានបិទ" + "បិទ" + "បានបិទ" + diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml new file mode 100644 index 0000000000..56ebe0a9bb --- /dev/null +++ b/res/values-kn-rIN/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "ಕೆಲಸ" + "ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ" + "ಅಪ್ಲಿಕೇಶನ್ ಲಭ್ಯವಿಲ್ಲ" + "ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾದ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" + "ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ವಿಜೆಟ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" + "ಶಾರ್ಟ್‌ಕಟ್ ಲಭ್ಯವಿಲ್ಲ" + "ಮುಖಪುಟದ ಪರದೆ" + "ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳು" + "ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ & ಹಿಡಿದುಕೊಳ್ಳಿ." + "ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ವಿಜೆಟ್ ಆರಿಸಿಕೊಳ್ಳಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಿ" + "%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 ಮುಖಪುಟದ ಪರದೆ" + "ಹೊಸ ಮುಖಪುಟ ಪರದೆ" + "ಫೋಲ್ಡರ್ ತೆರೆಯಲಾಗಿದೆ, %1$d ಬೈ %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-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-rKG/strings.xml b/res/values-ky-rKG/strings.xml index eedf7fd101..502a08a3e1 100644 --- a/res/values-ky-rKG/strings.xml +++ b/res/values-ky-rKG/strings.xml @@ -81,6 +81,8 @@ "Тушкагаздар" "Башкы беттин жөндөөлөрү" "Администраторуңуз өчүрүп койгон" + "Башкы экранды айлантууга уруксат берүү" + "Телефон айланганда" "Билдирмелер белгилери" "Күйүк" "Өчүк" diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml new file mode 100644 index 0000000000..cd2c933c15 --- /dev/null +++ b/res/values-lo-rLA/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "ວຽກ" + "ແອັບຯບໍ່ໄດ້ຖືກຕິດຕັ້ງ." + "ແອັບຯ​ໃຊ້​ບໍ່​ໄດ້" + "ແອັບຯ​ທີ່​ດາວ​ໂຫລດ​ແລ້ວ​ຖືກ​ປິດ​ການ​ນຳ​ໃຊ້​ໃນ Safe mode" + "​ວິດ​ເຈັດ​ຖືກ​ປິດ​ໃນ Safe mode" + "ບໍ່ສາມາດໃຊ້ທາງລັດໄດ້" + "ໜ້າຈໍຫຼັກ" + "ຄຳສັ່ງແບບກຳນົດເອງ" + "ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ." + "ແຕະ​ຄ້າງ​ໄວ້ ເພື່ອ​ເລືອກວິດ​ເຈັດ ຫຼື ໃຊ້​ການ​ດຳ​ເນີນ​ການ​ກຳ​ນົດ​ເອງ." + "%1$d × %2$d" + "ກວ້າງ %1$d ຄູນສູງ %2$d" + "ແຕະຄ້າງໄວ້ເພື່ອວາງດ້ວຍຕົນເອງ" + "ເພີ່ມໂດຍອັດຕະໂນມັດ" + "ຊອກຫາແອັບ" + "ກໍາລັງໂຫຼດແອັບ…" + "ບໍ່ພົບແອັບທີ່ກົງກັບ \"%1$s\"" + "ຊອກຫາແອັບເພີ່ມເຕີມ" + "ການແຈ້ງເຕືອນ" + "ແຕະຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ." + "ແຕະສອງເທື່ອຄ້າງໄວ້ເພື່ອຮັບປຸ່ມລັດ ຫຼື ໃຊ້ຄຳສັ່ງແບບກຳນົດເອງ." + "ບໍ່ມີຫ້ອງເຫຼືອໃນໜ້າຈໍຫຼັກນີ້." + "ບໍ່ມີບ່ອນຫວ່າງໃນຖາດສຳລັບເກັບສິ່ງທີ່ໃຊ້ເປັນປະຈຳ" + "ລາຍຊື່ແອັບ" + "ລາຍຊື່ແອັບສ່ວນຕົວ" + "ລາຍຊື່ແອັບເຮັດວຽກ" + "ໜ້າຫຼັກ" + "ເອົາ​ອອກ" + "ຖອນ​ການ​ຕິດ​ຕັ້ງ" + "ຂໍ້ມູນແອັບ" + "ຕິດຕັ້ງ" + "ຕິດຕັ້ງທາງລັດ" + "ອະນຸຍາດໃຫ້ແອັບຯ ເພີ່ມທາງລັດໂດຍບໍ່ຕ້ອງຮັບການຢືນຢັນຈາກຜູ່ໃຊ້." + "ອ່ານການຕັ້ງຄ່າໜ້າຫຼັກ ແລະທາງລັດ" + "ອະນຸຍາດໃຫ້ແອັບຯດັ່ງກ່າວອ່ານການຕັ້ງຄ່າ ແລະທາງລັດໃນໜ້າຫຼັກ." + "ຂຽນການຕັ້ງຄ່າໜ້າຫຼັກ ແລະທາງລັດ" + "ອະນຸຍາດໃຫ້ແອັບຯດັ່ງກ່າວ ປ່ຽນການຕັ້ງຄ່າ ແລະທາງລັດໃນໜ້າຫຼັກ." + "%1$s ບໍ່​ໄດ້​ຮັບ​ອະ​ນຸ​ຍາດ​ໃຫ້​ໂທ" + "ມີບັນຫາໃນການໂຫລດວິດເຈັດ" + "ຕິດຕັ້ງ" + "ນີ້ແມ່ນແອັບຯຂອງລະບົບ ແລະບໍ່ສາມາດຖອນການຕິດຕັ້ງອອກໄດ້." + "ໂຟນເດີຍັງບໍ່ຖືກຕັ້ງຊື່" + "ປິດການນຳໃຊ້ %1$s ແລ້ວ" + + %1$s, ມີ %2$d ການແຈ້ງເຕືອນ + %1$s, ມີ %2$d ການແຈ້ງເຕືອນ + + "ໜ້າ %1$d ຈາກ %2$d" + "ໜ້າຈໍຫຼັກ %1$d ໃນ %2$d" + "ໜ້າ​ຂອງ​ໜ້າ​ຈໍ​ຫຼັກ​ໃໝ່" + "ເປີດໂຟນເດີແລ້ວ, %1$d ຄູນ %2$d" + "ແຕະເພື່ອປິດໂຟນເດີ" + "ແຕະເພື່ອບັນທຶກການປ່ຽນຊື່" + "ປິດໂຟນເດີແລ້ວ" + "ປ່ຽນຊື່ໂຟນເດີເປັນ %1$s ແລ້ວ" + "ໂຟນເດີ: %1$s" + "ວິດເຈັດ" + "ພາບພື້ນຫຼັງ" + "ການຕັ້ງຄ່າ Home" + "ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" + "ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍທຳອິດໄດ້" + "ເມື່ອໝຸນໂທລະສັບ" + "ຈຸດການແຈ້ງເຕືອນ" + "ເປີດ" + "ປິດ" + "ຕ້ອງໃຊ້ການເຂົ້າເຖິງການແຈ້ງເຕືອນ" + "ເພື່ອສະແດງຈຸດການແຈ້ງເຕືອນ, ໃຫ້ເປີດການແຈ້ງເຕືອນສຳລັບ %1$s" + "ບັນທຶກການຕັ້ງຄ່າ" + "ສະແດງຈຸດການແຈ້ງເຕືອນ" + "ເພີ່ມໄອຄອນໃສ່ໜ້າຈໍຫຼັກ" + "ສຳລັບແອັບໃໝ່" + "ປ່ຽນຮູບຮ່າງໄອຄອນ" + "ຢູ່ໜ້າຈໍຫຼັກ" + "ໃຊ້ຄ່າເລີ່ມຕົ້ນລະບົບ" + "ສີ່ຫຼ່ຽມຈັດຕຸລັດ" + "ສີ່ຫຼ່ຽມຂອບມົນ" + "ວົງມົນ" + "ນ້ຳຢອດ" + "ນຳໃຊ້ການປ່ຽນແປງຮູບຮ່າງໄອຄອນ" + "​ບໍ່​ຮູ້​ຈັກ" + "ລຶບ​" + "ຊອກຫາ" + "ແອັບຯ​ນີ້​ຍັງ​ບໍ່​ໄດ້​ຕິດ​ຕັ້ງ​ເທື່ອ" + "​ແອັບຯ​ສຳ​ລັບ​ໄອ​ຄອນ​ນີ້​ຍັງ​ບໍ່ໄດ້​ຕິດ​ຕັ້ງ​ເທື່ອ. ທ່ານ​ສາ​ມາດ​ລຶບ​ມັນ​ອອກ ຫຼື​ຊອກ​ຫາ​ແອັບຯ ແລ້ວ​ຕິດ​ຕັ້ງ​ມັນ​ໄດ້​ດ້ວຍ​ຕົນ​ເອງ." + "%1$s ກຳ​ລັງ​ດາວ​ໂຫຼດ, %2$s ສຳ​ເລັດ" + "%1$s ກຳ​ລັງ​ລໍ​ຖ້າ​ຕິດ​ຕັ້ງ" + "ວິດເຈັດ %1$s" + "ເພີ່ມໃສ່ໜ້າຈໍຫຼັກ" + "Move item here" + "ເພີ່ມ​ລາຍ​ການ​ໃສ່​ໜ້າ​ຈໍ​ຫຼັກ​ແລ້ວ" + "ເອົາ​ລາຍ​ການ​ອອກ​ໄປ​ແລ້ວ" + "ຍ້າຍ​ລາຍ​ການ" + "ຍ້າຍ​ໄປ​ໃສ່​ແຖວ %1$s ຖັນ %2$s" + "ຍ້າຍ​ໄປ​ໃສ່​ຕຳ​ແໜ່ງ %1$s" + "ຍ້າຍ​ໄປ​ໃສ່​ຕຳ​ແໜ່ງ​ທີ່​ມັກ %1$s" + "ຍ້າຍ​ລາຍ​ການ​ແລ້ວ" + "ເພີ່ມ​ໃສ່​ໂຟ​ລ​ເດີ: %1$s" + "ເພີ່ມ​ໃສ່​ໂຟ​ລ​ເດີ​ດ້ວຍ %1$s" + "ເພີ່ມ​ລາຍ​ການ​ໃສ່​ໂຟ​ລ​ເດີ​ແລ້ວ" + "ສ້າງ​ໂຟ​ລ​ເດີ​ກັບ: %1$s" + "ສ້າງ​ໂຟ​ລ​ເດີ​ແລ້ວ" + "ຍ້າຍ​ໄປ​ໃສ່​ໜ້າ​ຈໍ​ຫຼັກ" + "ປັບຂະໜາດ" + "ເພີ່ມ​ລວງ​ກ້​ວາງ​ຂຶ້ນ" + "ເພີ່ມ​ລວງ​ສູງ​ຂຶ້ນ" + "ຫຼຸດ​ລວງ​ກ້​ວາງ​ລົງ" + "ຫຼຸດ​ລວງ​ສູງ​ລົງ" + "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %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 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-rMK/strings.xml b/res/values-mk-rMK/strings.xml new file mode 100644 index 0000000000..54d9c8054a --- /dev/null +++ b/res/values-mk-rMK/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 известувања + + "Страница %1$d од %2$d" + "Екран на почетна страница %1$d од %2$d" + "Нова страница на почетен екран" + "Отворена е папка, %1$d на %2$d" + "Допрете за да ја затворите папката" + "Допрете за да го зачувате преименувањето" + "Папката е затворена" + "Папката е преименувана во %1$s" + "Папка: %1$s" + "Виџети" + "Тапети" + "Поставки за Home" + "Оневозможено од администраторот" + "Дозволете ротација на Почетниот екран" + "Кога телефонот се ротира" + "Точки за известување" + "Вклучено" + "Исклучено" + "Потребен е пристап до известувањата" + "За да се прикажуваат „Точки за известување“, вклучете ги известувањата за апликацијата %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" + "Кратенки" + "%1$d кратенки за %2$s" + "%1$d кратенки и %2$d известувања за %3$s" + "Отфрли" + "Известувањето е отфрлено" + "Лично" + "За работа" + "Работен профил" + "Најдете апликации за работа тука" + "Секоја апликација за работа има значка, а организацијата се грижи за нејзината безбедност. За полесен пристап, преместете ги апликациите на почетниот екран." + "Управувано од вашата организација" + "Известувањата и апликациите се исклучени" + "Затвори" + "Затворено" + diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml new file mode 100644 index 0000000000..a0609333c9 --- /dev/null +++ b/res/values-ml-rIN/strings.xml @@ -0,0 +1,146 @@ + + + + + "ലോഞ്ചർ3" + + "ഔദ്യോഗികം" + "അപ്ലിക്കേഷൻ ഇൻസ്‌റ്റാളുചെ‌യ്‌തിട്ടില്ല." + "അപ്ലിക്കേഷൻ ലഭ്യമല്ല" + "ഡൗൺലോഡുചെയ്‌ത അപ്ലിക്കേഷൻ സുരക്ഷാ മോഡിൽ പ്രവർത്തനരഹിതമാക്കി" + "സുരക്ഷിത മോഡിൽ വിജറ്റുകൾ പ്രവർത്തനരഹിതമാക്കി" + "കുറുക്കുവഴി ലഭ്യമല്ല" + "ഹോം സ്‌ക്രീൻ" + "ഇഷ്‌ടാനുസൃത പ്രവർത്തനങ്ങൾ" + "ഒരു വിജറ്റ് ചേർക്കുന്നതിന് അത് സ്‌പർശിച്ച് പിടിക്കുക." + "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." + "%1$d × %2$d" + "%1$d വീതിയും %2$d ഉയരവും" + "സ്വമേധയാ സ്ഥാപിക്കുന്നതിന് സ്‌പർശിച്ചുപിടിക്കുക" + "സ്വയമേവ ചേർക്കുക" + "ആപ്പുകൾ തിരയുക" + "ആപ്പുകൾ ലോഡുചെയ്യുന്നു..." + "\"%1$s\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പുകളൊന്നും കണ്ടെത്തിയില്ല" + "കൂടുതൽ ആപ്പുകൾക്ക് തിരയുക" + "അറിയിപ്പുകൾ" + "തിരഞ്ഞെടുക്കുന്നതിന് കുറുക്കുവഴി സ്‌പർശിച്ച് പിടിക്കുക." + "കുറുക്കുവഴി തിരഞ്ഞെടുക്കാനോ ഇഷ്‌ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ 2 തവണ ടാപ്പ് ചെയ്‌ത് പിടിക്കുക." + "ഈ ഹോം സ്‌ക്രീനിൽ ഒഴിവൊന്നുമില്ല." + "പ്രിയപ്പെട്ടവയുടെ ട്രേയിൽ ഒഴിവൊന്നുമില്ല" + "അപ്ലിക്കേഷനുകളുടെ ലിസ്‌റ്റ്" + "വ്യക്തിഗത ആപ്പുകളുടെ ലിസ്റ്റ്" + "ഔദ്യോഗിക ആപ്പുകളുടെ ലിസ്റ്റ്" + "ഹോം" + "നീക്കംചെയ്യുക" + "അൺഇൻസ്റ്റാളുചെയ്യുക" + "ആപ്പ് വിവരം" + "ഇൻസ്‌റ്റാൾ ചെയ്യുക" + "കുറുക്കുവഴികൾ ഇൻസ്റ്റാളുചെയ്യുക" + "ഉപയോക്തൃ ഇടപെടൽ ഇല്ലാതെ കുറുക്കുവഴികൾ ചേർക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു." + "ഹോം ക്രമീകരണങ്ങളും കുറുക്കുവഴികളും റീഡുചെയ്യുക" + "ഹോമിലെ ക്രമീകരണങ്ങളും കുറുക്കുവഴികളും റീഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു." + "ഹോം ക്രമീകരണങ്ങളും കുറുക്കുവഴികളും റൈറ്റുചെയ്യുക" + "ഹോമിലെ ക്രമീകരണങ്ങളും കുറുക്കുവഴികളും മാറ്റാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു." + "ഫോൺ കോൾ ചെയ്യാൻ %1$s എന്നതിനെ അനുവദിച്ചിട്ടില്ല" + "വിജറ്റ് ലോഡുചെയ്യുന്നതിൽ പ്രശ്നമുണ്ട്" + "സജ്ജീകരിക്കുക" + "ഇതൊരു സിസ്‌റ്റം അപ്ലിക്കേഷനായതിനാൽ അൺഇൻസ്‌റ്റാളുചെയ്യാനാവില്ല." + "പേരുനൽകാത്ത ഫോൾഡർ" + "%1$s പ്രവർത്തനരഹിതമാക്കി" + + %1$s-ന്, %2$d അറിയിപ്പുകൾ ഉണ്ട് + %1$s-ന്, %2$d അറിയിപ്പ് ഉണ്ട് + + "പേജ് %1$d / %2$d" + "ഹോം സ്‌ക്രീൻ %1$d / %2$d" + "പുതിയ ഹോം സ്ക്രീൻ പേജ്" + "ഫോൾഡർ തുറന്നു, %1$d / %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-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml new file mode 100644 index 0000000000..a3507c5bb8 --- /dev/null +++ b/res/values-mn-rMN/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "Ажил" + "Апп суугаагүй байна." + "Апп-г ашиглах боломжгүй" + "Татаж авсан апп-г Аюулгүй горим дотроос идэвхгүйжүүлсэн" + "Safe горимд виджетүүдийг идэвхгүйжүүлсэн" + "Товчлол алга" + "Үндсэн нүүр" + "Захиалгат үйлдэл" + "Виджетийг авах бол хүрээд барина уу." + "Жижиг хэрэгсэл авах болон тохируулсан үйлдлийг ашиглахын тулд 2 удаа товшоод барина уу." + "%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" + "Шинэ үндсэн нүүр хуудас" + "%1$d %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 товчлол" + "%1$d товчлол болон %3$s%2$d мэдэгдэл" + "Хаах" + "Мэдэгдлийг хаасан" + "Хувийн" + "Ажил" + "Ажлын профайл" + "Ажлын аппыг эндээс олно уу" + "Ажлын апп тус бүр тэмдэгтэй ба эдгээрийг танай байгууллагаас аюулгүй байлгадаг. Аппуудад хялбар хандахын тулд тэдгээрийг Үндсэн нүүр хэсэгт зөөнө үү." + "Танай байгууллагаас удирддаг" + "Мэдэгдэл, апп унтраалттай байна" + "Хаах" + "Хаасан" + diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml index 8506b299a3..bf1e188058 100644 --- a/res/values-mr-rIN/strings.xml +++ b/res/values-mr-rIN/strings.xml @@ -81,6 +81,8 @@ "वॉलपेपर" "होम सेटिंग्‍ज" "आपल्या प्रशासकाने अक्षम केले" + "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" + "फोन फिरविला जातो तेव्हा" "सूचना बिंदू" "चालू" "बंद" diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml new file mode 100644 index 0000000000..3c223b6334 --- /dev/null +++ b/res/values-ms-rMY/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "Kerja" + "Apl tidak dipasang." + "Apl tidak tersedia" + "Apl yang dimuat turun dilumpuhkan dalam mod Selamat" + "Widget dilumpuhkan dalam mod Selamat" + "Pintasan tidak tersedia" + "Skrin utama" + "Tindakan tersuai" + "Sentuh & tahan untuk mengambil widget." + "Ketik dua kali & tahan untuk mengambil widget atau menggunakan tindakan tersuai" + "%1$d × %2$d" + "Lebar %1$d kali tinggi %2$d" + "Sentuh & tahan untuk meletakkan widget/ikon secara manual" + "Tambahkan secara automatik" + "Cari apl" + "Memuatkan apl…" + "Tiada apl yang ditemui sepadan dengan \"%1$s\"" + "Cari lagi apl" + "Pemberitahuan" + "Sentuh & tahan untuk mengambil pintasan." + "Ketik dua kali & tahan untuk mengambil pintasan atau menggunakan tindakan tersuai." + "Tiada lagi ruang pada skrin Laman Utama ini." + "Tiada ruang dalam dulang Kegemaran lagi" + "Senarai apl" + "Senarai apl peribadi" + "Senarai apl kerja" + "Laman Utama" + "Alih keluar" + "Nyahpasang" + "Maklumat apl" + "Pasang" + "pasang pintasan" + "Membenarkan apl menambah pintasan tanpa campur tangan pengguna." + "baca tetapan dan pintasan Laman Utama" + "Membenarkan apl membaca tetapan dan pintasan di Laman Utama." + "tulis tetapan dan pintasan Laman Utama" + "Membenarkan apl menukar tetapan dan pintasan di Laman Utama." + "%1$s tidak dibenarkan membuat panggilan telefon" + "Masalah memuatkan widget" + "Persediaan" + "Ini ialah apl sistem dan tidak boleh dinyahpasang." + "Folder Tanpa Nama" + "%1$s dilumpuhkan" + + %1$s, mempunyai %2$d pemberitahuan + %1$s, mempunyai %2$d pemberitahuan + + "Halaman %1$d daripada %2$d" + "Skrin Laman Utama %1$d daripada %2$d" + "Halaman skrin utama baharu" + "Folder dibuka, %1$d kali %2$d" + "Ketik untuk menutup folder" + "Ketik untuk menyimpan penamaan semula" + "Folder ditutup" + "Folder dinamakan semula kepada %1$s" + "Folder: %1$s" + "Widget" + "Kertas dinding" + "Tetapan laman utama" + "Dilumpuhkan oleh pentadbir anda" + "Benarkan putaran Skrin Utama" + "Apabila telefon diputar" + "Titik pemberitahuan" + "Hidup" + "Mati" + "Akses pemberitahuan diperlukan" + "Untuk menunjukkan Titik Pemberitahuan, hidupkan pemberitahuan apl untuk %1$s" + "Tukar tetapan" + "Tunjukkan titik pemberitahuan" + "Tambahkan ikon pada Skrin Utama" + "Untuk apl baharu" + "Tukar bentuk ikon" + "pada Skrin Utama" + "Gunakan lalai sistem" + "Segi empat sama" + "Segi empat berbucu bulat" + "Bulatan" + "Titisan air mata" + "Menggunakan perubahan bentuk ikon" + "Tidak diketahui" + "Alih keluar" + "Carian" + "Apl ini tidak dipasang" + "Apl untuk ikon ini tidak dipasang. Anda boleh mengalih keluar atau mencari dan memasang apl itu secara manual." + "%1$s memuat turun, %2$s selesai" + "%1$s menunggu untuk dipasang" + "Widget %1$s" + "Tambahkan pada Skrin Utama" + "Alihkan item ke sini" + "Item ditambahkan pada skrin utama" + "Item dialih keluar" + "Alihkan Item" + "Alihkan ke baris %1$s lajur %2$s" + "Alihkan ke kedudukan %1$s" + "Alihkan ke kedudukan kegemaran %1$s" + "Item dialihkan" + "Tambahkan pada folder: %1$s" + "Tambahkan pada folder dengan %1$s" + "Item ditambahkan pada folder" + "Buat folder dengan: %1$s" + "Folder dibuat" + "Alihkan ke Skrin Utama" + "Ubah saiz" + "Tambahkan kelebaran" + "Tambahkan ketinggian" + "Kurangkan kelebaran" + "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" + "Kerja" + "Profil kerja" + "Temui apl kerja di sini" + "Setiap apl kerja terdapat lencana dan dilindungi oleh organisasi anda. Alihkan apl ke Skrin Utama untuk akses yang lebih mudah." + "Diurus oleh organisasi anda" + "Pemberitahuan dan apl dimatikan" + "Tutup" + "Ditutup" + diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml new file mode 100644 index 0000000000..59ac4cad35 --- /dev/null +++ b/res/values-my-rMM/strings.xml @@ -0,0 +1,146 @@ + + + + + "ဖွင့်တင်စက်၃" + + "အလုပ်" + "အက်ပ်မထည့်သွင်းထားပါ" + "အက်ပ်လက်လှမ်း မမှီပါ" + "ဒေါင်းလုဒ် အက်ပ်ကို လုံခြုံရေး မုဒ်ထဲမှာ ပိတ်ထား" + "လုံခြုံရေး မုဒ်ထဲမှာ ဝီဂျက်များကို ပိတ်ထား" + "ဖြတ်လမ်း မရနိုင်ပါ" + "ပင်မစာမျက်နှာ" + "စိတ်ကြိုက် လုပ်ဆောင်ချက်များ" + "ဝဒ်ဂျက်တစ်ခုကို ကောက်ယူရန် ဖိနှိပ်ထားပါ" + "ဝစ်ဂျက်တစ်ခုကိုရယူရန် သို့မဟုတ် စိတ်ကြိုက်လုပ်ဆောင်မှုများကို အသုံးပြုရန် နှစ်ချက်တို့ပြီး ကိုင်ထားပါ။" + "%1$d × %2$d" + "အလျား %1$d နှင့် အမြင့် %2$d" + "ကိုယ်တိုင်ထည့်ရန် ထိထားပါ" + "အလိုအလျောက် ထည့်ရန်" + "ရှာဖွေမှု အက်ပ်များ" + "အက်ပ်များကို ဖွင့်နေသည်…" + "\"%1$s\" နှင့်ကိုက်ညီသည့် အပ်ပ်များကို မတွေ့ပါ" + "နောက်ထပ် အက်ပ်များကို ရှာပါ" + "အကြောင်းကြားချက်များ" + "ဖြတ်လမ်းလင့်ခ်တစ်ခုကို ရွေးရန် ထိပြီး ဖိထားပါ။" + "ဖြတ်လမ်းလင့်ခ်ကို ရွေးရန် (သို့) စိတ်ကြိုက်လုပ်ဆောင်ချက်များကို သုံးရန် နှစ်ချက်တို့ပြီး ဖိထားပါ။" + "ဤပင်မမျက်နှာစာတွင် နေရာလွတ် မကျန်တော့ပါ" + "အနှစ်သက်ဆုံးများ ထားရာတွင် နေရာလွတ် မကျန်တော့ပါ" + "အက်ပ်စာရင်း" + "တစ်ကိုယ်ရေသုံး အက်ပ်စာရင်း" + "အလုပ်သုံး အက်ပ်စာရင်း" + "ပင်မစာမျက်နှာ" + "ဖယ်ရှားမည်" + "ဖယ်ထုတ်မည်" + "အက်ပ်အချက်အလက်များ" + "ထည့်သွင်းရန်" + "အတိုကောက်မှတ်သားမှုများအား ထည့်သွင်းခြင်း" + "အသုံးပြုသူ လုပ်ဆောင်မှုမရှိပဲ အပ်ပလီကေးရှင်းကို အတိုကောက်မှတ်သားမှုများ ပြုလုပ်ခွင့် ပေးခြင်း" + "ပင်မမျက်နှာစာ အပြင်အဆင် နှင့် အတိုကောက်မှတ်သားမှုများအား ဖတ်ခြင်း" + "ပင်မမျက်နှာစာတွင်ရှိသော အပြင်အဆင်နှင့် အတိုကောက်မှတ်သားမှုများကို အပ်ပလီကေးရှင်းအား ဖတ်ခွင့်ပြုခြင်း" + "ပင်မမျက်နှာစာ အပြင်အဆင် နှင့် အတိုကောက်မှတ်သားမှုများအား ရေးသားခြင်း" + "ပင်မမျက်နှာစာတွင် ရှိသော အပြင်အဆင် နှင့် အတိုကောက်မှတ်သားမှုများ ကို အပ်ပလီကေးရှင်းအား ပြောင်းခွင့်ပြုခြင်း" + "%1$sသည် ဖုန်းခေါ်ဆိုခွင့် မရှိပါ" + "ဝဒ်ဂျက် တင်ရာတွင် ပြသနာ ရှိပါသည်" + "စဖွင့်သတ်မှတ်ရန်" + "ဤအပ်ပလီကေးရှင်းမှာ စစ်စတန်ပိုင်းဆိုင်ရာ အပ်ပလီကေးရှင်းဖြစ်ပါသည်။ ထုတ်ပစ်၍ မရပါ" + "အမည်မရှိအကန့်" + "%1$s ကို ပိတ်ထားသည်" + + %1$s တွင် အကြောင်းကြားချက် %2$d ခု ရှိသည် + %1$s တွင် အကြောင်းကြားချက် %2$d ခု ရှိသည် + + "စာမျက်နှာ %1$d မှ %2$d" + "ပင်မစာမျက်နှာ %1$d မှ %2$d" + "ပင်မမျက်နှာပြင် စာမျက်နှာသစ်" + "ဖွင့်ထားသောအကန့်, %1$d နှင့် %2$d" + "ဖိုင်တွဲကို ပိတ်ရန် တို့ပါ" + "အမည်ပြောင်းခြင်းကို သိမ်းဆည်းရန် တို့ပါ" + "ပိတ်ထားသောအကန့်" + "ပြောင်းလဲလိုက်သော အကန့်အမည် %1$s" + "အကန့်အမည်: %1$s" + "ဝိဂျက်များ" + "နောက်ခံများ" + "ပင်မဆက်တင်များ" + "သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်" + "ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုပါ" + "ဖုန်းကိုလှည့်ထားစဉ်" + "အကြောင်းကြားချက်အမှတ်အသားများ" + "ဖွင့်ထားသည်" + "ပိတ်ထားသည်" + "အကြောင်းကြားချက် အသုံးပြုခွင့် လိုအပ်သည်" + "အကြောင်းကြားချက် အစက်များကို ပြသရန် %1$s အတွက် အက်ပ်အကြောင်းကြားချက်များကို ဖွင့်ပါ" + "ဆက်တင်များ ပြောင်းရန်" + "အကြောင်းကြားချက် အမှတ်အသားများကို ပြရန်" + "ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်" + "အက်ပ်အသစ်များအတွက်" + "သင်္ကေတပုံစံကို ပြောင်းရန်" + "\'ပင်မမျက်နှာပြင်\' ပေါ်တွင်" + "စနစ်၏ မူရင်းပုံကို အသုံးပြုရန်" + "လေးထောင့်" + "စတုရန်းမကျ စက်ဝိုင်းမကျပုံ" + "စက်ဝိုင်း" + "မျက်ရည်စက်ပုံ" + "သင်္ကေတပုံစံကို ပြောင်းလဲနေသည်" + "မသိရ" + "ဖယ်ရှားရန်" + "ရှာဖွေရန်" + "အက်ပ်မတပ်ဆင်ရသေးပါ" + "ဤအိုင်ကွန်အတွက် အက်ပ်အားမထည့်သွင်းထားပါ။ You can remove it, or search for the အက်ပ်and install it manually." + "%1$s ဒေါင်းလုဒ်လုပ်နေသည်၊ %2$s ပြီးပါပြီ" + "%1$s ကိုထည့်သွင်းရန်စောင့်နေသည်" + "%1$s ဝိဂျက်များ" + "ပင်မမျက်နှာစာသို့ ထည့်ပါ" + "၎င်းအား ဤသို့ ရွှေ့ပါ" + "ပင်မ ဖန်မျက်နှာပြင်သို့ ထည့်ပြီး၏" + "၎င်းအား ဖယ်ရှားပြီး၏" + "၎င်းအား ရွှေ့ပါ" + "အတန်း %1$s အတိုင် %2$s သို့ ရွှေ့ပါ" + "%1$s သို့ နေရာရွှေ့ပါ" + "စိတ်ကြိုက်နေရာ %1$s သို့ ရွှေ့ပါ" + "၎င်းအားရွှေ့ပြီး" + "ဖိုလ်ဒါသို့ ထည့်ရန်- %1$s" + "%1$s အမည်ရှိ ဖိုလ်ဒါသို့ ထည့်ပြီး၏" + "ဖိုလ်ဒါသို့ ထည့်ပြီး" + "ဖိုလ်ဒါ ပြုလုပ်ရန်- %1$s" + "ဖိုလ်ဒါ ပြုလုပ်ပြီး" + "ပင်မမျက်နှာပြင်သို့ ရွှေ့ပါ" + "အရွယ်အစားပြောင်းပါ" + "အကျယ်အား တိုးပါ" + "အမြင့်အား တိုးပါ" + "အကျယ်အား လျှော့ပါ" + "အမြင့်အား လျှော့ပါ" + "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 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-rNP/strings.xml b/res/values-ne-rNP/strings.xml new file mode 100644 index 0000000000..a8a64f1bbc --- /dev/null +++ b/res/values-ne-rNP/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "कार्य" + "अनुप्रयोग स्थापित छैन।" + "अनुप्रयोग उपलब्ध छैन" + "सुरक्षित मोडमा डाउनलोड गरेको अनुप्रयोग अक्षम गरिएको छ" + "सुरक्षित मोडमा विगेटहरू अक्षम गरियो" + "सर्टकट उपलब्ध छैन" + "गृह स्क्रिन" + "आफू अनुकूलका कारबाहीहरू" + "एउटा विजेटलाई टिप्नको लागि टच गरेर होल्ड गर्नुहोस्।" + "विजेटलाई छान्न वा आफू अनुकूल कार्यहरू प्रयोग गर्न डबल ट्याप गरी होल्ड गर्नुहोस्।" + "%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" + "गृह स्क्रिन %1$d को %2$d" + "नयाँ गृह स्क्रिन पृष्ठ" + "फोल्डर खुल्यो %1$d बाट %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-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-rIN/strings.xml b/res/values-pa-rIN/strings.xml new file mode 100644 index 0000000000..c0778690ad --- /dev/null +++ b/res/values-pa-rIN/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "ਦਫ਼ਤਰ" + "ਐਪ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ ਹੈ।" + "ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + "ਡਾਊਨਲੋਡ ਕੀਤਾ ਐਪ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" + "ਵਿਜੇਟ ਸੁਰੱਖਿਅਤ ਮੋਡ ਵਿੱਚ ਅਸਮਰਥਿਤ" + "ਸ਼ਾਰਟਕੱਟ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + "ਹੋਮ ਸਕ੍ਰੀਨ" + "ਵਿਉਂਂਤੀ ਕਾਰਵਾਈਆਂ" + "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋT & ਹੋਲਡ ਕਰੋ।" + "ਇੱਕ ਵਿਜੇਟ ਚੁਣਨ ਲਈ ਜਾਂ ਵਿਉਂਂਤੀ ਕਾਰਵਾਈਆਂ ਵਰਤਣ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।" + "%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" + "ਨਵਾਂ ਹੋਮ ਸਕ੍ਰੀਨ ਸਫ਼ਾ" + "ਫੋਲਡਰ ਖੋਲ੍ਹਿਆ, %1$d ਬਾਇ %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-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-rLK/strings.xml b/res/values-si-rLK/strings.xml new file mode 100644 index 0000000000..10835dc5ce --- /dev/null +++ b/res/values-si-rLK/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "කාර්යාලය" + "යෙදුම ස්ථාපනය කර නැත." + "යෙදුම නොතිබේ" + "ආරක්ෂිත ආකාරය තුළ බාගන්න ලද යෙදුම් අබල කරන්න" + "සුරක්ෂිත ආකාරය තුළ විජටය අබල කරන ලදි" + "කෙටි මග ලබා ගත නොහැකිය" + "මුල් පිටු තිරය" + "අභිරුචි ක්‍රියා" + "විජට් එක ස්පර්ශ කර අහුලා ගැනීමට අල්ලාගෙන සිටින්න." + "විජට් එකක් අහුලා ගැනීමට හෝ අභිරුචි ක්‍රියා කිරීමට ඩබල් ටැප් කර අල්ලා ගෙන සිටින්න." + "%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" + "නව මුල් පිටුව" + "ෆෝල්ඩරය විවෘත විය, %1$d හි %2$d" + "ෆෝල්ඩරය වැසීමට තට්ටු කරන්න" + "යළි නම් කිරීම සුරැකීමට තට්ටු කරන්න" + "ෆෝල්ඩරය වසා ඇත" + "%1$s වෙත ෆෝල්ඩරය නැවත නම් කෙරිණි" + "ෆෝල්ඩරය: %1$s" + "විජට්" + "වෝල්පේපර" + "Home සැකසීම්" + "ඔබගේ පරිපාලක විසින් අබල කරන ලදී" + "මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න" + "දුරකථනය කරකවන විට" + "දැනුම්දීම් තිත්" + "ක්‍රියාත්මකයි" + "ක්‍රියාවිරහිතයි" + "දැනුම්දීම් ප්‍රවේශය අවශ්‍යයි" + "දැනුම්දීම් තිත් පෙන්වීමට, %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-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-rAL/strings.xml b/res/values-sq-rAL/strings.xml new file mode 100644 index 0000000000..82cc42a169 --- /dev/null +++ b/res/values-sq-rAL/strings.xml @@ -0,0 +1,146 @@ + + + + + "Nisësi3" + + "Puna" + "Aplikacioni nuk është i instaluar." + "Aplikacioni nuk mundësohet" + "Aplikacioni i shkarkuar është i çaktivizuar në modalitetin e sigurt" + "Miniaplikacionet janë të çaktivizuara në modalitetin e sigurt" + "Shkurtorja nuk është e disponueshme" + "Ekrani bazë" + "Veprimet e personalizuara" + "Prek dhe mbaj shtypur për të zgjedhur një miniaplikacion." + "Prek dy herë dhe mbaj shtypur për të zgjedhur një miniaplikacion ose për të përdorur veprimet e personalizuara." + "%1$d × %2$d" + "%1$d i gjerë me %2$d i lartë" + "Prek dhe mbaj të shtypur për të vendosur në mënyrë manuale" + "Shto automatikisht" + "Kërko për aplikacione" + "Po ngarkon aplikacionet..." + "Nuk u gjet asnjë aplikacion që përputhet me \"%1$s\"" + "Kërko për më shumë aplikacione" + "Njoftimet" + "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." + "Nuk ka më hapësirë në këtë ekran bazë." + "Nuk ka më hapësirë në tabakanë \"Të preferuarat\"" + "Lista e aplikacioneve" + "Lista e aplikacioneve personale" + "Lista e aplikacioneve të punës" + "Faqja kryesore" + "Hiqe" + "Çinstalo" + "Informacion mbi aplikacionin" + "Instalo" + "instalo shkurtore" + "Lejon një aplikacion të shtojë shkurtore pa ndërhyrjen e përdoruesit." + "lexo cilësimet dhe shkurtoret e ekranit bazë" + "Lejon aplikacionin të lexojë cilësimet dhe shkurtoret në ekranin bazë." + "shkruaj cilësimet dhe shkurtoret e ekranit bazë" + "Lejon aplikacionin të ndryshojë cilësimet dhe shkurtoret në ekranin bazë." + "%1$s nuk lejohet të kryejë telefonata" + "Problem në ngarkimin e miniaplikacionit" + "Konfiguro" + "Ky është aplikacion sistemi dhe nuk mund të çinstalohet." + "Dosje e paemërtuar" + "%1$s u çaktivizua" + + %1$s, ka %2$d njoftime + %1$s, ka %2$d njoftime + + "Faqja: %1$d nga gjithsej %2$d" + "Ekrani bazë: %1$d nga gjithsej %2$d" + "Faqja e ekranit të ri kryesor" + "Dosja u hap, %1$d me %2$d" + "Trokit për të mbyllur dosjen" + "Trokit për të ruajtur riemërtimin" + "Dosja u mbyll" + "Dosja u riemërtua në %1$s" + "Dosja: %1$s" + "Miniaplikacionet" + "Imazhet e sfondit" + "Cilësimet e Home" + "Çaktivizuar nga administratori" + "Lejo rrotullimin e ekranit kryesor" + "Kur telefoni rrotullohet" + "Pikat e njoftimeve" + "Aktiv" + "Joaktiv" + "Nevojitet qasja në njoftime" + "Për të shfaqur \"Pikat e njoftimeve\", aktivizo njoftimet e aplikacionit për %1$s" + "Ndrysho cilësimet" + "Shfaq pikat e njoftimeve" + "Shto ikonë në ekranin bazë" + "Për aplikacionet e reja" + "Ndrysho formën e ikonës" + "në ekranin bazë" + "Përdor parazgjedhjen e sistemit" + "Katror" + "Katror me kënde të rrumbullakëta" + "Rreth" + "Pikë loti" + "Po zbatohen ndryshimet e formës së ikonës" + "I panjohur" + "Hiq" + "Kërko" + "Aplikacioni nuk është i instaluar" + "Aplikacioni për këtë ikonë nuk është i instaluar. Mund ta heqësh ose të kërkosh aplikacionin dhe ta instalosh atë në mënyrë manuale." + "%1$s po shkarkohet, %2$s të përfunduara" + "%1$s po pret të instalohet" + "Miniaplikacionet e %1$s" + "Shto në Ekranin bazë" + "Zhvendose artikullin këtu" + "Artikulli u shtua tek ekrani bazë" + "Artikulli u hoq" + "Zhvendose artikullin" + "Zhvendos te rreshti %1$s, kolona %2$s" + "Zhvendos te pozicioni %1$s" + "Zhvendos te pozicioni %1$s i preferencave" + "Artikulli u zhvendos" + "Shto te dosja: %1$s" + "Shto te dosja me %1$s" + "Artikulli u shtua te dosja" + "Krijo një dosje me: %1$s" + "Dosja u krijua" + "Zhvendose në Ekranin bazë" + "Ndrysho madhësinë" + "Rrit gjerësinë" + "Rrit lartësinë" + "Zvogëlo gjerësinë" + "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" + "Punë" + "Profili i punës" + "Gjej këtu aplikacionet e punës" + "Secili aplikacion pune ka një distinktiv dhe mbahet i sigurt nga organizata jote. Zhvendosi aplikacionet e punës në ekranin tënd kryesor për qasje më të lehtë." + "Menaxhohet nga organizata jote" + "Njoftimet dhe aplikacionet janë joaktive" + "Mbyll" + "Mbyllur" + 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-rIN/strings.xml b/res/values-ta-rIN/strings.xml index d507be46cd..a51247c2de 100644 --- a/res/values-ta-rIN/strings.xml +++ b/res/values-ta-rIN/strings.xml @@ -81,6 +81,8 @@ "வால்பேப்பர்கள்" "முகப்பு அமைப்புகள்" "உங்கள் நிர்வாகி முடக்கியுள்ளார்" + "முகப்புத் திரை சுழற்சியை அனுமதி" + "மொபைலைச் சுழற்றும் போது" "அறிவிப்புப் புள்ளிகள்" "ஆன்" "முடக்கப்பட்டுள்ளது" diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml new file mode 100644 index 0000000000..bffb1a8700 --- /dev/null +++ b/res/values-te-rIN/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "కార్యాలయం" + "యాప్ ఇన్‌స్టాల్ చేయబడలేదు." + "యాప్ అందుబాటులో లేదు" + "డౌన్‌లోడ్ చేసిన యాప్ సురక్షిత మోడ్‌లో నిలిపివేయబడింది" + "సురక్షిత మోడ్‌లో విడ్జెట్‌లు నిలిపివేయబడ్డాయి" + "షార్ట్‌కట్ అందుబాటులో లేదు" + "హోమ్ స్క్రీన్" + "అనుకూల చర్యలు" + "విడ్జెట్‌ను ఎంచుకోవడానికి తాకి & నొక్కి పెట్టండి." + "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." + "%1$d × %2$d" + "%1$d వెడల్పు X %2$d ఎత్తు" + "మాన్యువల్‌గా ఉంచడానికి నొక్కి &amp పట్టుకోండి" + "స్వయంచాలకంగా జోడించు" + "అప్లికేషన్‌లను శోధించండి" + "అప్లికేషన్‌లను లోడ్ చేస్తోంది…" + "\"%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-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-rPK/strings.xml b/res/values-ur-rPK/strings.xml new file mode 100644 index 0000000000..77aa0a1eb5 --- /dev/null +++ b/res/values-ur-rPK/strings.xml @@ -0,0 +1,146 @@ + + + + + "Launcher3" + + "دفتری" + "ایپ انسٹال نہیں ہے۔" + "ایپ دستیاب نہیں ہے" + "ڈاؤن لوڈ کردہ ایپ کو محفوظ وضع میں غیر فعال کر دیا گیا" + "ویجیٹس کو محفوظ وضع میں غیر فعال کر دیا گیا" + "شارٹ کٹ دستیاب نہیں ہے" + "ہوم اسکرین" + "حسب ضرورت کارروائیاں" + "کوئی ویجیٹ منتخب کرنے کیلئے ٹچ کریں اور پکڑے رہیں۔" + "کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔" + "%1$d × %2$d" + "‏%1$d چوڑا اور ‎%2$d اونچا" + "‏دستی طور پر رکھنے کیلئے ‎& ٹچ کرکے ہولڈ کریں" + "خود کار طور پر شامل کریں" + "ایپس تلاش کریں" + "ایپس لوڈ کی جا رہی ہیں…" + "\"%1$s\" سے مماثل کوئی ایپس نہیں ملیں" + "مزید ایپس تلاش کریں" + "اطلاعات" + "ایک شارٹ کٹ منتخب کرنے کیلئے ٹچ کر کے دبائے رکھیں۔" + "ایک شارٹ کٹ منتخب کرنے یا حسب ضرورت کارروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور دبائے رکھیں۔" + "اس ہوم اسکرین پر مزید کوئی گنجائش نہیں ہے۔" + "پسندیدہ ٹرے میں مزید کوئی گنجائش نہیں ہے" + "ایپس کی فہرست" + "ذاتی ایپس کی فہرست" + "دفتری ایپس کی فہرست" + "ہوم" + "ہٹائیں" + "اَن انسٹال کریں" + "ایپ کی معلومات" + "انسٹال کریں" + "شارٹ کٹس انسٹال کریں" + "کسی ایپ کو صارف کی مداخلت کے بغیر شارٹ کٹس شامل کرنے کی اجازت دیتا ہے۔" + "ہوم ترتیبات اور شارٹ کٹس کو پڑھیں" + "ایپ کو ہوم میں ترتیبات اور شارٹ کٹس کو پڑھنے کی اجازت دیتا ہے۔" + "ہوم ترتیبات اور شارٹ کٹس کو لکھیں" + "ایپ کو ہوم میں ترتیبات اور شارٹ کٹس کو تبدیل کرنے کی اجازت دیتا ہے۔" + "%1$s کو فون کالیں کرنے کی اجازت نہیں ہے" + "ویجیٹ کو لوڈ کرنے میں مسئلہ" + "ترتیب دیں" + "یہ ایک سسٹم ایپ ہے اور اسے اَن انسٹال نہیں کیا جا سکتا ہے۔" + "بلا نام فولڈر" + "%1$s غیر فعال ہے" + + %1$s میں %2$d اطلاعات ہیں + %1$s میں %2$d اطلاع ہے + + "‏صفحہ ‎%1$d از ‎%2$d" + "‏ہوم اسکرین ‎%1$d از ‎%2$d" + "نیا ہوم اسکرین صفحہ" + "فولڈر کھولا گیا، %1$d × %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-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml index 72dbd9eb89..0360a7132a 100644 --- a/res/values-uz-rUZ/strings.xml +++ b/res/values-uz-rUZ/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" From 1c56935c308bb3edf0e429ad70d2c9fed63af10c Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 30 Apr 2018 17:26:40 +0000 Subject: [PATCH 123/257] 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 (cherry picked from commit 310093d0505570f0239e10bc10aa43686b668d70) --- 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 d2a126f7f7..b5a603ebd7 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; @@ -3468,10 +3467,4 @@ public class Workspace extends PagedView onEndStateTransition(); } } - - @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - info.setScrollable(false); - } } From 83b4bb0421a2bb6c299dbf4b550ca9c82b587abd Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 30 Apr 2018 12:14:58 -0700 Subject: [PATCH 124/257] Making sure Clear-all button can't be clicked when transparent There are times when the button is visible, but completely transparent. Fixing: now when transparent, it's invisible, consequently, unclickable. Bug: 72222505 Test: Manual Change-Id: I1be162b56d6e694199fad7845c64f3438415a190 --- .../android/quickstep/views/RecentsView.java | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 51b787ba0e..6159cef343 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -304,7 +304,7 @@ public abstract class RecentsView extends PagedView impl private float calculateClearAllButtonAlpha() { final int childCount = getChildCount(); - if (mClearAllButton.getVisibility() != View.VISIBLE || childCount == 0) return 0; + if (mShowEmptyMessage || childCount == 0) return 0; // Current visible coordinate of the end of the oldest task. final View lastChild = getChildAt(childCount - 1); @@ -356,7 +356,9 @@ public abstract class RecentsView extends PagedView impl private void updateClearAllButtonAlpha() { if (mClearAllButton != null) { - mClearAllButton.setAlpha(calculateClearAllButtonAlpha() * mContentAlpha); + final float alpha = calculateClearAllButtonAlpha(); + mClearAllButton.setAlpha(alpha * mContentAlpha); + mClearAllButton.setVisibility(alpha == 0 ? INVISIBLE : VISIBLE); } } @@ -1027,9 +1029,6 @@ public abstract class RecentsView extends PagedView impl mShowEmptyMessage = isEmpty; updateEmptyStateUi(hasSizeChanged); invalidate(); - if (mClearAllButton != null) { - updateClearAllButtonVisibility(); - } } @Override @@ -1044,7 +1043,7 @@ public abstract class RecentsView extends PagedView impl mEmptyTextLayout = null; mLastMeasureSize.set(getWidth(), getHeight()); } - updateClearAllButtonVisibility(); + updateClearAllButtonAlpha(); if (!mShowEmptyMessage) return; @@ -1238,14 +1237,8 @@ public abstract class RecentsView extends PagedView impl return mIsRtl ? additionalScrollForClearAllButton() : 0; } - private void updateClearAllButtonVisibility() { - if (mClearAllButton == null) return; - mClearAllButton.setVisibility(mShowEmptyMessage ? GONE : VISIBLE); - updateClearAllButtonAlpha(); - } - public void setClearAllButton(View clearAllButton) { mClearAllButton = clearAllButton; - updateClearAllButtonVisibility(); + updateClearAllButtonAlpha(); } } From df296898dade92c961cbe28904fd3a959211f518 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 30 Apr 2018 12:35:16 -0700 Subject: [PATCH 125/257] Fixing Search box not getting aligned properly based on insets Bug: 77893699 Change-Id: If195395af7858c3115d695a308810480474541a5 --- res/layout/search_container_all_apps.xml | 1 - .../allapps/search/AppsSearchContainerLayout.java | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/res/layout/search_container_all_apps.xml b/res/layout/search_container_all_apps.xml index 14d7b53b65..fd9cb60fc7 100644 --- a/res/layout/search_container_all_apps.xml +++ b/res/layout/search_container_all_apps.xml @@ -20,7 +20,6 @@ android:layout_height="@dimen/all_apps_search_bar_field_height" android:layout_centerHorizontal="true" android:layout_gravity="top|center_horizontal" - android:layout_marginTop="8dp" android:background="@drawable/bg_all_apps_searchbox" android:elevation="1dp" android:focusableInTouchMode="true" diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java index ad61c55db7..ab6635e45e 100644 --- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java +++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java @@ -62,6 +62,10 @@ public class AppsSearchContainerLayout extends ExtendedEditText private AlphabeticalAppsList mApps; private AllAppsContainerView mAppsView; + // This value was used to position the QSB. We store it here for translationY animations. + private final float mFixedTranslationY; + private final float mMarginTopAdjusting; + public AppsSearchContainerLayout(Context context) { this(context, null); } @@ -79,6 +83,9 @@ public class AppsSearchContainerLayout extends ExtendedEditText mSearchQueryBuilder = new SpannableStringBuilder(); Selection.setSelection(mSearchQueryBuilder, 0); + mFixedTranslationY = getTranslationY(); + mMarginTopAdjusting = mFixedTranslationY - getPaddingTop(); + // Update the hint to contain the icon. // Prefix the original hint with two spaces. The first space gets replaced by the icon // using span. The second space is used for a singe space character between the hint @@ -195,14 +202,16 @@ public class AppsSearchContainerLayout extends ExtendedEditText @Override public void setInsets(Rect insets) { + MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams(); + mlp.topMargin = Math.round(Math.max(-mFixedTranslationY, insets.top - mMarginTopAdjusting)); + requestLayout(); + DeviceProfile dp = mLauncher.getDeviceProfile(); if (dp.isVerticalBarLayout()) { mLauncher.getAllAppsController().setScrollRangeDelta(0); } else { - MarginLayoutParams mlp = ((MarginLayoutParams) getLayoutParams()); - int myBot = mlp.topMargin + (int) getTranslationY() + mlp.height; mLauncher.getAllAppsController().setScrollRangeDelta( - dp.hotseatBarBottomPaddingPx + myBot); + insets.bottom + mlp.topMargin + mFixedTranslationY); } } } From 8013843fbda189cfbe2e15d85b21e0663befe6d6 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Mon, 9 Apr 2018 15:05:59 -0700 Subject: [PATCH 126/257] Secondary split screen app will be next to the navigation bar (2/2) Refactored docked position code into PhoneWindowManager to determine which side the docked app should go based on the position of the nav bar in landscape (as portrait will only have top). Fixed the split screen entrance animation for quick step's overview. Change-Id: I0035214cecb9c6403c59f4b938c2d1ae924f34b0 Fixes: 73250406 Test: play around with splitscreen and minimized mode --- quickstep/libs/sysui_shared.jar | Bin 123276 -> 124099 bytes .../android/quickstep/TaskSystemShortcut.java | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 13f41ee5fc747449057d6cd5927e53f4ac10815a..70e545f4fb35f8a9ea93692000b15fbdf1f72c61 100644 GIT binary patch delta 5828 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 delta 5253 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 diff --git a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java index 7c69a8de34..6fece3163b 100644 --- a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java +++ b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java @@ -153,8 +153,13 @@ public class TaskSystemShortcut extends SystemShortcut AbstractFloatingView.closeOpenViews(activity, true, AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE); + final int navBarPosition = WindowManagerWrapper.getInstance().getNavBarPosition(); + if (navBarPosition == WindowManagerWrapper.NAV_BAR_POS_INVALID) { + return; + } + boolean dockTopOrLeft = navBarPosition != WindowManagerWrapper.NAV_BAR_POS_LEFT; if (ActivityManagerWrapper.getInstance().startActivityFromRecents(taskId, - ActivityOptionsCompat.makeSplitScreenOptions(true))) { + ActivityOptionsCompat.makeSplitScreenOptions(dockTopOrLeft))) { ISystemUiProxy sysUiProxy = RecentsModel.getInstance(activity).getSystemUiProxy(); try { sysUiProxy.onSplitScreenInvoked(); From c2032ee2f4d706b0534507e707b21c09787a938c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 30 Apr 2018 15:28:15 -0700 Subject: [PATCH 127/257] Import translations. DO NOT MERGE Change-Id: I229a0d80355868f6197033b792dc1796973adebe Auto-generated-cl: translation import --- quickstep/res/values-az/strings.xml | 2 +- quickstep/res/values-be/strings.xml | 2 +- quickstep/res/values-bn/strings.xml | 2 +- quickstep/res/values-bs/strings.xml | 2 +- quickstep/res/values-et/strings.xml | 2 +- quickstep/res/values-eu/strings.xml | 2 +- quickstep/res/values-gl/strings.xml | 4 ++-- quickstep/res/values-gu/strings.xml | 2 +- quickstep/res/values-hy/strings.xml | 2 +- quickstep/res/values-is/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-ky/strings.xml | 2 +- quickstep/res/values-lo/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-ne/strings.xml | 2 +- quickstep/res/values-pa/strings.xml | 2 +- quickstep/res/values-si/strings.xml | 2 +- quickstep/res/values-sq/strings.xml | 2 +- quickstep/res/values-ta/strings.xml | 2 +- quickstep/res/values-te/strings.xml | 2 +- quickstep/res/values-ur/strings.xml | 2 +- quickstep/res/values-uz/strings.xml | 2 +- res/values-az/strings.xml | 2 ++ res/values-be/strings.xml | 2 ++ res/values-bn/strings.xml | 6 ++++-- res/values-bs/strings.xml | 6 ++++-- res/values-et/strings.xml | 4 +++- res/values-eu/strings.xml | 8 +++++--- res/values-gl/strings.xml | 2 ++ res/values-gu/strings.xml | 2 ++ res/values-hy/strings.xml | 2 ++ res/values-is/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-ky/strings.xml | 8 +++++--- res/values-lo/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 | 10 ++++++---- res/values-ms/strings.xml | 2 ++ res/values-my/strings.xml | 2 ++ res/values-ne/strings.xml | 2 ++ res/values-pa/strings.xml | 2 ++ res/values-si/strings.xml | 2 ++ res/values-sq/strings.xml | 4 +++- res/values-ta/strings.xml | 4 +++- res/values-te/strings.xml | 2 ++ res/values-ur/strings.xml | 2 ++ res/values-uz/strings.xml | 6 ++++-- 60 files changed, 110 insertions(+), 50 deletions(-) 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-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-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 fa07794428..9ffa84806c 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -21,8 +21,8 @@ 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" + "Obriši sve" diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml index 1b30a0111d..efa68f9c43 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Jagatud ekraan" "Kinnita" - "Rakenduste vahetamiseks pühkige alaosast üles" "Ü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 e7fc91580b..d22242efab 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -21,8 +21,8 @@ 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" + "Garbitu guztiak" diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index 20de491d7d..8efc773f49 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -21,8 +21,8 @@ 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" + "Borrar todo" diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index 9337909204..cdae86feba 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "સ્ક્રીનને વિભાજિત કરો" "પિન કરો" - "ઍપને સ્વિચ કરવા માટે નીચેથી ઉપર સ્વાઇપ કરો" "ઝલક" "તાજેતરની કોઈ આઇટમ નથી" "બંધ કરો" + "બધું સાફ કરો" 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-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-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-ky/strings.xml b/quickstep/res/values-ky/strings.xml index 44b7abb7da..b788693824 100644 --- a/quickstep/res/values-ky/strings.xml +++ b/quickstep/res/values-ky/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Экранды бөлүү" "Кадап коюу" - "Колдонмолорду которуштуруу үчүн экранды төмөндөн жогору карай сүрүңүз" "Сереп салуу" "Акыркы колдонмолор жок" "Жабуу" + "Баарын тазалоо" 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-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 fa80874287..938363db0f 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "विभाजित स्क्रीन" "पिन करा" - "अ‍ॅप्स स्विच करण्यासाठी तळापासून वर स्वाइप करा" "अवलोकन" "कोणतेही अलीकडील आयटम नाहीत" "बंद" + "सर्व साफ करा" 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-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-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-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-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-ta/strings.xml b/quickstep/res/values-ta/strings.xml index 95d233d625..0c800ca720 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "திரைப் பிரிப்பு" "பின் செய்தல்" - "ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, கீழிருந்து மேல்நோக்கி ஸ்வைப் செய்க" "மேலோட்டப் பார்வை" "சமீபத்தியவை எதுவுமில்லை" "மூடும்" + "எல்லாம் அழி" 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-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 260798f54b..efea34117f 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -21,8 +21,8 @@ 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" + "Hammasini tozalash" 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-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-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 7eeb652136..40c886603d 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -80,8 +80,10 @@ "Folder: %1$s" "Dodaci" "Pozadinske slike" - "Postavke za Home" + "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-et/strings.xml b/res/values-et/strings.xml index 2946076f5d..1bde8aac13 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -79,8 +79,10 @@ "Kaust: %1$s" "Vidinad" "Taustapildid" - "Avalehe seaded" + "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 c3099bd98e..128c6f42a3 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -81,13 +81,15 @@ "Horma-paperak" "Hasierako pantailaren ezarpenak" "Administratzaileak desgaitu du" - "Jakinarazteko biribiltxoak" + "Baimendu hasierako pantaila biratzea" + "Telefonoa biratzen denean" + "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-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-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-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-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-ky/strings.xml b/res/values-ky/strings.xml index e0e740346a..502a08a3e1 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -39,7 +39,7 @@ "Колдонмолор жүктөлүүдө…" "\"%1$s\" сурамына дал келген колдонмолор табылган жок" "Көбүрөөк колдонмолорду издөө" - "Эскертмелер" + "Билдирмелер" "Кыска жолду тандоо үчүн басып туруңуз." "Кыска жолду тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз." "Бул Үй экранында бош орун жок." @@ -81,7 +81,9 @@ "Тушкагаздар" "Башкы беттин жөндөөлөрү" "Администраторуңуз өчүрүп койгон" - "Эскертме белгилери" + "Башкы экранды айлантууга уруксат берүү" + "Телефон айланганда" + "Билдирмелер белгилери" "Күйүк" "Өчүк" "Эскертмелерге уруксат берилиши керек" @@ -92,7 +94,7 @@ "Жаңы колдонмолор үчүн" "Сүрөтчөнүн формасын өзгөртүү" "Башкы экранда" - "Тутум сушунтаган демейкисин колдонуу" + "Демейки тутум жөндөөлөрү колдонулат" "Чарчы" "Бурчтары жумуру төрт бурчтук" "Тегерек" 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-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 0e2f9c808c..bf1e188058 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" @@ -81,6 +81,8 @@ "वॉलपेपर" "होम सेटिंग्‍ज" "आपल्या प्रशासकाने अक्षम केले" + "मुख्यस्क्रीन फिरविण्‍यास अनुमती द्या" + "फोन फिरविला जातो तेव्हा" "सूचना बिंदू" "चालू" "बंद" @@ -102,7 +104,7 @@ "काढा" "शोधा" "हा अॅप इंस्टॉल केलेला नाही" - "या चिन्हासाठी अॅप इंस्टॉल केलेला नाही. आपण ते काढू शकता किंवा अॅपचा शोध घेऊ शकता आणि त्यास व्यक्तिचलितपणे इंस्टॉल करू शकता." + "या चिन्हासाठी अॅप इंस्टॉल केलेला नाही. तुम्ही ते काढू शकता किंवा अॅपचा शोध घेऊ शकता आणि त्यास व्यक्तिचलितपणे इंस्टॉल करू शकता." "%1$s डाउनलोड होत आहे , %2$s पूर्ण झाले" "%1$s इंस्टॉल करण्याची प्रतिक्षा करत आहे" "%1$s विजेट" 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-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-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-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-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-ta/strings.xml b/res/values-ta/strings.xml index 717c80f8ba..a51247c2de 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -50,7 +50,7 @@ "முகப்பு" "அகற்று" "நிறுவல் நீக்கு" - "ஆப்ஸ் தகவல்" + "பயன்பாட்டுத் தகவல்" "நிறுவு" "குறுக்குவழிகளை நிறுவுதல்" "பயனரின் அனுமதி இல்லாமல் குறுக்குவழிகளைச் சேர்க்கப் பயன்பாட்டை அனுமதிக்கிறது." @@ -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-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 e9f36a842a..0360a7132a 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -79,8 +79,10 @@ "Jild: %1$s" "Vidjetlar" "Fon rasmlari" - "Home sozlamalari" + "Bosh ekran sozlamalari" "Administrator tomonidan o‘chirilgan" + "Asosiy ekranni aylantirishga ruxsat berish" + "Telefon burilganda" "Bildirishnoma belgilari" "Yoniq" "O‘chiq" @@ -88,7 +90,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" From 36d090df67c03acfef370723bb90c92ca86547fe Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 26 Apr 2018 13:51:18 -0700 Subject: [PATCH 128/257] Adding a round rect background for the self in Overview Bug: 78771910 Change-Id: I71460a284ed185e82d66fe65104402fb99d6b312 --- quickstep/res/values/dimens.xml | 3 + .../launcher3/uioverrides/AllAppsScrim.java | 154 ++++++++++++++++++ .../android/quickstep/util/LayoutUtils.java | 9 +- res/values/styles.xml | 4 +- .../allapps/AllAppsContainerView.java | 7 +- .../allapps/AllAppsTransitionController.java | 10 ++ .../launcher3/uioverrides/AllAppsScrim.java | 39 +++++ 7 files changed, 218 insertions(+), 8 deletions(-) create mode 100644 quickstep/src/com/android/launcher3/uioverrides/AllAppsScrim.java create mode 100644 src_ui_overrides/com/android/launcher3/uioverrides/AllAppsScrim.java diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index 0199cd9537..9e4d60c5e5 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -48,4 +48,7 @@ 168dp + + 16dp + 4dp diff --git a/quickstep/src/com/android/launcher3/uioverrides/AllAppsScrim.java b/quickstep/src/com/android/launcher3/uioverrides/AllAppsScrim.java new file mode 100644 index 0000000000..3c741b337e --- /dev/null +++ b/quickstep/src/com/android/launcher3/uioverrides/AllAppsScrim.java @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.uioverrides; + +import static com.android.launcher3.anim.Interpolators.ACCEL_2; +import static com.android.launcher3.anim.Interpolators.DEACCEL_2; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.support.v4.graphics.ColorUtils; + +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Launcher; +import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.allapps.AllAppsContainerView; +import com.android.launcher3.graphics.ViewScrim; +import com.android.launcher3.util.Themes; + +/** + * Scrim used for all-apps and shelf in Overview + * In transposed layout, it behaves as a simple color scrim. + * In portrait layout, it draws a rounded rect such that + * From normal state to overview state, the shelf just fades in and does not move + * From overview state to all-apps state the self moves up and fades in to cover the screen + */ +public class AllAppsScrim extends ViewScrim { + + private static final int THRESHOLD_ALPHA_DARK = 102; + private static final int THRESHOLD_ALPHA_LIGHT = 46; + + private final Launcher mLauncher; + private final int mEndColor; + + private int mProgressColor; + + // In transposed layout, we simply draw a flat color. + private boolean mDrawingFlatColor; + + private final Paint mVerticalPaint; + private float mVerticalProgress; + + private final int mEndAlpha; + private final int mThresholdAlpha; + private final float mRadius; + private final float mTopPadding; + + // Max vertical progress after which the scrim stops moving. + private float mMoveThreshold; + // Minimum visible size of the scrim. + private int mMinSize; + private float mDrawFactor = 0; + + public AllAppsScrim(AllAppsContainerView view) { + super(view); + mLauncher = Launcher.getLauncher(view.getContext()); + mEndColor = Themes.getAttrColor(mLauncher, R.attr.allAppsScrimColor); + mProgressColor = mEndColor; + + mEndAlpha = Color.alpha(mEndColor); + mThresholdAlpha = Themes.getAttrBoolean(mLauncher, R.attr.isMainColorDark) + ? THRESHOLD_ALPHA_DARK : THRESHOLD_ALPHA_LIGHT; + mRadius = mLauncher.getResources().getDimension(R.dimen.shelf_surface_radius); + mTopPadding = mLauncher.getResources().getDimension(R.dimen.shelf_surface_top_padding); + + mVerticalPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mVerticalPaint.setColor(ColorUtils.setAlphaComponent(mEndColor, 255)); + + // Just assume the easiest UI for now, until we have the proper layout information. + mDrawingFlatColor = true; + } + + @Override + protected void onProgressChanged() { + mProgressColor = ColorUtils.setAlphaComponent(mEndColor, + Math.round(DEACCEL_2.getInterpolation(mProgress) * Color.alpha(mEndColor))); + } + + @Override + public void draw(Canvas canvas, int width, int height) { + if (mDrawingFlatColor) { + if (mProgress > 0) { + canvas.drawColor(mProgressColor); + } + return; + } + + if (mVerticalPaint.getAlpha() == 0) { + return; + } else if (mDrawFactor <= 0) { + canvas.drawPaint(mVerticalPaint); + } else { + float top = (height - mMinSize) * mDrawFactor - mTopPadding; + canvas.drawRoundRect(0, top - mRadius, width, height + mRadius, + mRadius, mRadius, mVerticalPaint); + } + } + + public void reInitUi() { + DeviceProfile dp = mLauncher.getDeviceProfile(); + mDrawingFlatColor = dp.isVerticalBarLayout(); + + if (!mDrawingFlatColor) { + float swipeLength = OverviewState.getDefaultSwipeHeight(mLauncher); + mMoveThreshold = 1 - swipeLength / mLauncher.getAllAppsController().getShiftRange(); + mMinSize = dp.hotseatBarSizePx + dp.getInsets().bottom; + onVerticalProgress(mVerticalProgress); + } + invalidate(); + } + + public void onVerticalProgress(float progress) { + mVerticalProgress = progress; + if (mDrawingFlatColor) { + return; + } + + float drawFactor; + int alpha; + if (mVerticalProgress >= mMoveThreshold) { + drawFactor = 1; + alpha = mVerticalProgress >= 1 ? 0 : Math.round(mThresholdAlpha + * ACCEL_2.getInterpolation((1 - mVerticalProgress) / (1 - mMoveThreshold))); + } else if (mVerticalProgress <= 0) { + drawFactor = 0; + alpha = mEndAlpha; + } else { + drawFactor = mVerticalProgress / mMoveThreshold; + alpha = mEndAlpha - Math.round((mEndAlpha - mThresholdAlpha) * drawFactor); + } + alpha = Utilities.boundToRange(alpha, 0, 255); + if (alpha != mVerticalPaint.getAlpha() || drawFactor != mDrawFactor) { + mVerticalPaint.setAlpha(alpha); + mDrawFactor = drawFactor; + invalidate(); + } + } + +} diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java index aeaebea448..b1fa5e2b82 100644 --- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java +++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java @@ -38,7 +38,14 @@ public class LayoutUtils { private @interface MultiWindowStrategy {} public static void calculateLauncherTaskSize(Context context, DeviceProfile dp, Rect outRect) { - float extraSpace = dp.isVerticalBarLayout() ? 0 : dp.hotseatBarSizePx; + float extraSpace; + if (dp.isVerticalBarLayout()) { + extraSpace = 0; + } else { + Resources res = context.getResources(); + extraSpace = dp.hotseatBarSizePx + res.getDimension(R.dimen.shelf_surface_top_padding) + + res.getDimension(R.dimen.shelf_surface_radius); + } calculateTaskSize(context, dp, extraSpace, MULTI_WINDOW_STRATEGY_HALF_SCREEN, outRect); } diff --git a/res/values/styles.xml b/res/values/styles.xml index 38b5daedbf..8526d7c1da 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -28,7 +28,7 @@