diff options
author | Alex Yakavenka <ayakav@codeaurora.org> | 2013-11-01 16:21:29 -0700 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2014-02-17 15:43:37 -0800 |
commit | 1c8c343d613e30ab27229c7678bf8f553c3cbe61 (patch) | |
tree | 6ff0d527df7ab259411c84c77404315f8bc96a12 | |
parent | 8ccb1bf580ffafd172cb263f3b738dbf023293cd (diff) | |
download | android_packages_providers_TelephonyProvider-1c8c343d613e30ab27229c7678bf8f553c3cbe61.tar.gz android_packages_providers_TelephonyProvider-1c8c343d613e30ab27229c7678bf8f553c3cbe61.tar.bz2 android_packages_providers_TelephonyProvider-1c8c343d613e30ab27229c7678bf8f553c3cbe61.zip |
Add initial preferred APN feature
-Add a new column "preferred" to the carriers database for initial
preferred APN setting.
-In multi-sim scenarios, each sim will have its own preferred APN
setting.
-Bump carriers table version to 9.
-Add preferred column when upgrading table to version 9.
Change-Id: Iad319ce371ced7e17ac6db1aaedd5c6e14da1cba
CRs-Fixed: 569452
-rw-r--r-- | src/com/android/providers/telephony/TelephonyProvider.java | 177 |
1 files changed, 163 insertions, 14 deletions
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java index 89f6dc4..c34eb05 100644 --- a/src/com/android/providers/telephony/TelephonyProvider.java +++ b/src/com/android/providers/telephony/TelephonyProvider.java @@ -33,13 +33,16 @@ import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.os.Environment; import android.provider.Telephony; +import android.telephony.MSimTelephonyManager; import android.text.TextUtils; import android.util.Log; import android.util.Xml; import com.android.internal.telephony.BaseCommands; +import com.android.internal.telephony.MSimConstants; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; +import com.android.internal.telephony.TelephonyProperties; import com.android.internal.util.XmlUtils; import org.xmlpull.v1.XmlPullParser; @@ -63,6 +66,7 @@ public class TelephonyProvider extends ContentProvider private static final int URL_RESTOREAPN = 4; private static final int URL_PREFERAPN = 5; private static final int URL_PREFERAPN_NO_UPDATE = 6; + private static final int URL_PREFERAPN_W_SUB_ID = 7; private static final String TAG = "TelephonyProvider"; private static final String CARRIERS_TABLE = "carriers"; @@ -84,6 +88,7 @@ public class TelephonyProvider extends ContentProvider s_urlMatcher.addURI("telephony", "carriers/restore", URL_RESTOREAPN); s_urlMatcher.addURI("telephony", "carriers/preferapn", URL_PREFERAPN); s_urlMatcher.addURI("telephony", "carriers/preferapn_no_update", URL_PREFERAPN_NO_UPDATE); + s_urlMatcher.addURI("telephony", "carriers/preferapn/#", URL_PREFERAPN_W_SUB_ID); s_currentNullMap = new ContentValues(1); s_currentNullMap.put("current", (Long) null); @@ -148,7 +153,8 @@ public class TelephonyProvider extends ContentProvider "carrier_enabled BOOLEAN," + "bearer INTEGER," + "mvno_type TEXT," + - "mvno_match_data TEXT);"); + "mvno_match_data TEXT," + + "preferred BOOLEAN DEFAULT 0);"); initDatabase(db); } @@ -261,10 +267,22 @@ public class TelephonyProvider extends ContentProvider oldVersion = 8 << 16 | 6; } if (oldVersion < (9 << 16 | 6)) { - // Add preferred field to the APN. The XML file does not change. - db.execSQL("ALTER TABLE " + CARRIERS_TABLE + - " ADD COLUMN preferred BOOLEAN DEFAULT 0;"); - oldVersion = 9 << 16 | 6; + // Add preferred field to the APN. + // The XML file does not change. + try { + db.execSQL("ALTER TABLE " + CARRIERS_TABLE + + " ADD COLUMN preferred BOOLEAN DEFAULT 0;"); + oldVersion = 9 << 16 | 6; + } catch (SQLException e) { + // Original implementation for preferred apn feature + // didn't include new version for database + // Consequently we can have version 8 database with and + // without preferred column + // Hence, this operation can result in exception + // (if column is already there) + // Just log it + Log.e(TAG, "Exception adding preferred column to database. ", e); + } } } @@ -350,6 +368,11 @@ public class TelephonyProvider extends ContentProvider map.put(Telephony.Carriers.MVNO_MATCH_DATA, mvno_match_data); } } + + String preferred = parser.getAttributeValue(null, "preferred"); + if (preferred != null) { + map.put(Telephony.Carriers.PREFERRED, Boolean.parseBoolean(preferred)); + } return map; } @@ -409,6 +432,10 @@ public class TelephonyProvider extends ContentProvider if (row.containsKey(Telephony.Carriers.MVNO_MATCH_DATA) == false) { row.put(Telephony.Carriers.MVNO_MATCH_DATA, ""); } + + if (row.containsKey(Telephony.Carriers.PREFERRED) == false) { + row.put(Telephony.Carriers.PREFERRED, false); + } db.insert(CARRIERS_TABLE, null, row); } } @@ -419,23 +446,97 @@ public class TelephonyProvider extends ContentProvider return true; } - private void setPreferredApnId(Long id) { + private String getColumnApnIdKey(int subId) { + String result = COLUMN_APN_ID; + // In case multi-sim is enabled, + // if subId is given, use column name "apn_id" + sub id; + // if subId is not given, use column name "apn_id" + preferred data sub id. + // + // In case multi-sim is not enabled, + // use column name "apn_id". + if (MSimTelephonyManager.getDefault().isMultiSimEnabled()) { + switch (subId) { + case MSimConstants.SUB1: + case MSimConstants.SUB2: + result += String.valueOf(subId); + break; + default: + result += String.valueOf(MSimTelephonyManager.getDefault() + .getPreferredDataSubscription()); + break; + } + } + Log.d(TAG, "Column apn id key is '" + result + "'"); + return result; + } + + private void setPreferredApnId(Long id, int subId) { SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); - editor.putLong(COLUMN_APN_ID, id != null ? id.longValue() : -1); + editor.putLong(getColumnApnIdKey(subId), id != null ? id.longValue() : -1); editor.apply(); } - private long getPreferredApnId() { + private void setPreferredApnId(Long id) { + setPreferredApnId(id, -1); + } + + private String getOperatorNumeric(int subId) { + if (subId != MSimConstants.SUB1 && subId != MSimConstants.SUB2) { + subId = MSimTelephonyManager.getDefault().getDefaultSubscription(); + } + String numeric = MSimTelephonyManager.getTelephonyProperty( + TelephonyProperties.PROPERTY_APN_SIM_OPERATOR_NUMERIC, subId, null); + if (numeric != null && numeric.length() > 0) { + return numeric; + } else { + return null; + } + } + + private long getPreferredApnId(int subId) { + long apnId; SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE); - long id = sp.getLong(COLUMN_APN_ID, -1); - if (id == -1) { - id = getDefaultPreferredApnId(); - if (id > -1) { - setPreferredApnId(id); + apnId = sp.getLong(getColumnApnIdKey(subId), -1); + if (apnId == -1) { + // Check if there is an initial preferred apn + String numeric = getOperatorNumeric(subId); + if (numeric != null) { + checkPermission(); + try { + SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); + qb.setTables("carriers"); + + String where; + where = "numeric=\"" + numeric + "\""; + where += " AND preferred = 1"; + + SQLiteDatabase db = mOpenHelper.getReadableDatabase(); + Cursor cursor = qb.query(db, new String[] {"_id"}, where, + null, null, null, Telephony.Carriers.DEFAULT_SORT_ORDER); + cursor.moveToFirst(); + if (!cursor.isAfterLast()) { + final int ID_INDEX = 0; + String key = cursor.getString(ID_INDEX); + apnId = Long.valueOf(key); + Log.d(TAG, "Found an inital preferred apn. id = " + apnId); + } else { + apnId = getDefaultPreferredApnId(); + if (apnId > -1) { + setPreferredApnId(apnId); + } + } + } catch (SQLException e) { + Log.e(TAG, "got exception while checking initial preferred apn: " + e); + } } } - return id; + + return apnId; + } + + private long getPreferredApnId() { + return getPreferredApnId(-1); } private long getDefaultPreferredApnId() { @@ -457,6 +558,17 @@ public class TelephonyProvider extends ContentProvider return id; } + private int parseSubId(Uri url) { + int subId = -1; + try { + subId = Integer.parseInt(url.getLastPathSegment()); + } catch (NumberFormatException e) { + Log.e(TAG, "NumberFormatException: ", e); + } + Log.d(TAG, "SUB ID in the uri is" + subId); + return subId; + } + @Override public Cursor query(Uri url, String[] projectionIn, String selection, String[] selectionArgs, String sort) { @@ -490,6 +602,11 @@ public class TelephonyProvider extends ContentProvider break; } + case URL_PREFERAPN_W_SUB_ID: { + qb.appendWhere("_id = " + getPreferredApnId(parseSubId(url))); + break; + } + default: { return null; } @@ -537,6 +654,7 @@ public class TelephonyProvider extends ContentProvider case URL_PREFERAPN: case URL_PREFERAPN_NO_UPDATE: + case URL_PREFERAPN_W_SUB_ID: return "vnd.android.cursor.item/telephony-carrier"; default: @@ -615,6 +733,9 @@ public class TelephonyProvider extends ContentProvider if (!values.containsKey(Telephony.Carriers.MVNO_MATCH_DATA)) { values.put(Telephony.Carriers.MVNO_MATCH_DATA, ""); } + if (!values.containsKey(Telephony.Carriers.PREFERRED)) { + values.put(Telephony.Carriers.PREFERRED, false); + } long rowID = db.insert(CARRIERS_TABLE, null, values); if (rowID > 0) @@ -659,6 +780,16 @@ public class TelephonyProvider extends ContentProvider } break; } + + case URL_PREFERAPN_W_SUB_ID: + { + if (initialValues != null) { + if(initialValues.containsKey(COLUMN_APN_ID)) { + setPreferredApnId(initialValues.getAsLong(COLUMN_APN_ID), parseSubId(url)); + } + } + break; + } } if (notify) { @@ -712,6 +843,13 @@ public class TelephonyProvider extends ContentProvider break; } + case URL_PREFERAPN_W_SUB_ID: + { + setPreferredApnId((long)-1, parseSubId(url)); + count = 1; + break; + } + default: { throw new UnsupportedOperationException("Cannot delete that URL: " + url); } @@ -770,6 +908,17 @@ public class TelephonyProvider extends ContentProvider break; } + case URL_PREFERAPN_W_SUB_ID: + { + if (values != null) { + if (values.containsKey(COLUMN_APN_ID)) { + setPreferredApnId(values.getAsLong(COLUMN_APN_ID), parseSubId(url)); + count = 1; + } + } + break; + } + default: { throw new UnsupportedOperationException("Cannot update that URL: " + url); } |