blob: 69ca70f27fbc02d474b867764738ce810003aba4 [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,
Adam Powell28f9b352011-01-20 18:36:10 -080064 OnSharedPreferenceChangeListener, SearchView.OnQueryTextListener,
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -070065 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;
Erikcb830312011-01-19 14:41:41 -080095 private SearchView mSearchView;
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -070096
Erik6c255102010-09-29 14:43:00 -070097 private Runnable mHomeTimeUpdater = new Runnable() {
98 @Override
99 public void run() {
100 updateHomeClock();
101 }
102 };
Erik954c8712010-08-06 10:12:34 -0700103
104 // Create an observer so that we can update the views whenever a
105 // Calendar event changes.
Erik7b92da22010-09-23 14:55:22 -0700106 private ContentObserver mObserver = new ContentObserver(new Handler()) {
Erik954c8712010-08-06 10:12:34 -0700107 @Override
108 public boolean deliverSelfNotifications() {
109 return true;
110 }
111
112 @Override
113 public void onChange(boolean selfChange) {
114 eventsChanged();
115 }
116 };
Michael Chan83b0fe32010-07-08 16:46:26 -0700117
Michael Chan49701592010-06-30 11:04:03 -0700118 @Override
Michael Chan83b0fe32010-07-08 16:46:26 -0700119 protected void onCreate(Bundle icicle) {
Erikca478672011-01-19 20:02:47 -0800120 if (Utils.getSharedPreference(this, OtherPreferences.KEY_OTHER_1, false)) {
121 setTheme(R.style.CalendarTheme_WithActionBarWallpaper);
122 }
Michael Chan83b0fe32010-07-08 16:46:26 -0700123 super.onCreate(icicle);
124
125 // This needs to be created before setContentView
Michael Chan0558def2010-07-22 21:30:32 -0700126 mController = CalendarController.getInstance(this);
Erik954c8712010-08-06 10:12:34 -0700127 // Get time from intent or icicle
Michael Chan2c7c8512010-12-10 14:12:57 -0800128 long timeMillis = -1;
129 int viewType = -1;
130 boolean restoreEdit = false;
131 final Intent intent = getIntent();
Erik954c8712010-08-06 10:12:34 -0700132 if (icicle != null) {
133 timeMillis = icicle.getLong(BUNDLE_KEY_RESTORE_TIME);
Michael Chan2c7c8512010-12-10 14:12:57 -0800134 restoreEdit = icicle.getBoolean(BUNDLE_KEY_RESTORE_EDIT, false);
Erik7b92da22010-09-23 14:55:22 -0700135 viewType = ViewType.EDIT;
136 } else {
Michael Chan2c7c8512010-12-10 14:12:57 -0800137 String action = intent.getAction();
138 if (Intent.ACTION_VIEW.equals(action)) {
139 // Open EventInfo later
140 timeMillis = parseViewAction(intent);
141 }
142
143 if (timeMillis == -1) {
144 timeMillis = Utils.timeFromIntentInMillis(intent);
145 }
146 }
147
148 if (!restoreEdit) {
Erik7b92da22010-09-23 14:55:22 -0700149 viewType = Utils.getViewTypeFromIntentAndSharedPref(this);
150 }
Erikc5f92d72010-11-11 16:18:34 -0800151 mTimeZone = Utils.getTimeZone(this, mHomeTimeUpdater);
152 Time t = new Time(mTimeZone);
Erik954c8712010-08-06 10:12:34 -0700153 t.set(timeMillis);
154
Michael Chan2c7c8512010-12-10 14:12:57 -0800155 if (icicle != null && intent != null) {
156 Log.d(TAG, "both, icicle:" + icicle.toString() + " intent:" + intent.toString());
Erik7b92da22010-09-23 14:55:22 -0700157 } else {
Michael Chan2c7c8512010-12-10 14:12:57 -0800158 Log.d(TAG, "not both, icicle:" + icicle + " intent:" + intent);
Erik7b92da22010-09-23 14:55:22 -0700159 }
160
Erikeaafa2b2010-12-23 14:30:37 -0800161 Resources res = getResources();
162 mIsMultipane =
163 (res.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_XLARGE) != 0;
Erik9fc409f2010-07-28 11:40:47 -0700164
Michael Chanb60218a2010-12-14 16:34:39 -0800165 Utils.allowWeekForDetailView(mIsMultipane);
166
Erikeaafa2b2010-12-23 14:30:37 -0800167 mDateRange = (TextView) getLayoutInflater().inflate(R.layout.date_range_title, null);
168
Erikbe8191c2010-10-26 16:50:08 -0700169 // setContentView must be called before configureActionBar
170 setContentView(R.layout.all_in_one);
171 // configureActionBar auto-selects the first tab you add, so we need to
172 // call it before we set up our own fragments to make sure it doesn't
173 // overwrite us
174 configureActionBar();
175
Erik3f348f32010-08-10 13:17:19 -0700176 // Must be the first to register because this activity can modify the
177 // list of event handlers in it's handle method. This affects who the
178 // rest of the handlers the controller dispatches to are.
179 mController.registerEventHandler(HANDLER_KEY, this);
Michael Chan83b0fe32010-07-08 16:46:26 -0700180
Erik6c255102010-09-29 14:43:00 -0700181 mHomeTime = (TextView) findViewById(R.id.home_time);
Michael Chan83b0fe32010-07-08 16:46:26 -0700182
Erik7b92da22010-09-23 14:55:22 -0700183 initFragments(timeMillis, viewType, icicle);
Mason Tang8e3d4302010-07-12 17:39:30 -0700184
Erik6c255102010-09-29 14:43:00 -0700185
Mason Tang8e3d4302010-07-12 17:39:30 -0700186 // Listen for changes that would require this to be refreshed
Daisuke Miyakawa4b441bd2010-09-16 14:55:36 -0700187 SharedPreferences prefs = GeneralPreferences.getSharedPreferences(this);
Mason Tang8e3d4302010-07-12 17:39:30 -0700188 prefs.registerOnSharedPreferenceChangeListener(this);
Erikcb811892010-09-28 13:44:19 -0700189
Erik954c8712010-08-06 10:12:34 -0700190 mContentResolver = getContentResolver();
Erikbe8191c2010-10-26 16:50:08 -0700191 }
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700192
Michael Chan2c7c8512010-12-10 14:12:57 -0800193 private long parseViewAction(final Intent intent) {
194 long timeMillis = -1;
195 Uri data = intent.getData();
196 if (data != null && data.isHierarchical()) {
197 List<String> path = data.getPathSegments();
198 if (path.size() == 2 && path.get(0).equals("events")) {
199 try {
200 mViewEventId = Long.valueOf(data.getLastPathSegment());
201 if(mViewEventId != -1) {
202 mIntentEventStartMillis = intent.getLongExtra(EVENT_BEGIN_TIME, 0);
203 mIntentEventEndMillis = intent.getLongExtra(EVENT_END_TIME, 0);
204 mIntentAttendeeResponse = intent.getIntExtra(
Michael Chandeced892010-12-10 15:59:35 -0800205 ATTENDEE_STATUS, CalendarController.ATTENDEE_NO_RESPONSE);
Michael Chan2c7c8512010-12-10 14:12:57 -0800206 timeMillis = mIntentEventStartMillis;
207 }
208 } catch (NumberFormatException e) {
209 // Ignore if mViewEventId can't be parsed
210 }
211 }
212 }
213 return timeMillis;
214 }
215
Erikbe8191c2010-10-26 16:50:08 -0700216 private void configureActionBar() {
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700217 mActionBar = getActionBar();
Michael Chandeced892010-12-10 15:59:35 -0800218 mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700219 if (mActionBar == null) {
220 Log.w(TAG, "ActionBar is null.");
221 } else {
222 mDayTab = mActionBar.newTab();
223 mDayTab.setText(getString(R.string.day_view));
224 mDayTab.setTabListener(this);
225 mActionBar.addTab(mDayTab);
226 mWeekTab = mActionBar.newTab();
227 mWeekTab.setText(getString(R.string.week_view));
228 mWeekTab.setTabListener(this);
229 mActionBar.addTab(mWeekTab);
230 mMonthTab = mActionBar.newTab();
231 mMonthTab.setText(getString(R.string.month_view));
232 mMonthTab.setTabListener(this);
233 mActionBar.addTab(mMonthTab);
Erikeaafa2b2010-12-23 14:30:37 -0800234 mActionBar.setCustomView(mDateRange);
235 mActionBar.setDisplayOptions(
236 ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME);
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700237 }
Erik954c8712010-08-06 10:12:34 -0700238 }
239
240 @Override
241 protected void onResume() {
242 super.onResume();
243 mContentResolver.registerContentObserver(Calendar.Events.CONTENT_URI, true, mObserver);
Erikcb811892010-09-28 13:44:19 -0700244 if (mUpdateOnResume) {
245 initFragments(mController.getTime(), mController.getViewType(), null);
246 mUpdateOnResume = false;
247 }
Erik6c255102010-09-29 14:43:00 -0700248 updateHomeClock();
Erikcb811892010-09-28 13:44:19 -0700249 mPaused = false;
Michael Chan6191c122010-11-02 16:23:47 -0700250 mOnSaveInstanceStateCalled = false;
Michael Chan2c7c8512010-12-10 14:12:57 -0800251
252 if (mViewEventId != -1 && mIntentEventStartMillis != -1 && mIntentEventEndMillis != -1) {
Michael Chanf0868f62011-01-11 19:37:35 -0800253 mController.sendEventRelatedEventWithResponse(this, EventType.VIEW_EVENT, mViewEventId,
Michael Chandeced892010-12-10 15:59:35 -0800254 mIntentEventStartMillis, mIntentEventEndMillis, -1, -1,
255 mIntentAttendeeResponse);
Michael Chan2c7c8512010-12-10 14:12:57 -0800256 mViewEventId = -1;
257 mIntentEventStartMillis = -1;
258 mIntentEventEndMillis = -1;
259 }
Mason Tang8e3d4302010-07-12 17:39:30 -0700260 }
261
262 @Override
Michael Chand6734db2010-07-22 00:48:08 -0700263 protected void onPause() {
264 super.onPause();
Erikcb811892010-09-28 13:44:19 -0700265 mPaused = true;
Daisuke Miyakawac9e53072010-10-14 12:18:49 -0700266 mHomeTime.removeCallbacks(mHomeTimeUpdater);
Erik954c8712010-08-06 10:12:34 -0700267 mContentResolver.unregisterContentObserver(mObserver);
Erikcb811892010-09-28 13:44:19 -0700268 if (isFinishing()) {
269 // Stop listening for changes that would require this to be refreshed
270 SharedPreferences prefs = GeneralPreferences.getSharedPreferences(this);
271 prefs.unregisterOnSharedPreferenceChangeListener(this);
272 }
Erik7b92da22010-09-23 14:55:22 -0700273 // FRAG_TODO save highlighted days of the week;
Erikdd95df52010-08-27 09:31:18 -0700274 if (mController.getViewType() != ViewType.EDIT) {
275 Utils.setDefaultView(this, mController.getViewType());
276 }
Michael Chand6734db2010-07-22 00:48:08 -0700277 }
278
279 @Override
Erik7b92da22010-09-23 14:55:22 -0700280 protected void onUserLeaveHint() {
281 mController.sendEvent(this, EventType.USER_HOME, null, null, -1, ViewType.CURRENT);
282 super.onUserLeaveHint();
283 }
284
285 @Override
Michael Chand6734db2010-07-22 00:48:08 -0700286 public void onSaveInstanceState(Bundle outState) {
Michael Chan6191c122010-11-02 16:23:47 -0700287 mOnSaveInstanceStateCalled = true;
Michael Chand6734db2010-07-22 00:48:08 -0700288 super.onSaveInstanceState(outState);
289
290 outState.putLong(BUNDLE_KEY_RESTORE_TIME, mController.getTime());
Erik7b92da22010-09-23 14:55:22 -0700291 if (mCurrentView == ViewType.EDIT) {
292 outState.putBoolean(BUNDLE_KEY_RESTORE_EDIT, true);
293 outState.putLong(BUNDLE_KEY_EVENT_ID, mController.getEventId());
294 }
Michael Chand6734db2010-07-22 00:48:08 -0700295 }
296
297 @Override
Mason Tang8e3d4302010-07-12 17:39:30 -0700298 protected void onDestroy() {
299 super.onDestroy();
300
Daisuke Miyakawa4b441bd2010-09-16 14:55:36 -0700301 SharedPreferences prefs = GeneralPreferences.getSharedPreferences(this);
Mason Tang8e3d4302010-07-12 17:39:30 -0700302 prefs.unregisterOnSharedPreferenceChangeListener(this);
Eriked61b482010-08-13 13:59:50 -0700303 CalendarController.removeInstance(this);
Mason Tang8e3d4302010-07-12 17:39:30 -0700304 }
305
Erik7b92da22010-09-23 14:55:22 -0700306 private void initFragments(long timeMillis, int viewType, Bundle icicle) {
Dianne Hackborn12b33302011-01-17 12:30:13 -0800307 FragmentTransaction ft = getFragmentManager().beginTransaction();
Michael Chan3458a172010-07-13 17:58:21 -0700308
Erik9fc409f2010-07-28 11:40:47 -0700309 if (mIsMultipane) {
Erik40bcd102010-11-16 15:46:40 -0800310 Fragment miniMonthFrag = new MonthByWeekFragment(timeMillis, true);
Michael Chanab29d9e2010-07-21 06:08:47 -0700311 ft.replace(R.id.mini_month, miniMonthFrag);
Erik3f348f32010-08-10 13:17:19 -0700312 mController.registerEventHandler(R.id.mini_month, (EventHandler) miniMonthFrag);
Michael Chanab29d9e2010-07-21 06:08:47 -0700313
314 Fragment selectCalendarsFrag = new SelectCalendarsFragment();
315 ft.replace(R.id.calendar_list, selectCalendarsFrag);
Erikdd95df52010-08-27 09:31:18 -0700316 }
Erik7b92da22010-09-23 14:55:22 -0700317 if (!mIsMultipane || viewType == ViewType.EDIT) {
Michael Chanab29d9e2010-07-21 06:08:47 -0700318 findViewById(R.id.mini_month).setVisibility(View.GONE);
319 findViewById(R.id.calendar_list).setVisibility(View.GONE);
320 }
Michael Chan3458a172010-07-13 17:58:21 -0700321
Erikdd95df52010-08-27 09:31:18 -0700322 EventInfo info = null;
323 if (viewType == ViewType.EDIT) {
Daisuke Miyakawa4b441bd2010-09-16 14:55:36 -0700324 mPreviousView = GeneralPreferences.getSharedPreferences(this).getInt(
Erik7b92da22010-09-23 14:55:22 -0700325 GeneralPreferences.KEY_START_VIEW, GeneralPreferences.DEFAULT_START_VIEW);
Erikdd95df52010-08-27 09:31:18 -0700326
Daisuke Miyakawa4143cfa2010-09-17 19:55:04 -0700327 long eventId = -1;
Erikdd95df52010-08-27 09:31:18 -0700328 Intent intent = getIntent();
329 Uri data = intent.getData();
330 if (data != null) {
331 try {
Daisuke Miyakawa4143cfa2010-09-17 19:55:04 -0700332 eventId = Long.parseLong(data.getLastPathSegment());
Erikdd95df52010-08-27 09:31:18 -0700333 } catch (NumberFormatException e) {
334 if (DEBUG) {
335 Log.d(TAG, "Create new event");
336 }
337 }
Erik7b92da22010-09-23 14:55:22 -0700338 } else if (icicle != null && icicle.containsKey(BUNDLE_KEY_EVENT_ID)) {
339 eventId = icicle.getLong(BUNDLE_KEY_EVENT_ID);
Erikdd95df52010-08-27 09:31:18 -0700340 }
Daisuke Miyakawa4143cfa2010-09-17 19:55:04 -0700341
Erikdd95df52010-08-27 09:31:18 -0700342 long begin = intent.getLongExtra(EVENT_BEGIN_TIME, -1);
343 long end = intent.getLongExtra(EVENT_END_TIME, -1);
344 info = new EventInfo();
345 if (end != -1) {
346 info.endTime = new Time();
347 info.endTime.set(end);
348 }
349 if (begin != -1) {
350 info.startTime = new Time();
351 info.startTime.set(begin);
352 }
353 info.id = eventId;
354 // We set the viewtype so if the user presses back when they are
355 // done editing the controller knows we were in the Edit Event
Erik7b92da22010-09-23 14:55:22 -0700356 // screen. Likewise for eventId
Erikdd95df52010-08-27 09:31:18 -0700357 mController.setViewType(viewType);
Erik7b92da22010-09-23 14:55:22 -0700358 mController.setEventId(eventId);
Erikdd95df52010-08-27 09:31:18 -0700359 } else {
360 mPreviousView = viewType;
361 }
362 setMainPane(ft, R.id.main_pane, viewType, timeMillis, true, info);
Michael Chan3458a172010-07-13 17:58:21 -0700363
364 ft.commit(); // this needs to be after setMainPane()
365
Erikc5f92d72010-11-11 16:18:34 -0800366 Time t = new Time(mTimeZone);
Michael Chand6734db2010-07-22 00:48:08 -0700367 t.set(timeMillis);
Erikdd95df52010-08-27 09:31:18 -0700368 if (viewType != ViewType.EDIT) {
369 mController.sendEvent(this, EventType.GO_TO, t, null, -1, viewType);
370 }
Michael Chan49701592010-06-30 11:04:03 -0700371 }
Erik2051f122010-07-02 13:45:45 -0700372
373 @Override
Erik648c59c2010-08-13 12:49:26 -0700374 public void onBackPressed() {
Daisuke Miyakawa93e69eb2010-10-22 18:54:38 -0700375 if (mCurrentView == ViewType.EDIT || mCurrentView == ViewType.DETAIL) {
Erikdd95df52010-08-27 09:31:18 -0700376 mController.sendEvent(this, EventType.GO_TO, null, null, -1, mPreviousView);
Daisuke Miyakawa93e69eb2010-10-22 18:54:38 -0700377 } else {
378 super.onBackPressed();
Erik648c59c2010-08-13 12:49:26 -0700379 }
380 }
381
382 @Override
Erik2051f122010-07-02 13:45:45 -0700383 public boolean onCreateOptionsMenu(Menu menu) {
384 super.onCreateOptionsMenu(menu);
385
Erik2051f122010-07-02 13:45:45 -0700386 getMenuInflater().inflate(R.menu.all_in_one_title_bar, menu);
Daisuke Miyakawa6d2e6f72010-09-17 10:30:54 -0700387
Erikcb830312011-01-19 14:41:41 -0800388 mSearchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
389 if (mSearchView != null) {
390 mSearchView.setIconifiedByDefault(true);
Adam Powell28f9b352011-01-20 18:36:10 -0800391 mSearchView.setOnQueryTextListener(this);
Erikcb830312011-01-19 14:41:41 -0800392 mSearchView.setSubmitButtonEnabled(true);
Michael Chan71b221a2010-10-25 17:55:44 -0700393 }
Daisuke Miyakawa6d2e6f72010-09-17 10:30:54 -0700394
Erik2051f122010-07-02 13:45:45 -0700395 return true;
396 }
Michael Chan3458a172010-07-13 17:58:21 -0700397
398 @Override
399 public boolean onOptionsItemSelected(MenuItem item) {
400 Time t = null;
401 int viewType = ViewType.CURRENT;
402 switch (item.getItemId()) {
Erikba1b94a2010-07-20 17:50:50 -0700403 case R.id.action_refresh:
404 mController.refreshCalendars();
405 return true;
Michael Chan3458a172010-07-13 17:58:21 -0700406 case R.id.action_today:
407 viewType = ViewType.CURRENT;
Erikc5f92d72010-11-11 16:18:34 -0800408 t = new Time(mTimeZone);
Michael Chan3458a172010-07-13 17:58:21 -0700409 t.setToNow();
410 break;
411 case R.id.action_create_event:
412 mController.sendEventRelatedEvent(this, EventType.CREATE_EVENT, -1, 0, 0, 0, 0);
413 return true;
Michael Chanab29d9e2010-07-21 06:08:47 -0700414 case R.id.action_settings:
415 mController.sendEvent(this, EventType.LAUNCH_SETTINGS, null, null, 0, 0);
416 return true;
Michael Chan3458a172010-07-13 17:58:21 -0700417 default:
418 return false;
419 }
Michael Chanab29d9e2010-07-21 06:08:47 -0700420 mController.sendEvent(this, EventType.GO_TO, t, null, -1, viewType);
Michael Chan3458a172010-07-13 17:58:21 -0700421 return true;
422 }
Mason Tang8e3d4302010-07-12 17:39:30 -0700423
424 @Override
425 public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
Daisuke Miyakawa4b441bd2010-09-16 14:55:36 -0700426 if (key.equals(GeneralPreferences.KEY_WEEK_START_DAY)) {
Erikcb811892010-09-28 13:44:19 -0700427 if (mPaused) {
428 mUpdateOnResume = true;
429 } else {
430 initFragments(mController.getTime(), mController.getViewType(), null);
431 }
Mason Tang8e3d4302010-07-12 17:39:30 -0700432 }
433 }
Michael Chanab29d9e2010-07-21 06:08:47 -0700434
Erik7b92da22010-09-23 14:55:22 -0700435 private void setMainPane(FragmentTransaction ft, int viewId, int viewType, long timeMillis,
436 boolean force, EventInfo e) {
Michael Chan6191c122010-11-02 16:23:47 -0700437 if (mOnSaveInstanceStateCalled) {
438 return;
439 }
Erik7b92da22010-09-23 14:55:22 -0700440 if (!force && mCurrentView == viewType) {
Michael Chanab29d9e2010-07-21 06:08:47 -0700441 return;
442 }
443
Erik648c59c2010-08-13 12:49:26 -0700444 if (viewType != mCurrentView) {
445 // The rules for this previous view are different than the
446 // controller's and are used for intercepting the back button.
Erikdd95df52010-08-27 09:31:18 -0700447 if (mCurrentView != ViewType.EDIT && mCurrentView > 0) {
448 mPreviousView = mCurrentView;
449 }
Erik648c59c2010-08-13 12:49:26 -0700450 mCurrentView = viewType;
451 }
Erik3f348f32010-08-10 13:17:19 -0700452 // Create new fragment
453 Fragment frag;
Michael Chanab29d9e2010-07-21 06:08:47 -0700454 switch (viewType) {
455 case ViewType.AGENDA:
Mason Tang31df4262010-07-19 17:51:46 -0700456 frag = new AgendaFragment(timeMillis);
Michael Chanab29d9e2010-07-21 06:08:47 -0700457 break;
458 case ViewType.DAY:
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700459 if (mActionBar != null && (mActionBar.getSelectedTab() != mDayTab)) {
460 mActionBar.selectTab(mDayTab);
461 }
Michael Chan75d9b562010-07-26 16:54:25 -0700462 frag = new DayFragment(timeMillis, 1);
463 break;
Michael Chanab29d9e2010-07-21 06:08:47 -0700464 case ViewType.WEEK:
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700465 if (mActionBar != null && (mActionBar.getSelectedTab() != mWeekTab)) {
466 mActionBar.selectTab(mWeekTab);
467 }
Michael Chan75d9b562010-07-26 16:54:25 -0700468 frag = new DayFragment(timeMillis, 7);
Michael Chanab29d9e2010-07-21 06:08:47 -0700469 break;
470 case ViewType.MONTH:
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700471 if (mActionBar != null && (mActionBar.getSelectedTab() != mMonthTab)) {
472 mActionBar.selectTab(mMonthTab);
473 }
Erik40bcd102010-11-16 15:46:40 -0800474 frag = new MonthByWeekFragment(timeMillis, false);
Michael Chanab29d9e2010-07-21 06:08:47 -0700475 break;
476 default:
Michael Chand6734db2010-07-22 00:48:08 -0700477 throw new IllegalArgumentException(
478 "Must be Agenda, Day, Week, or Month ViewType, not " + viewType);
Michael Chanab29d9e2010-07-21 06:08:47 -0700479 }
480
481 boolean doCommit = false;
482 if (ft == null) {
483 doCommit = true;
Dianne Hackborn12b33302011-01-17 12:30:13 -0800484 ft = getFragmentManager().beginTransaction();
Michael Chanab29d9e2010-07-21 06:08:47 -0700485 }
486
487 ft.replace(viewId, frag);
Daisuke Miyakawa93e69eb2010-10-22 18:54:38 -0700488
Erik954c8712010-08-06 10:12:34 -0700489 if (DEBUG) {
490 Log.d(TAG, "Adding handler with viewId " + viewId + " and type " + viewType);
491 }
Erik3f348f32010-08-10 13:17:19 -0700492 // If the key is already registered this will replace it
493 mController.registerEventHandler(viewId, (EventHandler) frag);
Michael Chanab29d9e2010-07-21 06:08:47 -0700494
495 if (doCommit) {
496 ft.commit();
497 }
498 }
499
500 private void setTitleInActionBar(EventInfo event) {
Erikeaafa2b2010-12-23 14:30:37 -0800501 if (event.eventType != EventType.UPDATE_TITLE || mActionBar == null) {
Michael Chanab29d9e2010-07-21 06:08:47 -0700502 return;
503 }
504
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700505 final long start = event.startTime.toMillis(false /* use isDst */);
506 final long end;
Michael Chand6734db2010-07-22 00:48:08 -0700507 if (event.endTime != null) {
Michael Chanab29d9e2010-07-21 06:08:47 -0700508 end = event.endTime.toMillis(false /* use isDst */);
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700509 } else {
510 end = start;
Michael Chanab29d9e2010-07-21 06:08:47 -0700511 }
Michael Chanab29d9e2010-07-21 06:08:47 -0700512
Erikeaafa2b2010-12-23 14:30:37 -0800513 final String msg = Utils.formatDateRange(this, start, end, (int) event.extraLong);
Erik259b8f92011-01-12 14:01:12 -0800514 CharSequence oldDate = mDateRange.getText();
Erikeaafa2b2010-12-23 14:30:37 -0800515 mDateRange.setText(msg);
Erik259b8f92011-01-12 14:01:12 -0800516 if (!TextUtils.equals(oldDate, msg)) {
517 mDateRange.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
518 }
Michael Chanab29d9e2010-07-21 06:08:47 -0700519 }
520
Erik6c255102010-09-29 14:43:00 -0700521 private void updateHomeClock() {
Erikc5f92d72010-11-11 16:18:34 -0800522 mTimeZone = Utils.getTimeZone(this, mHomeTimeUpdater);
Erik6c255102010-09-29 14:43:00 -0700523 if (mIsMultipane && (mCurrentView == ViewType.DAY || mCurrentView == ViewType.WEEK)
Erikc5f92d72010-11-11 16:18:34 -0800524 && !TextUtils.equals(mTimeZone, Time.getCurrentTimezone())) {
525 Time time = new Time(mTimeZone);
Erik6c255102010-09-29 14:43:00 -0700526 time.setToNow();
527 long millis = time.toMillis(true);
528 boolean isDST = time.isDst != 0;
529 int flags = DateUtils.FORMAT_SHOW_TIME;
530 if (DateFormat.is24HourFormat(this)) {
531 flags |= DateUtils.FORMAT_24HOUR;
532 }
533 // Formats the time as
Erikc5f92d72010-11-11 16:18:34 -0800534 String timeString = (new StringBuilder(
535 Utils.formatDateRange(this, millis, millis, flags))).append(" ").append(
536 TimeZone.getTimeZone(mTimeZone).getDisplayName(
537 isDST, TimeZone.SHORT, Locale.getDefault())).toString();
Erik6c255102010-09-29 14:43:00 -0700538 mHomeTime.setText(timeString);
539 mHomeTime.setVisibility(View.VISIBLE);
540 // Update when the minute changes
541 mHomeTime.postDelayed(
Daisuke Miyakawac9e53072010-10-14 12:18:49 -0700542 mHomeTimeUpdater,
543 DateUtils.MINUTE_IN_MILLIS - (millis % DateUtils.MINUTE_IN_MILLIS));
Erik6c255102010-09-29 14:43:00 -0700544 } else {
545 mHomeTime.setVisibility(View.GONE);
546 }
547 }
548
Erik3f348f32010-08-10 13:17:19 -0700549 @Override
Michael Chanab29d9e2010-07-21 06:08:47 -0700550 public long getSupportedEventTypes() {
Erikeaafa2b2010-12-23 14:30:37 -0800551 return EventType.GO_TO | EventType.VIEW_EVENT | EventType.UPDATE_TITLE;
Michael Chanab29d9e2010-07-21 06:08:47 -0700552 }
553
Erik3f348f32010-08-10 13:17:19 -0700554 @Override
Michael Chanab29d9e2010-07-21 06:08:47 -0700555 public void handleEvent(EventInfo event) {
556 if (event.eventType == EventType.GO_TO) {
Erik7b92da22010-09-23 14:55:22 -0700557 setMainPane(null, R.id.main_pane, event.viewType, event.startTime.toMillis(false),
558 false, event);
Michael Chanab29d9e2010-07-21 06:08:47 -0700559
Erik9fc409f2010-07-28 11:40:47 -0700560 if (!mIsMultipane) {
561 return;
562 }
Michael Chanab29d9e2010-07-21 06:08:47 -0700563 if (event.viewType == ViewType.MONTH) {
564 // hide minimonth and calendar frag
Erik9fc409f2010-07-28 11:40:47 -0700565 findViewById(R.id.mini_month).setVisibility(View.GONE);
566 findViewById(R.id.calendar_list).setVisibility(View.GONE);
Erikef896fd2011-01-13 10:34:09 -0800567 findViewById(R.id.mini_month_container).setVisibility(View.GONE);
Michael Chanab29d9e2010-07-21 06:08:47 -0700568 } else {
569 // show minimonth and calendar frag
Erik9fc409f2010-07-28 11:40:47 -0700570 findViewById(R.id.mini_month).setVisibility(View.VISIBLE);
571 findViewById(R.id.calendar_list).setVisibility(View.VISIBLE);
Erikef896fd2011-01-13 10:34:09 -0800572 findViewById(R.id.mini_month_container).setVisibility(View.VISIBLE);
Michael Chanab29d9e2010-07-21 06:08:47 -0700573 }
Michael Chan71d08832010-08-25 18:28:59 -0700574 } else if (event.eventType == EventType.VIEW_EVENT) {
Erik7b92da22010-09-23 14:55:22 -0700575 EventInfoFragment fragment = new EventInfoFragment(
Michael Chandeced892010-12-10 15:59:35 -0800576 event.id, event.startTime.toMillis(false), event.endTime.toMillis(false),
577 (int) event.extraLong);
Michael Chan71d08832010-08-25 18:28:59 -0700578 fragment.setDialogParams(event.x, event.y);
579 fragment.show(getFragmentManager(), "EventInfoFragment");
Erikeaafa2b2010-12-23 14:30:37 -0800580 } else if (event.eventType == EventType.UPDATE_TITLE) {
581 setTitleInActionBar(event);
Michael Chanab29d9e2010-07-21 06:08:47 -0700582 }
Erik6c255102010-09-29 14:43:00 -0700583 updateHomeClock();
Michael Chanab29d9e2010-07-21 06:08:47 -0700584 }
585
Erik3f348f32010-08-10 13:17:19 -0700586 @Override
Michael Chanab29d9e2010-07-21 06:08:47 -0700587 public void eventsChanged() {
Erik954c8712010-08-06 10:12:34 -0700588 mController.sendEvent(this, EventType.EVENTS_CHANGED, null, null, -1, ViewType.CURRENT);
Michael Chanab29d9e2010-07-21 06:08:47 -0700589 }
590
Erik3f348f32010-08-10 13:17:19 -0700591 @Override
Adam Powell28f9b352011-01-20 18:36:10 -0800592 public boolean onQueryTextChange(String newText) {
Daisuke Miyakawa6d2e6f72010-09-17 10:30:54 -0700593 return false;
594 }
595
596 @Override
Adam Powell28f9b352011-01-20 18:36:10 -0800597 public boolean onQueryTextSubmit(String query) {
Erikca478672011-01-19 20:02:47 -0800598 if (TextUtils.equals(query, "TARDIS")) {
599 Utils.tardis();
600 }
Erikcb830312011-01-19 14:41:41 -0800601 mSearchView.clearFocus();
Michael Chan46a8b112010-12-14 16:36:27 -0800602 mController.sendEvent(this, EventType.SEARCH, null, null, -1, ViewType.CURRENT, -1, query,
Erik7b92da22010-09-23 14:55:22 -0700603 getComponentName());
Daisuke Miyakawa6d2e6f72010-09-17 10:30:54 -0700604 return false;
605 }
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700606
607 @Override
608 public void onTabSelected(Tab tab, FragmentTransaction ft) {
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700609 if (tab == mDayTab && mCurrentView != ViewType.DAY) {
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700610 mController.sendEvent(this, EventType.GO_TO, null, null, -1, ViewType.DAY);
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700611 } else if (tab == mWeekTab && mCurrentView != ViewType.WEEK) {
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700612 mController.sendEvent(this, EventType.GO_TO, null, null, -1, ViewType.WEEK);
Daisuke Miyakawa40474a82010-10-25 17:07:34 -0700613 } else if (tab == mMonthTab && mCurrentView != ViewType.MONTH) {
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700614 mController.sendEvent(this, EventType.GO_TO, null, null, -1, ViewType.MONTH);
615 } else {
Michael Chanece2fbd2011-01-19 14:49:37 -0800616 Log.w(TAG, "TabSelected event from unknown tab: "
617 + (tab == null ? "null" : tab.getText()));
618 Log.w(TAG, "CurrentView:" + mCurrentView + " Tab:" + tab.toString() + " Day:" + mDayTab
619 + " Week:" + mWeekTab + " Month:" + mMonthTab);
Daisuke Miyakawa04ae7682010-10-19 14:15:39 -0700620 }
621 }
622
623 @Override
624 public void onTabReselected(Tab tab, FragmentTransaction ft) {
625 }
626
627 @Override
628 public void onTabUnselected(Tab tab, FragmentTransaction ft) {
629 }
Michael Chan49701592010-06-30 11:04:03 -0700630}