Loading core/java/android/app/ActionBar.java +1 −97 Original line number Diff line number Diff line Loading @@ -31,13 +31,12 @@ import android.view.ActionMode; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.View.OnFocusChangeListener; import android.view.ViewDebug; import android.view.ViewGroup; import android.view.ViewHierarchyEncoder; import android.view.ViewParent; import android.view.Window; import android.widget.SpinnerAdapter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; Loading Loading @@ -1093,66 +1092,10 @@ public abstract class ActionBar { public void setWindowTitle(CharSequence title) { } /** * Attempts to move focus to the ActionBar if it does not already contain the focus. * * @return {@code true} if focus changes or {@code false} if focus doesn't change. * @hide */ public boolean requestFocus() { return false; } /** @hide */ public void onDestroy() { } /** * Common implementation for requestFocus that takes in the Toolbar and moves focus * to the contents. This makes the ViewGroups containing the toolbar allow focus while it stays * in the ActionBar and then prevents it again once it leaves. * * @param viewGroup The toolbar ViewGroup * @return {@code true} if focus changes or {@code false} if focus doesn't change. * @hide */ protected boolean requestFocus(ViewGroup viewGroup) { if (viewGroup != null && !viewGroup.hasFocus()) { final ViewGroup toolbar = viewGroup.getTouchscreenBlocksFocus() ? viewGroup : null; ViewParent parent = viewGroup.getParent(); ViewGroup container = null; while (parent != null && parent instanceof ViewGroup) { final ViewGroup vgParent = (ViewGroup) parent; if (vgParent.getTouchscreenBlocksFocus()) { container = vgParent; break; } parent = vgParent.getParent(); } if (container != null) { container.setTouchscreenBlocksFocus(false); } if (toolbar != null) { toolbar.setTouchscreenBlocksFocus(false); } viewGroup.requestFocus(); final View focused = viewGroup.findFocus(); if (focused != null) { focused.setOnFocusChangeListener(new FollowOutOfActionBar(viewGroup, container, toolbar)); } else { if (container != null) { container.setTouchscreenBlocksFocus(true); } if (toolbar != null) { toolbar.setTouchscreenBlocksFocus(true); } } return true; } return false; } /** * Listener interface for ActionBar navigation events. * Loading Loading @@ -1474,43 +1417,4 @@ public abstract class ActionBar { encoder.addProperty("gravity", gravity); } } /** * Tracks the focused View until it leaves the ActionBar, then it resets the * touchscreenBlocksFocus value. */ private static class FollowOutOfActionBar implements OnFocusChangeListener, Runnable { private final ViewGroup mFocusRoot; private final ViewGroup mContainer; private final ViewGroup mToolbar; public FollowOutOfActionBar(ViewGroup focusRoot, ViewGroup container, ViewGroup toolbar) { mContainer = container; mToolbar = toolbar; mFocusRoot = focusRoot; } @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { v.setOnFocusChangeListener(null); mFocusRoot.post(this); } } @Override public void run() { final View focused = mFocusRoot.findFocus(); if (focused != null) { focused.setOnFocusChangeListener(this); } else { if (mContainer != null) { mContainer.setTouchscreenBlocksFocus(true); } if (mToolbar != null) { mToolbar.setTouchscreenBlocksFocus(true); } } } } } core/java/android/app/Activity.java +9 −26 Original line number Diff line number Diff line Loading @@ -16,7 +16,11 @@ package android.app; import static java.lang.Character.MIN_VALUE; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.ToolbarActionBar; import com.android.internal.app.WindowDecorActionBar; import com.android.internal.policy.PhoneWindow; import android.annotation.CallSuper; import android.annotation.DrawableRes; Loading Loading @@ -114,22 +118,14 @@ import android.view.Window.WindowControllerCallback; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityEvent; import android.view.autofill.VirtualViewDelegate; import android.view.autofill.AutoFillId; import android.view.autofill.Dataset; import android.view.autofill.DatasetField; import android.view.autofill.AutoFillId; import android.view.autofill.FillResponse; import android.view.autofill.VirtualViewDelegate; import android.widget.AdapterView; import android.widget.EditText; import android.widget.Toast; import android.widget.Toolbar; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.ToolbarActionBar; import com.android.internal.app.WindowDecorActionBar; import com.android.internal.policy.PhoneWindow; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; Loading @@ -139,6 +135,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import static java.lang.Character.MIN_VALUE; /** * An activity is a single, focused thing that the user can do. Almost all * activities interact with the user, so the Activity class takes care of Loading Loading @@ -852,7 +850,6 @@ public class Activity extends ContextThemeWrapper SharedElementCallback mExitTransitionListener = SharedElementCallback.NULL_CALLBACK; private boolean mHasCurrentPermissionsRequest; private boolean mEatKeyUpEvent; @GuardedBy("this") private WeakReference<IAutoFillAppCallback> mAutoFillCallback; Loading Loading @@ -3181,20 +3178,6 @@ public class Activity extends ContextThemeWrapper if (keyCode == KeyEvent.KEYCODE_MENU && mActionBar != null && mActionBar.onMenuKeyEvent(event)) { return true; } else if (event.isCtrlPressed() && event.getUnicodeChar(event.getMetaState() & ~KeyEvent.META_CTRL_MASK) == '<') { // Capture the Control-< and send focus to the ActionBar final int action = event.getAction(); if (action == KeyEvent.ACTION_DOWN) { final ActionBar actionBar = getActionBar(); if (actionBar != null && actionBar.isShowing() && actionBar.requestFocus()) { mEatKeyUpEvent = true; return true; } } else if (action == KeyEvent.ACTION_UP && mEatKeyUpEvent) { mEatKeyUpEvent = false; return true; } } Window win = getWindow(); Loading core/java/android/widget/Toolbar.java +18 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import com.android.internal.R; import com.android.internal.view.menu.MenuBuilder; Loading Loading @@ -331,6 +332,23 @@ public class Toolbar extends ViewGroup { a.recycle(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); // If the container is a cluster, unmark itself as a cluster to avoid having nested // clusters. ViewParent parent = getParent(); while (parent != null && parent instanceof ViewGroup) { final ViewGroup vgParent = (ViewGroup) parent; if (vgParent.isKeyboardNavigationCluster()) { setKeyboardNavigationCluster(false); break; } parent = vgParent.getParent(); } } /** * Specifies the theme to use when inflating popup menus. By default, uses * the same theme as the toolbar itself. Loading core/java/com/android/internal/app/ToolbarActionBar.java +5 −14 Original line number Diff line number Diff line Loading @@ -17,6 +17,11 @@ package com.android.internal.app; import com.android.internal.view.menu.MenuBuilder; import com.android.internal.view.menu.MenuPresenter; import com.android.internal.widget.DecorToolbar; import com.android.internal.widget.ToolbarWidgetWrapper; import android.annotation.Nullable; import android.app.ActionBar; import android.content.Context; Loading @@ -29,19 +34,11 @@ import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnFocusChangeListener; import android.view.ViewGroup; import android.view.ViewParent; import android.view.Window; import android.view.WindowCallbackWrapper; import android.widget.SpinnerAdapter; import android.widget.Toolbar; import com.android.internal.view.menu.MenuBuilder; import com.android.internal.view.menu.MenuPresenter; import com.android.internal.widget.DecorToolbar; import com.android.internal.widget.ToolbarWidgetWrapper; import java.util.ArrayList; public class ToolbarActionBar extends ActionBar { Loading Loading @@ -509,12 +506,6 @@ public class ToolbarActionBar extends ActionBar { } } /** @hide */ @Override public boolean requestFocus() { return requestFocus(mDecorToolbar.getViewGroup()); } private class ToolbarCallbackWrapper extends WindowCallbackWrapper { public ToolbarCallbackWrapper(Window.Callback wrapped) { super(wrapped); Loading core/java/com/android/internal/app/WindowDecorActionBar.java +4 −13 Original line number Diff line number Diff line Loading @@ -16,13 +16,6 @@ package com.android.internal.app; import android.animation.ValueAnimator; import android.content.res.TypedArray; import android.view.View.OnFocusChangeListener; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.Toolbar; import com.android.internal.R; import com.android.internal.view.ActionBarPolicy; import com.android.internal.view.menu.MenuBuilder; Loading @@ -39,6 +32,7 @@ import android.animation.Animator.AnimatorListener; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.ActionBar; import android.app.Activity; import android.app.Dialog; Loading @@ -46,6 +40,7 @@ import android.app.FragmentTransaction; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.util.TypedValue; import android.view.ActionMode; Loading @@ -55,10 +50,12 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewParent; import android.view.Window; import android.view.accessibility.AccessibilityEvent; import android.view.animation.AnimationUtils; import android.widget.SpinnerAdapter; import android.widget.Toolbar; import java.lang.ref.WeakReference; import java.util.ArrayList; Loading Loading @@ -970,12 +967,6 @@ public class WindowDecorActionBar extends ActionBar implements return false; } /** @hide */ @Override public boolean requestFocus() { return requestFocus(mDecorToolbar.getViewGroup()); } /** * @hide */ Loading Loading
core/java/android/app/ActionBar.java +1 −97 Original line number Diff line number Diff line Loading @@ -31,13 +31,12 @@ import android.view.ActionMode; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.View.OnFocusChangeListener; import android.view.ViewDebug; import android.view.ViewGroup; import android.view.ViewHierarchyEncoder; import android.view.ViewParent; import android.view.Window; import android.widget.SpinnerAdapter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; Loading Loading @@ -1093,66 +1092,10 @@ public abstract class ActionBar { public void setWindowTitle(CharSequence title) { } /** * Attempts to move focus to the ActionBar if it does not already contain the focus. * * @return {@code true} if focus changes or {@code false} if focus doesn't change. * @hide */ public boolean requestFocus() { return false; } /** @hide */ public void onDestroy() { } /** * Common implementation for requestFocus that takes in the Toolbar and moves focus * to the contents. This makes the ViewGroups containing the toolbar allow focus while it stays * in the ActionBar and then prevents it again once it leaves. * * @param viewGroup The toolbar ViewGroup * @return {@code true} if focus changes or {@code false} if focus doesn't change. * @hide */ protected boolean requestFocus(ViewGroup viewGroup) { if (viewGroup != null && !viewGroup.hasFocus()) { final ViewGroup toolbar = viewGroup.getTouchscreenBlocksFocus() ? viewGroup : null; ViewParent parent = viewGroup.getParent(); ViewGroup container = null; while (parent != null && parent instanceof ViewGroup) { final ViewGroup vgParent = (ViewGroup) parent; if (vgParent.getTouchscreenBlocksFocus()) { container = vgParent; break; } parent = vgParent.getParent(); } if (container != null) { container.setTouchscreenBlocksFocus(false); } if (toolbar != null) { toolbar.setTouchscreenBlocksFocus(false); } viewGroup.requestFocus(); final View focused = viewGroup.findFocus(); if (focused != null) { focused.setOnFocusChangeListener(new FollowOutOfActionBar(viewGroup, container, toolbar)); } else { if (container != null) { container.setTouchscreenBlocksFocus(true); } if (toolbar != null) { toolbar.setTouchscreenBlocksFocus(true); } } return true; } return false; } /** * Listener interface for ActionBar navigation events. * Loading Loading @@ -1474,43 +1417,4 @@ public abstract class ActionBar { encoder.addProperty("gravity", gravity); } } /** * Tracks the focused View until it leaves the ActionBar, then it resets the * touchscreenBlocksFocus value. */ private static class FollowOutOfActionBar implements OnFocusChangeListener, Runnable { private final ViewGroup mFocusRoot; private final ViewGroup mContainer; private final ViewGroup mToolbar; public FollowOutOfActionBar(ViewGroup focusRoot, ViewGroup container, ViewGroup toolbar) { mContainer = container; mToolbar = toolbar; mFocusRoot = focusRoot; } @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { v.setOnFocusChangeListener(null); mFocusRoot.post(this); } } @Override public void run() { final View focused = mFocusRoot.findFocus(); if (focused != null) { focused.setOnFocusChangeListener(this); } else { if (mContainer != null) { mContainer.setTouchscreenBlocksFocus(true); } if (mToolbar != null) { mToolbar.setTouchscreenBlocksFocus(true); } } } } }
core/java/android/app/Activity.java +9 −26 Original line number Diff line number Diff line Loading @@ -16,7 +16,11 @@ package android.app; import static java.lang.Character.MIN_VALUE; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.ToolbarActionBar; import com.android.internal.app.WindowDecorActionBar; import com.android.internal.policy.PhoneWindow; import android.annotation.CallSuper; import android.annotation.DrawableRes; Loading Loading @@ -114,22 +118,14 @@ import android.view.Window.WindowControllerCallback; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityEvent; import android.view.autofill.VirtualViewDelegate; import android.view.autofill.AutoFillId; import android.view.autofill.Dataset; import android.view.autofill.DatasetField; import android.view.autofill.AutoFillId; import android.view.autofill.FillResponse; import android.view.autofill.VirtualViewDelegate; import android.widget.AdapterView; import android.widget.EditText; import android.widget.Toast; import android.widget.Toolbar; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.ToolbarActionBar; import com.android.internal.app.WindowDecorActionBar; import com.android.internal.policy.PhoneWindow; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; Loading @@ -139,6 +135,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import static java.lang.Character.MIN_VALUE; /** * An activity is a single, focused thing that the user can do. Almost all * activities interact with the user, so the Activity class takes care of Loading Loading @@ -852,7 +850,6 @@ public class Activity extends ContextThemeWrapper SharedElementCallback mExitTransitionListener = SharedElementCallback.NULL_CALLBACK; private boolean mHasCurrentPermissionsRequest; private boolean mEatKeyUpEvent; @GuardedBy("this") private WeakReference<IAutoFillAppCallback> mAutoFillCallback; Loading Loading @@ -3181,20 +3178,6 @@ public class Activity extends ContextThemeWrapper if (keyCode == KeyEvent.KEYCODE_MENU && mActionBar != null && mActionBar.onMenuKeyEvent(event)) { return true; } else if (event.isCtrlPressed() && event.getUnicodeChar(event.getMetaState() & ~KeyEvent.META_CTRL_MASK) == '<') { // Capture the Control-< and send focus to the ActionBar final int action = event.getAction(); if (action == KeyEvent.ACTION_DOWN) { final ActionBar actionBar = getActionBar(); if (actionBar != null && actionBar.isShowing() && actionBar.requestFocus()) { mEatKeyUpEvent = true; return true; } } else if (action == KeyEvent.ACTION_UP && mEatKeyUpEvent) { mEatKeyUpEvent = false; return true; } } Window win = getWindow(); Loading
core/java/android/widget/Toolbar.java +18 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import com.android.internal.R; import com.android.internal.view.menu.MenuBuilder; Loading Loading @@ -331,6 +332,23 @@ public class Toolbar extends ViewGroup { a.recycle(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); // If the container is a cluster, unmark itself as a cluster to avoid having nested // clusters. ViewParent parent = getParent(); while (parent != null && parent instanceof ViewGroup) { final ViewGroup vgParent = (ViewGroup) parent; if (vgParent.isKeyboardNavigationCluster()) { setKeyboardNavigationCluster(false); break; } parent = vgParent.getParent(); } } /** * Specifies the theme to use when inflating popup menus. By default, uses * the same theme as the toolbar itself. Loading
core/java/com/android/internal/app/ToolbarActionBar.java +5 −14 Original line number Diff line number Diff line Loading @@ -17,6 +17,11 @@ package com.android.internal.app; import com.android.internal.view.menu.MenuBuilder; import com.android.internal.view.menu.MenuPresenter; import com.android.internal.widget.DecorToolbar; import com.android.internal.widget.ToolbarWidgetWrapper; import android.annotation.Nullable; import android.app.ActionBar; import android.content.Context; Loading @@ -29,19 +34,11 @@ import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnFocusChangeListener; import android.view.ViewGroup; import android.view.ViewParent; import android.view.Window; import android.view.WindowCallbackWrapper; import android.widget.SpinnerAdapter; import android.widget.Toolbar; import com.android.internal.view.menu.MenuBuilder; import com.android.internal.view.menu.MenuPresenter; import com.android.internal.widget.DecorToolbar; import com.android.internal.widget.ToolbarWidgetWrapper; import java.util.ArrayList; public class ToolbarActionBar extends ActionBar { Loading Loading @@ -509,12 +506,6 @@ public class ToolbarActionBar extends ActionBar { } } /** @hide */ @Override public boolean requestFocus() { return requestFocus(mDecorToolbar.getViewGroup()); } private class ToolbarCallbackWrapper extends WindowCallbackWrapper { public ToolbarCallbackWrapper(Window.Callback wrapped) { super(wrapped); Loading
core/java/com/android/internal/app/WindowDecorActionBar.java +4 −13 Original line number Diff line number Diff line Loading @@ -16,13 +16,6 @@ package com.android.internal.app; import android.animation.ValueAnimator; import android.content.res.TypedArray; import android.view.View.OnFocusChangeListener; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.Toolbar; import com.android.internal.R; import com.android.internal.view.ActionBarPolicy; import com.android.internal.view.menu.MenuBuilder; Loading @@ -39,6 +32,7 @@ import android.animation.Animator.AnimatorListener; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.ActionBar; import android.app.Activity; import android.app.Dialog; Loading @@ -46,6 +40,7 @@ import android.app.FragmentTransaction; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.util.TypedValue; import android.view.ActionMode; Loading @@ -55,10 +50,12 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewParent; import android.view.Window; import android.view.accessibility.AccessibilityEvent; import android.view.animation.AnimationUtils; import android.widget.SpinnerAdapter; import android.widget.Toolbar; import java.lang.ref.WeakReference; import java.util.ArrayList; Loading Loading @@ -970,12 +967,6 @@ public class WindowDecorActionBar extends ActionBar implements return false; } /** @hide */ @Override public boolean requestFocus() { return requestFocus(mDecorToolbar.getViewGroup()); } /** * @hide */ Loading