diff options
Diffstat (limited to 'src/com/android/calendar/EventInfoFragment.java')
-rw-r--r-- | src/com/android/calendar/EventInfoFragment.java | 877 |
1 files changed, 0 insertions, 877 deletions
diff --git a/src/com/android/calendar/EventInfoFragment.java b/src/com/android/calendar/EventInfoFragment.java deleted file mode 100644 index 0aa83d02..00000000 --- a/src/com/android/calendar/EventInfoFragment.java +++ /dev/null @@ -1,877 +0,0 @@ -/* - * 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; - -import static android.provider.CalendarContract.EXTRA_EVENT_ALL_DAY; -import static android.provider.CalendarContract.EXTRA_EVENT_BEGIN_TIME; -import static android.provider.CalendarContract.EXTRA_EVENT_END_TIME; -import static com.android.calendar.CalendarController.EVENT_EDIT_ON_LAUNCH; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; -import android.app.Activity; -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.FragmentManager; -import android.app.Service; -import android.content.ActivityNotFoundException; -import android.content.ContentProviderOperation; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.res.Resources; -import android.database.Cursor; -import android.graphics.Color; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.provider.CalendarContract; -import android.provider.CalendarContract.Attendees; -import android.provider.CalendarContract.Calendars; -import android.provider.CalendarContract.Events; -import android.provider.CalendarContract.Reminders; -import android.provider.ContactsContract; -import android.provider.ContactsContract.CommonDataKinds; -import android.provider.ContactsContract.Intents; -import android.provider.ContactsContract.QuickContact; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.TextUtils; -import android.text.format.Time; -import android.text.method.LinkMovementMethod; -import android.text.method.MovementMethod; -import android.text.style.ForegroundColorSpan; -import android.text.util.Rfc822Token; -import android.util.Log; -import android.util.SparseIntArray; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnTouchListener; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityManager; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.RadioButton; -import android.widget.RadioGroup; -import android.widget.RadioGroup.OnCheckedChangeListener; -import android.widget.ScrollView; -import android.widget.TextView; -import android.widget.Toast; - -import com.android.calendar.CalendarController.EventInfo; -import com.android.calendar.CalendarController.EventType; -import com.android.calendar.alerts.QuickResponseActivity; -import com.android.calendarcommon2.DateException; -import com.android.calendarcommon2.Duration; -import com.android.calendarcommon2.EventRecurrence; -import com.android.colorpicker.HsvColorComparator; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class EventInfoFragment extends DialogFragment implements OnCheckedChangeListener, - CalendarController.EventHandler, OnClickListener { - - public static final boolean DEBUG = false; - - public static final String TAG = "EventInfoFragment"; - - protected static final String BUNDLE_KEY_EVENT_ID = "key_event_id"; - protected static final String BUNDLE_KEY_START_MILLIS = "key_start_millis"; - protected static final String BUNDLE_KEY_END_MILLIS = "key_end_millis"; - protected static final String BUNDLE_KEY_IS_DIALOG = "key_fragment_is_dialog"; - protected static final String BUNDLE_KEY_DELETE_DIALOG_VISIBLE = "key_delete_dialog_visible"; - protected static final String BUNDLE_KEY_WINDOW_STYLE = "key_window_style"; - protected static final String BUNDLE_KEY_CALENDAR_COLOR = "key_calendar_color"; - protected static final String BUNDLE_KEY_CALENDAR_COLOR_INIT = "key_calendar_color_init"; - protected static final String BUNDLE_KEY_CURRENT_COLOR = "key_current_color"; - protected static final String BUNDLE_KEY_CURRENT_COLOR_KEY = "key_current_color_key"; - protected static final String BUNDLE_KEY_CURRENT_COLOR_INIT = "key_current_color_init"; - protected static final String BUNDLE_KEY_ORIGINAL_COLOR = "key_original_color"; - protected static final String BUNDLE_KEY_ORIGINAL_COLOR_INIT = "key_original_color_init"; - protected static final String BUNDLE_KEY_ATTENDEE_RESPONSE = "key_attendee_response"; - protected static final String BUNDLE_KEY_USER_SET_ATTENDEE_RESPONSE = - "key_user_set_attendee_response"; - protected static final String BUNDLE_KEY_TENTATIVE_USER_RESPONSE = - "key_tentative_user_response"; - protected static final String BUNDLE_KEY_RESPONSE_WHICH_EVENTS = "key_response_which_events"; - protected static final String BUNDLE_KEY_REMINDER_MINUTES = "key_reminder_minutes"; - protected static final String BUNDLE_KEY_REMINDER_METHODS = "key_reminder_methods"; - - - private static final String PERIOD_SPACE = ". "; - - private static final String NO_EVENT_COLOR = ""; - - /** - * These are the corresponding indices into the array of strings - * "R.array.change_response_labels" in the resource file. - */ - static final int UPDATE_SINGLE = 0; - static final int UPDATE_ALL = 1; - - // Style of view - public static final int FULL_WINDOW_STYLE = 0; - public static final int DIALOG_WINDOW_STYLE = 1; - - private int mWindowStyle = DIALOG_WINDOW_STYLE; - - // Query tokens for QueryHandler - private static final int TOKEN_QUERY_EVENT = 1 << 0; - private static final int TOKEN_QUERY_CALENDARS = 1 << 1; - private static final int TOKEN_QUERY_ATTENDEES = 1 << 2; - private static final int TOKEN_QUERY_DUPLICATE_CALENDARS = 1 << 3; - private static final int TOKEN_QUERY_REMINDERS = 1 << 4; - private static final int TOKEN_QUERY_VISIBLE_CALENDARS = 1 << 5; - private static final int TOKEN_QUERY_COLORS = 1 << 6; - - private static final int TOKEN_QUERY_ALL = TOKEN_QUERY_DUPLICATE_CALENDARS - | TOKEN_QUERY_ATTENDEES | TOKEN_QUERY_CALENDARS | TOKEN_QUERY_EVENT - | TOKEN_QUERY_REMINDERS | TOKEN_QUERY_VISIBLE_CALENDARS | TOKEN_QUERY_COLORS; - - private int mCurrentQuery = 0; - - private static final String[] EVENT_PROJECTION = new String[] { - Events._ID, // 0 do not remove; used in DeleteEventHelper - Events.TITLE, // 1 do not remove; used in DeleteEventHelper - Events.RRULE, // 2 do not remove; used in DeleteEventHelper - Events.ALL_DAY, // 3 do not remove; used in DeleteEventHelper - Events.CALENDAR_ID, // 4 do not remove; used in DeleteEventHelper - Events.DTSTART, // 5 do not remove; used in DeleteEventHelper - Events._SYNC_ID, // 6 do not remove; used in DeleteEventHelper - Events.EVENT_TIMEZONE, // 7 do not remove; used in DeleteEventHelper - Events.DESCRIPTION, // 8 - Events.EVENT_LOCATION, // 9 - Calendars.CALENDAR_ACCESS_LEVEL, // 10 - Events.CALENDAR_COLOR, // 11 - Events.EVENT_COLOR, // 12 - Events.HAS_ATTENDEE_DATA, // 13 - Events.ORGANIZER, // 14 - Events.HAS_ALARM, // 15 - Calendars.MAX_REMINDERS, // 16 - Calendars.ALLOWED_REMINDERS, // 17 - Events.CUSTOM_APP_PACKAGE, // 18 - Events.CUSTOM_APP_URI, // 19 - Events.DTEND, // 20 - Events.DURATION, // 21 - Events.ORIGINAL_SYNC_ID // 22 do not remove; used in DeleteEventHelper - }; - private static final int EVENT_INDEX_ID = 0; - private static final int EVENT_INDEX_TITLE = 1; - private static final int EVENT_INDEX_RRULE = 2; - private static final int EVENT_INDEX_ALL_DAY = 3; - private static final int EVENT_INDEX_CALENDAR_ID = 4; - private static final int EVENT_INDEX_DTSTART = 5; - private static final int EVENT_INDEX_SYNC_ID = 6; - private static final int EVENT_INDEX_EVENT_TIMEZONE = 7; - private static final int EVENT_INDEX_DESCRIPTION = 8; - private static final int EVENT_INDEX_EVENT_LOCATION = 9; - private static final int EVENT_INDEX_ACCESS_LEVEL = 10; - private static final int EVENT_INDEX_CALENDAR_COLOR = 11; - private static final int EVENT_INDEX_EVENT_COLOR = 12; - private static final int EVENT_INDEX_HAS_ATTENDEE_DATA = 13; - private static final int EVENT_INDEX_ORGANIZER = 14; - private static final int EVENT_INDEX_HAS_ALARM = 15; - private static final int EVENT_INDEX_MAX_REMINDERS = 16; - private static final int EVENT_INDEX_ALLOWED_REMINDERS = 17; - private static final int EVENT_INDEX_CUSTOM_APP_PACKAGE = 18; - private static final int EVENT_INDEX_CUSTOM_APP_URI = 19; - private static final int EVENT_INDEX_DTEND = 20; - private static final int EVENT_INDEX_DURATION = 21; - - static { - if (!Utils.isJellybeanOrLater()) { - EVENT_PROJECTION[EVENT_INDEX_CUSTOM_APP_PACKAGE] = Events._ID; // nonessential value - EVENT_PROJECTION[EVENT_INDEX_CUSTOM_APP_URI] = Events._ID; // nonessential value - } - } - - static final String[] CALENDARS_PROJECTION = new String[] { - Calendars._ID, // 0 - Calendars.CALENDAR_DISPLAY_NAME, // 1 - Calendars.OWNER_ACCOUNT, // 2 - Calendars.CAN_ORGANIZER_RESPOND, // 3 - Calendars.ACCOUNT_NAME, // 4 - Calendars.ACCOUNT_TYPE // 5 - }; - static final int CALENDARS_INDEX_DISPLAY_NAME = 1; - static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2; - static final int CALENDARS_INDEX_OWNER_CAN_RESPOND = 3; - static final int CALENDARS_INDEX_ACCOUNT_NAME = 4; - static final int CALENDARS_INDEX_ACCOUNT_TYPE = 5; - - static final String CALENDARS_WHERE = Calendars._ID + "=?"; - static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.CALENDAR_DISPLAY_NAME + "=?"; - static final String CALENDARS_VISIBLE_WHERE = Calendars.VISIBLE + "=?"; - - public static final int COLORS_INDEX_COLOR = 1; - public static final int COLORS_INDEX_COLOR_KEY = 2; - - private View mView; - - private Uri mUri; - private long mEventId; - private Cursor mEventCursor; - private Cursor mCalendarsCursor; - - private static float mScale = 0; // Used for supporting different screen densities - - private static int mCustomAppIconSize = 32; - - private long mStartMillis; - private long mEndMillis; - private boolean mAllDay; - - private boolean mOwnerCanRespond; - private String mSyncAccountName; - private String mCalendarOwnerAccount; - private boolean mIsBusyFreeCalendar; - - private int mOriginalAttendeeResponse; - private int mAttendeeResponseFromIntent = Attendees.ATTENDEE_STATUS_NONE; - private int mUserSetResponse = Attendees.ATTENDEE_STATUS_NONE; - private int mWhichEvents = -1; - // Used as the temporary response until the dialog is confirmed. It is also - // able to be used as a state marker for configuration changes. - private int mTentativeUserSetResponse = Attendees.ATTENDEE_STATUS_NONE; - private boolean mHasAlarm; - // Used to prevent saving changes in event if it is being deleted. - private boolean mEventDeletionStarted = false; - - private TextView mTitle; - private TextView mWhenDateTime; - private TextView mWhere; - private Menu mMenu = null; - private View mHeadlines; - private ScrollView mScrollView; - private View mLoadingMsgView; - private View mErrorMsgView; - private ObjectAnimator mAnimateAlpha; - private long mLoadingMsgStartTime; - - private SparseIntArray mDisplayColorKeyMap = new SparseIntArray(); - private int mOriginalColor = -1; - private boolean mOriginalColorInitialized = false; - private int mCalendarColor = -1; - private boolean mCalendarColorInitialized = false; - private int mCurrentColor = -1; - private boolean mCurrentColorInitialized = false; - private int mCurrentColorKey = -1; - - private static final int FADE_IN_TIME = 300; // in milliseconds - private static final int LOADING_MSG_DELAY = 600; // in milliseconds - private static final int LOADING_MSG_MIN_DISPLAY_TIME = 600; - private boolean mNoCrossFade = false; // Used to prevent repeated cross-fade - private RadioGroup mResponseRadioGroup; - - ArrayList<String> mToEmails = new ArrayList<String>(); - ArrayList<String> mCcEmails = new ArrayList<String>(); - - - private final Runnable mTZUpdater = new Runnable() { - @Override - public void run() { - updateEvent(mView); - } - }; - - private final Runnable mLoadingMsgAlphaUpdater = new Runnable() { - @Override - public void run() { - // Since this is run after a delay, make sure to only show the message - // if the event's data is not shown yet. - if (!mAnimateAlpha.isRunning() && mScrollView.getAlpha() == 0) { - mLoadingMsgStartTime = System.currentTimeMillis(); - mLoadingMsgView.setAlpha(1); - } - } - }; - - private static int mDialogWidth = 500; - private static int mDialogHeight = 600; - private static int DIALOG_TOP_MARGIN = 8; - private boolean mIsDialog = false; - private boolean mIsPaused = true; - private boolean mDismissOnResume = false; - private int mX = -1; - private int mY = -1; - private int mMinTop; // Dialog cannot be above this location - private boolean mIsTabletConfig; - private Activity mActivity; - private Context mContext; - - private CalendarController mController; - - private void sendAccessibilityEventIfQueryDone(int token) { - mCurrentQuery |= token; - if (mCurrentQuery == TOKEN_QUERY_ALL) { - sendAccessibilityEvent(); - } - } - - public EventInfoFragment(Context context, Uri uri, long startMillis, long endMillis, - int attendeeResponse, boolean isDialog, int windowStyle) { - - Resources r = context.getResources(); - if (mScale == 0) { - mScale = context.getResources().getDisplayMetrics().density; - if (mScale != 1) { - mCustomAppIconSize *= mScale; - if (isDialog) { - DIALOG_TOP_MARGIN *= mScale; - } - } - } - if (isDialog) { - setDialogSize(r); - } - mIsDialog = isDialog; - - setStyle(DialogFragment.STYLE_NO_TITLE, 0); - mUri = uri; - mStartMillis = startMillis; - mEndMillis = endMillis; - mAttendeeResponseFromIntent = attendeeResponse; - mWindowStyle = windowStyle; - } - - // This is currently required by the fragment manager. - public EventInfoFragment() { - } - - public EventInfoFragment(Context context, long eventId, long startMillis, long endMillis, - int attendeeResponse, boolean isDialog, int windowStyle) { - this(context, ContentUris.withAppendedId(Events.CONTENT_URI, eventId), startMillis, - endMillis, attendeeResponse, isDialog, windowStyle); - mEventId = eventId; - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - if (mIsDialog) { - applyDialogParams(); - } - - final Activity activity = getActivity(); - mContext = activity; - } - - private void applyDialogParams() { - Dialog dialog = getDialog(); - dialog.setCanceledOnTouchOutside(true); - - Window window = dialog.getWindow(); - window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); - - WindowManager.LayoutParams a = window.getAttributes(); - a.dimAmount = .4f; - - a.width = mDialogWidth; - a.height = mDialogHeight; - - - // On tablets , do smart positioning of dialog - // On phones , use the whole screen - - if (mX != -1 || mY != -1) { - a.x = mX - mDialogWidth / 2; - a.y = mY - mDialogHeight / 2; - if (a.y < mMinTop) { - a.y = mMinTop + DIALOG_TOP_MARGIN; - } - a.gravity = Gravity.LEFT | Gravity.TOP; - } - window.setAttributes(a); - } - - public void setDialogParams(int x, int y, int minTop) { - mX = x; - mY = y; - mMinTop = minTop; - } - - // Implements OnCheckedChangeListener - @Override - public void onCheckedChanged(RadioGroup group, int checkedId) { - } - - public void onNothingSelected(AdapterView<?> parent) { - } - - @Override - public void onDetach() { - super.onDetach(); - mController.deregisterEventHandler(R.layout.event_info); - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mActivity = activity; - // Ensure that mIsTabletConfig is set before creating the menu. - mIsTabletConfig = Utils.getConfigBool(mActivity, R.bool.tablet_config); - mController = CalendarController.getInstance(mActivity); - mController.registerEventHandler(R.layout.event_info, this); - - if (!mIsDialog) { - setHasOptionsMenu(true); - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - if (mWindowStyle == DIALOG_WINDOW_STYLE) { - mView = inflater.inflate(R.layout.event_info_dialog, container, false); - } else { - mView = inflater.inflate(R.layout.event_info, container, false); - } - mScrollView = (ScrollView) mView.findViewById(R.id.event_info_scroll_view); - mLoadingMsgView = mView.findViewById(R.id.event_info_loading_msg); - mErrorMsgView = mView.findViewById(R.id.event_info_error_msg); - mTitle = (TextView) mView.findViewById(R.id.title); - mWhenDateTime = (TextView) mView.findViewById(R.id.when_datetime); - mWhere = (TextView) mView.findViewById(R.id.where); - mHeadlines = mView.findViewById(R.id.event_info_headline); - - mResponseRadioGroup = (RadioGroup) mView.findViewById(R.id.response_value); - - mAnimateAlpha = ObjectAnimator.ofFloat(mScrollView, "Alpha", 0, 1); - mAnimateAlpha.setDuration(FADE_IN_TIME); - mAnimateAlpha.addListener(new AnimatorListenerAdapter() { - int defLayerType; - - @Override - public void onAnimationStart(Animator animation) { - // Use hardware layer for better performance during animation - defLayerType = mScrollView.getLayerType(); - mScrollView.setLayerType(View.LAYER_TYPE_HARDWARE, null); - // Ensure that the loading message is gone before showing the - // event info - mLoadingMsgView.removeCallbacks(mLoadingMsgAlphaUpdater); - mLoadingMsgView.setVisibility(View.GONE); - } - - @Override - public void onAnimationCancel(Animator animation) { - mScrollView.setLayerType(defLayerType, null); - } - - @Override - public void onAnimationEnd(Animator animation) { - mScrollView.setLayerType(defLayerType, null); - // Do not cross fade after the first time - mNoCrossFade = true; - } - }); - - mLoadingMsgView.setAlpha(0); - mScrollView.setAlpha(0); - mErrorMsgView.setVisibility(View.INVISIBLE); - mLoadingMsgView.postDelayed(mLoadingMsgAlphaUpdater, LOADING_MSG_DELAY); - - // Hide Edit/Delete buttons if in full screen mode on a phone - if (!mIsDialog && !mIsTabletConfig || mWindowStyle == EventInfoFragment.FULL_WINDOW_STYLE) { - mView.findViewById(R.id.event_info_buttons_container).setVisibility(View.GONE); - } - - return mView; - } - - private void updateTitle() { - Resources res = getActivity().getResources(); - getActivity().setTitle(res.getString(R.string.event_info_title)); - } - - /** - * Initializes the event cursor, which is expected to point to the first - * (and only) result from a query. - * @return false if the cursor is empty, true otherwise - */ - private boolean initEventCursor() { - if ((mEventCursor == null) || (mEventCursor.getCount() == 0)) { - return false; - } - mEventCursor.moveToFirst(); - mEventId = mEventCursor.getInt(EVENT_INDEX_ID); - String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); - // mHasAlarm will be true if it was saved in the event already. - mHasAlarm = (mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) == 1)? true : false; - return true; - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - // Show color/edit/delete buttons only in non-dialog configuration - if (!mIsDialog && !mIsTabletConfig || mWindowStyle == EventInfoFragment.FULL_WINDOW_STYLE) { - inflater.inflate(R.menu.event_info_title_bar, menu); - mMenu = menu; - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - - // If we're a dialog we don't want to handle menu buttons - if (mIsDialog) { - return false; - } - // Handles option menu selections: - // Home button - close event info activity and start the main calendar - // one - // Edit button - start the event edit activity and close the info - // activity - // Delete button - start a delete query that calls a runnable that close - // the info activity - - final int itemId = item.getItemId(); - if (itemId == android.R.id.home) { - Utils.returnToCalendarHome(mContext); - mActivity.finish(); - return true; - } else if (itemId == R.id.info_action_edit) { - mActivity.finish(); - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onStop() { - super.onStop(); - } - - @Override - public void onDestroy() { - if (mEventCursor != null) { - mEventCursor.close(); - } - if (mCalendarsCursor != null) { - mCalendarsCursor.close(); - } - super.onDestroy(); - } - - /** - * Creates an exception to a recurring event. The only change we're making is to the - * "self attendee status" value. The provider will take care of updating the corresponding - * Attendees.attendeeStatus entry. - * - * @param eventId The recurring event. - * @param status The new value for selfAttendeeStatus. - */ - private void createExceptionResponse(long eventId, int status) { - ContentValues values = new ContentValues(); - values.put(Events.ORIGINAL_INSTANCE_TIME, mStartMillis); - values.put(Events.SELF_ATTENDEE_STATUS, status); - values.put(Events.STATUS, Events.STATUS_CONFIRMED); - - ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); - Uri exceptionUri = Uri.withAppendedPath(Events.CONTENT_EXCEPTION_URI, - String.valueOf(eventId)); - ops.add(ContentProviderOperation.newInsert(exceptionUri).withValues(values).build()); - } - - public static int getResponseFromButtonId(int buttonId) { - return Attendees.ATTENDEE_STATUS_NONE; - } - - public static int findButtonIdForResponse(int response) { - return -1; - } - - private void displayEventNotFound() { - mErrorMsgView.setVisibility(View.VISIBLE); - mScrollView.setVisibility(View.GONE); - mLoadingMsgView.setVisibility(View.GONE); - } - - private void updateEvent(View view) { - if (mEventCursor == null || view == null) { - return; - } - - Context context = view.getContext(); - if (context == null) { - return; - } - - String eventName = mEventCursor.getString(EVENT_INDEX_TITLE); - if (eventName == null || eventName.length() == 0) { - eventName = getActivity().getString(R.string.no_title_label); - } - - // 3rd parties might not have specified the start/end time when firing the - // Events.CONTENT_URI intent. Update these with values read from the db. - if (mStartMillis == 0 && mEndMillis == 0) { - mStartMillis = mEventCursor.getLong(EVENT_INDEX_DTSTART); - mEndMillis = mEventCursor.getLong(EVENT_INDEX_DTEND); - if (mEndMillis == 0) { - String duration = mEventCursor.getString(EVENT_INDEX_DURATION); - if (!TextUtils.isEmpty(duration)) { - try { - Duration d = new Duration(); - d.parse(duration); - long endMillis = mStartMillis + d.getMillis(); - if (endMillis >= mStartMillis) { - mEndMillis = endMillis; - } else { - Log.d(TAG, "Invalid duration string: " + duration); - } - } catch (DateException e) { - Log.d(TAG, "Error parsing duration string " + duration, e); - } - } - if (mEndMillis == 0) { - mEndMillis = mStartMillis; - } - } - } - - mAllDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0; - String location = mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION); - String description = mEventCursor.getString(EVENT_INDEX_DESCRIPTION); - String rRule = mEventCursor.getString(EVENT_INDEX_RRULE); - String eventTimezone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE); - - mHeadlines.setBackgroundColor(mCurrentColor); - - // What - if (eventName != null) { - setTextCommon(view, R.id.title, eventName); - } - - // When - // Set the date and repeats (if any) - String localTimezone = Utils.getTimeZone(mActivity, mTZUpdater); - - Resources resources = context.getResources(); - String displayedDatetime = Utils.getDisplayedDatetime(mStartMillis, mEndMillis, - System.currentTimeMillis(), localTimezone, mAllDay, context); - - String displayedTimezone = null; - if (!mAllDay) { - displayedTimezone = Utils.getDisplayedTimezone(mStartMillis, localTimezone, - eventTimezone); - } - // Display the datetime. Make the timezone (if any) transparent. - if (displayedTimezone == null) { - setTextCommon(view, R.id.when_datetime, displayedDatetime); - } else { - int timezoneIndex = displayedDatetime.length(); - displayedDatetime += " " + displayedTimezone; - SpannableStringBuilder sb = new SpannableStringBuilder(displayedDatetime); - ForegroundColorSpan transparentColorSpan = new ForegroundColorSpan( - resources.getColor(R.color.event_info_headline_transparent_color)); - sb.setSpan(transparentColorSpan, timezoneIndex, displayedDatetime.length(), - Spannable.SPAN_INCLUSIVE_INCLUSIVE); - setTextCommon(view, R.id.when_datetime, sb); - } - - view.findViewById(R.id.when_repeat).setVisibility(View.GONE); - - // Organizer view is setup in the updateCalendar method - - - // Where - if (location == null || location.trim().length() == 0) { - setVisibilityCommon(view, R.id.where, View.GONE); - } else { - final TextView textView = mWhere; - if (textView != null) { - textView.setText(location.trim()); - } - } - - // Launch Custom App - if (Utils.isJellybeanOrLater()) { - updateCustomAppButton(); - } - } - - private void updateCustomAppButton() { - setVisibilityCommon(mView, R.id.launch_custom_app_container, View.GONE); - return; - } - - private void sendAccessibilityEvent() { - AccessibilityManager am = - (AccessibilityManager) getActivity().getSystemService(Service.ACCESSIBILITY_SERVICE); - if (!am.isEnabled()) { - return; - } - - AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_FOCUSED); - event.setClassName(EventInfoFragment.class.getName()); - event.setPackageName(getActivity().getPackageName()); - List<CharSequence> text = event.getText(); - - if (mResponseRadioGroup.getVisibility() == View.VISIBLE) { - int id = mResponseRadioGroup.getCheckedRadioButtonId(); - if (id != View.NO_ID) { - text.add(((TextView) getView().findViewById(R.id.response_label)).getText()); - text.add((((RadioButton) (mResponseRadioGroup.findViewById(id))) - .getText() + PERIOD_SPACE)); - } - } - - am.sendAccessibilityEvent(event); - } - - private void updateCalendar(View view) { - - mCalendarOwnerAccount = ""; - if (mCalendarsCursor != null && mEventCursor != null) { - mCalendarsCursor.moveToFirst(); - String tempAccount = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT); - mCalendarOwnerAccount = (tempAccount == null) ? "" : tempAccount; - mOwnerCanRespond = mCalendarsCursor.getInt(CALENDARS_INDEX_OWNER_CAN_RESPOND) != 0; - mSyncAccountName = mCalendarsCursor.getString(CALENDARS_INDEX_ACCOUNT_NAME); - - setVisibilityCommon(view, R.id.organizer_container, View.GONE); - mIsBusyFreeCalendar = - mEventCursor.getInt(EVENT_INDEX_ACCESS_LEVEL) == Calendars.CAL_ACCESS_FREEBUSY; - - if (!mIsBusyFreeCalendar) { - - View b = mView.findViewById(R.id.edit); - b.setEnabled(true); - b.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - // For dialogs, just close the fragment - // For full screen, close activity on phone, leave it for tablet - if (mIsDialog) { - EventInfoFragment.this.dismiss(); - } - else if (!mIsTabletConfig){ - getActivity().finish(); - } - } - }); - } - View button; - if ((!mIsDialog && !mIsTabletConfig || - mWindowStyle == EventInfoFragment.FULL_WINDOW_STYLE) && mMenu != null) { - mActivity.invalidateOptionsMenu(); - } - } else { - setVisibilityCommon(view, R.id.calendar, View.GONE); - sendAccessibilityEventIfQueryDone(TOKEN_QUERY_DUPLICATE_CALENDARS); - } - } - - private void setTextCommon(View view, int id, CharSequence text) { - TextView textView = (TextView) view.findViewById(id); - if (textView == null) - return; - textView.setText(text); - } - - private void setVisibilityCommon(View view, int id, int visibility) { - View v = view.findViewById(id); - if (v != null) { - v.setVisibility(visibility); - } - return; - } - - @Override - public void onPause() { - mIsPaused = true; - super.onPause(); - } - - @Override - public void onResume() { - super.onResume(); - if (mIsDialog) { - setDialogSize(getActivity().getResources()); - applyDialogParams(); - } - mIsPaused = false; - if (mTentativeUserSetResponse != Attendees.ATTENDEE_STATUS_NONE) { - int buttonId = findButtonIdForResponse(mTentativeUserSetResponse); - mResponseRadioGroup.check(buttonId); - } - } - - @Override - public void eventsChanged() { - } - - @Override - public long getSupportedEventTypes() { - return EventType.EVENTS_CHANGED; - } - - @Override - public void handleEvent(EventInfo event) { - reloadEvents(); - } - - public void reloadEvents() { - } - - @Override - public void onClick(View view) { - } - - public long getEventId() { - return mEventId; - } - - public long getStartMillis() { - return mStartMillis; - } - public long getEndMillis() { - return mEndMillis; - } - private void setDialogSize(Resources r) { - mDialogWidth = (int)r.getDimension(R.dimen.event_info_dialog_width); - mDialogHeight = (int)r.getDimension(R.dimen.event_info_dialog_height); - } -} |