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