| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.calendar.selectcalendars; |
| |
| import android.app.FragmentManager; |
| import android.content.Context; |
| import android.content.res.Resources; |
| import android.database.Cursor; |
| import android.graphics.Rect; |
| import android.graphics.drawable.shapes.RectShape; |
| import android.provider.CalendarContract.Calendars; |
| import android.text.TextUtils; |
| import android.view.LayoutInflater; |
| import android.view.TouchDelegate; |
| import android.view.View; |
| import android.view.View.OnClickListener; |
| import android.view.ViewGroup; |
| import android.widget.AdapterView; |
| import android.widget.BaseAdapter; |
| import android.widget.CheckBox; |
| import android.widget.ListAdapter; |
| import android.widget.TextView; |
| |
| import com.android.calendar.CalendarColorPickerDialog; |
| import com.android.calendar.R; |
| import com.android.calendar.Utils; |
| |
| import java.util.HashMap; |
| |
| public class SelectCalendarsSyncAdapter extends BaseAdapter |
| implements ListAdapter, AdapterView.OnItemClickListener { |
| private static final String TAG = "SelCalsAdapter"; |
| private static final String COLOR_PICKER_DIALOG_TAG = "ColorPickerDialog"; |
| |
| private static int COLOR_CHIP_SIZE = 30; |
| private RectShape r = new RectShape(); |
| |
| private CalendarColorPickerDialog mColorPickerDialog; |
| |
| private LayoutInflater mInflater; |
| private static final int LAYOUT = R.layout.calendar_sync_item; |
| private CalendarRow[] mData; |
| private HashMap<Long, CalendarRow> mChanges = new HashMap<Long, CalendarRow>(); |
| private int mRowCount = 0; |
| |
| private int mIdColumn; |
| private int mNameColumn; |
| private int mColorColumn; |
| private int mSyncedColumn; |
| |
| private boolean mIsTablet; |
| private FragmentManager mFragmentManager; |
| private int mColorViewTouchAreaIncrease; |
| |
| |
| private final String mSyncedString; |
| private final String mNotSyncedString; |
| |
| public class CalendarRow { |
| long id; |
| String displayName; |
| int color; |
| boolean synced; |
| boolean originalSynced; |
| } |
| |
| public SelectCalendarsSyncAdapter(Context context, Cursor c, FragmentManager manager) { |
| super(); |
| initData(c); |
| mFragmentManager = manager; |
| mColorPickerDialog = (CalendarColorPickerDialog) |
| manager.findFragmentByTag(COLOR_PICKER_DIALOG_TAG); |
| mColorViewTouchAreaIncrease = context.getResources() |
| .getDimensionPixelSize(R.dimen.color_view_touch_area_increase); |
| mIsTablet = Utils.getConfigBool(context, R.bool.tablet_config); |
| mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
| COLOR_CHIP_SIZE *= context.getResources().getDisplayMetrics().density; |
| r.resize(COLOR_CHIP_SIZE, COLOR_CHIP_SIZE); |
| Resources res = context.getResources(); |
| mSyncedString = res.getString(R.string.synced); |
| mNotSyncedString = res.getString(R.string.not_synced); |
| } |
| |
| private void initData(Cursor c) { |
| if (c == null) { |
| mRowCount = 0; |
| mData = null; |
| return; |
| } |
| |
| mIdColumn = c.getColumnIndexOrThrow(Calendars._ID); |
| mNameColumn = c.getColumnIndexOrThrow(Calendars.CALENDAR_DISPLAY_NAME); |
| mColorColumn = c.getColumnIndexOrThrow(Calendars.CALENDAR_COLOR); |
| mSyncedColumn = c.getColumnIndexOrThrow(Calendars.SYNC_EVENTS); |
| |
| mRowCount = c.getCount(); |
| mData = new CalendarRow[mRowCount]; |
| c.moveToPosition(-1); |
| int p = 0; |
| while (c.moveToNext()) { |
| long id = c.getLong(mIdColumn); |
| mData[p] = new CalendarRow(); |
| mData[p].id = id; |
| mData[p].displayName = c.getString(mNameColumn); |
| mData[p].color = c.getInt(mColorColumn); |
| mData[p].originalSynced = c.getInt(mSyncedColumn) != 0; |
| if (mChanges.containsKey(id)) { |
| mData[p].synced = mChanges.get(id).synced; |
| } else { |
| mData[p].synced = mData[p].originalSynced; |
| } |
| p++; |
| } |
| } |
| |
| public void changeCursor(Cursor c) { |
| initData(c); |
| notifyDataSetChanged(); |
| } |
| |
| @Override |
| public View getView(final int position, View convertView, ViewGroup parent) { |
| if (position >= mRowCount) { |
| return null; |
| } |
| String name = mData[position].displayName; |
| boolean selected = mData[position].synced; |
| int color = Utils.getDisplayColorFromColor(mData[position].color); |
| View view; |
| if (convertView == null) { |
| view = mInflater.inflate(LAYOUT, parent, false); |
| final View delegate = view.findViewById(R.id.color); |
| final View delegateParent = (View) delegate.getParent(); |
| delegateParent.post(new Runnable() { |
| |
| @Override |
| public void run() { |
| final Rect r = new Rect(); |
| delegate.getHitRect(r); |
| r.top -= mColorViewTouchAreaIncrease; |
| r.bottom += mColorViewTouchAreaIncrease; |
| r.left -= mColorViewTouchAreaIncrease; |
| r.right += mColorViewTouchAreaIncrease; |
| delegateParent.setTouchDelegate(new TouchDelegate(r, delegate)); |
| } |
| }); |
| } else { |
| view = convertView; |
| } |
| |
| view.setTag(mData[position]); |
| |
| CheckBox cb = (CheckBox) view.findViewById(R.id.sync); |
| cb.setChecked(selected); |
| |
| if (selected) { |
| setText(view, R.id.status, mSyncedString); |
| } else { |
| setText(view, R.id.status, mNotSyncedString); |
| } |
| |
| View colorView = view.findViewById(R.id.color); |
| colorView.setBackgroundColor(color); |
| colorView.setOnClickListener(new OnClickListener() { |
| |
| @Override |
| public void onClick(View v) { |
| if (mColorPickerDialog == null) { |
| mColorPickerDialog = CalendarColorPickerDialog.newInstance(mData[position].id, |
| mIsTablet); |
| } else { |
| mColorPickerDialog.setCalendarId(mData[position].id); |
| } |
| mFragmentManager.executePendingTransactions(); |
| if (!mColorPickerDialog.isAdded()) { |
| mColorPickerDialog.show(mFragmentManager, COLOR_PICKER_DIALOG_TAG); |
| } |
| } |
| }); |
| |
| setText(view, R.id.calendar, name); |
| return view; |
| } |
| |
| private static void setText(View view, int id, String text) { |
| if (TextUtils.isEmpty(text)) { |
| return; |
| } |
| TextView textView = (TextView) view.findViewById(id); |
| textView.setText(text); |
| } |
| |
| @Override |
| public int getCount() { |
| return mRowCount; |
| } |
| |
| @Override |
| public Object getItem(int position) { |
| if (position >= mRowCount) { |
| return null; |
| } |
| CalendarRow item = mData[position]; |
| return item; |
| } |
| |
| @Override |
| public long getItemId(int position) { |
| if (position >= mRowCount) { |
| return 0; |
| } |
| return mData[position].id; |
| } |
| |
| @Override |
| public boolean hasStableIds() { |
| return true; |
| } |
| |
| public int getSynced(int position) { |
| return mData[position].synced ? 1 : 0; |
| } |
| |
| @Override |
| public void onItemClick(AdapterView<?> parent, View view, int position, long id) { |
| CalendarRow row = (CalendarRow) view.getTag(); |
| row.synced = !row.synced; |
| |
| String status; |
| if (row.synced) { |
| status = mSyncedString; |
| } else { |
| status = mNotSyncedString; |
| } |
| setText(view, R.id.status, status); |
| |
| CheckBox cb = (CheckBox) view.findViewById(R.id.sync); |
| cb.setChecked(row.synced); |
| |
| // There is some data loss in long -> int, but we should never see it in |
| // practice regarding calendar ids. |
| mChanges.put(row.id, row); |
| } |
| |
| public HashMap<Long, CalendarRow> getChanges() { |
| return mChanges; |
| } |
| } |