Also factor the floating rotation button into the active touch region
- The floating rotation button sits in the gesture region and touches over the button should not start the recents animation. Add a visibility callback to the floating rotation button in addition to the existing contextual button listener and update when needed. Bug: 162775448 Bug: 161921293 Test: Repeatedly rotate with floating button Test: atest SystemUITests:NavigationBarRotationContextTest Change-Id: I798370b41041e4f02bb82f5aeb20b9ccc1d2a4e8
This commit is contained in:
@@ -30,6 +30,8 @@ import com.android.systemui.R;
|
|||||||
import com.android.systemui.statusbar.policy.KeyButtonDrawable;
|
import com.android.systemui.statusbar.policy.KeyButtonDrawable;
|
||||||
import com.android.systemui.statusbar.policy.KeyButtonView;
|
import com.android.systemui.statusbar.policy.KeyButtonView;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/** Containing logic for the rotation button on the physical left bottom corner of the screen. */
|
/** Containing logic for the rotation button on the physical left bottom corner of the screen. */
|
||||||
public class FloatingRotationButton implements RotationButton {
|
public class FloatingRotationButton implements RotationButton {
|
||||||
|
|
||||||
@@ -45,6 +47,7 @@ public class FloatingRotationButton implements RotationButton {
|
|||||||
private boolean mCanShow = true;
|
private boolean mCanShow = true;
|
||||||
|
|
||||||
private RotationButtonController mRotationButtonController;
|
private RotationButtonController mRotationButtonController;
|
||||||
|
private Consumer<Boolean> mVisibilityChangedCallback;
|
||||||
|
|
||||||
FloatingRotationButton(Context context) {
|
FloatingRotationButton(Context context) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
@@ -66,6 +69,11 @@ public class FloatingRotationButton implements RotationButton {
|
|||||||
mRotationButtonController.getDarkIconColor());
|
mRotationButtonController.getDarkIconColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVisibilityChangedCallback(Consumer<Boolean> visibilityChangedCallback) {
|
||||||
|
mVisibilityChangedCallback = visibilityChangedCallback;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View getCurrentView() {
|
public View getCurrentView() {
|
||||||
return mKeyButtonView;
|
return mKeyButtonView;
|
||||||
@@ -105,6 +113,16 @@ public class FloatingRotationButton implements RotationButton {
|
|||||||
mKeyButtonDrawable.resetAnimation();
|
mKeyButtonDrawable.resetAnimation();
|
||||||
mKeyButtonDrawable.startAnimation();
|
mKeyButtonDrawable.startAnimation();
|
||||||
}
|
}
|
||||||
|
mKeyButtonView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5,
|
||||||
|
int i6, int i7) {
|
||||||
|
if (mIsShowing && mVisibilityChangedCallback != null) {
|
||||||
|
mVisibilityChangedCallback.accept(true);
|
||||||
|
}
|
||||||
|
mKeyButtonView.removeOnLayoutChangeListener(this);
|
||||||
|
}
|
||||||
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,6 +133,9 @@ public class FloatingRotationButton implements RotationButton {
|
|||||||
}
|
}
|
||||||
mWindowManager.removeViewImmediate(mKeyButtonView);
|
mWindowManager.removeViewImmediate(mKeyButtonView);
|
||||||
mIsShowing = false;
|
mIsShowing = false;
|
||||||
|
if (mVisibilityChangedCallback != null) {
|
||||||
|
mVisibilityChangedCallback.accept(false);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -351,15 +351,6 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private final ContextButtonListener mRotationButtonListener = (button, visible) -> {
|
|
||||||
if (visible) {
|
|
||||||
// If the button will actually become visible and the navbar is about to hide,
|
|
||||||
// tell the statusbar to keep it around for longer
|
|
||||||
mAutoHideController.touchAutoHide();
|
|
||||||
mNavigationBarView.notifyActiveTouchRegions();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private final Runnable mAutoDim = () -> getBarTransitions().setAutoDim(true);
|
private final Runnable mAutoDim = () -> getBarTransitions().setAutoDim(true);
|
||||||
|
|
||||||
private final ContentObserver mAssistContentObserver = new ContentObserver(
|
private final ContentObserver mAssistContentObserver = new ContentObserver(
|
||||||
@@ -507,8 +498,6 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
|
|||||||
|
|
||||||
// Currently there is no accelerometer sensor on non-default display.
|
// Currently there is no accelerometer sensor on non-default display.
|
||||||
if (mIsOnDefaultDisplay) {
|
if (mIsOnDefaultDisplay) {
|
||||||
mNavigationBarView.getRotateSuggestionButton().setListener(mRotationButtonListener);
|
|
||||||
|
|
||||||
final RotationButtonController rotationButtonController =
|
final RotationButtonController rotationButtonController =
|
||||||
mNavigationBarView.getRotationButtonController();
|
mNavigationBarView.getRotationButtonController();
|
||||||
rotationButtonController.addRotationCallback(mRotationWatcher);
|
rotationButtonController.addRotationCallback(mRotationWatcher);
|
||||||
@@ -1312,6 +1301,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
|
|||||||
if (mAutoHideController != null) {
|
if (mAutoHideController != null) {
|
||||||
mAutoHideController.setNavigationBar(mAutoHideUiElement);
|
mAutoHideController.setNavigationBar(mAutoHideUiElement);
|
||||||
}
|
}
|
||||||
|
mNavigationBarView.setAutoHideController(autoHideController);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isTransientShown() {
|
private boolean isTransientShown() {
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
private boolean mDeadZoneConsuming = false;
|
private boolean mDeadZoneConsuming = false;
|
||||||
private final NavigationBarTransitions mBarTransitions;
|
private final NavigationBarTransitions mBarTransitions;
|
||||||
private final OverviewProxyService mOverviewProxyService;
|
private final OverviewProxyService mOverviewProxyService;
|
||||||
|
private AutoHideController mAutoHideController;
|
||||||
|
|
||||||
// performs manual animation in sync with layout transitions
|
// performs manual animation in sync with layout transitions
|
||||||
private final NavTransitionListener mTransitionListener = new NavTransitionListener();
|
private final NavTransitionListener mTransitionListener = new NavTransitionListener();
|
||||||
@@ -276,6 +277,15 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
info.touchableRegion.setEmpty();
|
info.touchableRegion.setEmpty();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private final Consumer<Boolean> mRotationButtonListener = (visible) -> {
|
||||||
|
if (visible) {
|
||||||
|
// If the button will actually become visible and the navbar is about to hide,
|
||||||
|
// tell the statusbar to keep it around for longer
|
||||||
|
mAutoHideController.touchAutoHide();
|
||||||
|
}
|
||||||
|
notifyActiveTouchRegions();
|
||||||
|
};
|
||||||
|
|
||||||
public NavigationBarView(Context context, AttributeSet attrs) {
|
public NavigationBarView(Context context, AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
|
|
||||||
@@ -312,7 +322,8 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
mFloatingRotationButton = new FloatingRotationButton(context);
|
mFloatingRotationButton = new FloatingRotationButton(context);
|
||||||
mRotationButtonController = new RotationButtonController(mLightContext,
|
mRotationButtonController = new RotationButtonController(mLightContext,
|
||||||
mLightIconColor, mDarkIconColor,
|
mLightIconColor, mDarkIconColor,
|
||||||
isGesturalMode ? mFloatingRotationButton : rotateSuggestionButton);
|
isGesturalMode ? mFloatingRotationButton : rotateSuggestionButton,
|
||||||
|
mRotationButtonListener);
|
||||||
|
|
||||||
mConfiguration = new Configuration();
|
mConfiguration = new Configuration();
|
||||||
mTmpLastConfiguration = new Configuration();
|
mTmpLastConfiguration = new Configuration();
|
||||||
@@ -360,6 +371,10 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAutoHideController(AutoHideController autoHideController) {
|
||||||
|
mAutoHideController = autoHideController;
|
||||||
|
}
|
||||||
|
|
||||||
public NavigationBarTransitions getBarTransitions() {
|
public NavigationBarTransitions getBarTransitions() {
|
||||||
return mBarTransitions;
|
return mBarTransitions;
|
||||||
}
|
}
|
||||||
@@ -938,7 +953,15 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
updateButtonLocation(getBackButton());
|
updateButtonLocation(getBackButton());
|
||||||
updateButtonLocation(getHomeButton());
|
updateButtonLocation(getHomeButton());
|
||||||
updateButtonLocation(getRecentsButton());
|
updateButtonLocation(getRecentsButton());
|
||||||
updateButtonLocation(getRotateSuggestionButton());
|
updateButtonLocation(getImeSwitchButton());
|
||||||
|
updateButtonLocation(getAccessibilityButton());
|
||||||
|
if (mFloatingRotationButton.isVisible()) {
|
||||||
|
View floatingRotationView = mFloatingRotationButton.getCurrentView();
|
||||||
|
floatingRotationView.getBoundsOnScreen(mTmpBounds);
|
||||||
|
mActiveRegion.op(mTmpBounds, Op.UNION);
|
||||||
|
} else {
|
||||||
|
updateButtonLocation(getRotateSuggestionButton());
|
||||||
|
}
|
||||||
mOverviewProxyService.onActiveNavBarRegionChanges(mActiveRegion);
|
mOverviewProxyService.onActiveNavBarRegionChanges(mActiveRegion);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1210,6 +1233,7 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
dumpButton(pw, "rcnt", getRecentsButton());
|
dumpButton(pw, "rcnt", getRecentsButton());
|
||||||
dumpButton(pw, "rota", getRotateSuggestionButton());
|
dumpButton(pw, "rota", getRotateSuggestionButton());
|
||||||
dumpButton(pw, "a11y", getAccessibilityButton());
|
dumpButton(pw, "a11y", getAccessibilityButton());
|
||||||
|
dumpButton(pw, "ime", getImeSwitchButton());
|
||||||
|
|
||||||
pw.println(" }");
|
pw.println(" }");
|
||||||
pw.println(" mScreenOn: " + mScreenOn);
|
pw.println(" mScreenOn: " + mScreenOn);
|
||||||
|
|||||||
@@ -20,9 +20,12 @@ import android.view.View;
|
|||||||
|
|
||||||
import com.android.systemui.statusbar.policy.KeyButtonDrawable;
|
import com.android.systemui.statusbar.policy.KeyButtonDrawable;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/** Interface of a rotation button that interacts {@link RotationButtonController}. */
|
/** Interface of a rotation button that interacts {@link RotationButtonController}. */
|
||||||
interface RotationButton {
|
interface RotationButton {
|
||||||
void setRotationButtonController(RotationButtonController rotationButtonController);
|
void setRotationButtonController(RotationButtonController rotationButtonController);
|
||||||
|
void setVisibilityChangedCallback(Consumer<Boolean> visibilityChangedCallback);
|
||||||
View getCurrentView();
|
View getCurrentView();
|
||||||
boolean show();
|
boolean show();
|
||||||
boolean hide();
|
boolean hide();
|
||||||
|
|||||||
@@ -124,7 +124,8 @@ public class RotationButtonController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RotationButtonController(Context context, @ColorInt int lightIconColor,
|
RotationButtonController(Context context, @ColorInt int lightIconColor,
|
||||||
@ColorInt int darkIconColor, RotationButton rotationButton) {
|
@ColorInt int darkIconColor, RotationButton rotationButton,
|
||||||
|
Consumer<Boolean> visibilityChangedCallback) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mLightIconColor = lightIconColor;
|
mLightIconColor = lightIconColor;
|
||||||
mDarkIconColor = darkIconColor;
|
mDarkIconColor = darkIconColor;
|
||||||
@@ -139,6 +140,7 @@ public class RotationButtonController {
|
|||||||
mTaskStackListener = new TaskStackListenerImpl();
|
mTaskStackListener = new TaskStackListenerImpl();
|
||||||
mRotationButton.setOnClickListener(this::onRotateSuggestionClick);
|
mRotationButton.setOnClickListener(this::onRotateSuggestionClick);
|
||||||
mRotationButton.setOnHoverListener(this::onRotateSuggestionHover);
|
mRotationButton.setOnHoverListener(this::onRotateSuggestionHover);
|
||||||
|
mRotationButton.setVisibilityChangedCallback(visibilityChangedCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerListeners() {
|
void registerListeners() {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import android.view.View;
|
|||||||
|
|
||||||
import com.android.systemui.statusbar.policy.KeyButtonDrawable;
|
import com.android.systemui.statusbar.policy.KeyButtonDrawable;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/** Containing logic for the rotation button in nav bar. */
|
/** Containing logic for the rotation button in nav bar. */
|
||||||
public class RotationContextButton extends ContextualButton implements RotationButton {
|
public class RotationContextButton extends ContextualButton implements RotationButton {
|
||||||
public static final boolean DEBUG_ROTATION = false;
|
public static final boolean DEBUG_ROTATION = false;
|
||||||
@@ -37,6 +39,18 @@ public class RotationContextButton extends ContextualButton implements RotationB
|
|||||||
mRotationButtonController = rotationButtonController;
|
mRotationButtonController = rotationButtonController;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVisibilityChangedCallback(Consumer<Boolean> visibilityChangedCallback) {
|
||||||
|
setListener(new ContextButtonListener() {
|
||||||
|
@Override
|
||||||
|
public void onVisibilityChanged(ContextualButton button, boolean visible) {
|
||||||
|
if (visibilityChangedCallback != null) {
|
||||||
|
visibilityChangedCallback.accept(visible);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setVisibility(int visibility) {
|
public void setVisibility(int visibility) {
|
||||||
super.setVisibility(visibility);
|
super.setVisibility(visibility);
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public class NavigationBarRotationContextTest extends SysuiTestCase {
|
|||||||
final View view = new View(mContext);
|
final View view = new View(mContext);
|
||||||
mRotationButton = mock(RotationButton.class);
|
mRotationButton = mock(RotationButton.class);
|
||||||
mRotationButtonController = spy(new RotationButtonController(mContext, 0, 0,
|
mRotationButtonController = spy(new RotationButtonController(mContext, 0, 0,
|
||||||
mRotationButton));
|
mRotationButton, (visibility) -> {}));
|
||||||
final KeyButtonDrawable kbd = mock(KeyButtonDrawable.class);
|
final KeyButtonDrawable kbd = mock(KeyButtonDrawable.class);
|
||||||
doReturn(view).when(mRotationButton).getCurrentView();
|
doReturn(view).when(mRotationButton).getCurrentView();
|
||||||
doReturn(true).when(mRotationButton).acceptRotationProposal();
|
doReturn(true).when(mRotationButton).acceptRotationProposal();
|
||||||
|
|||||||
Reference in New Issue
Block a user