Loading packages/SystemUI/res/layout/menu_ime.xml +9 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,15 @@ android:contentDescription="@string/accessibility_ime_switch_button" android:scaleType="centerInside" /> <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/rotate_suggestion" android:layout_width="@dimen/navigation_extra_key_width" android:layout_height="match_parent" android:layout_marginEnd="2dp" android:visibility="invisible" android:scaleType="centerInside" android:contentDescription="@string/accessibility_rotate_button" /> <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/accessibility_button" android:layout_width="@dimen/navigation_extra_key_width" Loading packages/SystemUI/res/values/strings.xml +1 −3 Original line number Diff line number Diff line Loading @@ -1751,15 +1751,13 @@ <string-array name="nav_bar_buttons"> <item>Clipboard</item> <item>Keycode</item> <item>Keyboard switcher</item> <item>Rotation suggestion</item> <item>Rotate confirm, keyboard switcher</item> <item>None</item> </string-array> <string-array name="nav_bar_button_values" translatable="false"> <item>clipboard</item> <item>key</item> <item>menu_ime</item> <item>rotate</item> <item>space</item> </string-array> Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +19 −89 Original line number Diff line number Diff line Loading @@ -114,8 +114,6 @@ public class NavigationBarFragment extends Fragment implements Callbacks { /** Allow some time inbetween the long press for back and recents. */ private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200; private static final int BUTTON_FADE_IN_OUT_DURATION_MS = 100; protected NavigationBarView mNavigationBarView = null; protected AssistManager mAssistManager; Loading Loading @@ -152,7 +150,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private RotationLockController mRotationLockController; private TaskStackListenerImpl mTaskStackListener; private final Runnable mRemoveRotationProposal = () -> setRotateSuggestionButtonState(false); private final Runnable mRemoveRotationProposal = () -> safeSetRotationButtonState(false); private Animator mRotateShowAnimator; private Animator mRotateHideAnimator; Loading Loading @@ -361,22 +359,32 @@ public class NavigationBarFragment extends Fragment implements Callbacks { // rotate button if shown. if (!isValid) { setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); return; } if (rotation == mWindowManager.getDefaultDisplay().getRotation()) { // Use this as a signal to remove any current suggestions getView().getHandler().removeCallbacks(mRemoveRotationProposal); setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); } else { mLastRotationSuggestion = rotation; // Remember rotation for click setRotateSuggestionButtonState(true); safeSetRotationButtonState(true); rescheduleRotationTimeout(false); mMetricsLogger.visible(MetricsEvent.ROTATION_SUGGESTION_SHOWN); } } private void safeSetRotationButtonState(boolean vis) { if (mNavigationBarView != null) mNavigationBarView.setRotateSuggestionButtonState(vis); } private void safeSetRotationButtonState(boolean vis, boolean force) { if (mNavigationBarView != null) { mNavigationBarView.setRotateSuggestionButtonState(vis, force); } } private void rescheduleRotationTimeout(final boolean reasonHover) { // May be called due to a new rotation proposal or a change in hover state if (reasonHover) { Loading @@ -402,84 +410,6 @@ public class NavigationBarFragment extends Fragment implements Callbacks { return 6000; } public void setRotateSuggestionButtonState(final boolean visible) { setRotateSuggestionButtonState(visible, false); } public void setRotateSuggestionButtonState(final boolean visible, final boolean skipAnim) { ButtonDispatcher rotBtn = mNavigationBarView.getRotateSuggestionButton(); final boolean currentlyVisible = rotBtn.getVisibility() == View.VISIBLE; // Rerun a show animation to indicate change but don't rerun a hide animation if (!visible && !currentlyVisible) return; View currentView = rotBtn.getCurrentView(); if (currentView == null) return; KeyButtonDrawable kbd = rotBtn.getImageDrawable(); if (kbd == null) return; AnimatedVectorDrawable animIcon = null; if (kbd.getDrawable(0) instanceof AnimatedVectorDrawable) { animIcon = (AnimatedVectorDrawable) kbd.getDrawable(0); } if (visible) { // Appear and change rotBtn.setVisibility(View.VISIBLE); mNavigationBarView.notifySubtreeAccessibilityStateChangedIfNeeded(); if (skipAnim) { currentView.setAlpha(1f); return; } // Start a new animation if running if (mRotateShowAnimator != null) mRotateShowAnimator.pause(); if (mRotateHideAnimator != null) mRotateHideAnimator.pause(); ObjectAnimator appearFade = ObjectAnimator.ofFloat(currentView, "alpha", 0f, 1f); appearFade.setDuration(BUTTON_FADE_IN_OUT_DURATION_MS); appearFade.setInterpolator(Interpolators.LINEAR); mRotateShowAnimator = appearFade; appearFade.start(); // Run the rotate icon's animation if it has one if (animIcon != null) { animIcon.reset(); animIcon.start(); } } else { // Hide if (skipAnim) { rotBtn.setVisibility(View.INVISIBLE); mNavigationBarView.notifySubtreeAccessibilityStateChangedIfNeeded(); return; } // Don't start any new hide animations if one is running if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) return; // Pause any active show animations but don't reset the AVD to avoid jumps if (mRotateShowAnimator != null) mRotateShowAnimator.pause(); ObjectAnimator fadeOut = ObjectAnimator.ofFloat(currentView, "alpha", 0f); fadeOut.setDuration(BUTTON_FADE_IN_OUT_DURATION_MS); fadeOut.setInterpolator(Interpolators.LINEAR); fadeOut.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { rotBtn.setVisibility(View.INVISIBLE); mNavigationBarView.notifySubtreeAccessibilityStateChangedIfNeeded(); } }); mRotateHideAnimator = fadeOut; fadeOut.start(); } } // Injected from StatusBar at creation. public void setCurrentSysuiVisibility(int systemUiVisibility) { mSystemUiVisibility = systemUiVisibility; Loading Loading @@ -892,7 +822,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { if (shouldOverrideUserLockPrefs(rotation)) { mRotationLockController.setRotationLockedAtAngle(true, rotation); } setRotateSuggestionButtonState(false, true); safeSetRotationButtonState(false, true); } if (mNavigationBarView != null Loading Loading @@ -928,22 +858,22 @@ public class NavigationBarFragment extends Fragment implements Callbacks { @Override public void onTaskStackChanged() { setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); } @Override public void onTaskRemoved(int taskId) { setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); } @Override public void onTaskMovedToFront(int taskId) { setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); } @Override public void onActivityRequestedOrientationChanged(int taskId, int requestedOrientation) { setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); } } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +4 −7 Original line number Diff line number Diff line Loading @@ -57,13 +57,12 @@ public class NavigationBarInflaterView extends FrameLayout public static final String NAV_BAR_LEFT = "sysui_nav_bar_left"; public static final String NAV_BAR_RIGHT = "sysui_nav_bar_right"; public static final String MENU_IME = "menu_ime"; public static final String MENU_IME_ROTATE = "menu_ime"; public static final String BACK = "back"; public static final String HOME = "home"; public static final String RECENT = "recent"; public static final String NAVSPACE = "space"; public static final String CLIPBOARD = "clipboard"; public static final String ROTATE = "rotate"; public static final String KEY = "key"; public static final String LEFT = "left"; public static final String RIGHT = "right"; Loading Loading @@ -317,10 +316,10 @@ public class NavigationBarInflaterView extends FrameLayout View v = null; String button = extractButton(buttonSpec); if (LEFT.equals(button)) { String s = Dependency.get(TunerService.class).getValue(NAV_BAR_LEFT, ROTATE); String s = Dependency.get(TunerService.class).getValue(NAV_BAR_LEFT, NAVSPACE); button = extractButton(s); } else if (RIGHT.equals(button)) { String s = Dependency.get(TunerService.class).getValue(NAV_BAR_RIGHT, MENU_IME); String s = Dependency.get(TunerService.class).getValue(NAV_BAR_RIGHT, MENU_IME_ROTATE); button = extractButton(s); } // Let plugins go first so they can override a standard view if they want. Loading @@ -334,14 +333,12 @@ public class NavigationBarInflaterView extends FrameLayout v = inflater.inflate(R.layout.back, parent, false); } else if (RECENT.equals(button)) { v = inflater.inflate(R.layout.recent_apps, parent, false); } else if (MENU_IME.equals(button)) { } else if (MENU_IME_ROTATE.equals(button)) { v = inflater.inflate(R.layout.menu_ime, parent, false); } else if (NAVSPACE.equals(button)) { v = inflater.inflate(R.layout.nav_key_space, parent, false); } else if (CLIPBOARD.equals(button)) { v = inflater.inflate(R.layout.clipboard, parent, false); } else if (ROTATE.equals(button)) { v = inflater.inflate(R.layout.rotate_suggestion, parent, false); } else if (button.startsWith(KEY)) { String uri = extractImage(button); int code = extractKeycode(button); Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +104 −9 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.LayoutTransition; import android.animation.LayoutTransition.TransitionListener; import android.animation.ObjectAnimator; Loading @@ -29,6 +31,7 @@ import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.AnimatedVectorDrawable; import android.os.Handler; import android.os.Message; import android.os.RemoteException; Loading @@ -49,6 +52,7 @@ import android.widget.FrameLayout; import com.android.settingslib.Utils; import com.android.systemui.Dependency; import com.android.systemui.DockedStackExistsListener; import com.android.systemui.Interpolators; import com.android.systemui.OverviewProxyService; import com.android.systemui.R; import com.android.systemui.RecentsComponent; Loading @@ -70,6 +74,8 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav final static boolean DEBUG = false; final static String TAG = "StatusBar/NavBarView"; final static int BUTTON_FADE_IN_OUT_DURATION_MS = 100; // slippery nav bar when everything is disabled, e.g. during setup final static boolean SLIPPERY_WHEN_DISABLED = true; Loading @@ -85,6 +91,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav boolean mShowMenu; boolean mShowAccessibilityButton; boolean mLongClickableAccessibilityButton; boolean mShowRotateButton; int mDisabledFlags = 0; int mNavigationIconHints = 0; Loading Loading @@ -127,6 +134,8 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav private RecentsOnboarding mRecentsOnboarding; private NotificationPanelView mPanelView; private Animator mRotateHideAnimator; private class NavTransitionListener implements TransitionListener { private boolean mBackTransitioning; private boolean mHomeAppearing; Loading Loading @@ -471,22 +480,25 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav getHomeButton().setImageDrawable(mHomeDefaultIcon); } // The Accessibility button always overrides the appearance of the IME switcher // Update IME button visibility, a11y and rotate button always overrides the appearance final boolean showImeButton = !mShowAccessibilityButton && ((hints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0); !mShowAccessibilityButton && !mShowRotateButton && ((hints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0); getImeSwitchButton().setVisibility(showImeButton ? View.VISIBLE : View.INVISIBLE); getImeSwitchButton().setImageDrawable(mImeIcon); // Update menu button in case the IME state has changed. // Update menu button, visibility logic in method setMenuVisibility(mShowMenu, true); getMenuButton().setImageDrawable(mMenuIcon); // Update rotate button, visibility altered by a11y button logic getRotateSuggestionButton().setImageDrawable(mRotateSuggestionIcon); // Update a11y button, visibility logic in state method setAccessibilityButtonState(mShowAccessibilityButton, mLongClickableAccessibilityButton); getAccessibilityButton().setImageDrawable(mAccessibilityIcon); getRotateSuggestionButton().setImageDrawable(mRotateSuggestionIcon); setDisabledFlags(mDisabledFlags, true); mBarTransitions.reapplyDarkIntensity(); Loading Loading @@ -630,8 +642,10 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav mShowMenu = show; // Only show Menu if IME switcher and Accessibility button not shown. final boolean shouldShow = mShowMenu && !mShowAccessibilityButton && // Only show Menu if IME switcher, rotate and Accessibility buttons are not shown. final boolean shouldShow = mShowMenu && !mShowAccessibilityButton && !mShowRotateButton && ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) == 0); getMenuButton().setVisibility(shouldShow ? View.VISIBLE : View.INVISIBLE); Loading @@ -641,15 +655,96 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav mShowAccessibilityButton = visible; mLongClickableAccessibilityButton = longClickable; if (visible) { // Accessibility button overrides Menu and IME switcher buttons. // Accessibility button overrides Menu, IME switcher and rotate buttons. setMenuVisibility(false, true); getImeSwitchButton().setVisibility(View.INVISIBLE); setRotateSuggestionButtonState(false, true); } getAccessibilityButton().setVisibility(visible ? View.VISIBLE : View.INVISIBLE); getAccessibilityButton().setLongClickable(longClickable); } public void setRotateSuggestionButtonState(final boolean visible) { setRotateSuggestionButtonState(visible, false); } public void setRotateSuggestionButtonState(final boolean visible, final boolean force) { ButtonDispatcher rotBtn = getRotateSuggestionButton(); final boolean currentlyVisible = mShowRotateButton; // Rerun a show animation to indicate change but don't rerun a hide animation if (!visible && !currentlyVisible) return; View currentView = rotBtn.getCurrentView(); if (currentView == null) return; KeyButtonDrawable kbd = rotBtn.getImageDrawable(); if (kbd == null) return; AnimatedVectorDrawable animIcon = null; if (kbd.getDrawable(0) instanceof AnimatedVectorDrawable) { animIcon = (AnimatedVectorDrawable) kbd.getDrawable(0); } if (visible) { // Appear and change, cannot force setRotateButtonVisibility(true); // Stop any currently running hide animations if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) { mRotateHideAnimator.pause(); } // Reset the alpha if any has changed due to hide animation currentView.setAlpha(1f); // Run the rotate icon's animation if it has one if (animIcon != null) { animIcon.reset(); animIcon.start(); } } else { // Hide if (force) { // If a hide animator is running stop it and instantly make invisible if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) { mRotateHideAnimator.pause(); } setRotateButtonVisibility(false); return; } // Don't start any new hide animations if one is running if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) return; ObjectAnimator fadeOut = ObjectAnimator.ofFloat(currentView, "alpha", 0f); fadeOut.setDuration(BUTTON_FADE_IN_OUT_DURATION_MS); fadeOut.setInterpolator(Interpolators.LINEAR); fadeOut.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { setRotateButtonVisibility(false); } }); mRotateHideAnimator = fadeOut; fadeOut.start(); } } private void setRotateButtonVisibility(final boolean visible) { // Never show if a11y is visible final boolean adjVisible = visible && !mShowAccessibilityButton; final int vis = adjVisible ? View.VISIBLE : View.INVISIBLE; getRotateSuggestionButton().setVisibility(vis); mShowRotateButton = visible; // Hide/restore other button visibility, if necessary setNavigationIconHints(mNavigationIconHints, true); } @Override public void onFinishInflate() { mNavigationInflaterView = (NavigationBarInflaterView) findViewById( Loading Loading
packages/SystemUI/res/layout/menu_ime.xml +9 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,15 @@ android:contentDescription="@string/accessibility_ime_switch_button" android:scaleType="centerInside" /> <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/rotate_suggestion" android:layout_width="@dimen/navigation_extra_key_width" android:layout_height="match_parent" android:layout_marginEnd="2dp" android:visibility="invisible" android:scaleType="centerInside" android:contentDescription="@string/accessibility_rotate_button" /> <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/accessibility_button" android:layout_width="@dimen/navigation_extra_key_width" Loading
packages/SystemUI/res/values/strings.xml +1 −3 Original line number Diff line number Diff line Loading @@ -1751,15 +1751,13 @@ <string-array name="nav_bar_buttons"> <item>Clipboard</item> <item>Keycode</item> <item>Keyboard switcher</item> <item>Rotation suggestion</item> <item>Rotate confirm, keyboard switcher</item> <item>None</item> </string-array> <string-array name="nav_bar_button_values" translatable="false"> <item>clipboard</item> <item>key</item> <item>menu_ime</item> <item>rotate</item> <item>space</item> </string-array> Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +19 −89 Original line number Diff line number Diff line Loading @@ -114,8 +114,6 @@ public class NavigationBarFragment extends Fragment implements Callbacks { /** Allow some time inbetween the long press for back and recents. */ private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200; private static final int BUTTON_FADE_IN_OUT_DURATION_MS = 100; protected NavigationBarView mNavigationBarView = null; protected AssistManager mAssistManager; Loading Loading @@ -152,7 +150,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private RotationLockController mRotationLockController; private TaskStackListenerImpl mTaskStackListener; private final Runnable mRemoveRotationProposal = () -> setRotateSuggestionButtonState(false); private final Runnable mRemoveRotationProposal = () -> safeSetRotationButtonState(false); private Animator mRotateShowAnimator; private Animator mRotateHideAnimator; Loading Loading @@ -361,22 +359,32 @@ public class NavigationBarFragment extends Fragment implements Callbacks { // rotate button if shown. if (!isValid) { setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); return; } if (rotation == mWindowManager.getDefaultDisplay().getRotation()) { // Use this as a signal to remove any current suggestions getView().getHandler().removeCallbacks(mRemoveRotationProposal); setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); } else { mLastRotationSuggestion = rotation; // Remember rotation for click setRotateSuggestionButtonState(true); safeSetRotationButtonState(true); rescheduleRotationTimeout(false); mMetricsLogger.visible(MetricsEvent.ROTATION_SUGGESTION_SHOWN); } } private void safeSetRotationButtonState(boolean vis) { if (mNavigationBarView != null) mNavigationBarView.setRotateSuggestionButtonState(vis); } private void safeSetRotationButtonState(boolean vis, boolean force) { if (mNavigationBarView != null) { mNavigationBarView.setRotateSuggestionButtonState(vis, force); } } private void rescheduleRotationTimeout(final boolean reasonHover) { // May be called due to a new rotation proposal or a change in hover state if (reasonHover) { Loading @@ -402,84 +410,6 @@ public class NavigationBarFragment extends Fragment implements Callbacks { return 6000; } public void setRotateSuggestionButtonState(final boolean visible) { setRotateSuggestionButtonState(visible, false); } public void setRotateSuggestionButtonState(final boolean visible, final boolean skipAnim) { ButtonDispatcher rotBtn = mNavigationBarView.getRotateSuggestionButton(); final boolean currentlyVisible = rotBtn.getVisibility() == View.VISIBLE; // Rerun a show animation to indicate change but don't rerun a hide animation if (!visible && !currentlyVisible) return; View currentView = rotBtn.getCurrentView(); if (currentView == null) return; KeyButtonDrawable kbd = rotBtn.getImageDrawable(); if (kbd == null) return; AnimatedVectorDrawable animIcon = null; if (kbd.getDrawable(0) instanceof AnimatedVectorDrawable) { animIcon = (AnimatedVectorDrawable) kbd.getDrawable(0); } if (visible) { // Appear and change rotBtn.setVisibility(View.VISIBLE); mNavigationBarView.notifySubtreeAccessibilityStateChangedIfNeeded(); if (skipAnim) { currentView.setAlpha(1f); return; } // Start a new animation if running if (mRotateShowAnimator != null) mRotateShowAnimator.pause(); if (mRotateHideAnimator != null) mRotateHideAnimator.pause(); ObjectAnimator appearFade = ObjectAnimator.ofFloat(currentView, "alpha", 0f, 1f); appearFade.setDuration(BUTTON_FADE_IN_OUT_DURATION_MS); appearFade.setInterpolator(Interpolators.LINEAR); mRotateShowAnimator = appearFade; appearFade.start(); // Run the rotate icon's animation if it has one if (animIcon != null) { animIcon.reset(); animIcon.start(); } } else { // Hide if (skipAnim) { rotBtn.setVisibility(View.INVISIBLE); mNavigationBarView.notifySubtreeAccessibilityStateChangedIfNeeded(); return; } // Don't start any new hide animations if one is running if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) return; // Pause any active show animations but don't reset the AVD to avoid jumps if (mRotateShowAnimator != null) mRotateShowAnimator.pause(); ObjectAnimator fadeOut = ObjectAnimator.ofFloat(currentView, "alpha", 0f); fadeOut.setDuration(BUTTON_FADE_IN_OUT_DURATION_MS); fadeOut.setInterpolator(Interpolators.LINEAR); fadeOut.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { rotBtn.setVisibility(View.INVISIBLE); mNavigationBarView.notifySubtreeAccessibilityStateChangedIfNeeded(); } }); mRotateHideAnimator = fadeOut; fadeOut.start(); } } // Injected from StatusBar at creation. public void setCurrentSysuiVisibility(int systemUiVisibility) { mSystemUiVisibility = systemUiVisibility; Loading Loading @@ -892,7 +822,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { if (shouldOverrideUserLockPrefs(rotation)) { mRotationLockController.setRotationLockedAtAngle(true, rotation); } setRotateSuggestionButtonState(false, true); safeSetRotationButtonState(false, true); } if (mNavigationBarView != null Loading Loading @@ -928,22 +858,22 @@ public class NavigationBarFragment extends Fragment implements Callbacks { @Override public void onTaskStackChanged() { setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); } @Override public void onTaskRemoved(int taskId) { setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); } @Override public void onTaskMovedToFront(int taskId) { setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); } @Override public void onActivityRequestedOrientationChanged(int taskId, int requestedOrientation) { setRotateSuggestionButtonState(false); safeSetRotationButtonState(false); } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +4 −7 Original line number Diff line number Diff line Loading @@ -57,13 +57,12 @@ public class NavigationBarInflaterView extends FrameLayout public static final String NAV_BAR_LEFT = "sysui_nav_bar_left"; public static final String NAV_BAR_RIGHT = "sysui_nav_bar_right"; public static final String MENU_IME = "menu_ime"; public static final String MENU_IME_ROTATE = "menu_ime"; public static final String BACK = "back"; public static final String HOME = "home"; public static final String RECENT = "recent"; public static final String NAVSPACE = "space"; public static final String CLIPBOARD = "clipboard"; public static final String ROTATE = "rotate"; public static final String KEY = "key"; public static final String LEFT = "left"; public static final String RIGHT = "right"; Loading Loading @@ -317,10 +316,10 @@ public class NavigationBarInflaterView extends FrameLayout View v = null; String button = extractButton(buttonSpec); if (LEFT.equals(button)) { String s = Dependency.get(TunerService.class).getValue(NAV_BAR_LEFT, ROTATE); String s = Dependency.get(TunerService.class).getValue(NAV_BAR_LEFT, NAVSPACE); button = extractButton(s); } else if (RIGHT.equals(button)) { String s = Dependency.get(TunerService.class).getValue(NAV_BAR_RIGHT, MENU_IME); String s = Dependency.get(TunerService.class).getValue(NAV_BAR_RIGHT, MENU_IME_ROTATE); button = extractButton(s); } // Let plugins go first so they can override a standard view if they want. Loading @@ -334,14 +333,12 @@ public class NavigationBarInflaterView extends FrameLayout v = inflater.inflate(R.layout.back, parent, false); } else if (RECENT.equals(button)) { v = inflater.inflate(R.layout.recent_apps, parent, false); } else if (MENU_IME.equals(button)) { } else if (MENU_IME_ROTATE.equals(button)) { v = inflater.inflate(R.layout.menu_ime, parent, false); } else if (NAVSPACE.equals(button)) { v = inflater.inflate(R.layout.nav_key_space, parent, false); } else if (CLIPBOARD.equals(button)) { v = inflater.inflate(R.layout.clipboard, parent, false); } else if (ROTATE.equals(button)) { v = inflater.inflate(R.layout.rotate_suggestion, parent, false); } else if (button.startsWith(KEY)) { String uri = extractImage(button); int code = extractKeycode(button); Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +104 −9 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.LayoutTransition; import android.animation.LayoutTransition.TransitionListener; import android.animation.ObjectAnimator; Loading @@ -29,6 +31,7 @@ import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.AnimatedVectorDrawable; import android.os.Handler; import android.os.Message; import android.os.RemoteException; Loading @@ -49,6 +52,7 @@ import android.widget.FrameLayout; import com.android.settingslib.Utils; import com.android.systemui.Dependency; import com.android.systemui.DockedStackExistsListener; import com.android.systemui.Interpolators; import com.android.systemui.OverviewProxyService; import com.android.systemui.R; import com.android.systemui.RecentsComponent; Loading @@ -70,6 +74,8 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav final static boolean DEBUG = false; final static String TAG = "StatusBar/NavBarView"; final static int BUTTON_FADE_IN_OUT_DURATION_MS = 100; // slippery nav bar when everything is disabled, e.g. during setup final static boolean SLIPPERY_WHEN_DISABLED = true; Loading @@ -85,6 +91,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav boolean mShowMenu; boolean mShowAccessibilityButton; boolean mLongClickableAccessibilityButton; boolean mShowRotateButton; int mDisabledFlags = 0; int mNavigationIconHints = 0; Loading Loading @@ -127,6 +134,8 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav private RecentsOnboarding mRecentsOnboarding; private NotificationPanelView mPanelView; private Animator mRotateHideAnimator; private class NavTransitionListener implements TransitionListener { private boolean mBackTransitioning; private boolean mHomeAppearing; Loading Loading @@ -471,22 +480,25 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav getHomeButton().setImageDrawable(mHomeDefaultIcon); } // The Accessibility button always overrides the appearance of the IME switcher // Update IME button visibility, a11y and rotate button always overrides the appearance final boolean showImeButton = !mShowAccessibilityButton && ((hints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0); !mShowAccessibilityButton && !mShowRotateButton && ((hints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0); getImeSwitchButton().setVisibility(showImeButton ? View.VISIBLE : View.INVISIBLE); getImeSwitchButton().setImageDrawable(mImeIcon); // Update menu button in case the IME state has changed. // Update menu button, visibility logic in method setMenuVisibility(mShowMenu, true); getMenuButton().setImageDrawable(mMenuIcon); // Update rotate button, visibility altered by a11y button logic getRotateSuggestionButton().setImageDrawable(mRotateSuggestionIcon); // Update a11y button, visibility logic in state method setAccessibilityButtonState(mShowAccessibilityButton, mLongClickableAccessibilityButton); getAccessibilityButton().setImageDrawable(mAccessibilityIcon); getRotateSuggestionButton().setImageDrawable(mRotateSuggestionIcon); setDisabledFlags(mDisabledFlags, true); mBarTransitions.reapplyDarkIntensity(); Loading Loading @@ -630,8 +642,10 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav mShowMenu = show; // Only show Menu if IME switcher and Accessibility button not shown. final boolean shouldShow = mShowMenu && !mShowAccessibilityButton && // Only show Menu if IME switcher, rotate and Accessibility buttons are not shown. final boolean shouldShow = mShowMenu && !mShowAccessibilityButton && !mShowRotateButton && ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) == 0); getMenuButton().setVisibility(shouldShow ? View.VISIBLE : View.INVISIBLE); Loading @@ -641,15 +655,96 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav mShowAccessibilityButton = visible; mLongClickableAccessibilityButton = longClickable; if (visible) { // Accessibility button overrides Menu and IME switcher buttons. // Accessibility button overrides Menu, IME switcher and rotate buttons. setMenuVisibility(false, true); getImeSwitchButton().setVisibility(View.INVISIBLE); setRotateSuggestionButtonState(false, true); } getAccessibilityButton().setVisibility(visible ? View.VISIBLE : View.INVISIBLE); getAccessibilityButton().setLongClickable(longClickable); } public void setRotateSuggestionButtonState(final boolean visible) { setRotateSuggestionButtonState(visible, false); } public void setRotateSuggestionButtonState(final boolean visible, final boolean force) { ButtonDispatcher rotBtn = getRotateSuggestionButton(); final boolean currentlyVisible = mShowRotateButton; // Rerun a show animation to indicate change but don't rerun a hide animation if (!visible && !currentlyVisible) return; View currentView = rotBtn.getCurrentView(); if (currentView == null) return; KeyButtonDrawable kbd = rotBtn.getImageDrawable(); if (kbd == null) return; AnimatedVectorDrawable animIcon = null; if (kbd.getDrawable(0) instanceof AnimatedVectorDrawable) { animIcon = (AnimatedVectorDrawable) kbd.getDrawable(0); } if (visible) { // Appear and change, cannot force setRotateButtonVisibility(true); // Stop any currently running hide animations if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) { mRotateHideAnimator.pause(); } // Reset the alpha if any has changed due to hide animation currentView.setAlpha(1f); // Run the rotate icon's animation if it has one if (animIcon != null) { animIcon.reset(); animIcon.start(); } } else { // Hide if (force) { // If a hide animator is running stop it and instantly make invisible if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) { mRotateHideAnimator.pause(); } setRotateButtonVisibility(false); return; } // Don't start any new hide animations if one is running if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) return; ObjectAnimator fadeOut = ObjectAnimator.ofFloat(currentView, "alpha", 0f); fadeOut.setDuration(BUTTON_FADE_IN_OUT_DURATION_MS); fadeOut.setInterpolator(Interpolators.LINEAR); fadeOut.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { setRotateButtonVisibility(false); } }); mRotateHideAnimator = fadeOut; fadeOut.start(); } } private void setRotateButtonVisibility(final boolean visible) { // Never show if a11y is visible final boolean adjVisible = visible && !mShowAccessibilityButton; final int vis = adjVisible ? View.VISIBLE : View.INVISIBLE; getRotateSuggestionButton().setVisibility(vis); mShowRotateButton = visible; // Hide/restore other button visibility, if necessary setNavigationIconHints(mNavigationIconHints, true); } @Override public void onFinishInflate() { mNavigationInflaterView = (NavigationBarInflaterView) findViewById( Loading