Loading packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java +11 −15 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.graphics.Rect; import android.graphics.Region; import android.util.DisplayMetrics; import android.util.Log; import android.view.GestureDetector; import android.view.InputEvent; Loading Loading @@ -89,8 +88,6 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { private final FlingAnimationUtils mFlingAnimationUtils; private final FlingAnimationUtils mFlingAnimationUtilsClosing; private final DisplayMetrics mDisplayMetrics; private Boolean mCapture; private Boolean mExpanded; Loading Loading @@ -161,7 +158,7 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { // (0). final float dragDownAmount = e2.getY() - e1.getY(); final float screenTravelPercentage = Math.abs(e1.getY() - e2.getY()) / mCentralSurfaces.get().getDisplayHeight(); / mTouchSession.getBounds().height(); setPanelExpansion(mBouncerInitiallyShowing ? screenTravelPercentage : 1 - screenTravelPercentage, dragDownAmount); return true; Loading Loading @@ -202,7 +199,6 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { @Inject public BouncerSwipeTouchHandler( DisplayMetrics displayMetrics, ScrimManager scrimManager, Optional<CentralSurfaces> centralSurfaces, NotificationShadeWindowController notificationShadeWindowController, Loading @@ -214,7 +210,6 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { FlingAnimationUtils flingAnimationUtilsClosing, @Named(SWIPE_TO_BOUNCER_START_REGION) float swipeRegionPercentage, UiEventLogger uiEventLogger) { mDisplayMetrics = displayMetrics; mCentralSurfaces = centralSurfaces; mScrimManager = scrimManager; mNotificationShadeWindowController = notificationShadeWindowController; Loading @@ -227,19 +222,20 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { } @Override public void getTouchInitiationRegion(Region region) { public void getTouchInitiationRegion(Rect bounds, Region region) { final int width = bounds.width(); final int height = bounds.height(); if (mCentralSurfaces.map(CentralSurfaces::isBouncerShowing).orElse(false)) { region.op(new Rect(0, 0, mDisplayMetrics.widthPixels, region.op(new Rect(0, 0, width, Math.round( mDisplayMetrics.heightPixels * mBouncerZoneScreenPercentage)), height * mBouncerZoneScreenPercentage)), Region.Op.UNION); } else { region.op(new Rect(0, Math.round( mDisplayMetrics.heightPixels * (1 - mBouncerZoneScreenPercentage)), mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels), Math.round(height * (1 - mBouncerZoneScreenPercentage)), width, height), Region.Op.UNION); } } Loading Loading @@ -356,7 +352,7 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { } // The animation utils deal in pixel units, rather than expansion height. final float viewHeight = mCentralSurfaces.get().getDisplayHeight(); final float viewHeight = mTouchSession.getBounds().height(); final float currentHeight = viewHeight * mCurrentExpansion; final float targetHeight = viewHeight * expansion; final float expansionHeight = targetHeight - currentHeight; Loading packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java +24 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,9 @@ package com.android.systemui.dreams.touch; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import android.graphics.Rect; import android.graphics.Region; import android.view.GestureDetector; import android.view.InputEvent; Loading @@ -31,6 +34,7 @@ import androidx.lifecycle.LifecycleOwner; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dreams.touch.dagger.InputSessionComponent; import com.android.systemui.shared.system.InputChannelCompat; import com.android.systemui.util.display.DisplayHelper; import com.google.common.util.concurrent.ListenableFuture; Loading Loading @@ -69,7 +73,8 @@ public class DreamOverlayTouchMonitor { } final TouchSessionImpl touchSession = new TouchSessionImpl(this, touchSessionImpl); new TouchSessionImpl(this, touchSessionImpl.getBounds(), touchSessionImpl); mActiveTouchSessions.add(touchSession); completer.set(touchSession); }); Loading Loading @@ -120,10 +125,13 @@ public class DreamOverlayTouchMonitor { private final TouchSessionImpl mPredecessor; private final DreamOverlayTouchMonitor mTouchMonitor; private final Rect mBounds; TouchSessionImpl(DreamOverlayTouchMonitor touchMonitor, TouchSessionImpl predecessor) { TouchSessionImpl(DreamOverlayTouchMonitor touchMonitor, Rect bounds, TouchSessionImpl predecessor) { mPredecessor = predecessor; mTouchMonitor = touchMonitor; mBounds = bounds; } @Override Loading Loading @@ -185,6 +193,11 @@ public class DreamOverlayTouchMonitor { private void onRemoved() { mCallbacks.forEach(callback -> callback.onRemoved()); } @Override public Rect getBounds() { return mBounds; } } /** Loading Loading @@ -242,6 +255,7 @@ public class DreamOverlayTouchMonitor { private final HashSet<TouchSessionImpl> mActiveTouchSessions = new HashSet<>(); private final Collection<DreamTouchHandler> mHandlers; private final DisplayHelper mDisplayHelper; private InputChannelCompat.InputEventListener mInputEventListener = new InputChannelCompat.InputEventListener() { Loading @@ -253,8 +267,11 @@ public class DreamOverlayTouchMonitor { new HashMap<>(); for (DreamTouchHandler handler : mHandlers) { final Rect maxBounds = mDisplayHelper.getMaxBounds(ev.getDisplayId(), TYPE_APPLICATION_OVERLAY); final Region initiationRegion = Region.obtain(); handler.getTouchInitiationRegion(initiationRegion); handler.getTouchInitiationRegion(maxBounds, initiationRegion); if (!initiationRegion.isEmpty()) { // Initiation regions require a motion event to determine pointer location Loading @@ -272,8 +289,8 @@ public class DreamOverlayTouchMonitor { } } final TouchSessionImpl sessionStack = new TouchSessionImpl(DreamOverlayTouchMonitor.this, null); final TouchSessionImpl sessionStack = new TouchSessionImpl( DreamOverlayTouchMonitor.this, maxBounds, null); mActiveTouchSessions.add(sessionStack); sessionMap.put(handler, sessionStack); } Loading Loading @@ -389,11 +406,13 @@ public class DreamOverlayTouchMonitor { @Main Executor executor, Lifecycle lifecycle, InputSessionComponent.Factory inputSessionFactory, DisplayHelper displayHelper, Set<DreamTouchHandler> handlers) { mHandlers = handlers; mInputSessionFactory = inputSessionFactory; mExecutor = executor; mLifecycle = lifecycle; mDisplayHelper = displayHelper; } /** Loading packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java +7 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.dreams.touch; import android.graphics.Rect; import android.graphics.Region; import android.view.GestureDetector; Loading Loading @@ -77,6 +78,11 @@ public interface DreamTouchHandler { * Returns the number of currently active sessions. */ int getActiveSessionCount(); /** * Returns the bounds of the display the touch region. */ Rect getBounds(); } /** Loading @@ -84,7 +90,7 @@ public interface DreamTouchHandler { * indicating the entire screen should be considered. * @param region A {@link Region} that is passed in to the target entry touch region. */ default void getTouchInitiationRegion(Region region) { default void getTouchInitiationRegion(Rect bounds, Region region) { } /** Loading packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java +4 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.graphics.Region; import android.util.Log; import android.view.AttachedSurfaceControl; import android.view.View; import android.view.ViewGroup; import androidx.concurrent.futures.CallbackToFutureAdapter; Loading Loading @@ -118,7 +119,9 @@ public class TouchInsetManager { affectedSurfaces.put(surface, Region.obtain()); } final Rect boundaries = new Rect(); view.getBoundsOnScreen(boundaries); view.getDrawingRect(boundaries); ((ViewGroup) view.getRootView()) .offsetDescendantRectToMyCoords(view, boundaries); affectedSurfaces.get(surface).op(boundaries, Region.Op.UNION); }); mManager.setTouchRegions(this, affectedSurfaces); Loading packages/SystemUI/src/com/android/systemui/util/display/DisplayHelper.java 0 → 100644 +53 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.util.display; import android.content.Context; import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.view.Display; import android.view.WindowManager; import javax.inject.Inject; /** * Utility class for working with displays. */ public class DisplayHelper { private final Context mContext; private final DisplayManager mDisplayManager; /** * Default constructor. */ @Inject public DisplayHelper(Context context, DisplayManager displayManager) { mContext = context; mDisplayManager = displayManager; } /** * Returns the maximum display bounds for the given window context type. */ public Rect getMaxBounds(int displayId, int windowContextType) { final Display display = mDisplayManager.getDisplay(displayId); WindowManager windowManager = mContext.createDisplayContext(display) .createWindowContext(windowContextType, null) .getSystemService(WindowManager.class); return windowManager.getMaximumWindowMetrics().getBounds(); } } Loading
packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java +11 −15 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.graphics.Rect; import android.graphics.Region; import android.util.DisplayMetrics; import android.util.Log; import android.view.GestureDetector; import android.view.InputEvent; Loading Loading @@ -89,8 +88,6 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { private final FlingAnimationUtils mFlingAnimationUtils; private final FlingAnimationUtils mFlingAnimationUtilsClosing; private final DisplayMetrics mDisplayMetrics; private Boolean mCapture; private Boolean mExpanded; Loading Loading @@ -161,7 +158,7 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { // (0). final float dragDownAmount = e2.getY() - e1.getY(); final float screenTravelPercentage = Math.abs(e1.getY() - e2.getY()) / mCentralSurfaces.get().getDisplayHeight(); / mTouchSession.getBounds().height(); setPanelExpansion(mBouncerInitiallyShowing ? screenTravelPercentage : 1 - screenTravelPercentage, dragDownAmount); return true; Loading Loading @@ -202,7 +199,6 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { @Inject public BouncerSwipeTouchHandler( DisplayMetrics displayMetrics, ScrimManager scrimManager, Optional<CentralSurfaces> centralSurfaces, NotificationShadeWindowController notificationShadeWindowController, Loading @@ -214,7 +210,6 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { FlingAnimationUtils flingAnimationUtilsClosing, @Named(SWIPE_TO_BOUNCER_START_REGION) float swipeRegionPercentage, UiEventLogger uiEventLogger) { mDisplayMetrics = displayMetrics; mCentralSurfaces = centralSurfaces; mScrimManager = scrimManager; mNotificationShadeWindowController = notificationShadeWindowController; Loading @@ -227,19 +222,20 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { } @Override public void getTouchInitiationRegion(Region region) { public void getTouchInitiationRegion(Rect bounds, Region region) { final int width = bounds.width(); final int height = bounds.height(); if (mCentralSurfaces.map(CentralSurfaces::isBouncerShowing).orElse(false)) { region.op(new Rect(0, 0, mDisplayMetrics.widthPixels, region.op(new Rect(0, 0, width, Math.round( mDisplayMetrics.heightPixels * mBouncerZoneScreenPercentage)), height * mBouncerZoneScreenPercentage)), Region.Op.UNION); } else { region.op(new Rect(0, Math.round( mDisplayMetrics.heightPixels * (1 - mBouncerZoneScreenPercentage)), mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels), Math.round(height * (1 - mBouncerZoneScreenPercentage)), width, height), Region.Op.UNION); } } Loading Loading @@ -356,7 +352,7 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { } // The animation utils deal in pixel units, rather than expansion height. final float viewHeight = mCentralSurfaces.get().getDisplayHeight(); final float viewHeight = mTouchSession.getBounds().height(); final float currentHeight = viewHeight * mCurrentExpansion; final float targetHeight = viewHeight * expansion; final float expansionHeight = targetHeight - currentHeight; Loading
packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java +24 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,9 @@ package com.android.systemui.dreams.touch; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import android.graphics.Rect; import android.graphics.Region; import android.view.GestureDetector; import android.view.InputEvent; Loading @@ -31,6 +34,7 @@ import androidx.lifecycle.LifecycleOwner; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dreams.touch.dagger.InputSessionComponent; import com.android.systemui.shared.system.InputChannelCompat; import com.android.systemui.util.display.DisplayHelper; import com.google.common.util.concurrent.ListenableFuture; Loading Loading @@ -69,7 +73,8 @@ public class DreamOverlayTouchMonitor { } final TouchSessionImpl touchSession = new TouchSessionImpl(this, touchSessionImpl); new TouchSessionImpl(this, touchSessionImpl.getBounds(), touchSessionImpl); mActiveTouchSessions.add(touchSession); completer.set(touchSession); }); Loading Loading @@ -120,10 +125,13 @@ public class DreamOverlayTouchMonitor { private final TouchSessionImpl mPredecessor; private final DreamOverlayTouchMonitor mTouchMonitor; private final Rect mBounds; TouchSessionImpl(DreamOverlayTouchMonitor touchMonitor, TouchSessionImpl predecessor) { TouchSessionImpl(DreamOverlayTouchMonitor touchMonitor, Rect bounds, TouchSessionImpl predecessor) { mPredecessor = predecessor; mTouchMonitor = touchMonitor; mBounds = bounds; } @Override Loading Loading @@ -185,6 +193,11 @@ public class DreamOverlayTouchMonitor { private void onRemoved() { mCallbacks.forEach(callback -> callback.onRemoved()); } @Override public Rect getBounds() { return mBounds; } } /** Loading Loading @@ -242,6 +255,7 @@ public class DreamOverlayTouchMonitor { private final HashSet<TouchSessionImpl> mActiveTouchSessions = new HashSet<>(); private final Collection<DreamTouchHandler> mHandlers; private final DisplayHelper mDisplayHelper; private InputChannelCompat.InputEventListener mInputEventListener = new InputChannelCompat.InputEventListener() { Loading @@ -253,8 +267,11 @@ public class DreamOverlayTouchMonitor { new HashMap<>(); for (DreamTouchHandler handler : mHandlers) { final Rect maxBounds = mDisplayHelper.getMaxBounds(ev.getDisplayId(), TYPE_APPLICATION_OVERLAY); final Region initiationRegion = Region.obtain(); handler.getTouchInitiationRegion(initiationRegion); handler.getTouchInitiationRegion(maxBounds, initiationRegion); if (!initiationRegion.isEmpty()) { // Initiation regions require a motion event to determine pointer location Loading @@ -272,8 +289,8 @@ public class DreamOverlayTouchMonitor { } } final TouchSessionImpl sessionStack = new TouchSessionImpl(DreamOverlayTouchMonitor.this, null); final TouchSessionImpl sessionStack = new TouchSessionImpl( DreamOverlayTouchMonitor.this, maxBounds, null); mActiveTouchSessions.add(sessionStack); sessionMap.put(handler, sessionStack); } Loading Loading @@ -389,11 +406,13 @@ public class DreamOverlayTouchMonitor { @Main Executor executor, Lifecycle lifecycle, InputSessionComponent.Factory inputSessionFactory, DisplayHelper displayHelper, Set<DreamTouchHandler> handlers) { mHandlers = handlers; mInputSessionFactory = inputSessionFactory; mExecutor = executor; mLifecycle = lifecycle; mDisplayHelper = displayHelper; } /** Loading
packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java +7 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.dreams.touch; import android.graphics.Rect; import android.graphics.Region; import android.view.GestureDetector; Loading Loading @@ -77,6 +78,11 @@ public interface DreamTouchHandler { * Returns the number of currently active sessions. */ int getActiveSessionCount(); /** * Returns the bounds of the display the touch region. */ Rect getBounds(); } /** Loading @@ -84,7 +90,7 @@ public interface DreamTouchHandler { * indicating the entire screen should be considered. * @param region A {@link Region} that is passed in to the target entry touch region. */ default void getTouchInitiationRegion(Region region) { default void getTouchInitiationRegion(Rect bounds, Region region) { } /** Loading
packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java +4 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.graphics.Region; import android.util.Log; import android.view.AttachedSurfaceControl; import android.view.View; import android.view.ViewGroup; import androidx.concurrent.futures.CallbackToFutureAdapter; Loading Loading @@ -118,7 +119,9 @@ public class TouchInsetManager { affectedSurfaces.put(surface, Region.obtain()); } final Rect boundaries = new Rect(); view.getBoundsOnScreen(boundaries); view.getDrawingRect(boundaries); ((ViewGroup) view.getRootView()) .offsetDescendantRectToMyCoords(view, boundaries); affectedSurfaces.get(surface).op(boundaries, Region.Op.UNION); }); mManager.setTouchRegions(this, affectedSurfaces); Loading
packages/SystemUI/src/com/android/systemui/util/display/DisplayHelper.java 0 → 100644 +53 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.util.display; import android.content.Context; import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.view.Display; import android.view.WindowManager; import javax.inject.Inject; /** * Utility class for working with displays. */ public class DisplayHelper { private final Context mContext; private final DisplayManager mDisplayManager; /** * Default constructor. */ @Inject public DisplayHelper(Context context, DisplayManager displayManager) { mContext = context; mDisplayManager = displayManager; } /** * Returns the maximum display bounds for the given window context type. */ public Rect getMaxBounds(int displayId, int windowContextType) { final Display display = mDisplayManager.getDisplay(displayId); WindowManager windowManager = mContext.createDisplayContext(display) .createWindowContext(windowContextType, null) .getSystemService(WindowManager.class); return windowManager.getMaximumWindowMetrics().getBounds(); } }