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