/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.android.talkbacktests.testsession;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.view.AccessibilityDelegateCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.android.talkbacktests.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class CollapsibleExpandableViewTest extends BaseTestContent {
private static final int GROUP_SIZE = 15;
private static final int ITEM_SIZE = 10;
private Context mContext;
private ExpandableListView mExpListView;
private List<String> mListHeader;
private HashMap<String, List<String>> mListData;
public CollapsibleExpandableViewTest(Context context, String subtitle, String description) {
super(context, subtitle, description);
}
@Override
public View getView(final LayoutInflater inflater, ViewGroup container, Context context) {
View view = inflater.inflate(R.layout.test_collapsible_expandable_view, container, false);
mExpListView = (ExpandableListView) view.findViewById(
R.id.expListView);
mContext = context;
prepareData();
mExpListView.setAdapter(new MyListAdapter());
return view;
}
private void prepareData() {
mListHeader = new ArrayList<>();
mListData = new HashMap<>();
for (int i = 0; i < GROUP_SIZE; i++) {
mListHeader.add(getString(R.string.list_header_template, (i + 1)));
List<String> child = new ArrayList<>();
for (int j = 0; j < ITEM_SIZE; j++) {
child.add(getString(R.string.list_item_template2, (i + 1), (j + 1)));
}
mListData.put(mListHeader.get(i), child);
}
}
private final class MyListAdapter extends BaseExpandableListAdapter {
@Override
public int getGroupCount() {
return mListHeader.size();
}
@Override
public int getChildrenCount(int index) {
return mListData.get(mListHeader.get(index)).size();
}
@Override
public Object getGroup(int index) {
return mListHeader.get(index);
}
@Override
public Object getChild(int groupIndex, int childIndex) {
return mListData.get(mListHeader.get(groupIndex)).get(childIndex);
}
@Override
public long getGroupId(int index) {
return index;
}
@Override
public long getChildId(int groupIndex, int childIndex) {
return childIndex;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(final int index, final boolean expanded, View view,
ViewGroup viewGroup) {
if (view == null) {
view = LayoutInflater.from(mContext).inflate(
R.layout.collapsible_expandable_listgroup, null);
}
ViewCompat.setAccessibilityDelegate(view, new MyDelegate(index));
TextView headerText = (TextView) view.findViewById(R.id.listHeader);
headerText.setText((String) getGroup(index));
return view;
}
@Override
public View getChildView(int groupIndex, int childIndex, boolean expanded,
View view, ViewGroup viewGroup) {
if (view == null) {
view = LayoutInflater.from(mContext).inflate(
R.layout.collapsible_expandable_listitem, null);
}
TextView itemText = (TextView) view.findViewById(R.id.listItem);
itemText.setText((String) getChild(groupIndex, childIndex));
return view;
}
@Override
public boolean isChildSelectable(int groupIndex, int childIndex) {
return true;
}
}
private final class MyDelegate extends AccessibilityDelegateCompat {
final int mIndex;
MyDelegate(int index) {
mIndex = index;
}
@Override
public void onInitializeAccessibilityNodeInfo(View host,
AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
if (mExpListView.isGroupExpanded(mIndex)) {
info.addAction(AccessibilityNodeInfoCompat.ACTION_COLLAPSE);
} else {
info.addAction(AccessibilityNodeInfoCompat.ACTION_EXPAND);
}
}
@Override
public boolean performAccessibilityAction(View host, int action, Bundle args) {
boolean result;
switch (action) {
case AccessibilityNodeInfoCompat.ACTION_COLLAPSE:
result = mExpListView.collapseGroup(mIndex);
break;
case AccessibilityNodeInfoCompat.ACTION_EXPAND:
result = mExpListView.expandGroup(mIndex);
break;
default:
result = super.performAccessibilityAction(host, action, args);
break;
}
return result;
}
}
}