1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.testingcamera2;
18
19import android.content.Context;
20import android.util.Pair;
21import android.view.LayoutInflater;
22import android.view.View;
23import android.view.ViewGroup;
24import android.widget.ArrayAdapter;
25import android.widget.CheckBox;
26import android.widget.CompoundButton;
27
28import java.util.ArrayList;
29import java.util.List;
30
31/**
32 * A specialized adapter containing an array of checkboxes.
33 *
34 * <p>
35 * This adapter contains an array of pairs, where each pair represents the name and checked
36 * state of a given item.
37 * </p>
38 */
39public class CheckableListAdapter extends ArrayAdapter<CheckableListAdapter.CheckableItem> {
40    private Context mContext;
41
42    public CheckableListAdapter(Context context, int resource, List<CheckableItem> objects) {
43        super(context, resource, objects);
44        mContext = context;
45    }
46
47    public static class CheckableItem {
48        public String name;
49        public boolean isChecked;
50
51        public CheckableItem(String name, boolean isChecked) {
52            this.name = name;
53            this.isChecked = isChecked;
54        }
55    }
56
57    @Override
58    public View getView(final int position, View convertView, ViewGroup parent) {
59        CheckBox row = (CheckBox) convertView;
60        if (row == null) {
61            LayoutInflater inflater =
62                    (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
63            row = (CheckBox) inflater.inflate(R.layout.checkable_list_item, parent, false);
64        }
65        CheckableItem item = getItem(position);
66        row.setChecked(item.isChecked);
67        row.setText(item.name);
68
69        row.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
70            @Override
71            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
72                CheckableItem item = getItem(position);
73                item.isChecked = b;
74            }
75        });
76        return row;
77    }
78
79    /**
80     * Returns a list containing the indexes of the currently checked items.
81     *
82     * @return a {@link java.util.List} of indices.
83     */
84    public List<Integer> getCheckedPositions() {
85        ArrayList<Integer> checkedPositions = new ArrayList<Integer>();
86        int size = getCount();
87        for (int i = 0; i < size; i++) {
88            CheckableItem item = getItem(i);
89            if (item.isChecked) {
90                checkedPositions.add(i);
91            }
92        }
93
94        return checkedPositions;
95    }
96
97    /**
98     * Update the items in this list.  Checked state will be preserved for items that are
99     * still included in the list.
100     *
101     * @param elems a list of strings that represents the names of the items to be included.
102     */
103    public void updateItems(String[] elems) {
104        ArrayList<CheckableItem> newList = new ArrayList<CheckableItem>();
105        for (String e : elems) {
106            CheckableItem item = new CheckableItem(e, false);
107            newList.add(item);
108            boolean newItem = true;
109            int size = getCount();
110            for (int i = 0; i < size; i++) {
111                CheckableItem current = getItem(i);
112                if (current.name.equals(e) && current.isChecked) {
113                    item.isChecked = true;
114                    newItem = false;
115                }
116            }
117            if (newItem) {
118                item.isChecked = newItem;
119            }
120        }
121        clear();
122        addAll(newList);
123        notifyDataSetChanged();
124    }
125
126}
127