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 19b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kungimport android.app.FragmentManager; 206b858fc6f8afad95a075595016c5c22547924886Erikimport android.content.Context; 216b858fc6f8afad95a075595016c5c22547924886Erikimport android.content.res.Resources; 226b858fc6f8afad95a075595016c5c22547924886Erikimport android.database.Cursor; 23b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kungimport android.graphics.Rect; 246b858fc6f8afad95a075595016c5c22547924886Erikimport android.graphics.drawable.shapes.RectShape; 25a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Calendars; 266b858fc6f8afad95a075595016c5c22547924886Erikimport android.text.TextUtils; 276b858fc6f8afad95a075595016c5c22547924886Erikimport android.view.LayoutInflater; 28b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kungimport android.view.TouchDelegate; 296b858fc6f8afad95a075595016c5c22547924886Erikimport android.view.View; 30b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kungimport android.view.View.OnClickListener; 316b858fc6f8afad95a075595016c5c22547924886Erikimport android.view.ViewGroup; 32cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chanimport android.widget.AdapterView; 336b858fc6f8afad95a075595016c5c22547924886Erikimport android.widget.BaseAdapter; 346b858fc6f8afad95a075595016c5c22547924886Erikimport android.widget.CheckBox; 356b858fc6f8afad95a075595016c5c22547924886Erikimport android.widget.ListAdapter; 366b858fc6f8afad95a075595016c5c22547924886Erikimport android.widget.TextView; 376b858fc6f8afad95a075595016c5c22547924886Erik 38b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kungimport com.android.calendar.CalendarColorPickerDialog; 39cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chanimport com.android.calendar.R; 40cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chanimport com.android.calendar.Utils; 4161388102bec5243dfd4494b8c674cdb7957663a6James Kungimport com.android.calendar.selectcalendars.CalendarColorCache.OnCalendarColorsLoadedListener; 42cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan 436b858fc6f8afad95a075595016c5c22547924886Erikimport java.util.HashMap; 446b858fc6f8afad95a075595016c5c22547924886Erik 456b858fc6f8afad95a075595016c5c22547924886Erikpublic class SelectCalendarsSyncAdapter extends BaseAdapter 4661388102bec5243dfd4494b8c674cdb7957663a6James Kung implements ListAdapter, AdapterView.OnItemClickListener, OnCalendarColorsLoadedListener { 476b858fc6f8afad95a075595016c5c22547924886Erik private static final String TAG = "SelCalsAdapter"; 482fca024254c9de09f8d87933cc8c9a2046e37c52James Kung private static final String COLOR_PICKER_DIALOG_TAG = "ColorPickerDialog"; 492fca024254c9de09f8d87933cc8c9a2046e37c52James Kung 506b858fc6f8afad95a075595016c5c22547924886Erik private static int COLOR_CHIP_SIZE = 30; 516b858fc6f8afad95a075595016c5c22547924886Erik private RectShape r = new RectShape(); 526b858fc6f8afad95a075595016c5c22547924886Erik 532fca024254c9de09f8d87933cc8c9a2046e37c52James Kung private CalendarColorPickerDialog mColorPickerDialog; 5461388102bec5243dfd4494b8c674cdb7957663a6James Kung private CalendarColorCache mCache; 55b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung 566b858fc6f8afad95a075595016c5c22547924886Erik private LayoutInflater mInflater; 576b858fc6f8afad95a075595016c5c22547924886Erik private static final int LAYOUT = R.layout.calendar_sync_item; 586b858fc6f8afad95a075595016c5c22547924886Erik private CalendarRow[] mData; 59d17780987a421477ae57fe88e48cb2d81c42f517Erik private HashMap<Long, CalendarRow> mChanges = new HashMap<Long, CalendarRow>(); 606b858fc6f8afad95a075595016c5c22547924886Erik private int mRowCount = 0; 616b858fc6f8afad95a075595016c5c22547924886Erik 626b858fc6f8afad95a075595016c5c22547924886Erik private int mIdColumn; 636b858fc6f8afad95a075595016c5c22547924886Erik private int mNameColumn; 646b858fc6f8afad95a075595016c5c22547924886Erik private int mColorColumn; 656b858fc6f8afad95a075595016c5c22547924886Erik private int mSyncedColumn; 6661388102bec5243dfd4494b8c674cdb7957663a6James Kung private int mAccountNameColumn; 6761388102bec5243dfd4494b8c674cdb7957663a6James Kung private int mAccountTypeColumn; 686b858fc6f8afad95a075595016c5c22547924886Erik 69b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung private boolean mIsTablet; 70b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung private FragmentManager mFragmentManager; 71b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung private int mColorViewTouchAreaIncrease; 72b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung 73b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung 746b858fc6f8afad95a075595016c5c22547924886Erik private final String mSyncedString; 756b858fc6f8afad95a075595016c5c22547924886Erik private final String mNotSyncedString; 766b858fc6f8afad95a075595016c5c22547924886Erik 776b858fc6f8afad95a075595016c5c22547924886Erik public class CalendarRow { 786b858fc6f8afad95a075595016c5c22547924886Erik long id; 796b858fc6f8afad95a075595016c5c22547924886Erik String displayName; 806b858fc6f8afad95a075595016c5c22547924886Erik int color; 816b858fc6f8afad95a075595016c5c22547924886Erik boolean synced; 82b331a8217f09c2d48960bc192fc1cda1e6a35faeErik boolean originalSynced; 8361388102bec5243dfd4494b8c674cdb7957663a6James Kung String accountName; 8461388102bec5243dfd4494b8c674cdb7957663a6James Kung String accountType; 856b858fc6f8afad95a075595016c5c22547924886Erik } 866b858fc6f8afad95a075595016c5c22547924886Erik 87b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung public SelectCalendarsSyncAdapter(Context context, Cursor c, FragmentManager manager) { 886b858fc6f8afad95a075595016c5c22547924886Erik super(); 896b858fc6f8afad95a075595016c5c22547924886Erik initData(c); 9061388102bec5243dfd4494b8c674cdb7957663a6James Kung mCache = new CalendarColorCache(context, this); 91b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung mFragmentManager = manager; 922fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mColorPickerDialog = (CalendarColorPickerDialog) 932fca024254c9de09f8d87933cc8c9a2046e37c52James Kung manager.findFragmentByTag(COLOR_PICKER_DIALOG_TAG); 94b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung mColorViewTouchAreaIncrease = context.getResources() 95b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung .getDimensionPixelSize(R.dimen.color_view_touch_area_increase); 96b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung mIsTablet = Utils.getConfigBool(context, R.bool.tablet_config); 976b858fc6f8afad95a075595016c5c22547924886Erik mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 986b858fc6f8afad95a075595016c5c22547924886Erik COLOR_CHIP_SIZE *= context.getResources().getDisplayMetrics().density; 996b858fc6f8afad95a075595016c5c22547924886Erik r.resize(COLOR_CHIP_SIZE, COLOR_CHIP_SIZE); 1006b858fc6f8afad95a075595016c5c22547924886Erik Resources res = context.getResources(); 1016b858fc6f8afad95a075595016c5c22547924886Erik mSyncedString = res.getString(R.string.synced); 1026b858fc6f8afad95a075595016c5c22547924886Erik mNotSyncedString = res.getString(R.string.not_synced); 1036b858fc6f8afad95a075595016c5c22547924886Erik } 1046b858fc6f8afad95a075595016c5c22547924886Erik 1056b858fc6f8afad95a075595016c5c22547924886Erik private void initData(Cursor c) { 1066b858fc6f8afad95a075595016c5c22547924886Erik if (c == null) { 1076b858fc6f8afad95a075595016c5c22547924886Erik mRowCount = 0; 1086b858fc6f8afad95a075595016c5c22547924886Erik mData = null; 1096b858fc6f8afad95a075595016c5c22547924886Erik return; 1106b858fc6f8afad95a075595016c5c22547924886Erik } 1116b858fc6f8afad95a075595016c5c22547924886Erik 1126b858fc6f8afad95a075595016c5c22547924886Erik mIdColumn = c.getColumnIndexOrThrow(Calendars._ID); 113ef2add9145f058ea103ade2870a8ba899b9ed1c9RoboErik mNameColumn = c.getColumnIndexOrThrow(Calendars.CALENDAR_DISPLAY_NAME); 1140e1e62408b96e1532eb6f6a609ae4c817751aaf3RoboErik mColorColumn = c.getColumnIndexOrThrow(Calendars.CALENDAR_COLOR); 1156b858fc6f8afad95a075595016c5c22547924886Erik mSyncedColumn = c.getColumnIndexOrThrow(Calendars.SYNC_EVENTS); 11661388102bec5243dfd4494b8c674cdb7957663a6James Kung mAccountNameColumn = c.getColumnIndexOrThrow(Calendars.ACCOUNT_NAME); 11761388102bec5243dfd4494b8c674cdb7957663a6James Kung mAccountTypeColumn = c.getColumnIndexOrThrow(Calendars.ACCOUNT_TYPE); 1186b858fc6f8afad95a075595016c5c22547924886Erik 1196b858fc6f8afad95a075595016c5c22547924886Erik mRowCount = c.getCount(); 1206b858fc6f8afad95a075595016c5c22547924886Erik mData = new CalendarRow[mRowCount]; 1216b858fc6f8afad95a075595016c5c22547924886Erik c.moveToPosition(-1); 1226b858fc6f8afad95a075595016c5c22547924886Erik int p = 0; 1236b858fc6f8afad95a075595016c5c22547924886Erik while (c.moveToNext()) { 124d17780987a421477ae57fe88e48cb2d81c42f517Erik long id = c.getLong(mIdColumn); 1256b858fc6f8afad95a075595016c5c22547924886Erik mData[p] = new CalendarRow(); 126d17780987a421477ae57fe88e48cb2d81c42f517Erik mData[p].id = id; 1276b858fc6f8afad95a075595016c5c22547924886Erik mData[p].displayName = c.getString(mNameColumn); 1286b858fc6f8afad95a075595016c5c22547924886Erik mData[p].color = c.getInt(mColorColumn); 129d17780987a421477ae57fe88e48cb2d81c42f517Erik mData[p].originalSynced = c.getInt(mSyncedColumn) != 0; 13061388102bec5243dfd4494b8c674cdb7957663a6James Kung mData[p].accountName = c.getString(mAccountNameColumn); 13161388102bec5243dfd4494b8c674cdb7957663a6James Kung mData[p].accountType = c.getString(mAccountTypeColumn); 132d17780987a421477ae57fe88e48cb2d81c42f517Erik if (mChanges.containsKey(id)) { 133d17780987a421477ae57fe88e48cb2d81c42f517Erik mData[p].synced = mChanges.get(id).synced; 134d17780987a421477ae57fe88e48cb2d81c42f517Erik } else { 135d17780987a421477ae57fe88e48cb2d81c42f517Erik mData[p].synced = mData[p].originalSynced; 136d17780987a421477ae57fe88e48cb2d81c42f517Erik } 1376b858fc6f8afad95a075595016c5c22547924886Erik p++; 1386b858fc6f8afad95a075595016c5c22547924886Erik } 1396b858fc6f8afad95a075595016c5c22547924886Erik } 1406b858fc6f8afad95a075595016c5c22547924886Erik 1416b858fc6f8afad95a075595016c5c22547924886Erik public void changeCursor(Cursor c) { 1426b858fc6f8afad95a075595016c5c22547924886Erik initData(c); 1436b858fc6f8afad95a075595016c5c22547924886Erik notifyDataSetChanged(); 1446b858fc6f8afad95a075595016c5c22547924886Erik } 1456b858fc6f8afad95a075595016c5c22547924886Erik 146cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan @Override 147b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung public View getView(final int position, View convertView, ViewGroup parent) { 1486b858fc6f8afad95a075595016c5c22547924886Erik if (position >= mRowCount) { 1496b858fc6f8afad95a075595016c5c22547924886Erik return null; 1506b858fc6f8afad95a075595016c5c22547924886Erik } 1516b858fc6f8afad95a075595016c5c22547924886Erik String name = mData[position].displayName; 1526b858fc6f8afad95a075595016c5c22547924886Erik boolean selected = mData[position].synced; 1534acb2fd087308dea146b8b10f5278c59df387680RoboErik int color = Utils.getDisplayColorFromColor(mData[position].color); 1546b858fc6f8afad95a075595016c5c22547924886Erik View view; 1556b858fc6f8afad95a075595016c5c22547924886Erik if (convertView == null) { 1566b858fc6f8afad95a075595016c5c22547924886Erik view = mInflater.inflate(LAYOUT, parent, false); 157b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung final View delegate = view.findViewById(R.id.color); 158b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung final View delegateParent = (View) delegate.getParent(); 159b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung delegateParent.post(new Runnable() { 160b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung 161b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung @Override 162b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung public void run() { 163b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung final Rect r = new Rect(); 164b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung delegate.getHitRect(r); 165b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung r.top -= mColorViewTouchAreaIncrease; 166b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung r.bottom += mColorViewTouchAreaIncrease; 167b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung r.left -= mColorViewTouchAreaIncrease; 168b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung r.right += mColorViewTouchAreaIncrease; 169b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung delegateParent.setTouchDelegate(new TouchDelegate(r, delegate)); 170b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung } 171b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung }); 1726b858fc6f8afad95a075595016c5c22547924886Erik } else { 1736b858fc6f8afad95a075595016c5c22547924886Erik view = convertView; 1746b858fc6f8afad95a075595016c5c22547924886Erik } 1756b858fc6f8afad95a075595016c5c22547924886Erik 176cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan view.setTag(mData[position]); 177cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan 1786b858fc6f8afad95a075595016c5c22547924886Erik CheckBox cb = (CheckBox) view.findViewById(R.id.sync); 1796b858fc6f8afad95a075595016c5c22547924886Erik cb.setChecked(selected); 1806b858fc6f8afad95a075595016c5c22547924886Erik 1816b858fc6f8afad95a075595016c5c22547924886Erik if (selected) { 1826b858fc6f8afad95a075595016c5c22547924886Erik setText(view, R.id.status, mSyncedString); 1836b858fc6f8afad95a075595016c5c22547924886Erik } else { 1846b858fc6f8afad95a075595016c5c22547924886Erik setText(view, R.id.status, mNotSyncedString); 1856b858fc6f8afad95a075595016c5c22547924886Erik } 1866b858fc6f8afad95a075595016c5c22547924886Erik 1876b858fc6f8afad95a075595016c5c22547924886Erik View colorView = view.findViewById(R.id.color); 18861388102bec5243dfd4494b8c674cdb7957663a6James Kung colorView.setEnabled(hasMoreColors(position)); 189ec047f19da78f4feaa5b9866846b375b454cd547Erik colorView.setBackgroundColor(color); 190b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung colorView.setOnClickListener(new OnClickListener() { 191b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung 192b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung @Override 193b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung public void onClick(View v) { 19461388102bec5243dfd4494b8c674cdb7957663a6James Kung // Purely for sanity check--view should be disabled if account has no more colors 19561388102bec5243dfd4494b8c674cdb7957663a6James Kung if (!hasMoreColors(position)) { 19661388102bec5243dfd4494b8c674cdb7957663a6James Kung return; 19761388102bec5243dfd4494b8c674cdb7957663a6James Kung } 19861388102bec5243dfd4494b8c674cdb7957663a6James Kung 1992fca024254c9de09f8d87933cc8c9a2046e37c52James Kung if (mColorPickerDialog == null) { 2002fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mColorPickerDialog = CalendarColorPickerDialog.newInstance(mData[position].id, 2012fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mIsTablet); 202b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung } else { 2032fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mColorPickerDialog.setCalendarId(mData[position].id); 204b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung } 20595e9538c2e504ea5528b07e3abdf54bb3d91c88aJames Kung mFragmentManager.executePendingTransactions(); 2062fca024254c9de09f8d87933cc8c9a2046e37c52James Kung if (!mColorPickerDialog.isAdded()) { 2072fca024254c9de09f8d87933cc8c9a2046e37c52James Kung mColorPickerDialog.show(mFragmentManager, COLOR_PICKER_DIALOG_TAG); 208b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung } 209b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung } 210b546c601b8f0b476e8bc7db649ee0a6ee60ce14cJames Kung }); 2116b858fc6f8afad95a075595016c5c22547924886Erik 2126b858fc6f8afad95a075595016c5c22547924886Erik setText(view, R.id.calendar, name); 2136b858fc6f8afad95a075595016c5c22547924886Erik return view; 2146b858fc6f8afad95a075595016c5c22547924886Erik } 2156b858fc6f8afad95a075595016c5c22547924886Erik 21661388102bec5243dfd4494b8c674cdb7957663a6James Kung private boolean hasMoreColors(int position) { 21761388102bec5243dfd4494b8c674cdb7957663a6James Kung return mCache.hasColors(mData[position].accountName, mData[position].accountType); 21861388102bec5243dfd4494b8c674cdb7957663a6James Kung } 21961388102bec5243dfd4494b8c674cdb7957663a6James Kung 2206b858fc6f8afad95a075595016c5c22547924886Erik private static void setText(View view, int id, String text) { 2216b858fc6f8afad95a075595016c5c22547924886Erik if (TextUtils.isEmpty(text)) { 2226b858fc6f8afad95a075595016c5c22547924886Erik return; 2236b858fc6f8afad95a075595016c5c22547924886Erik } 2246b858fc6f8afad95a075595016c5c22547924886Erik TextView textView = (TextView) view.findViewById(id); 2256b858fc6f8afad95a075595016c5c22547924886Erik textView.setText(text); 2266b858fc6f8afad95a075595016c5c22547924886Erik } 2276b858fc6f8afad95a075595016c5c22547924886Erik 228cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan @Override 2296b858fc6f8afad95a075595016c5c22547924886Erik public int getCount() { 2306b858fc6f8afad95a075595016c5c22547924886Erik return mRowCount; 2316b858fc6f8afad95a075595016c5c22547924886Erik } 2326b858fc6f8afad95a075595016c5c22547924886Erik 233cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan @Override 2346b858fc6f8afad95a075595016c5c22547924886Erik public Object getItem(int position) { 2356b858fc6f8afad95a075595016c5c22547924886Erik if (position >= mRowCount) { 2366b858fc6f8afad95a075595016c5c22547924886Erik return null; 2376b858fc6f8afad95a075595016c5c22547924886Erik } 2386b858fc6f8afad95a075595016c5c22547924886Erik CalendarRow item = mData[position]; 2396b858fc6f8afad95a075595016c5c22547924886Erik return item; 2406b858fc6f8afad95a075595016c5c22547924886Erik } 2416b858fc6f8afad95a075595016c5c22547924886Erik 242cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan @Override 2436b858fc6f8afad95a075595016c5c22547924886Erik public long getItemId(int position) { 2446b858fc6f8afad95a075595016c5c22547924886Erik if (position >= mRowCount) { 2456b858fc6f8afad95a075595016c5c22547924886Erik return 0; 2466b858fc6f8afad95a075595016c5c22547924886Erik } 2476b858fc6f8afad95a075595016c5c22547924886Erik return mData[position].id; 2486b858fc6f8afad95a075595016c5c22547924886Erik } 2496b858fc6f8afad95a075595016c5c22547924886Erik 25046c666c2a115d0f8e805db62d3cf741c163cbaa0Erik @Override 25146c666c2a115d0f8e805db62d3cf741c163cbaa0Erik public boolean hasStableIds() { 25246c666c2a115d0f8e805db62d3cf741c163cbaa0Erik return true; 25346c666c2a115d0f8e805db62d3cf741c163cbaa0Erik } 25446c666c2a115d0f8e805db62d3cf741c163cbaa0Erik 2556b858fc6f8afad95a075595016c5c22547924886Erik public int getSynced(int position) { 2566b858fc6f8afad95a075595016c5c22547924886Erik return mData[position].synced ? 1 : 0; 2576b858fc6f8afad95a075595016c5c22547924886Erik } 2586b858fc6f8afad95a075595016c5c22547924886Erik 2596b858fc6f8afad95a075595016c5c22547924886Erik @Override 260cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 261cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan CalendarRow row = (CalendarRow) view.getTag(); 262cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan row.synced = !row.synced; 263cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan 264cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan String status; 265cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan if (row.synced) { 266cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan status = mSyncedString; 267b2f986ce6f535f1d93a498e611455705f7547aecErik } else { 268cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan status = mNotSyncedString; 269b2f986ce6f535f1d93a498e611455705f7547aecErik } 270cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan setText(view, R.id.status, status); 271cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan 272cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan CheckBox cb = (CheckBox) view.findViewById(R.id.sync); 273cf7fd2b6d1b5af26c4ac422dde1778e2fd6c7ef6Michael Chan cb.setChecked(row.synced); 2746b858fc6f8afad95a075595016c5c22547924886Erik 2756b858fc6f8afad95a075595016c5c22547924886Erik // There is some data loss in long -> int, but we should never see it in 2766b858fc6f8afad95a075595016c5c22547924886Erik // practice regarding calendar ids. 277d17780987a421477ae57fe88e48cb2d81c42f517Erik mChanges.put(row.id, row); 2786b858fc6f8afad95a075595016c5c22547924886Erik } 2796b858fc6f8afad95a075595016c5c22547924886Erik 280d17780987a421477ae57fe88e48cb2d81c42f517Erik public HashMap<Long, CalendarRow> getChanges() { 2816b858fc6f8afad95a075595016c5c22547924886Erik return mChanges; 2826b858fc6f8afad95a075595016c5c22547924886Erik } 28361388102bec5243dfd4494b8c674cdb7957663a6James Kung 28461388102bec5243dfd4494b8c674cdb7957663a6James Kung @Override 28561388102bec5243dfd4494b8c674cdb7957663a6James Kung public void onCalendarColorsLoaded() { 28661388102bec5243dfd4494b8c674cdb7957663a6James Kung notifyDataSetChanged(); 28761388102bec5243dfd4494b8c674cdb7957663a6James Kung } 2886b858fc6f8afad95a075595016c5c22547924886Erik} 289