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