Merge "Moved PhoneStatusBarView touchHandler out of NPVC" into tm-qpr-dev am: be69929b02
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20487107 Change-Id: Iac6bf7e2d6bc4c740e5b20bcba742dd32c71caf4 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -200,7 +200,6 @@ import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
|
|||||||
import com.android.systemui.statusbar.phone.KeyguardStatusBarViewController;
|
import com.android.systemui.statusbar.phone.KeyguardStatusBarViewController;
|
||||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
||||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent;
|
import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent;
|
||||||
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
|
|
||||||
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
|
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
|
||||||
import com.android.systemui.statusbar.phone.ScrimController;
|
import com.android.systemui.statusbar.phone.ScrimController;
|
||||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||||
@@ -4587,55 +4586,6 @@ public final class NotificationPanelViewController implements Dumpable {
|
|||||||
return new TouchHandler();
|
return new TouchHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final PhoneStatusBarView.TouchEventHandler mStatusBarViewTouchEventHandler =
|
|
||||||
new PhoneStatusBarView.TouchEventHandler() {
|
|
||||||
@Override
|
|
||||||
public void onInterceptTouchEvent(MotionEvent event) {
|
|
||||||
mCentralSurfaces.onTouchEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handleTouchEvent(MotionEvent event) {
|
|
||||||
mCentralSurfaces.onTouchEvent(event);
|
|
||||||
|
|
||||||
// TODO(b/202981994): Move the touch debugging in this method to a central
|
|
||||||
// location. (Right now, it's split between CentralSurfaces and here.)
|
|
||||||
|
|
||||||
// If panels aren't enabled, ignore the gesture and don't pass it down to the
|
|
||||||
// panel view.
|
|
||||||
if (!mCommandQueue.panelsEnabled()) {
|
|
||||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
|
||||||
Log.v(
|
|
||||||
TAG,
|
|
||||||
String.format(
|
|
||||||
"onTouchForwardedFromStatusBar: "
|
|
||||||
+ "panel disabled, ignoring touch at (%d,%d)",
|
|
||||||
(int) event.getX(),
|
|
||||||
(int) event.getY()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
|
||||||
// If the view that would receive the touch is disabled, just have status
|
|
||||||
// bar eat the gesture.
|
|
||||||
if (!mView.isEnabled()) {
|
|
||||||
mShadeLog.logMotionEvent(event,
|
|
||||||
"onTouchForwardedFromStatusBar: panel view disabled");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (isFullyCollapsed() && event.getY() < 1f) {
|
|
||||||
// b/235889526 Eat events on the top edge of the phone when collapsed
|
|
||||||
mShadeLog.logMotionEvent(event, "top edge touch ignored");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mView.dispatchTouchEvent(event);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public NotificationStackScrollLayoutController getNotificationStackScrollLayoutController() {
|
public NotificationStackScrollLayoutController getNotificationStackScrollLayoutController() {
|
||||||
return mNotificationStackScrollLayoutController;
|
return mNotificationStackScrollLayoutController;
|
||||||
}
|
}
|
||||||
@@ -5237,6 +5187,11 @@ public final class NotificationPanelViewController implements Dumpable {
|
|||||||
return mView.onInterceptTouchEvent(event);
|
return mView.onInterceptTouchEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** */
|
||||||
|
public boolean sendTouchEventToView(MotionEvent event) {
|
||||||
|
return mView.dispatchTouchEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
public void requestLayoutOnView() {
|
public void requestLayoutOnView() {
|
||||||
mView.requestLayout();
|
mView.requestLayout();
|
||||||
@@ -5247,6 +5202,11 @@ public final class NotificationPanelViewController implements Dumpable {
|
|||||||
ViewGroupFadeHelper.reset(mView);
|
ViewGroupFadeHelper.reset(mView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** */
|
||||||
|
public boolean isViewEnabled() {
|
||||||
|
return mView.isEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
private void beginJankMonitoring() {
|
private void beginJankMonitoring() {
|
||||||
if (mInteractionJankMonitor == null) {
|
if (mInteractionJankMonitor == null) {
|
||||||
return;
|
return;
|
||||||
@@ -5796,11 +5756,6 @@ public final class NotificationPanelViewController implements Dumpable {
|
|||||||
mCurrentPanelState = state;
|
mCurrentPanelState = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the handler that the status bar should forward touches to. */
|
|
||||||
public PhoneStatusBarView.TouchEventHandler getStatusBarTouchEventHandler() {
|
|
||||||
return mStatusBarViewTouchEventHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
StatusBarStateController getStatusBarStateController() {
|
StatusBarStateController getStatusBarStateController() {
|
||||||
return mStatusBarStateController;
|
return mStatusBarStateController;
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ import android.os.Bundle;
|
|||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.service.notification.StatusBarNotification;
|
import android.service.notification.StatusBarNotification;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.view.RemoteAnimationAdapter;
|
import android.view.RemoteAnimationAdapter;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -283,7 +282,11 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn
|
|||||||
|
|
||||||
void animateCollapseQuickSettings();
|
void animateCollapseQuickSettings();
|
||||||
|
|
||||||
void onTouchEvent(MotionEvent event);
|
/** */
|
||||||
|
boolean getCommandQueuePanelsEnabled();
|
||||||
|
|
||||||
|
/** */
|
||||||
|
int getStatusBarWindowState();
|
||||||
|
|
||||||
BiometricUnlockController getBiometricUnlockController();
|
BiometricUnlockController getBiometricUnlockController();
|
||||||
|
|
||||||
|
|||||||
@@ -94,7 +94,6 @@ import android.view.Display;
|
|||||||
import android.view.IRemoteAnimationRunner;
|
import android.view.IRemoteAnimationRunner;
|
||||||
import android.view.IWindowManager;
|
import android.view.IWindowManager;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.view.ThreadedRenderer;
|
import android.view.ThreadedRenderer;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -2031,43 +2030,14 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Called when a touch event occurred on {@link PhoneStatusBarView}. */
|
|
||||||
@Override
|
@Override
|
||||||
public void onTouchEvent(MotionEvent event) {
|
public boolean getCommandQueuePanelsEnabled() {
|
||||||
// TODO(b/202981994): Move this touch debugging to a central location. (Right now, it's
|
return mCommandQueue.panelsEnabled();
|
||||||
// split between NotificationPanelViewController and here.)
|
}
|
||||||
if (DEBUG_GESTURES) {
|
|
||||||
if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
|
|
||||||
EventLog.writeEvent(EventLogTags.SYSUI_STATUSBAR_TOUCH,
|
|
||||||
event.getActionMasked(), (int) event.getX(), (int) event.getY(),
|
|
||||||
mDisabled1, mDisabled2);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
@Override
|
||||||
|
public int getStatusBarWindowState() {
|
||||||
if (SPEW) {
|
return mStatusBarWindowState;
|
||||||
Log.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled1="
|
|
||||||
+ mDisabled1 + " mDisabled2=" + mDisabled2);
|
|
||||||
} else if (CHATTY) {
|
|
||||||
if (event.getAction() != MotionEvent.ACTION_MOVE) {
|
|
||||||
Log.d(TAG, String.format(
|
|
||||||
"panel: %s at (%f, %f) mDisabled1=0x%08x mDisabled2=0x%08x",
|
|
||||||
MotionEvent.actionToString(event.getAction()),
|
|
||||||
event.getRawX(), event.getRawY(), mDisabled1, mDisabled2));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DEBUG_GESTURES) {
|
|
||||||
mGestureRec.add(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mStatusBarWindowState == WINDOW_STATE_SHOWING) {
|
|
||||||
final boolean upOrCancel =
|
|
||||||
event.getAction() == MotionEvent.ACTION_UP ||
|
|
||||||
event.getAction() == MotionEvent.ACTION_CANCEL;
|
|
||||||
setInteracting(StatusBarManager.WINDOW_STATUS_BAR,
|
|
||||||
!upOrCancel || mShadeController.isExpandedVisible());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -15,14 +15,20 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.systemui.statusbar.phone
|
package com.android.systemui.statusbar.phone
|
||||||
|
|
||||||
|
import android.app.StatusBarManager.WINDOW_STATE_SHOWING
|
||||||
|
import android.app.StatusBarManager.WINDOW_STATUS_BAR
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.graphics.Point
|
import android.graphics.Point
|
||||||
|
import android.util.Log
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.ViewTreeObserver
|
import android.view.ViewTreeObserver
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
|
import com.android.systemui.shade.ShadeController
|
||||||
|
import com.android.systemui.shade.ShadeLogger
|
||||||
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator
|
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator
|
||||||
|
import com.android.systemui.statusbar.phone.PhoneStatusBarView.TouchEventHandler
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
import com.android.systemui.statusbar.policy.ConfigurationController
|
||||||
import com.android.systemui.unfold.SysUIUnfoldComponent
|
import com.android.systemui.unfold.SysUIUnfoldComponent
|
||||||
import com.android.systemui.unfold.UNFOLD_STATUS_BAR
|
import com.android.systemui.unfold.UNFOLD_STATUS_BAR
|
||||||
@@ -35,14 +41,18 @@ import java.util.Optional
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Named
|
import javax.inject.Named
|
||||||
|
|
||||||
|
private const val TAG = "PhoneStatusBarViewController"
|
||||||
|
|
||||||
/** Controller for [PhoneStatusBarView]. */
|
/** Controller for [PhoneStatusBarView]. */
|
||||||
class PhoneStatusBarViewController private constructor(
|
class PhoneStatusBarViewController private constructor(
|
||||||
view: PhoneStatusBarView,
|
view: PhoneStatusBarView,
|
||||||
@Named(UNFOLD_STATUS_BAR) private val progressProvider: ScopedUnfoldTransitionProgressProvider?,
|
@Named(UNFOLD_STATUS_BAR) private val progressProvider: ScopedUnfoldTransitionProgressProvider?,
|
||||||
|
private val centralSurfaces: CentralSurfaces,
|
||||||
|
private val shadeController: ShadeController,
|
||||||
|
private val shadeLogger: ShadeLogger,
|
||||||
private val moveFromCenterAnimationController: StatusBarMoveFromCenterAnimationController?,
|
private val moveFromCenterAnimationController: StatusBarMoveFromCenterAnimationController?,
|
||||||
private val userChipViewModel: StatusBarUserChipViewModel,
|
private val userChipViewModel: StatusBarUserChipViewModel,
|
||||||
private val viewUtil: ViewUtil,
|
private val viewUtil: ViewUtil,
|
||||||
touchEventHandler: PhoneStatusBarView.TouchEventHandler,
|
|
||||||
private val configurationController: ConfigurationController
|
private val configurationController: ConfigurationController
|
||||||
) : ViewController<PhoneStatusBarView>(view) {
|
) : ViewController<PhoneStatusBarView>(view) {
|
||||||
|
|
||||||
@@ -90,7 +100,7 @@ class PhoneStatusBarViewController private constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
mView.setTouchEventHandler(touchEventHandler)
|
mView.setTouchEventHandler(PhoneStatusBarViewTouchHandler())
|
||||||
mView.init(userChipViewModel)
|
mView.init(userChipViewModel)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,6 +130,54 @@ class PhoneStatusBarViewController private constructor(
|
|||||||
return viewUtil.touchIsWithinView(mView, x, y)
|
return viewUtil.touchIsWithinView(mView, x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Called when a touch event occurred on {@link PhoneStatusBarView}. */
|
||||||
|
fun onTouchEvent(event: MotionEvent) {
|
||||||
|
if (centralSurfaces.statusBarWindowState == WINDOW_STATE_SHOWING) {
|
||||||
|
val upOrCancel =
|
||||||
|
event.action == MotionEvent.ACTION_UP ||
|
||||||
|
event.action == MotionEvent.ACTION_CANCEL
|
||||||
|
centralSurfaces.setInteracting(WINDOW_STATUS_BAR,
|
||||||
|
!upOrCancel || shadeController.isExpandedVisible)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class PhoneStatusBarViewTouchHandler : TouchEventHandler {
|
||||||
|
override fun onInterceptTouchEvent(event: MotionEvent) {
|
||||||
|
onTouchEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun handleTouchEvent(event: MotionEvent): Boolean {
|
||||||
|
onTouchEvent(event)
|
||||||
|
|
||||||
|
// If panels aren't enabled, ignore the gesture and don't pass it down to the
|
||||||
|
// panel view.
|
||||||
|
if (!centralSurfaces.commandQueuePanelsEnabled) {
|
||||||
|
if (event.action == MotionEvent.ACTION_DOWN) {
|
||||||
|
Log.v(TAG, String.format("onTouchForwardedFromStatusBar: panel disabled, " +
|
||||||
|
"ignoring touch at (${event.x.toInt()},${event.y.toInt()})"))
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.action == MotionEvent.ACTION_DOWN) {
|
||||||
|
// If the view that would receive the touch is disabled, just have status
|
||||||
|
// bar eat the gesture.
|
||||||
|
if (!centralSurfaces.notificationPanelViewController.isViewEnabled) {
|
||||||
|
shadeLogger.logMotionEvent(event,
|
||||||
|
"onTouchForwardedFromStatusBar: panel view disabled")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (centralSurfaces.notificationPanelViewController.isFullyCollapsed &&
|
||||||
|
event.y < 1f) {
|
||||||
|
// b/235889526 Eat events on the top edge of the phone when collapsed
|
||||||
|
shadeLogger.logMotionEvent(event, "top edge touch ignored")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return centralSurfaces.notificationPanelViewController.sendTouchEventToView(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class StatusBarViewsCenterProvider : UnfoldMoveFromCenterAnimator.ViewCenterProvider {
|
class StatusBarViewsCenterProvider : UnfoldMoveFromCenterAnimator.ViewCenterProvider {
|
||||||
override fun getViewCenter(view: View, outPoint: Point) =
|
override fun getViewCenter(view: View, outPoint: Point) =
|
||||||
when (view.id) {
|
when (view.id) {
|
||||||
@@ -157,20 +215,24 @@ class PhoneStatusBarViewController private constructor(
|
|||||||
@Named(UNFOLD_STATUS_BAR)
|
@Named(UNFOLD_STATUS_BAR)
|
||||||
private val progressProvider: Optional<ScopedUnfoldTransitionProgressProvider>,
|
private val progressProvider: Optional<ScopedUnfoldTransitionProgressProvider>,
|
||||||
private val userChipViewModel: StatusBarUserChipViewModel,
|
private val userChipViewModel: StatusBarUserChipViewModel,
|
||||||
|
private val centralSurfaces: CentralSurfaces,
|
||||||
|
private val shadeController: ShadeController,
|
||||||
|
private val shadeLogger: ShadeLogger,
|
||||||
private val viewUtil: ViewUtil,
|
private val viewUtil: ViewUtil,
|
||||||
private val configurationController: ConfigurationController,
|
private val configurationController: ConfigurationController,
|
||||||
) {
|
) {
|
||||||
fun create(
|
fun create(
|
||||||
view: PhoneStatusBarView,
|
view: PhoneStatusBarView
|
||||||
touchEventHandler: PhoneStatusBarView.TouchEventHandler
|
|
||||||
) =
|
) =
|
||||||
PhoneStatusBarViewController(
|
PhoneStatusBarViewController(
|
||||||
view,
|
view,
|
||||||
progressProvider.getOrNull(),
|
progressProvider.getOrNull(),
|
||||||
|
centralSurfaces,
|
||||||
|
shadeController,
|
||||||
|
shadeLogger,
|
||||||
unfoldComponent.getOrNull()?.getStatusBarMoveFromCenterAnimationController(),
|
unfoldComponent.getOrNull()?.getStatusBarMoveFromCenterAnimationController(),
|
||||||
userChipViewModel,
|
userChipViewModel,
|
||||||
viewUtil,
|
viewUtil,
|
||||||
touchEventHandler,
|
|
||||||
configurationController
|
configurationController
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import android.view.View;
|
|||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.battery.BatteryMeterView;
|
import com.android.systemui.battery.BatteryMeterView;
|
||||||
import com.android.systemui.dagger.qualifiers.RootView;
|
import com.android.systemui.dagger.qualifiers.RootView;
|
||||||
import com.android.systemui.shade.NotificationPanelViewController;
|
|
||||||
import com.android.systemui.statusbar.HeadsUpStatusBarView;
|
import com.android.systemui.statusbar.HeadsUpStatusBarView;
|
||||||
import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions;
|
import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions;
|
||||||
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
|
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
|
||||||
@@ -127,11 +126,9 @@ public interface StatusBarFragmentModule {
|
|||||||
@StatusBarFragmentScope
|
@StatusBarFragmentScope
|
||||||
static PhoneStatusBarViewController providePhoneStatusBarViewController(
|
static PhoneStatusBarViewController providePhoneStatusBarViewController(
|
||||||
PhoneStatusBarViewController.Factory phoneStatusBarViewControllerFactory,
|
PhoneStatusBarViewController.Factory phoneStatusBarViewControllerFactory,
|
||||||
@RootView PhoneStatusBarView phoneStatusBarView,
|
@RootView PhoneStatusBarView phoneStatusBarView) {
|
||||||
NotificationPanelViewController notificationPanelViewController) {
|
|
||||||
return phoneStatusBarViewControllerFactory.create(
|
return phoneStatusBarViewControllerFactory.create(
|
||||||
phoneStatusBarView,
|
phoneStatusBarView);
|
||||||
notificationPanelViewController.getStatusBarTouchEventHandler());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
|
|||||||
@@ -801,66 +801,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
|
|||||||
assertThat(mNotificationPanelViewController.isFlinging()).isTrue();
|
assertThat(mNotificationPanelViewController.isFlinging()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void handleTouchEventFromStatusBar_panelsNotEnabled_returnsFalseAndNoViewEvent() {
|
|
||||||
when(mCommandQueue.panelsEnabled()).thenReturn(false);
|
|
||||||
|
|
||||||
boolean returnVal = mNotificationPanelViewController
|
|
||||||
.getStatusBarTouchEventHandler()
|
|
||||||
.handleTouchEvent(
|
|
||||||
MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0));
|
|
||||||
|
|
||||||
assertThat(returnVal).isFalse();
|
|
||||||
verify(mView, never()).dispatchTouchEvent(any());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void handleTouchEventFromStatusBar_viewNotEnabled_returnsTrueAndNoViewEvent() {
|
|
||||||
when(mCommandQueue.panelsEnabled()).thenReturn(true);
|
|
||||||
when(mView.isEnabled()).thenReturn(false);
|
|
||||||
|
|
||||||
boolean returnVal = mNotificationPanelViewController
|
|
||||||
.getStatusBarTouchEventHandler()
|
|
||||||
.handleTouchEvent(
|
|
||||||
MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0));
|
|
||||||
|
|
||||||
assertThat(returnVal).isTrue();
|
|
||||||
verify(mView, never()).dispatchTouchEvent(any());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void handleTouchEventFromStatusBar_viewNotEnabledButIsMoveEvent_viewReceivesEvent() {
|
|
||||||
when(mCommandQueue.panelsEnabled()).thenReturn(true);
|
|
||||||
when(mView.isEnabled()).thenReturn(false);
|
|
||||||
MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0);
|
|
||||||
|
|
||||||
mNotificationPanelViewController.getStatusBarTouchEventHandler().handleTouchEvent(event);
|
|
||||||
|
|
||||||
verify(mView).dispatchTouchEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void handleTouchEventFromStatusBar_panelAndViewEnabled_viewReceivesEvent() {
|
|
||||||
when(mCommandQueue.panelsEnabled()).thenReturn(true);
|
|
||||||
when(mView.isEnabled()).thenReturn(true);
|
|
||||||
MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 2f, 0);
|
|
||||||
|
|
||||||
mNotificationPanelViewController.getStatusBarTouchEventHandler().handleTouchEvent(event);
|
|
||||||
|
|
||||||
verify(mView).dispatchTouchEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void handleTouchEventFromStatusBar_topEdgeTouch_viewNeverReceivesEvent() {
|
|
||||||
when(mCommandQueue.panelsEnabled()).thenReturn(true);
|
|
||||||
when(mView.isEnabled()).thenReturn(true);
|
|
||||||
MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0);
|
|
||||||
|
|
||||||
mNotificationPanelViewController.getStatusBarTouchEventHandler().handleTouchEvent(event);
|
|
||||||
|
|
||||||
verify(mView, never()).dispatchTouchEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testA11y_initializeNode() {
|
public void testA11y_initializeNode() {
|
||||||
AccessibilityNodeInfo nodeInfo = new AccessibilityNodeInfo();
|
AccessibilityNodeInfo nodeInfo = new AccessibilityNodeInfo();
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ import androidx.test.platform.app.InstrumentationRegistry
|
|||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.android.systemui.shade.NotificationPanelViewController
|
import com.android.systemui.shade.NotificationPanelViewController
|
||||||
|
import com.android.systemui.shade.ShadeControllerImpl
|
||||||
|
import com.android.systemui.shade.ShadeLogger
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
import com.android.systemui.statusbar.policy.ConfigurationController
|
||||||
import com.android.systemui.unfold.SysUIUnfoldComponent
|
import com.android.systemui.unfold.SysUIUnfoldComponent
|
||||||
import com.android.systemui.unfold.config.UnfoldTransitionConfig
|
import com.android.systemui.unfold.config.UnfoldTransitionConfig
|
||||||
@@ -41,6 +43,7 @@ import org.mockito.ArgumentCaptor
|
|||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
import org.mockito.Mockito.`when`
|
import org.mockito.Mockito.`when`
|
||||||
import org.mockito.Mockito.mock
|
import org.mockito.Mockito.mock
|
||||||
|
import org.mockito.Mockito.never
|
||||||
import org.mockito.Mockito.spy
|
import org.mockito.Mockito.spy
|
||||||
import org.mockito.Mockito.verify
|
import org.mockito.Mockito.verify
|
||||||
import org.mockito.MockitoAnnotations
|
import org.mockito.MockitoAnnotations
|
||||||
@@ -49,8 +52,6 @@ import java.util.Optional
|
|||||||
@SmallTest
|
@SmallTest
|
||||||
class PhoneStatusBarViewControllerTest : SysuiTestCase() {
|
class PhoneStatusBarViewControllerTest : SysuiTestCase() {
|
||||||
|
|
||||||
private val touchEventHandler = TestTouchEventHandler()
|
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private lateinit var notificationPanelViewController: NotificationPanelViewController
|
private lateinit var notificationPanelViewController: NotificationPanelViewController
|
||||||
@Mock
|
@Mock
|
||||||
@@ -66,6 +67,12 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
|
|||||||
@Mock
|
@Mock
|
||||||
private lateinit var userChipViewModel: StatusBarUserChipViewModel
|
private lateinit var userChipViewModel: StatusBarUserChipViewModel
|
||||||
@Mock
|
@Mock
|
||||||
|
private lateinit var centralSurfacesImpl: CentralSurfacesImpl
|
||||||
|
@Mock
|
||||||
|
private lateinit var shadeControllerImpl: ShadeControllerImpl
|
||||||
|
@Mock
|
||||||
|
private lateinit var shadeLogger: ShadeLogger
|
||||||
|
@Mock
|
||||||
private lateinit var viewUtil: ViewUtil
|
private lateinit var viewUtil: ViewUtil
|
||||||
|
|
||||||
private lateinit var view: PhoneStatusBarView
|
private lateinit var view: PhoneStatusBarView
|
||||||
@@ -87,18 +94,6 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun constructor_setsTouchHandlerOnView() {
|
|
||||||
val interceptEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 10f, 10f, 0)
|
|
||||||
val event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
|
|
||||||
|
|
||||||
view.onInterceptTouchEvent(interceptEvent)
|
|
||||||
view.onTouchEvent(event)
|
|
||||||
|
|
||||||
assertThat(touchEventHandler.lastInterceptEvent).isEqualTo(interceptEvent)
|
|
||||||
assertThat(touchEventHandler.lastEvent).isEqualTo(event)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun onViewAttachedAndDrawn_moveFromCenterAnimationEnabled_moveFromCenterAnimationInitialized() {
|
fun onViewAttachedAndDrawn_moveFromCenterAnimationEnabled_moveFromCenterAnimationInitialized() {
|
||||||
val view = createViewMock()
|
val view = createViewMock()
|
||||||
@@ -115,6 +110,66 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
|
|||||||
verify(moveFromCenterAnimation).onViewsReady(any())
|
verify(moveFromCenterAnimation).onViewsReady(any())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun handleTouchEventFromStatusBar_panelsNotEnabled_returnsFalseAndNoViewEvent() {
|
||||||
|
`when`(centralSurfacesImpl.commandQueuePanelsEnabled).thenReturn(false)
|
||||||
|
val returnVal = view.onTouchEvent(
|
||||||
|
MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0))
|
||||||
|
assertThat(returnVal).isFalse()
|
||||||
|
verify(notificationPanelViewController, never()).sendTouchEventToView(any())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun handleTouchEventFromStatusBar_viewNotEnabled_returnsTrueAndNoViewEvent() {
|
||||||
|
`when`(centralSurfacesImpl.commandQueuePanelsEnabled).thenReturn(true)
|
||||||
|
`when`(centralSurfacesImpl.notificationPanelViewController)
|
||||||
|
.thenReturn(notificationPanelViewController)
|
||||||
|
`when`(notificationPanelViewController.isViewEnabled).thenReturn(false)
|
||||||
|
val returnVal = view.onTouchEvent(
|
||||||
|
MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0))
|
||||||
|
assertThat(returnVal).isTrue()
|
||||||
|
verify(notificationPanelViewController, never()).sendTouchEventToView(any())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun handleTouchEventFromStatusBar_viewNotEnabledButIsMoveEvent_viewReceivesEvent() {
|
||||||
|
`when`(centralSurfacesImpl.commandQueuePanelsEnabled).thenReturn(true)
|
||||||
|
`when`(centralSurfacesImpl.notificationPanelViewController)
|
||||||
|
.thenReturn(notificationPanelViewController)
|
||||||
|
`when`(notificationPanelViewController.isViewEnabled).thenReturn(false)
|
||||||
|
val event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0)
|
||||||
|
|
||||||
|
view.onTouchEvent(event)
|
||||||
|
|
||||||
|
verify(notificationPanelViewController).sendTouchEventToView(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun handleTouchEventFromStatusBar_panelAndViewEnabled_viewReceivesEvent() {
|
||||||
|
`when`(centralSurfacesImpl.commandQueuePanelsEnabled).thenReturn(true)
|
||||||
|
`when`(centralSurfacesImpl.notificationPanelViewController)
|
||||||
|
.thenReturn(notificationPanelViewController)
|
||||||
|
`when`(notificationPanelViewController.isViewEnabled).thenReturn(true)
|
||||||
|
val event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 2f, 0)
|
||||||
|
|
||||||
|
view.onTouchEvent(event)
|
||||||
|
|
||||||
|
verify(notificationPanelViewController).sendTouchEventToView(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun handleTouchEventFromStatusBar_topEdgeTouch_viewNeverReceivesEvent() {
|
||||||
|
`when`(centralSurfacesImpl.commandQueuePanelsEnabled).thenReturn(true)
|
||||||
|
`when`(centralSurfacesImpl.notificationPanelViewController)
|
||||||
|
.thenReturn(notificationPanelViewController)
|
||||||
|
`when`(notificationPanelViewController.isFullyCollapsed).thenReturn(true)
|
||||||
|
val event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
|
||||||
|
|
||||||
|
view.onTouchEvent(event)
|
||||||
|
|
||||||
|
verify(notificationPanelViewController, never()).sendTouchEventToView(any())
|
||||||
|
}
|
||||||
|
|
||||||
private fun createViewMock(): PhoneStatusBarView {
|
private fun createViewMock(): PhoneStatusBarView {
|
||||||
val view = spy(view)
|
val view = spy(view)
|
||||||
val viewTreeObserver = mock(ViewTreeObserver::class.java)
|
val viewTreeObserver = mock(ViewTreeObserver::class.java)
|
||||||
@@ -128,9 +183,12 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
|
|||||||
Optional.of(sysuiUnfoldComponent),
|
Optional.of(sysuiUnfoldComponent),
|
||||||
Optional.of(progressProvider),
|
Optional.of(progressProvider),
|
||||||
userChipViewModel,
|
userChipViewModel,
|
||||||
|
centralSurfacesImpl,
|
||||||
|
shadeControllerImpl,
|
||||||
|
shadeLogger,
|
||||||
viewUtil,
|
viewUtil,
|
||||||
configurationController
|
configurationController
|
||||||
).create(view, touchEventHandler).also {
|
).create(view).also {
|
||||||
it.init()
|
it.init()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,17 +198,4 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
|
|||||||
override var isHingeAngleEnabled: Boolean = false
|
override var isHingeAngleEnabled: Boolean = false
|
||||||
override val halfFoldedTimeoutMillis: Int = 0
|
override val halfFoldedTimeoutMillis: Int = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
private class TestTouchEventHandler : PhoneStatusBarView.TouchEventHandler {
|
|
||||||
var lastEvent: MotionEvent? = null
|
|
||||||
var lastInterceptEvent: MotionEvent? = null
|
|
||||||
|
|
||||||
override fun onInterceptTouchEvent(event: MotionEvent?) {
|
|
||||||
lastInterceptEvent = event
|
|
||||||
}
|
|
||||||
override fun handleTouchEvent(event: MotionEvent?): Boolean {
|
|
||||||
lastEvent = event
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user