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.AccessibilityEvent;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener;
|
import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener;
|
||||||
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
|
||||||
@@ -1175,6 +1176,9 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
accessibilityButton.setOnLongClickListener(this::onAccessibilityLongClick);
|
accessibilityButton.setOnLongClickListener(this::onAccessibilityLongClick);
|
||||||
updateAccessibilityServicesState(mAccessibilityManager);
|
updateAccessibilityServicesState(mAccessibilityManager);
|
||||||
|
|
||||||
|
ButtonDispatcher imeSwitcherButton = mNavigationBarView.getImeSwitchButton();
|
||||||
|
imeSwitcherButton.setOnClickListener(this::onImeSwitcherClick);
|
||||||
|
|
||||||
updateScreenPinningGestures();
|
updateScreenPinningGestures();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1274,6 +1278,11 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
mCommandQueue.toggleRecentApps();
|
mCommandQueue.toggleRecentApps();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onImeSwitcherClick(View v) {
|
||||||
|
mContext.getSystemService(InputMethodManager.class).showInputMethodPickerFromSystem(
|
||||||
|
true /* showAuxiliarySubtypes */, mDisplayId);
|
||||||
|
};
|
||||||
|
|
||||||
private boolean onLongPressBackHome(View v) {
|
private boolean onLongPressBackHome(View v) {
|
||||||
return onLongPressNavigationButtons(v, R.id.back, R.id.home);
|
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);
|
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
|
* 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.
|
* combination of recents if it is visible or home if recents is invisible.
|
||||||
|
|||||||
@@ -217,6 +217,9 @@ public class NavigationBarController implements Callbacks,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNavigationModeChanged(int mode) {
|
public void onNavigationModeChanged(int mode) {
|
||||||
|
if (mNavMode == mode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
final int oldMode = mNavMode;
|
final int oldMode = mNavMode;
|
||||||
mNavMode = mode;
|
mNavMode = mode;
|
||||||
mHandler.post(() -> {
|
mHandler.post(() -> {
|
||||||
|
|||||||
@@ -158,7 +158,6 @@ public class NavigationBarInflaterView extends FrameLayout
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onLikelyDefaultLayoutChange() {
|
public void onLikelyDefaultLayoutChange() {
|
||||||
|
|
||||||
// Reevaluate new layout
|
// Reevaluate new layout
|
||||||
final String newValue = getDefaultLayout();
|
final String newValue = getDefaultLayout();
|
||||||
if (!Objects.equals(mCurrentLayout, newValue)) {
|
if (!Objects.equals(mCurrentLayout, newValue)) {
|
||||||
|
|||||||
@@ -166,6 +166,7 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
private NavigationBarInflaterView mNavigationInflaterView;
|
private NavigationBarInflaterView mNavigationInflaterView;
|
||||||
private RecentsOnboarding mRecentsOnboarding;
|
private RecentsOnboarding mRecentsOnboarding;
|
||||||
private NotificationPanelViewController mPanelView;
|
private NotificationPanelViewController mPanelView;
|
||||||
|
private RotationContextButton mRotationContextButton;
|
||||||
private FloatingRotationButton mFloatingRotationButton;
|
private FloatingRotationButton mFloatingRotationButton;
|
||||||
private RotationButtonController mRotationButtonController;
|
private RotationButtonController mRotationButtonController;
|
||||||
private NavigationBarOverlayController mNavBarOverlayController;
|
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 =
|
private final AccessibilityDelegate mQuickStepAccessibilityDelegate =
|
||||||
new AccessibilityDelegate() {
|
new AccessibilityDelegate() {
|
||||||
private AccessibilityAction mToggleOverviewAction;
|
private AccessibilityAction mToggleOverviewAction;
|
||||||
@@ -311,32 +304,26 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
mIsVertical = false;
|
mIsVertical = false;
|
||||||
mLongClickableAccessibilityButton = false;
|
mLongClickableAccessibilityButton = false;
|
||||||
mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this);
|
mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this);
|
||||||
boolean isGesturalMode = isGesturalMode(mNavBarMode);
|
|
||||||
|
|
||||||
mSysUiFlagContainer = Dependency.get(SysUiState.class);
|
mSysUiFlagContainer = Dependency.get(SysUiState.class);
|
||||||
// Set up the context group of buttons
|
// Set up the context group of buttons
|
||||||
mContextualButtonGroup = new ContextualButtonGroup(R.id.menu_container);
|
mContextualButtonGroup = new ContextualButtonGroup(R.id.menu_container);
|
||||||
final ContextualButton imeSwitcherButton = new ContextualButton(R.id.ime_switcher,
|
final ContextualButton imeSwitcherButton = new ContextualButton(R.id.ime_switcher,
|
||||||
mLightContext, R.drawable.ic_ime_switcher_default);
|
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 =
|
final ContextualButton accessibilityButton =
|
||||||
new ContextualButton(R.id.accessibility_button, mLightContext,
|
new ContextualButton(R.id.accessibility_button, mLightContext,
|
||||||
R.drawable.ic_sysbar_accessibility_button);
|
R.drawable.ic_sysbar_accessibility_button);
|
||||||
mContextualButtonGroup.addButton(imeSwitcherButton);
|
mContextualButtonGroup.addButton(imeSwitcherButton);
|
||||||
if (!isGesturalMode) {
|
|
||||||
mContextualButtonGroup.addButton(rotateSuggestionButton);
|
|
||||||
}
|
|
||||||
mContextualButtonGroup.addButton(accessibilityButton);
|
mContextualButtonGroup.addButton(accessibilityButton);
|
||||||
|
|
||||||
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
|
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
|
||||||
|
mRotationContextButton = new RotationContextButton(R.id.rotate_suggestion,
|
||||||
|
mLightContext, R.drawable.ic_sysbar_rotate_button_ccw_start_0);
|
||||||
mFloatingRotationButton = new FloatingRotationButton(context);
|
mFloatingRotationButton = new FloatingRotationButton(context);
|
||||||
mRecentsOnboarding = new RecentsOnboarding(context, mOverviewProxyService);
|
mRecentsOnboarding = new RecentsOnboarding(context, mOverviewProxyService);
|
||||||
mRotationButtonController = new RotationButtonController(mLightContext,
|
mRotationButtonController = new RotationButtonController(mLightContext,
|
||||||
mLightIconColor, mDarkIconColor,
|
mLightIconColor, mDarkIconColor);
|
||||||
isGesturalMode ? mFloatingRotationButton : rotateSuggestionButton,
|
updateRotationButton();
|
||||||
mRotationButtonListener);
|
|
||||||
|
|
||||||
mNavBarOverlayController = Dependency.get(NavigationBarOverlayController.class);
|
mNavBarOverlayController = Dependency.get(NavigationBarOverlayController.class);
|
||||||
if (mNavBarOverlayController.isNavigationBarOverlayEnabled()) {
|
if (mNavBarOverlayController.isNavigationBarOverlayEnabled()) {
|
||||||
@@ -357,7 +344,6 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
mButtonDispatchers.put(R.id.recent_apps, new ButtonDispatcher(R.id.recent_apps));
|
mButtonDispatchers.put(R.id.recent_apps, new ButtonDispatcher(R.id.recent_apps));
|
||||||
mButtonDispatchers.put(R.id.ime_switcher, imeSwitcherButton);
|
mButtonDispatchers.put(R.id.ime_switcher, imeSwitcherButton);
|
||||||
mButtonDispatchers.put(R.id.accessibility_button, accessibilityButton);
|
mButtonDispatchers.put(R.id.accessibility_button, accessibilityButton);
|
||||||
mButtonDispatchers.put(R.id.rotate_suggestion, rotateSuggestionButton);
|
|
||||||
mButtonDispatchers.put(R.id.menu_container, mContextualButtonGroup);
|
mButtonDispatchers.put(R.id.menu_container, mContextualButtonGroup);
|
||||||
mDeadZone = new DeadZone(this);
|
mDeadZone = new DeadZone(this);
|
||||||
|
|
||||||
@@ -555,6 +541,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() {
|
public KeyButtonDrawable getBackDrawable() {
|
||||||
KeyButtonDrawable drawable = getDrawable(getBackDrawableRes());
|
KeyButtonDrawable drawable = getDrawable(getBackDrawableRes());
|
||||||
orientBackButton(drawable);
|
orientBackButton(drawable);
|
||||||
@@ -908,6 +911,7 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
mBarTransitions.onNavigationModeChanged(mNavBarMode);
|
mBarTransitions.onNavigationModeChanged(mNavBarMode);
|
||||||
mEdgeBackGestureHandler.onNavigationModeChanged(mNavBarMode);
|
mEdgeBackGestureHandler.onNavigationModeChanged(mNavBarMode);
|
||||||
mRecentsOnboarding.onNavigationModeChanged(mNavBarMode);
|
mRecentsOnboarding.onNavigationModeChanged(mNavBarMode);
|
||||||
|
updateRotationButton();
|
||||||
|
|
||||||
if (isGesturalMode(mNavBarMode)) {
|
if (isGesturalMode(mNavBarMode)) {
|
||||||
mRegionSamplingHelper.start(mSamplingBounds);
|
mRegionSamplingHelper.start(mSamplingBounds);
|
||||||
@@ -932,7 +936,6 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
mNavigationInflaterView = findViewById(R.id.navigation_inflater);
|
mNavigationInflaterView = findViewById(R.id.navigation_inflater);
|
||||||
mNavigationInflaterView.setButtonDispatchers(mButtonDispatchers);
|
mNavigationInflaterView.setButtonDispatchers(mButtonDispatchers);
|
||||||
|
|
||||||
getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener);
|
|
||||||
updateOrientationViews();
|
updateOrientationViews();
|
||||||
reloadNavIcons();
|
reloadNavIcons();
|
||||||
}
|
}
|
||||||
@@ -1027,6 +1030,9 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
|
|
||||||
private void updateButtonLocation(ButtonDispatcher button, boolean inScreenSpace,
|
private void updateButtonLocation(ButtonDispatcher button, boolean inScreenSpace,
|
||||||
boolean useNearestRegion) {
|
boolean useNearestRegion) {
|
||||||
|
if (button == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
View view = button.getCurrentView();
|
View view = button.getCurrentView();
|
||||||
if (view == null || !button.isVisible()) {
|
if (view == null || !button.isVisible()) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -66,10 +66,10 @@ public class RotationButtonController {
|
|||||||
private static final int NUM_ACCEPTED_ROTATION_SUGGESTIONS_FOR_INTRODUCTION = 3;
|
private static final int NUM_ACCEPTED_ROTATION_SUGGESTIONS_FOR_INTRODUCTION = 3;
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final RotationButton mRotationButton;
|
|
||||||
private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
|
private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
|
||||||
private final UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
|
private final UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
|
||||||
private final ViewRippler mViewRippler = new ViewRippler();
|
private final ViewRippler mViewRippler = new ViewRippler();
|
||||||
|
private RotationButton mRotationButton;
|
||||||
|
|
||||||
private int mLastRotationSuggestion;
|
private int mLastRotationSuggestion;
|
||||||
private boolean mPendingRotationSuggestion;
|
private boolean mPendingRotationSuggestion;
|
||||||
@@ -125,20 +125,21 @@ public class RotationButtonController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RotationButtonController(Context context, @ColorInt int lightIconColor,
|
RotationButtonController(Context context, @ColorInt int lightIconColor,
|
||||||
@ColorInt int darkIconColor, RotationButton rotationButton,
|
@ColorInt int darkIconColor) {
|
||||||
Consumer<Boolean> visibilityChangedCallback) {
|
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mLightIconColor = lightIconColor;
|
mLightIconColor = lightIconColor;
|
||||||
mDarkIconColor = darkIconColor;
|
mDarkIconColor = darkIconColor;
|
||||||
mRotationButton = rotationButton;
|
|
||||||
mRotationButton.setRotationButtonController(this);
|
|
||||||
|
|
||||||
mIsNavigationBarShowing = true;
|
mIsNavigationBarShowing = true;
|
||||||
mRotationLockController = Dependency.get(RotationLockController.class);
|
mRotationLockController = Dependency.get(RotationLockController.class);
|
||||||
mAccessibilityManagerWrapper = Dependency.get(AccessibilityManagerWrapper.class);
|
mAccessibilityManagerWrapper = Dependency.get(AccessibilityManagerWrapper.class);
|
||||||
|
|
||||||
// Register the task stack listener
|
|
||||||
mTaskStackListener = new TaskStackListenerImpl();
|
mTaskStackListener = new TaskStackListenerImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setRotationButton(RotationButton rotationButton,
|
||||||
|
Consumer<Boolean> visibilityChangedCallback) {
|
||||||
|
mRotationButton = rotationButton;
|
||||||
|
mRotationButton.setRotationButtonController(this);
|
||||||
mRotationButton.setOnClickListener(this::onRotateSuggestionClick);
|
mRotationButton.setOnClickListener(this::onRotateSuggestionClick);
|
||||||
mRotationButton.setOnHoverListener(this::onRotateSuggestionHover);
|
mRotationButton.setOnHoverListener(this::onRotateSuggestionHover);
|
||||||
mRotationButton.setVisibilityChangedCallback(visibilityChangedCallback);
|
mRotationButton.setVisibilityChangedCallback(visibilityChangedCallback);
|
||||||
|
|||||||
@@ -41,10 +41,23 @@ public class ContextualButtonGroup extends ButtonDispatcher {
|
|||||||
* @param button the button added to the group
|
* @param button the button added to the group
|
||||||
*/
|
*/
|
||||||
public void addButton(@NonNull ContextualButton button) {
|
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);
|
button.attachToGroup(this);
|
||||||
mButtonData.add(new ButtonData(button));
|
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) {
|
public ContextualButton getContextButton(@IdRes int buttonResId) {
|
||||||
int index = getContextButtonIndex(buttonResId);
|
int index = getContextButtonIndex(buttonResId);
|
||||||
if (index != INVALID_INDEX) {
|
if (index != INVALID_INDEX) {
|
||||||
|
|||||||
@@ -62,8 +62,8 @@ 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, (visibility) -> {}));
|
mRotationButtonController.setRotationButton(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