Merging from ub-launcher3-rvc-dev @ build 6436292
Bug:150504032 Test: manual, presubmit on the source branch x20/teams/android-launcher/merge/ub-launcher3-rvc-dev_rvc-dev_6436292.html Change-Id: I28d6ec42b7a6a8e779abb306cc29c9801910206f
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<gradient
|
||||
android:angle="90"
|
||||
android:endColor="@android:color/transparent"
|
||||
android:startColor="@color/chip_scrim_start_color"
|
||||
android:type="linear" />
|
||||
</shape>
|
||||
@@ -15,6 +15,7 @@
|
||||
-->
|
||||
<resources>
|
||||
<color name="chip_hint_foreground_color">#fff</color>
|
||||
<color name="chip_scrim_start_color">#39000000</color>
|
||||
|
||||
<color name="all_apps_label_text">#61000000</color>
|
||||
<color name="all_apps_label_text_dark">#61FFFFFF</color>
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
<dimen name="chip_hint_start_padding">10dp</dimen>
|
||||
<dimen name="chip_hint_end_padding">12dp</dimen>
|
||||
<dimen name="chip_hint_horizontal_margin">20dp</dimen>
|
||||
<dimen name="chip_hint_vertical_offset">16dp</dimen>
|
||||
<dimen name="chip_hint_elevation">2dp</dimen>
|
||||
<dimen name="chip_icon_size">16dp</dimen>
|
||||
<dimen name="chip_text_height">26dp</dimen>
|
||||
|
||||
+6
-6
@@ -197,15 +197,15 @@ public final class LauncherAppTransitionManagerImpl extends QuickstepAppTransiti
|
||||
case INDEX_RECENTS_FADE_ANIM:
|
||||
return ObjectAnimator.ofFloat(mLauncher.getOverviewPanel(),
|
||||
RecentsView.CONTENT_ALPHA, values);
|
||||
case INDEX_RECENTS_TRANSLATE_X_ANIM:
|
||||
// TODO: Do not assume motion across X axis for adjacent page
|
||||
return new SpringAnimationBuilder<>(
|
||||
mLauncher.getOverviewPanel(), ADJACENT_PAGE_OFFSET)
|
||||
.setMinimumVisibleChange(1f / mLauncher.getOverviewPanel().getWidth())
|
||||
case INDEX_RECENTS_TRANSLATE_X_ANIM: {
|
||||
RecentsView rv = mLauncher.getOverviewPanel();
|
||||
return new SpringAnimationBuilder(mLauncher)
|
||||
.setMinimumVisibleChange(1f / rv.getPageOffsetScale())
|
||||
.setDampingRatio(0.8f)
|
||||
.setStiffness(250)
|
||||
.setValues(values)
|
||||
.build(mLauncher);
|
||||
.build(rv, ADJACENT_PAGE_OFFSET);
|
||||
}
|
||||
case INDEX_PAUSE_TO_OVERVIEW_ANIM: {
|
||||
StateAnimationConfig config = new StateAnimationConfig();
|
||||
config.duration = ATOMIC_DURATION_FROM_PAUSED_TO_OVERVIEW;
|
||||
|
||||
-4
@@ -73,10 +73,6 @@ public class AllAppsTipView {
|
||||
if (!hasSeenAllAppsTip(launcher)) {
|
||||
launcher.getStateManager().addStateListener(
|
||||
new LauncherStateManager.StateListener() {
|
||||
@Override
|
||||
public void onStateTransitionStart(LauncherState toState) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStateTransitionComplete(LauncherState finalState) {
|
||||
if (finalState == ALL_APPS) {
|
||||
|
||||
-3
@@ -250,9 +250,6 @@ public class AppsDividerView extends View implements LauncherStateManager.StateL
|
||||
mLauncher.getStateManager().removeStateListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStateTransitionStart(LauncherState toState) { }
|
||||
|
||||
@Override
|
||||
public void onStateTransitionComplete(LauncherState finalState) {
|
||||
if (finalState == ALL_APPS) {
|
||||
|
||||
-3
@@ -157,9 +157,6 @@ public class PredictionUiStateManager implements StateListener, ItemInfoUpdateRe
|
||||
@Override
|
||||
public void reapplyItemInfo(ItemInfoWithIcon info) { }
|
||||
|
||||
@Override
|
||||
public void onStateTransitionStart(LauncherState toState) { }
|
||||
|
||||
@Override
|
||||
public void onStateTransitionComplete(LauncherState state) {
|
||||
if (mAppsView == null) {
|
||||
|
||||
+3
-7
@@ -15,7 +15,6 @@
|
||||
*/
|
||||
package com.android.launcher3.uioverrides.touchcontrollers;
|
||||
|
||||
import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X;
|
||||
import static com.android.launcher3.LauncherState.ALL_APPS;
|
||||
import static com.android.launcher3.LauncherState.NORMAL;
|
||||
import static com.android.launcher3.LauncherState.OVERVIEW;
|
||||
@@ -23,6 +22,7 @@ import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS
|
||||
import static com.android.launcher3.anim.Interpolators.DEACCEL_3;
|
||||
import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
|
||||
import static com.android.launcher3.touch.AbstractStateChangeTouchController.SUCCESS_TRANSITION_PROGRESS;
|
||||
import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_OFFSET;
|
||||
import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
|
||||
|
||||
import android.animation.ValueAnimator;
|
||||
@@ -131,12 +131,8 @@ public class NavBarToHomeTouchController implements TouchController,
|
||||
final PendingAnimation builder = new PendingAnimation(accuracy);
|
||||
if (mStartState == OVERVIEW) {
|
||||
RecentsView recentsView = mLauncher.getOverviewPanel();
|
||||
float pullbackDist = mPullbackDistance;
|
||||
if (!recentsView.isRtl()) {
|
||||
pullbackDist = -pullbackDist;
|
||||
}
|
||||
|
||||
builder.setFloat(recentsView, VIEW_TRANSLATE_X, pullbackDist, PULLBACK_INTERPOLATOR);
|
||||
builder.setFloat(recentsView, ADJACENT_PAGE_OFFSET,
|
||||
-mPullbackDistance / recentsView.getPageOffsetScale(), PULLBACK_INTERPOLATOR);
|
||||
if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
|
||||
builder.addOnFrameCallback(
|
||||
() -> recentsView.redrawLiveTile(false /* mightNeedToRefill */));
|
||||
|
||||
+17
-16
@@ -166,8 +166,8 @@ public class NoButtonNavbarToOverviewTouchController extends FlingAndHoldTouchCo
|
||||
float velocityDp = dpiFromPx(velocity);
|
||||
boolean isFling = Math.abs(velocityDp) > 1;
|
||||
LauncherStateManager stateManager = mLauncher.getStateManager();
|
||||
if (isFling) {
|
||||
// When flinging, go back to home instead of overview.
|
||||
boolean goToHomeInsteadOfOverview = isFling;
|
||||
if (goToHomeInsteadOfOverview) {
|
||||
if (velocity > 0) {
|
||||
stateManager.goToState(NORMAL, true,
|
||||
() -> onSwipeInteractionCompleted(NORMAL, Touch.FLING));
|
||||
@@ -187,20 +187,21 @@ public class NoButtonNavbarToOverviewTouchController extends FlingAndHoldTouchCo
|
||||
() -> onSwipeInteractionCompleted(NORMAL, Touch.SWIPE)));
|
||||
anim.start();
|
||||
}
|
||||
} else {
|
||||
if (mReachedOverview) {
|
||||
float distanceDp = dpiFromPx(Math.max(
|
||||
Math.abs(mRecentsView.getTranslationX()),
|
||||
Math.abs(mRecentsView.getTranslationY())));
|
||||
long duration = (long) Math.max(TRANSLATION_ANIM_MIN_DURATION_MS,
|
||||
distanceDp / TRANSLATION_ANIM_VELOCITY_DP_PER_MS);
|
||||
mRecentsView.animate()
|
||||
.translationX(0)
|
||||
.translationY(0)
|
||||
.setInterpolator(ACCEL_DEACCEL)
|
||||
.setDuration(duration)
|
||||
.withEndAction(this::maybeSwipeInteractionToOverviewComplete);
|
||||
}
|
||||
}
|
||||
if (mReachedOverview) {
|
||||
float distanceDp = dpiFromPx(Math.max(
|
||||
Math.abs(mRecentsView.getTranslationX()),
|
||||
Math.abs(mRecentsView.getTranslationY())));
|
||||
long duration = (long) Math.max(TRANSLATION_ANIM_MIN_DURATION_MS,
|
||||
distanceDp / TRANSLATION_ANIM_VELOCITY_DP_PER_MS);
|
||||
mRecentsView.animate()
|
||||
.translationX(0)
|
||||
.translationY(0)
|
||||
.setInterpolator(ACCEL_DEACCEL)
|
||||
.setDuration(duration)
|
||||
.withEndAction(goToHomeInsteadOfOverview
|
||||
? null
|
||||
: this::maybeSwipeInteractionToOverviewComplete);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -334,7 +334,7 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
|
||||
mAppWindowAnimationHelper.updateHomeBounds(getStackBounds(dp));
|
||||
}
|
||||
int displayRotation = 0;
|
||||
if (mOrientedState != null && !mOrientedState.areMultipleLayoutOrientationsDisabled()) {
|
||||
if (mOrientedState != null && mOrientedState.isMultipleOrientationSupportedByDevice()) {
|
||||
// TODO(b/150300347): The first recents animation after launcher is started with the
|
||||
// foreground app not in landscape will look funky until that bug is fixed
|
||||
displayRotation = mOrientedState.getDisplayRotation();
|
||||
|
||||
@@ -208,7 +208,8 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
|
||||
mTaskAnimationManager = taskAnimationManager;
|
||||
mTouchTimeMs = touchTimeMs;
|
||||
mContinuingLastGesture = continuingLastGesture;
|
||||
mTaskViewSimulator = new TaskViewSimulator(context, LayoutUtils::calculateLauncherTaskSize);
|
||||
mTaskViewSimulator = new TaskViewSimulator(
|
||||
context, LayoutUtils::calculateLauncherTaskSize, true);
|
||||
|
||||
initAfterSubclassConstructor();
|
||||
initStateCallbacks();
|
||||
|
||||
+7
-2
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.android.quickstep;
|
||||
|
||||
import static android.content.Intent.ACTION_CHOOSER;
|
||||
import static android.view.MotionEvent.ACTION_CANCEL;
|
||||
import static android.view.MotionEvent.ACTION_DOWN;
|
||||
import static android.view.MotionEvent.ACTION_UP;
|
||||
@@ -23,6 +24,7 @@ import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TI
|
||||
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
|
||||
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
|
||||
import static com.android.quickstep.GestureState.DEFAULT_STATE;
|
||||
import static com.android.quickstep.util.RecentsOrientedState.isFixedRotationTransformEnabled;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_INPUT_MONITOR;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_TRACING_ENABLED;
|
||||
@@ -597,7 +599,7 @@ public class TouchInteractionService extends Service implements PluginListener<O
|
||||
}
|
||||
|
||||
private void handleOrientationSetup(InputConsumer baseInputConsumer) {
|
||||
if (!FeatureFlags.ENABLE_FIXED_ROTATION_TRANSFORM.get()) {
|
||||
if (!isFixedRotationTransformEnabled(this)) {
|
||||
return;
|
||||
}
|
||||
mDeviceState.enableMultipleRegions(baseInputConsumer instanceof OtherActivityInputConsumer);
|
||||
@@ -619,7 +621,10 @@ public class TouchInteractionService extends Service implements PluginListener<O
|
||||
return createDeviceLockedInputConsumer(gestureState);
|
||||
}
|
||||
|
||||
boolean forceOverviewInputConsumer = false;
|
||||
// Use overview input consumer for sharesheets on top of home.
|
||||
boolean forceOverviewInputConsumer = gestureState.getActivityInterface().isStarted()
|
||||
&& gestureState.getRunningTask() != null
|
||||
&& ACTION_CHOOSER.equals(gestureState.getRunningTask().baseIntent.getAction());
|
||||
if (AssistantUtilities.isExcludedAssistant(gestureState.getRunningTask())) {
|
||||
// In the case where we are in the excluded assistant state, ignore it and treat the
|
||||
// running activity as the task behind the assistant
|
||||
|
||||
+1
-6
@@ -65,7 +65,7 @@ public class FallbackRecentsView extends RecentsView<RecentsActivity> {
|
||||
}
|
||||
|
||||
public FallbackRecentsView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
super(context, attrs, defStyleAttr, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -195,9 +195,4 @@ public class FallbackRecentsView extends RecentsView<RecentsActivity> {
|
||||
}
|
||||
super.applyLoadPlan(tasks);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean supportsVerticalLandscape() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -264,7 +264,8 @@ public class AppWindowAnimationHelper {
|
||||
mTmpRectF.set(mTargetRect);
|
||||
Utilities.scaleRectFAboutCenter(mTmpRectF, params.mOffsetScale);
|
||||
mCurrentRect.set(mRectFEvaluator.evaluate(params.mProgress, mSourceRect, mTmpRectF));
|
||||
if (mOrientedState == null || mOrientedState.areMultipleLayoutOrientationsDisabled()) {
|
||||
if (mOrientedState == null
|
||||
|| !mOrientedState.isMultipleOrientationSupportedByDevice()) {
|
||||
mCurrentRect.offset(params.mOffset, 0);
|
||||
} else {
|
||||
int displayRotation = mOrientedState.getDisplayRotation();
|
||||
|
||||
+4
-2
@@ -28,6 +28,7 @@ import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
@@ -185,13 +186,14 @@ public class StaggeredWorkspaceAnim {
|
||||
ResourceProvider rp = DynamicResource.provider(v.getContext());
|
||||
float stiffness = rp.getFloat(R.dimen.staggered_stiffness);
|
||||
float damping = rp.getFloat(R.dimen.staggered_damping_ratio);
|
||||
ObjectAnimator springTransY = new SpringAnimationBuilder<>(v, VIEW_TRANSLATE_Y)
|
||||
ValueAnimator springTransY = new SpringAnimationBuilder(v.getContext())
|
||||
.setStiffness(stiffness)
|
||||
.setDampingRatio(damping)
|
||||
.setMinimumVisibleChange(1f)
|
||||
.setStartValue(mSpringTransY)
|
||||
.setEndValue(0)
|
||||
.setStartVelocity(mVelocity)
|
||||
.build(v.getContext());
|
||||
.build(v, VIEW_TRANSLATE_Y);
|
||||
springTransY.setStartDelay(startDelay);
|
||||
mAnimators.play(springTransY);
|
||||
|
||||
|
||||
+39
-10
@@ -15,9 +15,13 @@
|
||||
*/
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import static android.view.Surface.ROTATION_0;
|
||||
|
||||
import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
|
||||
import static com.android.launcher3.states.RotationHelper.deltaRotation;
|
||||
import static com.android.launcher3.touch.PagedOrientationHandler.MATRIX_POST_TRANSLATE;
|
||||
import static com.android.quickstep.util.AppWindowAnimationHelper.applySurfaceParams;
|
||||
import static com.android.quickstep.util.RecentsOrientedState.isFixedRotationTransformEnabled;
|
||||
import static com.android.quickstep.util.RecentsOrientedState.postDisplayRotation;
|
||||
import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING;
|
||||
import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING;
|
||||
@@ -33,7 +37,6 @@ import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.RecentsAnimationTargets;
|
||||
@@ -54,6 +57,7 @@ public class TaskViewSimulator {
|
||||
|
||||
private final Rect mTmpCropRect = new Rect();
|
||||
private final RectF mTempRectF = new RectF();
|
||||
private final float[] mTempPoint = new float[2];
|
||||
|
||||
private final RecentsOrientedState mOrientationState;
|
||||
private final Context mContext;
|
||||
@@ -91,11 +95,17 @@ public class TaskViewSimulator {
|
||||
private boolean mLayoutValid = false;
|
||||
private boolean mScrollValid = false;
|
||||
|
||||
public TaskViewSimulator(Context context, TaskSizeProvider sizeProvider) {
|
||||
public TaskViewSimulator(Context context, TaskSizeProvider sizeProvider,
|
||||
boolean rotationSupportedByActivity) {
|
||||
mContext = context;
|
||||
mSizeProvider = sizeProvider;
|
||||
mPositionHelper = new PreviewPositionHelper(context);
|
||||
mOrientationState = new RecentsOrientedState(context);
|
||||
|
||||
mOrientationState = new RecentsOrientedState(context, rotationSupportedByActivity,
|
||||
i -> { });
|
||||
// We do not need to attach listeners as the simulator is created just for the gesture
|
||||
// duration, and any settings are unlikely to change during this
|
||||
mOrientationState.initWithoutListeners();
|
||||
|
||||
mCurrentFullscreenParams = new FullscreenDrawParams(context);
|
||||
mPageSpacing = context.getResources().getDimensionPixelSize(R.dimen.recents_page_spacing);
|
||||
@@ -114,11 +124,15 @@ public class TaskViewSimulator {
|
||||
* @see com.android.quickstep.views.RecentsView#setLayoutRotation(int, int)
|
||||
*/
|
||||
public void setLayoutRotation(int touchRotation, int displayRotation) {
|
||||
if (!FeatureFlags.ENABLE_FIXED_ROTATION_TRANSFORM.get()) {
|
||||
return;
|
||||
int launcherRotation;
|
||||
if (!mOrientationState.isMultipleOrientationSupportedByDevice()
|
||||
|| mOrientationState.isHomeRotationAllowed()) {
|
||||
launcherRotation = displayRotation;
|
||||
} else {
|
||||
launcherRotation = ROTATION_0;
|
||||
}
|
||||
mOrientationState.update(touchRotation, displayRotation,
|
||||
mOrientationState.getLauncherRotation());
|
||||
|
||||
mOrientationState.update(touchRotation, displayRotation, launcherRotation);
|
||||
mLayoutValid = false;
|
||||
}
|
||||
|
||||
@@ -180,7 +194,7 @@ public class TaskViewSimulator {
|
||||
mLayoutValid = true;
|
||||
|
||||
getFullScreenScale();
|
||||
mThumbnailData.rotation = FeatureFlags.ENABLE_FIXED_ROTATION_TRANSFORM.get()
|
||||
mThumbnailData.rotation = isFixedRotationTransformEnabled(mContext)
|
||||
? mOrientationState.getDisplayRotation() : mPositionHelper.getCurrentRotation();
|
||||
|
||||
mPositionHelper.updateThumbnailMatrix(mThumbnailPosition, mThumbnailData,
|
||||
@@ -226,7 +240,8 @@ public class TaskViewSimulator {
|
||||
|
||||
// Apply recensView matrix
|
||||
mMatrix.postScale(recentsViewScale.value, recentsViewScale.value, mPivot.x, mPivot.y);
|
||||
postDisplayRotation(mOrientationState.getDisplayRotation(),
|
||||
postDisplayRotation(deltaRotation(
|
||||
mOrientationState.getLauncherRotation(), mOrientationState.getDisplayRotation()),
|
||||
mDp.widthPx, mDp.heightPx, mMatrix);
|
||||
|
||||
// Crop rect is the inverse of thumbnail matrix
|
||||
@@ -253,7 +268,7 @@ public class TaskViewSimulator {
|
||||
builder.withAlpha(alpha)
|
||||
.withMatrix(mMatrix)
|
||||
.withWindowCrop(mTmpCropRect)
|
||||
.withCornerRadius(mCurrentFullscreenParams.mCurrentDrawnCornerRadius);
|
||||
.withCornerRadius(getCurrentCornerRadius());
|
||||
} else if (params.getTargetSet().hasRecents) {
|
||||
// If home has a different target then recents, reverse anim the home target.
|
||||
builder.withAlpha(fullScreenProgress.value * params.getTargetAlpha());
|
||||
@@ -270,6 +285,20 @@ public class TaskViewSimulator {
|
||||
applySurfaceParams(params.getSyncTransactionApplier(), surfaceParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the corner radius that should be applied to the target so that it matches the
|
||||
* TaskView
|
||||
*/
|
||||
public float getCurrentCornerRadius() {
|
||||
float visibleRadius = mCurrentFullscreenParams.mCurrentDrawnCornerRadius;
|
||||
mTempPoint[0] = visibleRadius;
|
||||
mTempPoint[1] = 0;
|
||||
mInversePositionMatrix.mapVectors(mTempPoint);
|
||||
|
||||
// Ideally we should use square-root. This is an optimization as one of the dimension is 0.
|
||||
return Math.max(Math.abs(mTempPoint[0]), Math.abs(mTempPoint[1]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface for calculating taskSize
|
||||
*/
|
||||
|
||||
+1
-8
@@ -45,7 +45,6 @@ import com.android.launcher3.LauncherStateManager.StateListener;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.appprediction.PredictionUiStateManager;
|
||||
import com.android.launcher3.appprediction.PredictionUiStateManager.Client;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.statehandlers.DepthController;
|
||||
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
|
||||
import com.android.launcher3.util.TraceHelper;
|
||||
@@ -96,7 +95,7 @@ public class LauncherRecentsView extends RecentsView<BaseQuickstepLauncher>
|
||||
}
|
||||
|
||||
public LauncherRecentsView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
super(context, attrs, defStyleAttr, true);
|
||||
mActivity.getStateManager().addStateListener(this);
|
||||
}
|
||||
|
||||
@@ -264,12 +263,6 @@ public class LauncherRecentsView extends RecentsView<BaseQuickstepLauncher>
|
||||
return mTransformParams;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean supportsVerticalLandscape() {
|
||||
return FeatureFlags.ENABLE_FIXED_ROTATION_TRANSFORM.get()
|
||||
&& !mOrientationState.areMultipleLayoutOrientationsDisabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
super.reset();
|
||||
|
||||
+3
-1
@@ -48,7 +48,8 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo
|
||||
HIDDEN_NON_ZERO_ROTATION,
|
||||
HIDDEN_NO_TASKS,
|
||||
HIDDEN_GESTURE_RUNNING,
|
||||
HIDDEN_NO_RECENTS})
|
||||
HIDDEN_NO_RECENTS,
|
||||
HIDDEN_FULLESCREEN_PROGRESS})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface ActionsHiddenFlags { }
|
||||
|
||||
@@ -58,6 +59,7 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo
|
||||
public static final int HIDDEN_NO_TASKS = 1 << 3;
|
||||
public static final int HIDDEN_GESTURE_RUNNING = 1 << 4;
|
||||
public static final int HIDDEN_NO_RECENTS = 1 << 5;
|
||||
public static final int HIDDEN_FULLESCREEN_PROGRESS = 1 << 6;
|
||||
|
||||
private static final int INDEX_CONTENT_ALPHA = 0;
|
||||
private static final int INDEX_VISIBILITY_ALPHA = 1;
|
||||
|
||||
@@ -38,6 +38,7 @@ import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType.
|
||||
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
|
||||
import static com.android.launcher3.util.SystemUiController.UI_STATE_OVERVIEW;
|
||||
import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId;
|
||||
import static com.android.quickstep.views.OverviewActionsView.HIDDEN_FULLESCREEN_PROGRESS;
|
||||
import static com.android.quickstep.views.OverviewActionsView.HIDDEN_GESTURE_RUNNING;
|
||||
import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NON_ZERO_ROTATION;
|
||||
import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_RECENTS;
|
||||
@@ -69,14 +70,13 @@ import android.text.StaticLayout;
|
||||
import android.text.TextPaint;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.FloatProperty;
|
||||
import android.util.Log;
|
||||
import android.util.Property;
|
||||
import android.util.SparseBooleanArray;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.OrientationEventListener;
|
||||
import android.view.Surface;
|
||||
import android.view.View;
|
||||
import android.view.ViewDebug;
|
||||
import android.view.ViewGroup;
|
||||
@@ -103,7 +103,6 @@ import com.android.launcher3.anim.SpringProperty;
|
||||
import com.android.launcher3.compat.AccessibilityManagerCompat;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.statehandlers.DepthController;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler.CurveProperties;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||
@@ -191,8 +190,6 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
};
|
||||
|
||||
protected final RecentsOrientedState mOrientationState;
|
||||
private OrientationEventListener mOrientationListener;
|
||||
private int mPreviousRotation;
|
||||
protected RecentsAnimationController mRecentsAnimationController;
|
||||
protected RecentsAnimationTargets mRecentsAnimationTargets;
|
||||
protected AppWindowAnimationHelper mAppWindowAnimationHelper;
|
||||
@@ -301,9 +298,6 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
}
|
||||
};
|
||||
|
||||
private final RecentsOrientedState.SystemRotationChangeListener mSystemRotationChangeListener =
|
||||
enabled -> toggleOrientationEventListener();
|
||||
|
||||
private final PinnedStackAnimationListener mIPinnedStackAnimationListener =
|
||||
new PinnedStackAnimationListener();
|
||||
|
||||
@@ -360,11 +354,13 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
}
|
||||
};
|
||||
|
||||
public RecentsView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
public RecentsView(Context context, AttributeSet attrs, int defStyleAttr,
|
||||
boolean rotationSupportedByActivity) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
setPageSpacing(getResources().getDimensionPixelSize(R.dimen.recents_page_spacing));
|
||||
setEnableFreeScroll(true);
|
||||
mOrientationState = new RecentsOrientedState(context);
|
||||
mOrientationState = new RecentsOrientedState(
|
||||
context, rotationSupportedByActivity, this::animateRecentsRotationInPlace);
|
||||
|
||||
mFastFlingVelocity = getResources()
|
||||
.getDimensionPixelSize(R.dimen.recents_fast_fling_velocity);
|
||||
@@ -399,21 +395,10 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
.getDimensionPixelSize(R.dimen.recents_empty_message_text_padding);
|
||||
setWillNotDraw(false);
|
||||
updateEmptyMessage();
|
||||
disableMultipleLayoutRotations(!supportsVerticalLandscape());
|
||||
mOrientationHandler = mOrientationState.getOrientationHandler();
|
||||
|
||||
// Initialize quickstep specific cache params here, as this is constructed only once
|
||||
mActivity.getViewCache().setCacheSize(R.layout.digital_wellbeing_toast, 5);
|
||||
|
||||
mOrientationListener = new OrientationEventListener(getContext()) {
|
||||
@Override
|
||||
public void onOrientationChanged(int i) {
|
||||
int rotation = RecentsOrientedState.getRotationForUserDegreesRotated(i);
|
||||
if (mPreviousRotation != rotation) {
|
||||
animateRecentsRotationInPlace(rotation);
|
||||
mPreviousRotation = rotation;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public OverScroller getScroller() {
|
||||
@@ -502,7 +487,6 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
SystemUiProxy.INSTANCE.get(getContext()).setPinnedStackAnimationListener(
|
||||
mIPinnedStackAnimationListener);
|
||||
mOrientationState.init();
|
||||
mOrientationState.addSystemRotationChangeListener(mSystemRotationChangeListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -517,7 +501,6 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
mIdp.removeOnChangeListener(this);
|
||||
SystemUiProxy.INSTANCE.get(getContext()).setPinnedStackAnimationListener(null);
|
||||
mIPinnedStackAnimationListener.setActivity(null);
|
||||
mOrientationState.removeSystemRotationChangeListener(mSystemRotationChangeListener);
|
||||
mOrientationState.destroy();
|
||||
}
|
||||
|
||||
@@ -576,31 +559,12 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
public void setOverviewStateEnabled(boolean enabled) {
|
||||
mOverviewStateEnabled = enabled;
|
||||
updateTaskStackListenerState();
|
||||
mOrientationState.setRotationWatcherEnabled(enabled);
|
||||
if (!enabled) {
|
||||
// Reset the running task when leaving overview since it can still have a reference to
|
||||
// its thumbnail
|
||||
mTmpRunningTask = null;
|
||||
}
|
||||
toggleOrientationEventListener();
|
||||
}
|
||||
|
||||
private void toggleOrientationEventListener() {
|
||||
boolean canEnable = canEnableOverviewRotationAnimation() && mOverviewStateEnabled;
|
||||
UI_HELPER_EXECUTOR.execute(() -> {
|
||||
if (canEnable) {
|
||||
mOrientationListener.enable();
|
||||
} else {
|
||||
mOrientationListener.disable();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private boolean canEnableOverviewRotationAnimation() {
|
||||
return supportsVerticalLandscape() // not 3P launcher
|
||||
&& !TestProtocol.sDisableSensorRotation // Ignore hardware dependency for tests..
|
||||
&& mOrientationListener.canDetectOrientation() // ..but does the hardware even work?
|
||||
&& (mOrientationState.isSystemRotationAllowed() &&
|
||||
!mOrientationState.canLauncherRotate()); // launcher is going to rotate itself
|
||||
}
|
||||
|
||||
public void onDigitalWellbeingToastShown() {
|
||||
@@ -730,7 +694,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
final int pageIndex = requiredTaskCount - i - 1 + mTaskViewStartIndex;
|
||||
final Task task = tasks.get(i);
|
||||
final TaskView taskView = (TaskView) getChildAt(pageIndex);
|
||||
taskView.bind(task, mOrientationState);
|
||||
taskView.bind(task, mOrientationState, mActivity.getDeviceProfile().isMultiWindowMode);
|
||||
}
|
||||
|
||||
if (mNextPage == INVALID_PAGE) {
|
||||
@@ -820,9 +784,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
for (int i = 0; i < taskCount; i++) {
|
||||
getTaskViewAt(i).setFullscreenProgress(mFullscreenProgress);
|
||||
}
|
||||
if (mActionsView != null && mOrientationState.getLauncherRotation() == Surface.ROTATION_0) {
|
||||
mActionsView.setVisibility(fullscreenProgress == 0 ? VISIBLE : INVISIBLE);
|
||||
}
|
||||
mActionsView.updateHiddenFlags(HIDDEN_FULLESCREEN_PROGRESS, fullscreenProgress > 0);
|
||||
}
|
||||
|
||||
private void updateTaskStackListenerState() {
|
||||
@@ -1039,10 +1001,6 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
}
|
||||
|
||||
private void animateRecentsRotationInPlace(int newRotation) {
|
||||
if (!supportsVerticalLandscape()) {
|
||||
return;
|
||||
}
|
||||
|
||||
AnimatorSet pa = setRecentsChangedOrientation(true);
|
||||
pa.addListener(AnimationSuccessListener.forRunnable(() -> {
|
||||
setLayoutRotation(newRotation, mOrientationState.getDisplayRotation());
|
||||
@@ -1067,7 +1025,6 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
return as;
|
||||
}
|
||||
|
||||
abstract protected boolean supportsVerticalLandscape();
|
||||
|
||||
private void rotateAllChildTasks() {
|
||||
for (int i = 0; i < getTaskViewCount(); i++) {
|
||||
@@ -1111,7 +1068,8 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
new ComponentName(getContext(), getClass()), 0, 0), null, null, "", "", 0, 0,
|
||||
false, true, false, false, new ActivityManager.TaskDescription(), 0,
|
||||
new ComponentName("", ""), false);
|
||||
taskView.bind(mTmpRunningTask, mOrientationState);
|
||||
taskView.bind(mTmpRunningTask, mOrientationState,
|
||||
mActivity.getDeviceProfile().isMultiWindowMode);
|
||||
}
|
||||
|
||||
boolean runningTaskTileHidden = mRunningTaskTileHidden;
|
||||
@@ -1611,17 +1569,12 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
|
||||
mClearAllButton.setRotation(mOrientationHandler.getDegreesRotated());
|
||||
mActivity.getDragLayer().recreateControllers();
|
||||
mActionsView.updateHiddenFlags(HIDDEN_NON_ZERO_ROTATION, touchRotation != 0);
|
||||
mActionsView.updateHiddenFlags(HIDDEN_NON_ZERO_ROTATION,
|
||||
touchRotation != 0 || launcherRotation != 0);
|
||||
requestLayout();
|
||||
}
|
||||
}
|
||||
|
||||
public void disableMultipleLayoutRotations(boolean disable) {
|
||||
mOrientationState.disableMultipleOrientations(disable);
|
||||
mOrientationHandler = mOrientationState.getOrientationHandler();
|
||||
requestLayout();
|
||||
}
|
||||
|
||||
public RecentsOrientedState getPagedViewOrientedState() {
|
||||
return mOrientationState;
|
||||
}
|
||||
@@ -1719,6 +1672,13 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
updateCurveProperties();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: Do not assume motion across X axis for adjacent page
|
||||
*/
|
||||
public float getPageOffsetScale() {
|
||||
return Math.max(getWidth(), 1);
|
||||
}
|
||||
|
||||
private void updateDeadZoneRects() {
|
||||
// Get the deadzone rect surrounding the clear all button to not dismiss overview to home
|
||||
mClearAllButtonDeadZoneRect.setEmpty();
|
||||
@@ -2083,8 +2043,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
public Consumer<MotionEvent> getEventDispatcher(float navbarRotation) {
|
||||
float degreesRotated;
|
||||
if (navbarRotation == 0) {
|
||||
degreesRotated = mOrientationState.areMultipleLayoutOrientationsDisabled() ? 0 :
|
||||
mOrientationHandler.getDegreesRotated();
|
||||
degreesRotated = mOrientationHandler.getDegreesRotated();
|
||||
} else {
|
||||
degreesRotated = -navbarRotation;
|
||||
}
|
||||
@@ -2097,7 +2056,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
// PagedOrientationHandler
|
||||
return e -> {
|
||||
if (navbarRotation != 0
|
||||
&& !mOrientationState.areMultipleLayoutOrientationsDisabled()
|
||||
&& mOrientationState.isMultipleOrientationSupportedByDevice()
|
||||
&& !mOrientationState.getOrientationHandler().isLayoutNaturalToLauncher()) {
|
||||
mOrientationState.flipVertical(e);
|
||||
super.onTouchEvent(e);
|
||||
|
||||
@@ -40,6 +40,7 @@ import com.android.launcher3.anim.AnimationSuccessListener;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.anim.RoundedRectRevealOutlineProvider;
|
||||
import com.android.launcher3.popup.SystemShortcut;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.util.Themes;
|
||||
import com.android.launcher3.views.BaseDragLayer;
|
||||
import com.android.quickstep.TaskOverlayFactory;
|
||||
@@ -150,9 +151,26 @@ public class TaskMenuView extends AbstractFloatingView {
|
||||
return (type & TYPE_TASK_MENU) != 0;
|
||||
}
|
||||
|
||||
public void setPosition(float x, float y) {
|
||||
setX(x);
|
||||
setY(y + mThumbnailTopMargin);
|
||||
public void setPosition(float x, float y, PagedOrientationHandler pagedOrientationHandler) {
|
||||
float adjustedY = y + mThumbnailTopMargin;
|
||||
// Changing pivot to make computations easier
|
||||
// NOTE: Changing the pivots means the rotated view gets rotated about the new pivots set,
|
||||
// which would render the X and Y position set here incorrect
|
||||
setPivotX(0);
|
||||
setPivotY(0);
|
||||
setRotation(pagedOrientationHandler.getDegreesRotated());
|
||||
setX(pagedOrientationHandler.getTaskMenuX(x, mTaskView.getThumbnail()));
|
||||
setY(pagedOrientationHandler.getTaskMenuY(adjustedY, mTaskView.getThumbnail()));
|
||||
}
|
||||
|
||||
public void onRotationChanged() {
|
||||
if (mOpenCloseAnimator != null && mOpenCloseAnimator.isRunning()) {
|
||||
mOpenCloseAnimator.end();
|
||||
}
|
||||
if (mIsOpen) {
|
||||
mOptionLayout.removeAllViews();
|
||||
populateAndLayoutMenu();
|
||||
}
|
||||
}
|
||||
|
||||
public static TaskMenuView showForTask(TaskView taskView) {
|
||||
@@ -168,12 +186,16 @@ public class TaskMenuView extends AbstractFloatingView {
|
||||
}
|
||||
mActivity.getDragLayer().addView(this);
|
||||
mTaskView = taskView;
|
||||
addMenuOptions(mTaskView);
|
||||
orientAroundTaskView(mTaskView);
|
||||
populateAndLayoutMenu();
|
||||
post(this::animateOpen);
|
||||
return true;
|
||||
}
|
||||
|
||||
private void populateAndLayoutMenu() {
|
||||
addMenuOptions(mTaskView);
|
||||
orientAroundTaskView(mTaskView);
|
||||
}
|
||||
|
||||
private void addMenuOptions(TaskView taskView) {
|
||||
Drawable icon = taskView.getTask().icon.getConstantState().newDrawable();
|
||||
mTaskIcon.setDrawable(icon);
|
||||
@@ -200,21 +222,26 @@ public class TaskMenuView extends AbstractFloatingView {
|
||||
R.layout.task_view_menu_option, this, false);
|
||||
menuOption.setIconAndLabelFor(
|
||||
menuOptionView.findViewById(R.id.icon), menuOptionView.findViewById(R.id.text));
|
||||
LayoutParams lp = (LayoutParams) menuOptionView.getLayoutParams();
|
||||
mTaskView.getPagedOrientationHandler().setLayoutParamsForTaskMenuOptionItem(lp);
|
||||
menuOptionView.setOnClickListener(menuOption);
|
||||
mOptionLayout.addView(menuOptionView);
|
||||
}
|
||||
|
||||
private void orientAroundTaskView(TaskView taskView) {
|
||||
PagedOrientationHandler orientationHandler = taskView.getPagedOrientationHandler();
|
||||
measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
|
||||
mActivity.getDragLayer().getDescendantRectRelativeToSelf(taskView, sTempRect);
|
||||
Rect insets = mActivity.getDragLayer().getInsets();
|
||||
BaseDragLayer.LayoutParams params = (BaseDragLayer.LayoutParams) getLayoutParams();
|
||||
params.width = taskView.getMeasuredWidth();
|
||||
params.width = orientationHandler.getTaskMenuWidth(taskView.getThumbnail());
|
||||
params.gravity = Gravity.START;
|
||||
setLayoutParams(params);
|
||||
setScaleX(taskView.getScaleX());
|
||||
setScaleY(taskView.getScaleY());
|
||||
setPosition(sTempRect.left - insets.left, sTempRect.top - insets.top);
|
||||
mOptionLayout.setOrientation(orientationHandler.getTaskMenuLayoutOrientation());
|
||||
setPosition(sTempRect.left - insets.left, sTempRect.top - insets.top,
|
||||
taskView.getPagedOrientationHandler());
|
||||
}
|
||||
|
||||
private void animateOpen() {
|
||||
|
||||
+5
-2
@@ -36,6 +36,7 @@ import android.graphics.RectF;
|
||||
import android.graphics.Shader;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.FloatProperty;
|
||||
import android.util.Log;
|
||||
import android.util.Property;
|
||||
import android.view.Surface;
|
||||
import android.view.View;
|
||||
@@ -103,6 +104,7 @@ public class TaskThumbnailView extends View implements PluginListener<OverviewSc
|
||||
|
||||
private boolean mOverlayEnabled;
|
||||
private OverviewScreenshotActions mOverviewScreenshotActionsPlugin;
|
||||
private boolean mIsMultiWindowMode;
|
||||
|
||||
public TaskThumbnailView(Context context) {
|
||||
this(context, null);
|
||||
@@ -124,7 +126,8 @@ public class TaskThumbnailView extends View implements PluginListener<OverviewSc
|
||||
mPreviewPositionHelper = new PreviewPositionHelper(context);
|
||||
}
|
||||
|
||||
public void bind(Task task) {
|
||||
public void bind(Task task, boolean isMultiWindowMode) {
|
||||
mIsMultiWindowMode = isMultiWindowMode;
|
||||
mOverlay.reset();
|
||||
mTask = task;
|
||||
int color = task == null ? Color.BLACK : task.colorBackground | 0xFF000000;
|
||||
@@ -350,7 +353,7 @@ public class TaskThumbnailView extends View implements PluginListener<OverviewSc
|
||||
mPreviewRect.set(0, 0, mThumbnailData.thumbnail.getWidth(),
|
||||
mThumbnailData.thumbnail.getHeight());
|
||||
mPreviewPositionHelper.updateThumbnailMatrix(mPreviewRect, mThumbnailData,
|
||||
mActivity.isInMultiWindowMode(), getMeasuredWidth(), getMeasuredHeight());
|
||||
mIsMultiWindowMode, getMeasuredWidth(), getMeasuredHeight());
|
||||
|
||||
mBitmapShader.setLocalMatrix(mPreviewPositionHelper.mMatrix);
|
||||
mPaint.setShader(mBitmapShader);
|
||||
|
||||
@@ -42,6 +42,8 @@ import android.graphics.Outline;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.GradientDrawable;
|
||||
import android.graphics.drawable.InsetDrawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Process;
|
||||
@@ -174,11 +176,12 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
|
||||
// Order in which the footers appear. Lower order appear below higher order.
|
||||
public static final int INDEX_DIGITAL_WELLBEING_TOAST = 0;
|
||||
public static final int INDEX_PROACTIVE_SUGGEST = 1;
|
||||
private final FooterWrapper[] mFooters = new FooterWrapper[2];
|
||||
private float mFooterVerticalOffset = 0;
|
||||
private float mFooterAlpha = 1;
|
||||
private int mStackHeight;
|
||||
private View mContextualChipWrapper;
|
||||
private View mContextualChip;
|
||||
|
||||
public TaskView(Context context) {
|
||||
this(context, null);
|
||||
@@ -255,8 +258,21 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
footer.animateHide();
|
||||
}
|
||||
}
|
||||
if (mContextualChipWrapper != null) {
|
||||
mContextualChipWrapper.animate().alpha(0f).setDuration(300);
|
||||
}
|
||||
if (mContextualChip != null) {
|
||||
mContextualChip.animate().scaleX(0f).scaleY(0f).setDuration(300);
|
||||
}
|
||||
|
||||
mIconView.animate().alpha(0.0f);
|
||||
} else {
|
||||
if (mContextualChip != null) {
|
||||
mContextualChip.animate().scaleX(1f).scaleY(1f).setDuration(300);
|
||||
}
|
||||
if (mContextualChipWrapper != null) {
|
||||
mContextualChipWrapper.animate().alpha(1f).setDuration(300);
|
||||
}
|
||||
mIconView.animate().alpha(1.0f);
|
||||
}
|
||||
|
||||
@@ -288,11 +304,14 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
|
||||
/**
|
||||
* Updates this task view to the given {@param task}.
|
||||
*
|
||||
* TODO(b/142282126) Re-evaluate if we need to pass in isMultiWindowMode after
|
||||
* that issue is fixed
|
||||
*/
|
||||
public void bind(Task task, RecentsOrientedState orientedState) {
|
||||
public void bind(Task task, RecentsOrientedState orientedState, boolean isMultiWindowMode) {
|
||||
cancelPendingLoadTasks();
|
||||
mTask = task;
|
||||
mSnapshotView.bind(task);
|
||||
mSnapshotView.bind(task, isMultiWindowMode);
|
||||
setOrientationState(orientedState);
|
||||
}
|
||||
|
||||
@@ -466,6 +485,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
int iconRotation = orientationState.getTouchRotation();
|
||||
PagedOrientationHandler orientationHandler = orientationState.getOrientationHandler();
|
||||
boolean isRtl = orientationHandler.getRecentsRtlSetting(getResources());
|
||||
LayoutParams snapshotParams = (LayoutParams) mSnapshotView.getLayoutParams();
|
||||
int thumbnailPadding = (int) getResources().getDimension(R.dimen.task_thumbnail_top_margin);
|
||||
LayoutParams iconParams = (LayoutParams) mIconView.getLayoutParams();
|
||||
int rotation = orientationState.getTouchRotationDegrees();
|
||||
@@ -473,7 +493,8 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
case Surface.ROTATION_90:
|
||||
iconParams.gravity = (isRtl ? END : START) | CENTER_VERTICAL;
|
||||
iconParams.rightMargin = -thumbnailPadding;
|
||||
iconParams.leftMargin = iconParams.topMargin = iconParams.bottomMargin = 0;
|
||||
iconParams.leftMargin = 0;
|
||||
iconParams.topMargin = snapshotParams.topMargin / 2;
|
||||
break;
|
||||
case Surface.ROTATION_180:
|
||||
iconParams.gravity = BOTTOM | CENTER_HORIZONTAL;
|
||||
@@ -483,17 +504,21 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
case Surface.ROTATION_270:
|
||||
iconParams.gravity = (isRtl ? END : START) | CENTER_VERTICAL;
|
||||
iconParams.leftMargin = -thumbnailPadding;
|
||||
iconParams.rightMargin = iconParams.topMargin = iconParams.bottomMargin = 0;
|
||||
iconParams.rightMargin = 0;
|
||||
iconParams.topMargin = snapshotParams.topMargin / 2;
|
||||
break;
|
||||
case Surface.ROTATION_0:
|
||||
default:
|
||||
iconParams.gravity = TOP | CENTER_HORIZONTAL;
|
||||
iconParams.leftMargin = iconParams.topMargin = iconParams.rightMargin =
|
||||
iconParams.bottomMargin = 0;
|
||||
iconParams.leftMargin = iconParams.topMargin = iconParams.rightMargin = 0;
|
||||
break;
|
||||
}
|
||||
mIconView.setLayoutParams(iconParams);
|
||||
mIconView.setRotation(rotation);
|
||||
|
||||
if (mMenuView != null) {
|
||||
mMenuView.onRotationChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void setIconAndDimTransitionProgress(float progress, boolean invert) {
|
||||
@@ -600,7 +625,10 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
}
|
||||
|
||||
if (mMenuView != null) {
|
||||
mMenuView.setPosition(getX() - getRecentsView().getScrollX(), getY());
|
||||
PagedOrientationHandler pagedOrientationHandler = getPagedOrientationHandler();
|
||||
RecentsView recentsView = getRecentsView();
|
||||
mMenuView.setPosition(getX() - recentsView.getScrollX(),
|
||||
getY() - recentsView.getScrollY(), pagedOrientationHandler);
|
||||
mMenuView.setScaleX(getScaleX());
|
||||
mMenuView.setScaleY(getScaleY());
|
||||
}
|
||||
@@ -657,6 +685,64 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
return oldFooter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the contextual chip.
|
||||
*
|
||||
* @param view Wrapper view containing contextual chip.
|
||||
*/
|
||||
public void setContextualChip(View view) {
|
||||
if (mContextualChipWrapper != null) {
|
||||
removeView(mContextualChipWrapper);
|
||||
}
|
||||
if (view != null) {
|
||||
mContextualChipWrapper = view;
|
||||
LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT,
|
||||
LayoutParams.WRAP_CONTENT);
|
||||
layoutParams.gravity = BOTTOM | CENTER_HORIZONTAL;
|
||||
int expectedChipHeight = getExpectedViewHeight(view);
|
||||
float chipOffset = getResources().getDimension(R.dimen.chip_hint_vertical_offset);
|
||||
layoutParams.bottomMargin = (int)
|
||||
(((MarginLayoutParams) mSnapshotView.getLayoutParams()).bottomMargin
|
||||
- expectedChipHeight + chipOffset);
|
||||
mContextualChip = ((FrameLayout) mContextualChipWrapper).getChildAt(0);
|
||||
mContextualChip.setScaleX(0f);
|
||||
mContextualChip.setScaleY(0f);
|
||||
GradientDrawable scrimDrawable = (GradientDrawable) getResources().getDrawable(
|
||||
R.drawable.chip_scrim_gradient, mActivity.getTheme());
|
||||
float cornerRadius = TaskCornerRadius.get(mActivity);
|
||||
scrimDrawable.setCornerRadii(
|
||||
new float[]{0, 0, 0, 0, cornerRadius, cornerRadius, cornerRadius,
|
||||
cornerRadius});
|
||||
InsetDrawable scrimDrawableInset = new InsetDrawable(scrimDrawable, 0, 0, 0,
|
||||
(int) (expectedChipHeight - chipOffset));
|
||||
mContextualChipWrapper.setBackground(scrimDrawableInset);
|
||||
mContextualChipWrapper.setPadding(0, 0, 0, 0);
|
||||
mContextualChipWrapper.setAlpha(0f);
|
||||
addView(view, getChildCount(), layoutParams);
|
||||
if (mContextualChip != null) {
|
||||
mContextualChip.animate().scaleX(1f).scaleY(1f).setDuration(50);
|
||||
}
|
||||
if (mContextualChipWrapper != null) {
|
||||
mContextualChipWrapper.animate().alpha(1f).setDuration(50);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the contextual chip from TaskView.
|
||||
*
|
||||
* @return The contextual chip wrapper view to be recycled.
|
||||
*/
|
||||
public View clearContextualChip() {
|
||||
if (mContextualChipWrapper != null) {
|
||||
removeView(mContextualChipWrapper);
|
||||
}
|
||||
View oldContextualChipWrapper = mContextualChipWrapper;
|
||||
mContextualChipWrapper = null;
|
||||
mContextualChip = null;
|
||||
return oldContextualChipWrapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
super.onLayout(changed, left, top, right, bottom);
|
||||
@@ -750,14 +836,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
mDelegate = mOldOutlineProvider == null
|
||||
? ViewOutlineProvider.BACKGROUND : mOldOutlineProvider;
|
||||
|
||||
int h = view.getLayoutParams().height;
|
||||
if (h > 0) {
|
||||
mExpectedHeight = h;
|
||||
} else {
|
||||
int m = MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY - 1, MeasureSpec.AT_MOST);
|
||||
view.measure(m, m);
|
||||
mExpectedHeight = view.getMeasuredHeight();
|
||||
}
|
||||
mExpectedHeight = getExpectedViewHeight(view);
|
||||
mOldPaddingBottom = view.getPaddingBottom();
|
||||
|
||||
if (mOldOutlineProvider != null) {
|
||||
@@ -819,6 +898,19 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
}
|
||||
}
|
||||
|
||||
private int getExpectedViewHeight(View view) {
|
||||
int expectedHeight;
|
||||
int h = view.getLayoutParams().height;
|
||||
if (h > 0) {
|
||||
expectedHeight = h;
|
||||
} else {
|
||||
int m = MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY - 1, MeasureSpec.AT_MOST);
|
||||
view.measure(m, m);
|
||||
expectedHeight = view.getMeasuredHeight();
|
||||
}
|
||||
return expectedHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
|
||||
super.onInitializeAccessibilityNodeInfo(info);
|
||||
@@ -874,6 +966,10 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
|
||||
return (RecentsView) getParent();
|
||||
}
|
||||
|
||||
PagedOrientationHandler getPagedOrientationHandler() {
|
||||
return getRecentsView().mOrientationState.getOrientationHandler();
|
||||
}
|
||||
|
||||
public void notifyTaskLaunchFailed(String tag) {
|
||||
String msg = "Failed to launch task";
|
||||
if (mTask != null) {
|
||||
|
||||
@@ -18,6 +18,12 @@
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/gesture_tutorial_background_color">
|
||||
|
||||
<View
|
||||
android:id="@+id/gesture_tutorial_ripple_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/gesture_tutorial_ripple"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/gesture_tutorial_fragment_hand_coaching"
|
||||
android:layout_width="match_parent"
|
||||
@@ -66,6 +72,17 @@
|
||||
style="@style/TextAppearance.GestureTutorial.Subtitle"/>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/gesture_tutorial_fragment_feedback_view"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_above="@id/gesture_tutorial_fragment_action_button"
|
||||
android:layout_marginStart="@dimen/gesture_tutorial_feedback_margin_start_end"
|
||||
android:layout_marginEnd="@dimen/gesture_tutorial_feedback_margin_start_end"
|
||||
style="@style/TextAppearance.GestureTutorial.Feedback"/>
|
||||
|
||||
<!-- android:stateListAnimator="@null" removes shadow and normal on click behavior (increase
|
||||
of elevation and shadow) which is replaced by ripple effect in android:foreground -->
|
||||
<Button
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"Усе праграмы"</string>
|
||||
<string name="all_apps_prediction_tip" msgid="2672336544844936186">"Вашы праграмы з падказак"</string>
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"Атрымлiвайце прамы доступ да праграм, якімі вы карыстаецеся найбольш часта"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"Pixel падказвае, якія праграмы могуць спатрэбіцца вам далей, і памяшчае іх на Галоўны экран. Дакраніцеся, каб наладзіць."</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"Pixel падказвае, якія праграмы могуць спатрэбіцца вам далей, і размяшчае іх на Галоўным экране. Дакраніцеся, каб наладзіць."</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"Атрымлівайце прапановы праграм у ніжнім радку на Галоўным экране."</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"Атрымлiвайце доступ да праграм, якімі вы карыстаецеся найбольш часта, непасрэдна з Галоўнага экрана. Прапановы будуць змяняцца ў залежнасці ад вашых дзеянняў. Праграмы, якія знаходзяцца ў ніжнім радку, будуць перамешчаны на Галоўны экран."</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"Атрымлiвайце просты доступ да праграм, якімі вы карыстаецеся найбольш часта, непасрэдна з Галоўнага экрана. Прапановы будуць змяняцца ў залежнасці ад вашых дзеянняў. Праграмы, якія знаходзяцца ў ніжнім радку, будуць перамешчаны ў новую папку."</string>
|
||||
@@ -41,7 +41,7 @@
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"Не, дзякуй"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"Налады"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"Тут з\'яўляюцца праграмы, якімі вы карыстаецеся найбольш часта. Гэты спіс змяняецца на падставе вашых дзеянняў"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"Перацягніце праграмы з ніжняга радку, каб атрымаць прапановы праграм"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"Перацягніце праграмы з ніжняга радка, каб атрымаць прапановы праграм"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"Прапановы праграм дададзены на свабоднае месца"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Праграма з падказкі: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"Абагуліць"</string>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<string name="recents_clear_all" msgid="5328176793634888831">"Alle Apps schließen"</string>
|
||||
<string name="accessibility_recent_apps" msgid="4058661986695117371">"Zuletzt aktive Apps"</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="shorter_duration_less_than_one_minute" msgid="4722015666335015336">"< 1 Min."</string>
|
||||
<string name="time_left_for_app" msgid="3111996412933644358">"Heute noch <xliff:g id="TIME">%1$s</xliff:g>"</string>
|
||||
<string name="title_app_suggestions" msgid="4185902664111965088">"App-Vorschläge"</string>
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"Alle Apps"</string>
|
||||
|
||||
@@ -22,16 +22,28 @@
|
||||
<string name="recent_task_option_split_screen" msgid="5353188922202653570">"Zatitu pantaila"</string>
|
||||
<string name="recent_task_option_pin" msgid="7929860679018978258">"Ainguratu"</string>
|
||||
<string name="recent_task_option_freeform" msgid="48863056265284071">"Modu librea"</string>
|
||||
<string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"Ikuspegi orokorra"</string>
|
||||
<string name="recents_empty_message" msgid="7040467240571714191">"Ez dago azkenaldi honetako ezer"</string>
|
||||
<string name="accessibility_close_task" msgid="5354563209433803643">"Itxi"</string>
|
||||
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Aplikazioen erabileraren ezarpenak"</string>
|
||||
<string name="recents_clear_all" msgid="5328176793634888831">"Garbitu guztiak"</string>
|
||||
<string name="accessibility_recent_apps" msgid="4058661986695117371">"Azken aplikazioak"</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">"<xliff:g id="TIME">%1$s</xliff:g> gelditzen dira gaur"</string>
|
||||
<string name="title_app_suggestions" msgid="4185902664111965088">"Iradokitako aplikazioak"</string>
|
||||
<string name="title_app_suggestions" msgid="4185902664111965088">"Aplikazioen iradokizunak"</string>
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"Aplikazio guztiak"</string>
|
||||
<string name="all_apps_prediction_tip" msgid="2672336544844936186">"Lagungarri izan dakizkizukeen aplikazioak"</string>
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"Atzitu erraz aplikazio erabilienak"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"Hurrena zer beharko duzun iragartzen du Pixel-ek, hasierako pantailan bertan. Sakatu konfiguratzeko."</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"Jaso aplikazioen iradokizunak hasierako pantailaren beheko errenkadan"</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"Atzitu erraz aplikazio erabilienak hasierako pantailatik bertatik. Ohituren arabera aldatuko dira iradokizunak. Hasierako pantailara eramango dira beheko errenkadan dauden aplikazioak."</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"Atzitu erraz aplikazio erabilienak hasierako pantailatik bertatik. Ohituren arabera aldatuko dira iradokizunak. Karpeta berri batera eramango dira beheko errenkadan dauden aplikazioak."</string>
|
||||
<string name="hotseat_edu_accept" msgid="1611544083278999837">"Jaso aplikazioen iradokizunak"</string>
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"Ez"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"Ezarpenak"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"Hemen agertzen dira aplikazio erabilienak, eta ohituren arabera aldatzen dira"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"Arrastatu aplikazioak beheko errenkadatik aplikazioen iradokizunak jasotzeko"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"Aplikazioen iradokizunak eremu huts batean gehitu dira"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Iragarritako aplikazioa: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"Partekatu"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"Atera pantaila-argazki bat"</string>
|
||||
</resources>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"Non merci"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"Paramètres"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"Les applications les plus utilisées s\'affichent ici et changent en fonction des habitudes"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"Sortez des applications de la rangée du bas en les faisant glisser pour obtenir des applications suggérées"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"Faites glisser des applications hors de la rangée du bas pour obtenir des applications suggérées"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"Applications suggérées ajoutées à l\'espace vide"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Application prédite : <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"Partager"</string>
|
||||
|
||||
@@ -22,9 +22,7 @@
|
||||
<string name="recent_task_option_split_screen" msgid="5353188922202653570">"સ્ક્રીનને વિભાજિત કરો"</string>
|
||||
<string name="recent_task_option_pin" msgid="7929860679018978258">"પિન કરો"</string>
|
||||
<string name="recent_task_option_freeform" msgid="48863056265284071">"ફ્રિફોર્મ"</string>
|
||||
<string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ઝલક"</string>
|
||||
<string name="recents_empty_message" msgid="7040467240571714191">"તાજેતરની કોઈ આઇટમ નથી"</string>
|
||||
<string name="accessibility_close_task" msgid="5354563209433803643">"બંધ કરો"</string>
|
||||
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"ઍપ વપરાશનું સેટિંગ"</string>
|
||||
<string name="recents_clear_all" msgid="5328176793634888831">"બધું સાફ કરો"</string>
|
||||
<string name="accessibility_recent_apps" msgid="4058661986695117371">"તાજેતરની ઍપ"</string>
|
||||
@@ -34,4 +32,18 @@
|
||||
<string name="title_app_suggestions" msgid="4185902664111965088">"ઍપ સૂચનો"</string>
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"બધી ઍપ"</string>
|
||||
<string name="all_apps_prediction_tip" msgid="2672336544844936186">"તમારી પૂર્વાનુમાનિત ઍપ"</string>
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"તમારી સૌથી વધુ વપરાતી ઍપને સરળતાથી ઍક્સેસ કરો"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"તમને હવે ઓછી જરૂર પડવાની હોય તે ઍપનું અનુમાન લગાવે છે અને તેમને સીધી હોમ સ્ક્રીન પર લાવે છે. સેટઅપ કરવા માટે ટૅપ કરો."</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"તમારી હોમ સ્ક્રીનની નીચલી પંક્તિમાં ઍપના સૂચનો મેળવો"</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"તમારી સૌથી વધુ વપરાતી ઍપને સીધી હોમ સ્ક્રીન પરથી જ સરળતાથી ઍક્સેસ કરો. સૂચનો તમારા રૂટિનના આધારે બદલાશે. નીચેની પંક્તિમાં રહેલી ઍપ તમારી હોમ સ્ક્રીન પર ખસેડાશે."</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"તમારી સૌથી વધુ વપરાતી ઍપને સીધી હોમ સ્ક્રીન પરથી જ સરળતાથી ઍક્સેસ કરો. સૂચનો તમારા રૂટિનના આધારે બદલાશે. નીચેની પંક્તિમાં રહેલી ઍપ નવા ફોલ્ડરમાં ખસેડાશે."</string>
|
||||
<string name="hotseat_edu_accept" msgid="1611544083278999837">"ઍપ અંગેના સૂચનો મેળવો"</string>
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"ના, આભાર"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"સેટિંગ"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"સૌથી વધુ વપરાતી ઍપ અહીં દેખાય છે અને રૂટિનના આધારે બદલાય છે"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"ઍપ અંગેના સૂચનો મેળવવા માટે ઍપને નીચલી પંક્તિમાંથી બહાર ખેંચો"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"ઍપ અંગેના સૂચનો ખાલી જગ્યામાં ઉમેરાયા"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"પૂર્વાનુમાનિત ઍપ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"શેર કરો"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"સ્ક્રીનશૉટ"</string>
|
||||
</resources>
|
||||
|
||||
@@ -22,9 +22,7 @@
|
||||
<string name="recent_task_option_split_screen" msgid="5353188922202653570">"ແບ່ງໜ້າຈໍ"</string>
|
||||
<string name="recent_task_option_pin" msgid="7929860679018978258">"ປັກໝຸດ"</string>
|
||||
<string name="recent_task_option_freeform" msgid="48863056265284071">"ຮູບແບບອິດສະຫລະ"</string>
|
||||
<string name="accessibility_desc_recent_apps" msgid="1444379410873162882">"ພາບຮວມ"</string>
|
||||
<string name="recents_empty_message" msgid="7040467240571714191">"ບໍ່ມີລາຍການຫຼ້າສຸດ"</string>
|
||||
<string name="accessibility_close_task" msgid="5354563209433803643">"ປິດ"</string>
|
||||
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"ການຕັ້ງຄ່າການນຳໃຊ້ແອັບ"</string>
|
||||
<string name="recents_clear_all" msgid="5328176793634888831">"ລຶບລ້າງທັງໝົດ"</string>
|
||||
<string name="accessibility_recent_apps" msgid="4058661986695117371">"ແອັບຫຼ້າສຸດ"</string>
|
||||
@@ -34,4 +32,18 @@
|
||||
<string name="title_app_suggestions" msgid="4185902664111965088">"ການແນະນຳແອັບ"</string>
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"ແອັບທັງໝົດ"</string>
|
||||
<string name="all_apps_prediction_tip" msgid="2672336544844936186">"ແອັບທີ່ຄາດເດົາໄວ້ແລ້ວຂອງທ່ານ"</string>
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"ເຂົ້າເຖິງແອັບທີ່ທ່ານໃຊ້ຫຼາຍທີ່ສຸດໄດ້ຢ່າງງ່າຍດາຍ"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"Pixel ຈະຄາດເດົາແອັບທີ່ທ່ານຈະໃຊ້ຕໍ່ໄປທັນທີຢູ່ໜ້າຈໍຫຼັກຂອງທ່ານ. ແຕະເພື່ອຕັ້ງຄ່າ."</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"ຮັບການແນະນຳແອັບຢູ່ແຖວລຸ່ມສຸດຂອງໜ້າຈໍຫຼັກທ່ານ"</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"ເຂົ້າເຖິງແອັບທີ່ທ່ານໃຊ້ຫຼາຍທີ່ສຸດໄດ້ຢ່າງງ່າຍດາຍທັນທີຈາກໜ້າຈໍຫຼັກ. ການແນະນຳຈະປ່ຽນແປງຕາມການນຳໃຊ້ປະຈຳຂອງທ່ານ. ແອັບຢູ່ແຖວລຸ່ມສຸດຈະຍ້າຍຂຶ້ນໄປໃສ່ໜ້າຈໍຫຼັກຂອງທ່ານ."</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"ເຂົ້າເຖິງແອັບທີ່ທ່ານໃຊ້ຫຼາຍທີ່ສຸດໄດ້ຢ່າງງ່າຍດາຍທັນທີຈາກໜ້າຈໍຫຼັກ. ການແນະນຳຈະປ່ຽນແປງຕາມການນຳໃຊ້ປະຈຳຂອງທ່ານ. ແອັບຢູ່ແຖວລຸ່ມສຸດຈະຍ້າຍໄປໂຟນເດີໃໝ່."</string>
|
||||
<string name="hotseat_edu_accept" msgid="1611544083278999837">"ຮັບການແນະນຳແອັບ"</string>
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"ບໍ່, ຂອບໃຈ"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"ການຕັ້ງຄ່າ"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"ແອັບທີ່ໃຊ້ຫຼາຍທີ່ສຸດຈະປາກົດຢູ່ບ່ອນນີ້ ແລະ ປ່ຽນໄປຕາມການນຳໃຊ້ປະຈຳ"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"ລາກແອັບຈາກແຖບລຸ່ມສຸດເພື່ອຮັບການແນະນຳແອັບ"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"ເພີ່ມການແນະນຳແອັບໃສ່ພື້ນທີ່ຫວ່າງແລ້ວ"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ແອັບທີ່ຄາດເດົາໄວ້: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"ແບ່ງປັນ"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"ຮູບໜ້າຈໍ"</string>
|
||||
</resources>
|
||||
|
||||
@@ -32,32 +32,18 @@
|
||||
<string name="title_app_suggestions" msgid="4185902664111965088">"ആപ്പ് നിർദ്ദേശങ്ങൾ"</string>
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"എല്ലാ ആപ്പുകളും"</string>
|
||||
<string name="all_apps_prediction_tip" msgid="2672336544844936186">"നിങ്ങളുടെ പ്രവചിക്കപ്പെട്ട ആപ്പുകൾ"</string>
|
||||
<!-- no translation found for hotseat_edu_prompt_title (5595771595144175752) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_prompt_content (5709176001504149521) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_title_migrate (306578144424489980) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_message_migrate (8927179260533775320) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_message_migrate_alt (3042360119039646356) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_accept (1611544083278999837) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_dismiss (2781161822780201689) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_turn_off (7808360330229368470) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_auto_enrolled (522100018967146807) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_tip_no_empty_slots (1325212677738179185) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_tip_gaps_filled (3035673010274223538) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_prediction_content_description (4582028296938078419) -->
|
||||
<skip />
|
||||
<!-- no translation found for action_share (2648470652637092375) -->
|
||||
<skip />
|
||||
<!-- no translation found for action_screenshot (8171125848358142917) -->
|
||||
<skip />
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"നിങ്ങൾ ഏറ്റവുമധികം ഉപയോഗിച്ച ആപ്പുകൾ എളുപ്പത്തിൽ ആക്സസ് ചെയ്യുക"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"അടുത്തതായി നിങ്ങൾക്ക് ആവശ്യമുള്ള ആപ്പുകൾ, ഹോം സ്ക്രീനിൽ തന്നെ Pixel പ്രവചിക്കുന്നു. സജ്ജീകരിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"നിങ്ങളുടെ ഹോം സ്ക്രീനിന്റെ താഴത്തെ നിരയിൽ ആപ്പ് നിർദ്ദേശങ്ങൾ നേടുക"</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"നിങ്ങൾ ഏറ്റവും കൂടുതൽ ഉപയോഗിച്ച ആപ്പുകൾ ഹോം സ്ക്രീനിൽ നിന്ന് തന്നെ എളുപ്പത്തിൽ ആക്സസ് ചെയ്യൂ. നിങ്ങളുടെ ദിനചര്യകളുടെ അടിസ്ഥാനത്തിൽ നിർദ്ദേശങ്ങൾ മാറും. താഴത്തെ നിരയിലുള്ള ആപ്പുകൾ നിങ്ങളുടെ ഹോം സ്ക്രീനിലേക്ക് നീങ്ങും."</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"നിങ്ങൾ ഏറ്റവും കൂടുതൽ ഉപയോഗിച്ച ആപ്പുകൾ ഹോം സ്ക്രീനിൽ നിന്ന് തന്നെ എളുപ്പത്തിൽ ആക്സസ് ചെയ്യൂ. നിങ്ങളുടെ ദിനചര്യകളുടെ അടിസ്ഥാനത്തിൽ നിർദ്ദേശങ്ങൾ മാറും. താഴത്തെ നിരയിലുള്ള ആപ്പുകൾ പുതിയൊരു ഫോൾഡറിലേക്ക് നീങ്ങും."</string>
|
||||
<string name="hotseat_edu_accept" msgid="1611544083278999837">"ആപ്പ് നിർദ്ദേശങ്ങൾ നേടുക"</string>
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"വേണ്ട"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"ക്രമീകരണം"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"ഏറ്റവുമധികം ഉപയോഗിക്കുന്ന ആപ്പുകൾ ഇവിടെ ദൃശ്യമാകും, ദിനചര്യയ്ക്ക് അനുസരിച്ച് അത് മാറുകയും ചെയ്യും"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"ആപ്പ് നിർദ്ദേശങ്ങൾ നേടാൻ താഴത്തെ നിരയിലെ ആപ്പുകൾ വലിച്ചിടുക"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"ആപ്പ് നിർദ്ദേശങ്ങൾ ഒഴിഞ്ഞ സ്ഥലത്തേക്ക് ചേർത്തു"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"പ്രവചിച്ച ആപ്പ്: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"പങ്കിടുക"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"സ്ക്രീൻഷോട്ട്"</string>
|
||||
</resources>
|
||||
|
||||
@@ -25,39 +25,25 @@
|
||||
<string name="recents_empty_message" msgid="7040467240571714191">"हालसालैको कुनै पनि वस्तु छैन"</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>
|
||||
<string name="title_app_suggestions" msgid="4185902664111965088">"अनुप्रयोगसम्बन्धी सुझावहरू"</string>
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"सबै अनुप्रयोगहरू"</string>
|
||||
<string name="all_apps_prediction_tip" msgid="2672336544844936186">"तपाईंका पूर्वानुमानित अनुप्रयोगहरू"</string>
|
||||
<!-- no translation found for hotseat_edu_prompt_title (5595771595144175752) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_prompt_content (5709176001504149521) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_title_migrate (306578144424489980) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_message_migrate (8927179260533775320) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_message_migrate_alt (3042360119039646356) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_accept (1611544083278999837) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_dismiss (2781161822780201689) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_turn_off (7808360330229368470) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_auto_enrolled (522100018967146807) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_tip_no_empty_slots (1325212677738179185) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_tip_gaps_filled (3035673010274223538) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_prediction_content_description (4582028296938078419) -->
|
||||
<skip />
|
||||
<!-- no translation found for action_share (2648470652637092375) -->
|
||||
<skip />
|
||||
<!-- no translation found for action_screenshot (8171125848358142917) -->
|
||||
<skip />
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"सबै एपहरू"</string>
|
||||
<string name="all_apps_prediction_tip" msgid="2672336544844936186">"तपाईंका पूर्वानुमानित एपहरू"</string>
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"आफूले सबैभन्दा बढी प्रयोग गर्ने एपहरूमाथि सजिलै पहुँच राख्नुहोस्"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"Pixel ले तपाईंको गृह स्क्रिनमा तपाईंलाई अब कुन एप आवश्यक छ भन्ने कुराको पूर्वानुमान गर्छ। सेटअप गर्न ट्याप गर्नुहोस्।"</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"तपाईंको गृह स्क्रिनको पुछारको पङ्क्तिमा सिफारिस गरिएका एपहरू प्राप्त गर्नुहोस्"</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"गृह स्क्रिनबाटै आफूले सबैभन्दा बढी प्रयोग गर्ने एपमाथि सजिलैसँग पहुँच राख्नुहोस्। सिफारिस गरिने एपहरूको क्रम तपाईंले एप प्रयोग गर्ने समयतालिकाअनुसार बदलिने छ। फेदको पङ्क्तिमा रहेका एपहरू तपाईंको गृह स्क्रिनको सिरानमा सर्ने छन्।"</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"गृह स्क्रिनबाटै आफूले सबैभन्दा बढी प्रयोग गर्ने एपमाथि सजिलैसँग पहुँच राख्नुहोस्। सिफारिस गरिने एपहरूको क्रम तपाईंले एप प्रयोग गर्ने समयतालिकाअनुसार बदलिने छ। फेदको पङ्क्तिमा रहेका एपहरू एउटा नयाँ फोल्डरमा सर्ने छन्।"</string>
|
||||
<string name="hotseat_edu_accept" msgid="1611544083278999837">"सिफारिस गरिएका एपहरू प्राप्त गर्नुहोस्"</string>
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"पर्दैन धन्यवाद"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"सेटिङ"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"सबैभन्दा बढी प्रयोग हुने एपहरू यहाँ देखिन्छन् र यी एपहरूको क्रम तपाईंले एप प्रयोग गर्ने समयतालिकाअनुसार बदलिरहन्छ"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"सिफारिस गरिएका एपहरू प्राप्त गर्न फेदको पङ्क्तिमा रहेका एपहरू ड्र्याग गरी हटाउनुहोस्"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"खाली ठाउँमा सिफारिस गरिएका एपहरू थपिए"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"पूर्वानुमान गरिएको एप: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"सेयर गर्नुहोस्"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"स्क्रिनसट"</string>
|
||||
</resources>
|
||||
|
||||
@@ -32,32 +32,18 @@
|
||||
<string name="title_app_suggestions" msgid="4185902664111965088">"ଆପ୍ ପରାମର୍ଶଗୁଡ଼ିକ"</string>
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"ସମସ୍ତ ଆପ୍ସ"</string>
|
||||
<string name="all_apps_prediction_tip" msgid="2672336544844936186">"ଆପଣ ପୂର୍ବାନୁମାନ କରିଥିବା ଆପ୍ସ"</string>
|
||||
<!-- no translation found for hotseat_edu_prompt_title (5595771595144175752) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_prompt_content (5709176001504149521) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_title_migrate (306578144424489980) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_message_migrate (8927179260533775320) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_message_migrate_alt (3042360119039646356) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_accept (1611544083278999837) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_dismiss (2781161822780201689) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_turn_off (7808360330229368470) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_auto_enrolled (522100018967146807) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_tip_no_empty_slots (1325212677738179185) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_tip_gaps_filled (3035673010274223538) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_prediction_content_description (4582028296938078419) -->
|
||||
<skip />
|
||||
<!-- no translation found for action_share (2648470652637092375) -->
|
||||
<skip />
|
||||
<!-- no translation found for action_screenshot (8171125848358142917) -->
|
||||
<skip />
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"ଆପଣଙ୍କ ସବୁଠାରୁ ଅଧିକ-ବ୍ୟବହୃତ ଆପଗୁଡ଼ିକୁ ସହଜରେ ଆକ୍ସେସ୍ କରନ୍ତୁ"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"ଆପଣଙ୍କୁ ପରବର୍ତ୍ତୀ ସମୟରେ କେଉଁ ଆପଗୁଡ଼ିକର ଆବଶ୍ୟକତା ହେବ, ତାହା Pixel ସିଧା ଆପଣଙ୍କ ମୂଳ ସ୍କ୍ରିନରେ ପୂର୍ବାନୁମାନ କରେ। ସେଟ୍ ଅପ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"ଆପଣଙ୍କ ମୂଳ ସ୍କ୍ରିନର ତଳ ଧାଡ଼ିରେ ଆପ୍ ପରାମର୍ଶଗୁଡ଼ିକ ପାଆନ୍ତୁ"</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"ଆପଣଙ୍କର ସବୁଠାରୁ ଅଧିକ-ବ୍ୟବହୃତ ଆପଗୁଡ଼ିକୁ ସିଧା ମୂଳ ସ୍କ୍ରିନରେ ସହଜରେ ଆକ୍ସେସ୍ କରନ୍ତୁ। ଆପଣଙ୍କ ରୁଟିନଗୁଡ଼ିକ ଆଧାରରେ ପରାମର୍ଶଗୁଡ଼ିକ ପରିବର୍ତ୍ତିତ ହେବ। ତଳ ଧାଡ଼ିରେ ଥିବା ଆପଗୁଡ଼ିକ ଆପଣଙ୍କ ମୂଳ ସ୍କ୍ରିନକୁ ମୁଭ୍ କରିଯିବ।"</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"ଆପଣଙ୍କର ସବୁଠାରୁ ଅଧିକ-ବ୍ୟବହୃତ ଆପଗୁଡ଼ିକୁ, ସିଧା ମୂଳ ସ୍କ୍ରିନରେ ସହଜରେ ଆକ୍ସେସ୍ କରନ୍ତୁ। ଆପଣଙ୍କ ରୁଟିନଗୁଡ଼ିକ ଆଧାରରେ ପରାମର୍ଶଗୁଡ଼ିକ ପରିବର୍ତ୍ତିତ ହେବ। ତଳ ଧାଡ଼ିରେ ଥିବା ଆପଗୁଡ଼ିକ ଏକ ନୂଆ ଫୋଲ୍ଡରକୁ ମୁଭ୍ କରିଯିବ।"</string>
|
||||
<string name="hotseat_edu_accept" msgid="1611544083278999837">"ଆପ୍ ପରାମର୍ଶଗୁଡ଼ିକ ପାଆନ୍ତୁ"</string>
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"ନାହିଁ, ଥାଉ"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"ସେଟିଂସ୍"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"ସବୁଠାରୁ ଅଧିକ-ବ୍ୟବହୃତ ଆପଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯାଏ ଏବଂ ରୁଟିନଗୁଡ଼ିକ ଆଧାରରେ ପରିବର୍ତ୍ତିତ ହୋଇଥାଏ"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"ଆପ୍ ପରାମର୍ଶଗୁଡ଼ିକ ପାଇବାକୁ ଆପଗୁଡ଼ିକୁ ତଳ ଧାଡ଼ିରୁ ଟାଣି ଆଣନ୍ତୁ"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"ଆପ୍ ପରାମର୍ଶଗୁଡ଼ିକ ଖାଲି ସ୍ଥାନରେ ଯୋଗ କରାଯାଇଛି"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ପୂର୍ବାନୁମାନ କରାଯାଇଥିବା ଆପ୍: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"ସେୟାର୍ କରନ୍ତୁ"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"ସ୍କ୍ରିନସଟ୍"</string>
|
||||
</resources>
|
||||
|
||||
@@ -35,14 +35,14 @@
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"Быстрый доступ к часто используемым приложениям"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"Устройство Pixel прогнозирует, какие приложения вы будете использовать в ближайшее время, и показывает их на главном экране. Нажмите, чтобы настроить."</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"Рекомендуемые приложения будут появляться в нижнем ряду на главном экране."</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"Для вашего удобства на главном экране отображаются часто используемые приложения на основе ваших последних действий. Приложения из нижнего ряда перемещаются на главный экран."</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"Для вашего удобства на главном экране отображаются часто используемые приложения на основе ваших последних действий. Приложения из нижнего ряда перемещаются в новую папку."</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"Быстрый доступ к часто используемым приложениям на главном экране. Список меняется с учетом ваших привычек. Приложения из нижнего ряда будут перемещены вверх на главный экран."</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"Быстрый доступ к часто используемым приложениям на главном экране. Список меняется с учетом ваших привычек. Приложения из нижнего ряда будут перемещены в новую папку."</string>
|
||||
<string name="hotseat_edu_accept" msgid="1611544083278999837">"Показывать рекомендуемые приложения"</string>
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"Отмена"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"Настройки"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"Здесь отображаются часто используемые приложения на основе ваших последних действий"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"Здесь появляются часто используемые приложения. Список меняется с учетом ваших привычек."</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"Перетащите приложения из нижнего ряда, чтобы получать рекомендации"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"Добавьте рекомендуемые приложения на свободный участок"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"Рекомендуемые приложения будут появляться на свободных местах"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Рекомендуемое приложение: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"Поделиться"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"Скриншот"</string>
|
||||
|
||||
@@ -32,17 +32,17 @@
|
||||
<string name="title_app_suggestions" msgid="4185902664111965088">"Aplikacionet e sugjeruara"</string>
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"Të gjitha aplikacionet"</string>
|
||||
<string name="all_apps_prediction_tip" msgid="2672336544844936186">"Aplikacionet e tua të parashikuara"</string>
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"Qasu me lehtësi në aplikacionet e tua të përdorura më shpesh"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"Pixel parashikon aplikacionet Pixel që do të të nevojiten më pas, drejtpërdrejt në ekranin tënd bazë. Trokit për ta konfiguruar."</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"Merr sugjerime rreth aplikacioneve në radhën e poshtme të ekranit tënd bazë"</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"Qasu me lehtësi në aplikacionet më të përdorura direkt në ekranin bazë. Sugjerimet do të ndryshojnë bazuar në rutinat e tua. Aplikacionet në radhën e poshtme do të zhvendosen lart në ekranin tënd bazë."</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"Qasu me lehtësi në aplikacionet më të përdorura, direkt në ekranin bazë. Sugjerimet do të ndryshojnë bazuar në rutinat e tua. Aplikacionet në radhën e poshtme do të zhvendosen në një dosje tjetër."</string>
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"Qasu me lehtësi në aplikacionet më të përdorura"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"Pixel parashikon aplikacionet Pixel që do të të nevojiten më pas, direkt në ekranin tënd bazë. Trokit për ta konfiguruar."</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"Merr aplikacione të sugjeruara në rreshtin e poshtëm të ekranit tënd bazë"</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"Qasu me lehtësi në aplikacionet më të përdorura direkt në ekranin bazë. Sugjerimet do të ndryshojnë bazuar në rutinat e tua. Aplikacionet në rreshtin e poshtëm do të zhvendosen lart në ekranin tënd bazë."</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"Qasu me lehtësi në aplikacionet më të përdorura, direkt në ekranin bazë. Sugjerimet do të ndryshojnë bazuar në rutinat e tua. Aplikacionet në rreshtin e poshtëm do të zhvendosen në një dosje tjetër."</string>
|
||||
<string name="hotseat_edu_accept" msgid="1611544083278999837">"Merr sugjerimet e aplikacioneve"</string>
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"Jo, faleminderit"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"Cilësimet"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"Aplikacionet më të përdorura shfaqen këtu dhe ndryshojnë bazuar në rutinat"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"Zvarrit aplikacionet jashtë radhës së poshtme për të marrë sugjerime rreth aplikacioneve"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"Sugjerimet e aplikacioneve u shtuan në hapësirën bosh"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"Zvarrit aplikacionet jashtë rreshtit të poshtëm për të marrë aplikacione të sugjeruara"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"Aplikacionet e sugjeruara u shtuan në hapësirën bosh"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplikacioni i parashikuar: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"Ndaj"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"Pamja e ekranit"</string>
|
||||
|
||||
@@ -32,32 +32,18 @@
|
||||
<string name="title_app_suggestions" msgid="4185902664111965088">"ஆப்ஸ் பரிந்துரைகள்"</string>
|
||||
<string name="all_apps_label" msgid="8542784161730910663">"அனைத்து ஆப்ஸும்"</string>
|
||||
<string name="all_apps_prediction_tip" msgid="2672336544844936186">"நீங்கள் கணித்த ஆப்ஸ்"</string>
|
||||
<!-- no translation found for hotseat_edu_prompt_title (5595771595144175752) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_prompt_content (5709176001504149521) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_title_migrate (306578144424489980) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_message_migrate (8927179260533775320) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_message_migrate_alt (3042360119039646356) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_accept (1611544083278999837) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_edu_dismiss (2781161822780201689) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_turn_off (7808360330229368470) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_auto_enrolled (522100018967146807) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_tip_no_empty_slots (1325212677738179185) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_tip_gaps_filled (3035673010274223538) -->
|
||||
<skip />
|
||||
<!-- no translation found for hotseat_prediction_content_description (4582028296938078419) -->
|
||||
<skip />
|
||||
<!-- no translation found for action_share (2648470652637092375) -->
|
||||
<skip />
|
||||
<!-- no translation found for action_screenshot (8171125848358142917) -->
|
||||
<skip />
|
||||
<string name="hotseat_edu_prompt_title" msgid="5595771595144175752">"அதிகமாகப் பயன்படுத்திய ஆப்ஸை எளிதாக அணுகலாம்"</string>
|
||||
<string name="hotseat_edu_prompt_content" msgid="5709176001504149521">"அடுத்ததாகத் தேவைப்படும் ஆப்ஸ் எது என்பதை Pixel கணித்து உங்கள் முகப்புத் திரையில் அதைக் காட்டும். அமைக்க, தட்டவும்."</string>
|
||||
<string name="hotseat_edu_title_migrate" msgid="306578144424489980">"முகப்புத் திரையின் கடைசி வரிசையில் ஆப்ஸ் பரிந்துரைகளைப் பெறலாம்"</string>
|
||||
<string name="hotseat_edu_message_migrate" msgid="8927179260533775320">"அதிகமாகப் பயன்படுத்திய ஆப்ஸை முகப்புத் திரையிலேயே அணுகலாம். உங்கள் வழக்கங்களின் அடிப்படையில் பரிந்துரைகள் மாறும். கடைசி வரிசையிலுள்ள ஆப்ஸ் உங்கள் முகப்புத் திரைக்கு நகர்த்தப்படும்."</string>
|
||||
<string name="hotseat_edu_message_migrate_alt" msgid="3042360119039646356">"அதிகமாகப் பயன்படுத்திய ஆப்ஸை முகப்புத் திரையிலேயே அணுகலாம். உங்கள் வழக்கங்களின் அடிப்படையில் பரிந்துரைகள் மாறும். கடைசி வரிசையிலுள்ள ஆப்ஸ் புதிய கோப்புறைக்கு நகர்த்தப்படும்."</string>
|
||||
<string name="hotseat_edu_accept" msgid="1611544083278999837">"ஆப்ஸ் பரிந்துரைகளைப் பெறுக"</string>
|
||||
<string name="hotseat_edu_dismiss" msgid="2781161822780201689">"வேண்டாம்"</string>
|
||||
<string name="hotseat_turn_off" msgid="7808360330229368470">"அமைப்புகள்"</string>
|
||||
<string name="hotseat_auto_enrolled" msgid="522100018967146807">"அதிகமாகப் பயன்படுத்திய ஆப்ஸ் இங்கே தோன்றும், வழக்கங்களின் அடிப்படையில் அவை மாறும்"</string>
|
||||
<string name="hotseat_tip_no_empty_slots" msgid="1325212677738179185">"ஆப்ஸ் பரிந்துரைகளைப் பெற கடைசி வரிசையிலிருந்து ஆப்ஸை இழுக்கவும்"</string>
|
||||
<string name="hotseat_tip_gaps_filled" msgid="3035673010274223538">"ஆப்ஸ் பரிந்துரைகள் காலி இடத்தில் சேர்க்கப்பட்டன"</string>
|
||||
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"கணித்த ஆப்ஸ்: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
|
||||
<string name="action_share" msgid="2648470652637092375">"பகிர்"</string>
|
||||
<string name="action_screenshot" msgid="8171125848358142917">"ஸ்கிரீன்ஷாட்"</string>
|
||||
</resources>
|
||||
|
||||
@@ -83,5 +83,6 @@
|
||||
<!-- Tips Gesture Tutorial -->
|
||||
<dimen name="gesture_tutorial_title_margin_start_end">40dp</dimen>
|
||||
<dimen name="gesture_tutorial_subtitle_margin_start_end">16dp</dimen>
|
||||
<dimen name="gesture_tutorial_feedback_margin_start_end">24dp</dimen>
|
||||
<dimen name="gesture_tutorial_button_margin_start_end">18dp</dimen>
|
||||
</resources>
|
||||
|
||||
@@ -97,12 +97,22 @@
|
||||
<string name="back_gesture_tutorial_playground_title_swipe_inward_right_edge" translatable="false">Try the back gesture</string>
|
||||
<!-- Subtitle shown during interactive parts of Back gesture tutorial for right edge. [CHAR LIMIT=60] -->
|
||||
<string name="back_gesture_tutorial_engaged_subtitle_swipe_inward_right_edge" translatable="false">Start at the right edge and swipe toward the middle</string>
|
||||
<!-- Feedback shown during interactive parts of Back gesture tutorial for right edge when the gesture is too far from the edge. [CHAR LIMIT=100] -->
|
||||
<string name="back_gesture_feedback_swipe_too_far_from_right_edge" translatable="false">Make sure you swipe from the far right edge</string>
|
||||
<!-- Feedback shown during interactive parts of Back gesture tutorial for right edge when the gesture is cancelled. [CHAR LIMIT=100] -->
|
||||
<string name="back_gesture_feedback_cancelled_right_edge" translatable="false">Make sure you swipe straight to the left and let go</string>
|
||||
|
||||
<!-- Title shown during interactive part of Back gesture tutorial for left edge. [CHAR LIMIT=30] -->
|
||||
<string name="back_gesture_tutorial_playground_title_swipe_inward_left_edge" translatable="false">Try the other side</string>
|
||||
<!-- Subtitle shown during interactive parts of Back gesture tutorial for left edge. [CHAR LIMIT=60] -->
|
||||
<string name="back_gesture_tutorial_engaged_subtitle_swipe_inward_left_edge" translatable="false">That\'s it! Now try swiping from the left edge.</string>
|
||||
<!-- Feedback shown during interactive parts of Back gesture tutorial for left edge when the gesture is too far from the edge. [CHAR LIMIT=100] -->
|
||||
<string name="back_gesture_feedback_swipe_too_far_from_left_edge" translatable="false">Make sure you swipe from the far left edge</string>
|
||||
<!-- Feedback shown during interactive parts of Back gesture tutorial for left edge when the gesture is cancelled. [CHAR LIMIT=100] -->
|
||||
<string name="back_gesture_feedback_cancelled_left_edge" translatable="false">Make sure you swipe straight to the right and let go</string>
|
||||
|
||||
<!-- Feedback shown during interactive parts of Back gesture tutorial when the gesture is within the nav bar region. [CHAR LIMIT=100] -->
|
||||
<string name="back_gesture_feedback_swipe_in_nav_bar" translatable="false">Make sure you don\'t swipe too close to the bottom of the screen</string>
|
||||
<!-- Subtitle shown on the confirmation screen after successful gesture. [CHAR LIMIT=60] -->
|
||||
<string name="back_gesture_tutorial_confirm_subtitle" translatable="false">To change the sensitivity of the back gesture, go to Settings</string>
|
||||
|
||||
@@ -111,6 +121,12 @@
|
||||
<string name="home_gesture_tutorial_playground_title" translatable="false">Tutorial: Go Home</string>
|
||||
<!-- Subtitle shown during interactive parts of Home gesture tutorial. [CHAR LIMIT=60] -->
|
||||
<string name="home_gesture_tutorial_playground_subtitle" translatable="false">Try swiping upward from the bottom edge of the screen</string>
|
||||
<!-- Feedback shown during interactive parts of Home gesture tutorial when the gesture is started too far from the edge. [CHAR LIMIT=100] -->
|
||||
<string name="home_gesture_feedback_swipe_too_far_from_edge" translatable="false">Make sure you swipe from the bottom edge of the screen</string>
|
||||
<!-- Feedback shown during interactive parts of Home gesture tutorial when the Overview gesture is detected. [CHAR LIMIT=100] -->
|
||||
<string name="home_gesture_feedback_overview_detected" translatable="false">Make sure you don\'t pause before letting go</string>
|
||||
<!-- Feedback shown during interactive parts of Home gesture tutorial when the gesture is horizontal instead of vertical. [CHAR LIMIT=100] -->
|
||||
<string name="home_gesture_feedback_wrong_swipe_direction" translatable="false">Make sure you swipe straight up</string>
|
||||
|
||||
<!-- Title shown on the confirmation screen after successful gesture. [CHAR LIMIT=30] -->
|
||||
<string name="gesture_tutorial_confirm_title" translatable="false">All set</string>
|
||||
|
||||
@@ -47,6 +47,14 @@
|
||||
<item name="android:textSize">21sp</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.GestureTutorial.Feedback"
|
||||
parent="TextAppearance.GestureTutorial">
|
||||
<item name="android:gravity">center</item>
|
||||
<item name="android:textColor">@color/gesture_tutorial_feedback_color</item>
|
||||
<item name="android:letterSpacing">0.03</item>
|
||||
<item name="android:textSize">21sp</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.GestureTutorial.ButtonLabel"
|
||||
parent="TextAppearance.GestureTutorial.CallToAction">
|
||||
<item name="android:gravity">center</item>
|
||||
|
||||
@@ -161,6 +161,8 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
@Override
|
||||
protected void setupViews() {
|
||||
super.setupViews();
|
||||
|
||||
SysUINavigationMode.INSTANCE.get(this).updateMode();
|
||||
mActionsView = findViewById(R.id.overview_actions_view);
|
||||
((RecentsView) getOverviewPanel()).init(mActionsView);
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
package com.android.launcher3.uioverrides.states;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.DEACCEL_2;
|
||||
import static com.android.launcher3.config.FeatureFlags.ENABLE_OVERVIEW_ACTIONS;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
@@ -76,7 +78,7 @@ public class AllAppsState extends LauncherState {
|
||||
public ScaleAndTranslation getWorkspaceScaleAndTranslation(Launcher launcher) {
|
||||
ScaleAndTranslation scaleAndTranslation = LauncherState.OVERVIEW
|
||||
.getWorkspaceScaleAndTranslation(launcher);
|
||||
if (SysUINavigationMode.getMode(launcher) == SysUINavigationMode.Mode.NO_BUTTON) {
|
||||
if (SysUINavigationMode.getMode(launcher) == NO_BUTTON && !ENABLE_OVERVIEW_ACTIONS.get()) {
|
||||
float normalScale = 1;
|
||||
// Scale down halfway to where we'd be in overview, to prepare for a potential pause.
|
||||
scaleAndTranslation.scale = (scaleAndTranslation.scale + normalScale) / 2;
|
||||
|
||||
+8
-1
@@ -22,10 +22,12 @@ import static com.android.launcher3.LauncherState.OVERVIEW;
|
||||
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.ENABLE_OVERVIEW_ACTIONS;
|
||||
import static com.android.launcher3.config.FeatureFlags.UNSTABLE_SPRINGS;
|
||||
import static com.android.launcher3.states.StateAnimationConfig.ANIM_ALL_APPS_FADE;
|
||||
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_FADE;
|
||||
import static com.android.launcher3.states.StateAnimationConfig.ANIM_VERTICAL_PROGRESS;
|
||||
import static com.android.quickstep.SysUINavigationMode.removeShelfFromOverview;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
|
||||
|
||||
import android.animation.TimeInterpolator;
|
||||
@@ -132,7 +134,12 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr
|
||||
return TouchInteractionService.isConnected() ?
|
||||
mLauncher.getStateManager().getLastState() : NORMAL;
|
||||
} else if (fromState == OVERVIEW) {
|
||||
return isDragTowardPositive ? ALL_APPS : NORMAL;
|
||||
LauncherState positiveDragTarget = ALL_APPS;
|
||||
if (ENABLE_OVERVIEW_ACTIONS.get() && removeShelfFromOverview(mLauncher)) {
|
||||
// Don't allow swiping up to all apps.
|
||||
positiveDragTarget = OVERVIEW;
|
||||
}
|
||||
return isDragTowardPositive ? positiveDragTarget : NORMAL;
|
||||
} else if (fromState == NORMAL && isDragTowardPositive) {
|
||||
int stateFlags = SystemUiProxy.INSTANCE.get(mLauncher).getLastSystemUiStateFlags();
|
||||
return mAllowDragToOverview && TouchInteractionService.isConnected()
|
||||
|
||||
@@ -91,6 +91,11 @@ public interface BaseActivityInterface<T extends BaseDraggingActivity> {
|
||||
return activity != null && activity.hasBeenResumed();
|
||||
}
|
||||
|
||||
default boolean isStarted() {
|
||||
BaseDraggingActivity activity = getCreatedActivity();
|
||||
return activity != null && activity.isStarted();
|
||||
}
|
||||
|
||||
@UiThread
|
||||
@Nullable
|
||||
<T extends View> T getVisibleRecentsView();
|
||||
|
||||
@@ -99,6 +99,10 @@ class OrientationTouchTransformer {
|
||||
return;
|
||||
}
|
||||
this.mMode = newMode;
|
||||
// Swipe touch regions are independent of nav mode, so we have to clear them explicitly
|
||||
// here to avoid, for ex, a nav region for 2-button rotation 0 being used for 3-button mode
|
||||
// It tries to cache and reuse swipe regions whenever possible based only on rotation
|
||||
mSwipeTouchRegions.clear();
|
||||
resetSwipeRegions(info);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.THREE_BUTTONS;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.TWO_BUTTONS;
|
||||
import static com.android.quickstep.util.RecentsOrientedState.isFixedRotationTransformEnabled;
|
||||
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_BUBBLES_EXPANDED;
|
||||
@@ -35,7 +36,6 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_S
|
||||
import android.app.ActivityManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
@@ -51,8 +51,6 @@ import androidx.annotation.BinderThread;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.util.DefaultDisplay;
|
||||
import com.android.quickstep.SysUINavigationMode.NavigationModeChangeListener;
|
||||
import com.android.quickstep.util.NavBarPosition;
|
||||
@@ -176,7 +174,7 @@ public class RecentsAnimationDeviceState implements
|
||||
}
|
||||
|
||||
private void setupOrientationSwipeHandler() {
|
||||
if (!FeatureFlags.ENABLE_FIXED_ROTATION_TRANSFORM.get()) {
|
||||
if (!isFixedRotationTransformEnabled(mContext)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -74,15 +74,20 @@ public class SysUINavigationMode {
|
||||
mContext.registerReceiver(new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
Mode oldMode = mMode;
|
||||
initializeMode();
|
||||
if (mMode != oldMode) {
|
||||
dispatchModeChange();
|
||||
}
|
||||
updateMode();
|
||||
}
|
||||
}, getPackageFilter("android", ACTION_OVERLAY_CHANGED));
|
||||
}
|
||||
|
||||
/** Updates navigation mode when needed. */
|
||||
public void updateMode() {
|
||||
Mode oldMode = mMode;
|
||||
initializeMode();
|
||||
if (mMode != oldMode) {
|
||||
dispatchModeChange();
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeMode() {
|
||||
int modeInt = getSystemIntegerRes(mContext, NAV_BAR_INTERACTION_MODE_RES_NAME);
|
||||
for(Mode m : Mode.values()) {
|
||||
|
||||
@@ -22,6 +22,7 @@ import android.view.View;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
|
||||
import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult;
|
||||
|
||||
/** A {@link TutorialController} for the Back tutorial. */
|
||||
final class BackGestureTutorialController extends TutorialController {
|
||||
@@ -34,7 +35,7 @@ final class BackGestureTutorialController extends TutorialController {
|
||||
void transitToController() {
|
||||
super.transitToController();
|
||||
if (mTutorialType != BACK_NAVIGATION_COMPLETE) {
|
||||
mHandCoachingAnimation.startLoopedAnimation(mTutorialType);
|
||||
showHandCoachingAnimation();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,16 +96,10 @@ final class BackGestureTutorialController extends TutorialController {
|
||||
public void onBackGestureAttempted(BackGestureResult result) {
|
||||
switch (mTutorialType) {
|
||||
case RIGHT_EDGE_BACK_NAVIGATION:
|
||||
if (result == BackGestureResult.BACK_COMPLETED_FROM_RIGHT) {
|
||||
hideHandCoachingAnimation();
|
||||
mTutorialFragment.changeController(LEFT_EDGE_BACK_NAVIGATION);
|
||||
}
|
||||
handleAttemptFromRight(result);
|
||||
break;
|
||||
case LEFT_EDGE_BACK_NAVIGATION:
|
||||
if (result == BackGestureResult.BACK_COMPLETED_FROM_LEFT) {
|
||||
hideHandCoachingAnimation();
|
||||
mTutorialFragment.changeController(BACK_NAVIGATION_COMPLETE);
|
||||
}
|
||||
handleAttemptFromLeft(result);
|
||||
break;
|
||||
case BACK_NAVIGATION_COMPLETE:
|
||||
if (result == BackGestureResult.BACK_COMPLETED_FROM_LEFT
|
||||
@@ -114,4 +109,57 @@ final class BackGestureTutorialController extends TutorialController {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void handleAttemptFromRight(BackGestureResult result) {
|
||||
switch (result) {
|
||||
case BACK_COMPLETED_FROM_RIGHT:
|
||||
hideFeedback();
|
||||
hideHandCoachingAnimation();
|
||||
showRippleEffect(
|
||||
() -> mTutorialFragment.changeController(LEFT_EDGE_BACK_NAVIGATION));
|
||||
break;
|
||||
case BACK_CANCELLED_FROM_RIGHT:
|
||||
showFeedback(R.string.back_gesture_feedback_cancelled_right_edge);
|
||||
break;
|
||||
case BACK_COMPLETED_FROM_LEFT:
|
||||
case BACK_CANCELLED_FROM_LEFT:
|
||||
case BACK_NOT_STARTED_TOO_FAR_FROM_EDGE:
|
||||
showFeedback(R.string.back_gesture_feedback_swipe_too_far_from_right_edge);
|
||||
break;
|
||||
case BACK_NOT_STARTED_IN_NAV_BAR_REGION:
|
||||
showFeedback(R.string.back_gesture_feedback_swipe_in_nav_bar);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void handleAttemptFromLeft(BackGestureResult result) {
|
||||
switch (result) {
|
||||
case BACK_COMPLETED_FROM_LEFT:
|
||||
hideFeedback();
|
||||
hideHandCoachingAnimation();
|
||||
showRippleEffect(
|
||||
() -> mTutorialFragment.changeController(BACK_NAVIGATION_COMPLETE));
|
||||
break;
|
||||
case BACK_CANCELLED_FROM_LEFT:
|
||||
showFeedback(R.string.back_gesture_feedback_cancelled_left_edge);
|
||||
break;
|
||||
case BACK_COMPLETED_FROM_RIGHT:
|
||||
case BACK_CANCELLED_FROM_RIGHT:
|
||||
case BACK_NOT_STARTED_TOO_FAR_FROM_EDGE:
|
||||
showFeedback(R.string.back_gesture_feedback_swipe_too_far_from_left_edge);
|
||||
break;
|
||||
case BACK_NOT_STARTED_IN_NAV_BAR_REGION:
|
||||
showFeedback(R.string.back_gesture_feedback_swipe_in_nav_bar);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNavBarGestureAttempted(NavBarGestureResult result) {
|
||||
if (mTutorialType == BACK_NAVIGATION_COMPLETE) {
|
||||
if (result == NavBarGestureResult.HOME_GESTURE_COMPLETED) {
|
||||
mTutorialFragment.closeTutorial();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
*/
|
||||
package com.android.quickstep.interaction;
|
||||
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.quickstep.interaction.TutorialController.TutorialType;
|
||||
|
||||
@@ -29,4 +32,17 @@ public class BackGestureTutorialFragment extends TutorialFragment {
|
||||
TutorialController createController(TutorialType type) {
|
||||
return new BackGestureTutorialController(this, type);
|
||||
}
|
||||
|
||||
@Override
|
||||
Class<? extends TutorialController> getControllerClass() {
|
||||
return BackGestureTutorialController.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent motionEvent) {
|
||||
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN && mTutorialController != null) {
|
||||
mTutorialController.setRippleHotspot(motionEvent.getX(), motionEvent.getY());
|
||||
}
|
||||
return super.onTouch(view, motionEvent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,6 +58,7 @@ public class EdgeBackGestureHandler implements OnTouchListener {
|
||||
private final PointF mDownPoint = new PointF();
|
||||
private boolean mThresholdCrossed = false;
|
||||
private boolean mAllowGesture = false;
|
||||
private BackGestureResult mDisallowedGestureReason;
|
||||
private boolean mIsEnabled;
|
||||
private int mLeftInset;
|
||||
private int mRightInset;
|
||||
@@ -145,11 +146,13 @@ public class EdgeBackGestureHandler implements OnTouchListener {
|
||||
private boolean isWithinTouchRegion(int x, int y) {
|
||||
// Disallow if too far from the edge
|
||||
if (x > mEdgeWidth + mLeftInset && x < (mDisplaySize.x - mEdgeWidth - mRightInset)) {
|
||||
mDisallowedGestureReason = BackGestureResult.BACK_NOT_STARTED_TOO_FAR_FROM_EDGE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Disallow if we are in the bottom gesture area
|
||||
if (y >= (mDisplaySize.y - mBottomGestureHeight)) {
|
||||
mDisallowedGestureReason = BackGestureResult.BACK_NOT_STARTED_IN_NAV_BAR_REGION;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -169,12 +172,12 @@ public class EdgeBackGestureHandler implements OnTouchListener {
|
||||
int action = ev.getActionMasked();
|
||||
if (action == MotionEvent.ACTION_DOWN) {
|
||||
boolean isOnLeftEdge = ev.getX() <= mEdgeWidth + mLeftInset;
|
||||
mDisallowedGestureReason = BackGestureResult.UNKNOWN;
|
||||
mAllowGesture = isWithinTouchRegion((int) ev.getX(), (int) ev.getY());
|
||||
mDownPoint.set(ev.getX(), ev.getY());
|
||||
if (mAllowGesture) {
|
||||
mEdgeBackPanel.setIsLeftPanel(isOnLeftEdge);
|
||||
mEdgeBackPanel.onMotionEvent(ev);
|
||||
|
||||
mDownPoint.set(ev.getX(), ev.getY());
|
||||
mThresholdCrossed = false;
|
||||
}
|
||||
} else if (mAllowGesture) {
|
||||
@@ -193,7 +196,6 @@ public class EdgeBackGestureHandler implements OnTouchListener {
|
||||
if (dy > dx && dy > mTouchSlop) {
|
||||
cancelGesture(ev);
|
||||
return;
|
||||
|
||||
} else if (dx > dy && dx > mTouchSlop) {
|
||||
mThresholdCrossed = true;
|
||||
}
|
||||
@@ -206,8 +208,10 @@ public class EdgeBackGestureHandler implements OnTouchListener {
|
||||
}
|
||||
|
||||
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
|
||||
if (!mAllowGesture && mGestureCallback != null) {
|
||||
mGestureCallback.onBackGestureAttempted(BackGestureResult.BACK_NOT_STARTED);
|
||||
float dx = Math.abs(ev.getX() - mDownPoint.x);
|
||||
float dy = Math.abs(ev.getY() - mDownPoint.y);
|
||||
if (dx > dy && dx > mTouchSlop && !mAllowGesture && mGestureCallback != null) {
|
||||
mGestureCallback.onBackGestureAttempted(mDisallowedGestureReason);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -223,7 +227,8 @@ public class EdgeBackGestureHandler implements OnTouchListener {
|
||||
BACK_COMPLETED_FROM_RIGHT,
|
||||
BACK_CANCELLED_FROM_LEFT,
|
||||
BACK_CANCELLED_FROM_RIGHT,
|
||||
BACK_NOT_STARTED,
|
||||
BACK_NOT_STARTED_TOO_FAR_FROM_EDGE,
|
||||
BACK_NOT_STARTED_IN_NAV_BAR_REGION,
|
||||
}
|
||||
|
||||
/** Callback to let the UI react to attempted back gestures. */
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.view.View;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
|
||||
import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult;
|
||||
|
||||
/** A {@link TutorialController} for the Home tutorial. */
|
||||
final class HomeGestureTutorialController extends TutorialController {
|
||||
@@ -33,7 +34,7 @@ final class HomeGestureTutorialController extends TutorialController {
|
||||
void transitToController() {
|
||||
super.transitToController();
|
||||
if (mTutorialType != HOME_NAVIGATION_COMPLETE) {
|
||||
mHandCoachingAnimation.startLoopedAnimation(mTutorialType);
|
||||
showHandCoachingAnimation();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,4 +83,33 @@ final class HomeGestureTutorialController extends TutorialController {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNavBarGestureAttempted(NavBarGestureResult result) {
|
||||
switch (mTutorialType) {
|
||||
case HOME_NAVIGATION:
|
||||
switch (result) {
|
||||
case HOME_GESTURE_COMPLETED:
|
||||
hideHandCoachingAnimation();
|
||||
mTutorialFragment.changeController(HOME_NAVIGATION_COMPLETE);
|
||||
break;
|
||||
case HOME_NOT_STARTED_TOO_FAR_FROM_EDGE:
|
||||
case OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE:
|
||||
showFeedback(R.string.home_gesture_feedback_swipe_too_far_from_edge);
|
||||
break;
|
||||
case OVERVIEW_GESTURE_COMPLETED:
|
||||
showFeedback(R.string.home_gesture_feedback_overview_detected);
|
||||
break;
|
||||
case HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION:
|
||||
showFeedback(R.string.home_gesture_feedback_wrong_swipe_direction);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case HOME_NAVIGATION_COMPLETE:
|
||||
if (result == NavBarGestureResult.HOME_GESTURE_COMPLETED) {
|
||||
mTutorialFragment.closeTutorial();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,4 +29,9 @@ public class HomeGestureTutorialFragment extends TutorialFragment {
|
||||
TutorialController createController(TutorialType type) {
|
||||
return new HomeGestureTutorialController(this, type);
|
||||
}
|
||||
|
||||
@Override
|
||||
Class<? extends TutorialController> getControllerClass() {
|
||||
return HomeGestureTutorialController.class;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.interaction;
|
||||
|
||||
import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.HOME_GESTURE_COMPLETED;
|
||||
import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.HOME_NOT_STARTED_TOO_FAR_FROM_EDGE;
|
||||
import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION;
|
||||
import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.OVERVIEW_GESTURE_COMPLETED;
|
||||
import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Point;
|
||||
import android.view.Display;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.Surface;
|
||||
import android.view.View;
|
||||
import android.view.View.OnTouchListener;
|
||||
|
||||
import com.android.launcher3.ResourceUtils;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.quickstep.util.NavBarPosition;
|
||||
import com.android.quickstep.util.TriggerSwipeUpTouchTracker;
|
||||
|
||||
/** Utility class to handle home gestures. */
|
||||
public class NavBarGestureHandler implements OnTouchListener {
|
||||
|
||||
private static final String LOG_TAG = "NavBarGestureHandler";
|
||||
|
||||
private final Point mDisplaySize = new Point();
|
||||
private final TriggerSwipeUpTouchTracker mSwipeUpTouchTracker;
|
||||
private int mBottomGestureHeight;
|
||||
private boolean mTouchCameFromNavBar;
|
||||
private NavBarGestureAttemptCallback mGestureCallback;
|
||||
|
||||
NavBarGestureHandler(Context context) {
|
||||
final Display display = context.getDisplay();
|
||||
final int displayRotation;
|
||||
if (display == null) {
|
||||
displayRotation = Surface.ROTATION_0;
|
||||
} else {
|
||||
displayRotation = display.getRotation();
|
||||
display.getRealSize(mDisplaySize);
|
||||
}
|
||||
mSwipeUpTouchTracker =
|
||||
new TriggerSwipeUpTouchTracker(context, true /*disableHorizontalSwipe*/,
|
||||
new NavBarPosition(Mode.NO_BUTTON, displayRotation),
|
||||
null /*onInterceptTouch*/, this::onSwipeUp);
|
||||
|
||||
final Resources resources = context.getResources();
|
||||
mBottomGestureHeight =
|
||||
ResourceUtils.getNavbarSize(ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, resources);
|
||||
}
|
||||
|
||||
void registerNavBarGestureAttemptCallback(NavBarGestureAttemptCallback callback) {
|
||||
mGestureCallback = callback;
|
||||
}
|
||||
|
||||
void unregisterNavBarGestureAttemptCallback() {
|
||||
mGestureCallback = null;
|
||||
}
|
||||
|
||||
private void onSwipeUp(boolean wasFling) {
|
||||
if (mGestureCallback == null) {
|
||||
return;
|
||||
}
|
||||
if (mTouchCameFromNavBar) {
|
||||
mGestureCallback.onNavBarGestureAttempted(wasFling
|
||||
? HOME_GESTURE_COMPLETED : OVERVIEW_GESTURE_COMPLETED);
|
||||
} else {
|
||||
mGestureCallback.onNavBarGestureAttempted(wasFling
|
||||
? HOME_NOT_STARTED_TOO_FAR_FROM_EDGE : OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent motionEvent) {
|
||||
int action = motionEvent.getAction();
|
||||
boolean intercepted = mSwipeUpTouchTracker.interceptedTouch();
|
||||
if (action == MotionEvent.ACTION_DOWN) {
|
||||
mTouchCameFromNavBar = motionEvent.getRawY() >= mDisplaySize.y - mBottomGestureHeight;
|
||||
mSwipeUpTouchTracker.init();
|
||||
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
|
||||
if (mGestureCallback != null && !intercepted && mTouchCameFromNavBar) {
|
||||
mGestureCallback.onNavBarGestureAttempted(
|
||||
HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION);
|
||||
intercepted = true;
|
||||
}
|
||||
}
|
||||
mSwipeUpTouchTracker.onMotionEvent(motionEvent);
|
||||
return intercepted;
|
||||
}
|
||||
|
||||
enum NavBarGestureResult {
|
||||
UNKNOWN,
|
||||
HOME_GESTURE_COMPLETED,
|
||||
OVERVIEW_GESTURE_COMPLETED,
|
||||
HOME_NOT_STARTED_TOO_FAR_FROM_EDGE,
|
||||
OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE,
|
||||
HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION // Side swipe on nav bar.
|
||||
}
|
||||
|
||||
/** Callback to let the UI react to attempted nav bar gestures. */
|
||||
interface NavBarGestureAttemptCallback {
|
||||
/** Called whenever any touch is completed. */
|
||||
void onNavBarGestureAttempted(NavBarGestureResult result);
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.android.quickstep.interaction;
|
||||
|
||||
import android.graphics.drawable.RippleDrawable;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.Button;
|
||||
@@ -26,20 +27,30 @@ import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
|
||||
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureAttemptCallback;
|
||||
import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureAttemptCallback;
|
||||
|
||||
abstract class TutorialController {
|
||||
abstract class TutorialController implements BackGestureAttemptCallback,
|
||||
NavBarGestureAttemptCallback {
|
||||
|
||||
private static final int FEEDBACK_VISIBLE_MS = 3000;
|
||||
private static final int FEEDBACK_ANIMATION_MS = 500;
|
||||
private static final int RIPPLE_VISIBLE_MS = 300;
|
||||
|
||||
final TutorialFragment mTutorialFragment;
|
||||
final TutorialType mTutorialType;
|
||||
TutorialType mTutorialType;
|
||||
|
||||
final ImageButton mCloseButton;
|
||||
final TextView mTitleTextView;
|
||||
final TextView mSubtitleTextView;
|
||||
final TextView mFeedbackView;
|
||||
final View mRippleView;
|
||||
final RippleDrawable mRippleDrawable;
|
||||
final TutorialHandAnimation mHandCoachingAnimation;
|
||||
final ImageView mHandCoachingView;
|
||||
final Button mActionTextButton;
|
||||
final Button mActionButton;
|
||||
private final Runnable mHideFeedbackRunnable;
|
||||
|
||||
TutorialController(TutorialFragment tutorialFragment, TutorialType tutorialType) {
|
||||
mTutorialFragment = tutorialFragment;
|
||||
@@ -50,15 +61,24 @@ abstract class TutorialController {
|
||||
mCloseButton.setOnClickListener(button -> mTutorialFragment.closeTutorial());
|
||||
mTitleTextView = rootView.findViewById(R.id.gesture_tutorial_fragment_title_view);
|
||||
mSubtitleTextView = rootView.findViewById(R.id.gesture_tutorial_fragment_subtitle_view);
|
||||
mFeedbackView = rootView.findViewById(R.id.gesture_tutorial_fragment_feedback_view);
|
||||
mRippleView = rootView.findViewById(R.id.gesture_tutorial_ripple_view);
|
||||
mRippleDrawable = (RippleDrawable) mRippleView.getBackground();
|
||||
mHandCoachingAnimation = tutorialFragment.getHandAnimation();
|
||||
mHandCoachingView = rootView.findViewById(R.id.gesture_tutorial_fragment_hand_coaching);
|
||||
mHandCoachingView.bringToFront();
|
||||
mActionTextButton =
|
||||
rootView.findViewById(R.id.gesture_tutorial_fragment_action_text_button);
|
||||
mActionButton = rootView.findViewById(R.id.gesture_tutorial_fragment_action_button);
|
||||
|
||||
mHideFeedbackRunnable =
|
||||
() -> mFeedbackView.animate().alpha(0).setDuration(FEEDBACK_ANIMATION_MS)
|
||||
.withEndAction(this::showHandCoachingAnimation).start();
|
||||
}
|
||||
|
||||
abstract void onBackGestureAttempted(BackGestureResult result);
|
||||
void setTutorialType(TutorialType tutorialType) {
|
||||
mTutorialType = tutorialType;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
Integer getTitleStringId() {
|
||||
@@ -80,16 +100,52 @@ abstract class TutorialController {
|
||||
return null;
|
||||
}
|
||||
|
||||
void showFeedback(int resId) {
|
||||
hideHandCoachingAnimation();
|
||||
mFeedbackView.setText(resId);
|
||||
mFeedbackView.animate().alpha(1).setDuration(FEEDBACK_ANIMATION_MS).start();
|
||||
mFeedbackView.removeCallbacks(mHideFeedbackRunnable);
|
||||
mFeedbackView.postDelayed(mHideFeedbackRunnable, FEEDBACK_VISIBLE_MS);
|
||||
}
|
||||
|
||||
void hideFeedback() {
|
||||
mFeedbackView.setText(null);
|
||||
mFeedbackView.removeCallbacks(mHideFeedbackRunnable);
|
||||
mFeedbackView.clearAnimation();
|
||||
mFeedbackView.setAlpha(0);
|
||||
}
|
||||
|
||||
void setRippleHotspot(float x, float y) {
|
||||
mRippleDrawable.setHotspot(x, y);
|
||||
}
|
||||
|
||||
void showRippleEffect(@Nullable Runnable onCompleteRunnable) {
|
||||
mRippleDrawable.setState(
|
||||
new int[] {android.R.attr.state_pressed, android.R.attr.state_enabled});
|
||||
mRippleView.postDelayed(() -> {
|
||||
mRippleDrawable.setState(new int[] {});
|
||||
if (onCompleteRunnable != null) {
|
||||
onCompleteRunnable.run();
|
||||
}
|
||||
}, RIPPLE_VISIBLE_MS);
|
||||
}
|
||||
|
||||
void onActionButtonClicked(View button) {}
|
||||
|
||||
void onActionTextButtonClicked(View button) {}
|
||||
|
||||
void showHandCoachingAnimation() {
|
||||
mHandCoachingAnimation.startLoopedAnimation(mTutorialType);
|
||||
}
|
||||
|
||||
void hideHandCoachingAnimation() {
|
||||
mHandCoachingAnimation.stop();
|
||||
mHandCoachingView.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
@CallSuper
|
||||
void transitToController() {
|
||||
hideFeedback();
|
||||
updateTitles();
|
||||
updateActionButtons();
|
||||
}
|
||||
|
||||
@@ -21,7 +21,9 @@ import android.graphics.Insets;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.View.OnTouchListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowInsets;
|
||||
|
||||
@@ -31,13 +33,11 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureAttemptCallback;
|
||||
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
|
||||
import com.android.quickstep.interaction.TutorialController.TutorialType;
|
||||
|
||||
import java.net.URISyntaxException;
|
||||
|
||||
abstract class TutorialFragment extends Fragment implements BackGestureAttemptCallback {
|
||||
abstract class TutorialFragment extends Fragment implements OnTouchListener {
|
||||
|
||||
private static final String LOG_TAG = "TutorialFragment";
|
||||
private static final String SYSTEM_NAVIGATION_SETTING_INTENT =
|
||||
@@ -52,6 +52,7 @@ abstract class TutorialFragment extends Fragment implements BackGestureAttemptCa
|
||||
View mRootView;
|
||||
TutorialHandAnimation mHandCoachingAnimation;
|
||||
EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||
NavBarGestureHandler mNavBarGestureHandler;
|
||||
|
||||
public static TutorialFragment newInstance(TutorialType tutorialType) {
|
||||
TutorialFragment fragment = getFragmentForTutorialType(tutorialType);
|
||||
@@ -85,19 +86,22 @@ abstract class TutorialFragment extends Fragment implements BackGestureAttemptCa
|
||||
|
||||
abstract TutorialController createController(TutorialType type);
|
||||
|
||||
abstract Class<? extends TutorialController> getControllerClass();
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
Bundle args = savedInstanceState != null ? savedInstanceState : getArguments();
|
||||
mTutorialType = (TutorialType) args.getSerializable(KEY_TUTORIAL_TYPE);
|
||||
mEdgeBackGestureHandler = new EdgeBackGestureHandler(getContext());
|
||||
mEdgeBackGestureHandler.registerBackGestureAttemptCallback(this);
|
||||
mNavBarGestureHandler = new NavBarGestureHandler(getContext());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
mEdgeBackGestureHandler.unregisterBackGestureAttemptCallback();
|
||||
mNavBarGestureHandler.unregisterNavBarGestureAttemptCallback();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -111,7 +115,7 @@ abstract class TutorialFragment extends Fragment implements BackGestureAttemptCa
|
||||
mEdgeBackGestureHandler.setInsets(systemInsets.left, systemInsets.right);
|
||||
return insets;
|
||||
});
|
||||
mRootView.setOnTouchListener(mEdgeBackGestureHandler);
|
||||
mRootView.setOnTouchListener(this);
|
||||
mHandCoachingAnimation = new TutorialHandAnimation(getContext(), mRootView,
|
||||
getHandAnimationResId());
|
||||
return mRootView;
|
||||
@@ -129,6 +133,13 @@ abstract class TutorialFragment extends Fragment implements BackGestureAttemptCa
|
||||
mHandCoachingAnimation.stop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent motionEvent) {
|
||||
// Note: Using logical or to ensure both functions get called.
|
||||
return mEdgeBackGestureHandler.onTouch(view, motionEvent)
|
||||
| mNavBarGestureHandler.onTouch(view, motionEvent);
|
||||
}
|
||||
|
||||
void onAttachedToWindow() {
|
||||
mEdgeBackGestureHandler.setViewGroupParent((ViewGroup) getRootView());
|
||||
}
|
||||
@@ -138,8 +149,14 @@ abstract class TutorialFragment extends Fragment implements BackGestureAttemptCa
|
||||
}
|
||||
|
||||
void changeController(TutorialType tutorialType) {
|
||||
mTutorialController = createController(tutorialType);
|
||||
if (getControllerClass().isInstance(mTutorialController)) {
|
||||
mTutorialController.setTutorialType(tutorialType);
|
||||
} else {
|
||||
mTutorialController = createController(tutorialType);
|
||||
}
|
||||
mTutorialController.transitToController();
|
||||
mEdgeBackGestureHandler.registerBackGestureAttemptCallback(mTutorialController);
|
||||
mNavBarGestureHandler.registerNavBarGestureAttemptCallback(mTutorialController);
|
||||
mTutorialType = tutorialType;
|
||||
}
|
||||
|
||||
@@ -157,13 +174,6 @@ abstract class TutorialFragment extends Fragment implements BackGestureAttemptCa
|
||||
return mHandCoachingAnimation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackGestureAttempted(BackGestureResult result) {
|
||||
if (mTutorialController != null) {
|
||||
mTutorialController.onBackGestureAttempted(result);
|
||||
}
|
||||
}
|
||||
|
||||
void closeTutorial() {
|
||||
FragmentActivity activity = getActivity();
|
||||
if (activity != null) {
|
||||
|
||||
@@ -45,6 +45,7 @@ final class TutorialHandAnimation {
|
||||
|
||||
/** [Re]starts animation for the given tutorial. */
|
||||
void startLoopedAnimation(TutorialType tutorialType) {
|
||||
mHandCoachingView.setVisibility(View.VISIBLE);
|
||||
if (mGestureAnimation.isRunning()) {
|
||||
stop();
|
||||
}
|
||||
|
||||
@@ -35,6 +35,11 @@ public class NavBarPosition {
|
||||
mDisplayRotation = info.rotation;
|
||||
}
|
||||
|
||||
public NavBarPosition(SysUINavigationMode.Mode mode, int displayRotation) {
|
||||
mMode = mode;
|
||||
mDisplayRotation = displayRotation;
|
||||
}
|
||||
|
||||
public boolean isRightEdge() {
|
||||
return mMode != NO_BUTTON && mDisplayRotation == Surface.ROTATION_90;
|
||||
}
|
||||
|
||||
@@ -41,9 +41,6 @@ public class QuickstepOnboardingPrefs extends OnboardingPrefs<BaseQuickstepLaunc
|
||||
|
||||
if (!getBoolean(HOME_BOUNCE_SEEN)) {
|
||||
mStateManager.addStateListener(new StateListener() {
|
||||
@Override
|
||||
public void onStateTransitionStart(LauncherState toState) { }
|
||||
|
||||
@Override
|
||||
public void onStateTransitionComplete(LauncherState finalState) {
|
||||
boolean swipeUpEnabled = SysUINavigationMode.INSTANCE
|
||||
@@ -69,9 +66,6 @@ public class QuickstepOnboardingPrefs extends OnboardingPrefs<BaseQuickstepLaunc
|
||||
}
|
||||
if (!shelfBounceSeen) {
|
||||
mStateManager.addStateListener(new StateListener() {
|
||||
@Override
|
||||
public void onStateTransitionStart(LauncherState toState) { }
|
||||
|
||||
@Override
|
||||
public void onStateTransitionComplete(LauncherState finalState) {
|
||||
LauncherState prevState = mStateManager.getLastState();
|
||||
@@ -87,9 +81,6 @@ public class QuickstepOnboardingPrefs extends OnboardingPrefs<BaseQuickstepLaunc
|
||||
|
||||
if (!hasReachedMaxCount(ALL_APPS_COUNT)) {
|
||||
mStateManager.addStateListener(new StateListener() {
|
||||
@Override
|
||||
public void onStateTransitionStart(LauncherState toState) { }
|
||||
|
||||
@Override
|
||||
public void onStateTransitionComplete(LauncherState finalState) {
|
||||
if (finalState == ALL_APPS) {
|
||||
|
||||
@@ -16,17 +16,13 @@
|
||||
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
import static android.util.DisplayMetrics.DENSITY_DEVICE_STABLE;
|
||||
import static android.view.Surface.ROTATION_0;
|
||||
import static android.view.Surface.ROTATION_180;
|
||||
import static android.view.Surface.ROTATION_270;
|
||||
import static android.view.Surface.ROTATION_90;
|
||||
|
||||
import static com.android.launcher3.config.FeatureFlags.FLAG_ENABLE_FIXED_ROTATION_TRANSFORM;
|
||||
import static com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY;
|
||||
import static com.android.launcher3.states.RotationHelper.FIXED_ROTATION_TRANSFORM_SETTING_NAME;
|
||||
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
|
||||
|
||||
import static java.lang.annotation.RetentionPolicy.SOURCE;
|
||||
@@ -44,19 +40,18 @@ import android.os.Handler;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.OrientationEventListener;
|
||||
import android.view.Surface;
|
||||
|
||||
import androidx.annotation.IntDef;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.touch.PortraitPagedViewHandler;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.IntConsumer;
|
||||
|
||||
/**
|
||||
* Container to hold orientation/rotation related information for Launcher.
|
||||
@@ -71,6 +66,8 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
|
||||
private static final String TAG = "RecentsOrientedState";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
private static final String FIXED_ROTATION_TRANSFORM_SETTING_NAME = "fixed_rotation_transform";
|
||||
|
||||
private ContentObserver mSystemAutoRotateObserver = new ContentObserver(new Handler()) {
|
||||
@Override
|
||||
public void onChange(boolean selfChange) {
|
||||
@@ -87,46 +84,79 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
|
||||
private @SurfaceRotation int mDisplayRotation = ROTATION_0;
|
||||
private @SurfaceRotation int mLauncherRotation = Surface.ROTATION_0;
|
||||
|
||||
public interface SystemRotationChangeListener {
|
||||
void onSystemRotationChanged(boolean enabled);
|
||||
}
|
||||
// Launcher activity supports multiple orientation, but fallback activity does not
|
||||
private static final int FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_ACTIVITY = 1 << 0;
|
||||
// Multiple orientation is only supported if density is < 600
|
||||
private static final int FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_DENSITY = 1 << 1;
|
||||
// Feature flag controlling the multi-orientation feature
|
||||
private static final int FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_FLAG = 1 << 2;
|
||||
// Shared prefs for rotation, only if activity supports it
|
||||
private static final int FLAG_HOME_ROTATION_ALLOWED_IN_PREFS = 1 << 3;
|
||||
// If the user has enabled system rotation
|
||||
private static final int FLAG_SYSTEM_ROTATION_ALLOWED = 1 << 4;
|
||||
// Whether to rotation sensor is supported on the device
|
||||
private static final int FLAG_ROTATION_WATCHER_SUPPORTED = 1 << 5;
|
||||
// Whether to enable rotation watcher when multi-rotation is supported
|
||||
private static final int FLAG_ROTATION_WATCHER_ENABLED = 1 << 6;
|
||||
|
||||
/**
|
||||
* If {@code true} we default to {@link PortraitPagedViewHandler} and don't support any fake
|
||||
* launcher orientations.
|
||||
*/
|
||||
private boolean mDisableMultipleOrientations;
|
||||
private boolean mIsHomeRotationAllowed;
|
||||
private boolean mIsSystemRotationAllowed;
|
||||
private static final int MASK_MULTIPLE_ORIENTATION_SUPPORTED_BY_DEVICE =
|
||||
FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_ACTIVITY
|
||||
| FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_DENSITY
|
||||
| FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_FLAG;
|
||||
|
||||
private static final int MASK_ACTIVITY_ROTATING =
|
||||
FLAG_HOME_ROTATION_ALLOWED_IN_PREFS | FLAG_SYSTEM_ROTATION_ALLOWED;
|
||||
|
||||
// State for which rotation watcher will be enabled.
|
||||
// We skip it when home rotation is enabled as in that case, activity itself rotates
|
||||
private static final int VALUE_ROTATION_WATCHER_ENABLED =
|
||||
MASK_MULTIPLE_ORIENTATION_SUPPORTED_BY_DEVICE | FLAG_SYSTEM_ROTATION_ALLOWED
|
||||
| FLAG_ROTATION_WATCHER_SUPPORTED | FLAG_ROTATION_WATCHER_ENABLED;
|
||||
|
||||
private final ContentResolver mContentResolver;
|
||||
private final SharedPreferences mSharedPrefs;
|
||||
private final boolean mAllowConfigurationDefaultValue;
|
||||
|
||||
private List<SystemRotationChangeListener> mSystemRotationChangeListeners = new ArrayList<>();
|
||||
private final OrientationEventListener mOrientationListener;
|
||||
|
||||
private final Matrix mTmpMatrix = new Matrix();
|
||||
private final Matrix mTmpInverseMatrix = new Matrix();
|
||||
|
||||
public RecentsOrientedState(Context context) {
|
||||
private int mFlags;
|
||||
private int mPreviousRotation = ROTATION_0;
|
||||
|
||||
/**
|
||||
* @param rotationChangeListener Callback for receiving rotation events when rotation watcher
|
||||
* is enabled
|
||||
* @see #setRotationWatcherEnabled(boolean)
|
||||
*/
|
||||
public RecentsOrientedState(Context context, boolean rotationSupportedByActivity,
|
||||
IntConsumer rotationChangeListener) {
|
||||
mContentResolver = context.getContentResolver();
|
||||
mSharedPrefs = Utilities.getPrefs(context);
|
||||
mOrientationListener = new OrientationEventListener(context) {
|
||||
@Override
|
||||
public void onOrientationChanged(int degrees) {
|
||||
int newRotation = getRotationForUserDegreesRotated(degrees);
|
||||
if (newRotation != mPreviousRotation) {
|
||||
mPreviousRotation = newRotation;
|
||||
rotationChangeListener.accept(newRotation);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
mFlags = rotationSupportedByActivity ? FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_ACTIVITY : 0;
|
||||
|
||||
Resources res = context.getResources();
|
||||
int originalSmallestWidth = res.getConfiguration().smallestScreenWidthDp
|
||||
* res.getDisplayMetrics().densityDpi / DENSITY_DEVICE_STABLE;
|
||||
mAllowConfigurationDefaultValue = originalSmallestWidth >= 600;
|
||||
|
||||
boolean isForcedRotation = Utilities.getFeatureFlagsPrefs(context)
|
||||
.getBoolean(FLAG_ENABLE_FIXED_ROTATION_TRANSFORM, true)
|
||||
&& !mAllowConfigurationDefaultValue;
|
||||
UI_HELPER_EXECUTOR.execute(() -> {
|
||||
if (context.checkSelfPermission(WRITE_SECURE_SETTINGS) == PERMISSION_GRANTED) {
|
||||
Settings.Global.putInt(mContentResolver, FIXED_ROTATION_TRANSFORM_SETTING_NAME,
|
||||
isForcedRotation ? 1 : 0);
|
||||
}
|
||||
});
|
||||
disableMultipleOrientations(!isForcedRotation);
|
||||
if (originalSmallestWidth < 600) {
|
||||
mFlags |= FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_DENSITY;
|
||||
}
|
||||
if (isFixedRotationTransformEnabled(context)) {
|
||||
mFlags |= FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_FLAG;
|
||||
}
|
||||
if (mOrientationListener.canDetectOrientation()) {
|
||||
mFlags |= FLAG_ROTATION_WATCHER_SUPPORTED;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -140,10 +170,7 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
|
||||
public boolean update(
|
||||
@SurfaceRotation int touchRotation, @SurfaceRotation int displayRotation,
|
||||
@SurfaceRotation int launcherRotation) {
|
||||
if (!FeatureFlags.ENABLE_FIXED_ROTATION_TRANSFORM.get()) {
|
||||
return false;
|
||||
}
|
||||
if (mDisableMultipleOrientations) {
|
||||
if (!isMultipleOrientationSupportedByDevice()) {
|
||||
return false;
|
||||
}
|
||||
if (mDisplayRotation == displayRotation && mTouchRotation == touchRotation
|
||||
@@ -155,8 +182,7 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
|
||||
mDisplayRotation = displayRotation;
|
||||
mTouchRotation = touchRotation;
|
||||
|
||||
if ((mIsHomeRotationAllowed && mIsSystemRotationAllowed) ||
|
||||
mLauncherRotation == mTouchRotation) {
|
||||
if (canLauncherRotate() || mLauncherRotation == mTouchRotation) {
|
||||
// TODO(b/153476489) Need to determine when launcher is rotated
|
||||
mOrientationHandler = PagedOrientationHandler.HOME_ROTATED;
|
||||
if (DEBUG) {
|
||||
@@ -178,14 +204,25 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setting this preference renders future calls to {@link #update(int, int, int)} as a no-op.
|
||||
*/
|
||||
public void disableMultipleOrientations(boolean disable) {
|
||||
mDisableMultipleOrientations = disable;
|
||||
if (disable) {
|
||||
mDisplayRotation = mTouchRotation = ROTATION_0;
|
||||
mOrientationHandler = PagedOrientationHandler.PORTRAIT;
|
||||
private void setFlag(int mask, boolean enabled) {
|
||||
boolean wasRotationEnabled = !TestProtocol.sDisableSensorRotation
|
||||
&& mFlags == VALUE_ROTATION_WATCHER_ENABLED;
|
||||
if (enabled) {
|
||||
mFlags |= mask;
|
||||
} else {
|
||||
mFlags &= ~mask;
|
||||
}
|
||||
|
||||
boolean isRotationEnabled = !TestProtocol.sDisableSensorRotation
|
||||
&& mFlags == VALUE_ROTATION_WATCHER_ENABLED;
|
||||
if (wasRotationEnabled != isRotationEnabled) {
|
||||
UI_HELPER_EXECUTOR.execute(() -> {
|
||||
if (isRotationEnabled) {
|
||||
mOrientationListener.enable();
|
||||
} else {
|
||||
mOrientationListener.disable();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,47 +232,49 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
|
||||
}
|
||||
|
||||
private void updateAutoRotateSetting() {
|
||||
try {
|
||||
mIsSystemRotationAllowed = Settings.System.getInt(mContentResolver,
|
||||
Settings.System.ACCELEROMETER_ROTATION) == 1;
|
||||
} catch (Settings.SettingNotFoundException e) {
|
||||
Log.e(TAG, "autorotate setting not found", e);
|
||||
}
|
||||
|
||||
for (SystemRotationChangeListener listener : mSystemRotationChangeListeners) {
|
||||
listener.onSystemRotationChanged(mIsSystemRotationAllowed);
|
||||
}
|
||||
setFlag(FLAG_SYSTEM_ROTATION_ALLOWED, Settings.System.getInt(mContentResolver,
|
||||
Settings.System.ACCELEROMETER_ROTATION, 1) == 1);
|
||||
}
|
||||
|
||||
private void updateHomeRotationSetting() {
|
||||
mIsHomeRotationAllowed = mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY,
|
||||
mAllowConfigurationDefaultValue);
|
||||
}
|
||||
|
||||
public void addSystemRotationChangeListener(SystemRotationChangeListener listener) {
|
||||
mSystemRotationChangeListeners.add(listener);
|
||||
listener.onSystemRotationChanged(mIsSystemRotationAllowed);
|
||||
}
|
||||
|
||||
public void removeSystemRotationChangeListener(SystemRotationChangeListener listener) {
|
||||
mSystemRotationChangeListeners.remove(listener);
|
||||
setFlag(FLAG_HOME_ROTATION_ALLOWED_IN_PREFS,
|
||||
mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY, false));
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes aany system values and registers corresponding change listeners. It must be
|
||||
* paired with {@link #destroy()} call
|
||||
*/
|
||||
public void init() {
|
||||
mSharedPrefs.registerOnSharedPreferenceChangeListener(this);
|
||||
mContentResolver.registerContentObserver(
|
||||
Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION),
|
||||
false, mSystemAutoRotateObserver);
|
||||
if (isMultipleOrientationSupportedByDevice()) {
|
||||
mSharedPrefs.registerOnSharedPreferenceChangeListener(this);
|
||||
mContentResolver.registerContentObserver(
|
||||
Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION),
|
||||
false, mSystemAutoRotateObserver);
|
||||
}
|
||||
initWithoutListeners();
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters any previously registered listeners.
|
||||
*/
|
||||
public void destroy() {
|
||||
if (isMultipleOrientationSupportedByDevice()) {
|
||||
mSharedPrefs.unregisterOnSharedPreferenceChangeListener(this);
|
||||
mContentResolver.unregisterContentObserver(mSystemAutoRotateObserver);
|
||||
}
|
||||
setRotationWatcherEnabled(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the OrientationState without attaching any listeners. This can be used when
|
||||
* the object is short lived.
|
||||
*/
|
||||
public void initWithoutListeners() {
|
||||
updateAutoRotateSetting();
|
||||
updateHomeRotationSetting();
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
mSharedPrefs.unregisterOnSharedPreferenceChangeListener(this);
|
||||
mContentResolver.unregisterContentObserver(mSystemAutoRotateObserver);
|
||||
mSystemRotationChangeListeners.clear();
|
||||
}
|
||||
|
||||
@SurfaceRotation
|
||||
public int getDisplayRotation() {
|
||||
return mDisplayRotation;
|
||||
@@ -251,20 +290,24 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
|
||||
return mLauncherRotation;
|
||||
}
|
||||
|
||||
public boolean areMultipleLayoutOrientationsDisabled() {
|
||||
return mDisableMultipleOrientations;
|
||||
}
|
||||
|
||||
public boolean isSystemRotationAllowed() {
|
||||
return mIsSystemRotationAllowed;
|
||||
public boolean isMultipleOrientationSupportedByDevice() {
|
||||
return (mFlags & MASK_MULTIPLE_ORIENTATION_SUPPORTED_BY_DEVICE)
|
||||
== MASK_MULTIPLE_ORIENTATION_SUPPORTED_BY_DEVICE;
|
||||
}
|
||||
|
||||
public boolean isHomeRotationAllowed() {
|
||||
return mIsHomeRotationAllowed;
|
||||
return (mFlags & FLAG_HOME_ROTATION_ALLOWED_IN_PREFS) != 0;
|
||||
}
|
||||
|
||||
public boolean canLauncherRotate() {
|
||||
return isSystemRotationAllowed() && isHomeRotationAllowed();
|
||||
return (mFlags & MASK_ACTIVITY_ROTATING) == MASK_ACTIVITY_ROTATING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables or disables the rotation watcher for listening to rotation callbacks
|
||||
*/
|
||||
public void setRotationWatcherEnabled(boolean isEnabled) {
|
||||
setFlag(FLAG_ROTATION_WATCHER_ENABLED, isEnabled);
|
||||
}
|
||||
|
||||
public int getTouchRotationDegrees() {
|
||||
@@ -388,4 +431,13 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if system can keep Launcher fixed to portrait layout even if the
|
||||
* foreground app is rotated
|
||||
*/
|
||||
public static boolean isFixedRotationTransformEnabled(Context context) {
|
||||
return Settings.Global.getInt(
|
||||
context.getContentResolver(), FIXED_ROTATION_TRANSFORM_SETTING_NAME, 1) == 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,7 +203,7 @@ public class NavigationModeSwitchRule implements TestRule {
|
||||
+ launcher.getNavigationModeMismatchError(),
|
||||
() -> launcher.getNavigationModeMismatchError() == null,
|
||||
60000 /* b/148422894 */, launcher);
|
||||
AbstractLauncherUiTest.checkDetectedLeaks();
|
||||
AbstractLauncherUiTest.checkDetectedLeaks(launcher);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,10 +17,11 @@ package com.android.quickstep;
|
||||
|
||||
import static androidx.test.InstrumentationRegistry.getContext;
|
||||
import static androidx.test.InstrumentationRegistry.getInstrumentation;
|
||||
import static androidx.test.InstrumentationRegistry.getTargetContext;
|
||||
|
||||
import static com.android.launcher3.common.WidgetUtils.createWidgetInfo;
|
||||
import static com.android.launcher3.testcomponent.TestCommandReceiver.EXTRA_VALUE;
|
||||
import static com.android.launcher3.testcomponent.TestCommandReceiver.SET_LIST_VIEW_SERVICE_BINDER;
|
||||
import static com.android.launcher3.ui.widget.BindWidgetTest.createWidgetInfo;
|
||||
import static com.android.quickstep.NavigationModeSwitchRule.Mode.ZERO_BUTTON;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
@@ -187,7 +188,7 @@ public class ViewInflationDuringSwipeUp extends AbstractQuickStepTest {
|
||||
LauncherSettings.Settings.call(mResolver,
|
||||
LauncherSettings.Settings.METHOD_CLEAR_EMPTY_DB_FLAG);
|
||||
LauncherAppWidgetProviderInfo info = TestViewHelpers.findWidgetProvider(this, false);
|
||||
LauncherAppWidgetInfo item = createWidgetInfo(info, true);
|
||||
LauncherAppWidgetInfo item = createWidgetInfo(info, getTargetContext(), true);
|
||||
|
||||
addItemToScreen(item);
|
||||
assertTrue("Widget is not present",
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple android:color="@color/gesture_tutorial_ripple_color"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@android:id/mask"
|
||||
android:drawable="@color/gesture_tutorial_background_color" />
|
||||
</ripple>
|
||||
@@ -17,7 +17,8 @@
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/drag_layer" >
|
||||
android:id="@+id/drag_layer"
|
||||
android:padding="@dimen/dynamic_grid_edge_margin">
|
||||
|
||||
<GridView
|
||||
android:layout_width="match_parent"
|
||||
@@ -119,8 +120,7 @@
|
||||
android:singleLine="true"
|
||||
android:textColor="?android:attr/textColorSecondary"
|
||||
android:textColorHint="@drawable/all_apps_search_hint"
|
||||
android:textSize="16sp"
|
||||
android:translationY="24dp" />
|
||||
android:textSize="16sp" />
|
||||
|
||||
<include layout="@layout/all_apps_fast_scroller" />
|
||||
</com.android.launcher3.allapps.AllAppsContainerView>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Het dit"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Werkprofiel is onderbreek"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Werkprogramme kan nie vir jou kennisgewings stuur, jou battery gebruik of toegang tot jou ligging kry nie"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Werkprofiel is onderbreek. Werkprogramme kan nie vir jou kennisgewings stuur, jou battery gebruik of toegang tot jou ligging kry nie"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Onderbreek werkprogramme en kennisgewings"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Misluk: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ገባኝ"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"የሥራ መገለጫ ባለበት ቆሟል"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"የስራ መተግበሪያዎች ማሳወቂያዎችን ወደ እርስዎ መላክ፣ ባትሪዎን መጠቀም ወይም አካባቢዎን መድረስ አይችሉም"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"የሥራ መገለጫ ባለበት ቆሟል። የሥራ መተግበሪያዎች ማሳወቂያዎችን ወደ እርስዎ መላክ፣ ባትሪዎን መጠቀም ወይም አካባቢዎን መድረስ አይችሉም"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"የስራ መተግበሪያዎችን እና ማሳወቂያዎችን ባሉበት ያቁሙ"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"አልተሳካም፦ <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -143,6 +143,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"حسنًا"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"تم إيقاف الملف الشخصي للعمل مؤقتًا"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"لا يمكن لتطبيقات العمل إرسال إشعارات أو استخدام بطاريتك أو الوصول إلى موقعك الجغرافي."</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"تم إيقاف الملف الشخصي للعمل مؤقتًا. لا يمكن لتطبيقات العمل إرسال إشعارات إليك أو استخدام بطاريتك أو الوصول إلى موقعك الجغرافي."</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"إيقاف تطبيقات العمل وإشعاراتها مؤقتًا"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"تعذَّر <xliff:g id="WHAT">%1$s</xliff:g>."</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"বুজি পালোঁ"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"কৰ্মস্থানৰ প্ৰ\'ফাইলটো পজ কৰা আছে"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"কৰ্মস্থানৰ এপ্সমূহে আপোনালৈ জাননীসমূহ পঠিয়াব, আপোনাৰ বেটাৰী ব্যৱহাৰ কৰিব অথবা আপোনাৰ অৱস্থান এক্সেছ কৰিব নোৱাৰে"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"কৰ্মস্থানৰ প্ৰ\'ফাইলটো পজ কৰা আছে। কৰ্মস্থানৰ এপ্সমূহে আপোনালৈ জাননীসমূহ পঠিয়াব, আপোনাৰ বেটাৰী ব্যৱহাৰ কৰিব অথবা আপোনাৰ অৱস্থান এক্সেছ কৰিব নোৱাৰে"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"কর্মস্থানৰ এপ্সমূহ আৰু জাননীসমূহ পজ কৰক"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"বিফল: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<string name="all_apps_home_button_label" msgid="252062713717058851">"Əsas səhifə"</string>
|
||||
<string name="remove_drop_target_label" msgid="7812859488053230776">"Silin"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"Sistemdən sil"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Tətbiq məlumatı"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Tətbiq infosu"</string>
|
||||
<string name="install_drop_target_label" msgid="2539096853673231757">"Quraşdırın"</string>
|
||||
<string name="permlab_install_shortcut" msgid="5632423390354674437">"qısayolları quraşdır"</string>
|
||||
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Tətbiqə istifadəçi müdaxiləsi olmadan qısayolları əlavə etməyə icazə verir."</string>
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Anladım"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"İş profilinə fasilə verilib"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"İş tətbiqləri sizə bildirişlər göndərə, batareyanızdan istifadə edə və ya məkanınıza daxil ola bilməz"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"İş profilinə fasilə verilib. İş tətbiqləri sizə bildirişlər göndərə, batareyanızdan istifadə edə və ya məkanınıza daxil ola bilməz"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"İş tətbiqlərinə və bildirişlərə fasilə verin"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Alınmadı: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -140,6 +140,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Važi"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Profil za Work je pauziran"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Aplikacije za posao ne mogu da vam šalju obaveštenja, koriste bateriju ni pristupaju lokaciji"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Profil za Work je pauziran. Aplikacije za posao ne mogu da vam šalju obaveštenja, koriste bateriju niti pristupaju lokaciji"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pauzirajte aplikacije za posao i obaveštenja"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Nije uspelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -135,12 +135,13 @@
|
||||
<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_edu_personal_apps" msgid="4155536355149317441">"Асабістыя даныя аддзелены і схаваны ад працоўных праграм"</string>
|
||||
<string name="work_profile_edu_work_apps" msgid="237051938268703058">"Ваш IТ- адміністратар бачыць працоўныя праграмы і даныя"</string>
|
||||
<string name="work_profile_edu_personal_apps" msgid="4155536355149317441">"Асабістыя праграмы схаваны і паказваюцца адасоблена ад працоўных праграм"</string>
|
||||
<string name="work_profile_edu_work_apps" msgid="237051938268703058">"Ваш IТ-адміністратар мае доступ да працоўных праграм і іх даных"</string>
|
||||
<string name="work_profile_edu_next" msgid="8783418929296503629">"Далей"</string>
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Зразумела"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Працоўны профіль прыпынены"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Працоўныя праграмы не могуць адпраўляць вам апавяшчэнні, выкарыстоўваць акумулятар або атрымліваць доступ да вашага месцазнаходжання."</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Працоўны профіль прыпынены. Працоўныя праграмы не могуць адпраўляць вам апавяшчэнні, выкарыстоўваць акумулятар або атрымліваць доступ да вашага месцазнаходжання"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Прыпыніць працоўныя праграмы і апавяшчэнні"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Не ўдалося: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<string name="all_apps_home_button_label" msgid="252062713717058851">"Начало"</string>
|
||||
<string name="remove_drop_target_label" msgid="7812859488053230776">"Премахване"</string>
|
||||
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"Деинсталиране"</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Данни за прилож."</string>
|
||||
<string name="app_info_drop_target_label" msgid="692894985365717661">"Инфо за прилож."</string>
|
||||
<string name="install_drop_target_label" msgid="2539096853673231757">"Инсталиране"</string>
|
||||
<string name="permlab_install_shortcut" msgid="5632423390354674437">"инсталиране на преки пътища"</string>
|
||||
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Разрешава на приложението да добавя преки пътища без намеса на потребителя."</string>
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Разбрах"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Служебният потребителски профил е поставен на пауза"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Служебните приложения не могат да ви изпращат известия, да използват батерията или да осъществяват достъп до местоположението ви"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Служебният потребителски профил е поставен на пауза. Служебните приложения не могат да ви изпращат известия, да използват батерията или да осъществяват достъп до местоположението ви"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Поставете на пауза служебните приложения и известия"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Неуспешно: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"বুঝেছি"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"অফিস প্রোফাইল বন্ধ করা আছে"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"অফিসের অ্যাপ আপনাকে বিজ্ঞপ্তি পাঠাতে, আপনার ব্যাটারি ব্যবহার করতে বা লোকেশন অ্যাক্সেস করতে পারে না"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"অফিসের প্রোফাইল পজ করা আছে। অফিসের অ্যাপ আপনাকে বিজ্ঞপ্তি পাঠাতে, ব্যাটারি ব্যবহার করতে বা লোকেশন অ্যাক্সেস করতে পারবে না"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"অফিসের অ্যাপ এবং বিজ্ঞপ্তি বন্ধ করুন"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"কাজটি করা যায়নি: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<string name="long_accessible_way_to_add_shortcut" msgid="3327314059613154633">"Dodirnite dvaput i držite da uzmete prečicu ili koristite prilagođene akcije."</string>
|
||||
<string name="out_of_space" msgid="4691004494942118364">"Na ovom početnom ekranu nema više prostora."</string>
|
||||
<string name="hotseat_out_of_space" msgid="7448809638125333693">"Nema više prostora u ladici Omiljeno"</string>
|
||||
<string name="all_apps_button_label" msgid="8130441508702294465">"Spisak aplikacija"</string>
|
||||
<string name="all_apps_button_label" msgid="8130441508702294465">"Lista aplikacija"</string>
|
||||
<string name="all_apps_button_personal_label" msgid="1315764287305224468">"Lista ličnih aplikacija"</string>
|
||||
<string name="all_apps_button_work_label" msgid="7270707118948892488">"Lista poslovnih aplikacija"</string>
|
||||
<string name="all_apps_home_button_label" msgid="252062713717058851">"Početna"</string>
|
||||
@@ -140,6 +140,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Razumijem"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Radni profil je pauziran"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Poslovne aplikacije ne mogu vam slati obavještenja, koristiti bateriju ili pristupiti vašoj lokaciji"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Radni profil je pauziran. Poslovne aplikacije vam ne mogu slati obavještenja, koristiti bateriju ili pristupiti vašoj lokaciji"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pauzirajte poslovne aplikacije i obavještenja"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Nije uspjelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -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="app_name" msgid="649227358658669779">"Launcher3"</string>
|
||||
<string name="work_folder_name" msgid="3753320833950115786">"Feina"</string>
|
||||
<string name="work_folder_name" msgid="3753320833950115786">"Treball"</string>
|
||||
<string name="activity_not_found" msgid="8071924732094499514">"L\'aplicació no s\'ha instal·lat."</string>
|
||||
<string name="activity_not_available" msgid="7456344436509528827">"L\'aplicació no està disponible."</string>
|
||||
<string name="safemode_shortcut_error" msgid="9160126848219158407">"L\'aplicació que has baixat està desactivada al mode segur."</string>
|
||||
@@ -131,7 +131,7 @@
|
||||
<string name="accessibility_close" msgid="2277148124685870734">"Tanca"</string>
|
||||
<string name="notification_dismissed" msgid="6002233469409822874">"S\'ha ignorat la notificació"</string>
|
||||
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
|
||||
<string name="all_apps_work_tab" msgid="4884822796154055118">"Feina"</string>
|
||||
<string name="all_apps_work_tab" msgid="4884822796154055118">"Treball"</string>
|
||||
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de treball"</string>
|
||||
<string name="work_profile_edu_personal_apps" msgid="4155536355149317441">"Les dades personals s\'oculten i se separen de les aplicacions de treball"</string>
|
||||
<string name="work_profile_edu_work_apps" msgid="237051938268703058">"L\'administrador de TI pot veure les dades i les aplicacions de treball"</string>
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Entesos"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"El perfil de treball està en pausa"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Les aplicacions de treball no poden enviar-te notificacions, consumir bateria ni accedir a la teva ubicació"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"El perfil de treball està en pausa. Les aplicacions de treball no poden enviar-te notificacions, consumir bateria ni accedir a la teva ubicació"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Posa en pausa les notificacions i les aplicacions de treball"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Error: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -141,6 +141,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Rozumím"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Pracovní profil je pozastaven"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Pracovní aplikace vám nemohou zasílat oznámení, používat vaši baterii ani získat přístup k vaší poloze"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Pracovní profil je pozastaven. Pracovní aplikace vám nemohou zasílat oznámení, používat vaši baterii ani získat přístup k vaší poloze"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pozastavit pracovní aplikace a oznámení"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Selhalo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Arbejdsprofilen er sat på pause"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Arbejdsapps kan ikke sende dig notifikationer, bruge dit batteri eller få adgang til din placering"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Arbejdsprofilen er sat på pause. Arbejdsapps kan ikke sende dig notifikationer, bruge dit batteri eller få adgang til din placering"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Sæt arbejdsapps og notifikationer på pause"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Mislykket: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Arbeitsprofil pausiert"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Geschäftliche Apps können dir Benachrichtigungen senden, deinen Akku verbrauchen oder auf deinen Standort zugreifen"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Das Arbeitsprofil ist pausiert. Geschäftliche Apps können dir keine Benachrichtigungen senden, deinen Akku nicht beanspruchen und nicht auf deinen Standort zugreifen."</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Geschäftliche Apps und Benachrichtigungen pausieren"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Fehler: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Το κατάλαβα"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Το προφίλ εργασίας έχει τεθεί σε παύση"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Οι εφαρμογές εργασιών δεν μπορούν να σας στέλνουν ειδοποιήσεις, να χρησιμοποιούν την μπαταρία ή να έχουν πρόσβαση στην τοποθεσία σας"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Το προφίλ εργασίας έχει τεθεί σε παύση. Οι εφαρμογές εργασιών δεν μπορούν να σας στέλνουν ειδοποιήσεις, να χρησιμοποιούν την μπαταρία ή να έχουν πρόσβαση στην τοποθεσία σας."</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Παύση εφαρμογών εργασιών και ειδοποιήσεων"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Αποτυχία: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Double-tap & hold to pick up a widget or use customised actions."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d wide by %2$d high"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Touch & hold to place manually"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Touch and hold to place manually"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Add automatically"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Loading apps…"</string>
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Work profile is paused"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Work apps cant send you notifications, use your battery or access your location"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Work profile is paused. Work apps can\'t send you notifications, use your battery or access your location"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pause work apps and notifications"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Double-tap & hold to pick up a widget or use customised actions."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d wide by %2$d high"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Touch & hold to place manually"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Touch and hold to place manually"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Add automatically"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Loading apps…"</string>
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Work profile is paused"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Work apps cant send you notifications, use your battery or access your location"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Work profile is paused. Work apps can\'t send you notifications, use your battery or access your location"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pause work apps and notifications"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Double-tap & hold to pick up a widget or use customised actions."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d wide by %2$d high"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Touch & hold to place manually"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Touch and hold to place manually"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Add automatically"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Loading apps…"</string>
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Work profile is paused"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Work apps cant send you notifications, use your battery or access your location"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Work profile is paused. Work apps can\'t send you notifications, use your battery or access your location"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pause work apps and notifications"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<string name="long_accessible_way_to_add" msgid="4289502106628154155">"Double-tap & hold to pick up a widget or use customised actions."</string>
|
||||
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
|
||||
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d wide by %2$d high"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Touch & hold to place manually"</string>
|
||||
<string name="add_item_request_drag_hint" msgid="5899764264480397019">"Touch and hold to place manually"</string>
|
||||
<string name="place_automatically" msgid="8064208734425456485">"Add automatically"</string>
|
||||
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
|
||||
<string name="all_apps_loading_message" msgid="5813968043155271636">"Loading apps…"</string>
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Work profile is paused"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Work apps cant send you notifications, use your battery or access your location"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Work profile is paused. Work apps can\'t send you notifications, use your battery or access your location"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pause work apps and notifications"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Got it"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Work profile is paused"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Work apps cant send you notifications, use your battery, or access your location"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Work profile is paused. Work apps cant send you notifications, use your battery, or access your location"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pause work apps and notifications"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Entendido"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"El perfil de trabajo está en pausa"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Las apps de trabajo no pueden enviarte notificaciones, usar la batería ni acceder a tu ubicación"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"El perfil de trabajo está en pausa. Las apps de trabajo no pueden enviarte notificaciones, usar la batería ni acceder a tu ubicación"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pon en pausa las apps de trabajo y las notificaciones"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Error: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Listo"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"El perfil de trabajo está en pausa"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Las aplicaciones de trabajo no pueden enviarte notificaciones, gastar tu batería ni acceder a tu ubicación"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"El perfil de trabajo está en pausa. Las aplicaciones de trabajo no pueden enviarte notificaciones, consumir tu batería ni acceder a tu ubicación"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pausar notificaciones y aplicaciones de trabajo"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Se ha producido un error: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<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="app_info_drop_target_label" msgid="692894985365717661">"Rakenduste 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>
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Selge"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Tööprofiil on peatatud"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Töörakendused ei saa teile märguandeid saata, akut kasutada ega teie asukohale juurdepääseda"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Tööprofiil on peatatud. Töörakendused ei saa teile märguandeid saata, akut kasutada ega teie asukohale juurde pääseda"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Peatage töörakendused ja märguanded"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Nurjus: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
<string name="gadget_error_text" msgid="6081085226050792095">"Arazo bat izan da widgeta kargatzean"</string>
|
||||
<string name="gadget_setup_text" msgid="8274003207686040488">"Konfigurazioa"</string>
|
||||
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Sistema-aplikazioa da hau eta ezin da desinstalatu."</string>
|
||||
<string name="folder_hint_text" msgid="6617836969016293992">"Izenik gabeko karpeta"</string>
|
||||
<string name="folder_hint_text" msgid="5174843001373488816">"Editatu izena"</string>
|
||||
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> desgaituta dago"</string>
|
||||
<plurals name="dotted_app_label" formatted="false" msgid="5194538107138265416">
|
||||
<item quantity="other"><xliff:g id="APP_NAME_2">%1$s</xliff:g> aplikazioak <xliff:g id="NOTIFICATION_COUNT_3">%2$d</xliff:g> jakinarazpen ditu</item>
|
||||
@@ -91,7 +91,7 @@
|
||||
<string name="msg_missing_notification_access" msgid="281113995110910548">"Jakinarazpen-biribiltxoak ikusteko, aktibatu <xliff:g id="NAME">%1$s</xliff:g> aplikazioaren jakinarazpenak"</string>
|
||||
<string name="title_change_settings" msgid="1376365968844349552">"Aldatu ezarpenak"</string>
|
||||
<string name="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_label" msgid="3698776050751790653">"Gehitu aplikazioen ikonoak hasierako pantailan"</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>
|
||||
@@ -128,15 +128,18 @@
|
||||
<string name="action_deep_shortcut" msgid="2864038805849372848">"Lasterbideak"</string>
|
||||
<string name="shortcuts_menu_with_notifications_description" msgid="2676582286544232849">"Lasterbideak eta jakinarazpenak"</string>
|
||||
<string name="action_dismiss_notification" msgid="5909461085055959187">"Baztertu"</string>
|
||||
<string name="accessibility_close" msgid="2277148124685870734">"Itxi"</string>
|
||||
<string name="notification_dismissed" msgid="6002233469409822874">"Baztertu egin da jakinarazpena"</string>
|
||||
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pertsonalak"</string>
|
||||
<string name="all_apps_work_tab" msgid="4884822796154055118">"Lanekoak"</string>
|
||||
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Laneko profila"</string>
|
||||
<string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"Hemen dituzu laneko aplikazioak"</string>
|
||||
<string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"Laneko aplikazio bakoitzak bereizgarri bat dauka eta erakundeak babesten du. Aplikazioak errazago atzitzeko, eraman itzazu hasierako pantailara."</string>
|
||||
<string name="work_mode_on_label" msgid="4781128097185272916">"Erakundeak kudeatzen du"</string>
|
||||
<string name="work_mode_off_label" msgid="3194894777601421047">"Jakinarazpenak eta aplikazioak desaktibatuta daude"</string>
|
||||
<string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"Itxi"</string>
|
||||
<string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"Itxita"</string>
|
||||
<string name="work_profile_edu_personal_apps" msgid="4155536355149317441">"Datu pertsonalak bananduta daude eta ez daude laneko aplikazioen artean ikusgai"</string>
|
||||
<string name="work_profile_edu_work_apps" msgid="237051938268703058">"IKT saileko administratzaileak laneko aplikazioak eta datuak ikus ditzake"</string>
|
||||
<string name="work_profile_edu_next" msgid="8783418929296503629">"Hurrengoa"</string>
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Ados"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Laneko profila pausatuta dago"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Laneko aplikazioek ezin dute jakinarazpenik bidali, bateria erabili edo kokapena atzitu"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Laneko profila pausatuta dago. Laneko aplikazioek ezin dute jakinarazpenik bidali, bateria erabili edo kokapena atzitu."</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pausatu laneko aplikazioak eta jakinarazpenak"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Huts egin du: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"متوجهام"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"نمایه کاری موقتاً متوقف شده است"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"برنامههای کاری نمیتوانند اعلان ارسال کنند، از باتری استفاده کنند، یا به مکانتان دسترسی داشته باشند"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"نمایه کاری موقتاً متوقف شده است. برنامههای کاری نمیتوانند به شما اعلان ارسال کنند، از باتری استفاده کنند، یا به مکانتان دسترسی داشته باشند"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"توقف موقت برنامههای کاری و اعلانها"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"ناموفق بود: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Selvä"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Työprofiilin käyttö on keskeytetty"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Työsovellukset eivät voi lähettää sinulle ilmoituksia tai käyttää akkuasi tai sijaintiasi"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Työprofiilin käyttö on keskeytetty. Työsovellukset eivät voi lähettää sinulle ilmoituksia eivätkä käyttää akkuasi tai sijaintiasi"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Keskeytä työsovellukset ja ‑ilmoitukset"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Epäonnistui: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
<string name="msg_missing_notification_access" msgid="281113995110910548">"Pour afficher les points de notification, activez les notifications d\'application pour <xliff:g id="NAME">%1$s</xliff:g>"</string>
|
||||
<string name="title_change_settings" msgid="1376365968844349552">"Modifier les paramètres"</string>
|
||||
<string name="notification_dots_service_title" msgid="4284221181793592871">"Afficher les points de notification"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="3698776050751790653">"Ajouter icônes d\'applis à l\'écran d\'accueil"</string>
|
||||
<string name="auto_add_shortcuts_label" msgid="3698776050751790653">"Ajouter icônes d\'applis à l\'écran d\'acc."</string>
|
||||
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Pour les nouvelles applications"</string>
|
||||
<string name="package_state_unknown" msgid="7592128424511031410">"Inconnu"</string>
|
||||
<string name="abandoned_clean_this" msgid="7610119707847920412">"Supprimer"</string>
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Le profil professionnel est interrompu"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Les applications professionnelles ne peuvent pas vous envoyer de notifications, utiliser la pile ni accéder à votre position"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Le profil professionnel est interrompu. Les applications professionnelles ne peuvent pas vous envoyer de notifications, utiliser la pile ni accéder à votre position"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Interrompre les applications et les notifications professionnelles"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Échec : <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Profil professionnel en pause"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Les applications professionnelles ne peuvent pas vous envoyer de notifications, utiliser votre batterie ni accéder à votre localisation"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Profil professionnel en pause. Les applications professionnelles ne peuvent pas vous envoyer de notifications, utiliser votre batterie ni accéder à votre localisation"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Mettre en pause vos applications et notifications professionnelles"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Échec : <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"De acordo"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"O perfil de traballo está en pausa"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"As aplicacións do traballo non poden enviarche notificacións, utilizar a batería nin acceder á túa localización"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"O perfil de traballo está en pausa. As aplicacións do traballo non poden enviarche notificacións, utilizar a batería nin acceder á túa localización"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pon en pausa as aplicacións e as notificacións do traballo"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Erro: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
<string name="gadget_error_text" msgid="6081085226050792095">"વિજેટ લોડ કરવામાં સમસ્યા"</string>
|
||||
<string name="gadget_setup_text" msgid="8274003207686040488">"સેટઅપ"</string>
|
||||
<string name="uninstall_system_app_text" msgid="4172046090762920660">"આ એક સિસ્ટમ ઍપ્લિકેશન છે અને અનઇન્સ્ટોલ કરી શકાતી નથી."</string>
|
||||
<string name="folder_hint_text" msgid="6617836969016293992">"અનામી ફોલ્ડર"</string>
|
||||
<string name="folder_hint_text" msgid="5174843001373488816">"નામમાં ફેરફાર કરો"</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>
|
||||
@@ -80,7 +80,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>
|
||||
@@ -91,7 +91,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="3698776050751790653">"ઍપના આઇકન હોમ સ્ક્રીન પર ઉમેરો"</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>
|
||||
@@ -128,15 +128,18 @@
|
||||
<string name="action_deep_shortcut" msgid="2864038805849372848">"શૉર્ટકટ્સ"</string>
|
||||
<string name="shortcuts_menu_with_notifications_description" msgid="2676582286544232849">"શૉર્ટકટ અને નોટિફિકેશનો"</string>
|
||||
<string name="action_dismiss_notification" msgid="5909461085055959187">"છોડી દો"</string>
|
||||
<string name="accessibility_close" msgid="2277148124685870734">"બંધ કરો"</string>
|
||||
<string name="notification_dismissed" msgid="6002233469409822874">"સૂચના છોડી દીધી"</string>
|
||||
<string name="all_apps_personal_tab" msgid="4190252696685155002">"મનગમતી ઍપ"</string>
|
||||
<string name="all_apps_work_tab" msgid="4884822796154055118">"કાર્યાલયની ઍપ"</string>
|
||||
<string name="work_profile_toggle_label" msgid="3081029915775481146">"કાર્યાલયની પ્રોફાઇલ"</string>
|
||||
<string name="bottom_work_tab_user_education_title" msgid="5785851780786322825">"કાર્ય ઍપને અહીંથી મેળવો"</string>
|
||||
<string name="bottom_work_tab_user_education_body" msgid="2818107472360579152">"દરેક કાર્ય ઍપ પાસે એક બૅજ હોય છે અને તમારી સંસ્થા દ્વારા તેને સુરક્ષિત રાખવામાં આવે છે. વધુ સરળ ઍક્સેસ માટે ઍપને તમારી હોમ સ્ક્રીન પર ખસેડો."</string>
|
||||
<string name="work_mode_on_label" msgid="4781128097185272916">"તમારી સંસ્થા દ્વારા મેનેજ કરેલ"</string>
|
||||
<string name="work_mode_off_label" msgid="3194894777601421047">"નોટિફિકેશન અને ઍપ બંધ છે"</string>
|
||||
<string name="bottom_work_tab_user_education_close_button" msgid="4224492243977802135">"બંધ કરો"</string>
|
||||
<string name="bottom_work_tab_user_education_closed" msgid="1098340939861869465">"બંધ"</string>
|
||||
<string name="work_profile_edu_personal_apps" msgid="4155536355149317441">"વ્યક્તિગત ડેટા ઑફિસ માટેની ઍપથી અલગ અને છુપાવીને રાખેલો છે"</string>
|
||||
<string name="work_profile_edu_work_apps" msgid="237051938268703058">"ઑફિસ માટેની ઍપ અને ડેટા તમારા IT વ્યવસ્થાપકને દેખાય છે"</string>
|
||||
<string name="work_profile_edu_next" msgid="8783418929296503629">"આગળ"</string>
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"સમજાઈ ગયું"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"કાર્યાલયની પ્રોફાઇલ થોભાવી છે"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"ઑફિસ માટેની ઍપ તમને નોટિફિકેશન મોકલી શકતી નથી, તમારી બૅટરી વાપરી શકતી નથી કે તમારું સ્થાન ઍક્સેસ કરી શકતી નથી"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"કાર્યાલયની પ્રોફાઇલ થોભાવી છે. ઑફિસ માટેની ઍપ તમને નોટિફિકેશન મોકલી શકતી નથી, તમારી બૅટરી વાપરી શકતી નથી કે તમારું સ્થાન ઍક્સેસ કરી શકતી નથી"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"ઑફિસ માટેની ઍપ અને નોટિફિકેશન થોભાવો"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"નિષ્ફળ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ठीक है"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"वर्क प्रोफ़ाइल रोक दी गई है"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"ऑफ़िस के काम से जुड़े ऐप्लिकेशन आपको सूचनाएं नहीं भेज सकते. साथ ही, आपकी बैटरी का इस्तेमाल या आपकी जगह की जानकारी को ऐक्सेस नहीं कर सकते"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"वर्क प्रोफ़ाइल रोक दी गई है. ऑफ़िस के काम से जुड़े ऐप्लिकेशन आपको सूचनाएं नहीं भेज सकते. साथ ही, आपके डिवाइस की बैटरी का इस्तेमाल या आपकी जगह की जानकारी को ऐक्सेस नहीं कर सकते"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"ऑफ़िस के काम से जुड़े ऐप्लिकेशन और सूचनाएं रोकें"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"पूरा नहीं हुआ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -140,6 +140,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Shvaćam"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Poslovni profil je pauziran"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Poslovne aplikacije ne mogu vam slati obavijesti, upotrebljavati bateriju ili pristupiti vašoj lokaciji"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Poslovni profil je pauziran. Poslovne aplikacije ne mogu vam slati obavijesti, trošiti bateriju ili pristupiti vašoj lokaciji"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Pauzirajte poslovne aplikacije i obavijesti"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Nije uspjelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Értem"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"A munkaprofil szüneteltetve van"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"A munkahelyi alkalmazások nem küldhetnek értesítéseket, nem használhatják az akkumulátort, és nem férhetnek hozzá az Ön tartózkodási helyéhez"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"A munkaprofil szüneteltetve van. A munkahelyi alkalmazások nem küldhetnek értesítéseket, nem használhatják az akkumulátort, és nem férhetnek hozzá az Ön tartózkodási helyéhez"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Munkahelyi alkalmazások és értesítések szüneteltetése"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Sikertelen: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Եղավ"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Աշխատանքային պրոֆիլը դադարեցված է"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Աշխատանքային հավելվածները չեն կարող օգտագործել ձեր մարտկոցը, գտնվելու վայրի մասին տվյալները և ուղարկել ձեզ ծանուցումներ։"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Աշխատանքային պրոֆիլը դադարեցված է։ Աշխատանքային հավելվածները չեն կարող օգտագործել ձեր մարտկոցը, գտնվելու վայրի մասին տվյալները և ուղարկել ձեզ ծանուցումներ։"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Դադարեցնել աշխատանքային հավելվածներն ու ծանուցումները"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Չհաջողվեց կատարել գործողությունը (<xliff:g id="WHAT">%1$s</xliff:g>)"</string>
|
||||
</resources>
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
<string name="accessibility_close" msgid="2277148124685870734">"Tutup"</string>
|
||||
<string name="notification_dismissed" msgid="6002233469409822874">"Notifikasi ditutup"</string>
|
||||
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pribadi"</string>
|
||||
<string name="all_apps_work_tab" msgid="4884822796154055118">"Kantor"</string>
|
||||
<string name="all_apps_work_tab" msgid="4884822796154055118">"Kerja"</string>
|
||||
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Profil kerja"</string>
|
||||
<string name="work_profile_edu_personal_apps" msgid="4155536355149317441">"Data pribadi terpisah & tersembunyi dari aplikasi kerja"</string>
|
||||
<string name="work_profile_edu_work_apps" msgid="237051938268703058">"Aplikasi & data kerja terlihat oleh admin IT"</string>
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Oke"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Profil kerja dijeda"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Aplikasi kerja tidak dapat mengirimi Anda notifikasi, menggunakan baterai, atau mengakses lokasi Anda"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Profil kerja dijeda. Aplikasi kerja tidak dapat mengirimi Anda notifikasi, menggunakan baterai, atau mengakses lokasi Anda"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Jeda notifikasi dan aplikasi kerja"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Gagal: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Ég skil"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Hlé gert á vinnusniði"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Vinnuforrit geta ekki sent þér tilkynningar, notað rafhlöðuorku eða fengið aðgang að staðsetningu þinni"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Hlé gert á vinnusniði. Vinnuforrit geta ekki sent þér tilkynningar, notað rafhlöðuorku eða fengið aðgang að staðsetningu þinni"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Gera hlé á vinnuforritum og tilkynningum"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Mistókst: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"Profilo di lavoro sospeso"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"Le app di lavoro non possono inviare notifiche, utilizzare la batteria o accedere alla tua posizione"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"Profilo di lavoro in pausa. Le app di lavoro non possono inviarti notifiche, usare la tua batteria o accedere alla tua posizione"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"Metti in pausa le app di lavoro e le relative notifiche"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"Operazione non riuscita: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -141,6 +141,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"הבנתי"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"פרופיל העבודה מושהה"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"אפליקציות לעבודה לא יכולות לשלוח לך התראות, להשתמש בסוללה או לגשת למיקום שלך"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"פרופיל העבודה מושהה. אפליקציות לעבודה לא יכולות לשלוח לך התראות, להשתמש בסוללה או לגשת למיקום שלך"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"השהיה של התראות ואפליקציות לעבודה"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"הפעולה נכשלה: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
|
||||
<string name="work_apps_paused_title" msgid="2389865654362803723">"仕事用プロファイルが一時停止しています"</string>
|
||||
<string name="work_apps_paused_body" msgid="5388070126389079077">"仕事用アプリは、通知の送信、電池の使用、位置情報へのアクセスを行えません"</string>
|
||||
<string name="work_apps_paused_content_description" msgid="7553586952985486433">"仕事用プロファイルが一時停止しています。仕事用アプリから通知の送信、電池の使用、位置情報へのアクセスを行えません"</string>
|
||||
<string name="work_switch_tip" msgid="808075064383839144">"仕事用のアプリと通知を一時停止します"</string>
|
||||
<string name="remote_action_failed" msgid="1383965239183576790">"失敗: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
|
||||
</resources>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user