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