Remove Dependency#get calls from NavigationBarView
Removes Dependency.get(EdgeBackGestureHandler.class) from NavigationBarview. Bug: 218354102 Test: manual && atest SystemUITests Change-Id: I956e943504966fcecfd3da477535937a2aba7a9d Merged-In: I956e943504966fcecfd3da477535937a2aba7a9d
This commit is contained in:
@@ -70,6 +70,7 @@ import android.graphics.Insets;
|
|||||||
import android.graphics.PixelFormat;
|
import android.graphics.PixelFormat;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
|
import android.graphics.Region;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -91,6 +92,8 @@ import android.view.MotionEvent;
|
|||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
|
import android.view.ViewTreeObserver.InternalInsetsInfo;
|
||||||
|
import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
|
||||||
import android.view.WindowInsetsController.Appearance;
|
import android.view.WindowInsetsController.Appearance;
|
||||||
import android.view.WindowInsetsController.Behavior;
|
import android.view.WindowInsetsController.Behavior;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
@@ -121,6 +124,7 @@ import com.android.systemui.navigationbar.buttons.ButtonDispatcher;
|
|||||||
import com.android.systemui.navigationbar.buttons.DeadZone;
|
import com.android.systemui.navigationbar.buttons.DeadZone;
|
||||||
import com.android.systemui.navigationbar.buttons.KeyButtonView;
|
import com.android.systemui.navigationbar.buttons.KeyButtonView;
|
||||||
import com.android.systemui.navigationbar.buttons.RotationContextButton;
|
import com.android.systemui.navigationbar.buttons.RotationContextButton;
|
||||||
|
import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
|
||||||
import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle;
|
import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle;
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||||
import com.android.systemui.recents.OverviewProxyService;
|
import com.android.systemui.recents.OverviewProxyService;
|
||||||
@@ -153,6 +157,7 @@ import com.android.wm.shell.pip.Pip;
|
|||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@@ -199,12 +204,14 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
private final Optional<Recents> mRecentsOptional;
|
private final Optional<Recents> mRecentsOptional;
|
||||||
private final DeviceConfigProxy mDeviceConfigProxy;
|
private final DeviceConfigProxy mDeviceConfigProxy;
|
||||||
private final NavigationBarTransitions mNavigationBarTransitions;
|
private final NavigationBarTransitions mNavigationBarTransitions;
|
||||||
|
private final EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||||
private final Optional<BackAnimation> mBackAnimation;
|
private final Optional<BackAnimation> mBackAnimation;
|
||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
private final UiEventLogger mUiEventLogger;
|
private final UiEventLogger mUiEventLogger;
|
||||||
private final NavBarHelper mNavBarHelper;
|
private final NavBarHelper mNavBarHelper;
|
||||||
private final NotificationShadeDepthController mNotificationShadeDepthController;
|
private final NotificationShadeDepthController mNotificationShadeDepthController;
|
||||||
private final UserContextProvider mUserContextProvider;
|
private final UserContextProvider mUserContextProvider;
|
||||||
|
private final OnComputeInternalInsetsListener mOnComputeInternalInsetsListener;
|
||||||
private NavigationBarFrame mFrame;
|
private NavigationBarFrame mFrame;
|
||||||
|
|
||||||
private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
|
private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
|
||||||
@@ -516,6 +523,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
DeadZone deadZone,
|
DeadZone deadZone,
|
||||||
DeviceConfigProxy deviceConfigProxy,
|
DeviceConfigProxy deviceConfigProxy,
|
||||||
NavigationBarTransitions navigationBarTransitions,
|
NavigationBarTransitions navigationBarTransitions,
|
||||||
|
EdgeBackGestureHandler edgeBackGestureHandler,
|
||||||
Optional<BackAnimation> backAnimation,
|
Optional<BackAnimation> backAnimation,
|
||||||
UserContextProvider userContextProvider) {
|
UserContextProvider userContextProvider) {
|
||||||
super(navigationBarView);
|
super(navigationBarView);
|
||||||
@@ -542,6 +550,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mDeadZone = deadZone;
|
mDeadZone = deadZone;
|
||||||
mDeviceConfigProxy = deviceConfigProxy;
|
mDeviceConfigProxy = deviceConfigProxy;
|
||||||
mNavigationBarTransitions = navigationBarTransitions;
|
mNavigationBarTransitions = navigationBarTransitions;
|
||||||
|
mEdgeBackGestureHandler = edgeBackGestureHandler;
|
||||||
mBackAnimation = backAnimation;
|
mBackAnimation = backAnimation;
|
||||||
mHandler = mainHandler;
|
mHandler = mainHandler;
|
||||||
mUiEventLogger = uiEventLogger;
|
mUiEventLogger = uiEventLogger;
|
||||||
@@ -555,6 +564,29 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mInputMethodManager = inputMethodManager;
|
mInputMethodManager = inputMethodManager;
|
||||||
mUserContextProvider = userContextProvider;
|
mUserContextProvider = userContextProvider;
|
||||||
|
|
||||||
|
mOnComputeInternalInsetsListener = info -> {
|
||||||
|
// When the nav bar is in 2-button or 3-button mode, or when IME is visible in fully
|
||||||
|
// gestural mode, the entire nav bar should be touchable.
|
||||||
|
if (!mEdgeBackGestureHandler.isHandlingGestures()) {
|
||||||
|
// We're in 2/3 button mode OR back button force-shown in SUW
|
||||||
|
if (!mImeVisible) {
|
||||||
|
// IME not showing, take all touches
|
||||||
|
info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME);
|
||||||
|
}
|
||||||
|
if (!mView.isImeRenderingNavButtons()) {
|
||||||
|
// IME showing but not drawing any buttons, take all touches
|
||||||
|
info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// When in gestural and the IME is showing, don't use the nearest region since it will
|
||||||
|
// take gesture space away from the IME
|
||||||
|
info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
|
||||||
|
info.touchableRegion.set(getButtonLocations(false /* includeFloatingButtons */,
|
||||||
|
false /* inScreen */, false /* useNearestRegion */));
|
||||||
|
};
|
||||||
|
|
||||||
|
mView.setEdgeBackGestureHandler(mEdgeBackGestureHandler);
|
||||||
mNavBarMode = mNavigationModeController.addListener(mModeChangedListener);
|
mNavBarMode = mNavigationModeController.addListener(mModeChangedListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,6 +601,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mView.setBarTransitions(mNavigationBarTransitions);
|
mView.setBarTransitions(mNavigationBarTransitions);
|
||||||
mView.setTouchHandler(mTouchHandler);
|
mView.setTouchHandler(mTouchHandler);
|
||||||
mView.setNavBarMode(mNavBarMode);
|
mView.setNavBarMode(mNavBarMode);
|
||||||
|
mEdgeBackGestureHandler.setStateChangeCallback(mView::updateStates);
|
||||||
mView.updateRotationButton();
|
mView.updateRotationButton();
|
||||||
|
|
||||||
mView.setVisibility(
|
mView.setVisibility(
|
||||||
@@ -646,11 +679,14 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mView.setNavBarMode(mNavBarMode);
|
mView.setNavBarMode(mNavBarMode);
|
||||||
mView.setUpdateActiveTouchRegionsCallback(
|
mView.setUpdateActiveTouchRegionsCallback(
|
||||||
() -> mOverviewProxyService.onActiveNavBarRegionChanges(
|
() -> mOverviewProxyService.onActiveNavBarRegionChanges(
|
||||||
mView.getButtonLocations(
|
getButtonLocations(
|
||||||
true /* includeFloatingButtons */,
|
true /* includeFloatingButtons */,
|
||||||
true /* inScreen */,
|
true /* inScreen */,
|
||||||
true /* useNearestRegion */)));
|
true /* useNearestRegion */)));
|
||||||
|
|
||||||
|
mView.getViewTreeObserver().addOnComputeInternalInsetsListener(
|
||||||
|
mOnComputeInternalInsetsListener);
|
||||||
|
|
||||||
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
|
|
||||||
mPipOptional.ifPresent(mView::addPipExclusionBoundsChangeListener);
|
mPipOptional.ifPresent(mView::addPipExclusionBoundsChangeListener);
|
||||||
@@ -721,6 +757,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mOrientationHandle.getViewTreeObserver().removeOnGlobalLayoutListener(
|
mOrientationHandle.getViewTreeObserver().removeOnGlobalLayoutListener(
|
||||||
mOrientationHandleGlobalLayoutListener);
|
mOrientationHandleGlobalLayoutListener);
|
||||||
}
|
}
|
||||||
|
mView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
|
||||||
|
mOnComputeInternalInsetsListener);
|
||||||
mHandler.removeCallbacks(mAutoDim);
|
mHandler.removeCallbacks(mAutoDim);
|
||||||
mHandler.removeCallbacks(mOnVariableDurationHomeLongClick);
|
mHandler.removeCallbacks(mOnVariableDurationHomeLongClick);
|
||||||
mHandler.removeCallbacks(mEnableLayoutTransitions);
|
mHandler.removeCallbacks(mEnableLayoutTransitions);
|
||||||
@@ -1044,8 +1082,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleTransientChanged() {
|
private void handleTransientChanged() {
|
||||||
mView.onTransientStateChanged(mTransientShown,
|
mEdgeBackGestureHandler.onNavBarTransientStateChanged(mTransientShown);
|
||||||
mTransientShownFromGestureOnSystemBar);
|
|
||||||
final int transitionMode = transitionMode(mTransientShown, mAppearance);
|
final int transitionMode = transitionMode(mTransientShown, mAppearance);
|
||||||
if (updateTransitionMode(transitionMode) && mLightBarController != null) {
|
if (updateTransitionMode(transitionMode) && mLightBarController != null) {
|
||||||
mLightBarController.onNavigationBarModeChanged(transitionMode);
|
mLightBarController.onNavigationBarModeChanged(transitionMode);
|
||||||
@@ -1639,6 +1677,79 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mNavigationIconHints = hints;
|
mNavigationIconHints = hints;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param includeFloatingButtons Whether to include the floating rotation and overlay button in
|
||||||
|
* the region for all the buttons
|
||||||
|
* @param inScreenSpace Whether to return values in screen space or window space
|
||||||
|
* @param useNearestRegion Whether to use the nearest region instead of the actual button bounds
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Region getButtonLocations(boolean includeFloatingButtons, boolean inScreenSpace,
|
||||||
|
boolean useNearestRegion) {
|
||||||
|
if (useNearestRegion && !inScreenSpace) {
|
||||||
|
// We currently don't support getting the nearest region in anything but screen space
|
||||||
|
useNearestRegion = false;
|
||||||
|
}
|
||||||
|
Region region = new Region();
|
||||||
|
Map<View, Rect> touchRegionCache = mView.getButtonTouchRegionCache();
|
||||||
|
updateButtonLocation(
|
||||||
|
region, touchRegionCache, mView.getBackButton(), inScreenSpace, useNearestRegion);
|
||||||
|
updateButtonLocation(
|
||||||
|
region, touchRegionCache, mView.getHomeButton(), inScreenSpace, useNearestRegion);
|
||||||
|
updateButtonLocation(region, touchRegionCache, mView.getRecentsButton(), inScreenSpace,
|
||||||
|
useNearestRegion);
|
||||||
|
updateButtonLocation(region, touchRegionCache, mView.getImeSwitchButton(), inScreenSpace,
|
||||||
|
useNearestRegion);
|
||||||
|
updateButtonLocation(
|
||||||
|
region, touchRegionCache, mView.getAccessibilityButton(), inScreenSpace,
|
||||||
|
useNearestRegion);
|
||||||
|
if (includeFloatingButtons && mView.getFloatingRotationButton().isVisible()) {
|
||||||
|
// Note: this button is floating so the nearest region doesn't apply
|
||||||
|
updateButtonLocation(
|
||||||
|
region, mView.getFloatingRotationButton().getCurrentView(), inScreenSpace);
|
||||||
|
} else {
|
||||||
|
updateButtonLocation(region, touchRegionCache, mView.getRotateSuggestionButton(),
|
||||||
|
inScreenSpace, useNearestRegion);
|
||||||
|
}
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateButtonLocation(
|
||||||
|
Region region,
|
||||||
|
Map<View, Rect> touchRegionCache,
|
||||||
|
ButtonDispatcher button,
|
||||||
|
boolean inScreenSpace,
|
||||||
|
boolean useNearestRegion) {
|
||||||
|
if (button == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
View view = button.getCurrentView();
|
||||||
|
if (view == null || !button.isVisible()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// If the button is tappable from perspective of NearestTouchFrame, then we'll
|
||||||
|
// include the regions where the tap is valid instead of just the button layout location
|
||||||
|
if (useNearestRegion && touchRegionCache.containsKey(view)) {
|
||||||
|
region.op(touchRegionCache.get(view), Region.Op.UNION);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
updateButtonLocation(region, view, inScreenSpace);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateButtonLocation(Region region, View view, boolean inScreenSpace) {
|
||||||
|
Rect bounds = new Rect();
|
||||||
|
if (inScreenSpace) {
|
||||||
|
view.getBoundsOnScreen(bounds);
|
||||||
|
} else {
|
||||||
|
int[] location = new int[2];
|
||||||
|
view.getLocationInWindow(location);
|
||||||
|
bounds.set(location[0], location[1],
|
||||||
|
location[0] + view.getWidth(),
|
||||||
|
location[1] + view.getHeight());
|
||||||
|
}
|
||||||
|
region.op(bounds, Region.Op.UNION);
|
||||||
|
}
|
||||||
|
|
||||||
private final ModeChangedListener mModeChangedListener = new ModeChangedListener() {
|
private final ModeChangedListener mModeChangedListener = new ModeChangedListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onNavigationModeChanged(int mode) {
|
public void onNavigationModeChanged(int mode) {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import android.view.WindowManager;
|
|||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.dagger.qualifiers.DisplayId;
|
import com.android.systemui.dagger.qualifiers.DisplayId;
|
||||||
import com.android.systemui.navigationbar.NavigationBarComponent.NavigationBarScope;
|
import com.android.systemui.navigationbar.NavigationBarComponent.NavigationBarScope;
|
||||||
|
import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
|
||||||
|
|
||||||
import dagger.Module;
|
import dagger.Module;
|
||||||
import dagger.Provides;
|
import dagger.Provides;
|
||||||
@@ -55,6 +56,14 @@ public interface NavigationBarModule {
|
|||||||
return barView.findViewById(R.id.navigation_bar_view);
|
return barView.findViewById(R.id.navigation_bar_view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** */
|
||||||
|
@Provides
|
||||||
|
@NavigationBarScope
|
||||||
|
static EdgeBackGestureHandler provideEdgeBackGestureHandler(
|
||||||
|
EdgeBackGestureHandler.Factory factory, @DisplayId Context context) {
|
||||||
|
return factory.create(context);
|
||||||
|
}
|
||||||
|
|
||||||
/** A WindowManager specific to the display's context. */
|
/** A WindowManager specific to the display's context. */
|
||||||
@Provides
|
@Provides
|
||||||
@NavigationBarScope
|
@NavigationBarScope
|
||||||
|
|||||||
@@ -41,8 +41,6 @@ import android.content.res.Configuration;
|
|||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Point;
|
import android.graphics.Point;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.Region;
|
|
||||||
import android.graphics.Region.Op;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -53,8 +51,6 @@ import android.view.MotionEvent;
|
|||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.ViewTreeObserver.InternalInsetsInfo;
|
|
||||||
import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
|
|
||||||
import android.view.WindowInsets;
|
import android.view.WindowInsets;
|
||||||
import android.view.WindowInsetsController.Behavior;
|
import android.view.WindowInsetsController.Behavior;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
@@ -93,7 +89,6 @@ import com.android.wm.shell.back.BackAnimation;
|
|||||||
import com.android.wm.shell.pip.Pip;
|
import com.android.wm.shell.pip.Pip;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
@@ -123,11 +118,6 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
private int mNavBarMode;
|
private int mNavBarMode;
|
||||||
private boolean mImeDrawsImeNavBar;
|
private boolean mImeDrawsImeNavBar;
|
||||||
|
|
||||||
private final Region mTmpRegion = new Region();
|
|
||||||
private final int[] mTmpPosition = new int[2];
|
|
||||||
private Rect mTmpBounds = new Rect();
|
|
||||||
private Map<View, Rect> mButtonFullTouchableRegions = new HashMap<>();
|
|
||||||
|
|
||||||
private KeyButtonDrawable mBackIcon;
|
private KeyButtonDrawable mBackIcon;
|
||||||
private KeyButtonDrawable mHomeDefaultIcon;
|
private KeyButtonDrawable mHomeDefaultIcon;
|
||||||
private KeyButtonDrawable mRecentIcon;
|
private KeyButtonDrawable mRecentIcon;
|
||||||
@@ -138,7 +128,6 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
|
|
||||||
private EdgeBackGestureHandler mEdgeBackGestureHandler;
|
private EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||||
private final DeadZone mDeadZone;
|
private final DeadZone mDeadZone;
|
||||||
private boolean mDeadZoneConsuming = false;
|
|
||||||
private NavigationBarTransitions mBarTransitions;
|
private NavigationBarTransitions mBarTransitions;
|
||||||
@Nullable
|
@Nullable
|
||||||
private AutoHideController mAutoHideController;
|
private AutoHideController mAutoHideController;
|
||||||
@@ -152,7 +141,6 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
private boolean mUseCarModeUi = false;
|
private boolean mUseCarModeUi = false;
|
||||||
private boolean mInCarMode = false;
|
private boolean mInCarMode = false;
|
||||||
private boolean mDockedStackExists;
|
private boolean mDockedStackExists;
|
||||||
private boolean mImeVisible;
|
|
||||||
private boolean mScreenOn = true;
|
private boolean mScreenOn = true;
|
||||||
|
|
||||||
private final SparseArray<ButtonDispatcher> mButtonDispatchers = new SparseArray<>();
|
private final SparseArray<ButtonDispatcher> mButtonDispatchers = new SparseArray<>();
|
||||||
@@ -272,31 +260,6 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private final OnComputeInternalInsetsListener mOnComputeInternalInsetsListener = info -> {
|
|
||||||
// When the nav bar is in 2-button or 3-button mode, or when the back button is force-shown
|
|
||||||
// while in gesture nav in SUW, the entire nav bar should be touchable.
|
|
||||||
if (!mEdgeBackGestureHandler.isHandlingGestures()) {
|
|
||||||
// We're in 2/3 button mode OR back button force-shown in SUW
|
|
||||||
if (!mImeVisible) {
|
|
||||||
// IME not showing, take all touches
|
|
||||||
info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isImeRenderingNavButtons()) {
|
|
||||||
// IME showing but not drawing any buttons, take all touches
|
|
||||||
info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// When in gestural and the IME is showing, don't use the nearest region since it will take
|
|
||||||
// gesture space away from the IME
|
|
||||||
info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
|
|
||||||
info.touchableRegion.set(getButtonLocations(false /* includeFloatingButtons */,
|
|
||||||
false /* inScreen */, false /* useNearestRegion */));
|
|
||||||
};
|
|
||||||
|
|
||||||
private final RotationButtonUpdatesCallback mRotationButtonListener =
|
private final RotationButtonUpdatesCallback mRotationButtonListener =
|
||||||
new RotationButtonUpdatesCallback() {
|
new RotationButtonUpdatesCallback() {
|
||||||
@Override
|
@Override
|
||||||
@@ -315,13 +278,6 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private final Consumer<Boolean> mNavbarOverlayVisibilityChangeCallback = (visible) -> {
|
|
||||||
if (visible && mAutoHideController != null) {
|
|
||||||
mAutoHideController.touchAutoHide();
|
|
||||||
}
|
|
||||||
notifyActiveTouchRegions();
|
|
||||||
};
|
|
||||||
|
|
||||||
public NavigationBarView(Context context, AttributeSet attrs) {
|
public NavigationBarView(Context context, AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
|
|
||||||
@@ -380,9 +336,6 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
|
|
||||||
mNavColorSampleMargin = getResources()
|
mNavColorSampleMargin = getResources()
|
||||||
.getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
|
.getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
|
||||||
mEdgeBackGestureHandler = Dependency.get(EdgeBackGestureHandler.Factory.class)
|
|
||||||
.create(mContext);
|
|
||||||
mEdgeBackGestureHandler.setStateChangeCallback(this::updateStates);
|
|
||||||
Executor backgroundExecutor = Dependency.get(Dependency.BACKGROUND_EXECUTOR);
|
Executor backgroundExecutor = Dependency.get(Dependency.BACKGROUND_EXECUTOR);
|
||||||
mRegionSamplingHelper = new RegionSamplingHelper(this,
|
mRegionSamplingHelper = new RegionSamplingHelper(this,
|
||||||
new RegionSamplingHelper.SamplingCallback() {
|
new RegionSamplingHelper.SamplingCallback() {
|
||||||
@@ -409,6 +362,10 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
}, backgroundExecutor);
|
}, backgroundExecutor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setEdgeBackGestureHandler(EdgeBackGestureHandler edgeBackGestureHandler) {
|
||||||
|
mEdgeBackGestureHandler = edgeBackGestureHandler;
|
||||||
|
}
|
||||||
|
|
||||||
void setBarTransitions(NavigationBarTransitions navigationBarTransitions) {
|
void setBarTransitions(NavigationBarTransitions navigationBarTransitions) {
|
||||||
mBarTransitions = navigationBarTransitions;
|
mBarTransitions = navigationBarTransitions;
|
||||||
}
|
}
|
||||||
@@ -681,8 +638,7 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
if (!visible) {
|
if (!visible) {
|
||||||
mTransitionListener.onBackAltCleared();
|
mTransitionListener.onBackAltCleared();
|
||||||
}
|
}
|
||||||
mImeVisible = visible;
|
mRotationButtonController.getRotationButton().setCanShowRotationButton(!visible);
|
||||||
mRotationButtonController.getRotationButton().setCanShowRotationButton(!mImeVisible);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDisabledFlags(int disabledFlags, SysUiState sysUiState) {
|
void setDisabledFlags(int disabledFlags, SysUiState sysUiState) {
|
||||||
@@ -774,7 +730,7 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
/**
|
/**
|
||||||
* Returns whether the IME is currently visible and drawing the nav buttons.
|
* Returns whether the IME is currently visible and drawing the nav buttons.
|
||||||
*/
|
*/
|
||||||
private boolean isImeRenderingNavButtons() {
|
boolean isImeRenderingNavButtons() {
|
||||||
return mImeDrawsImeNavBar
|
return mImeDrawsImeNavBar
|
||||||
&& mImeCanRenderGesturalNavButtons
|
&& mImeCanRenderGesturalNavButtons
|
||||||
&& (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0;
|
&& (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0;
|
||||||
@@ -1003,75 +959,14 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
notifyActiveTouchRegions();
|
notifyActiveTouchRegions();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateButtonTouchRegionCache() {
|
Map<View, Rect> getButtonTouchRegionCache() {
|
||||||
FrameLayout navBarLayout = mIsVertical
|
FrameLayout navBarLayout = mIsVertical
|
||||||
? mNavigationInflaterView.mVertical
|
? mNavigationInflaterView.mVertical
|
||||||
: mNavigationInflaterView.mHorizontal;
|
: mNavigationInflaterView.mHorizontal;
|
||||||
mButtonFullTouchableRegions = ((NearestTouchFrame) navBarLayout
|
return ((NearestTouchFrame) navBarLayout
|
||||||
.findViewById(R.id.nav_buttons)).getFullTouchableChildRegions();
|
.findViewById(R.id.nav_buttons)).getFullTouchableChildRegions();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param includeFloatingButtons Whether to include the floating rotation and overlay button in
|
|
||||||
* the region for all the buttons
|
|
||||||
* @param inScreenSpace Whether to return values in screen space or window space
|
|
||||||
* @param useNearestRegion Whether to use the nearest region instead of the actual button bounds
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
Region getButtonLocations(boolean includeFloatingButtons, boolean inScreenSpace,
|
|
||||||
boolean useNearestRegion) {
|
|
||||||
// TODO: move this method to NavigationBar.
|
|
||||||
// TODO: don't use member variables for temp storage like mTmpRegion.
|
|
||||||
if (useNearestRegion && !inScreenSpace) {
|
|
||||||
// We currently don't support getting the nearest region in anything but screen space
|
|
||||||
useNearestRegion = false;
|
|
||||||
}
|
|
||||||
mTmpRegion.setEmpty();
|
|
||||||
updateButtonTouchRegionCache();
|
|
||||||
updateButtonLocation(getBackButton(), inScreenSpace, useNearestRegion);
|
|
||||||
updateButtonLocation(getHomeButton(), inScreenSpace, useNearestRegion);
|
|
||||||
updateButtonLocation(getRecentsButton(), inScreenSpace, useNearestRegion);
|
|
||||||
updateButtonLocation(getImeSwitchButton(), inScreenSpace, useNearestRegion);
|
|
||||||
updateButtonLocation(getAccessibilityButton(), inScreenSpace, useNearestRegion);
|
|
||||||
if (includeFloatingButtons && mFloatingRotationButton.isVisible()) {
|
|
||||||
// Note: this button is floating so the nearest region doesn't apply
|
|
||||||
updateButtonLocation(mFloatingRotationButton.getCurrentView(), inScreenSpace);
|
|
||||||
} else {
|
|
||||||
updateButtonLocation(getRotateSuggestionButton(), inScreenSpace, useNearestRegion);
|
|
||||||
}
|
|
||||||
return mTmpRegion;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateButtonLocation(ButtonDispatcher button, boolean inScreenSpace,
|
|
||||||
boolean useNearestRegion) {
|
|
||||||
if (button == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
View view = button.getCurrentView();
|
|
||||||
if (view == null || !button.isVisible()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// If the button is tappable from perspective of NearestTouchFrame, then we'll
|
|
||||||
// include the regions where the tap is valid instead of just the button layout location
|
|
||||||
if (useNearestRegion && mButtonFullTouchableRegions.containsKey(view)) {
|
|
||||||
mTmpRegion.op(mButtonFullTouchableRegions.get(view), Op.UNION);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
updateButtonLocation(view, inScreenSpace);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateButtonLocation(View view, boolean inScreenSpace) {
|
|
||||||
if (inScreenSpace) {
|
|
||||||
view.getBoundsOnScreen(mTmpBounds);
|
|
||||||
} else {
|
|
||||||
view.getLocationInWindow(mTmpPosition);
|
|
||||||
mTmpBounds.set(mTmpPosition[0], mTmpPosition[1],
|
|
||||||
mTmpPosition[0] + view.getWidth(),
|
|
||||||
mTmpPosition[1] + view.getHeight());
|
|
||||||
}
|
|
||||||
mTmpRegion.op(mTmpBounds, Op.UNION);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateOrientationViews() {
|
private void updateOrientationViews() {
|
||||||
mHorizontal = findViewById(R.id.horizontal);
|
mHorizontal = findViewById(R.id.horizontal);
|
||||||
mVertical = findViewById(R.id.vertical);
|
mVertical = findViewById(R.id.vertical);
|
||||||
@@ -1272,7 +1167,6 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
mRotationButtonController.registerListeners();
|
mRotationButtonController.registerListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
getViewTreeObserver().addOnComputeInternalInsetsListener(mOnComputeInternalInsetsListener);
|
|
||||||
updateNavButtonIcons();
|
updateNavButtonIcons();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1288,8 +1182,6 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mEdgeBackGestureHandler.onNavBarDetached();
|
mEdgeBackGestureHandler.onNavBarDetached();
|
||||||
getViewTreeObserver().removeOnComputeInternalInsetsListener(
|
|
||||||
mOnComputeInternalInsetsListener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dump(PrintWriter pw) {
|
public void dump(PrintWriter pw) {
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ import android.view.Display;
|
|||||||
import android.view.DisplayInfo;
|
import android.view.DisplayInfo;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.ViewTreeObserver;
|
||||||
import android.view.WindowInsets;
|
import android.view.WindowInsets;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.view.WindowMetrics;
|
import android.view.WindowMetrics;
|
||||||
@@ -164,7 +165,7 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
@Mock
|
@Mock
|
||||||
private UiEventLogger mUiEventLogger;
|
private UiEventLogger mUiEventLogger;
|
||||||
@Mock
|
@Mock
|
||||||
EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory;
|
private ViewTreeObserver mViewTreeObserver;
|
||||||
@Mock
|
@Mock
|
||||||
EdgeBackGestureHandler mEdgeBackGestureHandler;
|
EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||||
NavBarHelper mNavBarHelper;
|
NavBarHelper mNavBarHelper;
|
||||||
@@ -199,8 +200,6 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
public void setup() throws Exception {
|
public void setup() throws Exception {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
when(mEdgeBackGestureHandlerFactory.create(any(Context.class)))
|
|
||||||
.thenReturn(mEdgeBackGestureHandler);
|
|
||||||
when(mLightBarcontrollerFactory.create(any(Context.class))).thenReturn(mLightBarController);
|
when(mLightBarcontrollerFactory.create(any(Context.class))).thenReturn(mLightBarController);
|
||||||
when(mAutoHideControllerFactory.create(any(Context.class))).thenReturn(mAutoHideController);
|
when(mAutoHideControllerFactory.create(any(Context.class))).thenReturn(mAutoHideController);
|
||||||
when(mNavigationBarView.getHomeButton()).thenReturn(mHomeButton);
|
when(mNavigationBarView.getHomeButton()).thenReturn(mHomeButton);
|
||||||
@@ -213,6 +212,7 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
when(mNavigationBarTransitions.getLightTransitionsController())
|
when(mNavigationBarTransitions.getLightTransitionsController())
|
||||||
.thenReturn(mLightBarTransitionsController);
|
.thenReturn(mLightBarTransitionsController);
|
||||||
when(mStatusBarKeyguardViewManager.isNavBarVisible()).thenReturn(true);
|
when(mStatusBarKeyguardViewManager.isNavBarVisible()).thenReturn(true);
|
||||||
|
when(mNavigationBarView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
|
||||||
when(mUserContextProvider.createCurrentUserContext(any(Context.class)))
|
when(mUserContextProvider.createCurrentUserContext(any(Context.class)))
|
||||||
.thenReturn(mContext);
|
.thenReturn(mContext);
|
||||||
setupSysuiDependency();
|
setupSysuiDependency();
|
||||||
@@ -222,8 +222,6 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
mDependency.injectMockDependency(KeyguardStateController.class);
|
mDependency.injectMockDependency(KeyguardStateController.class);
|
||||||
mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController);
|
mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController);
|
||||||
mDependency.injectMockDependency(NavigationBarController.class);
|
mDependency.injectMockDependency(NavigationBarController.class);
|
||||||
mDependency.injectTestDependency(EdgeBackGestureHandler.Factory.class,
|
|
||||||
mEdgeBackGestureHandlerFactory);
|
|
||||||
mDependency.injectTestDependency(OverviewProxyService.class, mOverviewProxyService);
|
mDependency.injectTestDependency(OverviewProxyService.class, mOverviewProxyService);
|
||||||
mDependency.injectTestDependency(NavigationModeController.class, mNavigationModeController);
|
mDependency.injectTestDependency(NavigationModeController.class, mNavigationModeController);
|
||||||
TestableLooper.get(this).runWithLooper(() -> {
|
TestableLooper.get(this).runWithLooper(() -> {
|
||||||
@@ -463,6 +461,7 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
mDeadZone,
|
mDeadZone,
|
||||||
mDeviceConfigProxyFake,
|
mDeviceConfigProxyFake,
|
||||||
mNavigationBarTransitions,
|
mNavigationBarTransitions,
|
||||||
|
mEdgeBackGestureHandler,
|
||||||
Optional.of(mock(BackAnimation.class)),
|
Optional.of(mock(BackAnimation.class)),
|
||||||
mUserContextProvider));
|
mUserContextProvider));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user