1 /*
2  * Copyright (C) 2012 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 package com.android.dreams.phototable;
17 
18 import android.content.Context;
19 import android.content.SharedPreferences;
20 import android.util.Log;
21 import android.view.LayoutInflater;
22 import android.view.View;
23 import android.view.View.OnClickListener;
24 import android.view.ViewGroup;
25 import android.widget.ArrayAdapter;
26 import android.widget.CheckBox;
27 import android.widget.TextView;
28 
29 import java.util.Comparator;
30 import java.util.HashSet;
31 import java.util.List;
32 
33 /**
34  * Settings panel for photo flipping dream.
35  */
36 public class AlbumDataAdapter extends ArrayAdapter<PhotoSource.AlbumData> {
37     private static final String TAG = "AlbumDataAdapter";
38     private static final boolean DEBUG = false;
39 
40     public static final String ALBUM_SET = "Enabled Album Set";
41 
42     private final AlbumSettings mSettings;
43     private final LayoutInflater mInflater;
44     private final int mLayout;
45     private final ItemClickListener mListener;
46     private final HashSet<String> mValidAlbumIds;
47 
AlbumDataAdapter(Context context, SharedPreferences settings, int resource, List<PhotoSource.AlbumData> objects)48     public AlbumDataAdapter(Context context, SharedPreferences settings,
49             int resource, List<PhotoSource.AlbumData> objects) {
50         super(context, resource, objects);
51         mSettings = AlbumSettings.getAlbumSettings(settings);
52         mLayout = resource;
53         mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
54         mListener = new ItemClickListener();
55 
56         mValidAlbumIds = new HashSet<String>(objects.size());
57         for (PhotoSource.AlbumData albumData: objects) {
58             mValidAlbumIds.add(albumData.id);
59         }
60         mSettings.pruneObsoleteSettings(mValidAlbumIds);
61     }
62 
isSelected(int position)63     public boolean isSelected(int position) {
64         PhotoSource.AlbumData data = getItem(position);
65         return mSettings.isAlbumEnabled(data.id);
66     }
67 
areAllSelected()68     public boolean areAllSelected() {
69         return mSettings.areAllEnabled(mValidAlbumIds);
70     }
71 
selectAll(boolean select)72     public void selectAll(boolean select) {
73         if (select) {
74             mSettings.enableAllAlbums(mValidAlbumIds);
75         } else {
76             mSettings.disableAllAlbums();
77         }
78         notifyDataSetChanged();
79     }
80 
81     @Override
getView(int position, View convertView, ViewGroup parent)82     public View getView(int position, View convertView, ViewGroup parent) {
83         View item = convertView;
84         if (item == null) {
85             item = mInflater.inflate(mLayout, parent, false);
86         }
87         PhotoSource.AlbumData data = getItem(position);
88 
89         View vCheckBox = item.findViewById(R.id.enabled);
90         if (vCheckBox != null && vCheckBox instanceof CheckBox) {
91             CheckBox checkBox = (CheckBox) vCheckBox;
92             checkBox.setChecked(isSelected(position));
93             checkBox.setTag(R.id.data_payload, data);
94         }
95 
96         View vTextView = item.findViewById(R.id.title);
97         if (vTextView != null && vTextView instanceof TextView) {
98             TextView textView = (TextView) vTextView;
99             textView.setText(data.title);
100         }
101 
102         item.setOnClickListener(mListener);
103         return item;
104     }
105 
106     public static class AccountComparator implements Comparator<PhotoSource.AlbumData> {
107         private final RecencyComparator recency;
AccountComparator()108         public AccountComparator() {
109             recency = new RecencyComparator();
110         }
111 
112         @Override
compare(PhotoSource.AlbumData a, PhotoSource.AlbumData b)113         public int compare(PhotoSource.AlbumData a, PhotoSource.AlbumData b) {
114             if (a.account == b.account) {
115                 return recency.compare(a, b);
116             } else {
117                 String typeAString = a.getType();
118                 String typeBString = b.getType();
119                 int typeA = 1;
120                 int typeB = 1;
121 
122                 if (typeAString.equals(LocalSource.class.getName())) {
123                     typeA = 0;
124                 }
125                 if (typeBString.equals(LocalSource.class.getName())) {
126                     typeB = 0;
127                 }
128 
129                 if (typeAString.equals(StockSource.class.getName())) {
130                     typeA = 2;
131                 }
132                 if (typeBString.equals(StockSource.class.getName())) {
133                     typeB = 2;
134                 }
135 
136                 if (typeA == typeB) {
137                     return a.account.compareTo(b.account);
138                 } else {
139                     return (int) Math.signum(typeA - typeB);
140                 }
141             }
142         }
143     }
144 
145     public static class RecencyComparator implements Comparator<PhotoSource.AlbumData> {
146         private final TitleComparator title;
RecencyComparator()147         public RecencyComparator() {
148             title = new TitleComparator();
149         }
150 
151         @Override
compare(PhotoSource.AlbumData a, PhotoSource.AlbumData b)152         public int compare(PhotoSource.AlbumData a, PhotoSource.AlbumData b) {
153             if (a.updated == b.updated) {
154                 return title.compare(a, b);
155             } else {
156                 return (int) Math.signum(b.updated - a.updated);
157             }
158         }
159     }
160 
161     public static class TitleComparator implements Comparator<PhotoSource.AlbumData> {
162         @Override
compare(PhotoSource.AlbumData a, PhotoSource.AlbumData b)163         public int compare(PhotoSource.AlbumData a, PhotoSource.AlbumData b) {
164             return a.title.compareTo(b.title);
165         }
166     }
167 
168     private class ItemClickListener implements OnClickListener {
169         @Override
onClick(View v)170         public void onClick(View v) {
171             final View vCheckBox = v.findViewById(R.id.enabled);
172             if (vCheckBox != null && vCheckBox instanceof CheckBox) {
173                 final CheckBox checkBox = (CheckBox) vCheckBox;
174                 final PhotoSource.AlbumData data =
175                     (PhotoSource.AlbumData) checkBox.getTag(R.id.data_payload);
176                 final boolean isChecked = !checkBox.isChecked();
177                 checkBox.setChecked(isChecked);
178                 mSettings.setAlbumEnabled(data.id, isChecked);
179                 notifyDataSetChanged();
180                 if (DEBUG) Log.i(TAG, data.title + " is " +
181                                  (isChecked ? "" : "not") + " enabled");
182             } else {
183                 if (DEBUG) Log.w(TAG, "no checkbox found in settings row!");
184             }
185             v.setPressed(true);
186         }
187     }
188 }
189