AllInOneActivity.java revision ab29d9ea9a4fe6b835c7f484a2273e92e8bc323d
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 static android.provider.Calendar.EVENT_BEGIN_TIME;
20
21import com.android.calendar.CalendarController.EventHandler;
22import com.android.calendar.CalendarController.EventInfo;
23import com.android.calendar.CalendarController.EventType;
24import com.android.calendar.CalendarController.ViewType;
25import com.android.calendar.SelectCalendars.SelectCalendarsFragment;
26
27import android.app.ActionBar;
28import android.app.Activity;
29import android.app.Fragment;
30import android.app.FragmentTransaction;
31import android.content.SharedPreferences;
32import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
33import android.content.res.Configuration;
34import android.os.Bundle;
35import android.text.format.DateUtils;
36import android.text.format.Time;
37import android.view.Menu;
38import android.view.MenuItem;
39import android.view.View;
40
41public class AllInOneActivity extends Activity implements EventHandler,
42        OnSharedPreferenceChangeListener {
43    private static String TAG = "AllInOneActivity";
44    public static CalendarController mController; // FRAG_TODO make private
45
46    @Override
47    protected void onCreate(Bundle icicle) {
48        super.onCreate(icicle);
49
50        // This needs to be created before setContentView
51        mController = new CalendarController(this);
52        // Must be the first to register. Needed to remove other eventhandlers
53        mController.registerEventHandler(this);
54
55        setContentView(R.layout.all_in_one);
56
57        // Get time from intent or icicle
58        long timeMillis;
59        if (icicle != null) {
60            timeMillis = icicle.getLong(EVENT_BEGIN_TIME);
61        } else {
62            timeMillis = Utils.timeFromIntentInMillis(getIntent());
63        }
64
65        initFragments(timeMillis);
66
67        // Listen for changes that would require this to be refreshed
68        SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(this);
69        prefs.registerOnSharedPreferenceChangeListener(this);
70    }
71
72    @Override
73    protected void onDestroy() {
74        super.onDestroy();
75
76        SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(this);
77        prefs.unregisterOnSharedPreferenceChangeListener(this);
78    }
79
80    private void initFragments(long timeMillis) {
81        FragmentTransaction ft = openFragmentTransaction();
82
83        boolean multipane = (getResources().getConfiguration().screenLayout &
84                Configuration.SCREENLAYOUT_SIZE_XLARGE) != 0;
85
86        if (multipane) {
87            Fragment miniMonthFrag = new MonthFragment(false, timeMillis);
88            ft.replace(R.id.mini_month, miniMonthFrag);
89            mController.registerEventHandler((EventHandler) miniMonthFrag);
90
91            Fragment selectCalendarsFrag = new SelectCalendarsFragment();
92            ft.replace(R.id.calendar_list, selectCalendarsFrag);
93        } else {
94            findViewById(R.id.mini_month).setVisibility(View.GONE);
95            findViewById(R.id.calendar_list).setVisibility(View.GONE);
96        }
97
98        // FRAG_TODO restore event.viewType from icicle
99        setMainPane(ft, R.id.main_pane, ViewType.WEEK, timeMillis, true);
100
101        ft.commit(); // this needs to be after setMainPane()
102
103        // Set title
104        String msg = DateUtils.formatDateRange(this, timeMillis, timeMillis,
105            DateUtils.FORMAT_SHOW_DATE);
106        setTitle(msg);
107    }
108
109    @Override
110    public boolean onCreateOptionsMenu(Menu menu) {
111        super.onCreateOptionsMenu(menu);
112
113        getMenuInflater().inflate(R.menu.all_in_one_title_bar, menu);
114        return true;
115    }
116
117    @Override
118    public boolean onOptionsItemSelected(MenuItem item) {
119        Time t = null;
120        int viewType = ViewType.CURRENT;
121        switch (item.getItemId()) {
122            case R.id.action_day:
123                viewType = ViewType.DAY;
124                break;
125            case R.id.action_week:
126                viewType = ViewType.WEEK;
127                break;
128            case R.id.action_month:
129                viewType = ViewType.MONTH;
130                break;
131            case R.id.action_agenda:
132                viewType = ViewType.AGENDA;
133                break;
134            case R.id.action_today:
135                viewType = ViewType.CURRENT;
136                t = new Time();
137                t.setToNow();
138                break;
139            case R.id.action_create_event:
140                mController.sendEventRelatedEvent(this, EventType.CREATE_EVENT, -1, 0, 0, 0, 0);
141                return true;
142            case R.id.action_manage_calendars:
143                mController.sendEvent(this, EventType.LAUNCH_MANAGE_CALENDARS, null, null, 0, 0);
144                return true;
145            case R.id.action_settings:
146                mController.sendEvent(this, EventType.LAUNCH_SETTINGS, null, null, 0, 0);
147                return true;
148            default:
149                return false;
150        }
151        mController.sendEvent(this, EventType.GO_TO, t, null, -1, viewType);
152        return true;
153    }
154
155    @Override
156    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
157        if (key.equals(CalendarPreferenceActivity.KEY_WEEK_START_DAY)) {
158            initFragments(mController.getTime());
159        }
160    }
161
162    private void setMainPane(FragmentTransaction ft, int viewId, int viewType,
163            long timeMillis, boolean force) {
164        if(!force && mController.getPreviousViewType() == viewType) {
165            return;
166        }
167
168        // Deregister old view
169        Fragment frag = findFragmentById(viewId);
170        if (frag != null) {
171            mController.deregisterEventHandler((EventHandler) frag);
172        }
173
174        // Create new one
175        switch (viewType) {
176            case ViewType.AGENDA:
177// FRAG_TODO Change this to agenda when we have AgendaFragment
178                frag = new MonthFragment(false, timeMillis);
179                break;
180            case ViewType.DAY:
181            case ViewType.WEEK:
182                frag = new DayFragment(timeMillis);
183                break;
184            case ViewType.MONTH:
185                frag = new MonthFragment(false, timeMillis);
186                break;
187            default:
188                throw new IllegalArgumentException("Must be Agenda, Day, Week, or Month ViewType");
189        }
190
191        boolean doCommit = false;
192        if (ft == null) {
193            doCommit = true;
194            ft = openFragmentTransaction();
195        }
196
197        ft.replace(viewId, frag);
198        mController.registerEventHandler((EventHandler) frag);
199
200        if (doCommit) {
201            ft.commit();
202        }
203    }
204
205    private void setTitleInActionBar(EventInfo event) {
206        if (event.eventType != EventType.GO_TO) {
207            return;
208        }
209
210        long start = event.startTime.toMillis(false /* use isDst */);
211        long end = start;
212
213        if (event.endTime != null && !event.startTime.equals(event.endTime)) {
214            end = event.endTime.toMillis(false /* use isDst */);
215        }
216        String msg = DateUtils.formatDateRange(this, start, end, DateUtils.FORMAT_SHOW_DATE);
217
218        ActionBar ab = getActionBar();
219        if (ab != null) {
220            ab.setTitle(msg);
221        }
222    }
223
224    // EventHandler Interface
225    public long getSupportedEventTypes() {
226        return EventType.GO_TO;
227    }
228
229    // EventHandler Interface
230    public void handleEvent(EventInfo event) {
231        if (event.eventType == EventType.GO_TO) {
232            // Set title bar
233            setTitleInActionBar(event);
234
235            setMainPane(null, R.id.main_pane, event.viewType,
236                    event.startTime.toMillis(false), false);
237
238            // FRAG_TODO only for XL screen
239            if (event.viewType == ViewType.MONTH) {
240                // hide minimonth and calendar frag
241                // show agenda view
242            } else {
243                // show minimonth and calendar frag
244            }
245        }
246    }
247
248    // EventHandler Interface
249    public void eventsChanged() {
250    }
251
252    // EventHandler Interface
253    public boolean getAllDay() {
254        return false;
255    }
256
257    // EventHandler Interface
258    public long getSelectedTime() {
259        return 0;
260    }
261
262    // EventHandler Interface
263    public void goTo(Time time, boolean animate) {
264    }
265
266    // EventHandler Interface
267    public void goToToday() {
268    }
269}
270