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