diff --git a/res/xml/apns.xml b/res/xml/apns.xml deleted file mode 100644 index 20de298..0000000 --- a/res/xml/apns.xml +++ /dev/null @@ -1,3284 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/android/support/v7/mms/DefaultApnSettingsLoader.java b/src/android/support/v7/mms/DefaultApnSettingsLoader.java index e92c4b8..9da4b4a 100644 --- a/src/android/support/v7/mms/DefaultApnSettingsLoader.java +++ b/src/android/support/v7/mms/DefaultApnSettingsLoader.java @@ -1,6 +1,6 @@ /* * Copyright (C) 2015 The Android Open Source Project - * Copyright (C) 2024 The LineageOS Project + * Copyright (C) 2024-2025 The LineageOS Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +18,6 @@ package android.support.v7.mms; import android.content.Context; -import android.content.res.Resources; -import android.content.res.XmlResourceParser; import android.database.Cursor; import android.database.sqlite.SQLiteException; import android.net.Uri; @@ -28,8 +26,6 @@ import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; -import com.android.messaging.R; - import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; @@ -112,95 +108,6 @@ class DefaultApnSettingsLoader implements ApnSettingsLoader { public void setSuccess() { // Do nothing } - - public boolean equals(final BaseApn other) { - return TextUtils.equals(mMmsc, other.getMmsc()) && - TextUtils.equals(mMmsProxy, other.getMmsProxy()) && - mMmsProxyPort == other.getMmsProxyPort(); - } - } - - /** - * An in-memory implementation of an APN. These APNs are organized into an in-memory list. - * The order of the list can be changed by the setSuccess method. - */ - private static class MemoryApn implements Apn { - /** - * Create an in-memory APN loaded from resources - * - * @param apns the in-memory APN list - * @param typesIn the APN type field - * @param mmscIn the APN mmsc field - * @param proxyIn the APN mmsproxy field - * @param portIn the APN mmsport field - * @return an in-memory APN instance, null if there is invalid parameter - */ - public static MemoryApn from(final List apns, final String typesIn, - final String mmscIn, final String proxyIn, final String portIn) { - if (apns == null) { - return null; - } - final BaseApn base = BaseApn.from(typesIn, mmscIn, proxyIn, portIn); - if (base == null) { - return null; - } - for (final Apn apn : apns) { - if (apn instanceof MemoryApn && ((MemoryApn) apn).equals(base)) { - return null; - } - } - return new MemoryApn(apns, base); - } - - private final List mApns; - private final BaseApn mBase; - - public MemoryApn(final List apns, final BaseApn base) { - mApns = apns; - mBase = base; - } - - @Override - public String getMmsc() { - return mBase.getMmsc(); - } - - @Override - public String getMmsProxy() { - return mBase.getMmsProxy(); - } - - @Override - public int getMmsProxyPort() { - return mBase.getMmsProxyPort(); - } - - @Override - public void setSuccess() { - // If this is being marked as a successful APN, move it to the top of the list so - // next time it will be tried first - boolean moved = false; - synchronized (mApns) { - if (mApns.get(0) != this) { - mApns.remove(this); - mApns.add(0, this); - moved = true; - } - } - if (moved) { - Log.d(MmsService.TAG, "Set APN [" - + "MMSC=" + getMmsc() + ", " - + "PROXY=" + getMmsProxy() + ", " - + "PORT=" + getMmsProxyPort() + "] to be first"); - } - } - - public boolean equals(final BaseApn other) { - if (other == null) { - return false; - } - return mBase.equals(other); - } } /** @@ -222,14 +129,6 @@ class DefaultApnSettingsLoader implements ApnSettingsLoader { private static final int COLUMN_MMSPROXY = 2; private static final int COLUMN_MMSPORT = 3; - private static final String APN_MCC = "mcc"; - private static final String APN_MNC = "mnc"; - private static final String APN_APN = "apn"; - private static final String APN_TYPE = "type"; - private static final String APN_MMSC = "mmsc"; - private static final String APN_MMSPROXY = "mmsproxy"; - private static final String APN_MMSPORT = "mmsport"; - private final Context mContext; // Cached APNs for subIds @@ -263,16 +162,6 @@ class DefaultApnSettingsLoader implements ApnSettingsLoader { private void loadLocked(final int subId, final String apnName, final List apns) { // Try system APN table first loadFromSystem(subId, apnName, apns); - if (apns.size() > 0) { - return; - } - // Try loading from apns.xml in resources - loadFromResources(subId, apnName, apns); - if (apns.size() > 0) { - return; - } - // Try resources but without APN name - loadFromResources(subId, null/*apnName*/, apns); } /** @@ -384,48 +273,6 @@ class DefaultApnSettingsLoader implements ApnSettingsLoader { return null; } - /** - * Find matching APNs using builtin APN list resource - * - * @param subId the SIM subId - * @param apnName the APN name to match - * @param apns the list for returning results - */ - private void loadFromResources(final int subId, final String apnName, final List apns) { - Log.i(MmsService.TAG, "Loading APNs from resources, apnName=" + apnName); - final int[] mccMnc = Utils.getMccMnc(mContext, subId); - if (mccMnc[0] == 0) { - Log.w(MmsService.TAG, "Can not get valid mcc/mnc from system"); - return; - } - // MCC/MNC is good, loading/querying APNs from XML - try (XmlResourceParser xml = mContext.getResources().getXml(R.xml.apns)) { - new ApnsXmlParser(xml, apnValues -> { - final String mcc = trimWithNullCheck(apnValues.getAsString(APN_MCC)); - final String mnc = trimWithNullCheck(apnValues.getAsString(APN_MNC)); - final String apn = trimWithNullCheck(apnValues.getAsString(APN_APN)); - try { - if (mccMnc[0] == Integer.parseInt(mcc) && - mccMnc[1] == Integer.parseInt(mnc) && - (TextUtils.isEmpty(apnName) || apnName.equalsIgnoreCase(apn))) { - final String type = apnValues.getAsString(APN_TYPE); - final String mmsc = apnValues.getAsString(APN_MMSC); - final String mmsproxy = apnValues.getAsString(APN_MMSPROXY); - final String mmsport = apnValues.getAsString(APN_MMSPORT); - final Apn newApn = MemoryApn.from(apns, type, mmsc, mmsproxy, mmsport); - if (newApn != null) { - apns.add(newApn); - } - } - } catch (final NumberFormatException e) { - // Ignore - } - }).parse(); - } catch (final Resources.NotFoundException e) { - Log.w(MmsService.TAG, "Can not get apns.xml " + e); - } - } - private static String trimWithNullCheck(final String value) { return value != null ? value.trim() : null; } diff --git a/src/com/android/messaging/BugleApplication.java b/src/com/android/messaging/BugleApplication.java index b0b4720..829d4f5 100644 --- a/src/com/android/messaging/BugleApplication.java +++ b/src/com/android/messaging/BugleApplication.java @@ -32,7 +32,6 @@ import androidx.annotation.NonNull; import com.android.messaging.datamodel.DataModel; import com.android.messaging.receiver.SmsReceiver; -import com.android.messaging.sms.ApnDatabase; import com.android.messaging.sms.BugleApnSettingsLoader; import com.android.messaging.sms.BugleUserAgentInfoLoader; import com.android.messaging.sms.MmsConfig; @@ -85,8 +84,6 @@ public class BugleApplication extends Application implements UncaughtExceptionHa // Initialize MMS lib initMmsLib(context, carrierConfigValuesLoader); - // Initialize APN database - ApnDatabase.initializeAppContext(context); // Fixup messages in flight if we crashed and send any pending dataModel.onApplicationCreated(); // Register carrier config change receiver diff --git a/src/com/android/messaging/sms/ApnDatabase.java b/src/com/android/messaging/sms/ApnDatabase.java deleted file mode 100644 index 9bcb8f2..0000000 --- a/src/com/android/messaging/sms/ApnDatabase.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * Copyright (C) 2024-2025 The LineageOS Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.messaging.sms; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.XmlResourceParser; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.provider.Telephony; -import android.util.Log; - -import com.android.messaging.R; -import com.android.messaging.datamodel.data.ParticipantData; -import com.android.messaging.util.LogUtil; - -import java.io.File; - -/* - * Database helper class for looking up APNs. This database has a single table - * which stores the APNs that are initially created from an xml file. - */ -public class ApnDatabase extends SQLiteOpenHelper { - private static final int DB_VERSION = 3; // added sub_id columns - - private static final String TAG = LogUtil.BUGLE_TAG; - - private static final boolean DEBUG = false; - - private static Context sContext; - private static ApnDatabase sApnDatabase; - - private static final String APN_DATABASE_NAME = "apn.db"; - - /** table for carrier APN's */ - public static final String APN_TABLE = "apn"; - - // APN table - private static final String APN_TABLE_SQL = - "CREATE TABLE " + APN_TABLE + - "(_id INTEGER PRIMARY KEY," + - Telephony.Carriers.NAME + " TEXT," + - Telephony.Carriers.NUMERIC + " TEXT," + - Telephony.Carriers.MCC + " TEXT," + - Telephony.Carriers.MNC + " TEXT," + - Telephony.Carriers.APN + " TEXT," + - Telephony.Carriers.USER + " TEXT," + - Telephony.Carriers.SERVER + " TEXT," + - Telephony.Carriers.PASSWORD + " TEXT," + - Telephony.Carriers.PROXY + " TEXT," + - Telephony.Carriers.PORT + " TEXT," + - Telephony.Carriers.MMSPROXY + " TEXT," + - Telephony.Carriers.MMSPORT + " TEXT," + - Telephony.Carriers.MMSC + " TEXT," + - Telephony.Carriers.AUTH_TYPE + " INTEGER," + - Telephony.Carriers.TYPE + " TEXT," + - Telephony.Carriers.CURRENT + " INTEGER," + - Telephony.Carriers.PROTOCOL + " TEXT," + - Telephony.Carriers.ROAMING_PROTOCOL + " TEXT," + - Telephony.Carriers.CARRIER_ENABLED + " BOOLEAN," + - Telephony.Carriers.BEARER + " INTEGER," + - Telephony.Carriers.MVNO_TYPE + " TEXT," + - Telephony.Carriers.MVNO_MATCH_DATA + " TEXT," + - Telephony.Carriers.SUBSCRIPTION_ID + " INTEGER DEFAULT " + - ParticipantData.DEFAULT_SELF_SUB_ID + ");"; - public static final int COLUMN_ID = 4; - - /** - * ApnDatabase is initialized asynchronously from the application.onCreate - * To ensure that it works in a testing environment it needs to never access the factory context - */ - public static void initializeAppContext(final Context context) { - sContext = context; - } - - private ApnDatabase() { - super(sContext, APN_DATABASE_NAME, null, DB_VERSION); - if (DEBUG) { - LogUtil.d(TAG, "ApnDatabase constructor"); - } - } - - public static ApnDatabase getApnDatabase() { - if (sApnDatabase == null) { - sApnDatabase = new ApnDatabase(); - } - return sApnDatabase; - } - - public static boolean doesDatabaseExist() { - final File dbFile = sContext.getDatabasePath(APN_DATABASE_NAME); - return dbFile.exists(); - } - - @Override - public void onCreate(final SQLiteDatabase db) { - if (DEBUG) { - LogUtil.d(TAG, "ApnDatabase onCreate"); - } - // Build the table using defaults (apn info bundled with the app) - rebuildTables(db); - } - - @Override - public void onOpen(final SQLiteDatabase db) { - super.onOpen(db); - if (DEBUG) { - LogUtil.d(TAG, "ApnDatabase onOpen"); - } - } - - @Override - public void close() { - super.close(); - if (DEBUG) { - LogUtil.d(TAG, "ApnDatabase close"); - } - } - - private void rebuildTables(final SQLiteDatabase db) { - if (DEBUG) { - LogUtil.d(TAG, "ApnDatabase rebuildTables"); - } - db.execSQL("DROP TABLE IF EXISTS " + APN_TABLE + ";"); - db.execSQL(APN_TABLE_SQL); - loadApnTable(db); - } - - @Override - public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { - if (DEBUG) { - LogUtil.d(TAG, "ApnDatabase onUpgrade"); - } - rebuildTables(db); - } - - @Override - public void onDowngrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { - if (DEBUG) { - LogUtil.d(TAG, "ApnDatabase onDowngrade"); - } - rebuildTables(db); - } - - /** - * Load APN table from app resources - */ - private static void loadApnTable(final SQLiteDatabase db) { - LogUtil.v(TAG, "ApnDatabase loadApnTable"); - final Resources r = sContext.getResources(); - final XmlResourceParser parser = r.getXml(R.xml.apns); - final ApnsXmlProcessor processor = ApnsXmlProcessor.get(parser); - processor.setApnHandler(apnValues -> db.insert(APN_TABLE, null/*nullColumnHack*/, - apnValues)); - try { - processor.process(); - } catch (final Exception e) { - Log.e(TAG, "Got exception while loading APN database.", e); - } finally { - parser.close(); - } - } - - public static void forceBuildAndLoadApnTables() { - final SQLiteDatabase db = getApnDatabase().getWritableDatabase(); - db.execSQL("DROP TABLE IF EXISTS " + APN_TABLE); - // Table(s) always need for JB MR1 for APN support for MMS because JB MR1 throws - // a SecurityException when trying to access the carriers table (which holds the - // APNs). Some JB MR2 devices also throw the security exception, so we're building - // the table for JB MR2, too. - db.execSQL(APN_TABLE_SQL); - - loadApnTable(db); - } -} diff --git a/src/com/android/messaging/sms/ApnsXmlProcessor.java b/src/com/android/messaging/sms/ApnsXmlProcessor.java index 5083f3d..6d8a1c7 100644 --- a/src/com/android/messaging/sms/ApnsXmlProcessor.java +++ b/src/com/android/messaging/sms/ApnsXmlProcessor.java @@ -1,6 +1,6 @@ /* * Copyright (C) 2015 The Android Open Source Project - * Copyright (C) 2024 The LineageOS Project + * Copyright (C) 2024-2025 The LineageOS Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,18 +18,15 @@ package com.android.messaging.sms; import android.content.ContentValues; -import android.provider.Telephony; import com.android.messaging.util.Assert; import com.android.messaging.util.LogUtil; import com.android.messaging.util.PhoneUtils; -import com.google.common.collect.Maps; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; -import java.util.Map; /* * XML processor for the following files: @@ -37,46 +34,14 @@ import java.util.Map; * 2. res/xml/mms_config.xml (or related overlay files) */ class ApnsXmlProcessor { - public interface ApnHandler { - void process(ContentValues apnValues); - } - public interface MmsConfigHandler { void process(String mccMnc, String key, String value, String type); } private static final String TAG = LogUtil.BUGLE_TAG; - private static final Map APN_ATTRIBUTE_MAP = Maps.newHashMap(); - static { - APN_ATTRIBUTE_MAP.put("mcc", Telephony.Carriers.MCC); - APN_ATTRIBUTE_MAP.put("mnc", Telephony.Carriers.MNC); - APN_ATTRIBUTE_MAP.put("carrier", Telephony.Carriers.NAME); - APN_ATTRIBUTE_MAP.put("apn", Telephony.Carriers.APN); - APN_ATTRIBUTE_MAP.put("mmsc", Telephony.Carriers.MMSC); - APN_ATTRIBUTE_MAP.put("mmsproxy", Telephony.Carriers.MMSPROXY); - APN_ATTRIBUTE_MAP.put("mmsport", Telephony.Carriers.MMSPORT); - APN_ATTRIBUTE_MAP.put("type", Telephony.Carriers.TYPE); - APN_ATTRIBUTE_MAP.put("user", Telephony.Carriers.USER); - APN_ATTRIBUTE_MAP.put("password", Telephony.Carriers.PASSWORD); - APN_ATTRIBUTE_MAP.put("authtype", Telephony.Carriers.AUTH_TYPE); - APN_ATTRIBUTE_MAP.put("mvno_match_data", Telephony.Carriers.MVNO_MATCH_DATA); - APN_ATTRIBUTE_MAP.put("mvno_type", Telephony.Carriers.MVNO_TYPE); - APN_ATTRIBUTE_MAP.put("protocol", Telephony.Carriers.PROTOCOL); - APN_ATTRIBUTE_MAP.put("bearer", Telephony.Carriers.BEARER); - APN_ATTRIBUTE_MAP.put("server", Telephony.Carriers.SERVER); - APN_ATTRIBUTE_MAP.put("roaming_protocol", Telephony.Carriers.ROAMING_PROTOCOL); - APN_ATTRIBUTE_MAP.put("proxy", Telephony.Carriers.PROXY); - APN_ATTRIBUTE_MAP.put("port", Telephony.Carriers.PORT); - APN_ATTRIBUTE_MAP.put("carrier_enabled", Telephony.Carriers.CARRIER_ENABLED); - } - - private static final String TAG_APNS = "apns"; - private static final String TAG_APN = "apn"; private static final String TAG_MMS_CONFIG = "mms_config"; - // Handler to process one apn - private ApnHandler mApnHandler; // Handler to process one mms_config key/value pair private MmsConfigHandler mMmsConfigHandler; @@ -86,7 +51,6 @@ class ApnsXmlProcessor { private ApnsXmlProcessor(XmlPullParser parser) { mInputParser = parser; - mApnHandler = null; mMmsConfigHandler = null; } @@ -95,11 +59,6 @@ class ApnsXmlProcessor { return new ApnsXmlProcessor(parser); } - public ApnsXmlProcessor setApnHandler(ApnHandler handler) { - mApnHandler = handler; - return this; - } - public ApnsXmlProcessor setMmsConfigHandler(MmsConfigHandler handler) { mMmsConfigHandler = handler; return this; @@ -131,22 +90,8 @@ class ApnsXmlProcessor { // an apn element final ContentValues values = new ContentValues(); String tagName = mInputParser.getName(); - // Top level tag can be "apns" (apns.xml) - // or "mms_config" (mms_config.xml) - if (TAG_APNS.equals(tagName)) { - // For "apns", there could be "apn" or both "apn" and "mms_config" - for (;;) { - if (advanceToNextEvent(XmlPullParser.START_TAG) != XmlPullParser.START_TAG) { - break; - } - tagName = mInputParser.getName(); - if (TAG_APN.equals(tagName)) { - processApn(values); - } else if (TAG_MMS_CONFIG.equals(tagName)) { - processMmsConfig(); - } - } - } else if (TAG_MMS_CONFIG.equals(tagName)) { + // Top level tag can be "mms_config" (mms_config.xml) + if (TAG_MMS_CONFIG.equals(tagName)) { // mms_config.xml resource processMmsConfig(); } @@ -157,28 +102,6 @@ class ApnsXmlProcessor { } } - private Integer parseInt(String text, Integer defaultValue, String logHint) { - Integer value = defaultValue; - try { - value = Integer.parseInt(text); - } catch (Exception e) { - LogUtil.e(TAG, - "Invalid value " + text + "for" + logHint + " @" + xmlParserDebugContext()); - } - return value; - } - - private Boolean parseBoolean(String text, Boolean defaultValue, String logHint) { - Boolean value = defaultValue; - try { - value = Boolean.parseBoolean(text); - } catch (Exception e) { - LogUtil.e(TAG, - "Invalid value " + text + "for" + logHint + " @" + xmlParserDebugContext()); - } - return value; - } - private static String xmlParserEventString(int event) { switch (event) { case XmlPullParser.START_DOCUMENT: return "START_DOCUMENT"; @@ -219,51 +142,6 @@ class ApnsXmlProcessor { return "Unknown"; } - /** - * Process one apn - * - * @param apnValues Where we store the parsed apn - */ - private void processApn(ContentValues apnValues) throws IOException, XmlPullParserException { - Assert.notNull(apnValues); - apnValues.clear(); - // Collect all the attributes - for (int i = 0; i < mInputParser.getAttributeCount(); i++) { - final String key = APN_ATTRIBUTE_MAP.get(mInputParser.getAttributeName(i)); - if (key != null) { - apnValues.put(key, mInputParser.getAttributeValue(i)); - } - } - // Set numeric to be canonicalized mcc/mnc like "310120", always 6 digits - final String canonicalMccMnc = PhoneUtils.canonicalizeMccMnc( - apnValues.getAsString(Telephony.Carriers.MCC), - apnValues.getAsString(Telephony.Carriers.MNC)); - apnValues.put(Telephony.Carriers.NUMERIC, canonicalMccMnc); - // Some of the values should not be string type, converting them to desired types - final String authType = apnValues.getAsString(Telephony.Carriers.AUTH_TYPE); - if (authType != null) { - apnValues.put(Telephony.Carriers.AUTH_TYPE, parseInt(authType, -1, "apn authtype")); - } - final String carrierEnabled = apnValues.getAsString(Telephony.Carriers.CARRIER_ENABLED); - if (carrierEnabled != null) { - apnValues.put(Telephony.Carriers.CARRIER_ENABLED, - parseBoolean(carrierEnabled, null, "apn carrierEnabled")); - } - final String bearer = apnValues.getAsString(Telephony.Carriers.BEARER); - if (bearer != null) { - apnValues.put(Telephony.Carriers.BEARER, parseInt(bearer, 0, "apn bearer")); - } - // We are at the end tag - if (mInputParser.next() != XmlPullParser.END_TAG) { - throw new XmlPullParserException("Apn: expecting end tag @" - + xmlParserDebugContext()); - } - // We are done parsing one APN, call the handler - if (mApnHandler != null) { - mApnHandler.process(apnValues); - } - } - /** * Process one mms_config. * diff --git a/src/com/android/messaging/sms/BugleApnSettingsLoader.java b/src/com/android/messaging/sms/BugleApnSettingsLoader.java index 7305424..4066031 100644 --- a/src/com/android/messaging/sms/BugleApnSettingsLoader.java +++ b/src/com/android/messaging/sms/BugleApnSettingsLoader.java @@ -17,10 +17,8 @@ package com.android.messaging.sms; -import android.content.ContentValues; import android.content.Context; import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.net.Uri; import android.provider.Telephony; @@ -119,151 +117,6 @@ public class BugleApnSettingsLoader implements ApnSettingsLoader { public void setSuccess() { // Do nothing } - - public boolean equals(final BaseApn other) { - return TextUtils.equals(mMmsc, other.getMmsc()) && - TextUtils.equals(mMmsProxy, other.getMmsProxy()) && - mMmsProxyPort == other.getMmsProxyPort(); - } - } - - /** - * The APN represented by the local APN table row - */ - private static class DatabaseApn implements Apn { - private static final ContentValues CURRENT_NULL_VALUE; - private static final ContentValues CURRENT_SET_VALUE; - static { - CURRENT_NULL_VALUE = new ContentValues(1); - CURRENT_NULL_VALUE.putNull(Telephony.Carriers.CURRENT); - CURRENT_SET_VALUE = new ContentValues(1); - CURRENT_SET_VALUE.put(Telephony.Carriers.CURRENT, "1"); // 1 for auto selected APN - } - private static final String CLEAR_UPDATE_SELECTION = Telephony.Carriers.CURRENT + " =?"; - private static final String[] CLEAR_UPDATE_SELECTION_ARGS = new String[] { "1" }; - private static final String SET_UPDATE_SELECTION = Telephony.Carriers._ID + " =?"; - - /** - * Create an APN loaded from local database - * - * @param apns the in-memory APN list - * @param typesIn the APN type field - * @param mmscIn the APN mmsc field - * @param proxyIn the APN mmsproxy field - * @param portIn the APN mmsport field - * @param rowId the APN's row ID in database - * @param current the value of CURRENT column in database - * @return an in-memory APN instance for database APN row, null if parameter invalid - */ - public static DatabaseApn from(final List apns, final String typesIn, - final String mmscIn, final String proxyIn, final String portIn, - final long rowId, final int current) { - if (apns == null) { - return null; - } - final BaseApn base = BaseApn.from(typesIn, mmscIn, proxyIn, portIn); - if (base == null) { - return null; - } - for (final ApnSettingsLoader.Apn apn : apns) { - if (apn instanceof DatabaseApn && ((DatabaseApn) apn).equals(base)) { - return null; - } - } - return new DatabaseApn(apns, base, rowId, current); - } - - private final List mApns; - private final BaseApn mBase; - private final long mRowId; - private int mCurrent; - - public DatabaseApn(final List apns, final BaseApn base, final long rowId, - final int current) { - mApns = apns; - mBase = base; - mRowId = rowId; - mCurrent = current; - } - - @Override - public String getMmsc() { - return mBase.getMmsc(); - } - - @Override - public String getMmsProxy() { - return mBase.getMmsProxy(); - } - - @Override - public int getMmsProxyPort() { - return mBase.getMmsProxyPort(); - } - - @Override - public void setSuccess() { - moveToListHead(); - setCurrentInDatabase(); - } - - /** - * Try to move this APN to the head of in-memory list - */ - private void moveToListHead() { - // If this is being marked as a successful APN, move it to the top of the list so - // next time it will be tried first - boolean moved = false; - synchronized (mApns) { - if (mApns.get(0) != this) { - mApns.remove(this); - mApns.add(0, this); - moved = true; - } - } - if (moved) { - LogUtil.d(LogUtil.BUGLE_TAG, "Set APN [" - + "MMSC=" + getMmsc() + ", " - + "PROXY=" + getMmsProxy() + ", " - + "PORT=" + getMmsProxyPort() + "] to be first"); - } - } - - /** - * Try to set the APN to be CURRENT in its database table - */ - private void setCurrentInDatabase() { - synchronized (this) { - if (mCurrent > 0) { - // Already current - return; - } - mCurrent = 1; - } - LogUtil.d(LogUtil.BUGLE_TAG, "Set APN @" + mRowId + " to be CURRENT in local db"); - final SQLiteDatabase database = ApnDatabase.getApnDatabase().getWritableDatabase(); - database.beginTransaction(); - try { - // clear the previous current=1 apn - // we don't clear current=2 apn since it is manually selected by user - // and we should not override it. - database.update(ApnDatabase.APN_TABLE, CURRENT_NULL_VALUE, - CLEAR_UPDATE_SELECTION, CLEAR_UPDATE_SELECTION_ARGS); - // set this one to be current (1) - database.update(ApnDatabase.APN_TABLE, CURRENT_SET_VALUE, SET_UPDATE_SELECTION, - new String[] { Long.toString(mRowId) }); - database.setTransactionSuccessful(); - } finally { - database.endTransaction(); - } - } - - public boolean equals(final BaseApn other) { - if (other == null) { - return false; - } - return mBase.equals(other); - } } /** @@ -280,14 +133,7 @@ public class BugleApnSettingsLoader implements ApnSettingsLoader { Telephony.Carriers.MMSPROXY, Telephony.Carriers.MMSPORT, }; - private static final String[] APN_PROJECTION_LOCAL = { - Telephony.Carriers.TYPE, - Telephony.Carriers.MMSC, - Telephony.Carriers.MMSPROXY, - Telephony.Carriers.MMSPORT, - Telephony.Carriers.CURRENT, - Telephony.Carriers._ID, - }; + private static final int COLUMN_TYPE = 0; private static final int COLUMN_MMSC = 1; private static final int COLUMN_MMSPROXY = 2; @@ -297,8 +143,6 @@ public class BugleApnSettingsLoader implements ApnSettingsLoader { private static final String SELECTION_APN = Telephony.Carriers.APN + "=?"; private static final String SELECTION_CURRENT = Telephony.Carriers.CURRENT + " IS NOT NULL"; - private static final String SELECTION_NUMERIC = Telephony.Carriers.NUMERIC + "=?"; - private static final String ORDER_BY = Telephony.Carriers.CURRENT + " DESC"; private final Context mContext; @@ -334,14 +178,6 @@ public class BugleApnSettingsLoader implements ApnSettingsLoader { private void loadLocked(final int subId, final String apnName, final List apns) { // Try system APN table loadFromSystem(subId, apnName, apns); - if (apns.size() > 0) { - return; - } - // Try local APN table - loadFromLocalDatabase(apnName, apns); - if (apns.size() <= 0) { - LogUtil.w(LogUtil.BUGLE_TAG, "Failed to load any APN"); - } } /** @@ -455,85 +291,6 @@ public class BugleApnSettingsLoader implements ApnSettingsLoader { return null; } - /** - * Load matching APNs from local APN table. - * We try both using the APN name and not using the APN name. - * - * @param apnName the APN name - * @param apns the list of results to return - */ - private void loadFromLocalDatabase(final String apnName, final List apns) { - LogUtil.i(LogUtil.BUGLE_TAG, "Loading APNs from local APN table"); - final SQLiteDatabase database = ApnDatabase.getApnDatabase().getWritableDatabase(); - final String mccMnc = PhoneUtils.getMccMncString(PhoneUtils.getDefault().getMccMnc()); - Cursor cursor; - cursor = queryLocalDatabase(database, mccMnc, apnName); - if (cursor == null) { - cursor = queryLocalDatabase(database, mccMnc, null/*apnName*/); - } - if (cursor == null) { - LogUtil.w(LogUtil.BUGLE_TAG, "Could not find any APN in local table"); - return; - } - try { - while (cursor.moveToNext()) { - final Apn apn = DatabaseApn.from(apns, - cursor.getString(COLUMN_TYPE), - cursor.getString(COLUMN_MMSC), - cursor.getString(COLUMN_MMSPROXY), - cursor.getString(COLUMN_MMSPORT), - cursor.getLong(COLUMN_ID), - cursor.getInt(COLUMN_CURRENT)); - if (apn != null) { - apns.add(apn); - } - } - } finally { - cursor.close(); - } - } - - /** - * Make a query of local APN table based on MCC/MNC and APN name, sorted by CURRENT - * column in descending order - * - * @param db the local database - * @param numeric the MCC/MNC string - * @param apnName the optional APN name to match - * @return the cursor of the query, null if no result - */ - private static Cursor queryLocalDatabase(final SQLiteDatabase db, final String numeric, - final String apnName) { - final String selection; - final String[] selectionArgs; - if (TextUtils.isEmpty(apnName)) { - selection = SELECTION_NUMERIC; - selectionArgs = new String[] { numeric }; - } else { - selection = SELECTION_NUMERIC + " AND " + SELECTION_APN; - selectionArgs = new String[] { numeric, apnName }; - } - Cursor cursor; - try { - cursor = db.query(ApnDatabase.APN_TABLE, APN_PROJECTION_LOCAL, selection, selectionArgs, - null/*groupBy*/, null/*having*/, ORDER_BY, null/*limit*/); - } catch (final SQLiteException e) { - LogUtil.w(LogUtil.BUGLE_TAG, "Local APN table does not exist. Try rebuilding.", e); - ApnDatabase.forceBuildAndLoadApnTables(); - cursor = db.query(ApnDatabase.APN_TABLE, APN_PROJECTION_LOCAL, selection, selectionArgs, - null/*groupBy*/, null/*having*/, ORDER_BY, null/*limit*/); - } - if (cursor == null || cursor.getCount() < 1) { - if (cursor != null) { - cursor.close(); - } - LogUtil.w(LogUtil.BUGLE_TAG, "Query local APNs with apn " + apnName - + " returned empty"); - return null; - } - return cursor; - } - private static String trimWithNullCheck(final String value) { return value != null ? value.trim() : null; }