Merging ub-launcher3-qt-dev, build 5619253
Test: Manual Bug:112282235 P3 Starting an app from Launcher very rarely takes > 10 sec Bug:121279417 P2 Why LauncherInstrumentation.WAIT_TIME_MS == 60000? Bug:123892607 P1 Test broken: WellbeingTests.testPauseAppFromAllApps Bug:123900446 P1 App to home animation should zoom into the app icon Bug:125844074 P2 Final UX and animations for Launcher DWB integration Bug:131360075 P1 [Gesture Nav] Polish/finish landscape Bug:131698989 P2 Add task callback for locked state change Bug:131741395 P2 Allow windows to scale/move past overview positioning Bug:131768436 P1 Bad placement of search bar Bug:131854153 P1 Lots of Cuttlefish (and not only) tests are broken Bug:131867841 P1 Changing display size does not update the grid Bug:132460627 P1 Unable to swipe to all apps screen on devices Bug:132687470 P1 Swiping home from forced landscape app creates cutoff task thumbnail Bug:132756514 P1 Sometimes (when quick switching?) user gets stuck in full-screen recents view Bug:132900132 P1 Apparently, tests start running while provisioning is still in progress Bug:132917885 P1 Reduce swipe-up gesture region height in landscape Bug:132975416 P1 Flake in NexusPredictionAppTracker.getAppPredictionContextExtras Bug:132993129 P1 If predictions disabled, app predictions loading bar appears briefly on device restart Bug:133113732 P1 [B1/C1][QT][CTS_Verifier_9.0_r1]Device Owner Tests-LockTask UI-Enable Overview button failure Bug:133167096 P1 It is way too easy to dismiss apps from the lock screen Bug:133651528 P1 [QT]"Pixel Launcher isn't responding" dialog pop up ,after DUT restored. Bug:133765434 P1 [Flaky test] Launching task didn't open a new window Bug:133765491 P1 App docked in split screen flickers with emptiness observed while rotating the device Bug:133783088 P1 Footer showing up on all overview task snapshots even with no items showing. Bug:133867119 P2 Lab-only flake: want to switch from workspace to all apps; Swipe failed to receive an event for the swipe end Bug:64712476 P3 Import translations for dev branches Change-Id: Ib4bcefdbb4027992e75e2742d72f199e13467875
This commit is contained in:
commit
0ef6fe00b0
|
@ -25,7 +25,7 @@ android_library {
|
|||
"tests/tapl/**/*.java",
|
||||
"src/com/android/launcher3/util/SecureSettingsObserver.java",
|
||||
"src/com/android/launcher3/ResourceUtils.java",
|
||||
"src/com/android/launcher3/TestProtocol.java",
|
||||
"src/com/android/launcher3/testing/TestProtocol.java",
|
||||
],
|
||||
manifest: "tests/tapl/AndroidManifest.xml",
|
||||
platform_apis: true,
|
||||
|
|
|
@ -176,5 +176,12 @@
|
|||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<provider
|
||||
android:name="com.android.launcher3.testing.TestInformationProvider"
|
||||
android:authorities="${packageName}.TestInfo"
|
||||
android:readPermission="android.permission.WRITE_SECURE_SETTINGS"
|
||||
android:writePermission="android.permission.WRITE_SECURE_SETTINGS"
|
||||
android:exported="true"
|
||||
android:enabled="false" />
|
||||
</application>
|
||||
</manifest>
|
||||
|
|
10
OWNERS
10
OWNERS
|
@ -2,13 +2,11 @@
|
|||
# gnl-eng@google.com (Googlers only)
|
||||
|
||||
# People who can approve changes for submission
|
||||
#
|
||||
|
||||
adamcohen@google.com
|
||||
hyunyoungs@google.com
|
||||
mrcasey@google.com
|
||||
sunnygoyal@google.com
|
||||
twickham@google.com
|
||||
winsonc@google.com
|
||||
|
||||
# Source of truth of this directory is actually in launcher team's
|
||||
# unbundled branch ub-launcher3-[release variant] (e.g., master, edmonton).
|
||||
# Pls try to wait for one of the owner's review if you have to force
|
||||
# submit (e.g., for large refactor, breakage, etc) as we may want to
|
||||
# cherry pick the change to our active developmental branch.
|
||||
|
|
|
@ -73,14 +73,6 @@
|
|||
</intent-filter>
|
||||
</provider>
|
||||
|
||||
<provider
|
||||
android:name="com.android.quickstep.TestInformationProvider"
|
||||
android:authorities="${packageName}.TestInfo"
|
||||
android:readPermission="android.permission.WRITE_SECURE_SETTINGS"
|
||||
android:writePermission="android.permission.WRITE_SECURE_SETTINGS"
|
||||
android:exported="true">
|
||||
</provider>
|
||||
|
||||
<service
|
||||
android:name="com.android.launcher3.uioverrides.dynamicui.WallpaperManagerCompatVL$ColorExtractionService"
|
||||
tools:node="remove" />
|
||||
|
@ -92,6 +84,11 @@
|
|||
android:clearTaskOnLaunch="true"
|
||||
android:exported="false" />
|
||||
|
||||
<activity android:name="com.android.quickstep.LockScreenRecentsActivity"
|
||||
android:theme="@android:style/Theme.NoDisplay"
|
||||
android:showOnLockScreen="true"
|
||||
android:directBootAware="true" />
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginLeft="20dp"
|
||||
android:layout_marginRight="20dp"
|
||||
android:indeterminate="true"
|
||||
android:indeterminateOnly="true"
|
||||
android:indeterminateTint="?workspaceTextColor" />
|
|
@ -27,4 +27,5 @@
|
|||
<!-- Swipe up to home related -->
|
||||
<dimen name="swipe_up_fling_min_visible_change">18dp</dimen>
|
||||
<dimen name="swipe_up_y_overshoot">10dp</dimen>
|
||||
<dimen name="swipe_up_max_workspace_trans_y">-80dp</dimen>
|
||||
</resources>
|
|
@ -56,7 +56,7 @@ public class PredictionAppTracker extends AppLaunchTracker {
|
|||
private static final int MSG_LAUNCH = 2;
|
||||
private static final int MSG_PREDICT = 3;
|
||||
|
||||
private final Context mContext;
|
||||
protected final Context mContext;
|
||||
private final Handler mMessageHandler;
|
||||
|
||||
// Accessed only on worker thread
|
||||
|
|
|
@ -28,7 +28,6 @@ import android.os.Build;
|
|||
import android.util.AttributeSet;
|
||||
import android.util.IntProperty;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.animation.Interpolator;
|
||||
import android.widget.LinearLayout;
|
||||
|
@ -115,8 +114,6 @@ public class PredictionRowView extends LinearLayout implements
|
|||
private final AnimatedFloat mOverviewScrollFactor =
|
||||
new AnimatedFloat(this::updateTranslationAndAlpha);
|
||||
|
||||
private View mLoadingProgress;
|
||||
|
||||
private boolean mPredictionsEnabled = false;
|
||||
|
||||
public PredictionRowView(@NonNull Context context) {
|
||||
|
@ -165,7 +162,6 @@ public class PredictionRowView extends LinearLayout implements
|
|||
|
||||
public void setup(FloatingHeaderView parent, FloatingHeaderRow[] rows, boolean tabsHidden) {
|
||||
mParent = parent;
|
||||
setPredictionsEnabled(mPredictionUiStateManager.arePredictionsEnabled());
|
||||
}
|
||||
|
||||
private void setPredictionsEnabled(boolean predictionsEnabled) {
|
||||
|
@ -205,7 +201,7 @@ public class PredictionRowView extends LinearLayout implements
|
|||
|
||||
@Override
|
||||
public boolean hasVisibleContent() {
|
||||
return mPredictionUiStateManager.arePredictionsEnabled();
|
||||
return mPredictionsEnabled;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -241,9 +237,6 @@ public class PredictionRowView extends LinearLayout implements
|
|||
}
|
||||
|
||||
private void applyPredictionApps() {
|
||||
if (mLoadingProgress != null) {
|
||||
removeView(mLoadingProgress);
|
||||
}
|
||||
if (!mPredictionsEnabled) {
|
||||
mParent.onHeightUpdated();
|
||||
return;
|
||||
|
@ -290,15 +283,8 @@ public class PredictionRowView extends LinearLayout implements
|
|||
}
|
||||
|
||||
if (predictionCount == 0) {
|
||||
if (mLoadingProgress == null) {
|
||||
mLoadingProgress = LayoutInflater.from(getContext())
|
||||
.inflate(R.layout.prediction_load_progress, this, false);
|
||||
}
|
||||
addView(mLoadingProgress);
|
||||
} else {
|
||||
mLoadingProgress = null;
|
||||
setPredictionsEnabled(false);
|
||||
}
|
||||
|
||||
mParent.onHeightUpdated();
|
||||
}
|
||||
|
||||
|
@ -342,11 +328,8 @@ public class PredictionRowView extends LinearLayout implements
|
|||
public void setTextAlpha(int alpha) {
|
||||
mIconCurrentTextAlpha = alpha;
|
||||
int iconColor = setColorAlphaBound(mIconTextColor, mIconCurrentTextAlpha);
|
||||
|
||||
if (mLoadingProgress == null) {
|
||||
for (int i = 0; i < getChildCount(); i++) {
|
||||
((BubbleTextView) getChildAt(i)).setTextColor(iconColor);
|
||||
}
|
||||
for (int i = 0; i < getChildCount(); i++) {
|
||||
((BubbleTextView) getChildAt(i)).setTextColor(iconColor);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@ import android.app.prediction.AppPredictor;
|
|||
import android.app.prediction.AppTarget;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
|
||||
|
||||
import com.android.launcher3.AppInfo;
|
||||
|
@ -63,7 +62,6 @@ public class PredictionUiStateManager implements OnGlobalLayoutListener, ItemInf
|
|||
OnIDPChangeListener, OnUpdateListener {
|
||||
|
||||
public static final String LAST_PREDICTION_ENABLED_STATE = "last_prediction_enabled_state";
|
||||
private static final long INITIAL_CALLBACK_WAIT_TIMEOUT_MS = 5000;
|
||||
|
||||
// TODO (b/129421797): Update the client constants
|
||||
public enum Client {
|
||||
|
@ -110,13 +108,8 @@ public class PredictionUiStateManager implements OnGlobalLayoutListener, ItemInf
|
|||
for (int i = 0; i < mPredictionServicePredictions.length; i++) {
|
||||
mPredictionServicePredictions[i] = Collections.emptyList();
|
||||
}
|
||||
|
||||
mGettingValidPredictionResults = Utilities.getDevicePrefs(context)
|
||||
.getBoolean(LAST_PREDICTION_ENABLED_STATE, true);
|
||||
if (mGettingValidPredictionResults) {
|
||||
new Handler().postDelayed(
|
||||
this::updatePredictionStateAfterCallback, INITIAL_CALLBACK_WAIT_TIMEOUT_MS);
|
||||
}
|
||||
|
||||
// Call this last
|
||||
mCurrentState = parseLastState();
|
||||
|
@ -293,10 +286,6 @@ public class PredictionUiStateManager implements OnGlobalLayoutListener, ItemInf
|
|||
dispatchOnChange(false);
|
||||
}
|
||||
|
||||
public boolean arePredictionsEnabled() {
|
||||
return mCurrentState.isEnabled;
|
||||
}
|
||||
|
||||
private boolean canApplyPredictions(PredictionState newState) {
|
||||
if (mAppsView == null) {
|
||||
// If there is no apps view, no need to schedule.
|
||||
|
|
|
@ -22,6 +22,7 @@ import static com.android.launcher3.LauncherState.OVERVIEW_PEEK;
|
|||
import static com.android.launcher3.LauncherStateManager.ANIM_ALL;
|
||||
import static com.android.launcher3.LauncherStateManager.ATOMIC_OVERVIEW_PEEK_COMPONENT;
|
||||
import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
|
@ -34,8 +35,10 @@ import com.android.launcher3.Launcher;
|
|||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.anim.AnimatorSetBuilder;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
|
||||
import com.android.quickstep.OverviewInteractionState;
|
||||
import com.android.quickstep.util.MotionPauseDetector;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
|
||||
/**
|
||||
* Touch controller which handles swipe and hold to go to Overview
|
||||
|
@ -99,7 +102,8 @@ public class FlingAndHoldTouchController extends PortraitStatesTouchController {
|
|||
* having it as part of the existing animation to the target state.
|
||||
*/
|
||||
private boolean handlingOverviewAnim() {
|
||||
return mStartState == NORMAL;
|
||||
int stateFlags = OverviewInteractionState.INSTANCE.get(mLauncher).getSystemUiStateFlags();
|
||||
return mStartState == NORMAL && (stateFlags & SYSUI_STATE_OVERVIEW_DISABLED) == 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -30,6 +30,7 @@ import static com.android.launcher3.anim.Interpolators.INSTANT;
|
|||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
import static com.android.launcher3.util.SystemUiController.UI_STATE_OVERVIEW;
|
||||
import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
|
||||
|
||||
import android.view.MotionEvent;
|
||||
|
||||
|
@ -44,10 +45,12 @@ import com.android.launcher3.touch.AbstractStateChangeTouchController;
|
|||
import com.android.launcher3.touch.SwipeDetector;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction;
|
||||
import com.android.quickstep.OverviewInteractionState;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
import com.android.quickstep.views.TaskView;
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
|
||||
/**
|
||||
* Handles quick switching to a recent task from the home screen.
|
||||
|
@ -80,6 +83,10 @@ public class QuickSwitchTouchController extends AbstractStateChangeTouchControll
|
|||
|
||||
@Override
|
||||
protected LauncherState getTargetState(LauncherState fromState, boolean isDragTowardPositive) {
|
||||
int stateFlags = OverviewInteractionState.INSTANCE.get(mLauncher).getSystemUiStateFlags();
|
||||
if ((stateFlags & SYSUI_STATE_OVERVIEW_DISABLED) != 0) {
|
||||
return NORMAL;
|
||||
}
|
||||
return isDragTowardPositive ? QUICK_SWITCH : NORMAL;
|
||||
}
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ import android.animation.Animator;
|
|||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.TimeInterpolator;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
|
@ -56,6 +57,7 @@ import com.android.launcher3.userevent.nano.LauncherLogProto;
|
|||
import com.android.launcher3.views.FloatingIconView;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.quickstep.util.LayoutUtils;
|
||||
import com.android.quickstep.util.StaggeredWorkspaceAnim;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
import com.android.quickstep.views.TaskView;
|
||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||
|
@ -68,6 +70,8 @@ import java.util.function.Consumer;
|
|||
*/
|
||||
public final class LauncherActivityControllerHelper implements ActivityControlHelper<Launcher> {
|
||||
|
||||
private Runnable mAdjustInterpolatorsRunnable;
|
||||
|
||||
@Override
|
||||
public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) {
|
||||
LayoutUtils.calculateLauncherTaskSize(context, dp, outRect);
|
||||
|
@ -148,8 +152,21 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe
|
|||
@NonNull
|
||||
@Override
|
||||
public AnimatorPlaybackController createActivityAnimationToHome() {
|
||||
// Return an empty APC here since we have an non-user controlled animation to home.
|
||||
long accuracy = 2 * Math.max(dp.widthPx, dp.heightPx);
|
||||
return activity.getStateManager().createAnimationToNewWorkspace(NORMAL, accuracy);
|
||||
AnimatorSet as = new AnimatorSet();
|
||||
as.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
activity.getStateManager().goToState(NORMAL, false);
|
||||
}
|
||||
});
|
||||
return AnimatorPlaybackController.wrap(as, accuracy);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playAtomicAnimation(float velocity) {
|
||||
new StaggeredWorkspaceAnim(activity, workspaceView, velocity).start();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -193,6 +210,13 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void adjustActivityControllerInterpolators() {
|
||||
if (mAdjustInterpolatorsRunnable != null) {
|
||||
mAdjustInterpolatorsRunnable.run();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionCancelled() {
|
||||
activity.getStateManager().goToState(startState, false /* animate */);
|
||||
|
@ -275,6 +299,7 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe
|
|||
playScaleDownAnim(anim, activity, fromState, endState);
|
||||
|
||||
anim.setDuration(transitionLength * 2);
|
||||
anim.setInterpolator(LINEAR);
|
||||
AnimatorPlaybackController controller =
|
||||
AnimatorPlaybackController.wrap(anim, transitionLength * 2);
|
||||
activity.getStateManager().setCurrentUserControlledAnimation(controller);
|
||||
|
@ -291,7 +316,6 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe
|
|||
Animator shiftAnim = new SpringObjectAnimator<>(activity.getAllAppsController(),
|
||||
"allAppsSpringFromACH", activity.getAllAppsController().getShiftRange(),
|
||||
SPRING_DAMPING_RATIO, SPRING_STIFFNESS, progressValues);
|
||||
shiftAnim.setInterpolator(LINEAR);
|
||||
return shiftAnim;
|
||||
}
|
||||
|
||||
|
@ -310,19 +334,37 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe
|
|||
= fromState.getOverviewScaleAndTranslation(launcher);
|
||||
LauncherState.ScaleAndTranslation endScaleAndTranslation
|
||||
= endState.getOverviewScaleAndTranslation(launcher);
|
||||
float fromTranslationY = fromScaleAndTranslation.translationY;
|
||||
float endTranslationY = endScaleAndTranslation.translationY;
|
||||
float fromFullscreenProgress = fromState.getOverviewFullscreenProgress();
|
||||
float endFullscreenProgress = endState.getOverviewFullscreenProgress();
|
||||
|
||||
Animator scale = ObjectAnimator.ofFloat(recentsView, SCALE_PROPERTY,
|
||||
fromScaleAndTranslation.scale, endScaleAndTranslation.scale);
|
||||
Animator translateY = ObjectAnimator.ofFloat(recentsView, TRANSLATION_Y,
|
||||
fromScaleAndTranslation.translationY, endScaleAndTranslation.translationY);
|
||||
fromTranslationY, endTranslationY);
|
||||
Animator applyFullscreenProgress = ObjectAnimator.ofFloat(recentsView,
|
||||
RecentsView.FULLSCREEN_PROGRESS, fromFullscreenProgress, endFullscreenProgress);
|
||||
scale.setInterpolator(LINEAR);
|
||||
translateY.setInterpolator(LINEAR);
|
||||
applyFullscreenProgress.setInterpolator(LINEAR);
|
||||
anim.playTogether(scale, translateY, applyFullscreenProgress);
|
||||
|
||||
mAdjustInterpolatorsRunnable = () -> {
|
||||
// Adjust the translateY interpolator to account for the running task's top inset.
|
||||
// When progress <= 1, this is handled by each task view as they set their fullscreen
|
||||
// progress. However, once we go to progress > 1, fullscreen progress stays at 0, so
|
||||
// recents as a whole needs to translate further to keep up with the app window.
|
||||
TaskView runningTaskView = recentsView.getRunningTaskView();
|
||||
if (runningTaskView == null) {
|
||||
runningTaskView = recentsView.getTaskViewAt(recentsView.getCurrentPage());
|
||||
}
|
||||
TimeInterpolator oldInterpolator = translateY.getInterpolator();
|
||||
Rect fallbackInsets = launcher.getDeviceProfile().getInsets();
|
||||
float extraTranslationY = runningTaskView.getThumbnail().getInsets(fallbackInsets).top;
|
||||
float normalizedTranslationY = extraTranslationY / (fromTranslationY - endTranslationY);
|
||||
translateY.setInterpolator(t -> {
|
||||
float newT = oldInterpolator.getInterpolation(t);
|
||||
return newT <= 1f ? newT : newT + normalizedTranslationY * (newT - 1);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* Copyright (C) 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.android.quickstep;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
|
||||
/**
|
||||
* Empty activity to start a recents transition
|
||||
*/
|
||||
public class LockScreenRecentsActivity extends Activity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
finish();
|
||||
}
|
||||
}
|
|
@ -22,8 +22,11 @@ import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_INP
|
|||
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_CLICKABLE;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.ActivityManager;
|
||||
|
@ -79,6 +82,7 @@ import com.android.systemui.shared.system.ActivityManagerWrapper;
|
|||
import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver;
|
||||
import com.android.systemui.shared.system.InputConsumerController;
|
||||
import com.android.systemui.shared.system.InputMonitorCompat;
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
|
@ -197,6 +201,8 @@ public class TouchInteractionService extends Service implements
|
|||
|
||||
public void onSystemUiStateChanged(int stateFlags) {
|
||||
mSystemUiStateFlags = stateFlags;
|
||||
mOverviewInteractionState.setSystemUiStateFlags(stateFlags);
|
||||
mOverviewComponentObserver.onSystemUiStateChanged(stateFlags);
|
||||
}
|
||||
|
||||
/** Deprecated methods **/
|
||||
|
@ -331,16 +337,8 @@ public class TouchInteractionService extends Service implements
|
|||
defaultDisplay.getRealSize(realSize);
|
||||
mSwipeTouchRegion.set(0, 0, realSize.x, realSize.y);
|
||||
if (mMode == Mode.NO_BUTTON) {
|
||||
switch (defaultDisplay.getRotation()) {
|
||||
case Surface.ROTATION_90:
|
||||
case Surface.ROTATION_270:
|
||||
mSwipeTouchRegion.top = mSwipeTouchRegion.bottom - getNavbarSize(
|
||||
ResourceUtils.NAVBAR_LANDSCAPE_BOTTOM_SIZE);
|
||||
break;
|
||||
default:
|
||||
mSwipeTouchRegion.top = mSwipeTouchRegion.bottom - getNavbarSize(
|
||||
ResourceUtils.NAVBAR_PORTRAIT_BOTTOM_SIZE);
|
||||
}
|
||||
mSwipeTouchRegion.top = mSwipeTouchRegion.bottom -
|
||||
getNavbarSize(ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE);
|
||||
} else {
|
||||
switch (defaultDisplay.getRotation()) {
|
||||
case Surface.ROTATION_90:
|
||||
|
@ -353,7 +351,7 @@ public class TouchInteractionService extends Service implements
|
|||
break;
|
||||
default:
|
||||
mSwipeTouchRegion.top = mSwipeTouchRegion.bottom
|
||||
- getNavbarSize(ResourceUtils.NAVBAR_PORTRAIT_BOTTOM_SIZE);
|
||||
- getNavbarSize(ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -472,22 +470,19 @@ public class TouchInteractionService extends Service implements
|
|||
|
||||
private boolean validSystemUiFlags() {
|
||||
return (mSystemUiStateFlags & SYSUI_STATE_NAV_BAR_HIDDEN) == 0
|
||||
&& (mSystemUiStateFlags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) == 0;
|
||||
}
|
||||
|
||||
private boolean topTaskLocked() {
|
||||
return ActivityManagerWrapper.getInstance().isLockToAppActive();
|
||||
&& (mSystemUiStateFlags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) == 0
|
||||
&& ((mSystemUiStateFlags & SYSUI_STATE_HOME_DISABLED) == 0
|
||||
|| (mSystemUiStateFlags & SYSUI_STATE_OVERVIEW_DISABLED) == 0);
|
||||
}
|
||||
|
||||
private InputConsumer newConsumer(boolean useSharedState, MotionEvent event) {
|
||||
boolean topTaskLocked = topTaskLocked();
|
||||
boolean isInValidSystemUiState = validSystemUiFlags() && !topTaskLocked;
|
||||
boolean isInValidSystemUiState = validSystemUiFlags();
|
||||
|
||||
if (!mIsUserUnlocked) {
|
||||
if (isInValidSystemUiState) {
|
||||
// This handles apps launched in direct boot mode (e.g. dialer) as well as apps
|
||||
// launched while device is locked even after exiting direct boot mode (e.g. camera).
|
||||
return new DeviceLockedInputConsumer(this);
|
||||
return createDeviceLockedInputConsumer(mAM.getRunningTask(0));
|
||||
} else {
|
||||
return InputConsumer.NO_OP;
|
||||
}
|
||||
|
@ -498,13 +493,15 @@ public class TouchInteractionService extends Service implements
|
|||
if (mMode == Mode.NO_BUTTON) {
|
||||
final ActivityControlHelper activityControl =
|
||||
mOverviewComponentObserver.getActivityControlHelper();
|
||||
if (mAssistantAvailable && !topTaskLocked
|
||||
&& AssistantTouchConsumer.withinTouchRegion(this, event)) {
|
||||
if (mAssistantAvailable
|
||||
&& !QuickStepContract.isAssistantGestureDisabled(mSystemUiStateFlags)
|
||||
&& AssistantTouchConsumer.withinTouchRegion(this, event)
|
||||
&& !ActivityManagerWrapper.getInstance().isLockToAppActive()) {
|
||||
base = new AssistantTouchConsumer(this, mISystemUiProxy, activityControl, base,
|
||||
mInputMonitorCompat);
|
||||
}
|
||||
|
||||
if (ActivityManagerWrapper.getInstance().isScreenPinningActive()) {
|
||||
if ((mSystemUiStateFlags & SYSUI_STATE_SCREEN_PINNING) != 0) {
|
||||
// Note: we only allow accessibility to wrap this, and it replaces the previous
|
||||
// base input consumer (which should be NO_OP anyway since topTaskLocked == true).
|
||||
base = new ScreenPinnedInputConsumer(this, mISystemUiProxy, activityControl);
|
||||
|
@ -520,16 +517,15 @@ public class TouchInteractionService extends Service implements
|
|||
}
|
||||
|
||||
private InputConsumer newBaseConsumer(boolean useSharedState, MotionEvent event) {
|
||||
if (mKM.isDeviceLocked()) {
|
||||
// This handles apps launched in direct boot mode (e.g. dialer) as well as apps launched
|
||||
// while device is locked even after exiting direct boot mode (e.g. camera).
|
||||
return new DeviceLockedInputConsumer(this);
|
||||
}
|
||||
|
||||
final RunningTaskInfo runningTaskInfo = mAM.getRunningTask(0);
|
||||
if (!useSharedState) {
|
||||
mSwipeSharedState.clearAllState();
|
||||
}
|
||||
if (mKM.isDeviceLocked()) {
|
||||
// This handles apps launched in direct boot mode (e.g. dialer) as well as apps launched
|
||||
// while device is locked even after exiting direct boot mode (e.g. camera).
|
||||
return createDeviceLockedInputConsumer(runningTaskInfo);
|
||||
}
|
||||
|
||||
final ActivityControlHelper activityControl =
|
||||
mOverviewComponentObserver.getActivityControlHelper();
|
||||
|
@ -567,6 +563,15 @@ public class TouchInteractionService extends Service implements
|
|||
mSwipeSharedState, mInputMonitorCompat, mSwipeTouchRegion);
|
||||
}
|
||||
|
||||
private InputConsumer createDeviceLockedInputConsumer(RunningTaskInfo taskInfo) {
|
||||
if (mMode == Mode.NO_BUTTON && taskInfo != null) {
|
||||
return new DeviceLockedInputConsumer(this, mSwipeSharedState, mInputMonitorCompat,
|
||||
mSwipeTouchRegion, taskInfo.taskId);
|
||||
} else {
|
||||
return InputConsumer.NO_OP;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* To be called by the consumer when it's no longer active.
|
||||
*/
|
||||
|
@ -593,17 +598,14 @@ public class TouchInteractionService extends Service implements
|
|||
// Dump everything
|
||||
pw.println("TouchState:");
|
||||
pw.println(" navMode=" + mMode);
|
||||
pw.println(" validSystemUiFlags=" + validSystemUiFlags()
|
||||
+ " flags=" + mSystemUiStateFlags);
|
||||
pw.println(" topTaskLocked=" + topTaskLocked());
|
||||
pw.println(" validSystemUiFlags=" + validSystemUiFlags());
|
||||
pw.println(" systemUiFlags=" + mSystemUiStateFlags);
|
||||
pw.println(" systemUiFlagsDesc="
|
||||
+ QuickStepContract.getSystemUiStateString(mSystemUiStateFlags));
|
||||
pw.println(" isDeviceLocked=" + mKM.isDeviceLocked());
|
||||
pw.println(" screenPinned=" +
|
||||
ActivityManagerWrapper.getInstance().isScreenPinningActive());
|
||||
pw.println(" assistantAvailable=" + mAssistantAvailable);
|
||||
pw.println(" a11yClickable="
|
||||
+ ((mSystemUiStateFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0));
|
||||
pw.println(" a11yLongClickable="
|
||||
+ ((mSystemUiStateFlags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0));
|
||||
pw.println(" assistantDisabled="
|
||||
+ QuickStepContract.isAssistantGestureDisabled(mSystemUiStateFlags));
|
||||
pw.println(" resumed="
|
||||
+ mOverviewComponentObserver.getActivityControlHelper().isResumed());
|
||||
pw.println(" useSharedState=" + mConsumer.useSharedSwipeState());
|
||||
|
|
|
@ -39,6 +39,7 @@ import static com.android.quickstep.WindowTransformSwipeHandler.GestureEndTarget
|
|||
import static com.android.quickstep.WindowTransformSwipeHandler.GestureEndTarget.NEW_TASK;
|
||||
import static com.android.quickstep.WindowTransformSwipeHandler.GestureEndTarget.RECENTS;
|
||||
import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorSet;
|
||||
|
@ -105,6 +106,7 @@ import com.android.quickstep.views.TaskView;
|
|||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||
import com.android.systemui.shared.system.InputConsumerController;
|
||||
import com.android.systemui.shared.system.LatencyTrackerCompat;
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
||||
import com.android.systemui.shared.system.WindowCallbacksCompat;
|
||||
|
@ -170,7 +172,8 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_LAUNCHER_STARTED;
|
||||
|
||||
public enum GestureEndTarget {
|
||||
HOME(1, STATE_SCALED_CONTROLLER_HOME, true, false, ContainerType.WORKSPACE, false),
|
||||
HOME(1, STATE_SCALED_CONTROLLER_HOME | STATE_CAPTURE_SCREENSHOT, true, false,
|
||||
ContainerType.WORKSPACE, false),
|
||||
|
||||
RECENTS(1, STATE_SCALED_CONTROLLER_RECENTS | STATE_CAPTURE_SCREENSHOT
|
||||
| STATE_SCREENSHOT_VIEW_SHOWN, true, false, ContainerType.TASKSWITCHER, true),
|
||||
|
@ -216,6 +219,12 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
private static final long SHELF_ANIM_DURATION = 120;
|
||||
public static final long RECENTS_ATTACH_DURATION = 300;
|
||||
|
||||
// Start resisting when swiping past this factor of mTransitionDragLength.
|
||||
private static final float DRAG_LENGTH_FACTOR_START_PULLBACK = 1.4f;
|
||||
// This is how far down we can scale down, where 0f is full screen and 1f is recents.
|
||||
private static final float DRAG_LENGTH_FACTOR_MAX_PULLBACK = 1.8f;
|
||||
private static final Interpolator PULLBACK_INTERPOLATOR = DEACCEL;
|
||||
|
||||
/**
|
||||
* Used as the page index for logging when we return to the last task at the end of the gesture.
|
||||
*/
|
||||
|
@ -230,7 +239,10 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
private RunningWindowAnim mRunningWindowAnim;
|
||||
private boolean mIsShelfPeeking;
|
||||
private DeviceProfile mDp;
|
||||
// The distance needed to drag to reach the task size in recents.
|
||||
private int mTransitionDragLength;
|
||||
// How much further we can drag past recents, as a factor of mTransitionDragLength.
|
||||
private float mDragLengthFactor = 1;
|
||||
|
||||
// Shift in the range of [0, 1].
|
||||
// 0 => preview snapShot is completely visible, and hotseat is completely translated down
|
||||
|
@ -331,9 +343,8 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
| STATE_SCALED_CONTROLLER_RECENTS,
|
||||
this::finishCurrentTransitionToRecents);
|
||||
|
||||
mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_GESTURE_COMPLETED
|
||||
| STATE_SCALED_CONTROLLER_HOME | STATE_APP_CONTROLLER_RECEIVED
|
||||
| STATE_LAUNCHER_DRAWN,
|
||||
mStateCallback.addCallback(STATE_SCREENSHOT_CAPTURED | STATE_GESTURE_COMPLETED
|
||||
| STATE_SCALED_CONTROLLER_HOME,
|
||||
this::finishCurrentTransitionToHome);
|
||||
mStateCallback.addCallback(STATE_SCALED_CONTROLLER_HOME | STATE_CURRENT_TASK_FINISHED,
|
||||
this::reset);
|
||||
|
@ -375,6 +386,10 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
mTransitionDragLength = mActivityControlHelper.getSwipeUpDestinationAndLength(
|
||||
dp, mContext, tempRect);
|
||||
mClipAnimationHelper.updateTargetRect(tempRect);
|
||||
if (mMode == Mode.NO_BUTTON) {
|
||||
// We can drag all the way to the top of the screen.
|
||||
mDragLengthFactor = (float) dp.heightPx / mTransitionDragLength;
|
||||
}
|
||||
}
|
||||
|
||||
private long getFadeInDuration() {
|
||||
|
@ -546,11 +561,18 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
public void updateDisplacement(float displacement) {
|
||||
// We are moving in the negative x/y direction
|
||||
displacement = -displacement;
|
||||
if (displacement > mTransitionDragLength && mTransitionDragLength > 0) {
|
||||
mCurrentShift.updateValue(1);
|
||||
if (displacement > mTransitionDragLength * mDragLengthFactor && mTransitionDragLength > 0) {
|
||||
mCurrentShift.updateValue(mDragLengthFactor);
|
||||
} else {
|
||||
float translation = Math.max(displacement, 0);
|
||||
float shift = mTransitionDragLength == 0 ? 0 : translation / mTransitionDragLength;
|
||||
if (shift > DRAG_LENGTH_FACTOR_START_PULLBACK) {
|
||||
float pullbackProgress = Utilities.getProgress(shift,
|
||||
DRAG_LENGTH_FACTOR_START_PULLBACK, mDragLengthFactor);
|
||||
pullbackProgress = PULLBACK_INTERPOLATOR.getInterpolation(pullbackProgress);
|
||||
shift = DRAG_LENGTH_FACTOR_START_PULLBACK + pullbackProgress
|
||||
* (DRAG_LENGTH_FACTOR_MAX_PULLBACK - DRAG_LENGTH_FACTOR_START_PULLBACK);
|
||||
}
|
||||
mCurrentShift.updateValue(shift);
|
||||
}
|
||||
}
|
||||
|
@ -638,6 +660,8 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
|
||||
private void onAnimatorPlaybackControllerCreated(AnimatorPlaybackController anim) {
|
||||
mLauncherTransitionController = anim;
|
||||
mLauncherTransitionController.dispatchSetInterpolator(t -> t * mDragLengthFactor);
|
||||
mAnimationFactory.adjustActivityControllerInterpolators();
|
||||
mLauncherTransitionController.dispatchOnStart();
|
||||
updateLauncherTransitionProgress();
|
||||
}
|
||||
|
@ -690,7 +714,9 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
if (mGestureEndTarget == HOME) {
|
||||
return;
|
||||
}
|
||||
float progress = mCurrentShift.value;
|
||||
// Normalize the progress to 0 to 1, as the animation controller will clamp it to that
|
||||
// anyway. The controller mimics the drag length factor by applying it to its interpolators.
|
||||
float progress = mCurrentShift.value / mDragLengthFactor;
|
||||
mLauncherTransitionController.setPlayFraction(
|
||||
progress <= mShiftAtGestureStart || mShiftAtGestureStart >= 1
|
||||
? 0 : (progress - mShiftAtGestureStart) / (1 - mShiftAtGestureStart));
|
||||
|
@ -835,16 +861,9 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
}
|
||||
}
|
||||
|
||||
@UiThread
|
||||
private void handleNormalGestureEnd(float endVelocity, boolean isFling, PointF velocity,
|
||||
private GestureEndTarget calculateEndTarget(PointF velocity, float endVelocity, boolean isFling,
|
||||
boolean isCancel) {
|
||||
PointF velocityPxPerMs = new PointF(velocity.x / 1000, velocity.y / 1000);
|
||||
long duration = MAX_SWIPE_DURATION;
|
||||
float currentShift = mCurrentShift.value;
|
||||
final GestureEndTarget endTarget;
|
||||
float endShift;
|
||||
final float startShift;
|
||||
Interpolator interpolator = DEACCEL;
|
||||
final boolean goingToNewTask;
|
||||
if (mRecentsView != null) {
|
||||
if (!mRecentsAnimationWrapper.hasTargets()) {
|
||||
|
@ -859,7 +878,7 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
} else {
|
||||
goingToNewTask = false;
|
||||
}
|
||||
final boolean reachedOverviewThreshold = currentShift >= MIN_PROGRESS_FOR_OVERVIEW;
|
||||
final boolean reachedOverviewThreshold = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW;
|
||||
if (!isFling) {
|
||||
if (isCancel) {
|
||||
endTarget = LAST_TASK;
|
||||
|
@ -869,7 +888,7 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
} else if (goingToNewTask) {
|
||||
endTarget = NEW_TASK;
|
||||
} else {
|
||||
endTarget = currentShift < MIN_PROGRESS_FOR_OVERVIEW ? LAST_TASK : HOME;
|
||||
endTarget = !reachedOverviewThreshold ? LAST_TASK : HOME;
|
||||
}
|
||||
} else {
|
||||
endTarget = reachedOverviewThreshold && mGestureStarted
|
||||
|
@ -878,12 +897,6 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
? NEW_TASK
|
||||
: LAST_TASK;
|
||||
}
|
||||
endShift = endTarget.endShift;
|
||||
long expectedDuration = Math.abs(Math.round((endShift - currentShift)
|
||||
* MAX_SWIPE_DURATION * SWIPE_DURATION_MULTIPLIER));
|
||||
duration = Math.min(MAX_SWIPE_DURATION, expectedDuration);
|
||||
startShift = currentShift;
|
||||
interpolator = endTarget == RECENTS ? OVERSHOOT_1_2 : DEACCEL;
|
||||
} else {
|
||||
if (mMode == Mode.NO_BUTTON && endVelocity < 0 && !mIsShelfPeeking) {
|
||||
// If swiping at a diagonal, base end target on the faster velocity.
|
||||
|
@ -896,9 +909,36 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
} else {
|
||||
endTarget = goingToNewTask ? NEW_TASK : LAST_TASK;
|
||||
}
|
||||
endShift = endTarget.endShift;
|
||||
}
|
||||
|
||||
int stateFlags = OverviewInteractionState.INSTANCE.get(mActivity).getSystemUiStateFlags();
|
||||
if ((stateFlags & SYSUI_STATE_OVERVIEW_DISABLED) != 0
|
||||
&& (endTarget == RECENTS || endTarget == LAST_TASK)) {
|
||||
return LAST_TASK;
|
||||
}
|
||||
return endTarget;
|
||||
}
|
||||
|
||||
@UiThread
|
||||
private void handleNormalGestureEnd(float endVelocity, boolean isFling, PointF velocity,
|
||||
boolean isCancel) {
|
||||
PointF velocityPxPerMs = new PointF(velocity.x / 1000, velocity.y / 1000);
|
||||
long duration = MAX_SWIPE_DURATION;
|
||||
float currentShift = mCurrentShift.value;
|
||||
final GestureEndTarget endTarget = calculateEndTarget(velocity, endVelocity,
|
||||
isFling, isCancel);
|
||||
float endShift = endTarget.endShift;
|
||||
final float startShift;
|
||||
Interpolator interpolator = DEACCEL;
|
||||
if (!isFling) {
|
||||
long expectedDuration = Math.abs(Math.round((endShift - currentShift)
|
||||
* MAX_SWIPE_DURATION * SWIPE_DURATION_MULTIPLIER));
|
||||
duration = Math.min(MAX_SWIPE_DURATION, expectedDuration);
|
||||
startShift = currentShift;
|
||||
interpolator = endTarget == RECENTS ? OVERSHOOT_1_2 : DEACCEL;
|
||||
} else {
|
||||
startShift = Utilities.boundToRange(currentShift - velocityPxPerMs.y
|
||||
* SINGLE_FRAME_MS / mTransitionDragLength, 0, 1);
|
||||
* SINGLE_FRAME_MS / mTransitionDragLength, 0, mDragLengthFactor);
|
||||
float minFlingVelocity = mContext.getResources()
|
||||
.getDimension(R.dimen.quickstep_fling_min_velocity);
|
||||
if (Math.abs(endVelocity) > minFlingVelocity && mTransitionDragLength > 0) {
|
||||
|
@ -936,8 +976,10 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
} else if (endTarget == RECENTS) {
|
||||
mLiveTileOverlay.startIconAnimation();
|
||||
if (mRecentsView != null) {
|
||||
duration = Utilities.boundToRange(mRecentsView.getScroller().getDuration(),
|
||||
duration, MAX_SWIPE_DURATION);
|
||||
if (mRecentsView.getScroller().getDuration() > MAX_SWIPE_DURATION) {
|
||||
mRecentsView.snapToPage(mRecentsView.getNextPage(), (int) MAX_SWIPE_DURATION);
|
||||
}
|
||||
duration = Math.max(duration, mRecentsView.getScroller().getDuration());
|
||||
}
|
||||
if (mMode == Mode.NO_BUTTON) {
|
||||
setShelfState(ShelfAnimState.OVERVIEW, interpolator, duration);
|
||||
|
@ -1015,6 +1057,7 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
setStateOnUiThread(target.endState);
|
||||
}
|
||||
});
|
||||
homeAnimFactory.playAtomicAnimation(velocityPxPerMs.y);
|
||||
windowAnim.start(velocityPxPerMs);
|
||||
mRunningWindowAnim = RunningWindowAnim.wrap(windowAnim);
|
||||
mLauncherTransitionController = null;
|
||||
|
@ -1055,6 +1098,7 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
mLauncherTransitionController.getAnimationPlayer().end();
|
||||
} else {
|
||||
mLauncherTransitionController.dispatchSetInterpolator(adjustedInterpolator);
|
||||
mAnimationFactory.adjustActivityControllerInterpolators();
|
||||
mLauncherTransitionController.getAnimationPlayer().setDuration(duration);
|
||||
|
||||
if (QUICKSTEP_SPRINGS.get()) {
|
||||
|
@ -1091,12 +1135,10 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
// FolderIconView can be seen morphing into the icon shape.
|
||||
final float windowAlphaThreshold = isFloatingIconView ? 1f - SHAPE_PROGRESS_DURATION : 1f;
|
||||
anim.addOnUpdateListener((currentRect, progress) -> {
|
||||
float interpolatedProgress = Interpolators.ACCEL_1_5.getInterpolation(progress);
|
||||
|
||||
homeAnim.setPlayFraction(progress);
|
||||
|
||||
float windowAlpha = Utilities.mapToRange(interpolatedProgress, 0,
|
||||
windowAlphaThreshold, 1f, 0f, Interpolators.LINEAR);
|
||||
float windowAlpha = Math.max(0, Utilities.mapToRange(progress, 0,
|
||||
windowAlphaThreshold, 1f, 0f, Interpolators.LINEAR));
|
||||
mTransformParams.setProgress(progress)
|
||||
.setCurrentRectAndTargetAlpha(currentRect, windowAlpha);
|
||||
mClipAnimationHelper.applyTransform(targetSet, mTransformParams,
|
||||
|
@ -1251,8 +1293,15 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
if (mTaskSnapshot == null) {
|
||||
mTaskSnapshot = controller.screenshotTask(mRunningTaskId);
|
||||
}
|
||||
TaskView taskView = mRecentsView.updateThumbnail(mRunningTaskId, mTaskSnapshot);
|
||||
if (taskView != null) {
|
||||
final TaskView taskView;
|
||||
if (mGestureEndTarget == HOME) {
|
||||
// Capture the screenshot before finishing the transition to home to ensure it's
|
||||
// taken in the correct orientation, but no need to update the thumbnail.
|
||||
taskView = null;
|
||||
} else {
|
||||
taskView = mRecentsView.updateThumbnail(mRunningTaskId, mTaskSnapshot);
|
||||
}
|
||||
if (taskView != null && !mCanceled) {
|
||||
// Defer finishing the animation until the next launcher frame with the
|
||||
// new thumbnail
|
||||
finishTransitionPosted = new WindowCallbacksCompat(taskView) {
|
||||
|
@ -1262,6 +1311,13 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
|||
|
||||
@Override
|
||||
public void onPostDraw(Canvas canvas) {
|
||||
// If we were cancelled after this was attached, do not update
|
||||
// the state.
|
||||
if (mCanceled) {
|
||||
detach();
|
||||
return;
|
||||
}
|
||||
|
||||
if (mDeferFrameCount > 0) {
|
||||
mDeferFrameCount--;
|
||||
// Workaround, detach and reattach to invalidate the root node for
|
||||
|
|
|
@ -20,7 +20,6 @@ import android.content.Context;
|
|||
import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.WindowInsets;
|
||||
|
||||
import com.android.launcher3.BaseActivity;
|
||||
import com.android.launcher3.R;
|
||||
|
@ -71,7 +70,7 @@ public class RecentsRootView extends BaseDragLayer<RecentsActivity> {
|
|||
// Update device profile before notifying the children.
|
||||
mActivity.getDeviceProfile().updateInsets(insets);
|
||||
setInsets(insets);
|
||||
return true; // I'll take it from here
|
||||
return false; // Let children get the full insets
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -89,10 +88,4 @@ public class RecentsRootView extends BaseDragLayer<RecentsActivity> {
|
|||
mActivity.getDeviceProfile().updateInsets(mInsets);
|
||||
super.setInsets(mInsets);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WindowInsets dispatchApplyWindowInsets(WindowInsets insets) {
|
||||
updateTouchExcludeRegion(insets);
|
||||
return super.dispatchApplyWindowInsets(insets);
|
||||
}
|
||||
}
|
|
@ -15,26 +15,102 @@
|
|||
*/
|
||||
package com.android.quickstep.inputconsumers;
|
||||
|
||||
import static android.view.MotionEvent.ACTION_CANCEL;
|
||||
import static android.view.MotionEvent.ACTION_POINTER_DOWN;
|
||||
import static android.view.MotionEvent.ACTION_UP;
|
||||
|
||||
import static com.android.launcher3.Utilities.squaredHypot;
|
||||
import static com.android.launcher3.Utilities.squaredTouchSlop;
|
||||
import static com.android.quickstep.MultiStateCallback.DEBUG_STATES;
|
||||
import static com.android.quickstep.WindowTransformSwipeHandler.MIN_PROGRESS_FOR_OVERVIEW;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.VelocityTracker;
|
||||
import android.view.ViewConfiguration;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.quickstep.LockScreenRecentsActivity;
|
||||
import com.android.quickstep.MultiStateCallback;
|
||||
import com.android.quickstep.SwipeSharedState;
|
||||
import com.android.quickstep.util.ClipAnimationHelper;
|
||||
import com.android.quickstep.util.RecentsAnimationListenerSet;
|
||||
import com.android.quickstep.util.SwipeAnimationTargetSet;
|
||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||
import com.android.systemui.shared.system.BackgroundExecutor;
|
||||
import com.android.systemui.shared.system.InputMonitorCompat;
|
||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||
|
||||
/**
|
||||
* A dummy input consumer used when the device is still locked, e.g. from secure camera.
|
||||
*/
|
||||
public class DeviceLockedInputConsumer implements InputConsumer {
|
||||
public class DeviceLockedInputConsumer implements InputConsumer,
|
||||
SwipeAnimationTargetSet.SwipeAnimationListener {
|
||||
|
||||
private static final float SCALE_DOWN = 0.75f;
|
||||
|
||||
private static final String[] STATE_NAMES = DEBUG_STATES ? new String[2] : null;
|
||||
private static int getFlagForIndex(int index, String name) {
|
||||
if (DEBUG_STATES) {
|
||||
STATE_NAMES[index] = name;
|
||||
}
|
||||
return 1 << index;
|
||||
}
|
||||
|
||||
private static final int STATE_TARGET_RECEIVED =
|
||||
getFlagForIndex(0, "STATE_TARGET_RECEIVED");
|
||||
private static final int STATE_HANDLER_INVALIDATED =
|
||||
getFlagForIndex(1, "STATE_HANDLER_INVALIDATED");
|
||||
|
||||
private final Context mContext;
|
||||
private final float mTouchSlopSquared;
|
||||
private final PointF mTouchDown = new PointF();
|
||||
private final SwipeSharedState mSwipeSharedState;
|
||||
private final InputMonitorCompat mInputMonitorCompat;
|
||||
|
||||
public DeviceLockedInputConsumer(Context context) {
|
||||
private final PointF mTouchDown = new PointF();
|
||||
private final ClipAnimationHelper mClipAnimationHelper;
|
||||
private final ClipAnimationHelper.TransformParams mTransformParams;
|
||||
private final Point mDisplaySize;
|
||||
private final MultiStateCallback mStateCallback;
|
||||
private final RectF mSwipeTouchRegion;
|
||||
public final int mRunningTaskId;
|
||||
|
||||
private VelocityTracker mVelocityTracker;
|
||||
private float mProgress;
|
||||
|
||||
private boolean mThresholdCrossed = false;
|
||||
|
||||
private SwipeAnimationTargetSet mTargetSet;
|
||||
|
||||
public DeviceLockedInputConsumer(Context context, SwipeSharedState swipeSharedState,
|
||||
InputMonitorCompat inputMonitorCompat, RectF swipeTouchRegion, int runningTaskId) {
|
||||
mContext = context;
|
||||
mTouchSlopSquared = squaredTouchSlop(context);
|
||||
mSwipeSharedState = swipeSharedState;
|
||||
mClipAnimationHelper = new ClipAnimationHelper(context);
|
||||
mTransformParams = new ClipAnimationHelper.TransformParams();
|
||||
mInputMonitorCompat = inputMonitorCompat;
|
||||
mSwipeTouchRegion = swipeTouchRegion;
|
||||
mRunningTaskId = runningTaskId;
|
||||
|
||||
// Do not use DeviceProfile as the user data might be locked
|
||||
mDisplaySize = new Point();
|
||||
context.getSystemService(WindowManager.class).getDefaultDisplay().getRealSize(mDisplaySize);
|
||||
|
||||
// Init states
|
||||
mStateCallback = new MultiStateCallback(STATE_NAMES);
|
||||
mStateCallback.addCallback(STATE_TARGET_RECEIVED | STATE_HANDLER_INVALIDATED,
|
||||
this::endRemoteAnimation);
|
||||
|
||||
mVelocityTracker = VelocityTracker.obtain();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -44,17 +120,137 @@ public class DeviceLockedInputConsumer implements InputConsumer {
|
|||
|
||||
@Override
|
||||
public void onMotionEvent(MotionEvent ev) {
|
||||
if (mVelocityTracker == null) {
|
||||
return;
|
||||
}
|
||||
mVelocityTracker.addMovement(ev);
|
||||
|
||||
float x = ev.getX();
|
||||
float y = ev.getY();
|
||||
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
mTouchDown.set(x, y);
|
||||
} else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
|
||||
if (squaredHypot(x - mTouchDown.x, y - mTouchDown.y) > mTouchSlopSquared) {
|
||||
switch (ev.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
mTouchDown.set(x, y);
|
||||
break;
|
||||
case ACTION_POINTER_DOWN: {
|
||||
if (!mThresholdCrossed) {
|
||||
// Cancel interaction in case of multi-touch interaction
|
||||
int ptrIdx = ev.getActionIndex();
|
||||
if (!mSwipeTouchRegion.contains(ev.getX(ptrIdx), ev.getY(ptrIdx))) {
|
||||
int action = ev.getAction();
|
||||
ev.setAction(ACTION_CANCEL);
|
||||
finishTouchTracking(ev);
|
||||
ev.setAction(action);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MotionEvent.ACTION_MOVE: {
|
||||
if (!mThresholdCrossed) {
|
||||
if (squaredHypot(x - mTouchDown.x, y - mTouchDown.y) > mTouchSlopSquared) {
|
||||
startRecentsTransition();
|
||||
}
|
||||
} else {
|
||||
float dy = Math.max(mTouchDown.y - y, 0);
|
||||
mProgress = dy / mDisplaySize.y;
|
||||
mTransformParams.setProgress(mProgress);
|
||||
if (mTargetSet != null) {
|
||||
mClipAnimationHelper.applyTransform(mTargetSet, mTransformParams);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
case MotionEvent.ACTION_UP:
|
||||
finishTouchTracking(ev);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the gesture has ended. Does not correlate to the completion of the interaction as
|
||||
* the animation can still be running.
|
||||
*/
|
||||
private void finishTouchTracking(MotionEvent ev) {
|
||||
mStateCallback.setState(STATE_HANDLER_INVALIDATED);
|
||||
if (mThresholdCrossed && ev.getAction() == ACTION_UP) {
|
||||
mVelocityTracker.computeCurrentVelocity(1000,
|
||||
ViewConfiguration.get(mContext).getScaledMaximumFlingVelocity());
|
||||
|
||||
float velocityY = mVelocityTracker.getYVelocity();
|
||||
float flingThreshold = mContext.getResources()
|
||||
.getDimension(R.dimen.quickstep_fling_threshold_velocity);
|
||||
|
||||
boolean dismissTask;
|
||||
if (Math.abs(velocityY) > flingThreshold) {
|
||||
// Is fling
|
||||
dismissTask = velocityY < 0;
|
||||
} else {
|
||||
dismissTask = mProgress >= (1 - MIN_PROGRESS_FOR_OVERVIEW);
|
||||
}
|
||||
if (dismissTask) {
|
||||
// For now, just start the home intent so user is prompted to unlock the device.
|
||||
mContext.startActivity(new Intent(Intent.ACTION_MAIN)
|
||||
.addCategory(Intent.CATEGORY_HOME)
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||
}
|
||||
}
|
||||
mVelocityTracker.recycle();
|
||||
mVelocityTracker = null;
|
||||
}
|
||||
|
||||
private void startRecentsTransition() {
|
||||
mThresholdCrossed = true;
|
||||
RecentsAnimationListenerSet newListenerSet =
|
||||
mSwipeSharedState.newRecentsAnimationListenerSet();
|
||||
newListenerSet.addListener(this);
|
||||
Intent intent = new Intent(Intent.ACTION_MAIN)
|
||||
.addCategory(Intent.CATEGORY_DEFAULT)
|
||||
.setComponent(new ComponentName(mContext, LockScreenRecentsActivity.class))
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||
|
||||
mInputMonitorCompat.pilferPointers();
|
||||
BackgroundExecutor.get().submit(
|
||||
() -> ActivityManagerWrapper.getInstance().startRecentsActivity(
|
||||
intent, null, newListenerSet, null, null));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRecentsAnimationStart(SwipeAnimationTargetSet targetSet) {
|
||||
mTargetSet = targetSet;
|
||||
|
||||
Rect displaySize = new Rect(0, 0, mDisplaySize.x, mDisplaySize.y);
|
||||
RemoteAnimationTargetCompat targetCompat = targetSet.findTask(mRunningTaskId);
|
||||
if (targetCompat != null) {
|
||||
mClipAnimationHelper.updateSource(displaySize, targetCompat);
|
||||
}
|
||||
|
||||
Utilities.scaleRectAboutCenter(displaySize, SCALE_DOWN);
|
||||
displaySize.offsetTo(displaySize.left, 0);
|
||||
mClipAnimationHelper.updateTargetRect(displaySize);
|
||||
mClipAnimationHelper.applyTransform(mTargetSet, mTransformParams);
|
||||
|
||||
mStateCallback.setState(STATE_TARGET_RECEIVED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRecentsAnimationCanceled() {
|
||||
mTargetSet = null;
|
||||
}
|
||||
|
||||
private void endRemoteAnimation() {
|
||||
if (mTargetSet != null) {
|
||||
mTargetSet.finishController(
|
||||
false /* toRecents */, null /* callback */, false /* sendUserLeaveHint */);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConsumerAboutToBeSwitched() {
|
||||
mStateCallback.setState(STATE_HANDLER_INVALIDATED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowInterceptByParent() {
|
||||
return !mThresholdCrossed;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,7 +23,6 @@ import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MOD
|
|||
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.Matrix.ScaleToFit;
|
||||
import android.graphics.Rect;
|
||||
|
@ -160,14 +159,16 @@ public class ClipAnimationHelper {
|
|||
|
||||
public RectF applyTransform(RemoteAnimationTargetSet targetSet, TransformParams params,
|
||||
boolean launcherOnTop) {
|
||||
float progress = params.progress;
|
||||
if (params.currentRect == null) {
|
||||
RectF currentRect;
|
||||
mTmpRectF.set(mTargetRect);
|
||||
Utilities.scaleRectFAboutCenter(mTmpRectF, params.offsetScale);
|
||||
float progress = params.progress;
|
||||
currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTmpRectF);
|
||||
currentRect.offset(params.offsetX, 0);
|
||||
|
||||
// Don't clip past progress > 1.
|
||||
progress = Math.min(1, progress);
|
||||
final RectF sourceWindowClipInsets = params.forLiveTile
|
||||
? mSourceWindowClipInsetsForLiveTile : mSourceWindowClipInsets;
|
||||
mClipRectF.left = sourceWindowClipInsets.left * progress;
|
||||
|
@ -189,7 +190,7 @@ public class ClipAnimationHelper {
|
|||
float alpha = 1f;
|
||||
int layer = RemoteAnimationProvider.getLayer(app, mBoostModeTargetLayers);
|
||||
float cornerRadius = 0f;
|
||||
float scale = params.currentRect.width() / crop.width();
|
||||
float scale = Math.max(params.currentRect.width(), mTargetRect.width()) / crop.width();
|
||||
if (app.mode == targetSet.targetMode) {
|
||||
if (app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) {
|
||||
mTmpMatrix.setRectToRect(mSourceRect, params.currentRect, ScaleToFit.FILL);
|
||||
|
@ -198,7 +199,7 @@ public class ClipAnimationHelper {
|
|||
if (mSupportsRoundedCornersOnWindows) {
|
||||
float windowCornerRadius = mUseRoundedCornersOnWindows
|
||||
? mWindowCornerRadius : 0;
|
||||
cornerRadius = Utilities.mapRange(params.progress, windowCornerRadius,
|
||||
cornerRadius = Utilities.mapRange(progress, windowCornerRadius,
|
||||
mTaskCornerRadius);
|
||||
mCurrentCornerRadius = cornerRadius;
|
||||
}
|
||||
|
|
|
@ -16,26 +16,22 @@
|
|||
package com.android.quickstep.util;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.PropertyValuesHolder;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.RectF;
|
||||
import android.util.FloatProperty;
|
||||
|
||||
import androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationEndListener;
|
||||
import androidx.dynamicanimation.animation.FloatPropertyCompat;
|
||||
import androidx.dynamicanimation.animation.SpringAnimation;
|
||||
import androidx.dynamicanimation.animation.SpringForce;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimationSuccessListener;
|
||||
import com.android.launcher3.anim.FlingSpringAnim;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.DEACCEL;
|
||||
|
||||
/**
|
||||
* Applies spring forces to animate from a starting rect to a target rect,
|
||||
|
@ -43,14 +39,6 @@ import static com.android.launcher3.anim.Interpolators.DEACCEL;
|
|||
*/
|
||||
public class RectFSpringAnim {
|
||||
|
||||
/**
|
||||
* Although the rect position animation takes an indefinite amount of time since it depends on
|
||||
* the initial velocity and applied forces, scaling from the starting rect to the target rect
|
||||
* can be done in parallel at a fixed duration. Update callbacks are sent based on the progress
|
||||
* of this animation, while the end callback is sent after all animations finish.
|
||||
*/
|
||||
private static final long RECT_SCALE_DURATION = 250;
|
||||
|
||||
private static final FloatPropertyCompat<RectFSpringAnim> RECT_CENTER_X =
|
||||
new FloatPropertyCompat<RectFSpringAnim>("rectCenterXSpring") {
|
||||
@Override
|
||||
|
@ -79,17 +67,17 @@ public class RectFSpringAnim {
|
|||
}
|
||||
};
|
||||
|
||||
private static final FloatProperty<RectFSpringAnim> RECT_SCALE_PROGRESS =
|
||||
new FloatProperty<RectFSpringAnim>("rectScaleProgress") {
|
||||
private static final FloatPropertyCompat<RectFSpringAnim> RECT_SCALE_PROGRESS =
|
||||
new FloatPropertyCompat<RectFSpringAnim>("rectScaleProgress") {
|
||||
@Override
|
||||
public Float get(RectFSpringAnim anim) {
|
||||
return anim.mCurrentScaleProgress;
|
||||
public float getValue(RectFSpringAnim object) {
|
||||
return object.mCurrentScaleProgress;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(RectFSpringAnim anim, float currentScaleProgress) {
|
||||
anim.mCurrentScaleProgress = currentScaleProgress;
|
||||
anim.onUpdate();
|
||||
public void setValue(RectFSpringAnim object, float value) {
|
||||
object.mCurrentScaleProgress = value;
|
||||
object.onUpdate();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -106,7 +94,7 @@ public class RectFSpringAnim {
|
|||
private float mCurrentScaleProgress;
|
||||
private FlingSpringAnim mRectXAnim;
|
||||
private FlingSpringAnim mRectYAnim;
|
||||
private ValueAnimator mRectScaleAnim;
|
||||
private SpringAnimation mRectScaleAnim;
|
||||
private boolean mAnimsStarted;
|
||||
private boolean mRectXAnimEnded;
|
||||
private boolean mRectYAnimEnded;
|
||||
|
@ -177,17 +165,18 @@ public class RectFSpringAnim {
|
|||
mRectYAnim = new FlingSpringAnim(this, RECT_Y, startY, endY, startVelocityY,
|
||||
mMinVisChange, minYValue, maxYValue, springVelocityFactor, onYEndListener);
|
||||
|
||||
mRectScaleAnim = ObjectAnimator.ofPropertyValuesHolder(this,
|
||||
PropertyValuesHolder.ofFloat(RECT_SCALE_PROGRESS, 1))
|
||||
.setDuration(RECT_SCALE_DURATION);
|
||||
mRectScaleAnim.setInterpolator(DEACCEL);
|
||||
mRectScaleAnim.addListener(new AnimationSuccessListener() {
|
||||
@Override
|
||||
public void onAnimationSuccess(Animator animator) {
|
||||
mRectScaleAnimEnded = true;
|
||||
maybeOnEnd();
|
||||
}
|
||||
});
|
||||
float minVisibleChange = 1f / mStartRect.height();
|
||||
mRectScaleAnim = new SpringAnimation(this, RECT_SCALE_PROGRESS)
|
||||
.setSpring(new SpringForce(1f)
|
||||
.setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY)
|
||||
.setStiffness(SpringForce.STIFFNESS_LOW))
|
||||
.setStartVelocity(velocityPxPerMs.y * minVisibleChange)
|
||||
.setMaxValue(1f)
|
||||
.setMinimumVisibleChange(minVisibleChange)
|
||||
.addEndListener((animation, canceled, value, velocity) -> {
|
||||
mRectScaleAnimEnded = true;
|
||||
maybeOnEnd();
|
||||
});
|
||||
|
||||
mRectXAnim.start();
|
||||
mRectYAnim.start();
|
||||
|
@ -202,7 +191,9 @@ public class RectFSpringAnim {
|
|||
if (mAnimsStarted) {
|
||||
mRectXAnim.end();
|
||||
mRectYAnim.end();
|
||||
mRectScaleAnim.end();
|
||||
if (mRectScaleAnim.canSkipToEnd()) {
|
||||
mRectScaleAnim.skipToEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,154 @@
|
|||
/*
|
||||
* Copyright (C) 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.dynamicanimation.animation.SpringForce;
|
||||
|
||||
import com.android.launcher3.CellLayout;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherAnimUtils.ViewProgressProperty;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.ShortcutAndWidgetContainer;
|
||||
import com.android.launcher3.anim.SpringObjectAnimator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
|
||||
/**
|
||||
* Creates an animation where all the workspace items are moved into their final location,
|
||||
* staggered row by row from the bottom up.
|
||||
* This is used in conjunction with the swipe up to home animation.
|
||||
*/
|
||||
public class StaggeredWorkspaceAnim {
|
||||
|
||||
private static final int APP_CLOSE_ROW_START_DELAY_MS = 16;
|
||||
private static final int ALPHA_DURATION_MS = 200;
|
||||
|
||||
private static final float MAX_VELOCITY_PX_PER_S = 22f;
|
||||
|
||||
private static final float DAMPING_RATIO =
|
||||
(SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY + SpringForce.DAMPING_RATIO_LOW_BOUNCY) / 2f;
|
||||
private static final float STIFFNESS = SpringForce.STIFFNESS_LOW;
|
||||
|
||||
private final float mVelocity;
|
||||
private final float mSpringTransY;
|
||||
private final View mViewToIgnore;
|
||||
|
||||
private final List<ValueAnimator> mAnimators = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* @param floatingViewOriginalView The FloatingIconView's original view.
|
||||
*/
|
||||
public StaggeredWorkspaceAnim(Launcher launcher, @Nullable View floatingViewOriginalView,
|
||||
float velocity) {
|
||||
mVelocity = velocity;
|
||||
// We ignore this view since it's visibility and position is controlled by
|
||||
// the FloatingIconView.
|
||||
mViewToIgnore = floatingViewOriginalView;
|
||||
|
||||
// Scale the translationY based on the initial velocity to better sync the workspace items
|
||||
// with the floating view.
|
||||
float transFactor = 0.1f + 0.9f * Math.abs(velocity) / MAX_VELOCITY_PX_PER_S;
|
||||
mSpringTransY = transFactor * launcher.getResources()
|
||||
.getDimensionPixelSize(R.dimen.swipe_up_max_workspace_trans_y);;
|
||||
|
||||
DeviceProfile grid = launcher.getDeviceProfile();
|
||||
ShortcutAndWidgetContainer currentPage = ((CellLayout) launcher.getWorkspace()
|
||||
.getChildAt(launcher.getWorkspace().getCurrentPage()))
|
||||
.getShortcutsAndWidgets();
|
||||
|
||||
// Hotseat and QSB takes up two additional rows.
|
||||
int totalRows = grid.inv.numRows + (grid.isVerticalBarLayout() ? 0 : 2);
|
||||
|
||||
// Set up springs on workspace items.
|
||||
for (int i = currentPage.getChildCount() - 1; i >= 0; i--) {
|
||||
View child = currentPage.getChildAt(i);
|
||||
CellLayout.LayoutParams lp = ((CellLayout.LayoutParams) child.getLayoutParams());
|
||||
addStaggeredAnimationForView(child, lp.cellY + lp.cellVSpan, totalRows);
|
||||
}
|
||||
|
||||
// Set up springs for the hotseat and qsb.
|
||||
if (grid.isVerticalBarLayout()) {
|
||||
ViewGroup hotseat = (ViewGroup) launcher.getHotseat().getChildAt(0);
|
||||
for (int i = hotseat.getChildCount() - 1; i >= 0; i--) {
|
||||
View child = hotseat.getChildAt(i);
|
||||
CellLayout.LayoutParams lp = ((CellLayout.LayoutParams) child.getLayoutParams());
|
||||
addStaggeredAnimationForView(child, lp.cellY + 1, totalRows);
|
||||
}
|
||||
} else {
|
||||
View hotseat = launcher.getHotseat().getChildAt(0);
|
||||
addStaggeredAnimationForView(hotseat, grid.inv.numRows + 1, totalRows);
|
||||
|
||||
View qsb = launcher.findViewById(R.id.search_container_all_apps);
|
||||
addStaggeredAnimationForView(qsb, grid.inv.numRows + 2, totalRows);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the animation.
|
||||
*/
|
||||
public void start() {
|
||||
for (Animator a : mAnimators) {
|
||||
if (a instanceof SpringObjectAnimator) {
|
||||
((SpringObjectAnimator) a).startSpring(1f, mVelocity, null);
|
||||
} else {
|
||||
a.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an alpha/trans animator for {@param v}, with a start delay based on the view's row.
|
||||
*
|
||||
* @param v A view on the workspace.
|
||||
* @param row The bottom-most row that contains the view.
|
||||
* @param totalRows Total number of rows.
|
||||
*/
|
||||
private void addStaggeredAnimationForView(View v, int row, int totalRows) {
|
||||
if (v == mViewToIgnore) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Invert the rows, because we stagger starting from the bottom of the screen.
|
||||
int invertedRow = totalRows - row;
|
||||
// Add 1 to the inverted row so that the bottom most row has a start delay.
|
||||
long startDelay = (long) ((invertedRow + 1) * APP_CLOSE_ROW_START_DELAY_MS);
|
||||
|
||||
v.setTranslationY(mSpringTransY);
|
||||
SpringObjectAnimator springTransY = new SpringObjectAnimator<>(
|
||||
new ViewProgressProperty(v, View.TRANSLATION_Y), "staggeredSpringTransY", 1f,
|
||||
DAMPING_RATIO, STIFFNESS, mSpringTransY, 0);
|
||||
springTransY.setStartDelay(startDelay);
|
||||
mAnimators.add(springTransY);
|
||||
|
||||
v.setAlpha(0);
|
||||
ObjectAnimator alpha = ObjectAnimator.ofFloat(v, View.ALPHA, 0f, 1f);
|
||||
alpha.setInterpolator(LINEAR);
|
||||
alpha.setDuration(ALPHA_DURATION_MS);
|
||||
alpha.setStartDelay(startDelay);
|
||||
mAnimators.add(alpha);
|
||||
}
|
||||
}
|
|
@ -52,6 +52,7 @@ import com.android.launcher3.Utilities;
|
|||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.logging.UserEventDispatcher;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
|
||||
|
@ -145,11 +146,13 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
|||
};
|
||||
|
||||
private final TaskOutlineProvider mOutlineProvider;
|
||||
private final FooterOutlineProvider mFooterOutlineProvider;
|
||||
|
||||
private Task mTask;
|
||||
private TaskThumbnailView mSnapshotView;
|
||||
private TaskMenuView mMenuView;
|
||||
private IconView mIconView;
|
||||
private View mTaskFooterContainer;
|
||||
private DigitalWellBeingToast mDigitalWellBeingToast;
|
||||
private float mCurveScale;
|
||||
private float mFullscreenProgress;
|
||||
|
@ -180,6 +183,9 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
|||
super(context, attrs, defStyleAttr);
|
||||
mActivity = BaseDraggingActivity.fromContext(context);
|
||||
setOnClickListener((view) -> {
|
||||
if (com.android.launcher3.testing.TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_START_TASK_TAG, "TaskView onClick");
|
||||
}
|
||||
if (getTask() == null) {
|
||||
return;
|
||||
}
|
||||
|
@ -203,6 +209,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
|||
mWindowCornerRadius = QuickStepContract.getWindowCornerRadius(context.getResources());
|
||||
mCurrentFullscreenParams = new FullscreenDrawParams(mCornerRadius);
|
||||
mOutlineProvider = new TaskOutlineProvider(getResources(), mCurrentFullscreenParams);
|
||||
mFooterOutlineProvider = new FooterOutlineProvider(mCurrentFullscreenParams);
|
||||
setOutlineProvider(mOutlineProvider);
|
||||
}
|
||||
|
||||
|
@ -212,6 +219,9 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
|||
mSnapshotView = findViewById(R.id.snapshot);
|
||||
mIconView = findViewById(R.id.icon);
|
||||
mDigitalWellBeingToast = findViewById(R.id.digital_well_being_toast);
|
||||
mTaskFooterContainer = findViewById(R.id.task_footer_container);
|
||||
mTaskFooterContainer.setOutlineProvider(mFooterOutlineProvider);
|
||||
mTaskFooterContainer.setClipToOutline(true);
|
||||
}
|
||||
|
||||
public TaskMenuView getMenuView() {
|
||||
|
@ -279,6 +289,9 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
|||
|
||||
public void launchTask(boolean animate, boolean freezeTaskList, Consumer<Boolean> resultCallback,
|
||||
Handler resultCallbackHandler) {
|
||||
if (com.android.launcher3.testing.TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_START_TASK_TAG, "launchTask");
|
||||
}
|
||||
if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
|
||||
if (isRunningTask()) {
|
||||
getRecentsView().finishRecentsAnimation(false /* toRecents */,
|
||||
|
@ -293,6 +306,9 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
|||
|
||||
private void launchTaskInternal(boolean animate, boolean freezeTaskList,
|
||||
Consumer<Boolean> resultCallback, Handler resultCallbackHandler) {
|
||||
if (com.android.launcher3.testing.TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_START_TASK_TAG, "launchTaskInternal");
|
||||
}
|
||||
if (mTask != null) {
|
||||
final ActivityOptions opts;
|
||||
if (animate) {
|
||||
|
@ -410,6 +426,15 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
|||
.getInterpolation(progress);
|
||||
mIconView.setScaleX(scale);
|
||||
mIconView.setScaleY(scale);
|
||||
|
||||
int footerVerticalOffset = (int) (mTaskFooterContainer.getHeight() * (1.0f - scale));
|
||||
mTaskFooterContainer.setTranslationY(
|
||||
mCurrentFullscreenParams.mCurrentDrawnInsets.bottom +
|
||||
mCurrentFullscreenParams.mCurrentDrawnInsets.top +
|
||||
footerVerticalOffset);
|
||||
mFooterOutlineProvider.setFullscreenDrawParams(
|
||||
mCurrentFullscreenParams, footerVerticalOffset);
|
||||
mTaskFooterContainer.invalidateOutline();
|
||||
}
|
||||
|
||||
public void setIconScaleAnimStartProgress(float startProgress) {
|
||||
|
@ -550,6 +575,29 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
|||
}
|
||||
}
|
||||
|
||||
private static final class FooterOutlineProvider extends ViewOutlineProvider {
|
||||
|
||||
private FullscreenDrawParams mFullscreenDrawParams;
|
||||
private int mVerticalOffset;
|
||||
private final Rect mOutlineRect = new Rect();
|
||||
|
||||
FooterOutlineProvider(FullscreenDrawParams params) {
|
||||
mFullscreenDrawParams = params;
|
||||
}
|
||||
|
||||
void setFullscreenDrawParams(FullscreenDrawParams params, int verticalOffset) {
|
||||
mFullscreenDrawParams = params;
|
||||
mVerticalOffset = verticalOffset;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getOutline(View view, Outline outline) {
|
||||
mOutlineRect.set(0, 0, view.getWidth(), view.getHeight());
|
||||
mOutlineRect.offset(0, -mVerticalOffset);
|
||||
outline.setRoundRect(mOutlineRect, mFullscreenDrawParams.mCurrentDrawnCornerRadius);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
|
||||
super.onInitializeAccessibilityNodeInfo(info);
|
||||
|
@ -633,12 +681,12 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
|||
* @param progress: 0 = show icon and no insets; 1 = don't show icon and show full insets.
|
||||
*/
|
||||
public void setFullscreenProgress(float progress) {
|
||||
progress = Utilities.boundToRange(progress, 0, 1);
|
||||
if (progress == mFullscreenProgress) {
|
||||
return;
|
||||
}
|
||||
mFullscreenProgress = progress;
|
||||
boolean isFullscreen = mFullscreenProgress > 0;
|
||||
setIconScaleAndDim(progress, true /* invert */);
|
||||
mIconView.setVisibility(progress < 1 ? VISIBLE : INVISIBLE);
|
||||
setClipChildren(!isFullscreen);
|
||||
setClipToPadding(!isFullscreen);
|
||||
|
@ -662,6 +710,9 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
|||
/ (getWidth() + currentInsetsLeft + currentInsetsRight));
|
||||
}
|
||||
|
||||
// Some of the items in here are dependent on the current fullscreen params
|
||||
setIconScaleAndDim(progress, true /* invert */);
|
||||
|
||||
thumbnail.setFullscreenParams(mCurrentFullscreenParams);
|
||||
mOutlineProvider.setFullscreenParams(mCurrentFullscreenParams);
|
||||
invalidateOutline();
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
<FrameLayout
|
||||
android:id="@+id/proactive_suggest_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
<string name="accessibility_close_task" msgid="5354563209433803643">"إغلاق"</string>
|
||||
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"إعدادات استخدام التطبيق"</string>
|
||||
<string name="recents_clear_all" msgid="5328176793634888831">"محو الكل"</string>
|
||||
<string name="accessibility_recent_apps" msgid="4058661986695117371">"التطبيقات التي تمّ استخدامها مؤخرًا"</string>
|
||||
<string name="accessibility_recent_apps" msgid="4058661986695117371">"التطبيقات المستخدمة مؤخرًا"</string>
|
||||
<string name="task_contents_description_with_remaining_time" msgid="4479688746574672685">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>، <xliff:g id="REMAINING_TIME">%2$s</xliff:g>"</string>
|
||||
<string name="shorter_duration_less_than_one_minute" msgid="4722015666335015336">"أقل من دقيقة"</string>
|
||||
<string name="time_left_for_app" msgid="3111996412933644358">"يتبقى اليوم <xliff:g id="TIME">%1$s</xliff:g>."</string>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="recent_task_option_split_screen" msgid="5353188922202653570">"Splitscreen"</string>
|
||||
<string name="recent_task_option_pin" msgid="7929860679018978258">"Fixieren"</string>
|
||||
<string name="recent_task_option_pin" msgid="7929860679018978258">"Anpinnen"</string>
|
||||
<string name="recent_task_option_freeform" msgid="48863056265284071">"Freeform-Modus"</string>
|
||||
<string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Übersicht"</string>
|
||||
<string name="recents_empty_message" msgid="7040467240571714191">"Keine kürzlich verwendeten Elemente"</string>
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
<string name="accessibility_close_task" msgid="5354563209433803643">"Pecha a aplicación"</string>
|
||||
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Configuración do uso de aplicacións"</string>
|
||||
<string name="recents_clear_all" msgid="5328176793634888831">"Borrar todo"</string>
|
||||
<string name="accessibility_recent_apps" msgid="4058661986695117371">"Aplicacións recentes"</string>
|
||||
<string name="accessibility_recent_apps" msgid="4058661986695117371">"Apps recentes"</string>
|
||||
<string name="task_contents_description_with_remaining_time" msgid="4479688746574672685">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g> (<xliff:g id="REMAINING_TIME">%2$s</xliff:g>)"</string>
|
||||
<string name="shorter_duration_less_than_one_minute" msgid="4722015666335015336">"<1 min"</string>
|
||||
<string name="time_left_for_app" msgid="3111996412933644358">"Tempo restante hoxe <xliff:g id="TIME">%1$s</xliff:g>"</string>
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
|
||||
<string name="stats_log_manager_class" translatable="false">com.android.quickstep.logging.StatsLogCompatManager</string>
|
||||
|
||||
<string name="test_information_handler_class" translatable="false">com.android.quickstep.QuickstepTestInformationHandler</string>
|
||||
|
||||
<!-- The number of thumbnails and icons to keep in the cache. The thumbnail cache size also
|
||||
determines how many thumbnails will be fetched in the background. -->
|
||||
<integer name="recentsThumbnailCacheSize">3</integer>
|
||||
|
|
|
@ -278,7 +278,7 @@ public abstract class QuickstepAppTransitionManagerImpl extends LauncherAppTrans
|
|||
if (launcherClosing) {
|
||||
Pair<AnimatorSet, Runnable> launcherContentAnimator =
|
||||
getLauncherContentAnimator(true /* isAppOpening */,
|
||||
new float[] {0, mContentTransY});
|
||||
new float[] {0, -mContentTransY});
|
||||
anim.play(launcherContentAnimator.first);
|
||||
anim.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
|
|
|
@ -26,6 +26,7 @@ import static com.android.launcher3.anim.Interpolators.ACCEL;
|
|||
import static com.android.launcher3.anim.Interpolators.DEACCEL;
|
||||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
import static com.android.launcher3.config.FeatureFlags.QUICKSTEP_SPRINGS;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
|
||||
|
||||
import android.animation.TimeInterpolator;
|
||||
import android.animation.ValueAnimator;
|
||||
|
@ -46,9 +47,11 @@ import com.android.launcher3.touch.SwipeDetector;
|
|||
import com.android.launcher3.uioverrides.states.OverviewState;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
import com.android.quickstep.OverviewInteractionState;
|
||||
import com.android.quickstep.RecentsModel;
|
||||
import com.android.quickstep.TouchInteractionService;
|
||||
import com.android.quickstep.util.LayoutUtils;
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
|
||||
/**
|
||||
* Touch controller for handling various state transitions in portrait UI.
|
||||
|
@ -135,7 +138,10 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr
|
|||
} else if (fromState == OVERVIEW) {
|
||||
return isDragTowardPositive ? ALL_APPS : NORMAL;
|
||||
} else if (fromState == NORMAL && isDragTowardPositive) {
|
||||
int stateFlags = OverviewInteractionState.INSTANCE.get(mLauncher)
|
||||
.getSystemUiStateFlags();
|
||||
return mAllowDragToOverview && TouchInteractionService.isConnected()
|
||||
&& (stateFlags & SYSUI_STATE_OVERVIEW_DISABLED) == 0
|
||||
? OVERVIEW : ALL_APPS;
|
||||
}
|
||||
return fromState;
|
||||
|
|
|
@ -118,6 +118,8 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> {
|
|||
|
||||
void createActivityController(long transitionLength);
|
||||
|
||||
default void adjustActivityControllerInterpolators() { }
|
||||
|
||||
default void onTransitionCancelled() { }
|
||||
|
||||
default void setShelfState(ShelfAnimState animState, Interpolator interpolator,
|
||||
|
@ -141,5 +143,9 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> {
|
|||
@NonNull RectF getWindowTargetRect();
|
||||
|
||||
@NonNull AnimatorPlaybackController createActivityAnimationToHome();
|
||||
|
||||
default void playAtomicAnimation(float velocity) {
|
||||
// No-op
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import static android.content.Intent.ACTION_PACKAGE_REMOVED;
|
|||
|
||||
import static com.android.launcher3.util.PackageManagerHelper.getPackageFilter;
|
||||
import static com.android.systemui.shared.system.PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
|
@ -32,6 +33,7 @@ import android.content.pm.ResolveInfo;
|
|||
|
||||
import com.android.systemui.shared.system.PackageManagerWrapper;
|
||||
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
|
@ -56,6 +58,7 @@ public final class OverviewComponentObserver {
|
|||
private String mUpdateRegisteredPackage;
|
||||
private ActivityControlHelper mActivityControlHelper;
|
||||
private Intent mOverviewIntent;
|
||||
private int mSystemUiStateFlags;
|
||||
|
||||
public OverviewComponentObserver(Context context) {
|
||||
mContext = context;
|
||||
|
@ -71,6 +74,15 @@ public final class OverviewComponentObserver {
|
|||
updateOverviewTargets();
|
||||
}
|
||||
|
||||
public void onSystemUiStateChanged(int stateFlags) {
|
||||
boolean homeDisabledChanged = (mSystemUiStateFlags & SYSUI_STATE_HOME_DISABLED)
|
||||
!= (stateFlags & SYSUI_STATE_HOME_DISABLED);
|
||||
mSystemUiStateFlags = stateFlags;
|
||||
if (homeDisabledChanged) {
|
||||
updateOverviewTargets();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update overview intent and {@link ActivityControlHelper} based off the current launcher home
|
||||
* component.
|
||||
|
@ -81,7 +93,8 @@ public final class OverviewComponentObserver {
|
|||
|
||||
final String overviewIntentCategory;
|
||||
ComponentName overviewComponent;
|
||||
if (defaultHome == null || mMyHomeComponent.equals(defaultHome)) {
|
||||
if ((mSystemUiStateFlags & SYSUI_STATE_HOME_DISABLED) == 0 &&
|
||||
(defaultHome == null || mMyHomeComponent.equals(defaultHome))) {
|
||||
// User default home is same as out home app. Use Overview integrated in Launcher.
|
||||
overviewComponent = mMyHomeComponent;
|
||||
mActivityControlHelper = new LauncherActivityControllerHelper();
|
||||
|
|
|
@ -53,6 +53,8 @@ public class OverviewInteractionState {
|
|||
private ISystemUiProxy mISystemUiProxy;
|
||||
private float mBackButtonAlpha = 1;
|
||||
|
||||
private int mSystemUiStateFlags;
|
||||
|
||||
private OverviewInteractionState(Context context) {
|
||||
mContext = context;
|
||||
|
||||
|
@ -83,6 +85,14 @@ public class OverviewInteractionState {
|
|||
mBgHandler.obtainMessage(MSG_SET_PROXY, proxy).sendToTarget();
|
||||
}
|
||||
|
||||
public void setSystemUiStateFlags(int stateFlags) {
|
||||
mSystemUiStateFlags = stateFlags;
|
||||
}
|
||||
|
||||
public int getSystemUiStateFlags() {
|
||||
return mSystemUiStateFlags;
|
||||
}
|
||||
|
||||
private boolean handleUiMessage(Message msg) {
|
||||
if (msg.what == MSG_SET_BACK_BUTTON_ALPHA) {
|
||||
mBackButtonAlpha = (float) msg.obj;
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
package com.android.quickstep;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.android.launcher3.testing.TestInformationHandler;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.uioverrides.states.OverviewState;
|
||||
import com.android.quickstep.util.LayoutUtils;
|
||||
|
||||
public class QuickstepTestInformationHandler extends TestInformationHandler {
|
||||
|
||||
public QuickstepTestInformationHandler(Context context) { }
|
||||
|
||||
@Override
|
||||
public Bundle call(String method) {
|
||||
final Bundle response = new Bundle();
|
||||
switch (method) {
|
||||
case TestProtocol.REQUEST_HOME_TO_OVERVIEW_SWIPE_HEIGHT: {
|
||||
final float swipeHeight =
|
||||
OverviewState.getDefaultSwipeHeight(mDeviceProfile);
|
||||
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, (int) swipeHeight);
|
||||
return response;
|
||||
}
|
||||
|
||||
case TestProtocol.REQUEST_BACKGROUND_TO_OVERVIEW_SWIPE_HEIGHT: {
|
||||
final float swipeHeight =
|
||||
LayoutUtils.getShelfTrackingDistance(mContext, mDeviceProfile);
|
||||
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, (int) swipeHeight);
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
||||
return super.call(method);
|
||||
}
|
||||
}
|
|
@ -1,127 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.quickstep;
|
||||
|
||||
import android.content.ContentProvider;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.InvariantDeviceProfile;
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherAppState;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.TestProtocol;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.uioverrides.states.OverviewState;
|
||||
import com.android.quickstep.util.LayoutUtils;
|
||||
|
||||
public class TestInformationProvider extends ContentProvider {
|
||||
@Override
|
||||
public boolean onCreate() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int delete(Uri uri, String s, String[] strings) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Uri insert(Uri uri, ContentValues contentValues) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType(Uri uri) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Bundle call(String method, String arg, Bundle extras) {
|
||||
if (Utilities.IS_RUNNING_IN_TEST_HARNESS) {
|
||||
final Bundle response = new Bundle();
|
||||
final Context context = getContext();
|
||||
final DeviceProfile deviceProfile = InvariantDeviceProfile.INSTANCE.
|
||||
get(context).getDeviceProfile(context);
|
||||
final LauncherAppState launcherAppState = LauncherAppState.getInstanceNoCreate();
|
||||
final Launcher launcher = launcherAppState != null ?
|
||||
(Launcher) launcherAppState.getModel().getCallback() : null;
|
||||
|
||||
switch (method) {
|
||||
case TestProtocol.REQUEST_HOME_TO_OVERVIEW_SWIPE_HEIGHT: {
|
||||
final float swipeHeight =
|
||||
OverviewState.getDefaultSwipeHeight(deviceProfile);
|
||||
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, (int) swipeHeight);
|
||||
break;
|
||||
}
|
||||
|
||||
case TestProtocol.REQUEST_BACKGROUND_TO_OVERVIEW_SWIPE_HEIGHT: {
|
||||
final float swipeHeight =
|
||||
LayoutUtils.getShelfTrackingDistance(context, deviceProfile);
|
||||
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, (int) swipeHeight);
|
||||
break;
|
||||
}
|
||||
|
||||
case TestProtocol.REQUEST_ALL_APPS_TO_OVERVIEW_SWIPE_HEIGHT: {
|
||||
if (launcher == null) return null;
|
||||
|
||||
final float progress = LauncherState.OVERVIEW.getVerticalProgress(launcher)
|
||||
- LauncherState.ALL_APPS.getVerticalProgress(launcher);
|
||||
final float distance =
|
||||
launcher.getAllAppsController().getShiftRange() * progress;
|
||||
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, (int) distance);
|
||||
break;
|
||||
}
|
||||
|
||||
case TestProtocol.REQUEST_HOME_TO_ALL_APPS_SWIPE_HEIGHT: {
|
||||
if (launcher == null) return null;
|
||||
|
||||
final float progress = LauncherState.NORMAL.getVerticalProgress(launcher)
|
||||
- LauncherState.ALL_APPS.getVerticalProgress(launcher);
|
||||
final float distance =
|
||||
launcher.getAllAppsController().getShiftRange() * progress;
|
||||
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, (int) distance);
|
||||
break;
|
||||
}
|
||||
|
||||
case TestProtocol.REQUEST_ENABLE_DEBUG_TRACING:
|
||||
TestProtocol.sDebugTracing = true;
|
||||
break;
|
||||
|
||||
case TestProtocol.REQUEST_DISABLE_DEBUG_TRACING:
|
||||
TestProtocol.sDebugTracing = false;
|
||||
break;
|
||||
}
|
||||
return response;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -21,6 +21,7 @@ import android.view.MotionEvent;
|
|||
|
||||
import com.android.launcher3.Alarm;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.compat.AccessibilityManagerCompat;
|
||||
|
||||
/**
|
||||
* Given positions along x- or y-axis, tracks velocity and acceleration and determines when there is
|
||||
|
@ -47,6 +48,7 @@ public class MotionPauseDetector {
|
|||
private final float mSpeedFast;
|
||||
private final Alarm mForcePauseTimeout;
|
||||
private final boolean mMakePauseHarderToTrigger;
|
||||
private final Context mContext;
|
||||
|
||||
private Long mPreviousTime = null;
|
||||
private Float mPreviousPosition = null;
|
||||
|
@ -71,6 +73,7 @@ public class MotionPauseDetector {
|
|||
* @param makePauseHarderToTrigger Used for gestures that require a more explicit pause.
|
||||
*/
|
||||
public MotionPauseDetector(Context context, boolean makePauseHarderToTrigger) {
|
||||
mContext = context;
|
||||
Resources res = context.getResources();
|
||||
mSpeedVerySlow = res.getDimension(R.dimen.motion_pause_detector_speed_very_slow);
|
||||
mSpeedSlow = res.getDimension(R.dimen.motion_pause_detector_speed_slow);
|
||||
|
@ -165,6 +168,7 @@ public class MotionPauseDetector {
|
|||
if (mIsPaused != isPaused) {
|
||||
mIsPaused = isPaused;
|
||||
if (mIsPaused) {
|
||||
AccessibilityManagerCompat.sendPauseDetectedEventToTest(mContext);
|
||||
mHasEverBeenPaused = true;
|
||||
}
|
||||
if (mOnMotionPauseListener != null) {
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
vadimt@google.com
|
|
@ -68,7 +68,6 @@ public class AppPredictionsUITests extends AbstractQuickStepTest {
|
|||
|
||||
// Disable app tracker
|
||||
AppLaunchTracker.INSTANCE.initializeForTesting(new AppLaunchTracker());
|
||||
|
||||
PredictionUiStateManager.INSTANCE.initializeForTesting(null);
|
||||
|
||||
mCallback = PredictionUiStateManager.INSTANCE.get(mTargetContext).appPredictorCallback(
|
||||
|
|
|
@ -133,7 +133,7 @@ public class NavigationModeSwitchRule implements TestRule {
|
|||
|
||||
for (int i = 0; i != 100; ++i) {
|
||||
if (mLauncher.getNavigationModel() == expectedMode) {
|
||||
Thread.sleep(1000);
|
||||
Thread.sleep(5000);
|
||||
return;
|
||||
}
|
||||
Thread.sleep(100);
|
||||
|
|
|
@ -127,7 +127,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest {
|
|||
assertNotNull("OverviewTask.open returned null", task.open());
|
||||
assertTrue("Test activity didn't open from Overview", mDevice.wait(Until.hasObject(
|
||||
By.pkg(getAppPackageName()).text("TestActivity2")),
|
||||
LONG_WAIT_TIME_MS));
|
||||
DEFAULT_UI_TIMEOUT));
|
||||
executeOnLauncher(launcher -> assertTrue(
|
||||
"Launcher activity is the top activity; expecting another activity to be the top "
|
||||
+ "one",
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"الأدوات"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"الخلفيات"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"الأنماط والخلفيات"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"إعدادات الصفحة الرئيسية"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"إعدادات الشاشة الرئيسية"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"أوقف المشرف هذه الميزة"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"السماح بتدوير الشاشة الرئيسية"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"عند تدوير الهاتف"</string>
|
||||
|
@ -108,7 +108,7 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"أدوات <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"قائمة الأدوات"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"تم إغلاق قائمة الأدوات."</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"إضافة إلى الشاشة الرئيسية"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"الإضافة إلى الشاشة الرئيسية"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"نقل العنصر إلى هنا"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"تمت إضافة العنصر إلى الشاشة الرئيسية"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"تم حذف العنصر"</string>
|
||||
|
|
|
@ -105,7 +105,7 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Vidžeti za <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"Lista vidžeta"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"Lista vidžeta je zatvorena"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Dodaj na početni ekran"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Dodajte na početni ekran"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"Premesti stavku ovde"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"Stavka je dodata na početni ekran"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"Stavka je uklonjena"</string>
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"স্টাইল এবং ওয়ালপেপার"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"হোম সেটিংস"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"হোমস্ক্রীন ঘোরানোর অনুমতি দিন"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"হোম স্ক্রিন ঘোরানোর অনুমতি দিন"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"যখন ফোনটি ঘোরানো হয়"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"বিজ্ঞপ্তি ডট"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"চালু"</string>
|
||||
|
@ -104,7 +104,7 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> উইজেট"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"উইজেটের তালিকা"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"উইজেটের তালিকা বন্ধ করা হয়েছে"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"হোম স্ক্রীনে যোগ করুন"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"হোম স্ক্রিনে যোগ করুন"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"এখানে আইটেম সরান"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"হোম স্ক্রীনে আইটেম যোগ করা হয়েছে"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"আইটেম সরানো হয়েছে"</string>
|
||||
|
|
|
@ -79,7 +79,7 @@
|
|||
<string name="folder_closed" msgid="4100806530910930934">"Folder je zatvoren"</string>
|
||||
<string name="folder_renamed" msgid="1794088362165669656">"Ime foldera je promijenjeno u <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="folder_name_format" msgid="6629239338071103179">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"Dodaci"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"Vidžeti"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Pozadinske slike"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Stilovi i pozadinske slike"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Postavke početnog ekrana"</string>
|
||||
|
@ -90,7 +90,7 @@
|
|||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Uključeno"</string>
|
||||
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Isključeno"</string>
|
||||
<string name="title_missing_notification_access" msgid="7503287056163941064">"Potreban je pristup obavještenjima"</string>
|
||||
<string name="msg_missing_notification_access" msgid="281113995110910548">"Za prikaz tačaka obavještenja, uključite obavještenja za aplikacije za aplikaciju <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="msg_missing_notification_access" msgid="281113995110910548">"Za prikaz tačaka za obavještenja, uključite obavještenja za aplikacije za aplikaciju <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="title_change_settings" msgid="1376365968844349552">"Promijeni postavke"</string>
|
||||
<string name="notification_dots_service_title" msgid="4284221181793592871">"Prikaži tačke za obavještenja"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Dodaj ikonu na početni ekran"</string>
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Fons de pantalla"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Estils i fons de pantalla"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Configuració de pantalla d\'inici"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Config. pantalla d\'inici"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desactivada per l\'administrador"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Permet la rotació de la pantalla d\'inici"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"En girar el telèfon"</string>
|
||||
|
@ -92,7 +92,7 @@
|
|||
<string name="msg_missing_notification_access" msgid="281113995110910548">"Per veure els punts de notificació, activa les notificacions de l\'aplicació <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="title_change_settings" msgid="1376365968844349552">"Canvia la configuració"</string>
|
||||
<string name="notification_dots_service_title" msgid="4284221181793592871">"Mostra els punts de notificació"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Afegeix la icona a la pantalla d\'inici"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Afegeix icona a la pantalla d\'inici"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Per a les aplicacions noves"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"Desconegut"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"Suprimeix"</string>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d i bredden og %2$d i højden"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Tryk og hold nede for at placere manuelt"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Tryk og hold for at placere manuelt"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Tilføj automatisk"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Søg efter apps"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Indlæser apps…"</string>
|
||||
|
@ -48,7 +48,7 @@
|
|||
<string name="all_apps_button_label" msgid="8130441508702294465">"Liste med apps"</string>
|
||||
<string name="all_apps_button_personal_label" msgid="1315764287305224468">"Liste over personlige apps"</string>
|
||||
<string name="all_apps_button_work_label" msgid="7270707118948892488">"Liste over apps til arbejdet"</string>
|
||||
<string name="all_apps_home_button_label" msgid="252062713717058851">"Startskærm"</string>
|
||||
<string name="all_apps_home_button_label" msgid="252062713717058851">"Hjem"</string>
|
||||
<string name="remove_drop_target_label" msgid="7812859488053230776">"Fjern"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"Afinstaller"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Appinfo"</string>
|
||||
|
@ -80,8 +80,8 @@
|
|||
<string name="folder_name_format" msgid="6629239338071103179">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Baggrunde"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Stilarter og baggrunde"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Indstillinger for startskærmen"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Stil og baggrunde"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Startskærmindstillinger"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Deaktiveret af din administrator"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Tillad rotation af startskærmen"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Når telefonen roteres"</string>
|
||||
|
|
|
@ -80,11 +80,11 @@
|
|||
<string name="folder_name_format" msgid="6629239338071103179">"Ordner: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Hintergründe"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Stile und Hintergründe"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Einstellungen für den Startbildschirm"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Designs und Hintergründe"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Startbildschirm-Einstellungen"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Von deinem Administrator deaktiviert"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Drehung des Startbildschirms zulassen"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Bei Drehung des Smartphones"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Beim Drehen des Smartphones"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"App-Benachrichtigungspunkte"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"An"</string>
|
||||
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Aus"</string>
|
||||
|
@ -93,7 +93,7 @@
|
|||
<string name="title_change_settings" msgid="1376365968844349552">"Einstellungen ändern"</string>
|
||||
<string name="notification_dots_service_title" msgid="4284221181793592871">"App-Benachrichtigungspunkte anzeigen"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Symbol zum Startbildschirm hinzufügen"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Für neue Apps"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Bei neuen Apps"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"Unbekannt"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"Entfernen"</string>
|
||||
<string name="abandoned_search" msgid="891119232568284442">"Suchen"</string>
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Styles & wallpapers"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Allow Homescreen rotation"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Allow Home screen rotation"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Notification dots"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"On"</string>
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Styles & wallpapers"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Allow Homescreen rotation"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Allow Home screen rotation"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Notification dots"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"On"</string>
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Styles & wallpapers"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Allow Homescreen rotation"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Allow Home screen rotation"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Notification dots"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"On"</string>
|
||||
|
|
|
@ -85,13 +85,13 @@
|
|||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Inhabilitado por el administrador"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Permitir rotación de la pantalla de inicio"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Al girar el teléfono"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Burbujas de notificación"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activadas"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Puntos de notificación"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activados"</string>
|
||||
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Desactivadas"</string>
|
||||
<string name="title_missing_notification_access" msgid="7503287056163941064">"Se necesita acceso a las notificaciones"</string>
|
||||
<string name="msg_missing_notification_access" msgid="281113995110910548">"Para mostrar burbujas de notificación, activa las notificaciones de <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="msg_missing_notification_access" msgid="281113995110910548">"Para mostrar puntos de notificación, activa las notificaciones de <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="title_change_settings" msgid="1376365968844349552">"Cambiar ajustes"</string>
|
||||
<string name="notification_dots_service_title" msgid="4284221181793592871">"Mostrar burbujas de notificación"</string>
|
||||
<string name="notification_dots_service_title" msgid="4284221181793592871">"Mostrar puntos de notificación"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Añadir icono a la pantalla de inicio"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Para aplicaciones nuevas"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"Desconocido"</string>
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
<string name="safemode_shortcut_error" msgid="9160126848219158407">"Allalaetud rakendus on turvarežiimis keelatud"</string>
|
||||
<string name="safemode_widget_error" msgid="4863470563535682004">"Turvarežiimis on vidinad keelatud"</string>
|
||||
<string name="shortcut_not_available" msgid="2536503539825726397">"Otsetee pole saadaval"</string>
|
||||
<string name="home_screen" msgid="806512411299847073">"Avaekraan"</string>
|
||||
<string name="home_screen" msgid="806512411299847073">"Avakuva"</string>
|
||||
<string name="custom_actions" msgid="3747508247759093328">"Kohandatud toimingud"</string>
|
||||
<string name="long_press_widget_to_add" msgid="7699152356777458215">"Vidina valimiseks vajutage ja hoidke seda all."</string>
|
||||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Topeltpuudutage ja hoidke vidina valimiseks või kohandatud toimingute kasutamiseks."</string>
|
||||
|
@ -48,16 +48,16 @@
|
|||
<string name="all_apps_button_label" msgid="8130441508702294465">"Rakenduste loend"</string>
|
||||
<string name="all_apps_button_personal_label" msgid="1315764287305224468">"Isiklike rakenduste loend"</string>
|
||||
<string name="all_apps_button_work_label" msgid="7270707118948892488">"Töörakenduste loend"</string>
|
||||
<string name="all_apps_home_button_label" msgid="252062713717058851">"Avaekraan"</string>
|
||||
<string name="all_apps_home_button_label" msgid="252062713717058851">"Avakuva"</string>
|
||||
<string name="remove_drop_target_label" msgid="7812859488053230776">"Eemalda"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"Desinstalli"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Rakenduse teave"</string>
|
||||
<string name="install_drop_target_label" msgid="2539096853673231757">"Installimine"</string>
|
||||
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installi otseteed"</string>
|
||||
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Võimaldab rakendusel lisada otseteid kasutaja sekkumiseta."</string>
|
||||
<string name="permlab_read_settings" msgid="1941457408239617576">"loe avaekraani seadeid ja otseteid"</string>
|
||||
<string name="permlab_read_settings" msgid="1941457408239617576">"avakuva seadete ja otseteede lugemine"</string>
|
||||
<string name="permdesc_read_settings" msgid="5833423719057558387">"Võimaldab rakendusel lugeda avaekraanil seadeid ja otseteid."</string>
|
||||
<string name="permlab_write_settings" msgid="3574213698004620587">"kirjuta avaekraani seaded ja otseteed"</string>
|
||||
<string name="permlab_write_settings" msgid="3574213698004620587">"avakuva seadete ja otseteede kirjutamine"</string>
|
||||
<string name="permdesc_write_settings" msgid="5440712911516509985">"Võimaldab rakendusel muuta avaekraanil seadeid ja otseteid."</string>
|
||||
<string name="msg_no_phone_permission" msgid="9208659281529857371">"Rakendusel <xliff:g id="APP_NAME">%1$s</xliff:g> pole lubatud helistada"</string>
|
||||
<string name="gadget_error_text" msgid="6081085226050792095">"Probleem vidina laadimisel"</string>
|
||||
|
@ -70,8 +70,8 @@
|
|||
<item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>, <xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g> märguanne</item>
|
||||
</plurals>
|
||||
<string name="default_scroll_format" msgid="7475544710230993317">"Leht %1$d/%2$d"</string>
|
||||
<string name="workspace_scroll_format" msgid="8458889198184077399">"Avaekraan %1$d/%2$d"</string>
|
||||
<string name="workspace_new_page" msgid="257366611030256142">"Uus avaekraan"</string>
|
||||
<string name="workspace_scroll_format" msgid="8458889198184077399">"Avakuva %1$d/%2$d"</string>
|
||||
<string name="workspace_new_page" msgid="257366611030256142">"Uus avakuva leht"</string>
|
||||
<string name="folder_opened" msgid="94695026776264709">"Kaust on avatud, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
|
||||
<string name="folder_tap_to_close" msgid="4625795376335528256">"Puudutage kausta sulgemiseks"</string>
|
||||
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Puudutage ümbernimetamise salvestamiseks"</string>
|
||||
|
@ -81,9 +81,9 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"Vidinad"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Taustapildid"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Stiilid ja taustapildid"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Avaekraani seaded"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Avakuva seaded"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Keelas administraator"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Luba avaekraani pööramine"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Luba avakuva pööramine"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kui telefoni pööratakse"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Märguandetäpid"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Sees"</string>
|
||||
|
@ -92,7 +92,7 @@
|
|||
<string name="msg_missing_notification_access" msgid="281113995110910548">"Märguandetäppide kuvamiseks lülitage sisse rakenduse <xliff:g id="NAME">%1$s</xliff:g> märguanded"</string>
|
||||
<string name="title_change_settings" msgid="1376365968844349552">"Seadete muutmine"</string>
|
||||
<string name="notification_dots_service_title" msgid="4284221181793592871">"Kuva märguandetäpid"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Lisa ikoon avaekraanile"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Lisa ikoon avakuvasse"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Uute rakenduste puhul"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"Teadmata"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"Eemalda"</string>
|
||||
|
@ -104,7 +104,7 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Teenuse <xliff:g id="NAME">%1$s</xliff:g> vidinad"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"Vidinate loend"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"Vidinate loend on suletud"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Lisa avaekraanile"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Lisa avakuvasse"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"Teisalda üksus siia"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"Üksus lisati avaekraanile"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"Üksus eemaldati"</string>
|
||||
|
|
|
@ -54,11 +54,11 @@
|
|||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Aplikazioaren datuak"</string>
|
||||
<string name="install_drop_target_label" msgid="2539096853673231757">"Instalatu"</string>
|
||||
<string name="permlab_install_shortcut" msgid="5632423390354674437">"Instalatu lasterbideak"</string>
|
||||
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Erabiltzaileak ezer egin gabe lasterbideak gehitzea baimentzen die aplikazioei."</string>
|
||||
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Erabiltzaileak ezer egin gabe lasterbideak gehitzeko baimena ematen die aplikazioei."</string>
|
||||
<string name="permlab_read_settings" msgid="1941457408239617576">"Irakurri hasierako ezarpenak eta lasterbideak"</string>
|
||||
<string name="permdesc_read_settings" msgid="5833423719057558387">"Hasierako pantailako ezarpenak eta lasterbideak irakurtzea baimentzen die aplikazioei."</string>
|
||||
<string name="permdesc_read_settings" msgid="5833423719057558387">"Hasierako pantailako ezarpenak eta lasterbideak irakurtzeko baimena ematen die aplikazioei."</string>
|
||||
<string name="permlab_write_settings" msgid="3574213698004620587">"Idatzi hasierako ezarpenak eta lasterbideak"</string>
|
||||
<string name="permdesc_write_settings" msgid="5440712911516509985">"Hasierako pantailako ezarpenak eta lasterbideak aldatzea baimentzen die aplikazioei."</string>
|
||||
<string name="permdesc_write_settings" msgid="5440712911516509985">"Hasierako pantailako ezarpenak eta lasterbideak aldatzeko baimena ematen die aplikazioei."</string>
|
||||
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ez du telefono-deiak egiteko baimenik"</string>
|
||||
<string name="gadget_error_text" msgid="6081085226050792095">"Arazo bat izan da widgeta kargatzean"</string>
|
||||
<string name="gadget_setup_text" msgid="8274003207686040488">"Konfigurazioa"</string>
|
||||
|
@ -83,7 +83,7 @@
|
|||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Estiloak eta horma-paperak"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Hasierako pantailaren ezarpenak"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratzaileak desgaitu du"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Baimendu hasierako pantaila biratzea"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Eman hasierako pantaila biratzeko baimena"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefonoa biratzen denean"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Jakinarazpen-biribiltxoak"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Aktibatuta"</string>
|
||||
|
@ -93,7 +93,7 @@
|
|||
<string name="title_change_settings" msgid="1376365968844349552">"Aldatu ezarpenak"</string>
|
||||
<string name="notification_dots_service_title" msgid="4284221181793592871">"Erakutsi jakinarazpen-biribiltxoak"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Gehitu ikonoa hasierako pantailan"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Aplikazio berrietan"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Aplikazio berrien kasuan"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"Ezezaguna"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"Kendu"</string>
|
||||
<string name="abandoned_search" msgid="891119232568284442">"Bilatu"</string>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"برای انتخاب یک ابزارک، دو ضربه سریع بزنید و نگهدارید یا از کنشهای سفارشی استفاده کنید."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d عرض در %2$d طول"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"برای قرار دادن بهصورت دستی لمس کنید و بکشید"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"آن را لمس کنید و بکشید تا بهصورت دستی اضافه شود"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"افزودن خودکار"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"جستجوی برنامهها"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"درحال بارگیری برنامهها…"</string>
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
<string name="all_apps_home_button_label" msgid="252062713717058851">"Accueil"</string>
|
||||
<string name="remove_drop_target_label" msgid="7812859488053230776">"Supprimer"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"Désinstaller"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Détails de l\'appli"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Détails de l\'application"</string>
|
||||
<string name="install_drop_target_label" msgid="2539096853673231757">"Installer"</string>
|
||||
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installer des raccourcis"</string>
|
||||
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permet à une application d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur."</string>
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Fonds d\'écran"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Styles et fonds d\'écran"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Paramètres accueil"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Paramètres d\'écran d\'accueil"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Désactivé par votre administrateur"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Autoriser la rotation de l\'écran d\'accueil"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Lorsque vous faites pivoter le téléphone"</string>
|
||||
|
|
|
@ -80,14 +80,14 @@
|
|||
<string name="folder_name_format" msgid="6629239338071103179">"Cartafol: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Fondos de pantalla"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Estilos e fondos de pantalla"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Configuración da pantalla de Inicio"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Estilos/fondos de pantalla"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Axustes de Inicio"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Función desactivada polo administrador"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Permitir xirar a pantalla de inicio"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Ao xirar o teléfono"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Puntos de notificacións"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Opción activada"</string>
|
||||
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Opción desactivada"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activados"</string>
|
||||
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Desactivados"</string>
|
||||
<string name="title_missing_notification_access" msgid="7503287056163941064">"Necesítase acceso ás notificacións"</string>
|
||||
<string name="msg_missing_notification_access" msgid="281113995110910548">"Para que se mostren os puntos de notificacións, activa as notificacións da aplicación <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="title_change_settings" msgid="1376365968844349552">"Cambiar configuración"</string>
|
||||
|
|
|
@ -22,9 +22,9 @@
|
|||
<string name="app_name" msgid="649227358658669779">"Launcher3"</string>
|
||||
<string name="folder_name" msgid="7371454440695724752"></string>
|
||||
<string name="work_folder_name" msgid="3753320833950115786">"कार्यस्थल"</string>
|
||||
<string name="activity_not_found" msgid="8071924732094499514">"एप्लिकेशन इंस्टॉल नहीं है."</string>
|
||||
<string name="activity_not_available" msgid="7456344436509528827">"ऐप्स उपलब्ध नहीं है"</string>
|
||||
<string name="safemode_shortcut_error" msgid="9160126848219158407">"डाउनलोड किए गए ऐप्स सुरक्षित मोड में अक्षम है"</string>
|
||||
<string name="activity_not_found" msgid="8071924732094499514">"ऐप्लिकेशन इंस्टॉल नहीं है."</string>
|
||||
<string name="activity_not_available" msgid="7456344436509528827">"ऐप्लिकेशन उपलब्ध नहीं है"</string>
|
||||
<string name="safemode_shortcut_error" msgid="9160126848219158407">"डाउनलोड किए गए ऐप्लिकेशन सुरक्षित मोड में अक्षम है"</string>
|
||||
<string name="safemode_widget_error" msgid="4863470563535682004">"विजेट सुरक्षित मोड में अक्षम हैं"</string>
|
||||
<string name="shortcut_not_available" msgid="2536503539825726397">"शॉर्टकट उपलब्ध नहीं है"</string>
|
||||
<string name="home_screen" msgid="806512411299847073">"होम स्क्रीन"</string>
|
||||
|
@ -78,7 +78,7 @@
|
|||
<string name="folder_closed" msgid="4100806530910930934">"फ़ोल्डर बंद किया गया"</string>
|
||||
<string name="folder_renamed" msgid="1794088362165669656">"फ़ोल्डर का नाम बदलकर <xliff:g id="NAME">%1$s</xliff:g> किया गया"</string>
|
||||
<string name="folder_name_format" msgid="6629239338071103179">"फ़ोल्डर: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"शॉर्टकट"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"विजेट"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"वॉलपेपर"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"स्टाइल और वॉलपेपर"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"होम पेज की सेटिंग"</string>
|
||||
|
@ -97,9 +97,9 @@
|
|||
<string name="package_state_unknown" msgid="7592128424511031410">"अज्ञात"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"निकालें"</string>
|
||||
<string name="abandoned_search" msgid="891119232568284442">"सर्च करें"</string>
|
||||
<string name="abandoned_promises_title" msgid="7096178467971716750">"यह ऐप्स इंस्टॉल नहीं है"</string>
|
||||
<string name="abandoned_promises_title" msgid="7096178467971716750">"यह ऐप्लिकेशन इंस्टॉल नहीं है"</string>
|
||||
<string name="abandoned_promise_explanation" msgid="3990027586878167529">"इस आइकॉन का ऐप इंस्टॉल नहीं है. आप उसे निकाल सकते हैं या ऐप को खोज कर उसे मैन्युअल रूप से इंस्टॉल कर सकते हैं."</string>
|
||||
<string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> डाउनलोड हो रहा है, <xliff:g id="PROGRESS">%2$s</xliff:g> पूर्ण"</string>
|
||||
<string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> डाउनलोड हो रहा है, <xliff:g id="PROGRESS">%2$s</xliff:g> पूरी हुई"</string>
|
||||
<string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> के इंस्टॉल होने की प्रतीक्षा की जा रही है"</string>
|
||||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> विजेट"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"विजेट की सूची"</string>
|
||||
|
@ -132,7 +132,7 @@
|
|||
<string name="notification_dismissed" msgid="6002233469409822874">"सूचना को खारिज किया गया"</string>
|
||||
<string name="all_apps_personal_tab" msgid="4190252696685155002">"निजी ऐप"</string>
|
||||
<string name="all_apps_work_tab" msgid="4884822796154055118">"काम से जुड़े ऐप"</string>
|
||||
<string name="work_profile_toggle_label" msgid="3081029915775481146">"कार्य प्रोफ़ाइल"</string>
|
||||
<string name="work_profile_toggle_label" msgid="3081029915775481146">"वर्क प्रोफ़ाइल"</string>
|
||||
<string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"काम से जुड़े सभी ऐप्लिकेशन यहां पाएं"</string>
|
||||
<string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"काम से जुड़े हर ऐप्लिकेशन पर एक बैज (निशान) होता है और इन ऐप्लिकेशन की सुरक्षा आपका संगठन करता है. आसानी से इस्तेमाल करने के लिए ऐप्लिकेशन को अपनी होम स्क्रीन पर ले जाएं."</string>
|
||||
<string name="work_mode_on_label" msgid="4781128097185272916">"आपका संगठन प्रबंधित कर रहा है"</string>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Tap dua kalip & tahan untuk mengambil widget atau menggunakan tindakan khusus."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"lebar %1$d x tinggi %2$d"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Sentuh & tahan untuk menempatkan secara manual"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Tap lama untuk menempatkan secara manual"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Tambahkan otomatis"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Telusuri aplikasi"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Memuat aplikasi…"</string>
|
||||
|
@ -81,9 +81,9 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"Widget"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Wallpaper"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Gaya & wallpaper"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Setelan layar Utama"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Setelan layar utama"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dinonaktifkan oleh admin"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Izinkan layar Utama diputar"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Izinkan Layar utama diputar"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Saat ponsel diputar"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Titik notifikasi"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Aktif"</string>
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
<string name="all_apps_button_work_label" msgid="7270707118948892488">"רשימת אפליקציות עבודה"</string>
|
||||
<string name="all_apps_home_button_label" msgid="252062713717058851">"דף הבית"</string>
|
||||
<string name="remove_drop_target_label" msgid="7812859488053230776">"הסר"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"הסר התקנה"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"להסרת התקנה"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"פרטי אפליקציה"</string>
|
||||
<string name="install_drop_target_label" msgid="2539096853673231757">"התקנה"</string>
|
||||
<string name="permlab_install_shortcut" msgid="5632423390354674437">"התקן קיצורי דרך"</string>
|
||||
|
@ -61,7 +61,7 @@
|
|||
<string name="permdesc_write_settings" msgid="5440712911516509985">"מאפשר לאפליקציה לשנות את ההגדרות וקיצורי הדרך בדף הבית."</string>
|
||||
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> אינו רשאי להתקשר"</string>
|
||||
<string name="gadget_error_text" msgid="6081085226050792095">"בעיה בטעינת ווידג\'ט"</string>
|
||||
<string name="gadget_setup_text" msgid="8274003207686040488">"הגדר"</string>
|
||||
<string name="gadget_setup_text" msgid="8274003207686040488">"הגדרה"</string>
|
||||
<string name="uninstall_system_app_text" msgid="4172046090762920660">"זוהי אפליקציית מערכת ולא ניתן להסיר את התקנתה."</string>
|
||||
<string name="folder_hint_text" msgid="6617836969016293992">"תיקיה ללא שם"</string>
|
||||
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> מושבתת"</string>
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"Ені: %1$d, биіктігі: %2$d"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Қолмен қою үшін басып тұрыңыз"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Автоматты енгізу"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Автоматты қосу"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Қолданбаларды іздеу"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Қолданбалар жүктелуде…"</string>
|
||||
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" сұрауына сәйкес келетін қолданбалар жоқ"</string>
|
||||
|
|
|
@ -84,7 +84,7 @@
|
|||
<string name="settings_button_text" msgid="8873672322605444408">"ការកំណត់ទំព័រដើម"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"អនុញ្ញាតការបងិ្វលអេក្រង់ដើម"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"នៅពេលដែលបង្វិលទូរស័ព្ទរបស់អ្នក"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"នៅពេលដែលបង្វិលទូរសព្ទ"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"ស្លាកជូនដំណឹង"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"បើក"</string>
|
||||
<string name="notification_dots_desc_off" msgid="1760796511504341095">"បិទ"</string>
|
||||
|
@ -104,7 +104,7 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"ធាតុក្រាហ្វិក <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"បញ្ជីធាតុក្រាហ្វិក"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"បានបិទបញ្ជីធាតុក្រាហ្វិក"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"បន្ថែមទៅអេក្រង់ដើម"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"បញ្ចូលទៅអេក្រង់ដើម"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"ផ្លាស់ធាតុមកទីនេះ"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"ធាតុដែលត្រូវបានបន្ថែមទៅអេក្រង់ដើម"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"ធាតុដែលបានដកចេញ"</string>
|
||||
|
|
|
@ -104,7 +104,7 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> ವಿಜೆಟ್ಗಳು"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"ವಿಜೆಟ್ ಪಟ್ಟಿ"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"ವಿಜೆಟ್ ಪಟ್ಟಿಯನ್ನು ಮುಚ್ಚಲಾಗಿದೆ"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"ಮುಖಪುಟಕ್ಕೆ ಸೇರಿಸು"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"ಮುಖಪುಟಕ್ಕೆ ಸೇರಿಸಿ"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"ಐಟಂ ಇಲ್ಲಿಗೆ ಸರಿಸಿ"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"ಮುಖಪುಟ ಪರದೆಗೆ ಐಟಂ ಸೇರಿಸಲಾಗಿದೆ"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"ಐಟಂ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Виджет тандоо үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"Туурасы: %1$d, бийиктиги: %2$d"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Кол менен жайгаштыруу үчүн басып туруп, таштаңыз"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Кол менен кошуу үчүн кое бербей басып туруңуз"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Автоматтык түрдө кошуу"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Колдонмолорду издөө"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Колдонмолор жүктөлүүдө…"</string>
|
||||
|
@ -81,7 +81,7 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"Виджеттер"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Тушкагаздар"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Стилдер жана тушкагаздар"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Башкы беттин жөндөөлөрү"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Башкы бет жөндөөлөрү"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Администраторуңуз өчүрүп койгон"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Башкы экранды айлантууга уруксат берүү"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон айланганда"</string>
|
||||
|
|
|
@ -78,7 +78,7 @@
|
|||
<string name="folder_closed" msgid="4100806530910930934">"ഫോൾഡർ അടച്ചു"</string>
|
||||
<string name="folder_renamed" msgid="1794088362165669656">"ഫോൾഡറിന്റെ പേര് <xliff:g id="NAME">%1$s</xliff:g> എന്നായി മാറ്റി"</string>
|
||||
<string name="folder_name_format" msgid="6629239338071103179">"ഫോൾഡർ: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"വിജറ്റുകൾ"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"വിഡ്ജെറ്റുകൾ"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"വാൾപേപ്പർ"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"സ്റ്റൈലുകളും വാൾപേപ്പറുകളും"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"ഹോം ക്രമീകരണം"</string>
|
||||
|
|
|
@ -104,7 +104,7 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> жижиг хэрэгсэл"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"Жижиг хэрэгслийн жагсаалт"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"Жижиг хэрэгслийн жагсаалтыг хаасан"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Нүүр дэлгэц нэмэх"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Нүүр дэлгэцэд нэмэх"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"Энд байршуулах"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"Нүүр дэлгэцэнд нэмсэн зүйл"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"Арилгасан зүйл"</string>
|
||||
|
|
|
@ -66,8 +66,8 @@
|
|||
<string name="folder_hint_text" msgid="6617836969016293992">"अनामित फोल्डर"</string>
|
||||
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> अक्षम केला आहे"</string>
|
||||
<plurals name="dotted_app_label" formatted="false" msgid="5194538107138265416">
|
||||
<item quantity="one"><xliff:g id="APP_NAME_2">%1$s</xliff:g>साठी<xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g>सूचना आहेत</item>
|
||||
<item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g>साठी <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> सूचना आहेत</item>
|
||||
<item quantity="one"><xliff:g id="APP_NAME_0">%1$s</xliff:g>साठी<xliff:g id="NOTIFICATION_COUNT_1">%2$d</xliff:g>सूचना आहे</item>
|
||||
</plurals>
|
||||
<string name="default_scroll_format" msgid="7475544710230993317">"%2$d पैकी %1$d पृष्ठ"</string>
|
||||
<string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d पैकी %1$d मुख्य स्क्रीन"</string>
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
<string name="all_apps_button_work_label" msgid="7270707118948892488">"အလုပ်သုံး အက်ပ်စာရင်း"</string>
|
||||
<string name="all_apps_home_button_label" msgid="252062713717058851">"ပင်မစာမျက်နှာ"</string>
|
||||
<string name="remove_drop_target_label" msgid="7812859488053230776">"ဖယ်ရှားမည်"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"ဖယ်ထုတ်မည်"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"ဖြုတ်ရန်"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"အက်ပ်အချက်အလက်များ"</string>
|
||||
<string name="install_drop_target_label" msgid="2539096853673231757">"ထည့်သွင်းရန်"</string>
|
||||
<string name="permlab_install_shortcut" msgid="5632423390354674437">"အတိုကောက်မှတ်သားမှုများအား ထည့်သွင်းခြင်း"</string>
|
||||
|
@ -94,7 +94,7 @@
|
|||
<string name="notification_dots_service_title" msgid="4284221181793592871">"သတိပေးချက် အစက်များ ပြရန်"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"ပင်မစာမျက်နှာသို့ သင်္ကေတပုံ ထည့်ရန်"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"အက်ပ်အသစ်များအတွက်"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"မသိရ"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"မသိ"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"ဖယ်ရှားရန်"</string>
|
||||
<string name="abandoned_search" msgid="891119232568284442">"ရှာဖွေရန်"</string>
|
||||
<string name="abandoned_promises_title" msgid="7096178467971716750">"အက်ပ်မတပ်ဆင်ရသေးပါ"</string>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Dubbeltik en blijf aanraken om een widget toe te voegen of aangepaste acties te gebruiken."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d breed en %2$d hoog"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Tik op een item en houd dit vast om het handmatig te plaatsen"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Tik en houd vast om handmatig te plaatsen"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Automatisch toevoegen"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Apps zoeken"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Apps laden…"</string>
|
||||
|
@ -80,7 +80,7 @@
|
|||
<string name="folder_name_format" msgid="6629239338071103179">"Map: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Achtergrond"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Stijlen en achtergronden"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Stijl en achtergrond"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Instellingen startscherm"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Uitgeschakeld door je beheerder"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Draaien van startscherm toestaan"</string>
|
||||
|
|
|
@ -106,7 +106,7 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> – widżety"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"Lista widgetów"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"Lista widgetów zamknięta"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Dodaj do strony głównej"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Dodaj do ekranu głównego"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"Przenieś element tutaj"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"Element został dodany do ekranu głównego"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"Element został usunięty"</string>
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Imagens de fundo"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Estilos e imagens de fundo"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Definições da página inicial"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Definições de início"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desativada pelo gestor"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Permitir rotação do ecrã principal"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Quando o telemóvel é rodado"</string>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Toque duas vezes e segure para selecionar um widget ou usar ações personalizadas."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d de largura por %2$d de altura"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Toque e mantenha pressionado para posicionar manualmente"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Toque e mantenha pressionado para mover manualmente"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Adicionar automaticamente"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Apps de pesquisa"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Carregando apps…"</string>
|
||||
|
@ -81,7 +81,7 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Planos de fundo"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Estilos e planos de fundo"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Configurações da tela inicial"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Config. tela inicial"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desativado pelo administrador"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Permitir rotação da tela inicial"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Quando o smartphone for girado"</string>
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
<string name="all_apps_home_button_label" msgid="252062713717058851">"Ecran de pornire"</string>
|
||||
<string name="remove_drop_target_label" msgid="7812859488053230776">"Eliminați"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"Dezinstalați"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Informații aplicație"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Informații despre aplicații"</string>
|
||||
<string name="install_drop_target_label" msgid="2539096853673231757">"Instalați"</string>
|
||||
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instalează comenzi rapide"</string>
|
||||
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite unei aplicații să adauge comenzi rapide fără intervenția utilizatorului."</string>
|
||||
|
@ -82,9 +82,9 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"Widgeturi"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Imagini de fundal"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Stiluri și imagini de fundal"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Setări pentru ecranul de pornire"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Setări ecran de pornire"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dezactivată de administrator"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Permiteți rotirea ecranului de pornire"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Permite rotirea ecranului de pornire"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Când telefonul este rotit"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Puncte de notificare"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activate"</string>
|
||||
|
|
|
@ -82,8 +82,8 @@
|
|||
<string name="folder_name_format" msgid="6629239338071103179">"Папка: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"Виджеты"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Обои"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Темы и обои"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Настройки главного экрана"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Стили и обои"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Главный экран"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Функция отключена администратором"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Разрешить поворачивать главный экран"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Когда телефон повернут"</string>
|
||||
|
|
|
@ -80,8 +80,8 @@
|
|||
<string name="folder_name_format" msgid="6629239338071103179">"ෆෝල්ඩරය: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"විජට්"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"වෝල්පේපර"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"විලාස සහ බිතුපත්"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Home සැකසීම්"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"විලාස සහ වෝල්පේපර"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"නිවසේ සැකසීම්"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ඔබගේ පරිපාලක විසින් අබල කරන ලදී"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"මුල් පිටු තිරය කරකැවීමට ඉඩ දෙන්න"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"දුරකථනය කරකවන විට"</string>
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"Miniaplikácie"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Tapety"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Štýly a tapety"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Nastavenia Home"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Nastavenia plochy"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Zakázané vaším správcom"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Povoliť otáčanie plochy"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Pri otočení telefónu"</string>
|
||||
|
|
|
@ -105,7 +105,7 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Виџети за <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"Листа виџета"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"Листа виџета је затворена"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Додај на почетни екран"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Додајте на почетни екран"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"Премести ставку овде"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"Ставка је додата на почетни екран"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"Ставка је уклоњена"</string>
|
||||
|
|
|
@ -106,7 +106,7 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Wijeti za <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"Orodha ya wijeti"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"Orodha ya wijeti imefungwa"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Ongeza kwenye skrini ya Kwanza"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Ongeza kwenye Skrini ya Kwanza"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"Hamishia kipengee hapa"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"Kipengee kimeongezwa kwenye skrini ya kwanza"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"Kipengee kimeondolewa"</string>
|
||||
|
|
|
@ -22,9 +22,9 @@
|
|||
<string name="app_name" msgid="649227358658669779">"Launcher3"</string>
|
||||
<string name="folder_name" msgid="7371454440695724752"></string>
|
||||
<string name="work_folder_name" msgid="3753320833950115786">"பணியிடம்"</string>
|
||||
<string name="activity_not_found" msgid="8071924732094499514">"பயன்பாடு நிறுவப்படவில்லை."</string>
|
||||
<string name="activity_not_available" msgid="7456344436509528827">"பயன்பாடு இல்லை"</string>
|
||||
<string name="safemode_shortcut_error" msgid="9160126848219158407">"இறக்கிய பயன்பாடு பாதுகாப்பு முறையில் முடக்கப்பட்டது"</string>
|
||||
<string name="activity_not_found" msgid="8071924732094499514">"ஆப்ஸ் நிறுவப்படவில்லை."</string>
|
||||
<string name="activity_not_available" msgid="7456344436509528827">"ஆப்ஸ் இல்லை"</string>
|
||||
<string name="safemode_shortcut_error" msgid="9160126848219158407">"இறக்கிய ஆப்ஸ் பாதுகாப்பு முறையில் முடக்கப்பட்டது"</string>
|
||||
<string name="safemode_widget_error" msgid="4863470563535682004">"பாதுகாப்புப் பயன்முறையில் விட்ஜெட்கள் முடக்கப்பட்டுள்ளன"</string>
|
||||
<string name="shortcut_not_available" msgid="2536503539825726397">"ஷார்ட்கட் இல்லை"</string>
|
||||
<string name="home_screen" msgid="806512411299847073">"முகப்புத் திரை"</string>
|
||||
|
@ -51,18 +51,18 @@
|
|||
<string name="all_apps_home_button_label" msgid="252062713717058851">"முகப்பு"</string>
|
||||
<string name="remove_drop_target_label" msgid="7812859488053230776">"அகற்று"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"நிறுவல் நீக்கு"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"பயன்பாட்டுத் தகவல்"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"ஆப்ஸ் தகவல்"</string>
|
||||
<string name="install_drop_target_label" msgid="2539096853673231757">"நிறுவு"</string>
|
||||
<string name="permlab_install_shortcut" msgid="5632423390354674437">"குறுக்குவழிகளை நிறுவுதல்"</string>
|
||||
<string name="permdesc_install_shortcut" msgid="923466509822011139">"பயனரின் அனுமதி இல்லாமல் குறுக்குவழிகளைச் சேர்க்கப் பயன்பாட்டை அனுமதிக்கிறது."</string>
|
||||
<string name="permdesc_install_shortcut" msgid="923466509822011139">"பயனரின் அனுமதி இல்லாமல் குறுக்குவழிகளைச் சேர்க்கப் ஆப்ஸை அனுமதிக்கிறது."</string>
|
||||
<string name="permlab_read_settings" msgid="1941457408239617576">"முகப்பின் அமைப்பு மற்றும் குறுக்குவழிகளைப் படித்தல்"</string>
|
||||
<string name="permdesc_read_settings" msgid="5833423719057558387">"முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது."</string>
|
||||
<string name="permdesc_read_settings" msgid="5833423719057558387">"முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளைப் படிக்க ஆப்ஸை அனுமதிக்கிறது."</string>
|
||||
<string name="permlab_write_settings" msgid="3574213698004620587">"முகப்பின் அமைப்பு மற்றும் குறுக்குவழிகளை எழுதுதல்"</string>
|
||||
<string name="permdesc_write_settings" msgid="5440712911516509985">"முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளை மாற்ற பயன்பாட்டை அனுமதிக்கிறது."</string>
|
||||
<string name="permdesc_write_settings" msgid="5440712911516509985">"முகப்பில் உள்ள அமைப்பு மற்றும் குறுக்குவழிகளை மாற்ற ஆப்ஸை அனுமதிக்கிறது."</string>
|
||||
<string name="msg_no_phone_permission" msgid="9208659281529857371">"ஃபோன் அழைப்புகள் செய்ய, <xliff:g id="APP_NAME">%1$s</xliff:g> அனுமதிக்கப்படவில்லை"</string>
|
||||
<string name="gadget_error_text" msgid="6081085226050792095">"விட்ஜெட்டை ஏற்றுவதில் சிக்கல்"</string>
|
||||
<string name="gadget_setup_text" msgid="8274003207686040488">"அமைவு"</string>
|
||||
<string name="uninstall_system_app_text" msgid="4172046090762920660">"இது அமைப்பு பயன்பாடு என்பதால் நிறுவல் நீக்கம் செய்ய முடியாது."</string>
|
||||
<string name="uninstall_system_app_text" msgid="4172046090762920660">"இது அமைப்பு ஆப்ஸ் என்பதால் நிறுவல் நீக்கம் செய்ய முடியாது."</string>
|
||||
<string name="folder_hint_text" msgid="6617836969016293992">"பெயரிடப்படாத கோப்புறை"</string>
|
||||
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> முடக்கப்பட்டது"</string>
|
||||
<plurals name="dotted_app_label" formatted="false" msgid="5194538107138265416">
|
||||
|
@ -78,7 +78,7 @@
|
|||
<string name="folder_closed" msgid="4100806530910930934">"கோப்புறை மூடப்பட்டது"</string>
|
||||
<string name="folder_renamed" msgid="1794088362165669656">"கோப்புறை <xliff:g id="NAME">%1$s</xliff:g> என மறுபெயரிடப்பட்டது"</string>
|
||||
<string name="folder_name_format" msgid="6629239338071103179">"கோப்புறை: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"ஷார்ட்கட்ஸ்"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"விட்ஜெட்கள்"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"வால்பேப்பர்கள்"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"ஸ்டைல்கள் & வால்பேப்பர்கள்"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"முகப்பு அமைப்புகள்"</string>
|
||||
|
@ -93,12 +93,12 @@
|
|||
<string name="title_change_settings" msgid="1376365968844349552">"அமைப்புகளை மாற்று"</string>
|
||||
<string name="notification_dots_service_title" msgid="4284221181793592871">"அறிவிப்புப் புள்ளிகளைக் காட்டு"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"முகப்புத் திரையில் ஐகானைச் சேர்"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"புதிய பயன்பாடுகளுக்கு"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"புதிய ஆப்ஸை நிறுவும்போது"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"தெரியாதது"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"அகற்று"</string>
|
||||
<string name="abandoned_search" msgid="891119232568284442">"தேடு"</string>
|
||||
<string name="abandoned_promises_title" msgid="7096178467971716750">"பயன்பாடு நிறுவப்படவில்லை"</string>
|
||||
<string name="abandoned_promise_explanation" msgid="3990027586878167529">"ஐகானுக்கான பயன்பாடு நிறுவப்படவில்லை. இதை அகற்றலாம் அல்லது பயன்பாட்டைத் தேடி கைமுறையாக நிறுவலாம்."</string>
|
||||
<string name="abandoned_promises_title" msgid="7096178467971716750">"ஆப்ஸ் நிறுவப்படவில்லை"</string>
|
||||
<string name="abandoned_promise_explanation" msgid="3990027586878167529">"ஐகானுக்கான ஆப்ஸ் நிறுவப்படவில்லை. இதை அகற்றலாம் அல்லது பயன்பாட்டைத் தேடி கைமுறையாக நிறுவலாம்."</string>
|
||||
<string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g>ஐப் பதிவிறக்குகிறது, <xliff:g id="PROGRESS">%2$s</xliff:g> முடிந்தது"</string>
|
||||
<string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g>ஐ நிறுவுவதற்காகக் காத்திருக்கிறது"</string>
|
||||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> விட்ஜெட்டுகள்"</string>
|
||||
|
|
|
@ -80,7 +80,7 @@
|
|||
<string name="folder_name_format" msgid="6629239338071103179">"ఫోల్డర్: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"విడ్జెట్లు"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"వాల్పేపర్లు"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"శైలులు & వాల్పేపర్లు"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"స్టయిల్స్ & వాల్పేపర్లు"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"హోమ్ సెట్టింగ్లు"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"మీ నిర్వాహకులు నిలిపివేసారు"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"హోమ్ స్క్రీన్ భ్రమణాన్ని అనుమతించండి"</string>
|
||||
|
|
|
@ -98,7 +98,7 @@
|
|||
<string name="abandoned_clean_this" msgid="7610119707847920412">"Alisin"</string>
|
||||
<string name="abandoned_search" msgid="891119232568284442">"Maghanap"</string>
|
||||
<string name="abandoned_promises_title" msgid="7096178467971716750">"Hindi naka-install ang app na ito"</string>
|
||||
<string name="abandoned_promise_explanation" msgid="3990027586878167529">"Hindi naka-install ang app para sa icon na ito. Maaari mo itong alisin, o maaari mong hanapin ang app at i-install ito nang manu-mano."</string>
|
||||
<string name="abandoned_promise_explanation" msgid="3990027586878167529">"Hindi naka-install ang app para sa icon na ito. Puwede mo itong alisin, o maaari mong hanapin ang app at i-install ito nang manual."</string>
|
||||
<string name="app_downloading_title" msgid="8336702962104482644">"Dina-download na ang <xliff:g id="NAME">%1$s</xliff:g>, tapos na ang <xliff:g id="PROGRESS">%2$s</xliff:g>"</string>
|
||||
<string name="app_waiting_download_title" msgid="7053938513995617849">"Hinihintay nang mag-install ang <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"Mga widget ng <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
|
|
|
@ -82,8 +82,8 @@
|
|||
<string name="folder_name_format" msgid="6629239338071103179">"Папка <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"Віджети"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Фонові малюнки"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Стилі й фонові малюнки"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Налаштування Home"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Стиль і фон"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Налаштування головного екрана"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Вимкнув адміністратор"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Дозволити обертання головного екрана"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Коли телефон обертається"</string>
|
||||
|
@ -94,7 +94,7 @@
|
|||
<string name="msg_missing_notification_access" msgid="281113995110910548">"Щоб показувати значки сповіщень, увімкніть сповіщення в додатку <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="title_change_settings" msgid="1376365968844349552">"Змінити налаштування"</string>
|
||||
<string name="notification_dots_service_title" msgid="4284221181793592871">"Показувати значки сповіщень"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Додати значок на головний екран"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Додавати значок на головний екран"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Для нових додатків"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"Невідомо"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"Прибрати"</string>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"کوئی ویجٹ منتخب کرنے یا حسب ضرورت کاروائیاں استعمال کرنے کیلئے دو بار تھپتھپائیں اور پکڑے رکھیں۔"</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d چوڑا اور %2$d اونچا"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"دستی طور پر رکھنے کیلئے & ٹچ کرکے ہولڈ کریں"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"دستی طور پر رکھنے کیلئے ٹچ کر کے دبائے رکھیں"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"خود کار طور پر شامل کریں"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ایپس تلاش کریں"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"ایپس لوڈ کی جا رہی ہیں…"</string>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Ikki marta bosib va bosib turgan holatda vidjetni tanlang yoki maxsus amaldan foydalaning."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"Eni %1$d, bo‘yi %2$d"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Qo‘lda joylashtirish uchun bosib turing"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Joylash uchun bosib turing"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Avtomatik chiqarish"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Ilovalarni qidirish"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Ilovalar yuklanmoqda…"</string>
|
||||
|
@ -83,7 +83,7 @@
|
|||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Mavzu va fon rasmlari"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Bosh ekran sozlamalari"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administrator tomonidan o‘chirilgan"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Asosiy ekranni aylantirishga ruxsat berish"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"Bosh ekranni burishga ruxsat"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon burilganda"</string>
|
||||
<string name="notification_dots_title" msgid="9062440428204120317">"Bildirishnoma belgilari"</string>
|
||||
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Yoniq"</string>
|
||||
|
@ -95,7 +95,7 @@
|
|||
<string name="auto_add_shortcuts_label" msgid="8222286205987725611">"Bosh ekranga ikonka chiqarish"</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Yangi o‘rnatilgan ilovalar ikonkasini bosh ekranga chiqarish"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"Noma’lum"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"O‘chirish"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"Olib tashlash"</string>
|
||||
<string name="abandoned_search" msgid="891119232568284442">"Qidirish"</string>
|
||||
<string name="abandoned_promises_title" msgid="7096178467971716750">"Ushbu ilova o‘rnatilmagan"</string>
|
||||
<string name="abandoned_promise_explanation" msgid="3990027586878167529">"Ilova o‘rnatilmagan. Belgini o‘chirib tashlashingiz yoki ilovani topib, uni qo‘lda o‘rnatishingiz mumkin."</string>
|
||||
|
@ -104,15 +104,15 @@
|
|||
<string name="widgets_bottom_sheet_title" msgid="2904559530954183366">"<xliff:g id="NAME">%1$s</xliff:g> vidjetlari"</string>
|
||||
<string name="widgets_list" msgid="796804551140113767">"Vidjetlar ro‘yxati"</string>
|
||||
<string name="widgets_list_closed" msgid="6141506579418771922">"Vidjetlar ro‘yxati yopildi"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Bosh ekranga qo‘shish"</string>
|
||||
<string name="action_add_to_workspace" msgid="8902165848117513641">"Bosh ekranga chiqarish"</string>
|
||||
<string name="action_move_here" msgid="2170188780612570250">"Obyektni bu yerga ko‘chirish"</string>
|
||||
<string name="item_added_to_workspace" msgid="4211073925752213539">"Obyekt bosh ekranga qo‘shildi"</string>
|
||||
<string name="item_removed" msgid="851119963877842327">"Obyekt o‘chirib tashlandi"</string>
|
||||
<string name="undo" msgid="4151576204245173321">"Qaytarish"</string>
|
||||
<string name="action_move" msgid="4339390619886385032">"Obyektni ko‘chirib o‘tkazish"</string>
|
||||
<string name="move_to_empty_cell" msgid="2833711483015685619">"<xliff:g id="NUMBER_0">%1$s</xliff:g> <xliff:g id="NUMBER_1">%2$s</xliff:g> katakka ko‘chirib o‘tkazish"</string>
|
||||
<string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g>-joyga ko‘chirib o‘tkazish"</string>
|
||||
<string name="move_to_hotseat_position" msgid="6295412897075147808">"Sevimlilarga (<xliff:g id="NUMBER">%1$s</xliff:g>) ko‘chirib o‘tkazish"</string>
|
||||
<string name="move_to_empty_cell" msgid="2833711483015685619">"<xliff:g id="NUMBER_0">%1$s</xliff:g> <xliff:g id="NUMBER_1">%2$s</xliff:g> katakka olish"</string>
|
||||
<string name="move_to_position" msgid="6750008980455459790">"<xliff:g id="NUMBER">%1$s</xliff:g>-joyga olish"</string>
|
||||
<string name="move_to_hotseat_position" msgid="6295412897075147808">"Sevimlilarga olish (<xliff:g id="NUMBER">%1$s</xliff:g>)"</string>
|
||||
<string name="item_moved" msgid="4606538322571412879">"Element ko‘chirib o‘tkazildi"</string>
|
||||
<string name="add_to_folder" msgid="9040534766770853243">"<xliff:g id="NAME">%1$s</xliff:g> jildiga qo‘shish"</string>
|
||||
<string name="add_to_folder_with_app" msgid="4534929978967147231">"<xliff:g id="NAME">%1$s</xliff:g> ilovasi bor jildga qo‘shish"</string>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Nhấn đúp và giữ để chọn tiện ích hoặc sử dụng tác vụ tùy chỉnh."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"Rộng %1$d x cao %2$d"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Chạm và giữ để đặt theo cách thủ công"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Chạm và giữ để thêm theo cách thủ công"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Tự động thêm"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Tìm kiếm ứng dụng"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Đang tải ứng dụng…"</string>
|
||||
|
@ -78,7 +78,7 @@
|
|||
<string name="folder_closed" msgid="4100806530910930934">"Đã đóng thư mục"</string>
|
||||
<string name="folder_renamed" msgid="1794088362165669656">"Đã đổi tên thư mục thành <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="folder_name_format" msgid="6629239338071103179">"Thư mục: <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"Tiện ích con"</string>
|
||||
<string name="widget_button_text" msgid="2880537293434387943">"Tiện ích"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"Hình nền"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"Kiểu và hình nền"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Cài đặt màn hình chính"</string>
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"小工具"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"桌布"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"樣式和桌布"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"主螢幕設定"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"主畫面設定"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已由您的管理員停用"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"允許主畫面旋轉"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"當手機旋轉時"</string>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"輕觸兩下並按住小工具即可選取,你也可以使用自訂動作。"</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"寬度為 %1$d,高度為 %2$d"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"按住即可手動放置"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"按住圖示即可手動新增"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"自動新增"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"搜尋應用程式"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"正在載入應用程式…"</string>
|
||||
|
@ -81,7 +81,7 @@
|
|||
<string name="widget_button_text" msgid="2880537293434387943">"小工具"</string>
|
||||
<string name="wallpaper_button_text" msgid="8404103075899945851">"桌布"</string>
|
||||
<string name="styles_wallpaper_button_text" msgid="4342122323125579619">"樣式和桌布"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"Home 設定"</string>
|
||||
<string name="settings_button_text" msgid="8873672322605444408">"主螢幕設定"</string>
|
||||
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已由你的管理員停用"</string>
|
||||
<string name="allow_rotation_title" msgid="7728578836261442095">"允許旋轉主螢幕"</string>
|
||||
<string name="allow_rotation_desc" msgid="8662546029078692509">"當手機旋轉時"</string>
|
||||
|
|
|
@ -71,6 +71,7 @@
|
|||
<string name="main_process_initializer_class" translatable="false"></string>
|
||||
<string name="system_shortcut_factory_class" translatable="false"></string>
|
||||
<string name="app_launch_tracker_class" translatable="false"></string>
|
||||
<string name="test_information_handler_class" translatable="false"></string>
|
||||
|
||||
<!-- Package name of the default wallpaper picker. -->
|
||||
<string name="wallpaper_picker_package" translatable="false"></string>
|
||||
|
|
|
@ -34,6 +34,7 @@ import com.android.launcher3.LauncherSettings.Favorites;
|
|||
import com.android.launcher3.compat.LauncherAppsCompat;
|
||||
import com.android.launcher3.model.AppLaunchTracker;
|
||||
import com.android.launcher3.shortcuts.DeepShortcutManager;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.uioverrides.DisplayRotationListener;
|
||||
import com.android.launcher3.uioverrides.WallpaperColorInfo;
|
||||
import com.android.launcher3.util.Themes;
|
||||
|
@ -134,8 +135,8 @@ public abstract class BaseDraggingActivity extends BaseActivity
|
|||
|
||||
public boolean startActivitySafely(View v, Intent intent, @Nullable ItemInfo item,
|
||||
@Nullable String sourceContainer) {
|
||||
if (com.android.launcher3.TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(com.android.launcher3.TestProtocol.NO_START_TAG,
|
||||
if (TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_START_TAG,
|
||||
"startActivitySafely 1");
|
||||
}
|
||||
if (mIsSafeModeEnabled && !Utilities.isSystemApp(this, intent)) {
|
||||
|
@ -161,8 +162,8 @@ public abstract class BaseDraggingActivity extends BaseActivity
|
|||
startShortcutIntentSafely(intent, optsBundle, item, sourceContainer);
|
||||
} else if (user == null || user.equals(Process.myUserHandle())) {
|
||||
// Could be launching some bookkeeping activity
|
||||
if (com.android.launcher3.TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(com.android.launcher3.TestProtocol.NO_START_TAG,
|
||||
if (TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_START_TAG,
|
||||
"startActivitySafely 2");
|
||||
}
|
||||
startActivity(intent, optsBundle);
|
||||
|
|
|
@ -288,7 +288,9 @@ public class InvariantDeviceProfile {
|
|||
InvariantDeviceProfile oldProfile = new InvariantDeviceProfile(this);
|
||||
|
||||
// Re-init grid
|
||||
initGrid(context, Utilities.getPrefs(context).getString(KEY_IDP_GRID_NAME, null));
|
||||
// TODO(b/131867841): We pass in null here so that we can calculate the closest profile
|
||||
// without the bias of the grid name.
|
||||
initGrid(context, null);
|
||||
|
||||
int changeFlags = 0;
|
||||
if (numRows != oldProfile.numRows ||
|
||||
|
|
|
@ -29,6 +29,7 @@ import static com.android.launcher3.LauncherState.OVERVIEW_PEEK;
|
|||
import static com.android.launcher3.dragndrop.DragLayer.ALPHA_INDEX_LAUNCHER_LOAD;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newTarget;
|
||||
import static com.android.launcher3.states.RotationHelper.REQUEST_NONE;
|
||||
import static com.android.launcher3.util.RaceConditionTracker.ENTER;
|
||||
import static com.android.launcher3.util.RaceConditionTracker.EXIT;
|
||||
|
||||
|
@ -76,8 +77,6 @@ import android.view.accessibility.AccessibilityEvent;
|
|||
import android.view.animation.OvershootInterpolator;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.DropTarget.DragObject;
|
||||
import com.android.launcher3.accessibility.LauncherAccessibilityDelegate;
|
||||
import com.android.launcher3.allapps.AllAppsContainerView;
|
||||
|
@ -110,6 +109,7 @@ import com.android.launcher3.popup.PopupDataProvider;
|
|||
import com.android.launcher3.shortcuts.DeepShortcutManager;
|
||||
import com.android.launcher3.states.InternalStateHandler;
|
||||
import com.android.launcher3.states.RotationHelper;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.touch.ItemClickHandler;
|
||||
import com.android.launcher3.uioverrides.UiFactory;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||
|
@ -154,6 +154,8 @@ import java.util.HashSet;
|
|||
import java.util.List;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* Default launcher application.
|
||||
*/
|
||||
|
@ -406,6 +408,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
|
|||
super.onEnterAnimationComplete();
|
||||
UiFactory.onEnterAnimationComplete(this);
|
||||
mAllAppsController.highlightWorkTabIfNecessary();
|
||||
mRotationHelper.setCurrentTransitionRequest(REQUEST_NONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -487,9 +490,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
|
|||
mDeviceProfile = mDeviceProfile.getMultiWindowProfile(this, mwSize);
|
||||
}
|
||||
|
||||
if (supportsFakeLandscapeUI()
|
||||
&& mDeviceProfile.isVerticalBarLayout()
|
||||
&& !mDeviceProfile.isMultiWindowMode) {
|
||||
if (supportsFakeLandscapeUI() && mDeviceProfile.isVerticalBarLayout()) {
|
||||
mStableDeviceProfile = mDeviceProfile.inv.portraitProfile;
|
||||
mRotationMode = UiFactory.getRotationMode(mDeviceProfile);
|
||||
} else {
|
||||
|
@ -497,6 +498,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
|
|||
mRotationMode = RotationMode.NORMAL;
|
||||
}
|
||||
|
||||
mRotationHelper.updateRotationAnimation();
|
||||
onDeviceProfileInitiated();
|
||||
mModelWriter = mModel.getWriter(getWallpaperDeviceProfile().isVerticalBarLayout(), true);
|
||||
}
|
||||
|
@ -1782,8 +1784,8 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
|
|||
|
||||
public boolean startActivitySafely(View v, Intent intent, ItemInfo item,
|
||||
@Nullable String sourceContainer) {
|
||||
if (com.android.launcher3.TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(com.android.launcher3.TestProtocol.NO_START_TAG,
|
||||
if (TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_START_TAG,
|
||||
"startActivitySafely outer");
|
||||
}
|
||||
boolean success = super.startActivitySafely(v, intent, item, sourceContainer);
|
||||
|
|
|
@ -165,17 +165,6 @@ public class LauncherModel extends BroadcastReceiver
|
|||
mBgAllAppsList = new AllAppsList(iconCache, appFilter);
|
||||
}
|
||||
|
||||
/** Runs the specified runnable immediately if called from the worker thread, otherwise it is
|
||||
* posted on the worker thread handler. */
|
||||
private static void runOnWorkerThread(Runnable r) {
|
||||
if (sWorkerThread.getThreadId() == Process.myTid()) {
|
||||
r.run();
|
||||
} else {
|
||||
// If we are not on the worker thread, then post to the worker handler
|
||||
sWorker.post(r);
|
||||
}
|
||||
}
|
||||
|
||||
public void setPackageState(PackageInstallInfo installInfo) {
|
||||
enqueueModelUpdateTask(new PackageInstallStateChangedTask(installInfo));
|
||||
}
|
||||
|
@ -400,7 +389,10 @@ public class LauncherModel extends BroadcastReceiver
|
|||
synchronized (mLock) {
|
||||
stopLoader();
|
||||
mLoaderTask = new LoaderTask(mApp, mBgAllAppsList, sBgDataModel, results);
|
||||
runOnWorkerThread(mLoaderTask);
|
||||
|
||||
// Always post the loader task, instead of running directly (even on same thread) so
|
||||
// that we exit any nested synchronized blocks
|
||||
sWorker.post(mLoaderTask);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -505,7 +497,13 @@ public class LauncherModel extends BroadcastReceiver
|
|||
|
||||
public void enqueueModelUpdateTask(ModelUpdateTask task) {
|
||||
task.init(mApp, this, sBgDataModel, mBgAllAppsList, mUiExecutor);
|
||||
runOnWorkerThread(task);
|
||||
|
||||
if (sWorkerThread.getThreadId() == Process.myTid()) {
|
||||
task.run();
|
||||
} else {
|
||||
// If we are not on the worker thread, then post to the worker handler
|
||||
sWorker.post(task);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -14,7 +14,6 @@ import android.os.Build;
|
|||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewDebug;
|
||||
import android.view.WindowInsets;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
@ -101,7 +100,7 @@ public class LauncherRootView extends InsettableFrameLayout {
|
|||
mLauncher.getStateManager().reapplyState(true /* cancelCurrentAnimation */);
|
||||
}
|
||||
|
||||
return true; // I'll take it from here
|
||||
return false; // Let children get the full insets
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -156,12 +155,6 @@ public class LauncherRootView extends InsettableFrameLayout {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public WindowInsets dispatchApplyWindowInsets(WindowInsets insets) {
|
||||
mLauncher.getDragLayer().updateTouchExcludeRegion(insets);
|
||||
return super.dispatchApplyWindowInsets(insets);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||
super.onLayout(changed, l, t, r, b);
|
||||
|
|
|
@ -18,13 +18,13 @@ package com.android.launcher3;
|
|||
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
|
||||
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS;
|
||||
import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
|
||||
import static com.android.launcher3.TestProtocol.ALL_APPS_STATE_ORDINAL;
|
||||
import static com.android.launcher3.TestProtocol.BACKGROUND_APP_STATE_ORDINAL;
|
||||
import static com.android.launcher3.TestProtocol.NORMAL_STATE_ORDINAL;
|
||||
import static com.android.launcher3.TestProtocol.OVERVIEW_PEEK_STATE_ORDINAL;
|
||||
import static com.android.launcher3.TestProtocol.OVERVIEW_STATE_ORDINAL;
|
||||
import static com.android.launcher3.TestProtocol.QUICK_SWITCH_STATE_ORDINAL;
|
||||
import static com.android.launcher3.TestProtocol.SPRING_LOADED_STATE_ORDINAL;
|
||||
import static com.android.launcher3.testing.TestProtocol.ALL_APPS_STATE_ORDINAL;
|
||||
import static com.android.launcher3.testing.TestProtocol.BACKGROUND_APP_STATE_ORDINAL;
|
||||
import static com.android.launcher3.testing.TestProtocol.NORMAL_STATE_ORDINAL;
|
||||
import static com.android.launcher3.testing.TestProtocol.OVERVIEW_PEEK_STATE_ORDINAL;
|
||||
import static com.android.launcher3.testing.TestProtocol.OVERVIEW_STATE_ORDINAL;
|
||||
import static com.android.launcher3.testing.TestProtocol.QUICK_SWITCH_STATE_ORDINAL;
|
||||
import static com.android.launcher3.testing.TestProtocol.SPRING_LOADED_STATE_ORDINAL;
|
||||
import static com.android.launcher3.anim.Interpolators.ACCEL_2;
|
||||
import static com.android.launcher3.states.RotationHelper.REQUEST_NONE;
|
||||
|
||||
|
|
|
@ -48,6 +48,7 @@ import com.android.launcher3.anim.AnimatorPlaybackController;
|
|||
import com.android.launcher3.anim.AnimatorSetBuilder;
|
||||
import com.android.launcher3.anim.PropertySetter;
|
||||
import com.android.launcher3.anim.PropertySetter.AnimatedPropertySetter;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.uioverrides.UiFactory;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
@ -447,8 +448,8 @@ public class LauncherStateManager {
|
|||
}
|
||||
|
||||
private void onStateTransitionStart(LauncherState state) {
|
||||
if (com.android.launcher3.TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(com.android.launcher3.TestProtocol.NO_DRAG_TAG,
|
||||
if (TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_DRAG_TAG,
|
||||
"onStateTransitionStart");
|
||||
}
|
||||
if (mState != state) {
|
||||
|
@ -576,8 +577,8 @@ public class LauncherStateManager {
|
|||
private final AnimatorSet mAnim;
|
||||
|
||||
public StartAnimRunnable(AnimatorSet anim) {
|
||||
if (com.android.launcher3.TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(com.android.launcher3.TestProtocol.NO_DRAG_TAG,
|
||||
if (TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_DRAG_TAG,
|
||||
"StartAnimRunnable");
|
||||
}
|
||||
mAnim = anim;
|
||||
|
|
|
@ -21,10 +21,9 @@ import android.util.DisplayMetrics;
|
|||
import android.util.TypedValue;
|
||||
|
||||
public class ResourceUtils {
|
||||
public static final String NAVBAR_PORTRAIT_BOTTOM_SIZE = "navigation_bar_frame_height";
|
||||
public static final String NAVBAR_LANDSCAPE_LEFT_RIGHT_SIZE = "navigation_bar_width";
|
||||
public static final String NAVBAR_LANDSCAPE_BOTTOM_SIZE
|
||||
= "navigation_bar_frame_height_landscape";
|
||||
public static final String NAVBAR_BOTTOM_GESTURE_SIZE = "navigation_bar_gesture_height";
|
||||
|
||||
|
||||
public static int getNavbarSize(String resName, Resources res) {
|
||||
return getDimenByName(resName, res, 48);
|
||||
|
|
|
@ -20,8 +20,6 @@ import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS;
|
|||
import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY;
|
||||
import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_TRANSITION_MS;
|
||||
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
|
||||
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT;
|
||||
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
|
||||
import static com.android.launcher3.LauncherState.ALL_APPS;
|
||||
import static com.android.launcher3.LauncherState.NORMAL;
|
||||
import static com.android.launcher3.LauncherState.SPRING_LOADED;
|
||||
|
@ -86,6 +84,7 @@ import com.android.launcher3.graphics.RotationMode;
|
|||
import com.android.launcher3.pageindicators.WorkspacePageIndicator;
|
||||
import com.android.launcher3.popup.PopupContainerWithArrow;
|
||||
import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.touch.WorkspaceTouchListener;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
|
@ -371,8 +370,8 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
|||
|
||||
@Override
|
||||
public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) {
|
||||
if (com.android.launcher3.TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(com.android.launcher3.TestProtocol.NO_DRAG_TAG,
|
||||
if (TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_DRAG_TAG,
|
||||
"onDragStart 1");
|
||||
}
|
||||
if (ENFORCE_DRAG_EVENT_ORDER) {
|
||||
|
@ -425,8 +424,8 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
|||
}
|
||||
|
||||
// Always enter the spring loaded mode
|
||||
if (com.android.launcher3.TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(com.android.launcher3.TestProtocol.NO_DRAG_TAG,
|
||||
if (TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_DRAG_TAG,
|
||||
"onDragStart 2");
|
||||
}
|
||||
mLauncher.getStateManager().goToState(SPRING_LOADED);
|
||||
|
|
|
@ -31,6 +31,7 @@ import android.view.LayoutInflater;
|
|||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowInsets;
|
||||
|
||||
import com.android.launcher3.AppInfo;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
|
@ -43,7 +44,7 @@ import com.android.launcher3.ItemInfo;
|
|||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.TestProtocol;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.compat.AccessibilityManagerCompat;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
|
@ -321,12 +322,21 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo
|
|||
}
|
||||
setLayoutParams(mlp);
|
||||
|
||||
mNavBarScrimHeight = insets.bottom;
|
||||
InsettableFrameLayout.dispatchInsets(this, insets);
|
||||
mLauncher.getAllAppsController()
|
||||
.setScrollRangeDelta(mSearchUiManager.getScrollRangeDelta(insets));
|
||||
}
|
||||
|
||||
@Override
|
||||
public WindowInsets dispatchApplyWindowInsets(WindowInsets insets) {
|
||||
if (Utilities.ATLEAST_Q) {
|
||||
mNavBarScrimHeight = insets.getTappableElementInsets().bottom;
|
||||
} else {
|
||||
mNavBarScrimHeight = insets.getStableInsetBottom();
|
||||
}
|
||||
return super.dispatchApplyWindowInsets(insets);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dispatchDraw(Canvas canvas) {
|
||||
super.dispatchDraw(canvas);
|
||||
|
|
|
@ -425,7 +425,7 @@ public class AllAppsRecyclerView extends BaseRecyclerView implements LogContaine
|
|||
public void onScrollStateChanged(int state) {
|
||||
super.onScrollStateChanged(state);
|
||||
|
||||
if (state == SCROLL_STATE_IDLE && Utilities.IS_RUNNING_IN_TEST_HARNESS) {
|
||||
if (state == SCROLL_STATE_IDLE) {
|
||||
AccessibilityManagerCompat.sendScrollFinishedEventToTest(getContext());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ import com.android.launcher3.Launcher;
|
|||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.compat.AlphabeticIndexCompat;
|
||||
import com.android.launcher3.shortcuts.DeepShortcutManager;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.util.ComponentKey;
|
||||
import com.android.launcher3.util.ItemInfoMatcher;
|
||||
import com.android.launcher3.util.LabelComparator;
|
||||
|
@ -300,6 +301,11 @@ public class AlphabeticalAppsList implements AllAppsStore.OnUpdateListener {
|
|||
}
|
||||
|
||||
private void refreshRecyclerView() {
|
||||
if (TestProtocol.sDebugTracing) {
|
||||
android.util.Log.d(TestProtocol.NO_START_TAG,
|
||||
"refreshRecyclerView @ " + android.util.Log.getStackTraceString(
|
||||
new Throwable()));
|
||||
}
|
||||
if (mAdapter != null) {
|
||||
mAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
|
|
@ -30,6 +30,9 @@ import android.view.MotionEvent;
|
|||
|
||||
import com.android.launcher3.AbstractFloatingView;
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.LauncherStateManager;
|
||||
import com.android.launcher3.LauncherStateManager.StateListener;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.compat.UserManagerCompat;
|
||||
|
@ -52,6 +55,16 @@ public class DiscoveryBounce extends AbstractFloatingView {
|
|||
private final Launcher mLauncher;
|
||||
private final Animator mDiscoBounceAnimation;
|
||||
|
||||
private final StateListener mStateListener = new StateListener() {
|
||||
@Override
|
||||
public void onStateTransitionStart(LauncherState toState) {
|
||||
handleClose(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStateTransitionComplete(LauncherState finalState) {}
|
||||
};
|
||||
|
||||
public DiscoveryBounce(Launcher launcher, float delta) {
|
||||
super(launcher, null);
|
||||
mLauncher = launcher;
|
||||
|
@ -67,6 +80,7 @@ public class DiscoveryBounce extends AbstractFloatingView {
|
|||
}
|
||||
});
|
||||
mDiscoBounceAnimation.addListener(controller.getProgressAnimatorListener());
|
||||
launcher.getStateManager().addStateListener(mStateListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -105,6 +119,7 @@ public class DiscoveryBounce extends AbstractFloatingView {
|
|||
// Reset the all-apps progress to what ever it was previously.
|
||||
mLauncher.getAllAppsController().setProgress(mLauncher.getStateManager()
|
||||
.getState().getVerticalProgress(mLauncher));
|
||||
mLauncher.getStateManager().removeStateListener(mStateListener);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,8 @@ import android.animation.AnimatorListenerAdapter;
|
|||
import android.animation.ObjectAnimator;
|
||||
import android.animation.TimeInterpolator;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
import android.util.Property;
|
||||
|
||||
|
@ -139,7 +141,7 @@ public class SpringObjectAnimator<T extends ProgressInterface> extends ValueAnim
|
|||
/**
|
||||
* Initializes and sets up the spring to take over controlling the object.
|
||||
*/
|
||||
void startSpring(float end, float velocity, OnAnimationEndListener endListener) {
|
||||
public void startSpring(float end, float velocity, OnAnimationEndListener endListener) {
|
||||
// Cancel the spring so we can set new start velocity and final position. We need to remove
|
||||
// the listener since the spring is not actually ending.
|
||||
mSpring.removeEndListener(endListener);
|
||||
|
@ -149,7 +151,13 @@ public class SpringObjectAnimator<T extends ProgressInterface> extends ValueAnim
|
|||
mProperty.switchToSpring();
|
||||
|
||||
mSpring.setStartVelocity(velocity);
|
||||
mSpring.animateToFinalPosition(end == 0 ? mValues[0] : mValues[1]);
|
||||
|
||||
float startValue = end == 0 ? mValues[1] : mValues[0];
|
||||
float endValue = end == 0 ? mValues[0] : mValues[1];
|
||||
mSpring.setStartValue(startValue);
|
||||
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||
mSpring.animateToFinalPosition(endValue);
|
||||
}, getStartDelay());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue