AllInOneActivity.java revision ba1b94afd187279623a57417da1ef78efa1217e2
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_refresh:
123                mController.refreshCalendars();
124                return true;
125            case R.id.action_day:
126                viewType = ViewType.DAY;
127                break;
128            case R.id.action_week:
129                viewType = ViewType.WEEK;
130                break;
131            case R.id.action_month:
132                viewType = ViewType.MONTH;
133                break;
134            case R.id.action_agenda:
135                viewType = ViewType.AGENDA;
136                break;
137            case R.id.action_today:
138                viewType = ViewType.CURRENT;
139                t = new Time();
140                t.setToNow();
141                break;
142            case R.id.action_create_event:
143                mController.sendEventRelatedEvent(this, EventType.CREATE_EVENT, -1, 0, 0, 0, 0);
144                return true;
145            case R.id.action_manage_calendars:
146                mController.sendEvent(this, EventType.LAUNCH_MANAGE_CALENDARS, null, null, 0, 0);
147                return true;
148            case R.id.action_settings:
149                mController.sendEvent(this, EventType.LAUNCH_SETTINGS, null, null, 0, 0);
150                return true;
151            default:
152                return false;
153        }
154        mController.sendEvent(this, EventType.GO_TO, t, null, -1, viewType);
155        return true;
156    }
157
158    @Override
159    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
160        if (key.equals(CalendarPreferenceActivity.KEY_WEEK_START_DAY)) {
161            initFragments(mController.getTime());
162        }
163    }
164
165    private void setMainPane(FragmentTransaction ft, int viewId, int viewType,
166            long timeMillis, boolean force) {
167        if(!force && mController.getPreviousViewType() == viewType) {
168            return;
169        }
170
171        // Deregister old view
172        Fragment frag = findFragmentById(viewId);
173        if (frag != null) {
174            mController.deregisterEventHandler((EventHandler) frag);
175        }
176
177        // Create new one
178        switch (viewType) {
179            case ViewType.AGENDA:
180                frag = new AgendaFragment(timeMillis);
181                break;
182            case ViewType.DAY:
183            case ViewType.WEEK:
184                frag = new DayFragment(timeMillis);
185                break;
186            case ViewType.MONTH:
187                frag = new MonthFragment(false, timeMillis);
188                break;
189            default:
190                throw new IllegalArgumentException("Must be Agenda, Day, Week, or Month ViewType");
191        }
192
193        boolean doCommit = false;
194        if (ft == null) {
195            doCommit = true;
196            ft = openFragmentTransaction();
197        }
198
199        ft.replace(viewId, frag);
200        mController.registerEventHandler((EventHandler) frag);
201
202        if (doCommit) {
203            ft.commit();
204        }
205    }
206
207    private void setTitleInActionBar(EventInfo event) {
208        if (event.eventType != EventType.GO_TO) {
209            return;
210        }
211
212        long start = event.startTime.toMillis(false /* use isDst */);
213        long end = start;
214
215        if (event.endTime != null && !event.startTime.equals(event.endTime)) {
216            end = event.endTime.toMillis(false /* use isDst */);
217        }
218        String msg = DateUtils.formatDateRange(this, start, end, DateUtils.FORMAT_SHOW_DATE);
219
220        ActionBar ab = getActionBar();
221        if (ab != null) {
222            ab.setTitle(msg);
223        }
224    }
225
226    // EventHandler Interface
227    public long getSupportedEventTypes() {
228        return EventType.GO_TO;
229    }
230
231    // EventHandler Interface
232    public void handleEvent(EventInfo event) {
233        if (event.eventType == EventType.GO_TO) {
234            // Set title bar
235            setTitleInActionBar(event);
236
237            setMainPane(null, R.id.main_pane, event.viewType,
238                    event.startTime.toMillis(false), false);
239
240            // FRAG_TODO only for XL screen
241            if (event.viewType == ViewType.MONTH) {
242                // hide minimonth and calendar frag
243                // show agenda view
244            } else {
245                // show minimonth and calendar frag
246            }
247        }
248    }
249
250    // EventHandler Interface
251    public void eventsChanged() {
252    }
253
254    // EventHandler Interface
255    public boolean getAllDay() {
256        return false;
257    }
258
259    // EventHandler Interface
260    public long getSelectedTime() {
261        return 0;
262    }
263
264    // EventHandler Interface
265    public void goTo(Time time, boolean animate) {
266    }
267
268    // EventHandler Interface
269    public void goToToday() {
270    }
271}
272