Merge "Fix a couple issues with nav bar & rotation button" into sc-dev
This commit is contained in:
@@ -101,6 +101,7 @@ import android.view.WindowManager;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
@@ -1175,6 +1176,9 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
||||
accessibilityButton.setOnLongClickListener(this::onAccessibilityLongClick);
|
||||
updateAccessibilityServicesState(mAccessibilityManager);
|
||||
|
||||
ButtonDispatcher imeSwitcherButton = mNavigationBarView.getImeSwitchButton();
|
||||
imeSwitcherButton.setOnClickListener(this::onImeSwitcherClick);
|
||||
|
||||
updateScreenPinningGestures();
|
||||
}
|
||||
|
||||
@@ -1274,6 +1278,11 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
||||
mCommandQueue.toggleRecentApps();
|
||||
}
|
||||
|
||||
private void onImeSwitcherClick(View v) {
|
||||
mContext.getSystemService(InputMethodManager.class).showInputMethodPickerFromSystem(
|
||||
true /* showAuxiliarySubtypes */, mDisplayId);
|
||||
};
|
||||
|
||||
private boolean onLongPressBackHome(View v) {
|
||||
return onLongPressNavigationButtons(v, R.id.back, R.id.home);
|
||||
}
|
||||
@@ -1282,7 +1291,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
||||
return onLongPressNavigationButtons(v, R.id.back, R.id.recent_apps);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This handles long-press of both back and recents/home. Back is the common button with
|
||||
* combination of recents if it is visible or home if recents is invisible.
|
||||
|
||||
@@ -217,6 +217,9 @@ public class NavigationBarController implements Callbacks,
|
||||
|
||||
@Override
|
||||
public void onNavigationModeChanged(int mode) {
|
||||
if (mNavMode == mode) {
|
||||
return;
|
||||
}
|
||||
final int oldMode = mNavMode;
|
||||
mNavMode = mode;
|
||||
mHandler.post(() -> {
|
||||
|
||||
@@ -158,7 +158,6 @@ public class NavigationBarInflaterView extends FrameLayout
|
||||
}
|
||||
|
||||
public void onLikelyDefaultLayoutChange() {
|
||||
|
||||
// Reevaluate new layout
|
||||
final String newValue = getDefaultLayout();
|
||||
if (!Objects.equals(mCurrentLayout, newValue)) {
|
||||
|
||||
@@ -166,6 +166,7 @@ public class NavigationBarView extends FrameLayout implements
|
||||
private NavigationBarInflaterView mNavigationInflaterView;
|
||||
private RecentsOnboarding mRecentsOnboarding;
|
||||
private NotificationPanelViewController mPanelView;
|
||||
private RotationContextButton mRotationContextButton;
|
||||
private FloatingRotationButton mFloatingRotationButton;
|
||||
private RotationButtonController mRotationButtonController;
|
||||
private NavigationBarOverlayController mNavBarOverlayController;
|
||||
@@ -233,14 +234,6 @@ public class NavigationBarView extends FrameLayout implements
|
||||
}
|
||||
}
|
||||
|
||||
private final OnClickListener mImeSwitcherClickListener = new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
mContext.getSystemService(InputMethodManager.class).showInputMethodPickerFromSystem(
|
||||
true /* showAuxiliarySubtypes */, getContext().getDisplayId());
|
||||
}
|
||||
};
|
||||
|
||||
private final AccessibilityDelegate mQuickStepAccessibilityDelegate =
|
||||
new AccessibilityDelegate() {
|
||||
private AccessibilityAction mToggleOverviewAction;
|
||||
@@ -311,33 +304,26 @@ public class NavigationBarView extends FrameLayout implements
|
||||
mIsVertical = false;
|
||||
mLongClickableAccessibilityButton = false;
|
||||
mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this);
|
||||
boolean isGesturalMode = isGesturalMode(mNavBarMode);
|
||||
|
||||
mSysUiFlagContainer = Dependency.get(SysUiState.class);
|
||||
// Set up the context group of buttons
|
||||
mContextualButtonGroup = new ContextualButtonGroup(R.id.menu_container);
|
||||
final ContextualButton imeSwitcherButton = new ContextualButton(R.id.ime_switcher,
|
||||
mLightContext, R.drawable.ic_ime_switcher_default);
|
||||
final RotationContextButton rotateSuggestionButton = new RotationContextButton(
|
||||
R.id.rotate_suggestion, mLightContext,
|
||||
R.drawable.ic_sysbar_rotate_button_ccw_start_0);
|
||||
final ContextualButton accessibilityButton =
|
||||
new ContextualButton(R.id.accessibility_button, mLightContext,
|
||||
R.drawable.ic_sysbar_accessibility_button);
|
||||
mContextualButtonGroup.addButton(imeSwitcherButton);
|
||||
if (!isGesturalMode) {
|
||||
mContextualButtonGroup.addButton(rotateSuggestionButton);
|
||||
}
|
||||
mContextualButtonGroup.addButton(accessibilityButton);
|
||||
mRotationContextButton = new RotationContextButton(R.id.rotate_suggestion,
|
||||
mLightContext, R.drawable.ic_sysbar_rotate_button_ccw_start_0);
|
||||
mFloatingRotationButton = new FloatingRotationButton(context);
|
||||
mRotationButtonController = new RotationButtonController(mLightContext,
|
||||
mLightIconColor, mDarkIconColor);
|
||||
updateRotationButton();
|
||||
|
||||
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
|
||||
mFloatingRotationButton = new FloatingRotationButton(context);
|
||||
mRecentsOnboarding = new RecentsOnboarding(context, mOverviewProxyService);
|
||||
mRotationButtonController = new RotationButtonController(mLightContext,
|
||||
mLightIconColor, mDarkIconColor,
|
||||
isGesturalMode ? mFloatingRotationButton : rotateSuggestionButton,
|
||||
mRotationButtonListener);
|
||||
|
||||
mNavBarOverlayController = Dependency.get(NavigationBarOverlayController.class);
|
||||
if (mNavBarOverlayController.isNavigationBarOverlayEnabled()) {
|
||||
mNavBarOverlayController.init(
|
||||
@@ -357,7 +343,6 @@ public class NavigationBarView extends FrameLayout implements
|
||||
mButtonDispatchers.put(R.id.recent_apps, new ButtonDispatcher(R.id.recent_apps));
|
||||
mButtonDispatchers.put(R.id.ime_switcher, imeSwitcherButton);
|
||||
mButtonDispatchers.put(R.id.accessibility_button, accessibilityButton);
|
||||
mButtonDispatchers.put(R.id.rotate_suggestion, rotateSuggestionButton);
|
||||
mButtonDispatchers.put(R.id.menu_container, mContextualButtonGroup);
|
||||
mDeadZone = new DeadZone(this);
|
||||
|
||||
@@ -555,6 +540,23 @@ public class NavigationBarView extends FrameLayout implements
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the rotation button based on the current navigation mode.
|
||||
*/
|
||||
private void updateRotationButton() {
|
||||
if (isGesturalMode(mNavBarMode)) {
|
||||
mContextualButtonGroup.removeButton(R.id.rotate_suggestion);
|
||||
mButtonDispatchers.remove(R.id.rotate_suggestion);
|
||||
mRotationButtonController.setRotationButton(mFloatingRotationButton,
|
||||
mRotationButtonListener);
|
||||
} else if (mContextualButtonGroup.getContextButton(R.id.rotate_suggestion) == null) {
|
||||
mContextualButtonGroup.addButton(mRotationContextButton);
|
||||
mButtonDispatchers.put(R.id.rotate_suggestion, mRotationContextButton);
|
||||
mRotationButtonController.setRotationButton(mRotationContextButton,
|
||||
mRotationButtonListener);
|
||||
}
|
||||
}
|
||||
|
||||
public KeyButtonDrawable getBackDrawable() {
|
||||
KeyButtonDrawable drawable = getDrawable(getBackDrawableRes());
|
||||
orientBackButton(drawable);
|
||||
@@ -908,6 +910,7 @@ public class NavigationBarView extends FrameLayout implements
|
||||
mBarTransitions.onNavigationModeChanged(mNavBarMode);
|
||||
mEdgeBackGestureHandler.onNavigationModeChanged(mNavBarMode);
|
||||
mRecentsOnboarding.onNavigationModeChanged(mNavBarMode);
|
||||
updateRotationButton();
|
||||
|
||||
if (isGesturalMode(mNavBarMode)) {
|
||||
mRegionSamplingHelper.start(mSamplingBounds);
|
||||
@@ -932,7 +935,6 @@ public class NavigationBarView extends FrameLayout implements
|
||||
mNavigationInflaterView = findViewById(R.id.navigation_inflater);
|
||||
mNavigationInflaterView.setButtonDispatchers(mButtonDispatchers);
|
||||
|
||||
getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener);
|
||||
updateOrientationViews();
|
||||
reloadNavIcons();
|
||||
}
|
||||
@@ -1027,6 +1029,9 @@ public class NavigationBarView extends FrameLayout implements
|
||||
|
||||
private void updateButtonLocation(ButtonDispatcher button, boolean inScreenSpace,
|
||||
boolean useNearestRegion) {
|
||||
if (button == null) {
|
||||
return;
|
||||
}
|
||||
View view = button.getCurrentView();
|
||||
if (view == null || !button.isVisible()) {
|
||||
return;
|
||||
|
||||
@@ -66,10 +66,10 @@ public class RotationButtonController {
|
||||
private static final int NUM_ACCEPTED_ROTATION_SUGGESTIONS_FOR_INTRODUCTION = 3;
|
||||
|
||||
private final Context mContext;
|
||||
private final RotationButton mRotationButton;
|
||||
private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
|
||||
private final UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
|
||||
private final ViewRippler mViewRippler = new ViewRippler();
|
||||
private RotationButton mRotationButton;
|
||||
|
||||
private int mLastRotationSuggestion;
|
||||
private boolean mPendingRotationSuggestion;
|
||||
@@ -125,20 +125,21 @@ public class RotationButtonController {
|
||||
}
|
||||
|
||||
RotationButtonController(Context context, @ColorInt int lightIconColor,
|
||||
@ColorInt int darkIconColor, RotationButton rotationButton,
|
||||
Consumer<Boolean> visibilityChangedCallback) {
|
||||
@ColorInt int darkIconColor) {
|
||||
mContext = context;
|
||||
mLightIconColor = lightIconColor;
|
||||
mDarkIconColor = darkIconColor;
|
||||
mRotationButton = rotationButton;
|
||||
mRotationButton.setRotationButtonController(this);
|
||||
|
||||
mIsNavigationBarShowing = true;
|
||||
mRotationLockController = Dependency.get(RotationLockController.class);
|
||||
mAccessibilityManagerWrapper = Dependency.get(AccessibilityManagerWrapper.class);
|
||||
|
||||
// Register the task stack listener
|
||||
mTaskStackListener = new TaskStackListenerImpl();
|
||||
}
|
||||
|
||||
void setRotationButton(RotationButton rotationButton,
|
||||
Consumer<Boolean> visibilityChangedCallback) {
|
||||
mRotationButton = rotationButton;
|
||||
mRotationButton.setRotationButtonController(this);
|
||||
mRotationButton.setOnClickListener(this::onRotateSuggestionClick);
|
||||
mRotationButton.setOnHoverListener(this::onRotateSuggestionHover);
|
||||
mRotationButton.setVisibilityChangedCallback(visibilityChangedCallback);
|
||||
|
||||
@@ -41,10 +41,23 @@ public class ContextualButtonGroup extends ButtonDispatcher {
|
||||
* @param button the button added to the group
|
||||
*/
|
||||
public void addButton(@NonNull ContextualButton button) {
|
||||
// By default buttons in the context group are not visible until
|
||||
// {@link #setButtonVisibility()) is called to show one of the buttons
|
||||
button.setVisibility(View.INVISIBLE);
|
||||
button.attachToGroup(this);
|
||||
mButtonData.add(new ButtonData(button));
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a contextual button from the group.
|
||||
*/
|
||||
public void removeButton(@IdRes int buttonResId) {
|
||||
int index = getContextButtonIndex(buttonResId);
|
||||
if (index != INVALID_INDEX) {
|
||||
mButtonData.remove(index);
|
||||
}
|
||||
}
|
||||
|
||||
public ContextualButton getContextButton(@IdRes int buttonResId) {
|
||||
int index = getContextButtonIndex(buttonResId);
|
||||
if (index != INVALID_INDEX) {
|
||||
|
||||
@@ -62,8 +62,10 @@ public class NavigationBarRotationContextTest extends SysuiTestCase {
|
||||
|
||||
final View view = new View(mContext);
|
||||
mRotationButton = mock(RotationButton.class);
|
||||
mRotationButtonController = spy(new RotationButtonController(mContext, 0, 0,
|
||||
mRotationButton, (visibility) -> {}));
|
||||
mRotationButtonController = new RotationButtonController(mContext, 0, 0);
|
||||
mRotationButtonController.setRotationButton(mRotationButton, (visibility) -> {});
|
||||
// Due to a mockito issue, only spy the object after setting the initial state
|
||||
mRotationButtonController = spy(mRotationButtonController);
|
||||
final KeyButtonDrawable kbd = mock(KeyButtonDrawable.class);
|
||||
doReturn(view).when(mRotationButton).getCurrentView();
|
||||
doReturn(true).when(mRotationButton).acceptRotationProposal();
|
||||
|
||||
Reference in New Issue
Block a user