summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2017-01-12 05:11:23 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-01-12 05:11:26 +0000
commitadf8b4ca7660d4196ca575d12d05ce0b3077b23f (patch)
tree416c87bdd1e4318875a7d3902a373d217bc1b4ed
parent153071c70a30dd5c84650c92d5fec14aaaab1a05 (diff)
parent1abe85c867f552a5cdf50fba3f60d796284c2102 (diff)
Merge "Converting action bars to clusters."
-rw-r--r--core/java/android/app/ActionBar.java98
-rw-r--r--core/java/android/app/Activity.java35
-rw-r--r--core/java/android/widget/Toolbar.java18
-rw-r--r--core/java/com/android/internal/app/ToolbarActionBar.java19
-rw-r--r--core/java/com/android/internal/app/WindowDecorActionBar.java17
-rw-r--r--core/res/res/layout/screen_action_bar.xml4
-rw-r--r--core/res/res/layout/screen_toolbar.xml2
-rw-r--r--core/res/res/values/styles.xml2
8 files changed, 41 insertions, 154 deletions
diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java
index 58f5a787a355..12943258f50a 100644
--- a/core/java/android/app/ActionBar.java
+++ b/core/java/android/app/ActionBar.java
@@ -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;
@@ -1093,67 +1092,11 @@ 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.
*
* @deprecated Action bar navigation modes are deprecated and not supported by inline
@@ -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);
- }
- }
- }
- }
}
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 87e54166b3a1..f6771857f26b 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -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;
@@ -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;
@@ -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
@@ -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;
@@ -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();
diff --git a/core/java/android/widget/Toolbar.java b/core/java/android/widget/Toolbar.java
index 44b2b59a9dd3..2eb50e082041 100644
--- a/core/java/android/widget/Toolbar.java
+++ b/core/java/android/widget/Toolbar.java
@@ -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;
@@ -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.
diff --git a/core/java/com/android/internal/app/ToolbarActionBar.java b/core/java/com/android/internal/app/ToolbarActionBar.java
index 575ef0293361..74424f6b5385 100644
--- a/core/java/com/android/internal/app/ToolbarActionBar.java
+++ b/core/java/com/android/internal/app/ToolbarActionBar.java
@@ -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;
@@ -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 {
@@ -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);
diff --git a/core/java/com/android/internal/app/WindowDecorActionBar.java b/core/java/com/android/internal/app/WindowDecorActionBar.java
index 1376d0ad5cdc..1b3faf5a6d59 100644
--- a/core/java/com/android/internal/app/WindowDecorActionBar.java
+++ b/core/java/com/android/internal/app/WindowDecorActionBar.java
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -970,12 +967,6 @@ public class WindowDecorActionBar extends ActionBar implements
return false;
}
- /** @hide */
- @Override
- public boolean requestFocus() {
- return requestFocus(mDecorToolbar.getViewGroup());
- }
-
/**
* @hide
*/
diff --git a/core/res/res/layout/screen_action_bar.xml b/core/res/res/layout/screen_action_bar.xml
index b3a34789883b..edcbb2b6b498 100644
--- a/core/res/res/layout/screen_action_bar.xml
+++ b/core/res/res/layout/screen_action_bar.xml
@@ -35,7 +35,7 @@ This is an optimized layout for a screen with the Action Bar enabled.
android:layout_alignParentTop="true"
style="?attr/actionBarStyle"
android:transitionName="android:action_bar"
- android:touchscreenBlocksFocus="true"
+ android:keyboardNavigationCluster="true"
android:gravity="top">
<com.android.internal.widget.ActionBarView
android:id="@+id/action_bar"
@@ -54,6 +54,6 @@ This is an optimized layout for a screen with the Action Bar enabled.
android:layout_height="wrap_content"
style="?attr/actionBarSplitStyle"
android:visibility="gone"
- android:touchscreenBlocksFocus="true"
+ android:keyboardNavigationCluster="true"
android:gravity="center"/>
</com.android.internal.widget.ActionBarOverlayLayout>
diff --git a/core/res/res/layout/screen_toolbar.xml b/core/res/res/layout/screen_toolbar.xml
index 88c9cf6007fc..0bec8c40c1a8 100644
--- a/core/res/res/layout/screen_toolbar.xml
+++ b/core/res/res/layout/screen_toolbar.xml
@@ -35,7 +35,7 @@ This is an optimized layout for a screen with a toolbar enabled.
android:layout_alignParentTop="true"
style="?attr/actionBarStyle"
android:transitionName="android:action_bar"
- android:touchscreenBlocksFocus="true"
+ android:keyboardNavigationCluster="true"
android:gravity="top">
<Toolbar
android:id="@+id/action_bar"
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index ce7ab1626aa0..842b5759a5ea 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -1249,7 +1249,7 @@ please see styles_device_defaults.xml.
<item name="collapseContentDescription">@string/toolbar_collapse_description</item>
<item name="contentInsetStart">16dp</item>
<item name="contentInsetStartWithNavigation">@dimen/action_bar_content_inset_with_nav</item>
- <item name="touchscreenBlocksFocus">true</item>
+ <item name="keyboardNavigationCluster">true</item>
</style>
<style name="Widget.Toolbar.Button.Navigation" parent="Widget">