Merge "Refactor to use WindowManager#getCurrentWindowMetrics() instead of using Display#getRealSize()" into sc-dev
This commit is contained in:
@@ -16,17 +16,14 @@
|
|||||||
|
|
||||||
package com.android.wm.shell.onehanded;
|
package com.android.wm.shell.onehanded;
|
||||||
|
|
||||||
import static android.view.Display.DEFAULT_DISPLAY;
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.graphics.PixelFormat;
|
import android.graphics.PixelFormat;
|
||||||
import android.graphics.Point;
|
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Handler;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
import android.view.SurfaceSession;
|
import android.view.SurfaceSession;
|
||||||
|
import android.view.WindowManager;
|
||||||
import android.window.DisplayAreaAppearedInfo;
|
import android.window.DisplayAreaAppearedInfo;
|
||||||
import android.window.DisplayAreaInfo;
|
import android.window.DisplayAreaInfo;
|
||||||
import android.window.DisplayAreaOrganizer;
|
import android.window.DisplayAreaOrganizer;
|
||||||
@@ -57,7 +54,7 @@ public class OneHandedBackgroundPanelOrganizer extends DisplayAreaOrganizer
|
|||||||
private final float mAlpha;
|
private final float mAlpha;
|
||||||
private final Rect mRect;
|
private final Rect mRect;
|
||||||
private final Executor mMainExecutor;
|
private final Executor mMainExecutor;
|
||||||
private final Point mDisplaySize = new Point();
|
private final Rect mDisplaySize;
|
||||||
private final OneHandedSurfaceTransactionHelper.SurfaceControlTransactionFactory
|
private final OneHandedSurfaceTransactionHelper.SurfaceControlTransactionFactory
|
||||||
mSurfaceControlTransactionFactory;
|
mSurfaceControlTransactionFactory;
|
||||||
|
|
||||||
@@ -85,15 +82,15 @@ public class OneHandedBackgroundPanelOrganizer extends DisplayAreaOrganizer
|
|||||||
mMainExecutor.execute(() -> removeBackgroundPanelLayer());
|
mMainExecutor.execute(() -> removeBackgroundPanelLayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
public OneHandedBackgroundPanelOrganizer(Context context, DisplayController displayController,
|
public OneHandedBackgroundPanelOrganizer(Context context, WindowManager windowManager,
|
||||||
Executor executor) {
|
DisplayController displayController, Executor executor) {
|
||||||
super(executor);
|
super(executor);
|
||||||
displayController.getDisplay(DEFAULT_DISPLAY).getRealSize(mDisplaySize);
|
mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();
|
||||||
final Resources res = context.getResources();
|
final Resources res = context.getResources();
|
||||||
final float defaultRGB = res.getFloat(R.dimen.config_one_handed_background_rgb);
|
final float defaultRGB = res.getFloat(R.dimen.config_one_handed_background_rgb);
|
||||||
mColor = new float[]{defaultRGB, defaultRGB, defaultRGB};
|
mColor = new float[]{defaultRGB, defaultRGB, defaultRGB};
|
||||||
mAlpha = res.getFloat(R.dimen.config_one_handed_background_alpha);
|
mAlpha = res.getFloat(R.dimen.config_one_handed_background_alpha);
|
||||||
mRect = new Rect(0, 0, mDisplaySize.x, mDisplaySize.y);
|
mRect = new Rect(0, 0, mDisplaySize.width(), mDisplaySize.height());
|
||||||
mMainExecutor = executor;
|
mMainExecutor = executor;
|
||||||
mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
|
mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
package com.android.wm.shell.onehanded;
|
package com.android.wm.shell.onehanded;
|
||||||
|
|
||||||
import static android.os.UserHandle.USER_CURRENT;
|
import static android.os.UserHandle.USER_CURRENT;
|
||||||
import static android.view.Display.DEFAULT_DISPLAY;
|
|
||||||
|
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -25,7 +24,7 @@ import android.content.om.IOverlayManager;
|
|||||||
import android.content.om.OverlayInfo;
|
import android.content.om.OverlayInfo;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.graphics.Point;
|
import android.graphics.Rect;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
@@ -33,6 +32,7 @@ import android.os.SystemProperties;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
import android.view.ViewConfiguration;
|
import android.view.ViewConfiguration;
|
||||||
|
import android.view.WindowManager;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@@ -82,6 +82,7 @@ public class OneHandedController {
|
|||||||
private final ShellExecutor mMainExecutor;
|
private final ShellExecutor mMainExecutor;
|
||||||
private final Handler mMainHandler;
|
private final Handler mMainHandler;
|
||||||
private final OneHandedImpl mImpl = new OneHandedImpl();
|
private final OneHandedImpl mImpl = new OneHandedImpl();
|
||||||
|
private final WindowManager mWindowManager;
|
||||||
|
|
||||||
private OneHandedDisplayAreaOrganizer mDisplayAreaOrganizer;
|
private OneHandedDisplayAreaOrganizer mDisplayAreaOrganizer;
|
||||||
private final AccessibilityManager mAccessibilityManager;
|
private final AccessibilityManager mAccessibilityManager;
|
||||||
@@ -141,7 +142,7 @@ public class OneHandedController {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public static OneHandedController create(
|
public static OneHandedController create(
|
||||||
Context context, DisplayController displayController,
|
Context context, WindowManager windowManager, DisplayController displayController,
|
||||||
TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger,
|
TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger,
|
||||||
ShellExecutor mainExecutor, Handler mainHandler) {
|
ShellExecutor mainExecutor, Handler mainHandler) {
|
||||||
if (!SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false)) {
|
if (!SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false)) {
|
||||||
@@ -151,22 +152,24 @@ public class OneHandedController {
|
|||||||
|
|
||||||
OneHandedTimeoutHandler timeoutHandler = new OneHandedTimeoutHandler(mainExecutor);
|
OneHandedTimeoutHandler timeoutHandler = new OneHandedTimeoutHandler(mainExecutor);
|
||||||
OneHandedTutorialHandler tutorialHandler = new OneHandedTutorialHandler(context,
|
OneHandedTutorialHandler tutorialHandler = new OneHandedTutorialHandler(context,
|
||||||
mainExecutor);
|
windowManager, mainExecutor);
|
||||||
OneHandedAnimationController animationController =
|
OneHandedAnimationController animationController =
|
||||||
new OneHandedAnimationController(context);
|
new OneHandedAnimationController(context);
|
||||||
OneHandedTouchHandler touchHandler = new OneHandedTouchHandler(timeoutHandler,
|
OneHandedTouchHandler touchHandler = new OneHandedTouchHandler(timeoutHandler,
|
||||||
mainExecutor);
|
mainExecutor);
|
||||||
OneHandedGestureHandler gestureHandler = new OneHandedGestureHandler(
|
OneHandedGestureHandler gestureHandler = new OneHandedGestureHandler(
|
||||||
context, displayController, ViewConfiguration.get(context), mainExecutor);
|
context, windowManager, displayController, ViewConfiguration.get(context),
|
||||||
|
mainExecutor);
|
||||||
OneHandedBackgroundPanelOrganizer oneHandedBackgroundPanelOrganizer =
|
OneHandedBackgroundPanelOrganizer oneHandedBackgroundPanelOrganizer =
|
||||||
new OneHandedBackgroundPanelOrganizer(context, displayController, mainExecutor);
|
new OneHandedBackgroundPanelOrganizer(context, windowManager, displayController,
|
||||||
|
mainExecutor);
|
||||||
OneHandedDisplayAreaOrganizer organizer = new OneHandedDisplayAreaOrganizer(
|
OneHandedDisplayAreaOrganizer organizer = new OneHandedDisplayAreaOrganizer(
|
||||||
context, displayController, animationController, tutorialHandler,
|
context, windowManager, displayController, animationController, tutorialHandler,
|
||||||
oneHandedBackgroundPanelOrganizer, mainExecutor);
|
oneHandedBackgroundPanelOrganizer, mainExecutor);
|
||||||
OneHandedUiEventLogger oneHandedUiEventsLogger = new OneHandedUiEventLogger(uiEventLogger);
|
OneHandedUiEventLogger oneHandedUiEventsLogger = new OneHandedUiEventLogger(uiEventLogger);
|
||||||
IOverlayManager overlayManager = IOverlayManager.Stub.asInterface(
|
IOverlayManager overlayManager = IOverlayManager.Stub.asInterface(
|
||||||
ServiceManager.getService(Context.OVERLAY_SERVICE));
|
ServiceManager.getService(Context.OVERLAY_SERVICE));
|
||||||
return new OneHandedController(context, displayController,
|
return new OneHandedController(context, windowManager, displayController,
|
||||||
oneHandedBackgroundPanelOrganizer, organizer, touchHandler, tutorialHandler,
|
oneHandedBackgroundPanelOrganizer, organizer, touchHandler, tutorialHandler,
|
||||||
gestureHandler, timeoutHandler, oneHandedUiEventsLogger, overlayManager,
|
gestureHandler, timeoutHandler, oneHandedUiEventsLogger, overlayManager,
|
||||||
taskStackListener, mainExecutor, mainHandler);
|
taskStackListener, mainExecutor, mainHandler);
|
||||||
@@ -174,6 +177,7 @@ public class OneHandedController {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
OneHandedController(Context context,
|
OneHandedController(Context context,
|
||||||
|
WindowManager windowManager,
|
||||||
DisplayController displayController,
|
DisplayController displayController,
|
||||||
OneHandedBackgroundPanelOrganizer backgroundPanelOrganizer,
|
OneHandedBackgroundPanelOrganizer backgroundPanelOrganizer,
|
||||||
OneHandedDisplayAreaOrganizer displayAreaOrganizer,
|
OneHandedDisplayAreaOrganizer displayAreaOrganizer,
|
||||||
@@ -187,6 +191,7 @@ public class OneHandedController {
|
|||||||
ShellExecutor mainExecutor,
|
ShellExecutor mainExecutor,
|
||||||
Handler mainHandler) {
|
Handler mainHandler) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
|
mWindowManager = windowManager;
|
||||||
mBackgroundPanelOrganizer = backgroundPanelOrganizer;
|
mBackgroundPanelOrganizer = backgroundPanelOrganizer;
|
||||||
mDisplayAreaOrganizer = displayAreaOrganizer;
|
mDisplayAreaOrganizer = displayAreaOrganizer;
|
||||||
mDisplayController = displayController;
|
mDisplayController = displayController;
|
||||||
@@ -269,7 +274,7 @@ public class OneHandedController {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!mDisplayAreaOrganizer.isInOneHanded()) {
|
if (!mDisplayAreaOrganizer.isInOneHanded()) {
|
||||||
final int yOffSet = Math.round(getDisplaySize().y * mOffSetFraction);
|
final int yOffSet = Math.round(getDisplaySize().height() * mOffSetFraction);
|
||||||
mDisplayAreaOrganizer.scheduleOffset(0, yOffSet);
|
mDisplayAreaOrganizer.scheduleOffset(0, yOffSet);
|
||||||
mTimeoutHandler.resetTimer();
|
mTimeoutHandler.resetTimer();
|
||||||
|
|
||||||
@@ -426,14 +431,19 @@ public class OneHandedController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query the current display real size from {@link DisplayController}
|
* Query the current display real size from {@link WindowManager}
|
||||||
*
|
*
|
||||||
* @return {@link DisplayController#getDisplay(int)#getDisplaySize()}
|
* @return {@link WindowManager#getCurrentWindowMetrics()#getBounds()}
|
||||||
*/
|
*/
|
||||||
private Point getDisplaySize() {
|
private Rect getDisplaySize() {
|
||||||
Point displaySize = new Point();
|
if (mWindowManager == null) {
|
||||||
if (mDisplayController != null && mDisplayController.getDisplay(DEFAULT_DISPLAY) != null) {
|
Slog.e(TAG, "WindowManager instance is null! Can not get display size!");
|
||||||
mDisplayController.getDisplay(DEFAULT_DISPLAY).getRealSize(displaySize);
|
return new Rect();
|
||||||
|
}
|
||||||
|
final Rect displaySize = mWindowManager.getCurrentWindowMetrics().getBounds();
|
||||||
|
if (displaySize.width() == 0 || displaySize.height() == 0) {
|
||||||
|
Slog.e(TAG, "Display size error! width = " + displaySize.width()
|
||||||
|
+ ", height = " + displaySize.height());
|
||||||
}
|
}
|
||||||
return displaySize;
|
return displaySize;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,17 +16,16 @@
|
|||||||
|
|
||||||
package com.android.wm.shell.onehanded;
|
package com.android.wm.shell.onehanded;
|
||||||
|
|
||||||
import static android.view.Display.DEFAULT_DISPLAY;
|
|
||||||
|
|
||||||
import static com.android.wm.shell.onehanded.OneHandedAnimationController.TRANSITION_DIRECTION_EXIT;
|
import static com.android.wm.shell.onehanded.OneHandedAnimationController.TRANSITION_DIRECTION_EXIT;
|
||||||
import static com.android.wm.shell.onehanded.OneHandedAnimationController.TRANSITION_DIRECTION_TRIGGER;
|
import static com.android.wm.shell.onehanded.OneHandedAnimationController.TRANSITION_DIRECTION_TRIGGER;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Point;
|
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
|
import android.util.Slog;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
|
import android.view.WindowManager;
|
||||||
import android.window.DisplayAreaAppearedInfo;
|
import android.window.DisplayAreaAppearedInfo;
|
||||||
import android.window.DisplayAreaInfo;
|
import android.window.DisplayAreaInfo;
|
||||||
import android.window.DisplayAreaOrganizer;
|
import android.window.DisplayAreaOrganizer;
|
||||||
@@ -60,6 +59,7 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
|
|||||||
private static final String ONE_HANDED_MODE_TRANSLATE_ANIMATION_DURATION =
|
private static final String ONE_HANDED_MODE_TRANSLATE_ANIMATION_DURATION =
|
||||||
"persist.debug.one_handed_translate_animation_duration";
|
"persist.debug.one_handed_translate_animation_duration";
|
||||||
|
|
||||||
|
private final WindowManager mWindowManager;
|
||||||
private final Rect mLastVisualDisplayBounds = new Rect();
|
private final Rect mLastVisualDisplayBounds = new Rect();
|
||||||
private final Rect mDefaultDisplayBounds = new Rect();
|
private final Rect mDefaultDisplayBounds = new Rect();
|
||||||
|
|
||||||
@@ -110,12 +110,14 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
|
|||||||
* Constructor of OneHandedDisplayAreaOrganizer
|
* Constructor of OneHandedDisplayAreaOrganizer
|
||||||
*/
|
*/
|
||||||
public OneHandedDisplayAreaOrganizer(Context context,
|
public OneHandedDisplayAreaOrganizer(Context context,
|
||||||
|
WindowManager windowManager,
|
||||||
DisplayController displayController,
|
DisplayController displayController,
|
||||||
OneHandedAnimationController animationController,
|
OneHandedAnimationController animationController,
|
||||||
OneHandedTutorialHandler tutorialHandler,
|
OneHandedTutorialHandler tutorialHandler,
|
||||||
OneHandedBackgroundPanelOrganizer oneHandedBackgroundGradientOrganizer,
|
OneHandedBackgroundPanelOrganizer oneHandedBackgroundGradientOrganizer,
|
||||||
ShellExecutor mainExecutor) {
|
ShellExecutor mainExecutor) {
|
||||||
super(mainExecutor);
|
super(mainExecutor);
|
||||||
|
mWindowManager = windowManager;
|
||||||
mAnimationController = animationController;
|
mAnimationController = animationController;
|
||||||
mDisplayController = displayController;
|
mDisplayController = displayController;
|
||||||
mLastVisualDisplayBounds.set(getDisplayBounds());
|
mLastVisualDisplayBounds.set(getDisplayBounds());
|
||||||
@@ -292,11 +294,16 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private Rect getDisplayBounds() {
|
private Rect getDisplayBounds() {
|
||||||
Point realSize = new Point(0, 0);
|
if (mWindowManager == null) {
|
||||||
if (mDisplayController != null && mDisplayController.getDisplay(DEFAULT_DISPLAY) != null) {
|
Slog.e(TAG, "WindowManager instance is null! Can not get display size!");
|
||||||
mDisplayController.getDisplay(DEFAULT_DISPLAY).getRealSize(realSize);
|
return new Rect();
|
||||||
}
|
}
|
||||||
return new Rect(0, 0, realSize.x, realSize.y);
|
final Rect displayBounds = mWindowManager.getCurrentWindowMetrics().getBounds();
|
||||||
|
if (displayBounds.width() == 0 || displayBounds.height() == 0) {
|
||||||
|
Slog.e(TAG, "Display size error! width = " + displayBounds.width()
|
||||||
|
+ ", height = " + displayBounds.height());
|
||||||
|
}
|
||||||
|
return displayBounds;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import static android.view.Display.DEFAULT_DISPLAY;
|
|||||||
|
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Point;
|
|
||||||
import android.graphics.PointF;
|
import android.graphics.PointF;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.hardware.input.InputManager;
|
import android.hardware.input.InputManager;
|
||||||
@@ -34,6 +33,7 @@ import android.view.InputMonitor;
|
|||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
import android.view.ViewConfiguration;
|
import android.view.ViewConfiguration;
|
||||||
|
import android.view.WindowManager;
|
||||||
import android.window.WindowContainerTransaction;
|
import android.window.WindowContainerTransaction;
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
@@ -59,8 +59,9 @@ public class OneHandedGestureHandler implements OneHandedTransitionCallback,
|
|||||||
private final PointF mDownPos = new PointF();
|
private final PointF mDownPos = new PointF();
|
||||||
private final PointF mLastPos = new PointF();
|
private final PointF mLastPos = new PointF();
|
||||||
private final PointF mStartDragPos = new PointF();
|
private final PointF mStartDragPos = new PointF();
|
||||||
private boolean mPassedSlop;
|
private final WindowManager mWindowManager;
|
||||||
|
|
||||||
|
private boolean mPassedSlop;
|
||||||
private boolean mAllowGesture;
|
private boolean mAllowGesture;
|
||||||
private boolean mIsEnabled;
|
private boolean mIsEnabled;
|
||||||
private int mNavGestureHeight;
|
private int mNavGestureHeight;
|
||||||
@@ -86,9 +87,10 @@ public class OneHandedGestureHandler implements OneHandedTransitionCallback,
|
|||||||
* @param context {@link Context}
|
* @param context {@link Context}
|
||||||
* @param displayController {@link DisplayController}
|
* @param displayController {@link DisplayController}
|
||||||
*/
|
*/
|
||||||
public OneHandedGestureHandler(Context context, DisplayController displayController,
|
public OneHandedGestureHandler(Context context, WindowManager windowManager,
|
||||||
ViewConfiguration viewConfig,
|
DisplayController displayController, ViewConfiguration viewConfig,
|
||||||
ShellExecutor mainExecutor) {
|
ShellExecutor mainExecutor) {
|
||||||
|
mWindowManager = windowManager;
|
||||||
mDisplayController = displayController;
|
mDisplayController = displayController;
|
||||||
mMainExecutor = mainExecutor;
|
mMainExecutor = mainExecutor;
|
||||||
displayController.addDisplayChangingController(this);
|
displayController.addDisplayChangingController(this);
|
||||||
@@ -210,16 +212,10 @@ public class OneHandedGestureHandler implements OneHandedTransitionCallback,
|
|||||||
disposeInputChannel();
|
disposeInputChannel();
|
||||||
|
|
||||||
if (mIsEnabled && mIsThreeButtonModeEnabled) {
|
if (mIsEnabled && mIsThreeButtonModeEnabled) {
|
||||||
final Point displaySize = new Point();
|
final Rect displaySize = mWindowManager.getCurrentWindowMetrics().getBounds();
|
||||||
if (mDisplayController != null) {
|
|
||||||
final Display display = mDisplayController.getDisplay(DEFAULT_DISPLAY);
|
|
||||||
if (display != null) {
|
|
||||||
display.getRealSize(displaySize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Register input event receiver to monitor the touch region of NavBar gesture height
|
// Register input event receiver to monitor the touch region of NavBar gesture height
|
||||||
mGestureRegion.set(0, displaySize.y - mNavGestureHeight, displaySize.x,
|
mGestureRegion.set(0, displaySize.height() - mNavGestureHeight, displaySize.width(),
|
||||||
displaySize.y);
|
displaySize.height());
|
||||||
mInputMonitor = InputManager.getInstance().monitorGestureInput(
|
mInputMonitor = InputManager.getInstance().monitorGestureInput(
|
||||||
"onehanded-gesture-offset", DEFAULT_DISPLAY);
|
"onehanded-gesture-offset", DEFAULT_DISPLAY);
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import android.content.ContentResolver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.PixelFormat;
|
import android.graphics.PixelFormat;
|
||||||
import android.graphics.Point;
|
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
@@ -51,14 +50,13 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
|
|||||||
private static final String ONE_HANDED_MODE_OFFSET_PERCENTAGE =
|
private static final String ONE_HANDED_MODE_OFFSET_PERCENTAGE =
|
||||||
"persist.debug.one_handed_offset_percentage";
|
"persist.debug.one_handed_offset_percentage";
|
||||||
private static final int MAX_TUTORIAL_SHOW_COUNT = 2;
|
private static final int MAX_TUTORIAL_SHOW_COUNT = 2;
|
||||||
private final Rect mLastUpdatedBounds = new Rect();
|
|
||||||
private final WindowManager mWindowManager;
|
private final WindowManager mWindowManager;
|
||||||
private final AccessibilityManager mAccessibilityManager;
|
private final AccessibilityManager mAccessibilityManager;
|
||||||
private final String mPackageName;
|
private final String mPackageName;
|
||||||
|
private final Rect mDisplaySize;
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private View mTutorialView;
|
private View mTutorialView;
|
||||||
private Point mDisplaySize = new Point();
|
|
||||||
private ContentResolver mContentResolver;
|
private ContentResolver mContentResolver;
|
||||||
private boolean mCanShowTutorial;
|
private boolean mCanShowTutorial;
|
||||||
private String mStartOneHandedDescription;
|
private String mStartOneHandedDescription;
|
||||||
@@ -101,14 +99,14 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public OneHandedTutorialHandler(Context context, ShellExecutor mainExecutor) {
|
public OneHandedTutorialHandler(Context context, WindowManager windowManager,
|
||||||
|
ShellExecutor mainExecutor) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
context.getDisplay().getRealSize(mDisplaySize);
|
mWindowManager = windowManager;
|
||||||
|
mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();
|
||||||
mPackageName = context.getPackageName();
|
mPackageName = context.getPackageName();
|
||||||
mContentResolver = context.getContentResolver();
|
mContentResolver = context.getContentResolver();
|
||||||
mWindowManager = context.getSystemService(WindowManager.class);
|
|
||||||
mAccessibilityManager = AccessibilityManager.getInstance(context);
|
mAccessibilityManager = AccessibilityManager.getInstance(context);
|
||||||
|
|
||||||
mStartOneHandedDescription = context.getResources().getString(
|
mStartOneHandedDescription = context.getResources().getString(
|
||||||
R.string.accessibility_action_start_one_handed);
|
R.string.accessibility_action_start_one_handed);
|
||||||
mStopOneHandedDescription = context.getResources().getString(
|
mStopOneHandedDescription = context.getResources().getString(
|
||||||
@@ -121,7 +119,8 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
|
|||||||
R.fraction.config_one_handed_offset, 1, 1);
|
R.fraction.config_one_handed_offset, 1, 1);
|
||||||
final int sysPropPercentageConfig = SystemProperties.getInt(
|
final int sysPropPercentageConfig = SystemProperties.getInt(
|
||||||
ONE_HANDED_MODE_OFFSET_PERCENTAGE, Math.round(offsetPercentageConfig * 100.0f));
|
ONE_HANDED_MODE_OFFSET_PERCENTAGE, Math.round(offsetPercentageConfig * 100.0f));
|
||||||
mTutorialAreaHeight = Math.round(mDisplaySize.y * (sysPropPercentageConfig / 100.0f));
|
mTutorialAreaHeight = Math.round(
|
||||||
|
mDisplaySize.height() * (sysPropPercentageConfig / 100.0f));
|
||||||
|
|
||||||
mainExecutor.execute(() -> {
|
mainExecutor.execute(() -> {
|
||||||
recreateTutorialView(mContext);
|
recreateTutorialView(mContext);
|
||||||
@@ -214,7 +213,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
|
|||||||
*/
|
*/
|
||||||
private WindowManager.LayoutParams getTutorialTargetLayoutParams() {
|
private WindowManager.LayoutParams getTutorialTargetLayoutParams() {
|
||||||
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
|
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
|
||||||
mDisplaySize.x, mTutorialAreaHeight, 0, 0,
|
mDisplaySize.width(), mTutorialAreaHeight, 0, 0,
|
||||||
WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
|
WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
|
||||||
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
|
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
|
||||||
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
|
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
|
||||||
@@ -228,9 +227,13 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
|
|||||||
|
|
||||||
void dump(@NonNull PrintWriter pw) {
|
void dump(@NonNull PrintWriter pw) {
|
||||||
final String innerPrefix = " ";
|
final String innerPrefix = " ";
|
||||||
pw.println(TAG + "states: ");
|
pw.println(TAG + " states: ");
|
||||||
pw.print(innerPrefix + "mLastUpdatedBounds=");
|
pw.print(innerPrefix + "mTriggerState=");
|
||||||
pw.println(mLastUpdatedBounds);
|
pw.println(mTriggerState);
|
||||||
|
pw.print(innerPrefix + "mDisplaySize=");
|
||||||
|
pw.println(mDisplaySize);
|
||||||
|
pw.print(innerPrefix + "mTutorialAreaHeight=");
|
||||||
|
pw.println(mTutorialAreaHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean canShowTutorial() {
|
private boolean canShowTutorial() {
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class OneHandedBackgroundPanelOrganizerTest extends OneHandedTestCase {
|
|||||||
mDisplayAreaInfo = new DisplayAreaInfo(mToken, DEFAULT_DISPLAY,
|
mDisplayAreaInfo = new DisplayAreaInfo(mToken, DEFAULT_DISPLAY,
|
||||||
FEATURE_ONE_HANDED_BACKGROUND_PANEL);
|
FEATURE_ONE_HANDED_BACKGROUND_PANEL);
|
||||||
|
|
||||||
mBackgroundPanelOrganizer = new OneHandedBackgroundPanelOrganizer(mContext,
|
mBackgroundPanelOrganizer = new OneHandedBackgroundPanelOrganizer(mContext, mWindowManager,
|
||||||
mMockDisplayController, Runnable::run);
|
mMockDisplayController, Runnable::run);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
|||||||
|
|
||||||
mSpiedOneHandedController = spy(new OneHandedController(
|
mSpiedOneHandedController = spy(new OneHandedController(
|
||||||
mContext,
|
mContext,
|
||||||
|
mWindowManager,
|
||||||
mMockDisplayController,
|
mMockDisplayController,
|
||||||
mMockBackgroundOrganizer,
|
mMockBackgroundOrganizer,
|
||||||
mMockDisplayAreaOrganizer,
|
mMockDisplayAreaOrganizer,
|
||||||
@@ -120,8 +121,8 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
|||||||
final OneHandedAnimationController animationController = new OneHandedAnimationController(
|
final OneHandedAnimationController animationController = new OneHandedAnimationController(
|
||||||
mContext);
|
mContext);
|
||||||
OneHandedDisplayAreaOrganizer displayAreaOrganizer = new OneHandedDisplayAreaOrganizer(
|
OneHandedDisplayAreaOrganizer displayAreaOrganizer = new OneHandedDisplayAreaOrganizer(
|
||||||
mContext, mMockDisplayController, animationController, mMockTutorialHandler,
|
mContext, mWindowManager, mMockDisplayController, animationController,
|
||||||
mMockBackgroundOrganizer, mMockShellMainExecutor);
|
mMockTutorialHandler, mMockBackgroundOrganizer, mMockShellMainExecutor);
|
||||||
|
|
||||||
assertThat(displayAreaOrganizer.isInOneHanded()).isFalse();
|
assertThat(displayAreaOrganizer.isInOneHanded()).isFalse();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ public class OneHandedDisplayAreaOrganizerTest extends OneHandedTestCase {
|
|||||||
when(mMockLeash.getHeight()).thenReturn(DISPLAY_HEIGHT);
|
when(mMockLeash.getHeight()).thenReturn(DISPLAY_HEIGHT);
|
||||||
|
|
||||||
mSpiedDisplayAreaOrganizer = spy(new OneHandedDisplayAreaOrganizer(mContext,
|
mSpiedDisplayAreaOrganizer = spy(new OneHandedDisplayAreaOrganizer(mContext,
|
||||||
|
mWindowManager,
|
||||||
mMockDisplayController,
|
mMockDisplayController,
|
||||||
mMockAnimationController,
|
mMockAnimationController,
|
||||||
mTutorialHandler,
|
mTutorialHandler,
|
||||||
|
|||||||
@@ -44,8 +44,9 @@ public class OneHandedGestureHandlerTest extends OneHandedTestCase {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
mGestureHandler = new OneHandedGestureHandler(mContext, mMockDisplayController,
|
mGestureHandler = new OneHandedGestureHandler(mContext, mWindowManager,
|
||||||
ViewConfiguration.get(mTestContext), mMockShellMainExecutor);
|
mMockDisplayController, ViewConfiguration.get(mTestContext),
|
||||||
|
mMockShellMainExecutor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import android.content.Context;
|
|||||||
import android.hardware.display.DisplayManager;
|
import android.hardware.display.DisplayManager;
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
import android.testing.TestableContext;
|
import android.testing.TestableContext;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
|
||||||
import androidx.test.platform.app.InstrumentationRegistry;
|
import androidx.test.platform.app.InstrumentationRegistry;
|
||||||
|
|
||||||
@@ -45,6 +46,9 @@ public abstract class OneHandedTestCase {
|
|||||||
public TestableContext mTestContext = new TestableContext(
|
public TestableContext mTestContext = new TestableContext(
|
||||||
InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
|
InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
|
||||||
|
|
||||||
|
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||||
|
protected WindowManager mWindowManager;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUpContext() {
|
public void setUpContext() {
|
||||||
assumeTrue(SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false));
|
assumeTrue(SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false));
|
||||||
@@ -53,6 +57,12 @@ public abstract class OneHandedTestCase {
|
|||||||
mContext = getTestContext().createDisplayContext(dm.getDisplay(DEFAULT_DISPLAY));
|
mContext = getTestContext().createDisplayContext(dm.getDisplay(DEFAULT_DISPLAY));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUpWindowManager() {
|
||||||
|
assumeTrue(SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false));
|
||||||
|
mWindowManager = getTestContext().getSystemService(WindowManager.class);
|
||||||
|
}
|
||||||
|
|
||||||
/** return testable context */
|
/** return testable context */
|
||||||
protected TestableContext getTestContext() {
|
protected TestableContext getTestContext() {
|
||||||
return mTestContext;
|
return mTestContext;
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase {
|
|||||||
@Mock
|
@Mock
|
||||||
OneHandedUiEventLogger mMockUiEventLogger;
|
OneHandedUiEventLogger mMockUiEventLogger;
|
||||||
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
@@ -73,7 +72,8 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase {
|
|||||||
|
|
||||||
when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
|
when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
|
||||||
mOneHandedController = new OneHandedController(
|
mOneHandedController = new OneHandedController(
|
||||||
getContext(),
|
mContext,
|
||||||
|
mWindowManager,
|
||||||
mMockDisplayController,
|
mMockDisplayController,
|
||||||
mMockBackgroundOrganizer,
|
mMockBackgroundOrganizer,
|
||||||
mMockDisplayAreaOrganizer,
|
mMockDisplayAreaOrganizer,
|
||||||
|
|||||||
@@ -328,12 +328,12 @@ public abstract class WMShellBaseModule {
|
|||||||
@WMSingleton
|
@WMSingleton
|
||||||
@Provides
|
@Provides
|
||||||
static Optional<OneHandedController> provideOneHandedController(Context context,
|
static Optional<OneHandedController> provideOneHandedController(Context context,
|
||||||
DisplayController displayController, TaskStackListenerImpl taskStackListener,
|
WindowManager windowManager, DisplayController displayController,
|
||||||
UiEventLogger uiEventLogger,
|
TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger,
|
||||||
@ShellMainThread ShellExecutor mainExecutor,
|
@ShellMainThread ShellExecutor mainExecutor,
|
||||||
@ShellMainThread Handler mainHandler) {
|
@ShellMainThread Handler mainHandler) {
|
||||||
return Optional.ofNullable(OneHandedController.create(context, displayController,
|
return Optional.ofNullable(OneHandedController.create(context, windowManager,
|
||||||
taskStackListener, uiEventLogger, mainExecutor, mainHandler));
|
displayController, taskStackListener, uiEventLogger, mainExecutor, mainHandler));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user