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