13e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk/* 23e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * Copyright (C) 2014 The Android Open Source Project 33e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * 43e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 53e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * you may not use this file except in compliance with the License. 63e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * You may obtain a copy of the License at 73e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * 83e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * http://www.apache.org/licenses/LICENSE-2.0 93e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * 103e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * Unless required by applicable law or agreed to in writing, software 113e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 123e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * See the License for the specific language governing permissions and 143e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * limitations under the License. 153e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk */ 163e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 173e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkpackage com.android.testingcamera2; 183e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 193e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport android.content.Context; 203e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport android.util.Pair; 213e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport android.view.LayoutInflater; 223e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport android.view.View; 233e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport android.view.ViewGroup; 243e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport android.widget.ArrayAdapter; 253e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport android.widget.CheckBox; 263e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport android.widget.CompoundButton; 273e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 283e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport java.util.ArrayList; 293e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport java.util.List; 303e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 313e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk/** 323e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * A specialized adapter containing an array of checkboxes. 333e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * 343e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * <p> 353e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * This adapter contains an array of pairs, where each pair represents the name and checked 363e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * state of a given item. 373e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * </p> 383e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk */ 393e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkpublic class CheckableListAdapter extends ArrayAdapter<CheckableListAdapter.CheckableItem> { 403e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk private Context mContext; 413e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 423e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk public CheckableListAdapter(Context context, int resource, List<CheckableItem> objects) { 433e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk super(context, resource, objects); 443e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk mContext = context; 453e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 463e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 473e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk public static class CheckableItem { 483e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk public String name; 493e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk public boolean isChecked; 503e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 513e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk public CheckableItem(String name, boolean isChecked) { 523e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk this.name = name; 533e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk this.isChecked = isChecked; 543e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 553e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 563e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 573e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk @Override 583e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk public View getView(final int position, View convertView, ViewGroup parent) { 593e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk CheckBox row = (CheckBox) convertView; 603e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk if (row == null) { 613e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk LayoutInflater inflater = 623e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 633e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk row = (CheckBox) inflater.inflate(R.layout.checkable_list_item, parent, false); 643e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 653e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk CheckableItem item = getItem(position); 663e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk row.setChecked(item.isChecked); 673e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk row.setText(item.name); 683e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 693e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk row.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 703e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk @Override 713e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 723e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk CheckableItem item = getItem(position); 733e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk item.isChecked = b; 743e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 753e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk }); 763e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk return row; 773e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 783e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 793e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk /** 803e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * Returns a list containing the indexes of the currently checked items. 813e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * 823e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * @return a {@link java.util.List} of indices. 833e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk */ 843e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk public List<Integer> getCheckedPositions() { 853e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk ArrayList<Integer> checkedPositions = new ArrayList<Integer>(); 863e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk int size = getCount(); 873e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk for (int i = 0; i < size; i++) { 883e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk CheckableItem item = getItem(i); 893e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk if (item.isChecked) { 903e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk checkedPositions.add(i); 913e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 923e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 933e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 943e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk return checkedPositions; 953e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 963e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 973e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk /** 983e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * Update the items in this list. Checked state will be preserved for items that are 993e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * still included in the list. 1003e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * 1013e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk * @param elems a list of strings that represents the names of the items to be included. 1023e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk */ 1033e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk public void updateItems(String[] elems) { 1043e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk ArrayList<CheckableItem> newList = new ArrayList<CheckableItem>(); 1053e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk for (String e : elems) { 1063e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk CheckableItem item = new CheckableItem(e, false); 1073e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk newList.add(item); 1083e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk boolean newItem = true; 1093e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk int size = getCount(); 1103e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk for (int i = 0; i < size; i++) { 1113e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk CheckableItem current = getItem(i); 1123e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk if (current.name.equals(e) && current.isChecked) { 1133e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk item.isChecked = true; 1143e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk newItem = false; 1153e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 1163e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 1173e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk if (newItem) { 1183e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk item.isChecked = newItem; 1193e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 1203e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 1213e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk clear(); 1223e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk addAll(newList); 1233e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk notifyDataSetChanged(); 1243e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk } 1253e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk 1263e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk} 127