aboutsummaryrefslogtreecommitdiff
path: root/common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java')
-rw-r--r--common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java133
1 files changed, 111 insertions, 22 deletions
diff --git a/common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java b/common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java
index 7bce9c27..3c76c269 100644
--- a/common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java
+++ b/common/src/com/android/tv/common/ui/setup/SetupGuidedStepFragment.java
@@ -16,22 +16,26 @@
package com.android.tv.common.ui.setup;
+import static android.content.Context.ACCESSIBILITY_SERVICE;
+
import android.os.Bundle;
import android.support.v17.leanback.app.GuidedStepFragment;
import android.support.v17.leanback.widget.GuidanceStylist;
import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidedActionsStylist;
import android.support.v17.leanback.widget.VerticalGridView;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.View.AccessibilityDelegate;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.LinearLayout;
-
import com.android.tv.common.R;
-/**
- * A fragment for channel source info/setup.
- */
+/** A fragment for channel source info/setup. */
public abstract class SetupGuidedStepFragment extends GuidedStepFragment {
/**
* Key of the argument which indicate whether the parent of this fragment has three panes.
@@ -40,23 +44,30 @@ public abstract class SetupGuidedStepFragment extends GuidedStepFragment {
*/
public static final String KEY_THREE_PANE = "key_three_pane";
+ private View mContentFragment;
+ private boolean mFromContentFragment;
+ private boolean mAccessibilityMode;
+
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
Bundle arguments = getArguments();
view.findViewById(android.support.v17.leanback.R.id.action_fragment_root)
.setPadding(0, 0, 0, 0);
- LinearLayout.LayoutParams guidanceLayoutParams = (LinearLayout.LayoutParams)
- view.findViewById(android.support.v17.leanback.R.id.content_fragment)
- .getLayoutParams();
+ mContentFragment = view.findViewById(android.support.v17.leanback.R.id.content_fragment);
+ LinearLayout.LayoutParams guidanceLayoutParams =
+ (LinearLayout.LayoutParams) mContentFragment.getLayoutParams();
guidanceLayoutParams.weight = 0;
if (arguments != null && arguments.getBoolean(KEY_THREE_PANE, false)) {
// Content fragment.
- guidanceLayoutParams.width = getResources().getDimensionPixelOffset(
- R.dimen.setup_guidedstep_guidance_section_width_3pane);
- int doneButtonWidth = getResources().getDimensionPixelOffset(
- R.dimen.setup_done_button_container_width);
+ guidanceLayoutParams.width =
+ getResources()
+ .getDimensionPixelOffset(
+ R.dimen.setup_guidedstep_guidance_section_width_3pane);
+ int doneButtonWidth =
+ getResources()
+ .getDimensionPixelOffset(R.dimen.setup_done_button_container_width);
// Guided actions list
View list = view.findViewById(android.support.v17.leanback.R.id.guidedactions_list);
MarginLayoutParams marginLayoutParams = (MarginLayoutParams) list.getLayoutParams();
@@ -69,13 +80,16 @@ public abstract class SetupGuidedStepFragment extends GuidedStepFragment {
}
} else {
// Content fragment.
- guidanceLayoutParams.width = getResources().getDimensionPixelOffset(
- R.dimen.setup_guidedstep_guidance_section_width_2pane);
+ guidanceLayoutParams.width =
+ getResources()
+ .getDimensionPixelOffset(
+ R.dimen.setup_guidedstep_guidance_section_width_2pane);
}
// gridView Alignment
VerticalGridView gridView = getGuidedActionsStylist().getActionsGridView();
- int offset = getResources().getDimensionPixelOffset(
- R.dimen.setup_guidedactions_selector_margin_top);
+ int offset =
+ getResources()
+ .getDimensionPixelOffset(R.dimen.setup_guidedactions_selector_margin_top);
gridView.setWindowAlignmentOffset(offset);
gridView.setWindowAlignmentOffsetPercent(0);
gridView.setItemAlignmentOffsetPercent(0);
@@ -83,19 +97,51 @@ public abstract class SetupGuidedStepFragment extends GuidedStepFragment {
.setTransitionGroup(false);
// Needed for the shared element transition.
// content_frame is defined in leanback.
- ViewGroup group = (ViewGroup) view.findViewById(
- android.support.v17.leanback.R.id.content_frame);
+ ViewGroup group =
+ (ViewGroup) view.findViewById(android.support.v17.leanback.R.id.content_frame);
group.setClipChildren(false);
group.setClipToPadding(false);
return view;
}
@Override
+ public GuidedActionsStylist onCreateActionsStylist() {
+ return new SetupGuidedStepFragmentGuidedActionsStylist();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ AccessibilityManager am =
+ (AccessibilityManager) getActivity().getSystemService(ACCESSIBILITY_SERVICE);
+ mAccessibilityMode = am != null && am.isEnabled() && am.isTouchExplorationEnabled();
+ mContentFragment.setFocusable(mAccessibilityMode);
+ if (mAccessibilityMode) {
+ mContentFragment.setAccessibilityDelegate(
+ new AccessibilityDelegate() {
+ @Override
+ public boolean performAccessibilityAction(View host, int action, Bundle args) {
+ if (action == AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS
+ && !getActions().isEmpty()) {
+ // scroll to the top. This makes the first action view on the screen.
+ // Otherwise, the view can be recycled, so accessibility events cannot
+ // be sent later.
+ getGuidedActionsStylist().getActionsGridView().scrollToPosition(0);
+ mFromContentFragment = true;
+ }
+ return super.performAccessibilityAction(host, action, args);
+ }
+ });
+ mContentFragment.requestFocus();
+ }
+ }
+
+ @Override
public GuidanceStylist onCreateGuidanceStylist() {
return new GuidanceStylist() {
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Guidance guidance) {
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Guidance guidance) {
View view = super.onCreateView(inflater, container, guidance);
if (guidance.getIconDrawable() == null) {
// Icon view should not take up space when we don't use image.
@@ -106,10 +152,19 @@ public abstract class SetupGuidedStepFragment extends GuidedStepFragment {
};
}
- abstract protected String getActionCategory();
+ protected abstract String getActionCategory();
+
+ protected View getDoneButton() {
+ return getActivity().findViewById(R.id.button_done);
+ }
@Override
public void onGuidedActionClicked(GuidedAction action) {
+ if (!action.isFocusable()) {
+ // an unfocusable action may be clicked in accessibility mode when it's accessibility
+ // focused
+ return;
+ }
SetupActionHelper.onActionClick(this, getActionCategory(), (int) action.getId());
}
@@ -122,4 +177,38 @@ public abstract class SetupGuidedStepFragment extends GuidedStepFragment {
public boolean isFocusOutEndAllowed() {
return true;
}
+
+ protected void setAccessibilityDelegate(GuidedActionsStylist.ViewHolder vh,
+ GuidedAction action) {
+ if (!mAccessibilityMode || findActionPositionById(action.getId()) == 0) {
+ return;
+ }
+ vh.itemView.setAccessibilityDelegate(
+ new AccessibilityDelegate() {
+ @Override
+ public boolean performAccessibilityAction(View host, int action, Bundle args) {
+ if ((action == AccessibilityNodeInfo.ACTION_FOCUS
+ || action == AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS)
+ && mFromContentFragment) {
+ // block the action and make the first action view accessibility focused
+ View view = getActionItemView(0);
+ if (view != null) {
+ view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
+ mFromContentFragment = false;
+ return true;
+ }
+ }
+ return super.performAccessibilityAction(host, action, args);
+ }
+ });
+ }
+
+ private class SetupGuidedStepFragmentGuidedActionsStylist extends GuidedActionsStylist {
+
+ @Override
+ public void onBindViewHolder(GuidedActionsStylist.ViewHolder vh, GuidedAction action) {
+ super.onBindViewHolder(vh, action);
+ setAccessibilityDelegate(vh, action);
+ }
+ }
}