• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 
17 package com.android.calendar.selectcalendars;
18 
19 import android.content.Context;
20 import android.content.res.Resources;
21 import android.database.Cursor;
22 import android.graphics.drawable.shapes.RectShape;
23 import android.provider.CalendarContract.Calendars;
24 import android.text.TextUtils;
25 import android.view.LayoutInflater;
26 import android.view.View;
27 import android.view.ViewGroup;
28 import android.widget.AdapterView;
29 import android.widget.BaseAdapter;
30 import android.widget.CheckBox;
31 import android.widget.ListAdapter;
32 import android.widget.TextView;
33 
34 import com.android.calendar.R;
35 import com.android.calendar.Utils;
36 
37 import java.util.HashMap;
38 
39 public class SelectCalendarsSyncAdapter extends BaseAdapter
40         implements ListAdapter, AdapterView.OnItemClickListener {
41     private static final String TAG = "SelCalsAdapter";
42     private static int COLOR_CHIP_SIZE = 30;
43     private RectShape r = new RectShape();
44 
45     private LayoutInflater mInflater;
46     private static final int LAYOUT = R.layout.calendar_sync_item;
47     private CalendarRow[] mData;
48     private HashMap<Long, CalendarRow> mChanges = new HashMap<Long, CalendarRow>();
49     private int mRowCount = 0;
50 
51     private int mIdColumn;
52     private int mNameColumn;
53     private int mColorColumn;
54     private int mSyncedColumn;
55 
56     private final String mSyncedString;
57     private final String mNotSyncedString;
58 
59     public class CalendarRow {
60         long id;
61         String displayName;
62         int color;
63         boolean synced;
64         boolean originalSynced;
65     }
66 
SelectCalendarsSyncAdapter(Context context, Cursor c)67     public SelectCalendarsSyncAdapter(Context context, Cursor c) {
68         super();
69         initData(c);
70         mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
71         COLOR_CHIP_SIZE *= context.getResources().getDisplayMetrics().density;
72         r.resize(COLOR_CHIP_SIZE, COLOR_CHIP_SIZE);
73         Resources res = context.getResources();
74         mSyncedString = res.getString(R.string.synced);
75         mNotSyncedString = res.getString(R.string.not_synced);
76     }
77 
initData(Cursor c)78     private void initData(Cursor c) {
79         if (c == null) {
80             mRowCount = 0;
81             mData = null;
82             return;
83         }
84 
85         mIdColumn = c.getColumnIndexOrThrow(Calendars._ID);
86         mNameColumn = c.getColumnIndexOrThrow(Calendars.CALENDAR_DISPLAY_NAME);
87         mColorColumn = c.getColumnIndexOrThrow(Calendars.CALENDAR_COLOR);
88         mSyncedColumn = c.getColumnIndexOrThrow(Calendars.SYNC_EVENTS);
89 
90         mRowCount = c.getCount();
91         mData = new CalendarRow[mRowCount];
92         c.moveToPosition(-1);
93         int p = 0;
94         while (c.moveToNext()) {
95             long id = c.getLong(mIdColumn);
96             mData[p] = new CalendarRow();
97             mData[p].id = id;
98             mData[p].displayName = c.getString(mNameColumn);
99             mData[p].color = c.getInt(mColorColumn);
100             mData[p].originalSynced = c.getInt(mSyncedColumn) != 0;
101             if (mChanges.containsKey(id)) {
102                 mData[p].synced = mChanges.get(id).synced;
103             } else {
104                 mData[p].synced = mData[p].originalSynced;
105             }
106             p++;
107         }
108     }
109 
changeCursor(Cursor c)110     public void changeCursor(Cursor c) {
111         initData(c);
112         notifyDataSetChanged();
113     }
114 
115     @Override
getView(int position, View convertView, ViewGroup parent)116     public View getView(int position, View convertView, ViewGroup parent) {
117         if (position >= mRowCount) {
118             return null;
119         }
120         String name = mData[position].displayName;
121         boolean selected = mData[position].synced;
122         int color = Utils.getDisplayColorFromColor(mData[position].color);
123         View view;
124         if (convertView == null) {
125             view = mInflater.inflate(LAYOUT, parent, false);
126         } else {
127             view = convertView;
128         }
129 
130         view.setTag(mData[position]);
131 
132         CheckBox cb = (CheckBox) view.findViewById(R.id.sync);
133         cb.setChecked(selected);
134 
135         if (selected) {
136             setText(view, R.id.status, mSyncedString);
137         } else {
138             setText(view, R.id.status, mNotSyncedString);
139         }
140 
141         View colorView = view.findViewById(R.id.color);
142 
143         colorView.setBackgroundColor(color);
144 
145         setText(view, R.id.calendar, name);
146         return view;
147     }
148 
setText(View view, int id, String text)149     private static void setText(View view, int id, String text) {
150         if (TextUtils.isEmpty(text)) {
151             return;
152         }
153         TextView textView = (TextView) view.findViewById(id);
154         textView.setText(text);
155     }
156 
157     @Override
getCount()158     public int getCount() {
159         return mRowCount;
160     }
161 
162     @Override
getItem(int position)163     public Object getItem(int position) {
164         if (position >= mRowCount) {
165             return null;
166         }
167         CalendarRow item = mData[position];
168         return item;
169     }
170 
171     @Override
getItemId(int position)172     public long getItemId(int position) {
173         if (position >= mRowCount) {
174             return 0;
175         }
176         return mData[position].id;
177     }
178 
179     @Override
hasStableIds()180     public boolean hasStableIds() {
181         return true;
182     }
183 
getSynced(int position)184     public int getSynced(int position) {
185         return mData[position].synced ? 1 : 0;
186     }
187 
188     @Override
onItemClick(AdapterView<?> parent, View view, int position, long id)189     public void onItemClick(AdapterView<?> parent, View view, int position, long id)  {
190         CalendarRow row = (CalendarRow) view.getTag();
191         row.synced = !row.synced;
192 
193         String status;
194         if (row.synced) {
195             status = mSyncedString;
196         } else {
197             status = mNotSyncedString;
198         }
199         setText(view, R.id.status, status);
200 
201         CheckBox cb = (CheckBox) view.findViewById(R.id.sync);
202         cb.setChecked(row.synced);
203 
204         // There is some data loss in long -> int, but we should never see it in
205         // practice regarding calendar ids.
206         mChanges.put(row.id, row);
207     }
208 
getChanges()209     public HashMap<Long, CalendarRow> getChanges() {
210         return mChanges;
211     }
212 }
213