1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/*
2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project
3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License");
5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License.
6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at
7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *      http://www.apache.org/licenses/LICENSE-2.0
9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software
11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS,
12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and
14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License.
15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.ui.appsettings;
18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.app.Activity;
20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.app.Dialog;
21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.app.ProgressDialog;
22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.ContentValues;
23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context;
24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.database.Cursor;
25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.database.sqlite.SQLiteDatabase;
26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.AsyncTask;
27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Bundle;
28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Handler;
29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.HandlerThread;
30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Looper;
31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Message;
32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.UserManager;
33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.preference.Preference;
34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.preference.PreferenceFragment;
35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.preference.PreferenceGroup;
36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.preference.PreferenceScreen;
37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.provider.Telephony;
38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.support.v4.app.NavUtils;
39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.Menu;
40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.MenuInflater;
41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.MenuItem;
42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.widget.ListView;
43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.widget.TextView;
44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.widget.Toast;
45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.R;
47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ParticipantData;
48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.sms.ApnDatabase;
49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.sms.BugleApnSettingsLoader;
50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.BugleActionBarActivity;
51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.UIIntents;
52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.OsUtil;
53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.PhoneUtils;
54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class ApnSettingsActivity extends BugleActionBarActivity {
56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int DIALOG_RESTORE_DEFAULTAPN = 1001;
57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    protected void onCreate(Bundle savedInstanceState) {
60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        super.onCreate(savedInstanceState);
61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Display the fragment as the main content.
65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final ApnSettingsFragment fragment = new ApnSettingsFragment();
66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        fragment.setSubId(getIntent().getIntExtra(UIIntents.UI_INTENT_EXTRA_SUB_ID,
67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ParticipantData.DEFAULT_SELF_SUB_ID));
68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        getFragmentManager().beginTransaction()
69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                .replace(android.R.id.content, fragment)
70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                .commit();
71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean onOptionsItemSelected(final MenuItem item) {
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        switch (item.getItemId()) {
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        case android.R.id.home:
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            NavUtils.navigateUpFromSameTask(this);
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return true;
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return super.onOptionsItemSelected(item);
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    protected Dialog onCreateDialog(int id) {
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (id == DIALOG_RESTORE_DEFAULTAPN) {
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            ProgressDialog dialog = new ProgressDialog(this);
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            dialog.setMessage(getResources().getString(R.string.restore_default_apn));
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            dialog.setCancelable(false);
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return dialog;
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return null;
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static class ApnSettingsFragment extends PreferenceFragment implements
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Preference.OnPreferenceChangeListener {
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public static final String EXTRA_POSITION = "position";
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public static final String APN_ID = "apn_id";
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final String[] APN_PROJECTION = {
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Telephony.Carriers._ID,         // 0
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Telephony.Carriers.NAME,        // 1
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Telephony.Carriers.APN,         // 2
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Telephony.Carriers.TYPE         // 3
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        };
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final int ID_INDEX    = 0;
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final int NAME_INDEX  = 1;
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final int APN_INDEX   = 2;
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final int TYPES_INDEX = 3;
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final int MENU_NEW = Menu.FIRST;
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final int MENU_RESTORE = Menu.FIRST + 1;
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final int EVENT_RESTORE_DEFAULTAPN_START = 1;
115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final int EVENT_RESTORE_DEFAULTAPN_COMPLETE = 2;
116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static boolean mRestoreDefaultApnMode;
118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private RestoreApnUiHandler mRestoreApnUiHandler;
120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private RestoreApnProcessHandler mRestoreApnProcessHandler;
121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private HandlerThread mRestoreDefaultApnThread;
122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private String mSelectedKey;
124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final ContentValues sCurrentNullMap;
126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final ContentValues sCurrentSetMap;
127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private UserManager mUm;
129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private boolean mUnavailable;
131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private int mSubId;
132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        static {
134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            sCurrentNullMap = new ContentValues(1);
135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            sCurrentNullMap.putNull(Telephony.Carriers.CURRENT);
136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            sCurrentSetMap = new ContentValues(1);
138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            sCurrentSetMap.put(Telephony.Carriers.CURRENT, "2");    // 2 for user-selected APN,
139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // 1 for Bugle-selected APN
140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private SQLiteDatabase mDatabase;
143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void setSubId(final int subId) {
145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mSubId = subId;
146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onCreate(Bundle icicle) {
150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            super.onCreate(icicle);
151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mDatabase = ApnDatabase.getApnDatabase().getWritableDatabase();
153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (OsUtil.isAtLeastL()) {
155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mUm = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                if (!mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    setHasOptionsMenu(true);
158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            } else {
160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                setHasOptionsMenu(true);
161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onActivityCreated(Bundle savedInstanceState) {
166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            super.onActivityCreated(savedInstanceState);
167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final ListView lv = (ListView) getView().findViewById(android.R.id.list);
169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            TextView empty = (TextView) getView().findViewById(android.R.id.empty);
170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (empty != null) {
171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                empty.setText(R.string.apn_settings_not_available);
172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                lv.setEmptyView(empty);
173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (OsUtil.isAtLeastL() &&
176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mUnavailable = true;
178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getActivity()));
179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return;
180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            addPreferencesFromResource(R.xml.apn_settings);
183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            lv.setItemsCanFocus(true);
185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onResume() {
189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            super.onResume();
190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mUnavailable) {
192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return;
193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (!mRestoreDefaultApnMode) {
196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                fillList();
197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onPause() {
202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            super.onPause();
203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mUnavailable) {
205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return;
206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onDestroy() {
211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            super.onDestroy();
212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mRestoreDefaultApnThread != null) {
214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mRestoreDefaultApnThread.quit();
215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private void fillList() {
219d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final String mccMnc = PhoneUtils.getMccMncString(PhoneUtils.get(mSubId).getMccMnc());
220d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
221d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            new AsyncTask<Void, Void, Cursor>() {
222d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                @Override
223d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                protected Cursor doInBackground(Void... params) {
224d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    String selection = Telephony.Carriers.NUMERIC + " =?";
225d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    String[] selectionArgs = new String[]{ mccMnc };
226d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    final Cursor cursor = mDatabase.query(ApnDatabase.APN_TABLE, APN_PROJECTION,
227d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            selection, selectionArgs, null, null, null, null);
228d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    return cursor;
229d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
230d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
231d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                @Override
232d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                protected void onPostExecute(Cursor cursor) {
233d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    if (cursor != null) {
234d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        try {
235d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            PreferenceGroup apnList = (PreferenceGroup)
236d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    findPreference(getString(R.string.apn_list_pref_key));
237d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            apnList.removeAll();
238d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
239d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            mSelectedKey = BugleApnSettingsLoader.getFirstTryApn(mDatabase, mccMnc);
240d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            while (cursor.moveToNext()) {
241d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                String name = cursor.getString(NAME_INDEX);
242d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                String apn = cursor.getString(APN_INDEX);
243d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                String key = cursor.getString(ID_INDEX);
244d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                String type = cursor.getString(TYPES_INDEX);
245d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
246d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                if (BugleApnSettingsLoader.isValidApnType(type,
247d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                        BugleApnSettingsLoader.APN_TYPE_MMS)) {
248d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    ApnPreference pref = new ApnPreference(getActivity());
249d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    pref.setKey(key);
250d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    pref.setTitle(name);
251d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    pref.setSummary(apn);
252d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    pref.setPersistent(false);
253d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    pref.setOnPreferenceChangeListener(ApnSettingsFragment.this);
254d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    pref.setSelectable(true);
255d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
256d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    // Turn on the radio button for the currently selected APN. If
257d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    // there is no selected APN, don't select an APN.
258d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    if ((mSelectedKey != null && mSelectedKey.equals(key))) {
259d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                        pref.setChecked();
260d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    }
261d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                    apnList.addPreference(pref);
262d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                }
263d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            }
264d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        } finally {
265d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            cursor.close();
266d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        }
267d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
268d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
269d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }.execute((Void) null);
270d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
271d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
272d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
273d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
274d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (!mUnavailable) {
275d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                menu.add(0, MENU_NEW, 0,
276d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        getResources().getString(R.string.menu_new_apn))
277d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        .setIcon(R.drawable.ic_add_gray)
278d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
279d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                menu.add(0, MENU_RESTORE, 0,
280d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        getResources().getString(R.string.menu_restore_default_apn))
281d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        .setIcon(android.R.drawable.ic_menu_upload);
282d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
283d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
284d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            super.onCreateOptionsMenu(menu, inflater);
285d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
286d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
287d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
288d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean onOptionsItemSelected(MenuItem item) {
289d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            switch (item.getItemId()) {
290d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                case MENU_NEW:
291d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    addNewApn();
292d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    return true;
293d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
294d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                case MENU_RESTORE:
295d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    restoreDefaultApn();
296d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    return true;
297d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
298d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return super.onOptionsItemSelected(item);
299d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
300d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
301d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private void addNewApn() {
302d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            startActivity(UIIntents.get().getApnEditorIntent(getActivity(), null, mSubId));
303d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
304d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
305d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
306d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
307d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                Preference preference) {
308d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            startActivity(
309d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    UIIntents.get().getApnEditorIntent(getActivity(), preference.getKey(), mSubId));
310d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return true;
311d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
312d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
313d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
314d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean onPreferenceChange(Preference preference, Object newValue) {
315d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (newValue instanceof String) {
316d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                setSelectedApnKey((String) newValue);
317d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
318d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
319d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return true;
320d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
321d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
322d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // current=2 means user selected APN
323d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final String UPDATE_SELECTION = Telephony.Carriers.CURRENT + " =?";
324d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private static final String[] UPDATE_SELECTION_ARGS = new String[] { "2" };
325d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private void setSelectedApnKey(final String key) {
326d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mSelectedKey = key;
327d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
328d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // Make database changes not on the UI thread
329d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            new AsyncTask<Void, Void, Void>() {
330d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                @Override
331d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                protected Void doInBackground(Void... params) {
332d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    // null out the previous "current=2" APN
333d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    mDatabase.update(ApnDatabase.APN_TABLE, sCurrentNullMap,
334d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            UPDATE_SELECTION, UPDATE_SELECTION_ARGS);
335d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
336d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    // set the new "current" APN (2)
337d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    String selection = Telephony.Carriers._ID + " =?";
338d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    String[] selectionArgs = new String[]{ key };
339d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
340d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    mDatabase.update(ApnDatabase.APN_TABLE, sCurrentSetMap,
341d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            selection, selectionArgs);
342d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    return null;
343d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
344d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }.execute((Void) null);
345d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
346d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
347d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private boolean restoreDefaultApn() {
348d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            getActivity().showDialog(DIALOG_RESTORE_DEFAULTAPN);
349d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mRestoreDefaultApnMode = true;
350d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
351d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mRestoreApnUiHandler == null) {
352d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mRestoreApnUiHandler = new RestoreApnUiHandler();
353d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
354d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
355d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mRestoreApnProcessHandler == null ||
356d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    mRestoreDefaultApnThread == null) {
357d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mRestoreDefaultApnThread = new HandlerThread(
358d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "Restore default APN Handler: Process Thread");
359d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mRestoreDefaultApnThread.start();
360d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mRestoreApnProcessHandler = new RestoreApnProcessHandler(
361d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mRestoreDefaultApnThread.getLooper(), mRestoreApnUiHandler);
362d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
363d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
364d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mRestoreApnProcessHandler.sendEmptyMessage(EVENT_RESTORE_DEFAULTAPN_START);
365d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return true;
366d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
367d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
368d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private class RestoreApnUiHandler extends Handler {
369d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            @Override
370d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            public void handleMessage(Message msg) {
371d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                switch (msg.what) {
372d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    case EVENT_RESTORE_DEFAULTAPN_COMPLETE:
373d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        fillList();
374d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        getPreferenceScreen().setEnabled(true);
375d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mRestoreDefaultApnMode = false;
376d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        final Activity activity = getActivity();
377d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        activity.dismissDialog(DIALOG_RESTORE_DEFAULTAPN);
378d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        Toast.makeText(activity, getResources().getString(
379d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                        R.string.restore_default_apn_completed), Toast.LENGTH_LONG)
380d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                            .show();
381d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        break;
382d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
383d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
384d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
385d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
386d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private class RestoreApnProcessHandler extends Handler {
387d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            private Handler mCachedRestoreApnUiHandler;
388d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
389d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            public RestoreApnProcessHandler(Looper looper, Handler restoreApnUiHandler) {
390d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                super(looper);
391d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                this.mCachedRestoreApnUiHandler = restoreApnUiHandler;
392d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
393d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
394d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            @Override
395d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            public void handleMessage(Message msg) {
396d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                switch (msg.what) {
397d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    case EVENT_RESTORE_DEFAULTAPN_START:
398d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        ApnDatabase.forceBuildAndLoadApnTables();
399d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mCachedRestoreApnUiHandler.sendEmptyMessage(
400d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                EVENT_RESTORE_DEFAULTAPN_COMPLETE);
401d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        break;
402d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
403d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
404d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
405d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
406d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
407