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 */
16package com.android.dreams.phototable;
17
18import android.content.Context;
19import android.content.SharedPreferences;
20import android.util.Log;
21import android.view.LayoutInflater;
22import android.view.View;
23import android.view.View.OnClickListener;
24import android.view.ViewGroup;
25import android.widget.ArrayAdapter;
26import android.widget.CheckBox;
27import android.widget.TextView;
28
29import java.util.Comparator;
30import java.util.HashSet;
31import java.util.List;
32
33/**
34 * Settings panel for photo flipping dream.
35 */
36public 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
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
63    public boolean isSelected(int position) {
64        PhotoSource.AlbumData data = getItem(position);
65        return mSettings.isAlbumEnabled(data.id);
66    }
67
68    public boolean areAllSelected() {
69        return mSettings.areAllEnabled(mValidAlbumIds);
70    }
71
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
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;
108        public AccountComparator() {
109            recency = new RecencyComparator();
110        }
111
112        @Override
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;
147        public RecencyComparator() {
148            title = new TitleComparator();
149        }
150
151        @Override
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
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
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