/* * Copyright (C) 2007 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 static android.provider.Calendar.EVENT_BEGIN_TIME; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.database.ContentObserver; import android.os.Bundle; import android.os.Handler; import android.provider.Calendar.Events; import android.text.format.Time; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import dalvik.system.VMRuntime; public class AgendaActivity extends Activity implements Navigator { private static final String TAG = "AgendaActivity"; private static boolean DEBUG = false; protected static final String BUNDLE_KEY_RESTORE_TIME = "key_restore_time"; private static final long INITIAL_HEAP_SIZE = 4*1024*1024; private ContentResolver mContentResolver; private AgendaListView mAgendaListView; private Time mTime; private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_TIME_CHANGED) || action.equals(Intent.ACTION_DATE_CHANGED) || action.equals(Intent.ACTION_TIMEZONE_CHANGED)) { mAgendaListView.refresh(true); } } }; private ContentObserver mObserver = new ContentObserver(new Handler()) { @Override public boolean deliverSelfNotifications() { return true; } @Override public void onChange(boolean selfChange) { mAgendaListView.refresh(true); } }; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); // Eliminate extra GCs during startup by setting the initial heap size to 4MB. // TODO: We should restore the old heap size once the activity reaches the idle state VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE); mAgendaListView = new AgendaListView(this); setContentView(mAgendaListView); mContentResolver = getContentResolver(); setTitle(R.string.agenda_view); long millis = 0; mTime = new Time(); if (icicle != null) { // Returns 0 if key not found millis = icicle.getLong(BUNDLE_KEY_RESTORE_TIME); if (DEBUG) { Log.v(TAG, "Restore value from icicle: " + millis); } } if (millis == 0) { // Returns 0 if key not found millis = getIntent().getLongExtra(EVENT_BEGIN_TIME, 0); if (DEBUG) { Time time = new Time(); time.set(millis); Log.v(TAG, "Restore value from intent: " + time.toString()); } } if (millis == 0) { if (DEBUG) { Log.v(TAG, "Restored from current time"); } millis = System.currentTimeMillis(); } mTime.set(millis); } @Override protected void onNewIntent(Intent intent) { long time = Utils.timeFromIntentInMillis(intent); if (time <= 0){ java.util.Calendar cal = java.util.Calendar.getInstance(); time = cal.getTimeInMillis(); } mTime.set(time); goTo(mTime, false); } @Override protected void onResume() { super.onResume(); if (DEBUG) { Log.v(TAG, "OnResume to " + mTime.toString()); } SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences( getApplicationContext()); boolean hideDeclined = prefs.getBoolean( CalendarPreferenceActivity.KEY_HIDE_DECLINED, false); mAgendaListView.setHideDeclinedEvents(hideDeclined); mAgendaListView.goTo(mTime, true); mAgendaListView.onResume(); // Register for Intent broadcasts IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_DATE_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); registerReceiver(mIntentReceiver, filter); mContentResolver.registerContentObserver(Events.CONTENT_URI, true, mObserver); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); long firstVisibleTime = mAgendaListView.getFirstVisibleTime(); if (firstVisibleTime > 0) { mTime.set(firstVisibleTime); outState.putLong(BUNDLE_KEY_RESTORE_TIME, firstVisibleTime); if (DEBUG) { Log.v(TAG, "onSaveInstanceState " + mTime.toString()); } } } @Override protected void onPause() { super.onPause(); mAgendaListView.onPause(); mContentResolver.unregisterContentObserver(mObserver); unregisterReceiver(mIntentReceiver); // Record Agenda View as the (new) default detailed view. Utils.setDefaultView(this, CalendarApplication.AGENDA_VIEW_ID); } @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuHelper.onPrepareOptionsMenu(this, menu); return super.onPrepareOptionsMenu(menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuHelper.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { MenuHelper.onOptionsItemSelected(this, item, this); super.onOptionsItemSelected(item); return true; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DEL: // Delete the currently selected event (if any) mAgendaListView.deleteSelectedEvent(); break; } return super.onKeyDown(keyCode, event); } /* Navigator interface methods */ public void goToToday() { Time now = new Time(); now.setToNow(); mAgendaListView.goTo(now, true); // Force refresh } public void goTo(Time time, boolean animate) { mAgendaListView.goTo(time, false); } public long getSelectedTime() { return mAgendaListView.getSelectedTime(); } public boolean getAllDay() { return false; } }