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