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 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 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 110 public void changeCursor(Cursor c) { 111 initData(c); 112 notifyDataSetChanged(); 113 } 114 115 @Override 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 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 158 public int getCount() { 159 return mRowCount; 160 } 161 162 @Override 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 172 public long getItemId(int position) { 173 if (position >= mRowCount) { 174 return 0; 175 } 176 return mData[position].id; 177 } 178 179 @Override 180 public boolean hasStableIds() { 181 return true; 182 } 183 184 public int getSynced(int position) { 185 return mData[position].synced ? 1 : 0; 186 } 187 188 @Override 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 209 public HashMap<Long, CalendarRow> getChanges() { 210 return mChanges; 211 } 212 } 213