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:
Winson Chung
2020-08-06 10:33:03 -07:00
parent f1a408f208
commit 3e64e959ea
7 changed files with 69 additions and 15 deletions

View File

@@ -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;
} }

View File

@@ -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() {

View File

@@ -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);

View File

@@ -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();

View File

@@ -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() {

View File

@@ -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);

View File

@@ -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();