diff options
Diffstat (limited to 'src/com/android/phone/ADNList.java')
-rw-r--r-- | src/com/android/phone/ADNList.java | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/src/com/android/phone/ADNList.java b/src/com/android/phone/ADNList.java new file mode 100644 index 00000000..b4e8ac74 --- /dev/null +++ b/src/com/android/phone/ADNList.java @@ -0,0 +1,217 @@ +/* + * 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.phone; + +import static android.view.Window.PROGRESS_VISIBILITY_OFF; +import static android.view.Window.PROGRESS_VISIBILITY_ON; + +import android.app.ListActivity; +import android.content.AsyncQueryHandler; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import android.util.Log; +import android.view.Window; +import android.widget.CursorAdapter; +import android.widget.SimpleCursorAdapter; +import android.widget.TextView; + +/** + * ADN List activity for the Phone app. + */ +public class ADNList extends ListActivity { + protected static final String TAG = "ADNList"; + protected static final boolean DBG = false; + + private static final String[] COLUMN_NAMES = new String[] { + "name", + "number", + "emails" + }; + + protected static final int NAME_COLUMN = 0; + protected static final int NUMBER_COLUMN = 1; + protected static final int EMAILS_COLUMN = 2; + + private static final int[] VIEW_NAMES = new int[] { + android.R.id.text1, + android.R.id.text2 + }; + + protected static final int QUERY_TOKEN = 0; + protected static final int INSERT_TOKEN = 1; + protected static final int UPDATE_TOKEN = 2; + protected static final int DELETE_TOKEN = 3; + + + protected QueryHandler mQueryHandler; + protected CursorAdapter mCursorAdapter; + protected Cursor mCursor = null; + + private TextView mEmptyText; + + protected int mInitialSelection = -1; + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + setContentView(R.layout.adn_list); + mEmptyText = (TextView) findViewById(android.R.id.empty); + mQueryHandler = new QueryHandler(getContentResolver()); + } + + @Override + protected void onResume() { + super.onResume(); + query(); + } + + @Override + protected void onStop() { + super.onStop(); + if (mCursor != null) { + mCursor.deactivate(); + } + } + + protected Uri resolveIntent() { + Intent intent = getIntent(); + if (intent.getData() == null) { + intent.setData(Uri.parse("content://icc/adn")); + } + + return intent.getData(); + } + + private void query() { + Uri uri = resolveIntent(); + if (DBG) log("query: starting an async query"); + mQueryHandler.startQuery(QUERY_TOKEN, null, uri, COLUMN_NAMES, + null, null, null); + displayProgress(true); + } + + private void reQuery() { + query(); + } + + private void setAdapter() { + // NOTE: + // As it it written, the positioning code below is NOT working. + // However, this current non-working state is in compliance with + // the UI paradigm, so we can't really do much to change it. + + // In the future, if we wish to get this "positioning" correct, + // we'll need to do the following: + // 1. Change the layout to in the cursor adapter to: + // android.R.layout.simple_list_item_checked + // 2. replace the selection / focus code with: + // getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); + // getListView().setItemChecked(mInitialSelection, true); + + // Since the positioning is really only useful for the dialer's + // SpecialCharSequence case (dialing '2#' to get to the 2nd + // contact for instance), it doesn't make sense to mess with + // the usability of the activity just for this case. + + // These artifacts include: + // 1. UI artifacts (checkbox and highlight at the same time) + // 2. Allowing the user to edit / create new SIM contacts when + // the user is simply trying to retrieve a number into the d + // dialer. + + if (mCursorAdapter == null) { + mCursorAdapter = newAdapter(); + + setListAdapter(mCursorAdapter); + } else { + mCursorAdapter.changeCursor(mCursor); + } + + if (mInitialSelection >=0 && mInitialSelection < mCursorAdapter.getCount()) { + setSelection(mInitialSelection); + getListView().setFocusableInTouchMode(true); + boolean gotfocus = getListView().requestFocus(); + } + } + + protected CursorAdapter newAdapter() { + return new SimpleCursorAdapter(this, + android.R.layout.simple_list_item_2, + mCursor, COLUMN_NAMES, VIEW_NAMES); + } + + private void displayProgress(boolean loading) { + if (DBG) log("displayProgress: " + loading); + + mEmptyText.setText(loading ? R.string.simContacts_emptyLoading: + (isAirplaneModeOn(this) ? R.string.simContacts_airplaneMode : + R.string.simContacts_empty)); + getWindow().setFeatureInt( + Window.FEATURE_INDETERMINATE_PROGRESS, + loading ? PROGRESS_VISIBILITY_ON : PROGRESS_VISIBILITY_OFF); + } + + private static boolean isAirplaneModeOn(Context context) { + return Settings.System.getInt(context.getContentResolver(), + Settings.System.AIRPLANE_MODE_ON, 0) != 0; + } + + private class QueryHandler extends AsyncQueryHandler { + public QueryHandler(ContentResolver cr) { + super(cr); + } + + @Override + protected void onQueryComplete(int token, Object cookie, Cursor c) { + if (DBG) log("onQueryComplete: cursor.count=" + c.getCount()); + mCursor = c; + setAdapter(); + displayProgress(false); + + // Cursor is refreshed and inherited classes may have menu items depending on it. + invalidateOptionsMenu(); + } + + @Override + protected void onInsertComplete(int token, Object cookie, Uri uri) { + if (DBG) log("onInsertComplete: requery"); + reQuery(); + } + + @Override + protected void onUpdateComplete(int token, Object cookie, int result) { + if (DBG) log("onUpdateComplete: requery"); + reQuery(); + } + + @Override + protected void onDeleteComplete(int token, Object cookie, int result) { + if (DBG) log("onDeleteComplete: requery"); + reQuery(); + } + } + + protected void log(String msg) { + Log.d(TAG, "[ADNList] " + msg); + } +} |