16b858fc6f8afad95a075595016c5c22547924886Erik/* 26b858fc6f8afad95a075595016c5c22547924886Erik * Copyright (C) 2010 The Android Open Source Project 36b858fc6f8afad95a075595016c5c22547924886Erik * 46b858fc6f8afad95a075595016c5c22547924886Erik * Licensed under the Apache License, Version 2.0 (the "License"); 56b858fc6f8afad95a075595016c5c22547924886Erik * you may not use this file except in compliance with the License. 66b858fc6f8afad95a075595016c5c22547924886Erik * You may obtain a copy of the License at 76b858fc6f8afad95a075595016c5c22547924886Erik * 86b858fc6f8afad95a075595016c5c22547924886Erik * http://www.apache.org/licenses/LICENSE-2.0 96b858fc6f8afad95a075595016c5c22547924886Erik * 106b858fc6f8afad95a075595016c5c22547924886Erik * Unless required by applicable law or agreed to in writing, software 116b858fc6f8afad95a075595016c5c22547924886Erik * distributed under the License is distributed on an "AS IS" BASIS, 126b858fc6f8afad95a075595016c5c22547924886Erik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b858fc6f8afad95a075595016c5c22547924886Erik * See the License for the specific language governing permissions and 146b858fc6f8afad95a075595016c5c22547924886Erik * limitations under the License. 156b858fc6f8afad95a075595016c5c22547924886Erik */ 166b858fc6f8afad95a075595016c5c22547924886Erik 176b858fc6f8afad95a075595016c5c22547924886Erikpackage com.android.calendar.selectcalendars; 186b858fc6f8afad95a075595016c5c22547924886Erik 196b858fc6f8afad95a075595016c5c22547924886Erikimport android.content.Context; 206b858fc6f8afad95a075595016c5c22547924886Erikimport android.content.res.Resources; 216b858fc6f8afad95a075595016c5c22547924886Erikimport android.database.Cursor; 226b858fc6f8afad95a075595016c5c22547924886Erikimport android.graphics.drawable.shapes.RectShape; 23a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Calendars; 246b858fc6f8afad95a075595016c5c22547924886Erikimport android.text.TextUtils; 256b858fc6f8afad95a075595016c5c22547924886Erikimport android.view.LayoutInflater; 266b858fc6f8afad95a075595016c5c22547924886Erikimport android.view.View; 276b858fc6f8afad95a075595016c5c22547924886Erikimport android.view.ViewGroup; 28cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chanimport android.widget.AdapterView; 296b858fc6f8afad95a075595016c5c22547924886Erikimport android.widget.BaseAdapter; 306b858fc6f8afad95a075595016c5c22547924886Erikimport android.widget.CheckBox; 316b858fc6f8afad95a075595016c5c22547924886Erikimport android.widget.ListAdapter; 326b858fc6f8afad95a075595016c5c22547924886Erikimport android.widget.TextView; 336b858fc6f8afad95a075595016c5c22547924886Erik 34cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chanimport com.android.calendar.R; 35cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chanimport com.android.calendar.Utils; 36cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan 376b858fc6f8afad95a075595016c5c22547924886Erikimport java.util.HashMap; 386b858fc6f8afad95a075595016c5c22547924886Erik 396b858fc6f8afad95a075595016c5c22547924886Erikpublic class SelectCalendarsSyncAdapter extends BaseAdapter 40cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan implements ListAdapter, AdapterView.OnItemClickListener { 416b858fc6f8afad95a075595016c5c22547924886Erik private static final String TAG = "SelCalsAdapter"; 426b858fc6f8afad95a075595016c5c22547924886Erik private static int COLOR_CHIP_SIZE = 30; 436b858fc6f8afad95a075595016c5c22547924886Erik private RectShape r = new RectShape(); 446b858fc6f8afad95a075595016c5c22547924886Erik 456b858fc6f8afad95a075595016c5c22547924886Erik private LayoutInflater mInflater; 466b858fc6f8afad95a075595016c5c22547924886Erik private static final int LAYOUT = R.layout.calendar_sync_item; 476b858fc6f8afad95a075595016c5c22547924886Erik private CalendarRow[] mData; 48d17780987a421477ae57fe88e48cb2d81c42f517Erik private HashMap<Long, CalendarRow> mChanges = new HashMap<Long, CalendarRow>(); 496b858fc6f8afad95a075595016c5c22547924886Erik private int mRowCount = 0; 506b858fc6f8afad95a075595016c5c22547924886Erik 516b858fc6f8afad95a075595016c5c22547924886Erik private int mIdColumn; 526b858fc6f8afad95a075595016c5c22547924886Erik private int mNameColumn; 536b858fc6f8afad95a075595016c5c22547924886Erik private int mColorColumn; 546b858fc6f8afad95a075595016c5c22547924886Erik private int mSyncedColumn; 556b858fc6f8afad95a075595016c5c22547924886Erik 566b858fc6f8afad95a075595016c5c22547924886Erik private final String mSyncedString; 576b858fc6f8afad95a075595016c5c22547924886Erik private final String mNotSyncedString; 586b858fc6f8afad95a075595016c5c22547924886Erik 596b858fc6f8afad95a075595016c5c22547924886Erik public class CalendarRow { 606b858fc6f8afad95a075595016c5c22547924886Erik long id; 616b858fc6f8afad95a075595016c5c22547924886Erik String displayName; 626b858fc6f8afad95a075595016c5c22547924886Erik int color; 636b858fc6f8afad95a075595016c5c22547924886Erik boolean synced; 64b331a8217f09c2d48960bc192fc1cda1e6a35faeErik boolean originalSynced; 656b858fc6f8afad95a075595016c5c22547924886Erik } 666b858fc6f8afad95a075595016c5c22547924886Erik 676b858fc6f8afad95a075595016c5c22547924886Erik public SelectCalendarsSyncAdapter(Context context, Cursor c) { 686b858fc6f8afad95a075595016c5c22547924886Erik super(); 696b858fc6f8afad95a075595016c5c22547924886Erik initData(c); 706b858fc6f8afad95a075595016c5c22547924886Erik mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 716b858fc6f8afad95a075595016c5c22547924886Erik COLOR_CHIP_SIZE *= context.getResources().getDisplayMetrics().density; 726b858fc6f8afad95a075595016c5c22547924886Erik r.resize(COLOR_CHIP_SIZE, COLOR_CHIP_SIZE); 736b858fc6f8afad95a075595016c5c22547924886Erik Resources res = context.getResources(); 746b858fc6f8afad95a075595016c5c22547924886Erik mSyncedString = res.getString(R.string.synced); 756b858fc6f8afad95a075595016c5c22547924886Erik mNotSyncedString = res.getString(R.string.not_synced); 766b858fc6f8afad95a075595016c5c22547924886Erik } 776b858fc6f8afad95a075595016c5c22547924886Erik 786b858fc6f8afad95a075595016c5c22547924886Erik private void initData(Cursor c) { 796b858fc6f8afad95a075595016c5c22547924886Erik if (c == null) { 806b858fc6f8afad95a075595016c5c22547924886Erik mRowCount = 0; 816b858fc6f8afad95a075595016c5c22547924886Erik mData = null; 826b858fc6f8afad95a075595016c5c22547924886Erik return; 836b858fc6f8afad95a075595016c5c22547924886Erik } 846b858fc6f8afad95a075595016c5c22547924886Erik 856b858fc6f8afad95a075595016c5c22547924886Erik mIdColumn = c.getColumnIndexOrThrow(Calendars._ID); 86ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik mNameColumn = c.getColumnIndexOrThrow(Calendars.CALENDAR_DISPLAY_NAME); 870e1e62408b96e1532eb6f6a609ae4c817751aaf3RoboErik mColorColumn = c.getColumnIndexOrThrow(Calendars.CALENDAR_COLOR); 886b858fc6f8afad95a075595016c5c22547924886Erik mSyncedColumn = c.getColumnIndexOrThrow(Calendars.SYNC_EVENTS); 896b858fc6f8afad95a075595016c5c22547924886Erik 906b858fc6f8afad95a075595016c5c22547924886Erik mRowCount = c.getCount(); 916b858fc6f8afad95a075595016c5c22547924886Erik mData = new CalendarRow[mRowCount]; 926b858fc6f8afad95a075595016c5c22547924886Erik c.moveToPosition(-1); 936b858fc6f8afad95a075595016c5c22547924886Erik int p = 0; 946b858fc6f8afad95a075595016c5c22547924886Erik while (c.moveToNext()) { 95d17780987a421477ae57fe88e48cb2d81c42f517Erik long id = c.getLong(mIdColumn); 966b858fc6f8afad95a075595016c5c22547924886Erik mData[p] = new CalendarRow(); 97d17780987a421477ae57fe88e48cb2d81c42f517Erik mData[p].id = id; 986b858fc6f8afad95a075595016c5c22547924886Erik mData[p].displayName = c.getString(mNameColumn); 996b858fc6f8afad95a075595016c5c22547924886Erik mData[p].color = c.getInt(mColorColumn); 100d17780987a421477ae57fe88e48cb2d81c42f517Erik mData[p].originalSynced = c.getInt(mSyncedColumn) != 0; 101d17780987a421477ae57fe88e48cb2d81c42f517Erik if (mChanges.containsKey(id)) { 102d17780987a421477ae57fe88e48cb2d81c42f517Erik mData[p].synced = mChanges.get(id).synced; 103d17780987a421477ae57fe88e48cb2d81c42f517Erik } else { 104d17780987a421477ae57fe88e48cb2d81c42f517Erik mData[p].synced = mData[p].originalSynced; 105d17780987a421477ae57fe88e48cb2d81c42f517Erik } 1066b858fc6f8afad95a075595016c5c22547924886Erik p++; 1076b858fc6f8afad95a075595016c5c22547924886Erik } 1086b858fc6f8afad95a075595016c5c22547924886Erik } 1096b858fc6f8afad95a075595016c5c22547924886Erik 1106b858fc6f8afad95a075595016c5c22547924886Erik public void changeCursor(Cursor c) { 1116b858fc6f8afad95a075595016c5c22547924886Erik initData(c); 1126b858fc6f8afad95a075595016c5c22547924886Erik notifyDataSetChanged(); 1136b858fc6f8afad95a075595016c5c22547924886Erik } 1146b858fc6f8afad95a075595016c5c22547924886Erik 115cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan @Override 1166b858fc6f8afad95a075595016c5c22547924886Erik public View getView(int position, View convertView, ViewGroup parent) { 1176b858fc6f8afad95a075595016c5c22547924886Erik if (position >= mRowCount) { 1186b858fc6f8afad95a075595016c5c22547924886Erik return null; 1196b858fc6f8afad95a075595016c5c22547924886Erik } 1206b858fc6f8afad95a075595016c5c22547924886Erik String name = mData[position].displayName; 1216b858fc6f8afad95a075595016c5c22547924886Erik boolean selected = mData[position].synced; 1224acb2fd087308dea146b8b10f5278c59df387680RoboErik int color = Utils.getDisplayColorFromColor(mData[position].color); 1236b858fc6f8afad95a075595016c5c22547924886Erik View view; 1246b858fc6f8afad95a075595016c5c22547924886Erik if (convertView == null) { 1256b858fc6f8afad95a075595016c5c22547924886Erik view = mInflater.inflate(LAYOUT, parent, false); 1266b858fc6f8afad95a075595016c5c22547924886Erik } else { 1276b858fc6f8afad95a075595016c5c22547924886Erik view = convertView; 1286b858fc6f8afad95a075595016c5c22547924886Erik } 1296b858fc6f8afad95a075595016c5c22547924886Erik 130cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan view.setTag(mData[position]); 131cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan 1326b858fc6f8afad95a075595016c5c22547924886Erik CheckBox cb = (CheckBox) view.findViewById(R.id.sync); 1336b858fc6f8afad95a075595016c5c22547924886Erik cb.setChecked(selected); 1346b858fc6f8afad95a075595016c5c22547924886Erik 1356b858fc6f8afad95a075595016c5c22547924886Erik if (selected) { 1366b858fc6f8afad95a075595016c5c22547924886Erik setText(view, R.id.status, mSyncedString); 1376b858fc6f8afad95a075595016c5c22547924886Erik } else { 1386b858fc6f8afad95a075595016c5c22547924886Erik setText(view, R.id.status, mNotSyncedString); 1396b858fc6f8afad95a075595016c5c22547924886Erik } 1406b858fc6f8afad95a075595016c5c22547924886Erik 1416b858fc6f8afad95a075595016c5c22547924886Erik View colorView = view.findViewById(R.id.color); 1426b858fc6f8afad95a075595016c5c22547924886Erik 143ec047f19da78f4feaa5b9866846b375b454cd547Erik colorView.setBackgroundColor(color); 1446b858fc6f8afad95a075595016c5c22547924886Erik 1456b858fc6f8afad95a075595016c5c22547924886Erik setText(view, R.id.calendar, name); 1466b858fc6f8afad95a075595016c5c22547924886Erik return view; 1476b858fc6f8afad95a075595016c5c22547924886Erik } 1486b858fc6f8afad95a075595016c5c22547924886Erik 1496b858fc6f8afad95a075595016c5c22547924886Erik private static void setText(View view, int id, String text) { 1506b858fc6f8afad95a075595016c5c22547924886Erik if (TextUtils.isEmpty(text)) { 1516b858fc6f8afad95a075595016c5c22547924886Erik return; 1526b858fc6f8afad95a075595016c5c22547924886Erik } 1536b858fc6f8afad95a075595016c5c22547924886Erik TextView textView = (TextView) view.findViewById(id); 1546b858fc6f8afad95a075595016c5c22547924886Erik textView.setText(text); 1556b858fc6f8afad95a075595016c5c22547924886Erik } 1566b858fc6f8afad95a075595016c5c22547924886Erik 157cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan @Override 1586b858fc6f8afad95a075595016c5c22547924886Erik public int getCount() { 1596b858fc6f8afad95a075595016c5c22547924886Erik return mRowCount; 1606b858fc6f8afad95a075595016c5c22547924886Erik } 1616b858fc6f8afad95a075595016c5c22547924886Erik 162cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan @Override 1636b858fc6f8afad95a075595016c5c22547924886Erik public Object getItem(int position) { 1646b858fc6f8afad95a075595016c5c22547924886Erik if (position >= mRowCount) { 1656b858fc6f8afad95a075595016c5c22547924886Erik return null; 1666b858fc6f8afad95a075595016c5c22547924886Erik } 1676b858fc6f8afad95a075595016c5c22547924886Erik CalendarRow item = mData[position]; 1686b858fc6f8afad95a075595016c5c22547924886Erik return item; 1696b858fc6f8afad95a075595016c5c22547924886Erik } 1706b858fc6f8afad95a075595016c5c22547924886Erik 171cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan @Override 1726b858fc6f8afad95a075595016c5c22547924886Erik public long getItemId(int position) { 1736b858fc6f8afad95a075595016c5c22547924886Erik if (position >= mRowCount) { 1746b858fc6f8afad95a075595016c5c22547924886Erik return 0; 1756b858fc6f8afad95a075595016c5c22547924886Erik } 1766b858fc6f8afad95a075595016c5c22547924886Erik return mData[position].id; 1776b858fc6f8afad95a075595016c5c22547924886Erik } 1786b858fc6f8afad95a075595016c5c22547924886Erik 17946c666c2a115d0f8e805db62d3cf741c163cbaa0Erik @Override 18046c666c2a115d0f8e805db62d3cf741c163cbaa0Erik public boolean hasStableIds() { 18146c666c2a115d0f8e805db62d3cf741c163cbaa0Erik return true; 18246c666c2a115d0f8e805db62d3cf741c163cbaa0Erik } 18346c666c2a115d0f8e805db62d3cf741c163cbaa0Erik 1846b858fc6f8afad95a075595016c5c22547924886Erik public int getSynced(int position) { 1856b858fc6f8afad95a075595016c5c22547924886Erik return mData[position].synced ? 1 : 0; 1866b858fc6f8afad95a075595016c5c22547924886Erik } 1876b858fc6f8afad95a075595016c5c22547924886Erik 1886b858fc6f8afad95a075595016c5c22547924886Erik @Override 189cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 190cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan CalendarRow row = (CalendarRow) view.getTag(); 191cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan row.synced = !row.synced; 192cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan 193cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan String status; 194cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan if (row.synced) { 195cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan status = mSyncedString; 196b2f986ce6f535f1d93a498e611455705f7547aecErik } else { 197cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan status = mNotSyncedString; 198b2f986ce6f535f1d93a498e611455705f7547aecErik } 199cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan setText(view, R.id.status, status); 200cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan 201cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan CheckBox cb = (CheckBox) view.findViewById(R.id.sync); 202cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan cb.setChecked(row.synced); 2036b858fc6f8afad95a075595016c5c22547924886Erik 2046b858fc6f8afad95a075595016c5c22547924886Erik // There is some data loss in long -> int, but we should never see it in 2056b858fc6f8afad95a075595016c5c22547924886Erik // practice regarding calendar ids. 206d17780987a421477ae57fe88e48cb2d81c42f517Erik mChanges.put(row.id, row); 2076b858fc6f8afad95a075595016c5c22547924886Erik } 2086b858fc6f8afad95a075595016c5c22547924886Erik 209d17780987a421477ae57fe88e48cb2d81c42f517Erik public HashMap<Long, CalendarRow> getChanges() { 2106b858fc6f8afad95a075595016c5c22547924886Erik return mChanges; 2116b858fc6f8afad95a075595016c5c22547924886Erik } 2126b858fc6f8afad95a075595016c5c22547924886Erik} 213