diff options
author | Mason Tang <masontang@google.com> | 2010-06-28 11:08:46 -0700 |
---|---|---|
committer | Mason Tang <masontang@google.com> | 2010-07-21 13:53:23 -0700 |
commit | 9138ce8a14924612c014da2b6e727b4117ba1a92 (patch) | |
tree | 2fb1b5a1b0b8f5567a2c898beea1b3d3b0259a9e /src/com/android/calendar/SearchActivity.java | |
parent | ab29d9ea9a4fe6b835c7f484a2273e92e8bc323d (diff) | |
download | android_packages_apps_Calendar-9138ce8a14924612c014da2b6e727b4117ba1a92.tar.gz android_packages_apps_Calendar-9138ce8a14924612c014da2b6e727b4117ba1a92.tar.bz2 android_packages_apps_Calendar-9138ce8a14924612c014da2b6e727b4117ba1a92.zip |
Added basic support for searching events
- Reusing agenda view for displaying search results
- Currently not fragment-ized
Change-Id: I687b61ca86f92a54c1e402b881edd83111806161
Diffstat (limited to 'src/com/android/calendar/SearchActivity.java')
-rw-r--r-- | src/com/android/calendar/SearchActivity.java | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/src/com/android/calendar/SearchActivity.java b/src/com/android/calendar/SearchActivity.java new file mode 100644 index 00000000..d5b56315 --- /dev/null +++ b/src/com/android/calendar/SearchActivity.java @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2010 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 dalvik.system.VMRuntime; +import android.app.Activity; +import android.app.SearchManager; +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; + +/** + */ +public class SearchActivity extends Activity implements Navigator { + + private static final String TAG = SearchActivity.class.getSimpleName(); + + private static boolean DEBUG = false; + + private static final long INITIAL_HEAP_SIZE = 4*1024*1024; + + protected static final String BUNDLE_KEY_RESTORE_TIME = "key_restore_time"; + + protected static final String BUNDLE_KEY_RESTORE_SEARCH_QUERY = + "key_restore_search_query"; + + 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); + + setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); + + // 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.search); + + 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) { + // Didn't find a time in the bundle, look in intent or current time + millis = Utils.timeFromIntentInMillis(getIntent()); + } + Intent intent = getIntent(); + mTime.set(millis); + if (Intent.ACTION_SEARCH.equals(intent.getAction())) { + String query = intent.getStringExtra(SearchManager.QUERY); + search(query); + } + } + + @Override + protected void onNewIntent(Intent intent) { + // From the Android Dev Guide: "It's important to note that when + // onNewIntent(Intent) is called, the Activity has not been restarted, + // so the getIntent() method will still return the Intent that was first + // received with onCreate(). This is why setIntent(Intent) is called + // inside onNewIntent(Intent) (just in case you call getIntent() at a + // later time)." + setIntent(intent); + handleIntent(intent); + } + + private void handleIntent(Intent intent) { + if (Intent.ACTION_SEARCH.equals(intent.getAction())) { + String query = intent.getStringExtra(SearchManager.QUERY); + search(query); + } else { + long time = Utils.timeFromIntentInMillis(intent); + if (time > 0) { + mTime.set(time); + goTo(mTime, false); + } + } + } + + @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 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 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); + return super.onOptionsItemSelected(item); + } + + @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); + } + + private void search(String searchQuery) { + mAgendaListView.search(searchQuery, true); + } + + + /* 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; + } + +} |