summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Yakavenka <ayakav@codeaurora.org>2013-11-01 16:21:29 -0700
committerSteve Kondik <shade@chemlab.org>2014-02-17 15:43:37 -0800
commit1c8c343d613e30ab27229c7678bf8f553c3cbe61 (patch)
tree6ff0d527df7ab259411c84c77404315f8bc96a12
parent8ccb1bf580ffafd172cb263f3b738dbf023293cd (diff)
downloadandroid_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.java177
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);
}