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