Merge "Fix tutorial background color not up-to-date occasionally" into sc-dev am: 3ebd024a80 am: 63f15d32dd
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15373613 Change-Id: Ied857583e43fb2e0e68e19d158d6b48aa5261dd5
This commit is contained in:
@@ -46,7 +46,7 @@ public interface OneHandedAnimationCallback {
|
|||||||
/**
|
/**
|
||||||
* Called when OneHanded animator is updating position
|
* Called when OneHanded animator is updating position
|
||||||
*/
|
*/
|
||||||
default void onAnimationUpdate(float xPos, float yPos) {
|
default void onAnimationUpdate(SurfaceControl.Transaction tx, float xPos, float yPos) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,10 +182,10 @@ public class OneHandedAnimationController {
|
|||||||
@Override
|
@Override
|
||||||
public void onAnimationUpdate(ValueAnimator animation) {
|
public void onAnimationUpdate(ValueAnimator animation) {
|
||||||
final SurfaceControl.Transaction tx = newSurfaceControlTransaction();
|
final SurfaceControl.Transaction tx = newSurfaceControlTransaction();
|
||||||
applySurfaceControlTransaction(mLeash, tx, animation.getAnimatedFraction());
|
|
||||||
mOneHandedAnimationCallbacks.forEach(
|
mOneHandedAnimationCallbacks.forEach(
|
||||||
(callback) -> callback.onAnimationUpdate(0f, mCurrentValue)
|
(callback) -> callback.onAnimationUpdate(tx, 0f, mCurrentValue)
|
||||||
);
|
);
|
||||||
|
applySurfaceControlTransaction(mLeash, tx, animation.getAnimatedFraction());
|
||||||
}
|
}
|
||||||
|
|
||||||
void onStartTransaction(SurfaceControl leash, SurfaceControl.Transaction tx) {
|
void onStartTransaction(SurfaceControl leash, SurfaceControl.Transaction tx) {
|
||||||
|
|||||||
@@ -16,12 +16,14 @@
|
|||||||
|
|
||||||
package com.android.wm.shell.onehanded;
|
package com.android.wm.shell.onehanded;
|
||||||
|
|
||||||
|
import android.animation.ValueAnimator;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.PixelFormat;
|
import android.graphics.PixelFormat;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
import android.view.SurfaceSession;
|
import android.view.SurfaceSession;
|
||||||
|
import android.view.animation.LinearInterpolator;
|
||||||
import android.window.DisplayAreaAppearedInfo;
|
import android.window.DisplayAreaAppearedInfo;
|
||||||
import android.window.DisplayAreaInfo;
|
import android.window.DisplayAreaInfo;
|
||||||
import android.window.DisplayAreaOrganizer;
|
import android.window.DisplayAreaOrganizer;
|
||||||
@@ -29,8 +31,8 @@ import android.window.DisplayAreaOrganizer;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
import androidx.appcompat.view.ContextThemeWrapper;
|
||||||
|
|
||||||
import com.android.internal.annotations.GuardedBy;
|
|
||||||
import com.android.wm.shell.R;
|
import com.android.wm.shell.R;
|
||||||
import com.android.wm.shell.common.DisplayLayout;
|
import com.android.wm.shell.common.DisplayLayout;
|
||||||
|
|
||||||
@@ -44,194 +46,212 @@ import java.util.concurrent.Executor;
|
|||||||
* the screen has entered one handed mode.
|
* the screen has entered one handed mode.
|
||||||
*/
|
*/
|
||||||
public class OneHandedBackgroundPanelOrganizer extends DisplayAreaOrganizer
|
public class OneHandedBackgroundPanelOrganizer extends DisplayAreaOrganizer
|
||||||
implements OneHandedTransitionCallback {
|
implements OneHandedAnimationCallback {
|
||||||
private static final String TAG = "OneHandedBackgroundPanelOrganizer";
|
private static final String TAG = "OneHandedBackgroundPanelOrganizer";
|
||||||
private static final int THEME_COLOR_OFFSET = 10;
|
private static final int THEME_COLOR_OFFSET = 10;
|
||||||
|
private static final int ALPHA_ANIMATION_DURATION = 200;
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final Object mLock = new Object();
|
|
||||||
private final SurfaceSession mSurfaceSession = new SurfaceSession();
|
private final SurfaceSession mSurfaceSession = new SurfaceSession();
|
||||||
private final Executor mMainExecutor;
|
|
||||||
private final OneHandedSurfaceTransactionHelper.SurfaceControlTransactionFactory
|
private final OneHandedSurfaceTransactionHelper.SurfaceControlTransactionFactory
|
||||||
mSurfaceControlTransactionFactory;
|
mTransactionFactory;
|
||||||
|
|
||||||
private float[] mDefaultColor;
|
private ValueAnimator mAlphaAnimator;
|
||||||
|
|
||||||
|
private float mTranslationFraction;
|
||||||
|
private float[] mThemeColor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The background to distinguish the boundary of translated windows and empty region when
|
* The background to distinguish the boundary of translated windows and empty region when
|
||||||
* one handed mode triggered.
|
* one handed mode triggered.
|
||||||
*/
|
*/
|
||||||
private Rect mBkgBounds;
|
private Rect mBkgBounds;
|
||||||
|
private Rect mStableInsets;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@GuardedBy("mLock")
|
SurfaceControl mBackgroundSurface;
|
||||||
boolean mIsShowing;
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@GuardedBy("mLock")
|
|
||||||
private SurfaceControl mBackgroundSurface;
|
|
||||||
@Nullable
|
|
||||||
@GuardedBy("mLock")
|
|
||||||
private SurfaceControl mParentLeash;
|
private SurfaceControl mParentLeash;
|
||||||
|
|
||||||
private final OneHandedAnimationCallback mOneHandedAnimationCallback =
|
|
||||||
new OneHandedAnimationCallback() {
|
|
||||||
@Override
|
|
||||||
public void onOneHandedAnimationStart(
|
|
||||||
OneHandedAnimationController.OneHandedTransitionAnimator animator) {
|
|
||||||
mMainExecutor.execute(() -> showBackgroundPanelLayer());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStopFinished(Rect bounds) {
|
|
||||||
mMainExecutor.execute(() -> removeBackgroundPanelLayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
public OneHandedBackgroundPanelOrganizer(Context context, DisplayLayout displayLayout,
|
public OneHandedBackgroundPanelOrganizer(Context context, DisplayLayout displayLayout,
|
||||||
Executor executor) {
|
OneHandedSettingsUtil settingsUtil, Executor executor) {
|
||||||
super(executor);
|
super(executor);
|
||||||
mContext = context;
|
mContext = context;
|
||||||
// Ensure the mBkgBounds is portrait, due to OHM only support on portrait
|
mTranslationFraction = settingsUtil.getTranslationFraction(context);
|
||||||
if (displayLayout.height() > displayLayout.width()) {
|
mTransactionFactory = SurfaceControl.Transaction::new;
|
||||||
mBkgBounds = new Rect(0, 0, displayLayout.width(), displayLayout.height());
|
|
||||||
} else {
|
|
||||||
mBkgBounds = new Rect(0, 0, displayLayout.height(), displayLayout.width());
|
|
||||||
}
|
|
||||||
updateThemeColors();
|
updateThemeColors();
|
||||||
mMainExecutor = executor;
|
|
||||||
mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo,
|
public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo,
|
||||||
@NonNull SurfaceControl leash) {
|
@NonNull SurfaceControl leash) {
|
||||||
synchronized (mLock) {
|
mParentLeash = leash;
|
||||||
if (mParentLeash == null) {
|
|
||||||
mParentLeash = leash;
|
|
||||||
} else {
|
|
||||||
throw new RuntimeException("There should be only one DisplayArea for "
|
|
||||||
+ "the one-handed mode background panel");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OneHandedAnimationCallback getOneHandedAnimationCallback() {
|
|
||||||
return mOneHandedAnimationCallback;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<DisplayAreaAppearedInfo> registerOrganizer(int displayAreaFeature) {
|
public List<DisplayAreaAppearedInfo> registerOrganizer(int displayAreaFeature) {
|
||||||
synchronized (mLock) {
|
final List<DisplayAreaAppearedInfo> displayAreaInfos;
|
||||||
final List<DisplayAreaAppearedInfo> displayAreaInfos;
|
displayAreaInfos = super.registerOrganizer(displayAreaFeature);
|
||||||
displayAreaInfos = super.registerOrganizer(displayAreaFeature);
|
for (int i = 0; i < displayAreaInfos.size(); i++) {
|
||||||
for (int i = 0; i < displayAreaInfos.size(); i++) {
|
final DisplayAreaAppearedInfo info = displayAreaInfos.get(i);
|
||||||
final DisplayAreaAppearedInfo info = displayAreaInfos.get(i);
|
onDisplayAreaAppeared(info.getDisplayAreaInfo(), info.getLeash());
|
||||||
onDisplayAreaAppeared(info.getDisplayAreaInfo(), info.getLeash());
|
|
||||||
}
|
|
||||||
return displayAreaInfos;
|
|
||||||
}
|
}
|
||||||
|
return displayAreaInfos;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void unregisterOrganizer() {
|
public void unregisterOrganizer() {
|
||||||
synchronized (mLock) {
|
super.unregisterOrganizer();
|
||||||
super.unregisterOrganizer();
|
removeBackgroundPanelLayer();
|
||||||
mParentLeash = null;
|
mParentLeash = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationUpdate(SurfaceControl.Transaction tx, float xPos, float yPos) {
|
||||||
|
final int yTopPos = (mStableInsets.top - mBkgBounds.height()) + Math.round(yPos);
|
||||||
|
tx.setPosition(mBackgroundSurface, 0, yTopPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
SurfaceControl getBackgroundSurface() {
|
boolean isRegistered() {
|
||||||
synchronized (mLock) {
|
return mParentLeash != null;
|
||||||
if (mParentLeash == null) {
|
}
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mBackgroundSurface == null) {
|
void createBackgroundSurface() {
|
||||||
mBackgroundSurface = new SurfaceControl.Builder(mSurfaceSession)
|
mBackgroundSurface = new SurfaceControl.Builder(mSurfaceSession)
|
||||||
.setParent(mParentLeash)
|
.setBufferSize(mBkgBounds.width(), mBkgBounds.height())
|
||||||
.setBufferSize(mBkgBounds.width(), mBkgBounds.height())
|
.setColorLayer()
|
||||||
.setColorLayer()
|
.setFormat(PixelFormat.RGB_888)
|
||||||
.setFormat(PixelFormat.RGB_888)
|
.setOpaque(true)
|
||||||
.setOpaque(true)
|
.setName("one-handed-background-panel")
|
||||||
.setName("one-handed-background-panel")
|
.setCallsite("OneHandedBackgroundPanelOrganizer")
|
||||||
.setCallsite("OneHandedBackgroundPanelOrganizer")
|
.build();
|
||||||
.build();
|
|
||||||
}
|
// TODO(185890335) Avoid Dimming for mid-range luminance wallpapers flash.
|
||||||
return mBackgroundSurface;
|
mAlphaAnimator = ValueAnimator.ofFloat(1.0f, 0.0f);
|
||||||
|
mAlphaAnimator.setInterpolator(new LinearInterpolator());
|
||||||
|
mAlphaAnimator.setDuration(ALPHA_ANIMATION_DURATION);
|
||||||
|
mAlphaAnimator.addUpdateListener(
|
||||||
|
animator -> detachBackgroundFromParent(animator));
|
||||||
|
}
|
||||||
|
|
||||||
|
void detachBackgroundFromParent(ValueAnimator animator) {
|
||||||
|
if (mBackgroundSurface == null || mParentLeash == null) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
// TODO(185890335) Avoid Dimming for mid-range luminance wallpapers flash.
|
||||||
|
final float currentValue = (float) animator.getAnimatedValue();
|
||||||
|
final SurfaceControl.Transaction tx = mTransactionFactory.getTransaction();
|
||||||
|
if (currentValue == 0.0f) {
|
||||||
|
tx.reparent(mBackgroundSurface, null).apply();
|
||||||
|
} else {
|
||||||
|
tx.setAlpha(mBackgroundSurface, (float) animator.getAnimatedValue()).apply();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when onDisplayAdded() or onDisplayRemoved() callback.
|
||||||
|
*
|
||||||
|
* @param displayLayout The latest {@link DisplayLayout} representing current displayId
|
||||||
|
*/
|
||||||
|
public void onDisplayChanged(DisplayLayout displayLayout) {
|
||||||
|
mStableInsets = displayLayout.stableInsets();
|
||||||
|
// Ensure the mBkgBounds is portrait, due to OHM only support on portrait
|
||||||
|
if (displayLayout.height() > displayLayout.width()) {
|
||||||
|
mBkgBounds = new Rect(0, 0, displayLayout.width(),
|
||||||
|
Math.round(displayLayout.height() * mTranslationFraction) + mStableInsets.top);
|
||||||
|
} else {
|
||||||
|
mBkgBounds = new Rect(0, 0, displayLayout.height(),
|
||||||
|
Math.round(displayLayout.width() * mTranslationFraction) + mStableInsets.top);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void onStart() {
|
||||||
|
if (mBackgroundSurface == null) {
|
||||||
|
createBackgroundSurface();
|
||||||
|
}
|
||||||
|
showBackgroundPanelLayer();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when transition finished.
|
||||||
|
*/
|
||||||
|
public void onStopFinished() {
|
||||||
|
mAlphaAnimator.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
void showBackgroundPanelLayer() {
|
void showBackgroundPanelLayer() {
|
||||||
synchronized (mLock) {
|
if (mParentLeash == null) {
|
||||||
if (mIsShowing) {
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getBackgroundSurface() == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SurfaceControl.Transaction transaction =
|
|
||||||
mSurfaceControlTransactionFactory.getTransaction();
|
|
||||||
transaction.setLayer(mBackgroundSurface, -1 /* at bottom-most layer */)
|
|
||||||
.setColor(mBackgroundSurface, mDefaultColor)
|
|
||||||
.show(mBackgroundSurface)
|
|
||||||
.apply();
|
|
||||||
transaction.close();
|
|
||||||
mIsShowing = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mBackgroundSurface == null) {
|
||||||
|
createBackgroundSurface();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(185890335) Avoid Dimming for mid-range luminance wallpapers flash.
|
||||||
|
if (mAlphaAnimator.isRunning()) {
|
||||||
|
mAlphaAnimator.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
mTransactionFactory.getTransaction()
|
||||||
|
.reparent(mBackgroundSurface, mParentLeash)
|
||||||
|
.setAlpha(mBackgroundSurface, 1.0f)
|
||||||
|
.setLayer(mBackgroundSurface, -1 /* at bottom-most layer */)
|
||||||
|
.setColor(mBackgroundSurface, mThemeColor)
|
||||||
|
.show(mBackgroundSurface)
|
||||||
|
.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
void removeBackgroundPanelLayer() {
|
void removeBackgroundPanelLayer() {
|
||||||
synchronized (mLock) {
|
if (mBackgroundSurface == null) {
|
||||||
if (mBackgroundSurface == null) {
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SurfaceControl.Transaction transaction =
|
|
||||||
mSurfaceControlTransactionFactory.getTransaction();
|
|
||||||
transaction.remove(mBackgroundSurface).apply();
|
|
||||||
transaction.close();
|
|
||||||
mBackgroundSurface = null;
|
|
||||||
mIsShowing = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mTransactionFactory.getTransaction()
|
||||||
|
.remove(mBackgroundSurface)
|
||||||
|
.apply();
|
||||||
|
mBackgroundSurface = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* onConfigurationChanged events for updating tutorial text.
|
* onConfigurationChanged events for updating tutorial text.
|
||||||
*/
|
*/
|
||||||
public void onConfigurationChanged() {
|
public void onConfigurationChanged() {
|
||||||
synchronized (mLock) {
|
updateThemeColors();
|
||||||
if (mBackgroundSurface == null) {
|
showBackgroundPanelLayer();
|
||||||
getBackgroundSurface();
|
|
||||||
} else {
|
|
||||||
removeBackgroundPanelLayer();
|
|
||||||
}
|
|
||||||
updateThemeColors();
|
|
||||||
showBackgroundPanelLayer();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateThemeColors() {
|
private void updateThemeColors() {
|
||||||
synchronized (mLock) {
|
final Context themedContext = new ContextThemeWrapper(mContext,
|
||||||
final int themeColor = mContext.getColor(R.color.one_handed_tutorial_background_color);
|
com.android.internal.R.style.Theme_DeviceDefault_DayNight);
|
||||||
mDefaultColor = new float[]{(Color.red(themeColor) - THEME_COLOR_OFFSET) / 255.0f,
|
final int themeColor = themedContext.getColor(
|
||||||
(Color.green(themeColor) - THEME_COLOR_OFFSET) / 255.0f,
|
R.color.one_handed_tutorial_background_color);
|
||||||
(Color.blue(themeColor) - THEME_COLOR_OFFSET) / 255.0f};
|
mThemeColor = new float[]{
|
||||||
}
|
adjustColor(Color.red(themeColor)),
|
||||||
|
adjustColor(Color.green(themeColor)),
|
||||||
|
adjustColor(Color.blue(themeColor))};
|
||||||
|
}
|
||||||
|
|
||||||
|
private float adjustColor(int origColor) {
|
||||||
|
return Math.max(origColor - THEME_COLOR_OFFSET, 0) / 255.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump(@NonNull PrintWriter pw) {
|
void dump(@NonNull PrintWriter pw) {
|
||||||
final String innerPrefix = " ";
|
final String innerPrefix = " ";
|
||||||
pw.println(TAG);
|
pw.println(TAG);
|
||||||
pw.print(innerPrefix + "mIsShowing=");
|
pw.print(innerPrefix + "mBackgroundSurface=");
|
||||||
pw.println(mIsShowing);
|
pw.println(mBackgroundSurface);
|
||||||
pw.print(innerPrefix + "mBkgBounds=");
|
pw.print(innerPrefix + "mBkgBounds=");
|
||||||
pw.println(mBkgBounds);
|
pw.println(mBkgBounds);
|
||||||
pw.print(innerPrefix + "mDefaultColor=");
|
pw.print(innerPrefix + "mThemeColor=");
|
||||||
pw.println(mDefaultColor);
|
pw.println(mThemeColor);
|
||||||
|
pw.print(innerPrefix + "mTranslationFraction=");
|
||||||
|
pw.println(mTranslationFraction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -180,6 +180,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
|
|||||||
public void onStopFinished(Rect bounds) {
|
public void onStopFinished(Rect bounds) {
|
||||||
mState.setState(STATE_NONE);
|
mState.setState(STATE_NONE);
|
||||||
notifyShortcutStateChanged(STATE_NONE);
|
notifyShortcutStateChanged(STATE_NONE);
|
||||||
|
mBackgroundPanelOrganizer.onStopFinished();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -223,13 +224,14 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
|
|||||||
OneHandedTimeoutHandler timeoutHandler = new OneHandedTimeoutHandler(mainExecutor);
|
OneHandedTimeoutHandler timeoutHandler = new OneHandedTimeoutHandler(mainExecutor);
|
||||||
OneHandedState transitionState = new OneHandedState();
|
OneHandedState transitionState = new OneHandedState();
|
||||||
OneHandedTutorialHandler tutorialHandler = new OneHandedTutorialHandler(context,
|
OneHandedTutorialHandler tutorialHandler = new OneHandedTutorialHandler(context,
|
||||||
windowManager);
|
settingsUtil, windowManager);
|
||||||
OneHandedAnimationController animationController =
|
OneHandedAnimationController animationController =
|
||||||
new OneHandedAnimationController(context);
|
new OneHandedAnimationController(context);
|
||||||
OneHandedTouchHandler touchHandler = new OneHandedTouchHandler(timeoutHandler,
|
OneHandedTouchHandler touchHandler = new OneHandedTouchHandler(timeoutHandler,
|
||||||
mainExecutor);
|
mainExecutor);
|
||||||
OneHandedBackgroundPanelOrganizer oneHandedBackgroundPanelOrganizer =
|
OneHandedBackgroundPanelOrganizer oneHandedBackgroundPanelOrganizer =
|
||||||
new OneHandedBackgroundPanelOrganizer(context, displayLayout, mainExecutor);
|
new OneHandedBackgroundPanelOrganizer(context, displayLayout, settingsUtil,
|
||||||
|
mainExecutor);
|
||||||
OneHandedDisplayAreaOrganizer organizer = new OneHandedDisplayAreaOrganizer(
|
OneHandedDisplayAreaOrganizer organizer = new OneHandedDisplayAreaOrganizer(
|
||||||
context, displayLayout, settingsUtil, animationController, tutorialHandler,
|
context, displayLayout, settingsUtil, animationController, tutorialHandler,
|
||||||
oneHandedBackgroundPanelOrganizer, mainExecutor);
|
oneHandedBackgroundPanelOrganizer, mainExecutor);
|
||||||
@@ -386,6 +388,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
|
|||||||
mDisplayAreaOrganizer.getDisplayLayout().height() * mOffSetFraction);
|
mDisplayAreaOrganizer.getDisplayLayout().height() * mOffSetFraction);
|
||||||
mOneHandedAccessibilityUtil.announcementForScreenReader(
|
mOneHandedAccessibilityUtil.announcementForScreenReader(
|
||||||
mOneHandedAccessibilityUtil.getOneHandedStartDescription());
|
mOneHandedAccessibilityUtil.getOneHandedStartDescription());
|
||||||
|
mBackgroundPanelOrganizer.onStart();
|
||||||
mDisplayAreaOrganizer.scheduleOffset(0, yOffSet);
|
mDisplayAreaOrganizer.scheduleOffset(0, yOffSet);
|
||||||
mTimeoutHandler.resetTimer();
|
mTimeoutHandler.resetTimer();
|
||||||
mOneHandedUiEventLogger.writeEvent(
|
mOneHandedUiEventLogger.writeEvent(
|
||||||
@@ -423,7 +426,6 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
|
|||||||
stopOneHanded(OneHandedUiEventLogger.EVENT_ONE_HANDED_TRIGGER_OVERSPACE_OUT));
|
stopOneHanded(OneHandedUiEventLogger.EVENT_ONE_HANDED_TRIGGER_OVERSPACE_OUT));
|
||||||
mDisplayAreaOrganizer.registerTransitionCallback(mTouchHandler);
|
mDisplayAreaOrganizer.registerTransitionCallback(mTouchHandler);
|
||||||
mDisplayAreaOrganizer.registerTransitionCallback(mTutorialHandler);
|
mDisplayAreaOrganizer.registerTransitionCallback(mTutorialHandler);
|
||||||
mDisplayAreaOrganizer.registerTransitionCallback(mBackgroundPanelOrganizer);
|
|
||||||
mDisplayAreaOrganizer.registerTransitionCallback(mTransitionCallBack);
|
mDisplayAreaOrganizer.registerTransitionCallback(mTransitionCallBack);
|
||||||
if (mTaskChangeToExit) {
|
if (mTaskChangeToExit) {
|
||||||
mTaskStackListener.addListener(mTaskStackListenerCallback);
|
mTaskStackListener.addListener(mTaskStackListenerCallback);
|
||||||
@@ -469,6 +471,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
|
|||||||
final DisplayLayout newDisplayLayout = mDisplayController.getDisplayLayout(displayId);
|
final DisplayLayout newDisplayLayout = mDisplayController.getDisplayLayout(displayId);
|
||||||
mDisplayAreaOrganizer.setDisplayLayout(newDisplayLayout);
|
mDisplayAreaOrganizer.setDisplayLayout(newDisplayLayout);
|
||||||
mTutorialHandler.onDisplayChanged(newDisplayLayout);
|
mTutorialHandler.onDisplayChanged(newDisplayLayout);
|
||||||
|
mBackgroundPanelOrganizer.onDisplayChanged(newDisplayLayout);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ContentObserver getObserver(Runnable onChangeRunnable) {
|
private ContentObserver getObserver(Runnable onChangeRunnable) {
|
||||||
@@ -606,7 +609,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
|
|||||||
OneHandedDisplayAreaOrganizer.FEATURE_ONE_HANDED);
|
OneHandedDisplayAreaOrganizer.FEATURE_ONE_HANDED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mBackgroundPanelOrganizer.getBackgroundSurface() == null) {
|
if (!mBackgroundPanelOrganizer.isRegistered()) {
|
||||||
mBackgroundPanelOrganizer.registerOrganizer(
|
mBackgroundPanelOrganizer.registerOrganizer(
|
||||||
OneHandedBackgroundPanelOrganizer.FEATURE_ONE_HANDED_BACKGROUND_PANEL);
|
OneHandedBackgroundPanelOrganizer.FEATURE_ONE_HANDED_BACKGROUND_PANEL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,8 +135,8 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
|
|||||||
SystemProperties.getInt(ONE_HANDED_MODE_TRANSLATE_ANIMATION_DURATION,
|
SystemProperties.getInt(ONE_HANDED_MODE_TRANSLATE_ANIMATION_DURATION,
|
||||||
animationDurationConfig);
|
animationDurationConfig);
|
||||||
mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
|
mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
|
||||||
mTutorialHandler = tutorialHandler;
|
|
||||||
mBackgroundPanelOrganizer = oneHandedBackgroundGradientOrganizer;
|
mBackgroundPanelOrganizer = oneHandedBackgroundGradientOrganizer;
|
||||||
|
mTutorialHandler = tutorialHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -249,9 +249,8 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
|
|||||||
if (animator != null) {
|
if (animator != null) {
|
||||||
animator.setTransitionDirection(direction)
|
animator.setTransitionDirection(direction)
|
||||||
.addOneHandedAnimationCallback(mOneHandedAnimationCallback)
|
.addOneHandedAnimationCallback(mOneHandedAnimationCallback)
|
||||||
.addOneHandedAnimationCallback(mTutorialHandler.getAnimationCallback())
|
.addOneHandedAnimationCallback(mTutorialHandler)
|
||||||
.addOneHandedAnimationCallback(
|
.addOneHandedAnimationCallback(mBackgroundPanelOrganizer)
|
||||||
mBackgroundPanelOrganizer.getOneHandedAnimationCallback())
|
|
||||||
.setDuration(durationMs)
|
.setDuration(durationMs)
|
||||||
.start();
|
.start();
|
||||||
}
|
}
|
||||||
@@ -267,7 +266,6 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
|
|||||||
mLastVisualDisplayBounds.offsetTo(0, Math.round(mLastVisualOffset));
|
mLastVisualDisplayBounds.offsetTo(0, Math.round(mLastVisualOffset));
|
||||||
for (int i = mTransitionCallbacks.size() - 1; i >= 0; i--) {
|
for (int i = mTransitionCallbacks.size() - 1; i >= 0; i--) {
|
||||||
final OneHandedTransitionCallback cb = mTransitionCallbacks.get(i);
|
final OneHandedTransitionCallback cb = mTransitionCallbacks.get(i);
|
||||||
cb.onStartTransition(false /* isTransitioning */);
|
|
||||||
if (direction == TRANSITION_DIRECTION_TRIGGER) {
|
if (direction == TRANSITION_DIRECTION_TRIGGER) {
|
||||||
cb.onStartFinished(getLastVisualDisplayBounds());
|
cb.onStartFinished(getLastVisualDisplayBounds());
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import static com.android.internal.accessibility.AccessibilityShortcutController
|
|||||||
|
|
||||||
import android.annotation.IntDef;
|
import android.annotation.IntDef;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
|
import android.content.Context;
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
@@ -27,6 +28,8 @@ import android.text.TextUtils;
|
|||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.android.wm.shell.R;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
@@ -36,7 +39,6 @@ import java.lang.annotation.RetentionPolicy;
|
|||||||
*/
|
*/
|
||||||
public final class OneHandedSettingsUtil {
|
public final class OneHandedSettingsUtil {
|
||||||
private static final String TAG = "OneHandedSettingsUtil";
|
private static final String TAG = "OneHandedSettingsUtil";
|
||||||
|
|
||||||
private static final String ONE_HANDED_MODE_TARGET_NAME =
|
private static final String ONE_HANDED_MODE_TARGET_NAME =
|
||||||
ONE_HANDED_COMPONENT_NAME.getShortClassName();
|
ONE_HANDED_COMPONENT_NAME.getShortClassName();
|
||||||
|
|
||||||
@@ -217,6 +219,25 @@ public final class OneHandedSettingsUtil {
|
|||||||
Settings.Secure.ONE_HANDED_MODE_ACTIVATED, state, userId);
|
Settings.Secure.ONE_HANDED_MODE_ACTIVATED, state, userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains one-handed mode transition duration from resource config.
|
||||||
|
*
|
||||||
|
* @return durationMs The duration in milli-seconds
|
||||||
|
*/
|
||||||
|
public int getTransitionDuration(Context context) {
|
||||||
|
return context.getResources().getInteger(
|
||||||
|
R.integer.config_one_handed_translate_animation_duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains one-handed mode offset fraction from resource config.
|
||||||
|
*
|
||||||
|
* @return fraction The fraction of offset of the whole screen.
|
||||||
|
*/
|
||||||
|
public float getTranslationFraction(Context context) {
|
||||||
|
return context.getResources().getFraction(R.fraction.config_one_handed_offset, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
void dump(PrintWriter pw, String prefix, ContentResolver resolver,
|
void dump(PrintWriter pw, String prefix, ContentResolver resolver,
|
||||||
int userId) {
|
int userId) {
|
||||||
final String innerPrefix = " ";
|
final String innerPrefix = " ";
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ import android.content.res.ColorStateList;
|
|||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.graphics.PixelFormat;
|
import android.graphics.PixelFormat;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.SystemProperties;
|
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.SurfaceControl;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
@@ -58,66 +58,54 @@ import java.io.PrintWriter;
|
|||||||
* detach TargetViewContainer from window after exiting one handed mode.
|
* detach TargetViewContainer from window after exiting one handed mode.
|
||||||
*/
|
*/
|
||||||
public class OneHandedTutorialHandler implements OneHandedTransitionCallback,
|
public class OneHandedTutorialHandler implements OneHandedTransitionCallback,
|
||||||
OneHandedState.OnStateChangedListener {
|
OneHandedState.OnStateChangedListener, OneHandedAnimationCallback {
|
||||||
private static final String TAG = "OneHandedTutorialHandler";
|
private static final String TAG = "OneHandedTutorialHandler";
|
||||||
private static final String OFFSET_PERCENTAGE = "persist.debug.one_handed_offset_percentage";
|
private static final float START_TRANSITION_FRACTION = 0.6f;
|
||||||
private static final String TRANSLATE_ANIMATION_DURATION =
|
|
||||||
"persist.debug.one_handed_translate_animation_duration";
|
|
||||||
private static final float START_TRANSITION_FRACTION = 0.7f;
|
|
||||||
|
|
||||||
private final float mTutorialHeightRatio;
|
private final float mTutorialHeightRatio;
|
||||||
private final WindowManager mWindowManager;
|
private final WindowManager mWindowManager;
|
||||||
private final OneHandedAnimationCallback mAnimationCallback;
|
|
||||||
|
|
||||||
private @OneHandedState.State int mCurrentState;
|
private @OneHandedState.State int mCurrentState;
|
||||||
private int mTutorialAreaHeight;
|
private int mTutorialAreaHeight;
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private Rect mDisplayBounds;
|
private Rect mDisplayBounds;
|
||||||
|
private ValueAnimator mAlphaAnimator;
|
||||||
private @Nullable View mTutorialView;
|
private @Nullable View mTutorialView;
|
||||||
private @Nullable ViewGroup mTargetViewContainer;
|
private @Nullable ViewGroup mTargetViewContainer;
|
||||||
|
|
||||||
private float mAlphaTransitionStart;
|
private float mAlphaTransitionStart;
|
||||||
private ValueAnimator mAlphaAnimator;
|
|
||||||
private int mAlphaAnimationDurationMs;
|
private int mAlphaAnimationDurationMs;
|
||||||
|
|
||||||
public OneHandedTutorialHandler(Context context, WindowManager windowManager) {
|
public OneHandedTutorialHandler(Context context, OneHandedSettingsUtil settingsUtil,
|
||||||
|
WindowManager windowManager) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mWindowManager = windowManager;
|
mWindowManager = windowManager;
|
||||||
final float offsetPercentageConfig = context.getResources().getFraction(
|
mTutorialHeightRatio = settingsUtil.getTranslationFraction(context);
|
||||||
R.fraction.config_one_handed_offset, 1, 1);
|
mAlphaAnimationDurationMs = settingsUtil.getTransitionDuration(context);
|
||||||
final int sysPropPercentageConfig = SystemProperties.getInt(
|
}
|
||||||
OFFSET_PERCENTAGE, Math.round(offsetPercentageConfig * 100.0f));
|
|
||||||
mTutorialHeightRatio = sysPropPercentageConfig / 100.0f;
|
|
||||||
final int animationDuration = context.getResources().getInteger(
|
|
||||||
R.integer.config_one_handed_translate_animation_duration);
|
|
||||||
mAlphaAnimationDurationMs = SystemProperties.getInt(TRANSLATE_ANIMATION_DURATION,
|
|
||||||
animationDuration);
|
|
||||||
mAnimationCallback = new OneHandedAnimationCallback() {
|
|
||||||
@Override
|
|
||||||
public void onOneHandedAnimationCancel(
|
|
||||||
OneHandedAnimationController.OneHandedTransitionAnimator animator) {
|
|
||||||
if (mAlphaAnimator != null) {
|
|
||||||
mAlphaAnimator.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationUpdate(float xPos, float yPos) {
|
public void onOneHandedAnimationCancel(
|
||||||
if (!isAttached()) {
|
OneHandedAnimationController.OneHandedTransitionAnimator animator) {
|
||||||
return;
|
if (mAlphaAnimator != null) {
|
||||||
}
|
mAlphaAnimator.cancel();
|
||||||
if (yPos < mAlphaTransitionStart) {
|
}
|
||||||
checkTransitionEnd();
|
}
|
||||||
return;
|
|
||||||
}
|
@Override
|
||||||
if (mAlphaAnimator == null || mAlphaAnimator.isStarted()
|
public void onAnimationUpdate(SurfaceControl.Transaction tx, float xPos, float yPos) {
|
||||||
|| mAlphaAnimator.isRunning()) {
|
if (!isAttached()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mAlphaAnimator.start();
|
if (yPos < mAlphaTransitionStart) {
|
||||||
}
|
checkTransitionEnd();
|
||||||
};
|
return;
|
||||||
|
}
|
||||||
|
if (mAlphaAnimator == null || mAlphaAnimator.isStarted() || mAlphaAnimator.isRunning()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mAlphaAnimator.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -145,6 +133,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when onDisplayAdded() or onDisplayRemoved() callback.
|
* Called when onDisplayAdded() or onDisplayRemoved() callback.
|
||||||
|
*
|
||||||
* @param displayLayout The latest {@link DisplayLayout} representing current displayId
|
* @param displayLayout The latest {@link DisplayLayout} representing current displayId
|
||||||
*/
|
*/
|
||||||
public void onDisplayChanged(DisplayLayout displayLayout) {
|
public void onDisplayChanged(DisplayLayout displayLayout) {
|
||||||
@@ -196,10 +185,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback,
|
|||||||
mTargetViewContainer = null;
|
mTargetViewContainer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable OneHandedAnimationCallback getAnimationCallback() {
|
|
||||||
return mAnimationCallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns layout params for the dismiss target, using the latest display metrics.
|
* Returns layout params for the dismiss target, using the latest display metrics.
|
||||||
*/
|
*/
|
||||||
@@ -264,15 +249,17 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback,
|
|||||||
private void setupAlphaTransition(boolean isEntering) {
|
private void setupAlphaTransition(boolean isEntering) {
|
||||||
final float start = isEntering ? 0.0f : 1.0f;
|
final float start = isEntering ? 0.0f : 1.0f;
|
||||||
final float end = isEntering ? 1.0f : 0.0f;
|
final float end = isEntering ? 1.0f : 0.0f;
|
||||||
|
final int duration = isEntering ? mAlphaAnimationDurationMs : Math.round(
|
||||||
|
mAlphaAnimationDurationMs * (1.0f - mTutorialHeightRatio));
|
||||||
mAlphaAnimator = ValueAnimator.ofFloat(start, end);
|
mAlphaAnimator = ValueAnimator.ofFloat(start, end);
|
||||||
mAlphaAnimator.setInterpolator(new LinearInterpolator());
|
mAlphaAnimator.setInterpolator(new LinearInterpolator());
|
||||||
mAlphaAnimator.setDuration(mAlphaAnimationDurationMs);
|
mAlphaAnimator.setDuration(duration);
|
||||||
mAlphaAnimator.addUpdateListener(
|
mAlphaAnimator.addUpdateListener(
|
||||||
animator -> mTargetViewContainer.setAlpha((float) animator.getAnimatedValue()));
|
animator -> mTargetViewContainer.setAlpha((float) animator.getAnimatedValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkTransitionEnd() {
|
private void checkTransitionEnd() {
|
||||||
if (mAlphaAnimator != null && mAlphaAnimator.isRunning()) {
|
if (mAlphaAnimator != null && (mAlphaAnimator.isRunning() || mAlphaAnimator.isStarted())) {
|
||||||
mAlphaAnimator.end();
|
mAlphaAnimator.end();
|
||||||
mAlphaAnimator.removeAllUpdateListeners();
|
mAlphaAnimator.removeAllUpdateListeners();
|
||||||
mAlphaAnimator = null;
|
mAlphaAnimator = null;
|
||||||
|
|||||||
@@ -22,7 +22,10 @@ import static android.window.DisplayAreaOrganizer.FEATURE_ONE_HANDED_BACKGROUND_
|
|||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.reset;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
@@ -54,17 +57,17 @@ public class OneHandedBackgroundPanelOrganizerTest extends OneHandedTestCase {
|
|||||||
private OneHandedBackgroundPanelOrganizer mSpiedBackgroundPanelOrganizer;
|
private OneHandedBackgroundPanelOrganizer mSpiedBackgroundPanelOrganizer;
|
||||||
private WindowContainerToken mToken;
|
private WindowContainerToken mToken;
|
||||||
private SurfaceControl mLeash;
|
private SurfaceControl mLeash;
|
||||||
private TestableLooper mTestableLooper;
|
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
IWindowContainerToken mMockRealToken;
|
IWindowContainerToken mMockRealToken;
|
||||||
@Mock
|
@Mock
|
||||||
DisplayController mMockDisplayController;
|
DisplayController mMockDisplayController;
|
||||||
|
@Mock
|
||||||
|
OneHandedSettingsUtil mMockSettingsUtil;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
mTestableLooper = TestableLooper.get(this);
|
|
||||||
mToken = new WindowContainerToken(mMockRealToken);
|
mToken = new WindowContainerToken(mMockRealToken);
|
||||||
mLeash = new SurfaceControl();
|
mLeash = new SurfaceControl();
|
||||||
mDisplay = mContext.getDisplay();
|
mDisplay = mContext.getDisplay();
|
||||||
@@ -74,32 +77,36 @@ public class OneHandedBackgroundPanelOrganizerTest extends OneHandedTestCase {
|
|||||||
FEATURE_ONE_HANDED_BACKGROUND_PANEL);
|
FEATURE_ONE_HANDED_BACKGROUND_PANEL);
|
||||||
|
|
||||||
mSpiedBackgroundPanelOrganizer = spy(
|
mSpiedBackgroundPanelOrganizer = spy(
|
||||||
new OneHandedBackgroundPanelOrganizer(mContext, mDisplayLayout, Runnable::run));
|
new OneHandedBackgroundPanelOrganizer(mContext, mDisplayLayout, mMockSettingsUtil,
|
||||||
|
Runnable::run));
|
||||||
|
mSpiedBackgroundPanelOrganizer.onDisplayChanged(mDisplayLayout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOnDisplayAreaAppeared() {
|
public void testOnDisplayAreaAppeared() {
|
||||||
mSpiedBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash);
|
mSpiedBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash);
|
||||||
mTestableLooper.processAllMessages();
|
|
||||||
|
|
||||||
assertThat(mSpiedBackgroundPanelOrganizer.getBackgroundSurface()).isNotNull();
|
assertThat(mSpiedBackgroundPanelOrganizer.isRegistered()).isTrue();
|
||||||
|
verify(mSpiedBackgroundPanelOrganizer, never()).showBackgroundPanelLayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testShowBackgroundLayer() {
|
public void testShowBackgroundLayer() {
|
||||||
mSpiedBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash);
|
mSpiedBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, null);
|
||||||
mSpiedBackgroundPanelOrganizer.showBackgroundPanelLayer();
|
mSpiedBackgroundPanelOrganizer.onStart();
|
||||||
mTestableLooper.processAllMessages();
|
|
||||||
|
|
||||||
assertThat(mSpiedBackgroundPanelOrganizer.mIsShowing).isTrue();
|
verify(mSpiedBackgroundPanelOrganizer).showBackgroundPanelLayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRemoveBackgroundLayer() {
|
public void testRemoveBackgroundLayer() {
|
||||||
mSpiedBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash);
|
mSpiedBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash);
|
||||||
mSpiedBackgroundPanelOrganizer.removeBackgroundPanelLayer();
|
|
||||||
mTestableLooper.processAllMessages();
|
|
||||||
|
|
||||||
assertThat(mSpiedBackgroundPanelOrganizer.mIsShowing).isFalse();
|
assertThat(mSpiedBackgroundPanelOrganizer.isRegistered()).isNotNull();
|
||||||
|
|
||||||
|
reset(mSpiedBackgroundPanelOrganizer);
|
||||||
|
mSpiedBackgroundPanelOrganizer.removeBackgroundPanelLayer();
|
||||||
|
|
||||||
|
assertThat(mSpiedBackgroundPanelOrganizer.mBackgroundSurface).isNull();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
|||||||
when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
|
when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
|
||||||
when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
|
when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
|
||||||
when(mMockDisplayAreaOrganizer.isReady()).thenReturn(true);
|
when(mMockDisplayAreaOrganizer.isReady()).thenReturn(true);
|
||||||
when(mMockBackgroundOrganizer.getBackgroundSurface()).thenReturn(mMockLeash);
|
when(mMockBackgroundOrganizer.isRegistered()).thenReturn(true);
|
||||||
when(mMockSettingsUitl.getSettingsOneHandedModeEnabled(any(), anyInt())).thenReturn(
|
when(mMockSettingsUitl.getSettingsOneHandedModeEnabled(any(), anyInt())).thenReturn(
|
||||||
mDefaultEnabled);
|
mDefaultEnabled);
|
||||||
when(mMockSettingsUitl.getSettingsOneHandedModeTimeout(any(), anyInt())).thenReturn(
|
when(mMockSettingsUitl.getSettingsOneHandedModeTimeout(any(), anyInt())).thenReturn(
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public class OneHandedStateTest extends OneHandedTestCase {
|
|||||||
|
|
||||||
when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
|
when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
|
||||||
when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
|
when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
|
||||||
when(mMockBackgroundOrganizer.getBackgroundSurface()).thenReturn(mMockLeash);
|
when(mMockBackgroundOrganizer.isRegistered()).thenReturn(true);
|
||||||
when(mMockSettingsUitl.getSettingsOneHandedModeEnabled(any(), anyInt())).thenReturn(
|
when(mMockSettingsUitl.getSettingsOneHandedModeEnabled(any(), anyInt())).thenReturn(
|
||||||
mDefaultEnabled);
|
mDefaultEnabled);
|
||||||
when(mMockSettingsUitl.getSettingsOneHandedModeTimeout(any(), anyInt())).thenReturn(
|
when(mMockSettingsUitl.getSettingsOneHandedModeTimeout(any(), anyInt())).thenReturn(
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase {
|
|||||||
mDisplayLayout = new DisplayLayout(mContext, mDisplay);
|
mDisplayLayout = new DisplayLayout(mContext, mDisplay);
|
||||||
mSpiedTransitionState = spy(new OneHandedState());
|
mSpiedTransitionState = spy(new OneHandedState());
|
||||||
mSpiedTutorialHandler = spy(
|
mSpiedTutorialHandler = spy(
|
||||||
new OneHandedTutorialHandler(mContext, mMockWindowManager));
|
new OneHandedTutorialHandler(mContext, mMockSettingsUtil, mMockWindowManager));
|
||||||
mTimeoutHandler = new OneHandedTimeoutHandler(mMockShellMainExecutor);
|
mTimeoutHandler = new OneHandedTimeoutHandler(mMockShellMainExecutor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user