17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/*
27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2007 The Android Open Source Project
37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *
47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License");
57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License.
67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at
77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *
87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *      http://www.apache.org/licenses/LICENSE-2.0
97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *
107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software
117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS,
127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and
147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License.
157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */
167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone;
187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport static android.view.Window.PROGRESS_VISIBILITY_OFF;
207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport static android.view.Window.PROGRESS_VISIBILITY_ON;
217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ListActivity;
237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.AsyncQueryHandler;
247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ContentResolver;
257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context;
267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent;
277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.database.Cursor;
287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.Uri;
297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle;
307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.Settings;
317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log;
327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.Window;
337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.CursorAdapter;
347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.SimpleCursorAdapter;
357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.TextView;
367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/**
3830a294d9b5b6ae36bb057b70c9a76e6bcd365f2cSantos Cordon * Abbreviated Dial Numbers (ADN) list activity for the Phone app. By default, this class will show
3930a294d9b5b6ae36bb057b70c9a76e6bcd365f2cSantos Cordon * you all Service Dialing Numbers (SDN) that are supported by a service provider.  SDNs are a form
4030a294d9b5b6ae36bb057b70c9a76e6bcd365f2cSantos Cordon * of speed dial for accessing service provider contacts like "#MIN" for getting user minutes.
4130a294d9b5b6ae36bb057b70c9a76e6bcd365f2cSantos Cordon * To see this class in use, trigger the radio info screen by dialing *#*#INFO#*#* and open the
4230a294d9b5b6ae36bb057b70c9a76e6bcd365f2cSantos Cordon * menu.
4330a294d9b5b6ae36bb057b70c9a76e6bcd365f2cSantos Cordon * This class can also be used as a base class for simple contact lists that can be represented with
4430a294d9b5b6ae36bb057b70c9a76e6bcd365f2cSantos Cordon * only labels and numbers.
457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */
467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class ADNList extends ListActivity {
477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected static final String TAG = "ADNList";
487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected static final boolean DBG = false;
497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final String[] COLUMN_NAMES = new String[] {
517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        "name",
527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        "number",
537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        "emails"
547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    };
557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected static final int NAME_COLUMN = 0;
577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected static final int NUMBER_COLUMN = 1;
587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected static final int EMAILS_COLUMN = 2;
597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final int[] VIEW_NAMES = new int[] {
617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        android.R.id.text1,
627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        android.R.id.text2
637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    };
647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected static final int QUERY_TOKEN = 0;
667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected static final int INSERT_TOKEN = 1;
677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected static final int UPDATE_TOKEN = 2;
687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected static final int DELETE_TOKEN = 3;
697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected QueryHandler mQueryHandler;
727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected CursorAdapter mCursorAdapter;
737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected Cursor mCursor = null;
747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private TextView mEmptyText;
767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected int mInitialSelection = -1;
787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void onCreate(Bundle icicle) {
817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onCreate(icicle);
827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        setContentView(R.layout.adn_list);
847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mEmptyText = (TextView) findViewById(android.R.id.empty);
857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mQueryHandler = new QueryHandler(getContentResolver());
867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void onResume() {
907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onResume();
917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        query();
927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void onStop() {
967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onStop();
977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (mCursor != null) {
987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mCursor.deactivate();
997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected Uri resolveIntent() {
1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Intent intent = getIntent();
1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (intent.getData() == null) {
1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            intent.setData(Uri.parse("content://icc/adn"));
1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return intent.getData();
1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void query() {
1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Uri uri = resolveIntent();
1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (DBG) log("query: starting an async query");
1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mQueryHandler.startQuery(QUERY_TOKEN, null, uri, COLUMN_NAMES,
1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                null, null, null);
1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        displayProgress(true);
1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void reQuery() {
1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        query();
1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void setAdapter() {
1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // NOTE:
1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // As it it written, the positioning code below is NOT working.
1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // However, this current non-working state is in compliance with
1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // the UI paradigm, so we can't really do much to change it.
1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // In the future, if we wish to get this "positioning" correct,
1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // we'll need to do the following:
1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //   1. Change the layout to in the cursor adapter to:
1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //     android.R.layout.simple_list_item_checked
1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //   2. replace the selection / focus code with:
1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //     getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //     getListView().setItemChecked(mInitialSelection, true);
1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // Since the positioning is really only useful for the dialer's
1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // SpecialCharSequence case (dialing '2#' to get to the 2nd
1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // contact for instance), it doesn't make sense to mess with
1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // the usability of the activity just for this case.
1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // These artifacts include:
1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //  1. UI artifacts (checkbox and highlight at the same time)
1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //  2. Allowing the user to edit / create new SIM contacts when
1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //    the user is simply trying to retrieve a number into the d
1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //    dialer.
1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (mCursorAdapter == null) {
1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mCursorAdapter = newAdapter();
1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            setListAdapter(mCursorAdapter);
1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } else {
1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mCursorAdapter.changeCursor(mCursor);
1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (mInitialSelection >=0 && mInitialSelection < mCursorAdapter.getCount()) {
1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            setSelection(mInitialSelection);
1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            getListView().setFocusableInTouchMode(true);
1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            boolean gotfocus = getListView().requestFocus();
1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected CursorAdapter newAdapter() {
1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return new SimpleCursorAdapter(this,
1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    android.R.layout.simple_list_item_2,
1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mCursor, COLUMN_NAMES, VIEW_NAMES);
1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void displayProgress(boolean loading) {
1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (DBG) log("displayProgress: " + loading);
1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mEmptyText.setText(loading ? R.string.simContacts_emptyLoading:
1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            (isAirplaneModeOn(this) ? R.string.simContacts_airplaneMode :
1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                R.string.simContacts_empty));
1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        getWindow().setFeatureInt(
1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                Window.FEATURE_INDETERMINATE_PROGRESS,
1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                loading ? PROGRESS_VISIBILITY_ON : PROGRESS_VISIBILITY_OFF);
1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static boolean isAirplaneModeOn(Context context) {
1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return Settings.System.getInt(context.getContentResolver(),
1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                Settings.System.AIRPLANE_MODE_ON, 0) != 0;
1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private class QueryHandler extends AsyncQueryHandler {
1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        public QueryHandler(ContentResolver cr) {
1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            super(cr);
1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        @Override
1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        protected void onQueryComplete(int token, Object cookie, Cursor c) {
1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (DBG) log("onQueryComplete: cursor.count=" + c.getCount());
1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mCursor = c;
1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            setAdapter();
1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            displayProgress(false);
1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            // Cursor is refreshed and inherited classes may have menu items depending on it.
1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            invalidateOptionsMenu();
1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        @Override
2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        protected void onInsertComplete(int token, Object cookie, Uri uri) {
2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (DBG) log("onInsertComplete: requery");
2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            reQuery();
2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        @Override
2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        protected void onUpdateComplete(int token, Object cookie, int result) {
2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (DBG) log("onUpdateComplete: requery");
2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            reQuery();
2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        @Override
2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        protected void onDeleteComplete(int token, Object cookie, int result) {
2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (DBG) log("onDeleteComplete: requery");
2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            reQuery();
2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void log(String msg) {
2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Log.d(TAG, "[ADNList] " + msg);
2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon}
224