blob: 8ef8ef53f0bd3f826b07469ee0e718cec8a39621 [file] [log] [blame]
/*
* 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 com.android.calendar.CalendarController.EventHandler;
import com.android.calendar.CalendarController.EventInfo;
import com.android.calendar.CalendarController.EventType;
import com.android.calendar.CalendarController.ViewType;
import com.android.calendar.SelectCalendars.SelectCalendarsFragment;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.format.DateUtils;
import android.text.format.Time;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class AllInOneActivity extends Activity implements EventHandler,
OnSharedPreferenceChangeListener {
private static final String TAG = "AllInOneActivity";
private static final String BUNDLE_KEY_RESTORE_TIME = "key_restore_time";
private static CalendarController mController;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
// This needs to be created before setContentView
mController = CalendarController.getInstance(this);
// Must be the first to register so that this activity can modify the
// list the event handlers during dispatching.
mController.registerEventHandler(this);
setContentView(R.layout.all_in_one);
// Get time from intent or icicle
long timeMillis;
if (icicle != null) {
timeMillis = icicle.getLong(BUNDLE_KEY_RESTORE_TIME);
} else {
timeMillis = Utils.timeFromIntentInMillis(getIntent());
}
initFragments(timeMillis, Utils.getViewTypeFromIntentAndSharedPref(this));
// Listen for changes that would require this to be refreshed
SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(this);
prefs.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
//FRAG_TODO save highlighted days of the week;
Utils.setDefaultView(this, mController.getViewType());
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong(BUNDLE_KEY_RESTORE_TIME, mController.getTime());
}
@Override
protected void onDestroy() {
super.onDestroy();
SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(this);
prefs.unregisterOnSharedPreferenceChangeListener(this);
}
private void initFragments(long timeMillis, int viewType) {
FragmentTransaction ft = openFragmentTransaction();
boolean multipane = (getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_XLARGE) != 0;
if (multipane) {
Fragment miniMonthFrag = new MonthFragment(false, timeMillis);
ft.replace(R.id.mini_month, miniMonthFrag);
mController.registerEventHandler((EventHandler) miniMonthFrag);
Fragment selectCalendarsFrag = new SelectCalendarsFragment();
ft.replace(R.id.calendar_list, selectCalendarsFrag);
} else {
findViewById(R.id.mini_month).setVisibility(View.GONE);
findViewById(R.id.calendar_list).setVisibility(View.GONE);
}
setMainPane(ft, R.id.main_pane, viewType, timeMillis, true);
ft.commit(); // this needs to be after setMainPane()
Time t = new Time();
t.set(timeMillis);
mController.sendEvent(this, EventType.GO_TO, t, null, -1, viewType);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.all_in_one_title_bar, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Time t = null;
int viewType = ViewType.CURRENT;
switch (item.getItemId()) {
case R.id.action_refresh:
mController.refreshCalendars();
return true;
case R.id.action_day:
viewType = ViewType.DAY;
break;
case R.id.action_week:
viewType = ViewType.WEEK;
break;
case R.id.action_month:
viewType = ViewType.MONTH;
break;
case R.id.action_agenda:
viewType = ViewType.AGENDA;
break;
case R.id.action_today:
viewType = ViewType.CURRENT;
t = new Time();
t.setToNow();
break;
case R.id.action_create_event:
mController.sendEventRelatedEvent(this, EventType.CREATE_EVENT, -1, 0, 0, 0, 0);
return true;
case R.id.action_manage_calendars:
mController.sendEvent(this, EventType.LAUNCH_MANAGE_CALENDARS, null, null, 0, 0);
return true;
case R.id.action_settings:
mController.sendEvent(this, EventType.LAUNCH_SETTINGS, null, null, 0, 0);
return true;
default:
return false;
}
mController.sendEvent(this, EventType.GO_TO, t, null, -1, viewType);
return true;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals(CalendarPreferenceActivity.KEY_WEEK_START_DAY)) {
initFragments(mController.getTime(), mController.getViewType());
}
}
private void setMainPane(FragmentTransaction ft, int viewId, int viewType,
long timeMillis, boolean force) {
if(!force && mController.getPreviousViewType() == viewType) {
return;
}
// Deregister old view
Fragment frag = findFragmentById(viewId);
if (frag != null) {
mController.deregisterEventHandler((EventHandler) frag);
}
// Create new one
switch (viewType) {
case ViewType.AGENDA:
frag = new AgendaFragment(timeMillis);
break;
case ViewType.DAY:
frag = new DayFragment(timeMillis, 1);
break;
case ViewType.WEEK:
frag = new DayFragment(timeMillis, 7);
break;
case ViewType.MONTH:
frag = new MonthFragment(false, timeMillis);
break;
default:
throw new IllegalArgumentException(
"Must be Agenda, Day, Week, or Month ViewType, not " + viewType);
}
boolean doCommit = false;
if (ft == null) {
doCommit = true;
ft = openFragmentTransaction();
}
ft.replace(viewId, frag);
mController.registerEventHandler((EventHandler) frag);
if (doCommit) {
ft.commit();
}
}
private void setTitleInActionBar(EventInfo event) {
if (event.eventType != EventType.GO_TO) {
return;
}
long start = event.startTime.toMillis(false /* use isDst */);
long end = start;
if (event.endTime != null) {
end = event.endTime.toMillis(false /* use isDst */);
}
String msg = DateUtils.formatDateRange(this, start, end, DateUtils.FORMAT_SHOW_DATE);
ActionBar ab = getActionBar();
if (ab != null) {
ab.setTitle(msg);
}
}
// EventHandler Interface
public long getSupportedEventTypes() {
return EventType.GO_TO;
}
// EventHandler Interface
public void handleEvent(EventInfo event) {
if (event.eventType == EventType.GO_TO) {
// Set title bar
setTitleInActionBar(event);
setMainPane(null, R.id.main_pane, event.viewType,
event.startTime.toMillis(false), false);
// FRAG_TODO only for XL screen
if (event.viewType == ViewType.MONTH) {
// hide minimonth and calendar frag
// show agenda view
} else {
// show minimonth and calendar frag
}
}
}
// EventHandler Interface
public void eventsChanged() {
}
// EventHandler Interface
public boolean getAllDay() {
return false;
}
// EventHandler Interface
public long getSelectedTime() {
return 0;
}
// EventHandler Interface
public void goTo(Time time, boolean animate) {
}
// EventHandler Interface
public void goToToday() {
}
}