1d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren/*
2d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren * Copyright (C) 2012 The Android Open Source Project
3d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren *
4d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren * Licensed under the Apache License, Version 2.0 (the "License");
5d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren * you may not use this file except in compliance with the License.
6d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren * You may obtain a copy of the License at
7d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren *
8d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren *      http://www.apache.org/licenses/LICENSE-2.0
9d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren *
10d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren * Unless required by applicable law or agreed to in writing, software
11d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren * distributed under the License is distributed on an "AS IS" BASIS,
12d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren * See the License for the specific language governing permissions and
14d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren * limitations under the License.
15d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren */
16d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenpackage com.android.dreams.phototable;
17d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
18d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport android.content.Context;
19e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wrenimport android.content.SharedPreferences;
20d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport android.util.Log;
21d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport android.view.LayoutInflater;
22d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport android.view.View;
23d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport android.view.View.OnClickListener;
24d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport android.view.ViewGroup;
25d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport android.widget.ArrayAdapter;
26d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport android.widget.CheckBox;
27d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport android.widget.TextView;
28d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
29d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport java.util.Comparator;
30d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport java.util.HashSet;
31d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport java.util.List;
32d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
33d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren/**
34d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren * Settings panel for photo flipping dream.
35d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren */
36d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenpublic class AlbumDataAdapter extends ArrayAdapter<PhotoSource.AlbumData> {
37d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    private static final String TAG = "AlbumDataAdapter";
38e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren    private static final boolean DEBUG = false;
39d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
40d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    public static final String ALBUM_SET = "Enabled Album Set";
41d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
42d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren    private final AlbumSettings mSettings;
43d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    private final LayoutInflater mInflater;
44d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    private final int mLayout;
45d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    private final ItemClickListener mListener;
462ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren    private final HashSet<String> mValidAlbumIds;
47d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
48d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    public AlbumDataAdapter(Context context, SharedPreferences settings,
49d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            int resource, List<PhotoSource.AlbumData> objects) {
50d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        super(context, resource, objects);
51d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren        mSettings = AlbumSettings.getAlbumSettings(settings);
52d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        mLayout = resource;
53d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
54d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        mListener = new ItemClickListener();
55146ce64b748e2393e80174240624c2e9f2b61c41Chris Wren
562ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren        mValidAlbumIds = new HashSet<String>(objects.size());
57146ce64b748e2393e80174240624c2e9f2b61c41Chris Wren        for (PhotoSource.AlbumData albumData: objects) {
582ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren            mValidAlbumIds.add(albumData.id);
59146ce64b748e2393e80174240624c2e9f2b61c41Chris Wren        }
602ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren        mSettings.pruneObsoleteSettings(mValidAlbumIds);
612ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren    }
622ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren
632ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren    public boolean isSelected(int position) {
642ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren        PhotoSource.AlbumData data = getItem(position);
652ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren        return mSettings.isAlbumEnabled(data.id);
662ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren    }
672ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren
682ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren    public boolean areAllSelected() {
692ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren        return mSettings.areAllEnabled(mValidAlbumIds);
702ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren    }
712ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren
722ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren    public void selectAll(boolean select) {
732ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren        if (select) {
742ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren            mSettings.enableAllAlbums(mValidAlbumIds);
752ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren        } else {
762ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren            mSettings.disableAllAlbums();
772ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren        }
782ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren        notifyDataSetChanged();
79d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    }
80d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
81d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    @Override
82e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren    public View getView(int position, View convertView, ViewGroup parent) {
83d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        View item = convertView;
84d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        if (item == null) {
85d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            item = mInflater.inflate(mLayout, parent, false);
86d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        }
87d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        PhotoSource.AlbumData data = getItem(position);
88d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
89d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        View vCheckBox = item.findViewById(R.id.enabled);
90d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        if (vCheckBox != null && vCheckBox instanceof CheckBox) {
91d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            CheckBox checkBox = (CheckBox) vCheckBox;
922ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren            checkBox.setChecked(isSelected(position));
93d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            checkBox.setTag(R.id.data_payload, data);
94d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        }
95d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
96e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        View vTextView = item.findViewById(R.id.title);
97e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        if (vTextView != null && vTextView instanceof TextView) {
98e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren            TextView textView = (TextView) vTextView;
99e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren            textView.setText(data.title);
100e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        }
101e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren
102e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        item.setOnClickListener(mListener);
103d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        return item;
104d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    }
105d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
106e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren    public static class AccountComparator implements Comparator<PhotoSource.AlbumData> {
107e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        private final RecencyComparator recency;
108e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        public AccountComparator() {
109e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren            recency = new RecencyComparator();
110e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        }
111e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren
112e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        @Override
113e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        public int compare(PhotoSource.AlbumData a, PhotoSource.AlbumData b) {
114e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren            if (a.account == b.account) {
115e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                return recency.compare(a, b);
116e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren            } else {
117e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                String typeAString = a.getType();
118e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                String typeBString = b.getType();
119e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                int typeA = 1;
120e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                int typeB = 1;
121e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren
122e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                if (typeAString.equals(LocalSource.class.getName())) {
123e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                    typeA = 0;
124e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                }
125e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                if (typeBString.equals(LocalSource.class.getName())) {
126e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                    typeB = 0;
127e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                }
128e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren
129e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                if (typeAString.equals(StockSource.class.getName())) {
130e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                    typeA = 2;
131e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                }
132e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                if (typeBString.equals(StockSource.class.getName())) {
133e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                    typeB = 2;
134e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                }
135e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren
136e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                if (typeA == typeB) {
137e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                    return a.account.compareTo(b.account);
138e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                } else {
139e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                    return (int) Math.signum(typeA - typeB);
140e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                }
141e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren            }
142e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        }
143e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren    }
144e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren
145d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    public static class RecencyComparator implements Comparator<PhotoSource.AlbumData> {
146e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        private final TitleComparator title;
147e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        public RecencyComparator() {
148e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren            title = new TitleComparator();
149e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        }
150e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren
151d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        @Override
152d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        public int compare(PhotoSource.AlbumData a, PhotoSource.AlbumData b) {
153d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            if (a.updated == b.updated) {
154e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                return title.compare(a, b);
155d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            } else {
156d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                return (int) Math.signum(b.updated - a.updated);
157d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            }
158d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        }
159d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    }
160d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
161e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren    public static class TitleComparator implements Comparator<PhotoSource.AlbumData> {
162d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        @Override
163d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        public int compare(PhotoSource.AlbumData a, PhotoSource.AlbumData b) {
164d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            return a.title.compareTo(b.title);
165d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        }
166d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    }
167d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
168e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren    private class ItemClickListener implements OnClickListener {
169d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        @Override
170e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        public void onClick(View v) {
171e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren            final View vCheckBox = v.findViewById(R.id.enabled);
172e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren            if (vCheckBox != null && vCheckBox instanceof CheckBox) {
173e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                final CheckBox checkBox = (CheckBox) vCheckBox;
174e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                final PhotoSource.AlbumData data =
175e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                    (PhotoSource.AlbumData) checkBox.getTag(R.id.data_payload);
176e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                final boolean isChecked = !checkBox.isChecked();
177e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                checkBox.setChecked(isChecked);
178d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren                mSettings.setAlbumEnabled(data.id, isChecked);
1792ccf92a79a2749a6fdaf5c1242f5d72de48ef111Chris Wren                notifyDataSetChanged();
180e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                if (DEBUG) Log.i(TAG, data.title + " is " +
181e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                                 (isChecked ? "" : "not") + " enabled");
182d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            } else {
183e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                if (DEBUG) Log.w(TAG, "no checkbox found in settings row!");
184d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            }
185e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren            v.setPressed(true);
186d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        }
187d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    }
188d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren}
189