1b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/* 2b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 4b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * you may not use this file except in compliance with the License. 6b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * You may obtain a copy of the License at 7b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 8b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 10b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * See the License for the specific language governing permissions and 14b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * limitations under the License. 15b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 16b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 17b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpackage com.android.phone; 18b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 19b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport static android.view.Window.PROGRESS_VISIBILITY_OFF; 20b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport static android.view.Window.PROGRESS_VISIBILITY_ON; 21b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 22b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.ListActivity; 23b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.AsyncQueryHandler; 24b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.ContentResolver; 25c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawaimport android.content.Context; 26b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.Intent; 27b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.database.Cursor; 28b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.net.Uri; 29b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Bundle; 30c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawaimport android.provider.Settings; 31b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.Log; 32b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.Window; 33b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.CursorAdapter; 34b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.SimpleCursorAdapter; 35b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.TextView; 36b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 37b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/** 38b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * ADN List activity for the Phone app. 39b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 40b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpublic class ADNList extends ListActivity { 41b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected static final String TAG = "ADNList"; 42b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected static final boolean DBG = false; 43b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 44b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final String[] COLUMN_NAMES = new String[] { 45b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project "name", 46bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh "number", 47bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh "emails" 48b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project }; 49bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh 50b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected static final int NAME_COLUMN = 0; 51b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected static final int NUMBER_COLUMN = 1; 52bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh protected static final int EMAILS_COLUMN = 2; 53b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 54b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final int[] VIEW_NAMES = new int[] { 55b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project android.R.id.text1, 56b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project android.R.id.text2 57b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project }; 58b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 59b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected static final int QUERY_TOKEN = 0; 60b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected static final int INSERT_TOKEN = 1; 61b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected static final int UPDATE_TOKEN = 2; 62b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected static final int DELETE_TOKEN = 3; 63b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 64b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 65b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected QueryHandler mQueryHandler; 66b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected CursorAdapter mCursorAdapter; 67b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected Cursor mCursor = null; 68b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 69b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mEmptyText; 70b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 71b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected int mInitialSelection = -1; 72b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 73b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 74b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void onCreate(Bundle icicle) { 75b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super.onCreate(icicle); 76b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 77b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project setContentView(R.layout.adn_list); 78b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mEmptyText = (TextView) findViewById(android.R.id.empty); 79b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mQueryHandler = new QueryHandler(getContentResolver()); 80b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 81b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 82b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 83b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void onResume() { 84b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super.onResume(); 85b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project query(); 86b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 87b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 88b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 89b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void onStop() { 90b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super.onStop(); 91b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (mCursor != null) { 92b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCursor.deactivate(); 93b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 94b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 95b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 96b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected Uri resolveIntent() { 97b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Intent intent = getIntent(); 98b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (intent.getData() == null) { 99c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville intent.setData(Uri.parse("content://icc/adn")); 100b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 101b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 102b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return intent.getData(); 103b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 105b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void query() { 106b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Uri uri = resolveIntent(); 107b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("query: starting an async query"); 108b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mQueryHandler.startQuery(QUERY_TOKEN, null, uri, COLUMN_NAMES, 109b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project null, null, null); 110b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayProgress(true); 111b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 112b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 113b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void reQuery() { 114b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project query(); 115b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 116b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void setAdapter() { 118bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh // NOTE: 119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // As it it written, the positioning code below is NOT working. 120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // However, this current non-working state is in compliance with 121b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the UI paradigm, so we can't really do much to change it. 122bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh 123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // In the future, if we wish to get this "positioning" correct, 124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // we'll need to do the following: 125b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 1. Change the layout to in the cursor adapter to: 126b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // android.R.layout.simple_list_item_checked 127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 2. replace the selection / focus code with: 128b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 129b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // getListView().setItemChecked(mInitialSelection, true); 130bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh 131b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Since the positioning is really only useful for the dialer's 132b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // SpecialCharSequence case (dialing '2#' to get to the 2nd 133b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // contact for instance), it doesn't make sense to mess with 134b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the usability of the activity just for this case. 135bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh 136bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh // These artifacts include: 137b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 1. UI artifacts (checkbox and highlight at the same time) 138bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh // 2. Allowing the user to edit / create new SIM contacts when 139b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the user is simply trying to retrieve a number into the d 140b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // dialer. 141bcfe4a22a976671807ef38d86dcd6984c57e3cf5Jaikumar Ganesh 142b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (mCursorAdapter == null) { 143b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCursorAdapter = newAdapter(); 144b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 145b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project setListAdapter(mCursorAdapter); 146b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 147b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCursorAdapter.changeCursor(mCursor); 148b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 149b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 150b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (mInitialSelection >=0 && mInitialSelection < mCursorAdapter.getCount()) { 151b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project setSelection(mInitialSelection); 152b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project getListView().setFocusableInTouchMode(true); 153b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project boolean gotfocus = getListView().requestFocus(); 154b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 155b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 157b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected CursorAdapter newAdapter() { 158b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return new SimpleCursorAdapter(this, 159b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project android.R.layout.simple_list_item_2, 160b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCursor, COLUMN_NAMES, VIEW_NAMES); 161b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 162b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 163b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void displayProgress(boolean flag) { 164b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("displayProgress: " + flag); 165c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawa 166c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawa mEmptyText.setText(flag ? R.string.simContacts_emptyLoading: 167c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawa (isAirplaneModeOn(this) ? R.string.simContacts_airplaneMode : 168c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawa R.string.simContacts_empty)); 169b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project getWindow().setFeatureInt( 170b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Window.FEATURE_INDETERMINATE_PROGRESS, 171b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project flag ? PROGRESS_VISIBILITY_ON : PROGRESS_VISIBILITY_OFF); 172b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 173b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 174c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawa private static boolean isAirplaneModeOn(Context context) { 175c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawa return Settings.System.getInt(context.getContentResolver(), 176c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawa Settings.System.AIRPLANE_MODE_ON, 0) != 0; 177c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawa } 178c27c68d38dc1b2c1af5c29cefe224eb09096584bDaisuke Miyakawa 179b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private class QueryHandler extends AsyncQueryHandler { 180b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public QueryHandler(ContentResolver cr) { 181b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super(cr); 182b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 183b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 184b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 185b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void onQueryComplete(int token, Object cookie, Cursor c) { 186b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("onQueryComplete: cursor.count=" + c.getCount()); 187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCursor = c; 188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project setAdapter(); 189b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayProgress(false); 190b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 191b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 192b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 193b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void onInsertComplete(int token, Object cookie, 194b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Uri uri) { 195b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("onInsertComplete: requery"); 196b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project reQuery(); 197b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 198b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 200b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void onUpdateComplete(int token, Object cookie, int result) { 201b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("onUpdateComplete: requery"); 202b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project reQuery(); 203b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 205b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void onDeleteComplete(int token, Object cookie, int result) { 207b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("onDeleteComplete: requery"); 208b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project reQuery(); 209b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 210b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 211b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 212b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void log(String msg) { 213b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Log.d(TAG, "[ADNList] " + msg); 214b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 215b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project} 216