AllInOneActivity.java revision 1d564f63f731565219aaca9e1b7e5f466b143c71
1/* 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 19import com.android.calendar.CalendarController.EventHandler; 20import com.android.calendar.CalendarController.EventInfo; 21import com.android.calendar.CalendarController.EventType; 22import com.android.calendar.CalendarController.ViewType; 23import com.android.calendar.selectcalendars.SelectCalendarsFragment; 24 25import android.app.ActionBar; 26import android.app.Activity; 27import android.app.Fragment; 28import android.app.FragmentTransaction; 29import android.content.ContentResolver; 30import android.content.SharedPreferences; 31import android.content.SharedPreferences.OnSharedPreferenceChangeListener; 32import android.content.res.Configuration; 33import android.database.ContentObserver; 34import android.os.Bundle; 35import android.os.Handler; 36import android.provider.Calendar; 37import android.text.format.DateUtils; 38import android.text.format.Time; 39import android.util.Log; 40import android.view.Menu; 41import android.view.MenuItem; 42import android.view.View; 43 44public class AllInOneActivity extends Activity implements EventHandler, 45 OnSharedPreferenceChangeListener { 46 private static final String TAG = "AllInOneActivity"; 47 private static final boolean DEBUG = false; 48 private static final String BUNDLE_KEY_RESTORE_TIME = "key_restore_time"; 49 private static final int HANDLER_KEY = 0; 50 private static CalendarController mController; 51 private static boolean mIsMultipane; 52 private ContentResolver mContentResolver; 53 private int mPreviousView; 54 private int mCurrentView; 55 56 // Create an observer so that we can update the views whenever a 57 // Calendar event changes. 58 private ContentObserver mObserver = new ContentObserver(new Handler()) 59 { 60 @Override 61 public boolean deliverSelfNotifications() { 62 return true; 63 } 64 65 @Override 66 public void onChange(boolean selfChange) { 67 eventsChanged(); 68 } 69 }; 70 71 @Override 72 protected void onCreate(Bundle icicle) { 73 super.onCreate(icicle); 74 75 // This needs to be created before setContentView 76 mController = CalendarController.getInstance(this); 77 // Get time from intent or icicle 78 long timeMillis; 79 if (icicle != null) { 80 timeMillis = icicle.getLong(BUNDLE_KEY_RESTORE_TIME); 81 } else { 82 timeMillis = Utils.timeFromIntentInMillis(getIntent()); 83 } 84 int viewType = Utils.getViewTypeFromIntentAndSharedPref(this); 85 Time t = new Time(); 86 t.set(timeMillis); 87 88 mIsMultipane = (getResources().getConfiguration().screenLayout & 89 Configuration.SCREENLAYOUT_SIZE_XLARGE) != 0; 90 91 // Must be the first to register because this activity can modify the 92 // list of event handlers in it's handle method. This affects who the 93 // rest of the handlers the controller dispatches to are. 94 mController.registerEventHandler(HANDLER_KEY, this); 95 96 setContentView(R.layout.all_in_one); 97 98 initFragments(timeMillis, viewType); 99 mPreviousView = viewType; 100 mCurrentView = viewType; 101 102 // Listen for changes that would require this to be refreshed 103 SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(this); 104 prefs.registerOnSharedPreferenceChangeListener(this); 105 mContentResolver = getContentResolver(); 106 } 107 108 @Override 109 protected void onResume() { 110 super.onResume(); 111 mContentResolver.registerContentObserver(Calendar.Events.CONTENT_URI, true, mObserver); 112 } 113 114 @Override 115 protected void onPause() { 116 super.onPause(); 117 mContentResolver.unregisterContentObserver(mObserver); 118 //FRAG_TODO save highlighted days of the week; 119 Utils.setDefaultView(this, mController.getViewType()); 120 } 121 122 @Override 123 public void onSaveInstanceState(Bundle outState) { 124 super.onSaveInstanceState(outState); 125 126 outState.putLong(BUNDLE_KEY_RESTORE_TIME, mController.getTime()); 127 } 128 129 @Override 130 protected void onDestroy() { 131 super.onDestroy(); 132 133 SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(this); 134 prefs.unregisterOnSharedPreferenceChangeListener(this); 135 CalendarController.removeInstance(this); 136 } 137 138 private void initFragments(long timeMillis, int viewType) { 139 FragmentTransaction ft = getFragmentManager().openTransaction(); 140 141 if (mIsMultipane) { 142 Fragment miniMonthFrag = new MonthFragment(false, timeMillis, true); 143 ft.replace(R.id.mini_month, miniMonthFrag); 144 mController.registerEventHandler(R.id.mini_month, (EventHandler) miniMonthFrag); 145 146 Fragment selectCalendarsFrag = new SelectCalendarsFragment(); 147 ft.replace(R.id.calendar_list, selectCalendarsFrag); 148 } else { 149 findViewById(R.id.mini_month).setVisibility(View.GONE); 150 findViewById(R.id.calendar_list).setVisibility(View.GONE); 151 } 152 153 setMainPane(ft, R.id.main_pane, viewType, timeMillis, true); 154 155 ft.commit(); // this needs to be after setMainPane() 156 157 Time t = new Time(); 158 t.set(timeMillis); 159 mController.sendEvent(this, EventType.GO_TO, t, null, -1, viewType); 160 } 161 162 @Override 163 public void onBackPressed() { 164 if (mPreviousView == mCurrentView) { 165 super.onBackPressed(); 166 } else { 167 mCurrentView = mPreviousView; 168 mController.sendEvent(this, EventType.GO_TO, null, null, -1, mCurrentView); 169 } 170 } 171 172 @Override 173 public boolean onCreateOptionsMenu(Menu menu) { 174 super.onCreateOptionsMenu(menu); 175 176 getMenuInflater().inflate(R.menu.all_in_one_title_bar, menu); 177 return true; 178 } 179 180 @Override 181 public boolean onOptionsItemSelected(MenuItem item) { 182 Time t = null; 183 int viewType = ViewType.CURRENT; 184 switch (item.getItemId()) { 185 case R.id.action_refresh: 186 mController.refreshCalendars(); 187 return true; 188 case R.id.action_day: 189 viewType = ViewType.DAY; 190 break; 191 case R.id.action_week: 192 viewType = ViewType.WEEK; 193 break; 194 case R.id.action_month: 195 viewType = ViewType.MONTH; 196 break; 197 case R.id.action_agenda: 198 viewType = ViewType.AGENDA; 199 break; 200 case R.id.action_today: 201 viewType = ViewType.CURRENT; 202 t = new Time(); 203 t.setToNow(); 204 break; 205 case R.id.action_search: 206 onSearchRequested(); 207 return true; 208 case R.id.action_create_event: 209 mController.sendEventRelatedEvent(this, EventType.CREATE_EVENT, -1, 0, 0, 0, 0); 210 return true; 211 case R.id.action_manage_calendars: 212 mController.sendEvent(this, EventType.LAUNCH_MANAGE_CALENDARS, null, null, 0, 0); 213 return true; 214 case R.id.action_settings: 215 mController.sendEvent(this, EventType.LAUNCH_SETTINGS, null, null, 0, 0); 216 return true; 217 default: 218 return false; 219 } 220 mController.sendEvent(this, EventType.GO_TO, t, null, -1, viewType); 221 return true; 222 } 223 224 @Override 225 public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 226 if (key.equals(CalendarPreferenceActivity.KEY_WEEK_START_DAY)) { 227 initFragments(mController.getTime(), mController.getViewType()); 228 } 229 } 230 231 private void setMainPane(FragmentTransaction ft, int viewId, int viewType, 232 long timeMillis, boolean force) { 233 if(!force && mController.getPreviousViewType() == viewType) { 234 return; 235 } 236 237 if (viewType != mCurrentView) { 238 // The rules for this previous view are different than the 239 // controller's and are used for intercepting the back button. 240 mPreviousView = mCurrentView; 241 mCurrentView = viewType; 242 } 243 // Create new fragment 244 Fragment frag; 245 switch (viewType) { 246 case ViewType.AGENDA: 247 frag = new AgendaFragment(timeMillis); 248 break; 249 case ViewType.DAY: 250 frag = new DayFragment(timeMillis, 1); 251 break; 252 case ViewType.WEEK: 253 frag = new DayFragment(timeMillis, 7); 254 break; 255 case ViewType.MONTH: 256 frag = new MonthFragment(false, timeMillis, false); 257 break; 258 default: 259 throw new IllegalArgumentException( 260 "Must be Agenda, Day, Week, or Month ViewType, not " + viewType); 261 } 262 263 boolean doCommit = false; 264 if (ft == null) { 265 doCommit = true; 266 ft = getFragmentManager().openTransaction(); 267 } 268 269 ft.replace(viewId, frag); 270 if (DEBUG) { 271 Log.d(TAG, "Adding handler with viewId " + viewId + " and type " + viewType); 272 } 273 // If the key is already registered this will replace it 274 mController.registerEventHandler(viewId, (EventHandler) frag); 275 276 if (doCommit) { 277 ft.commit(); 278 } 279 } 280 281 private void setTitleInActionBar(EventInfo event) { 282 if (event.eventType != EventType.GO_TO) { 283 return; 284 } 285 286 long start = event.startTime.toMillis(false /* use isDst */); 287 long end = start; 288 289 if (event.endTime != null) { 290 end = event.endTime.toMillis(false /* use isDst */); 291 } 292 String msg = DateUtils.formatDateRange(this, start, end, DateUtils.FORMAT_SHOW_DATE); 293 294 ActionBar ab = getActionBar(); 295 if (ab != null) { 296 ab.setTitle(msg); 297 } 298 } 299 300 @Override 301 public long getSupportedEventTypes() { 302 return EventType.GO_TO; 303 } 304 305 @Override 306 public void handleEvent(EventInfo event) { 307 if (event.eventType == EventType.GO_TO) { 308 // Set title bar 309 setTitleInActionBar(event); 310 311 setMainPane(null, R.id.main_pane, event.viewType, 312 event.startTime.toMillis(false), false); 313 314 if (!mIsMultipane) { 315 return; 316 } 317 if (event.viewType == ViewType.MONTH) { 318 // hide minimonth and calendar frag 319 findViewById(R.id.mini_month).setVisibility(View.GONE); 320 findViewById(R.id.calendar_list).setVisibility(View.GONE); 321 } else { 322 // show minimonth and calendar frag 323 findViewById(R.id.mini_month).setVisibility(View.VISIBLE); 324 findViewById(R.id.calendar_list).setVisibility(View.VISIBLE); 325 } 326 } 327 } 328 329 @Override 330 public void eventsChanged() { 331 mController.sendEvent(this, EventType.EVENTS_CHANGED, null, null, -1, ViewType.CURRENT); 332 } 333 334 @Override 335 public boolean getAllDay() { 336 return false; 337 } 338 339 @Override 340 public long getSelectedTime() { 341 return 0; 342 } 343 344 @Override 345 public void goTo(Time time, boolean animate) { 346 } 347 348 @Override 349 public void goToToday() { 350 } 351} 352