blob: 9e49283266767691c04c35385d67fa8dc67497b5 [file] [log] [blame]
/*
* Copyright (C) 2007 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.agenda;
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.provider.CalendarContract.Attendees;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.text.format.Time;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ResourceCursorAdapter;
import android.widget.TextView;
import com.android.calendar.ColorChipView;
import com.android.calendar.R;
import com.android.calendar.Utils;
import java.util.Formatter;
import java.util.Locale;
import java.util.TimeZone;
public class AgendaAdapter extends ResourceCursorAdapter {
private final String mNoTitleLabel;
private final Resources mResources;
private final int mDeclinedColor;
private final int mStandardColor;
private final int mWhereColor;
private final int mWhereDeclinedColor;
// Note: Formatter is not thread safe. Fine for now as it is only used by the main thread.
private final Formatter mFormatter;
private final StringBuilder mStringBuilder;
private float mScale;
private int COLOR_CHIP_ALL_DAY_HEIGHT;
private int COLOR_CHIP_HEIGHT;
private final Runnable mTZUpdater = new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
};
static class ViewHolder {
public static final int DECLINED_RESPONSE = 0;
public static final int TENTATIVE_RESPONSE = 1;
public static final int ACCEPTED_RESPONSE = 2;
/* Event */
TextView title;
TextView when;
TextView where;
View selectedMarker;
LinearLayout textContainer;
long instanceId;
ColorChipView colorChip;
long startTimeMilli;
boolean allDay;
boolean grayed;
int julianDay;
}
public AgendaAdapter(Context context, int resource) {
super(context, resource, null);
mResources = context.getResources();
mNoTitleLabel = mResources.getString(R.string.no_title_label);
mDeclinedColor = mResources.getColor(R.color.agenda_item_declined_color);
mStandardColor = mResources.getColor(R.color.agenda_item_standard_color);
mWhereDeclinedColor = mResources.getColor(R.color.agenda_item_where_declined_text_color);
mWhereColor = mResources.getColor(R.color.agenda_item_where_text_color);
mStringBuilder = new StringBuilder(50);
mFormatter = new Formatter(mStringBuilder, Locale.getDefault());
COLOR_CHIP_ALL_DAY_HEIGHT = mResources.getInteger(R.integer.color_chip_all_day_height);
COLOR_CHIP_HEIGHT = mResources.getInteger(R.integer.color_chip_height);
if (mScale == 0) {
mScale = mResources.getDisplayMetrics().density;
if (mScale != 1) {
COLOR_CHIP_ALL_DAY_HEIGHT *= mScale;
COLOR_CHIP_HEIGHT *= mScale;
}
}
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = null;
// Listview may get confused and pass in a different type of view since
// we keep shifting data around. Not a big problem.
Object tag = view.getTag();
if (tag instanceof ViewHolder) {
holder = (ViewHolder) view.getTag();
}
if (holder == null) {
holder = new ViewHolder();
view.setTag(holder);
holder.title = (TextView) view.findViewById(R.id.title);
holder.when = (TextView) view.findViewById(R.id.when);
holder.where = (TextView) view.findViewById(R.id.where);
holder.textContainer = (LinearLayout)
view.findViewById(R.id.agenda_item_text_container);
holder.selectedMarker = view.findViewById(R.id.selected_marker);
holder.colorChip = (ColorChipView)view.findViewById(R.id.agenda_item_color);
}
holder.startTimeMilli = cursor.getLong(AgendaWindowAdapter.INDEX_BEGIN);
// Fade text if event was declined and set the color chip mode (response
boolean allDay = cursor.getInt(AgendaWindowAdapter.INDEX_ALL_DAY) != 0;
holder.allDay = allDay;
int selfAttendeeStatus = cursor.getInt(AgendaWindowAdapter.INDEX_SELF_ATTENDEE_STATUS);
if (selfAttendeeStatus == Attendees.ATTENDEE_STATUS_DECLINED) {
holder.title.setTextColor(mDeclinedColor);
holder.when.setTextColor(mWhereDeclinedColor);
holder.where.setTextColor(mWhereDeclinedColor);
holder.colorChip.setDrawStyle(ColorChipView.DRAW_FADED);
} else {
holder.title.setTextColor(mStandardColor);
holder.when.setTextColor(mWhereColor);
holder.where.setTextColor(mWhereColor);
if (selfAttendeeStatus == Attendees.ATTENDEE_STATUS_INVITED) {
holder.colorChip.setDrawStyle(ColorChipView.DRAW_BORDER);
} else {
holder.colorChip.setDrawStyle(ColorChipView.DRAW_FULL);
}
}
// Set the size of the color chip
ViewGroup.LayoutParams params = holder.colorChip.getLayoutParams();
if (allDay) {
params.height = COLOR_CHIP_ALL_DAY_HEIGHT;
} else {
params.height = COLOR_CHIP_HEIGHT;
}
holder.colorChip.setLayoutParams(params);
// Deal with exchange events that the owner cannot respond to
int canRespond = cursor.getInt(AgendaWindowAdapter.INDEX_CAN_ORGANIZER_RESPOND);
if (canRespond == 0) {
String owner = cursor.getString(AgendaWindowAdapter.INDEX_OWNER_ACCOUNT);
String organizer = cursor.getString(AgendaWindowAdapter.INDEX_ORGANIZER);
if (owner.equals(organizer)) {
holder.colorChip.setDrawStyle(ColorChipView.DRAW_FULL);
holder.title.setTextColor(mStandardColor);
holder.when.setTextColor(mStandardColor);
holder.where.setTextColor(mStandardColor);
}
}
TextView title = holder.title;
TextView when = holder.when;
TextView where = holder.where;
holder.instanceId = cursor.getLong(AgendaWindowAdapter.INDEX_INSTANCE_ID);
/* Calendar Color */
int color = Utils.getDisplayColorFromColor(cursor.getInt(AgendaWindowAdapter.INDEX_COLOR));
holder.colorChip.setColor(color);
// What
String titleString = cursor.getString(AgendaWindowAdapter.INDEX_TITLE);
if (titleString == null || titleString.length() == 0) {
titleString = mNoTitleLabel;
}
title.setText(titleString);
// When
long begin = cursor.getLong(AgendaWindowAdapter.INDEX_BEGIN);
long end = cursor.getLong(AgendaWindowAdapter.INDEX_END);
String eventTz = cursor.getString(AgendaWindowAdapter.INDEX_TIME_ZONE);
int flags = 0;
String whenString;
// It's difficult to update all the adapters so just query this each
// time we need to build the view.
String tzString = Utils.getTimeZone(context, mTZUpdater);
if (allDay) {
tzString = Time.TIMEZONE_UTC;
} else {
flags = DateUtils.FORMAT_SHOW_TIME;
}
if (DateFormat.is24HourFormat(context)) {
flags |= DateUtils.FORMAT_24HOUR;
}
mStringBuilder.setLength(0);
whenString = DateUtils.formatDateRange(context, mFormatter, begin, end, flags, tzString)
.toString();
if (!allDay && !TextUtils.equals(tzString, eventTz)) {
String displayName;
// Figure out if this is in DST
Time date = new Time(tzString);
date.set(begin);
TimeZone tz = TimeZone.getTimeZone(tzString);
if (tz == null || tz.getID().equals("GMT")) {
displayName = tzString;
} else {
displayName = tz.getDisplayName(date.isDst != 0, TimeZone.SHORT);
}
whenString += " (" + displayName + ")";
}
when.setText(whenString);
/* Recurring event icon is removed
String rrule = cursor.getString(AgendaWindowAdapter.INDEX_RRULE);
if (!TextUtils.isEmpty(rrule)) {
when.setCompoundDrawablesWithIntrinsicBounds(null, null,
context.getResources().getDrawable(R.drawable.ic_repeat_dark), null);
when.setCompoundDrawablePadding(5);
} else {
when.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
} */
/*
// Repeating info
View repeatContainer = view.findViewById(R.id.repeat_icon);
String rrule = cursor.getString(AgendaWindowAdapter.INDEX_RRULE);
if (!TextUtils.isEmpty(rrule)) {
repeatContainer.setVisibility(View.VISIBLE);
} else {
repeatContainer.setVisibility(View.GONE);
}
*/
/*
// Reminder
boolean hasAlarm = cursor.getInt(AgendaWindowAdapter.INDEX_HAS_ALARM) != 0;
if (hasAlarm) {
updateReminder(view, context, begin, cursor.getLong(AgendaWindowAdapter.INDEX_EVENT_ID));
}
*/
// Where
String whereString = cursor.getString(AgendaWindowAdapter.INDEX_EVENT_LOCATION);
if (whereString != null && whereString.length() > 0) {
where.setVisibility(View.VISIBLE);
where.setText(whereString);
} else {
where.setVisibility(View.GONE);
}
}
/*
public static void updateReminder(View view, Context context, long begin, long eventId) {
ContentResolver cr = context.getContentResolver();
Uri uri = Reminders.CONTENT_URI;
String where = String.format(REMINDERS_WHERE, eventId);
Cursor remindersCursor = cr.query(uri, REMINDERS_PROJECTION, where, null, null);
if (remindersCursor != null) {
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout parent = (LinearLayout) view.findViewById(R.id.reminders_container);
parent.removeAllViews();
while (remindersCursor.moveToNext()) {
int alarm = remindersCursor.getInt(REMINDERS_INDEX_MINUTES);
String before = EditEvent.constructReminderLabel(context, alarm, true);
LinearLayout reminderItem = (LinearLayout)
inflater.inflate(R.layout.agenda_reminder_item, null);
TextView reminderItemText = (TextView) reminderItem.findViewById(R.id.reminder);
reminderItemText.setText(before);
parent.addView(reminderItem);
}
}
remindersCursor.close();
}
*/
}