blob: 00f7e942ac826debfbac0f6586ab947214c46221 [file] [log] [blame]
Michael Chan49701592010-06-30 11:04:03 -07001/*
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
17package com.android.calendar;
18
Erikdd95df52010-08-27 09:31:18 -070019import static android.provider.Calendar.EVENT_BEGIN_TIME;
20import static android.provider.Calendar.EVENT_END_TIME;
Michael Chan2c7c8512010-12-10 14:12:57 -080021import static android.provider.Calendar.AttendeesColumns.ATTENDEE_STATUS;
Erikdd95df52010-08-27 09:31:18 -070022
Michael Chan83b0fe32010-07-08 16:46:26 -070023import com.android.calendar.CalendarController.EventHandler;
Michael Chanab29d9e2010-07-21 06:08:47 -070024import com.android.calendar.CalendarController.EventInfo;
Michael Chan83b0fe32010-07-08 16:46:26 -070025import com.android.calendar.CalendarController.EventType;
Michael Chan3458a172010-07-13 17:58:21 -070026import com.android.calendar.CalendarController.ViewType;
Mason Tang00b8c1a2010-08-23 12:02:00 -070027import com.android.calendar.agenda.AgendaFragment;
Erik981874e2010-10-05 16:52:52 -070028import com.android.calendar.month.MonthByWeekFragment;
Mason Tang9a3cb142010-07-27 12:16:41 -070029import com.android.calendar.selectcalendars.SelectCalendarsFragment;
Michael Chan83b0fe32010-07-08 16:46:26 -070030
Michael Chanab29d9e2010-07-21 06:08:47 -070031import android.app.ActionBar;
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -070032import android.app.ActionBar.Tab;
Michael Chan49701592010-06-30 11:04:03 -070033import android.app.Activity;
Michael Chan83b0fe32010-07-08 16:46:26 -070034import android.app.Fragment;
Michael Chan3458a172010-07-13 17:58:21 -070035import android.app.FragmentTransaction;
Erik954c8712010-08-06 10:12:34 -070036import android.content.ContentResolver;
Erikdd95df52010-08-27 09:31:18 -070037import android.content.Intent;
Mason Tang8e3d4302010-07-12 17:39:30 -070038import android.content.SharedPreferences;
39import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
Michael Chanab29d9e2010-07-21 06:08:47 -070040import android.content.res.Configuration;
Erikeaafa2b2010-12-23 14:30:37 -080041import android.content.res.Resources;
Erik954c8712010-08-06 10:12:34 -070042import android.database.ContentObserver;
Erikdd95df52010-08-27 09:31:18 -070043import android.net.Uri;
Michael Chan49701592010-06-30 11:04:03 -070044import android.os.Bundle;
Erik954c8712010-08-06 10:12:34 -070045import android.os.Handler;
46import android.provider.Calendar;
Erik6c255102010-09-29 14:43:00 -070047import android.text.TextUtils;
48import android.text.format.DateFormat;
Michael Chan3458a172010-07-13 17:58:21 -070049import android.text.format.DateUtils;
Michael Chan83b0fe32010-07-08 16:46:26 -070050import android.text.format.Time;
Erik954c8712010-08-06 10:12:34 -070051import android.util.Log;
Erik2051f122010-07-02 13:45:45 -070052import android.view.Menu;
Michael Chan3458a172010-07-13 17:58:21 -070053import android.view.MenuItem;
Michael Chanab29d9e2010-07-21 06:08:47 -070054import android.view.View;
Erik259b8f92011-01-12 14:01:12 -080055import android.view.accessibility.AccessibilityEvent;
Daisuke Miyakawa6d2e6f72010-09-17 10:30:54 -070056import android.widget.SearchView;
Erik6c255102010-09-29 14:43:00 -070057import android.widget.TextView;
58
Michael Chan2c7c8512010-12-10 14:12:57 -080059import java.util.List;
Erik6c255102010-09-29 14:43:00 -070060import java.util.Locale;
61import java.util.TimeZone;
Michael Chan49701592010-06-30 11:04:03 -070062
Michael Chanab29d9e2010-07-21 06:08:47 -070063public class AllInOneActivity extends Activity implements EventHandler,
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -070064 OnSharedPreferenceChangeListener, SearchView.OnQueryChangeListener,
65 ActionBar.TabListener {
Michael Chand6734db2010-07-22 00:48:08 -070066 private static final String TAG = "AllInOneActivity";
Erik954c8712010-08-06 10:12:34 -070067 private static final boolean DEBUG = false;
Michael Chand6734db2010-07-22 00:48:08 -070068 private static final String BUNDLE_KEY_RESTORE_TIME = "key_restore_time";
Erik7b92da22010-09-23 14:55:22 -070069 private static final String BUNDLE_KEY_RESTORE_EDIT = "key_restore_edit";
70 private static final String BUNDLE_KEY_EVENT_ID = "key_event_id";
Erik3f348f32010-08-10 13:17:19 -070071 private static final int HANDLER_KEY = 0;
Erikeaafa2b2010-12-23 14:30:37 -080072
Michael Chan0558def2010-07-22 21:30:32 -070073 private static CalendarController mController;
Erik9fc409f2010-07-28 11:40:47 -070074 private static boolean mIsMultipane;
Michael Chan6191c122010-11-02 16:23:47 -070075 private boolean mOnSaveInstanceStateCalled = false;
Erik954c8712010-08-06 10:12:34 -070076 private ContentResolver mContentResolver;
Erik648c59c2010-08-13 12:49:26 -070077 private int mPreviousView;
78 private int mCurrentView;
Erikcb811892010-09-28 13:44:19 -070079 private boolean mPaused = true;
80 private boolean mUpdateOnResume = false;
Erik6c255102010-09-29 14:43:00 -070081 private TextView mHomeTime;
Erikeaafa2b2010-12-23 14:30:37 -080082 private TextView mDateRange;
Erikc5f92d72010-11-11 16:18:34 -080083 private String mTimeZone;
Erik6c255102010-09-29 14:43:00 -070084
Michael Chan2c7c8512010-12-10 14:12:57 -080085 private long mViewEventId = -1;
86 private long mIntentEventStartMillis = -1;
87 private long mIntentEventEndMillis = -1;
Michael Chandeced892010-12-10 15:59:35 -080088 private int mIntentAttendeeResponse = CalendarController.ATTENDEE_NO_RESPONSE;
Michael Chan2c7c8512010-12-10 14:12:57 -080089
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -070090 // Action bar and Navigation bar (left side of Action bar)
91 private ActionBar mActionBar;
92 private ActionBar.Tab mDayTab;
93 private ActionBar.Tab mWeekTab;
94 private ActionBar.Tab mMonthTab;
95
Erik6c255102010-09-29 14:43:00 -070096 private Runnable mHomeTimeUpdater = new Runnable() {
97 @Override
98 public void run() {
99 updateHomeClock();
100 }
101 };
Erik954c8712010-08-06 10:12:34 -0700102
103 // Create an observer so that we can update the views whenever a
104 // Calendar event changes.
Erik7b92da22010-09-23 14:55:22 -0700105 private ContentObserver mObserver = new ContentObserver(new Handler()) {
Erik954c8712010-08-06 10:12:34 -0700106 @Override
107 public boolean deliverSelfNotifications() {
108 return true;
109 }
110
111 @Override
112 public void onChange(boolean selfChange) {
113 eventsChanged();
114 }
115 };
Michael Chan83b0fe32010-07-08 16:46:26 -0700116
Michael Chan49701592010-06-30 11:04:03 -0700117 @Override
Michael Chan83b0fe32010-07-08 16:46:26 -0700118 protected void onCreate(Bundle icicle) {
Michael Chandc881b92010-11-18 22:17:34 -0800119// setTheme(R.style.CalendarTheme_WithActionBarWallpaper);
Michael Chan83b0fe32010-07-08 16:46:26 -0700120 super.onCreate(icicle);
121
122 // This needs to be created before setContentView
Michael Chan0558def2010-07-22 21:30:32 -0700123 mController = CalendarController.getInstance(this);
Erik954c8712010-08-06 10:12:34 -0700124 // Get time from intent or icicle
Michael Chan2c7c8512010-12-10 14:12:57 -0800125 long timeMillis = -1;
126 int viewType = -1;
127 boolean restoreEdit = false;
128 final Intent intent = getIntent();
Erik954c8712010-08-06 10:12:34 -0700129 if (icicle != null) {
130 timeMillis = icicle.getLong(BUNDLE_KEY_RESTORE_TIME);
Michael Chan2c7c8512010-12-10 14:12:57 -0800131 restoreEdit = icicle.getBoolean(BUNDLE_KEY_RESTORE_EDIT, false);
Erik7b92da22010-09-23 14:55:22 -0700132 viewType = ViewType.EDIT;
133 } else {
Michael Chan2c7c8512010-12-10 14:12:57 -0800134 String action = intent.getAction();
135 if (Intent.ACTION_VIEW.equals(action)) {
136 // Open EventInfo later
137 timeMillis = parseViewAction(intent);
138 }
139
140 if (timeMillis == -1) {
141 timeMillis = Utils.timeFromIntentInMillis(intent);
142 }
143 }
144
145 if (!restoreEdit) {
Erik7b92da22010-09-23 14:55:22 -0700146 viewType = Utils.getViewTypeFromIntentAndSharedPref(this);
147 }
Erikc5f92d72010-11-11 16:18:34 -0800148 mTimeZone = Utils.getTimeZone(this, mHomeTimeUpdater);
149 Time t = new Time(mTimeZone);
Erik954c8712010-08-06 10:12:34 -0700150 t.set(timeMillis);
151
Michael Chan2c7c8512010-12-10 14:12:57 -0800152 if (icicle != null && intent != null) {
153 Log.d(TAG, "both, icicle:" + icicle.toString() + " intent:" + intent.toString());
Erik7b92da22010-09-23 14:55:22 -0700154 } else {
Michael Chan2c7c8512010-12-10 14:12:57 -0800155 Log.d(TAG, "not both, icicle:" + icicle + " intent:" + intent);
Erik7b92da22010-09-23 14:55:22 -0700156 }
157
Erikeaafa2b2010-12-23 14:30:37 -0800158 Resources res = getResources();
159 mIsMultipane =
160 (res.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_XLARGE) != 0;
Erik9fc409f2010-07-28 11:40:47 -0700161
Michael Chanb60218a2010-12-14 16:34:39 -0800162 Utils.allowWeekForDetailView(mIsMultipane);
163
Erikeaafa2b2010-12-23 14:30:37 -0800164 mDateRange = (TextView) getLayoutInflater().inflate(R.layout.date_range_title, null);
165
Erikbe8191c2010-10-26 16:50:08 -0700166 // setContentView must be called before configureActionBar
167 setContentView(R.layout.all_in_one);
168 // configureActionBar auto-selects the first tab you add, so we need to
169 // call it before we set up our own fragments to make sure it doesn't
170 // overwrite us
171 configureActionBar();
172
Erik3f348f32010-08-10 13:17:19 -0700173 // Must be the first to register because this activity can modify the
174 // list of event handlers in it's handle method. This affects who the
175 // rest of the handlers the controller dispatches to are.
176 mController.registerEventHandler(HANDLER_KEY, this);
Michael Chan83b0fe32010-07-08 16:46:26 -0700177
Erik6c255102010-09-29 14:43:00 -0700178 mHomeTime = (TextView) findViewById(R.id.home_time);
Michael Chan83b0fe32010-07-08 16:46:26 -0700179
Erik7b92da22010-09-23 14:55:22 -0700180 initFragments(timeMillis, viewType, icicle);
Mason Tang8e3d4302010-07-12 17:39:30 -0700181
Erik6c255102010-09-29 14:43:00 -0700182
Mason Tang8e3d4302010-07-12 17:39:30 -0700183 // Listen for changes that would require this to be refreshed
Daisuke Miyakawa4b441bd2010-09-16 14:55:36 -0700184 SharedPreferences prefs = GeneralPreferences.getSharedPreferences(this);
Mason Tang8e3d4302010-07-12 17:39:30 -0700185 prefs.registerOnSharedPreferenceChangeListener(this);
Erikcb811892010-09-28 13:44:19 -0700186
Erik954c8712010-08-06 10:12:34 -0700187 mContentResolver = getContentResolver();
Erikbe8191c2010-10-26 16:50:08 -0700188 }
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700189
Michael Chan2c7c8512010-12-10 14:12:57 -0800190 private long parseViewAction(final Intent intent) {
191 long timeMillis = -1;
192 Uri data = intent.getData();
193 if (data != null && data.isHierarchical()) {
194 List<String> path = data.getPathSegments();
195 if (path.size() == 2 && path.get(0).equals("events")) {
196 try {
197 mViewEventId = Long.valueOf(data.getLastPathSegment());
198 if(mViewEventId != -1) {
199 mIntentEventStartMillis = intent.getLongExtra(EVENT_BEGIN_TIME, 0);
200 mIntentEventEndMillis = intent.getLongExtra(EVENT_END_TIME, 0);
201 mIntentAttendeeResponse = intent.getIntExtra(
Michael Chandeced892010-12-10 15:59:35 -0800202 ATTENDEE_STATUS, CalendarController.ATTENDEE_NO_RESPONSE);
Michael Chan2c7c8512010-12-10 14:12:57 -0800203 timeMillis = mIntentEventStartMillis;
204 }
205 } catch (NumberFormatException e) {
206 // Ignore if mViewEventId can't be parsed
207 }
208 }
209 }
210 return timeMillis;
211 }
212
Erikbe8191c2010-10-26 16:50:08 -0700213 private void configureActionBar() {
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700214 mActionBar = getActionBar();
Michael Chandeced892010-12-10 15:59:35 -0800215 mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700216 if (mActionBar == null) {
217 Log.w(TAG, "ActionBar is null.");
218 } else {
219 mDayTab = mActionBar.newTab();
220 mDayTab.setText(getString(R.string.day_view));
221 mDayTab.setTabListener(this);
222 mActionBar.addTab(mDayTab);
223 mWeekTab = mActionBar.newTab();
224 mWeekTab.setText(getString(R.string.week_view));
225 mWeekTab.setTabListener(this);
226 mActionBar.addTab(mWeekTab);
227 mMonthTab = mActionBar.newTab();
228 mMonthTab.setText(getString(R.string.month_view));
229 mMonthTab.setTabListener(this);
230 mActionBar.addTab(mMonthTab);
Erikeaafa2b2010-12-23 14:30:37 -0800231 mActionBar.setCustomView(mDateRange);
232 mActionBar.setDisplayOptions(
233 ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME);
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700234 }
Erik954c8712010-08-06 10:12:34 -0700235 }
236
237 @Override
238 protected void onResume() {
239 super.onResume();
240 mContentResolver.registerContentObserver(Calendar.Events.CONTENT_URI, true, mObserver);
Erikcb811892010-09-28 13:44:19 -0700241 if (mUpdateOnResume) {
242 initFragments(mController.getTime(), mController.getViewType(), null);
243 mUpdateOnResume = false;
244 }
Erik6c255102010-09-29 14:43:00 -0700245 updateHomeClock();
Erikcb811892010-09-28 13:44:19 -0700246 mPaused = false;
Michael Chan6191c122010-11-02 16:23:47 -0700247 mOnSaveInstanceStateCalled = false;
Michael Chan2c7c8512010-12-10 14:12:57 -0800248
249 if (mViewEventId != -1 && mIntentEventStartMillis != -1 && mIntentEventEndMillis != -1) {
Michael Chanf0868f62011-01-11 19:37:35 -0800250 mController.sendEventRelatedEventWithResponse(this, EventType.VIEW_EVENT, mViewEventId,
Michael Chandeced892010-12-10 15:59:35 -0800251 mIntentEventStartMillis, mIntentEventEndMillis, -1, -1,
252 mIntentAttendeeResponse);
Michael Chan2c7c8512010-12-10 14:12:57 -0800253 mViewEventId = -1;
254 mIntentEventStartMillis = -1;
255 mIntentEventEndMillis = -1;
256 }
Mason Tang8e3d4302010-07-12 17:39:30 -0700257 }
258
259 @Override
Michael Chand6734db2010-07-22 00:48:08 -0700260 protected void onPause() {
261 super.onPause();
Erikcb811892010-09-28 13:44:19 -0700262 mPaused = true;
Daisuke Miyakawac9e53072010-10-14 12:18:49 -0700263 mHomeTime.removeCallbacks(mHomeTimeUpdater);
Erik954c8712010-08-06 10:12:34 -0700264 mContentResolver.unregisterContentObserver(mObserver);
Erikcb811892010-09-28 13:44:19 -0700265 if (isFinishing()) {
266 // Stop listening for changes that would require this to be refreshed
267 SharedPreferences prefs = GeneralPreferences.getSharedPreferences(this);
268 prefs.unregisterOnSharedPreferenceChangeListener(this);
269 }
Erik7b92da22010-09-23 14:55:22 -0700270 // FRAG_TODO save highlighted days of the week;
Erikdd95df52010-08-27 09:31:18 -0700271 if (mController.getViewType() != ViewType.EDIT) {
272 Utils.setDefaultView(this, mController.getViewType());
273 }
Michael Chand6734db2010-07-22 00:48:08 -0700274 }
275
276 @Override
Erik7b92da22010-09-23 14:55:22 -0700277 protected void onUserLeaveHint() {
278 mController.sendEvent(this, EventType.USER_HOME, null, null, -1, ViewType.CURRENT);
279 super.onUserLeaveHint();
280 }
281
282 @Override
Michael Chand6734db2010-07-22 00:48:08 -0700283 public void onSaveInstanceState(Bundle outState) {
Michael Chan6191c122010-11-02 16:23:47 -0700284 mOnSaveInstanceStateCalled = true;
Michael Chand6734db2010-07-22 00:48:08 -0700285 super.onSaveInstanceState(outState);
286
287 outState.putLong(BUNDLE_KEY_RESTORE_TIME, mController.getTime());
Erik7b92da22010-09-23 14:55:22 -0700288 if (mCurrentView == ViewType.EDIT) {
289 outState.putBoolean(BUNDLE_KEY_RESTORE_EDIT, true);
290 outState.putLong(BUNDLE_KEY_EVENT_ID, mController.getEventId());
291 }
Michael Chand6734db2010-07-22 00:48:08 -0700292 }
293
294 @Override
Mason Tang8e3d4302010-07-12 17:39:30 -0700295 protected void onDestroy() {
296 super.onDestroy();
297
Daisuke Miyakawa4b441bd2010-09-16 14:55:36 -0700298 SharedPreferences prefs = GeneralPreferences.getSharedPreferences(this);
Mason Tang8e3d4302010-07-12 17:39:30 -0700299 prefs.unregisterOnSharedPreferenceChangeListener(this);
Eriked61b482010-08-13 13:59:50 -0700300 CalendarController.removeInstance(this);
Mason Tang8e3d4302010-07-12 17:39:30 -0700301 }
302
Erik7b92da22010-09-23 14:55:22 -0700303 private void initFragments(long timeMillis, int viewType, Bundle icicle) {
Mason Tang1d564f62010-08-20 14:44:20 -0700304 FragmentTransaction ft = getFragmentManager().openTransaction();
Michael Chan3458a172010-07-13 17:58:21 -0700305
Erik9fc409f2010-07-28 11:40:47 -0700306 if (mIsMultipane) {
Erik40bcd102010-11-16 15:46:40 -0800307 Fragment miniMonthFrag = new MonthByWeekFragment(timeMillis, true);
Michael Chanab29d9e2010-07-21 06:08:47 -0700308 ft.replace(R.id.mini_month, miniMonthFrag);
Erik3f348f32010-08-10 13:17:19 -0700309 mController.registerEventHandler(R.id.mini_month, (EventHandler) miniMonthFrag);
Michael Chanab29d9e2010-07-21 06:08:47 -0700310
311 Fragment selectCalendarsFrag = new SelectCalendarsFragment();
312 ft.replace(R.id.calendar_list, selectCalendarsFrag);
Erikdd95df52010-08-27 09:31:18 -0700313 }
Erik7b92da22010-09-23 14:55:22 -0700314 if (!mIsMultipane || viewType == ViewType.EDIT) {
Michael Chanab29d9e2010-07-21 06:08:47 -0700315 findViewById(R.id.mini_month).setVisibility(View.GONE);
316 findViewById(R.id.calendar_list).setVisibility(View.GONE);
317 }
Michael Chan3458a172010-07-13 17:58:21 -0700318
Erikdd95df52010-08-27 09:31:18 -0700319 EventInfo info = null;
320 if (viewType == ViewType.EDIT) {
Daisuke Miyakawa4b441bd2010-09-16 14:55:36 -0700321 mPreviousView = GeneralPreferences.getSharedPreferences(this).getInt(
Erik7b92da22010-09-23 14:55:22 -0700322 GeneralPreferences.KEY_START_VIEW, GeneralPreferences.DEFAULT_START_VIEW);
Erikdd95df52010-08-27 09:31:18 -0700323
Daisuke Miyakawa4143cfa2010-09-17 19:55:04 -0700324 long eventId = -1;
Erikdd95df52010-08-27 09:31:18 -0700325 Intent intent = getIntent();
326 Uri data = intent.getData();
327 if (data != null) {
328 try {
Daisuke Miyakawa4143cfa2010-09-17 19:55:04 -0700329 eventId = Long.parseLong(data.getLastPathSegment());
Erikdd95df52010-08-27 09:31:18 -0700330 } catch (NumberFormatException e) {
331 if (DEBUG) {
332 Log.d(TAG, "Create new event");
333 }
334 }
Erik7b92da22010-09-23 14:55:22 -0700335 } else if (icicle != null && icicle.containsKey(BUNDLE_KEY_EVENT_ID)) {
336 eventId = icicle.getLong(BUNDLE_KEY_EVENT_ID);
Erikdd95df52010-08-27 09:31:18 -0700337 }
Daisuke Miyakawa4143cfa2010-09-17 19:55:04 -0700338
Erikdd95df52010-08-27 09:31:18 -0700339 long begin = intent.getLongExtra(EVENT_BEGIN_TIME, -1);
340 long end = intent.getLongExtra(EVENT_END_TIME, -1);
341 info = new EventInfo();
342 if (end != -1) {
343 info.endTime = new Time();
344 info.endTime.set(end);
345 }
346 if (begin != -1) {
347 info.startTime = new Time();
348 info.startTime.set(begin);
349 }
350 info.id = eventId;
351 // We set the viewtype so if the user presses back when they are
352 // done editing the controller knows we were in the Edit Event
Erik7b92da22010-09-23 14:55:22 -0700353 // screen. Likewise for eventId
Erikdd95df52010-08-27 09:31:18 -0700354 mController.setViewType(viewType);
Erik7b92da22010-09-23 14:55:22 -0700355 mController.setEventId(eventId);
Erikdd95df52010-08-27 09:31:18 -0700356 } else {
357 mPreviousView = viewType;
358 }
359 setMainPane(ft, R.id.main_pane, viewType, timeMillis, true, info);
Michael Chan3458a172010-07-13 17:58:21 -0700360
361 ft.commit(); // this needs to be after setMainPane()
362
Erikc5f92d72010-11-11 16:18:34 -0800363 Time t = new Time(mTimeZone);
Michael Chand6734db2010-07-22 00:48:08 -0700364 t.set(timeMillis);
Erikdd95df52010-08-27 09:31:18 -0700365 if (viewType != ViewType.EDIT) {
366 mController.sendEvent(this, EventType.GO_TO, t, null, -1, viewType);
367 }
Michael Chan49701592010-06-30 11:04:03 -0700368 }
Erik2051f122010-07-02 13:45:45 -0700369
370 @Override
Erik648c59c2010-08-13 12:49:26 -0700371 public void onBackPressed() {
Daisuke Miyakawa93e69eb2010-10-22 18:54:38 -0700372 if (mCurrentView == ViewType.EDIT || mCurrentView == ViewType.DETAIL) {
Erikdd95df52010-08-27 09:31:18 -0700373 mController.sendEvent(this, EventType.GO_TO, null, null, -1, mPreviousView);
Daisuke Miyakawa93e69eb2010-10-22 18:54:38 -0700374 } else {
375 super.onBackPressed();
Erik648c59c2010-08-13 12:49:26 -0700376 }
377 }
378
379 @Override
Erik2051f122010-07-02 13:45:45 -0700380 public boolean onCreateOptionsMenu(Menu menu) {
381 super.onCreateOptionsMenu(menu);
382
Erik2051f122010-07-02 13:45:45 -0700383 getMenuInflater().inflate(R.menu.all_in_one_title_bar, menu);
Daisuke Miyakawa6d2e6f72010-09-17 10:30:54 -0700384
385 SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
Michael Chan71b221a2010-10-25 17:55:44 -0700386 if (searchView != null) {
387 searchView.setIconifiedByDefault(true);
388 searchView.setOnQueryChangeListener(this);
389 }
Daisuke Miyakawa6d2e6f72010-09-17 10:30:54 -0700390
Erik2051f122010-07-02 13:45:45 -0700391 return true;
392 }
Michael Chan3458a172010-07-13 17:58:21 -0700393
394 @Override
395 public boolean onOptionsItemSelected(MenuItem item) {
396 Time t = null;
397 int viewType = ViewType.CURRENT;
398 switch (item.getItemId()) {
Erikba1b94a2010-07-20 17:50:50 -0700399 case R.id.action_refresh:
400 mController.refreshCalendars();
401 return true;
Michael Chan3458a172010-07-13 17:58:21 -0700402 case R.id.action_today:
403 viewType = ViewType.CURRENT;
Erikc5f92d72010-11-11 16:18:34 -0800404 t = new Time(mTimeZone);
Michael Chan3458a172010-07-13 17:58:21 -0700405 t.setToNow();
406 break;
407 case R.id.action_create_event:
408 mController.sendEventRelatedEvent(this, EventType.CREATE_EVENT, -1, 0, 0, 0, 0);
409 return true;
Michael Chanab29d9e2010-07-21 06:08:47 -0700410 case R.id.action_settings:
411 mController.sendEvent(this, EventType.LAUNCH_SETTINGS, null, null, 0, 0);
412 return true;
Michael Chan3458a172010-07-13 17:58:21 -0700413 default:
414 return false;
415 }
Michael Chanab29d9e2010-07-21 06:08:47 -0700416 mController.sendEvent(this, EventType.GO_TO, t, null, -1, viewType);
Michael Chan3458a172010-07-13 17:58:21 -0700417 return true;
418 }
Mason Tang8e3d4302010-07-12 17:39:30 -0700419
420 @Override
421 public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
Daisuke Miyakawa4b441bd2010-09-16 14:55:36 -0700422 if (key.equals(GeneralPreferences.KEY_WEEK_START_DAY)) {
Erikcb811892010-09-28 13:44:19 -0700423 if (mPaused) {
424 mUpdateOnResume = true;
425 } else {
426 initFragments(mController.getTime(), mController.getViewType(), null);
427 }
Mason Tang8e3d4302010-07-12 17:39:30 -0700428 }
429 }
Michael Chanab29d9e2010-07-21 06:08:47 -0700430
Erik7b92da22010-09-23 14:55:22 -0700431 private void setMainPane(FragmentTransaction ft, int viewId, int viewType, long timeMillis,
432 boolean force, EventInfo e) {
Michael Chan6191c122010-11-02 16:23:47 -0700433 if (mOnSaveInstanceStateCalled) {
434 return;
435 }
Erik7b92da22010-09-23 14:55:22 -0700436 if (!force && mCurrentView == viewType) {
Michael Chanab29d9e2010-07-21 06:08:47 -0700437 return;
438 }
439
Erik648c59c2010-08-13 12:49:26 -0700440 if (viewType != mCurrentView) {
441 // The rules for this previous view are different than the
442 // controller's and are used for intercepting the back button.
Erikdd95df52010-08-27 09:31:18 -0700443 if (mCurrentView != ViewType.EDIT && mCurrentView > 0) {
444 mPreviousView = mCurrentView;
445 }
Erik648c59c2010-08-13 12:49:26 -0700446 mCurrentView = viewType;
447 }
Erik3f348f32010-08-10 13:17:19 -0700448 // Create new fragment
449 Fragment frag;
Michael Chanab29d9e2010-07-21 06:08:47 -0700450 switch (viewType) {
451 case ViewType.AGENDA:
Mason Tang31df4262010-07-19 17:51:46 -0700452 frag = new AgendaFragment(timeMillis);
Michael Chanab29d9e2010-07-21 06:08:47 -0700453 break;
454 case ViewType.DAY:
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700455 if (mActionBar != null && (mActionBar.getSelectedTab() != mDayTab)) {
456 mActionBar.selectTab(mDayTab);
457 }
Michael Chan75d9b562010-07-26 16:54:25 -0700458 frag = new DayFragment(timeMillis, 1);
459 break;
Michael Chanab29d9e2010-07-21 06:08:47 -0700460 case ViewType.WEEK:
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700461 if (mActionBar != null && (mActionBar.getSelectedTab() != mWeekTab)) {
462 mActionBar.selectTab(mWeekTab);
463 }
Michael Chan75d9b562010-07-26 16:54:25 -0700464 frag = new DayFragment(timeMillis, 7);
Michael Chanab29d9e2010-07-21 06:08:47 -0700465 break;
466 case ViewType.MONTH:
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700467 if (mActionBar != null && (mActionBar.getSelectedTab() != mMonthTab)) {
468 mActionBar.selectTab(mMonthTab);
469 }
Erik40bcd102010-11-16 15:46:40 -0800470 frag = new MonthByWeekFragment(timeMillis, false);
Michael Chanab29d9e2010-07-21 06:08:47 -0700471 break;
472 default:
Michael Chand6734db2010-07-22 00:48:08 -0700473 throw new IllegalArgumentException(
474 "Must be Agenda, Day, Week, or Month ViewType, not " + viewType);
Michael Chanab29d9e2010-07-21 06:08:47 -0700475 }
476
477 boolean doCommit = false;
478 if (ft == null) {
479 doCommit = true;
Mason Tang1d564f62010-08-20 14:44:20 -0700480 ft = getFragmentManager().openTransaction();
Michael Chanab29d9e2010-07-21 06:08:47 -0700481 }
482
483 ft.replace(viewId, frag);
Daisuke Miyakawa93e69eb2010-10-22 18:54:38 -0700484
Erik954c8712010-08-06 10:12:34 -0700485 if (DEBUG) {
486 Log.d(TAG, "Adding handler with viewId " + viewId + " and type " + viewType);
487 }
Erik3f348f32010-08-10 13:17:19 -0700488 // If the key is already registered this will replace it
489 mController.registerEventHandler(viewId, (EventHandler) frag);
Michael Chanab29d9e2010-07-21 06:08:47 -0700490
491 if (doCommit) {
492 ft.commit();
493 }
494 }
495
496 private void setTitleInActionBar(EventInfo event) {
Erikeaafa2b2010-12-23 14:30:37 -0800497 if (event.eventType != EventType.UPDATE_TITLE || mActionBar == null) {
Michael Chanab29d9e2010-07-21 06:08:47 -0700498 return;
499 }
500
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700501 final long start = event.startTime.toMillis(false /* use isDst */);
502 final long end;
Michael Chand6734db2010-07-22 00:48:08 -0700503 if (event.endTime != null) {
Michael Chanab29d9e2010-07-21 06:08:47 -0700504 end = event.endTime.toMillis(false /* use isDst */);
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700505 } else {
506 end = start;
Michael Chanab29d9e2010-07-21 06:08:47 -0700507 }
Michael Chanab29d9e2010-07-21 06:08:47 -0700508
Erikeaafa2b2010-12-23 14:30:37 -0800509 final String msg = Utils.formatDateRange(this, start, end, (int) event.extraLong);
Erik259b8f92011-01-12 14:01:12 -0800510 CharSequence oldDate = mDateRange.getText();
Erikeaafa2b2010-12-23 14:30:37 -0800511 mDateRange.setText(msg);
Erik259b8f92011-01-12 14:01:12 -0800512 if (!TextUtils.equals(oldDate, msg)) {
513 mDateRange.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
514 }
Michael Chanab29d9e2010-07-21 06:08:47 -0700515 }
516
Erik6c255102010-09-29 14:43:00 -0700517 private void updateHomeClock() {
Erikc5f92d72010-11-11 16:18:34 -0800518 mTimeZone = Utils.getTimeZone(this, mHomeTimeUpdater);
Erik6c255102010-09-29 14:43:00 -0700519 if (mIsMultipane && (mCurrentView == ViewType.DAY || mCurrentView == ViewType.WEEK)
Erikc5f92d72010-11-11 16:18:34 -0800520 && !TextUtils.equals(mTimeZone, Time.getCurrentTimezone())) {
521 Time time = new Time(mTimeZone);
Erik6c255102010-09-29 14:43:00 -0700522 time.setToNow();
523 long millis = time.toMillis(true);
524 boolean isDST = time.isDst != 0;
525 int flags = DateUtils.FORMAT_SHOW_TIME;
526 if (DateFormat.is24HourFormat(this)) {
527 flags |= DateUtils.FORMAT_24HOUR;
528 }
529 // Formats the time as
Erikc5f92d72010-11-11 16:18:34 -0800530 String timeString = (new StringBuilder(
531 Utils.formatDateRange(this, millis, millis, flags))).append(" ").append(
532 TimeZone.getTimeZone(mTimeZone).getDisplayName(
533 isDST, TimeZone.SHORT, Locale.getDefault())).toString();
Erik6c255102010-09-29 14:43:00 -0700534 mHomeTime.setText(timeString);
535 mHomeTime.setVisibility(View.VISIBLE);
536 // Update when the minute changes
537 mHomeTime.postDelayed(
Daisuke Miyakawac9e53072010-10-14 12:18:49 -0700538 mHomeTimeUpdater,
539 DateUtils.MINUTE_IN_MILLIS - (millis % DateUtils.MINUTE_IN_MILLIS));
Erik6c255102010-09-29 14:43:00 -0700540 } else {
541 mHomeTime.setVisibility(View.GONE);
542 }
543 }
544
Erik3f348f32010-08-10 13:17:19 -0700545 @Override
Michael Chanab29d9e2010-07-21 06:08:47 -0700546 public long getSupportedEventTypes() {
Erikeaafa2b2010-12-23 14:30:37 -0800547 return EventType.GO_TO | EventType.VIEW_EVENT | EventType.UPDATE_TITLE;
Michael Chanab29d9e2010-07-21 06:08:47 -0700548 }
549
Erik3f348f32010-08-10 13:17:19 -0700550 @Override
Michael Chanab29d9e2010-07-21 06:08:47 -0700551 public void handleEvent(EventInfo event) {
552 if (event.eventType == EventType.GO_TO) {
Erik7b92da22010-09-23 14:55:22 -0700553 setMainPane(null, R.id.main_pane, event.viewType, event.startTime.toMillis(false),
554 false, event);
Michael Chanab29d9e2010-07-21 06:08:47 -0700555
Erik9fc409f2010-07-28 11:40:47 -0700556 if (!mIsMultipane) {
557 return;
558 }
Michael Chanab29d9e2010-07-21 06:08:47 -0700559 if (event.viewType == ViewType.MONTH) {
560 // hide minimonth and calendar frag
Erik9fc409f2010-07-28 11:40:47 -0700561 findViewById(R.id.mini_month).setVisibility(View.GONE);
562 findViewById(R.id.calendar_list).setVisibility(View.GONE);
Erikef896fd2011-01-13 10:34:09 -0800563 findViewById(R.id.mini_month_container).setVisibility(View.GONE);
Michael Chanab29d9e2010-07-21 06:08:47 -0700564 } else {
565 // show minimonth and calendar frag
Erik9fc409f2010-07-28 11:40:47 -0700566 findViewById(R.id.mini_month).setVisibility(View.VISIBLE);
567 findViewById(R.id.calendar_list).setVisibility(View.VISIBLE);
Erikef896fd2011-01-13 10:34:09 -0800568 findViewById(R.id.mini_month_container).setVisibility(View.VISIBLE);
Michael Chanab29d9e2010-07-21 06:08:47 -0700569 }
Michael Chan71d08832010-08-25 18:28:59 -0700570 } else if (event.eventType == EventType.VIEW_EVENT) {
Erik7b92da22010-09-23 14:55:22 -0700571 EventInfoFragment fragment = new EventInfoFragment(
Michael Chandeced892010-12-10 15:59:35 -0800572 event.id, event.startTime.toMillis(false), event.endTime.toMillis(false),
573 (int) event.extraLong);
Michael Chan71d08832010-08-25 18:28:59 -0700574 fragment.setDialogParams(event.x, event.y);
575 fragment.show(getFragmentManager(), "EventInfoFragment");
Erikeaafa2b2010-12-23 14:30:37 -0800576 } else if (event.eventType == EventType.UPDATE_TITLE) {
577 setTitleInActionBar(event);
Michael Chanab29d9e2010-07-21 06:08:47 -0700578 }
Erik6c255102010-09-29 14:43:00 -0700579 updateHomeClock();
Michael Chanab29d9e2010-07-21 06:08:47 -0700580 }
581
Erik3f348f32010-08-10 13:17:19 -0700582 @Override
Michael Chanab29d9e2010-07-21 06:08:47 -0700583 public void eventsChanged() {
Erik954c8712010-08-06 10:12:34 -0700584 mController.sendEvent(this, EventType.EVENTS_CHANGED, null, null, -1, ViewType.CURRENT);
Michael Chanab29d9e2010-07-21 06:08:47 -0700585 }
586
Erik3f348f32010-08-10 13:17:19 -0700587 @Override
Daisuke Miyakawa6d2e6f72010-09-17 10:30:54 -0700588 public boolean onQueryTextChanged(String newText) {
589 return false;
590 }
591
592 @Override
593 public boolean onSubmitQuery(String query) {
Michael Chan46a8b112010-12-14 16:36:27 -0800594 mController.sendEvent(this, EventType.SEARCH, null, null, -1, ViewType.CURRENT, -1, query,
Erik7b92da22010-09-23 14:55:22 -0700595 getComponentName());
Daisuke Miyakawa6d2e6f72010-09-17 10:30:54 -0700596 return false;
597 }
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700598
599 @Override
600 public void onTabSelected(Tab tab, FragmentTransaction ft) {
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700601 if (tab == mDayTab && mCurrentView != ViewType.DAY) {
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700602 mController.sendEvent(this, EventType.GO_TO, null, null, -1, ViewType.DAY);
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700603 } else if (tab == mWeekTab && mCurrentView != ViewType.WEEK) {
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700604 mController.sendEvent(this, EventType.GO_TO, null, null, -1, ViewType.WEEK);
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700605 } else if (tab == mMonthTab && mCurrentView != ViewType.MONTH) {
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700606 mController.sendEvent(this, EventType.GO_TO, null, null, -1, ViewType.MONTH);
607 } else {
608 Log.w(TAG, "TabSelected event from unknown tab: " + tab);
609 }
610 }
611
612 @Override
613 public void onTabReselected(Tab tab, FragmentTransaction ft) {
614 }
615
616 @Override
617 public void onTabUnselected(Tab tab, FragmentTransaction ft) {
618 }
Michael Chan49701592010-06-30 11:04:03 -0700619}