Loading src/java/com/android/internal/telephony/SubscriptionController.java +78 −8 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ public class SubscriptionController extends ISub.Stub { static final boolean VDBG = false; static final boolean DBG_CACHE = false; static final int MAX_LOCAL_LOG_LINES = 500; // TODO: Reduce to 100 when 17678050 is fixed private static final int DEPRECATED_SETTING = -1; private ScLocalLog mLocalLog = new ScLocalLog(MAX_LOCAL_LOG_LINES); /* The Cache of Active SubInfoRecord(s) list of currently in use SubInfoRecord(s) */ Loading Loading @@ -194,6 +195,7 @@ public class SubscriptionController extends ISub.Stub { protected SubscriptionController(Context c) { init(c); migrateImsSettings(); } protected void init(Context c) { Loading Loading @@ -223,6 +225,8 @@ public class SubscriptionController extends ISub.Stub { ServiceManager.addService("isub", this); } migrateImsSettings(); if (DBG) logdl("[SubscriptionController] init by Phone"); } Loading Loading @@ -1654,7 +1658,12 @@ public class SubscriptionController extends ISub.Stub { broadcastDefaultVoiceSubIdChanged(subId); } private void broadcastDefaultVoiceSubIdChanged(int subId) { /** * Broadcast intent of ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED. * @hide */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public void broadcastDefaultVoiceSubIdChanged(int subId) { // Broadcast an Intent for default voice sub change if (DBG) logdl("[broadcastDefaultVoiceSubIdChanged] subId=" + subId); Intent intent = new Intent(TelephonyIntents.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED); Loading @@ -1669,7 +1678,7 @@ public class SubscriptionController extends ISub.Stub { int subId = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.MULTI_SIM_VOICE_CALL_SUBSCRIPTION, SubscriptionManager.INVALID_SUBSCRIPTION_ID); if (VDBG) logd("[getDefaultVoiceSubId] subId=" + subId); if (VDBG) slogd("[getDefaultVoiceSubId] subId=" + subId); return subId; } Loading Loading @@ -1989,6 +1998,17 @@ public class SubscriptionController extends ISub.Stub { enforceModifyPhoneState("setSubscriptionProperty"); final long token = Binder.clearCallingIdentity(); ContentResolver resolver = mContext.getContentResolver(); setSubscriptionPropertyIntoContentResolver(subId, propKey, propValue, resolver); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); Binder.restoreCallingIdentity(token); } private static void setSubscriptionPropertyIntoContentResolver( int subId, String propKey, String propValue, ContentResolver resolver) { ContentValues value = new ContentValues(); switch (propKey) { case SubscriptionManager.CB_EXTREME_THREAT_ALERT: Loading @@ -2003,21 +2023,22 @@ public class SubscriptionController extends ISub.Stub { case SubscriptionManager.CB_CHANNEL_50_ALERT: case SubscriptionManager.CB_CMAS_TEST_ALERT: case SubscriptionManager.CB_OPT_OUT_DIALOG: case SubscriptionManager.ENHANCED_4G_MODE_ENABLED: case SubscriptionManager.VT_IMS_ENABLED: case SubscriptionManager.WFC_IMS_ENABLED: case SubscriptionManager.WFC_IMS_MODE: case SubscriptionManager.WFC_IMS_ROAMING_MODE: case SubscriptionManager.WFC_IMS_ROAMING_ENABLED: value.put(propKey, Integer.parseInt(propValue)); break; default: if(DBG) logd("Invalid column name"); if (DBG) slogd("Invalid column name"); break; } resolver.update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Integer.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); Binder.restoreCallingIdentity(token); } /** Loading Loading @@ -2055,6 +2076,12 @@ public class SubscriptionController extends ISub.Stub { case SubscriptionManager.CB_CHANNEL_50_ALERT: case SubscriptionManager.CB_CMAS_TEST_ALERT: case SubscriptionManager.CB_OPT_OUT_DIALOG: case SubscriptionManager.ENHANCED_4G_MODE_ENABLED: case SubscriptionManager.VT_IMS_ENABLED: case SubscriptionManager.WFC_IMS_ENABLED: case SubscriptionManager.WFC_IMS_MODE: case SubscriptionManager.WFC_IMS_ROAMING_MODE: case SubscriptionManager.WFC_IMS_ROAMING_ENABLED: resultValue = cursor.getInt(0) + ""; break; default: Loading Loading @@ -2148,4 +2175,47 @@ public class SubscriptionController extends ISub.Stub { Binder.restoreCallingIdentity(token); } } /** * Migrating Ims settings from global setting to subscription DB, if not already done. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public void migrateImsSettings() { migrateImsSettingHelper( Settings.Global.ENHANCED_4G_MODE_ENABLED, SubscriptionManager.ENHANCED_4G_MODE_ENABLED); migrateImsSettingHelper( Settings.Global.VT_IMS_ENABLED, SubscriptionManager.VT_IMS_ENABLED); migrateImsSettingHelper( Settings.Global.WFC_IMS_ENABLED, SubscriptionManager.WFC_IMS_ENABLED); migrateImsSettingHelper( Settings.Global.WFC_IMS_MODE, SubscriptionManager.WFC_IMS_MODE); migrateImsSettingHelper( Settings.Global.WFC_IMS_ROAMING_MODE, SubscriptionManager.WFC_IMS_ROAMING_MODE); migrateImsSettingHelper( Settings.Global.WFC_IMS_ROAMING_ENABLED, SubscriptionManager.WFC_IMS_ROAMING_ENABLED); } private void migrateImsSettingHelper(String settingGlobal, String subscriptionProperty) { ContentResolver resolver = mContext.getContentResolver(); int defaultSubId = getDefaultVoiceSubId(); try { int prevSetting = Settings.Global.getInt(resolver, settingGlobal); if (prevSetting != DEPRECATED_SETTING) { // Write previous setting into Subscription DB. setSubscriptionPropertyIntoContentResolver(defaultSubId, subscriptionProperty, Integer.toString(prevSetting), resolver); // Write global setting value with DEPRECATED_SETTING making sure // migration only happen once. Settings.Global.putInt(resolver, settingGlobal, DEPRECATED_SETTING); } } catch (Settings.SettingNotFoundException e) { } } } tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java +92 −8 Original line number Diff line number Diff line Loading @@ -73,25 +73,31 @@ public class SubscriptionControllerTest extends TelephonyTest { SubscriptionManager.CB_ETWS_TEST_ALERT, SubscriptionManager.CB_CHANNEL_50_ALERT, SubscriptionManager.CB_CMAS_TEST_ALERT, SubscriptionManager.CB_OPT_OUT_DIALOG, SubscriptionManager.SIM_PROVISIONING_STATUS, SubscriptionManager.IS_EMBEDDED, SubscriptionManager.ACCESS_RULES}; SubscriptionManager.ACCESS_RULES, SubscriptionManager.ENHANCED_4G_MODE_ENABLED, SubscriptionManager.VT_IMS_ENABLED, SubscriptionManager.WFC_IMS_ENABLED, SubscriptionManager.WFC_IMS_MODE, SubscriptionManager.WFC_IMS_ROAMING_MODE, SubscriptionManager.WFC_IMS_ROAMING_ENABLED}; /* internal util function */ private MatrixCursor convertFromContentToCursor(ContentValues initialValues) { private MatrixCursor convertFromContentToCursor(ContentValues initialValues, String[] projection) { MatrixCursor cursor = null; ArrayList<Object> values = new ArrayList<Object>(); if (initialValues != null && mKeyMappingSet.length != 0) { cursor = new MatrixCursor(mKeyMappingSet); if (projection == null) { projection = mKeyMappingSet; } if (initialValues != null && projection.length != 0) { cursor = new MatrixCursor(projection); /* push value from contentValues to matrixCursors */ for (String key : mKeyMappingSet) { for (String key : projection) { if (initialValues.containsKey(key)) { values.add(initialValues.get(key)); } else { values.add(null); } } cursor.addRow(values.toArray()); } cursor.addRow(values.toArray()); return cursor; } Loading @@ -115,7 +121,7 @@ public class SubscriptionControllerTest extends TelephonyTest { public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { if (mSubscriptionArray.size() > 0) { return convertFromContentToCursor(mSubscriptionArray.get(0)); return convertFromContentToCursor(mSubscriptionArray.get(0), projection); } return null; } Loading Loading @@ -337,4 +343,82 @@ public class SubscriptionControllerTest extends TelephonyTest { assertTrue(b.containsKey(PhoneConstants.SUBSCRIPTION_KEY)); assertEquals(1, b.getInt(PhoneConstants.SUBSCRIPTION_KEY)); } @Test @SmallTest public void testMigrateImsSettings() throws Exception { testInsertSim(); int[] subIds = mSubscriptionControllerUT.getActiveSubIdList(); assertTrue(subIds != null && subIds.length != 0); int subID = subIds[0]; // Set default void subId. Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.MULTI_SIM_VOICE_CALL_SUBSCRIPTION, subID); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ENHANCED_4G_MODE_ENABLED, 1); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.VT_IMS_ENABLED, 0); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_ENABLED, 1); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_MODE, 2); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_ROAMING_MODE, 3); mSubscriptionControllerUT.migrateImsSettings(); // Global settings should be all set. assertEquals(-1, Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.ENHANCED_4G_MODE_ENABLED)); assertEquals(-1, Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.VT_IMS_ENABLED)); assertEquals(-1, Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_ENABLED)); assertEquals(-1, Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_MODE)); assertEquals(-1, Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_ROAMING_MODE)); // The values should be migrated to its DB. assertEquals("1", mSubscriptionControllerUT.getSubscriptionProperty( subID, SubscriptionManager.ENHANCED_4G_MODE_ENABLED, mCallingPackage)); assertEquals("0", mSubscriptionControllerUT.getSubscriptionProperty( subID, SubscriptionManager.VT_IMS_ENABLED, mCallingPackage)); assertEquals("1", mSubscriptionControllerUT.getSubscriptionProperty( subID, SubscriptionManager.WFC_IMS_ENABLED, mCallingPackage)); assertEquals("2", mSubscriptionControllerUT.getSubscriptionProperty( subID, SubscriptionManager.WFC_IMS_MODE, mCallingPackage)); assertEquals("3", mSubscriptionControllerUT.getSubscriptionProperty( subID, SubscriptionManager.WFC_IMS_ROAMING_MODE, mCallingPackage)); } } tests/telephonytests/src/com/android/internal/telephony/ims/ImsManagerTest.java 0 → 100644 +165 −0 Original line number Diff line number Diff line /* * Copyright 2017 The Android Open Source 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.internal.telephony.ims; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.os.IBinder; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.test.suitebuilder.annotation.SmallTest; import com.android.ims.ImsConfig; import com.android.ims.ImsManager; import com.android.internal.telephony.TelephonyTest; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; public class ImsManagerTest extends TelephonyTest { PersistableBundle mBundle; @Mock IBinder mBinder; @Before public void setUp() throws Exception { super.setUp("SubscriptionControllerTest"); mPhoneId = mPhone.getPhoneId(); mBundle = mContextFixture.getCarrierConfigBundle(); doReturn(mSubId).when(mSubscriptionController).getSubId(mPhoneId); doReturn(mSubscriptionController).when(mBinder).queryLocalInterface(anyString()); mServiceManagerMockedServices.put("isub", mBinder); mImsManagerInstances.remove(mPhoneId); } @After public void tearDown() throws Exception { super.tearDown(); } private void setDefaultValues() { mBundle.putBoolean(CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL, ENHANCED_4G_ENABLE_DEFAULT_VAL); mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL, WFC_IMS_ENABLE_DEFAULT_VAL); mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_ENABLED_BOOL, WFC_IMS_ROAMING_ENABLE_DEFAULT_VAL); mBundle.putInt(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT, WFC_IMS_MODE_DEFAULT_VAL); mBundle.putInt(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT, WFC_IMS_ROAMING_MODE_DEFAULT_VAL); } private static final boolean ENHANCED_4G_ENABLE_DEFAULT_VAL = true; private static final boolean WFC_IMS_ENABLE_DEFAULT_VAL = false; private static final boolean WFC_IMS_ROAMING_ENABLE_DEFAULT_VAL = true; private static final boolean VT_IMS_ENABLE_DEFAULT_VAL = true; private static final int WFC_IMS_MODE_DEFAULT_VAL = 2; private static final int WFC_IMS_ROAMING_MODE_DEFAULT_VAL = 3; private final int[] mSubId = {0}; private int mPhoneId; @Test @SmallTest public void testGetDefaultValues() { doReturn("-1").when(mSubscriptionController) .getSubscriptionProperty(anyInt(), anyString(), anyString()); setDefaultValues(); ImsManager imsManager = ImsManager.getInstance(mContext, mPhoneId); assertEquals(WFC_IMS_ENABLE_DEFAULT_VAL, imsManager.isWfcEnabledByUser()); verify(mSubscriptionController, times(1)).getSubscriptionProperty( anyInt(), eq(SubscriptionManager.WFC_IMS_ENABLED), anyString()); assertEquals(ENHANCED_4G_ENABLE_DEFAULT_VAL, imsManager.isEnhanced4gLteModeSettingEnabledByUser()); verify(mSubscriptionController, times(1)).getSubscriptionProperty( anyInt(), eq(SubscriptionManager.ENHANCED_4G_MODE_ENABLED), anyString()); assertEquals(WFC_IMS_MODE_DEFAULT_VAL, imsManager.getWfcMode(false)); verify(mSubscriptionController, times(1)).getSubscriptionProperty( anyInt(), eq(SubscriptionManager.WFC_IMS_MODE), anyString()); assertEquals(WFC_IMS_ROAMING_MODE_DEFAULT_VAL, imsManager.getWfcMode(true)); verify(mSubscriptionController, times(1)).getSubscriptionProperty( anyInt(), eq(SubscriptionManager.WFC_IMS_ROAMING_MODE), anyString()); assertEquals(VT_IMS_ENABLE_DEFAULT_VAL, imsManager.isVtEnabledByUser()); verify(mSubscriptionController, times(1)).getSubscriptionProperty( anyInt(), eq(SubscriptionManager.VT_IMS_ENABLED), anyString()); } @Test @SmallTest public void testSetValues() { ImsManager imsManager = ImsManager.getInstance(mContext, mPhoneId); imsManager.setWfcMode(ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED); verify(mSubscriptionController, times(1)).setSubscriptionProperty( eq(mSubId[0]), eq(SubscriptionManager.WFC_IMS_MODE), eq("1")); imsManager.setWfcMode(ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED, true); verify(mSubscriptionController, times(1)).setSubscriptionProperty( eq(mSubId[0]), eq(SubscriptionManager.WFC_IMS_ROAMING_MODE), eq("1")); imsManager.setVtSetting(false); verify(mSubscriptionController, times(1)).setSubscriptionProperty( eq(mSubId[0]), eq(SubscriptionManager.VT_IMS_ENABLED), eq("0")); imsManager.setEnhanced4gLteModeSetting(true); verify(mSubscriptionController, times(1)).setSubscriptionProperty( eq(mSubId[0]), eq(SubscriptionManager.ENHANCED_4G_MODE_ENABLED), eq("1")); imsManager.setWfcSetting(true); verify(mSubscriptionController, times(1)).setSubscriptionProperty( eq(mSubId[0]), eq(SubscriptionManager.WFC_IMS_ENABLED), eq("1")); } } tests/telephonytests/src/com/android/internal/telephony/mocks/SubscriptionControllerMock.java +14 −7 Original line number Diff line number Diff line Loading @@ -16,19 +16,17 @@ package com.android.internal.telephony.mocks; import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; import static android.telephony.SubscriptionManager.INVALID_PHONE_INDEX; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; import android.content.Context; import android.content.Intent; import android.os.UserHandle; import android.os.RemoteException; import android.os.UserHandle; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.ISub; import com.android.internal.telephony.ITelephonyRegistry; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; Loading @@ -37,12 +35,13 @@ import com.android.internal.telephony.TelephonyIntents; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicInteger; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; // must extend SubscriptionController as some people use it directly within-process public class SubscriptionControllerMock extends SubscriptionController { final AtomicInteger mDefaultDataSubId = new AtomicInteger(INVALID_SUBSCRIPTION_ID); final AtomicInteger mDefaultVoiceSubId = new AtomicInteger(INVALID_SUBSCRIPTION_ID); final ITelephonyRegistry.Stub mTelephonyRegistry; final int[][] mSlotIndexToSubId; Loading Loading @@ -232,11 +231,19 @@ public class SubscriptionControllerMock extends SubscriptionController { } @Override public void setDefaultVoiceSubId(int subId) { throw new RuntimeException("not implemented"); if (subId == DEFAULT_SUBSCRIPTION_ID) { throw new RuntimeException("setDefaultDataSubId called with DEFAULT_SUB_ID"); } mDefaultVoiceSubId.set(subId); broadcastDefaultVoiceSubIdChanged(subId); } @Override public int getDefaultVoiceSubId() { throw new RuntimeException("not implemented"); if (mDefaultVoiceSubId != null) { return mDefaultVoiceSubId.get(); } else { return INVALID_SUBSCRIPTION_ID; } } @Override public void clearDefaultsForInactiveSubIds() { Loading Loading
src/java/com/android/internal/telephony/SubscriptionController.java +78 −8 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ public class SubscriptionController extends ISub.Stub { static final boolean VDBG = false; static final boolean DBG_CACHE = false; static final int MAX_LOCAL_LOG_LINES = 500; // TODO: Reduce to 100 when 17678050 is fixed private static final int DEPRECATED_SETTING = -1; private ScLocalLog mLocalLog = new ScLocalLog(MAX_LOCAL_LOG_LINES); /* The Cache of Active SubInfoRecord(s) list of currently in use SubInfoRecord(s) */ Loading Loading @@ -194,6 +195,7 @@ public class SubscriptionController extends ISub.Stub { protected SubscriptionController(Context c) { init(c); migrateImsSettings(); } protected void init(Context c) { Loading Loading @@ -223,6 +225,8 @@ public class SubscriptionController extends ISub.Stub { ServiceManager.addService("isub", this); } migrateImsSettings(); if (DBG) logdl("[SubscriptionController] init by Phone"); } Loading Loading @@ -1654,7 +1658,12 @@ public class SubscriptionController extends ISub.Stub { broadcastDefaultVoiceSubIdChanged(subId); } private void broadcastDefaultVoiceSubIdChanged(int subId) { /** * Broadcast intent of ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED. * @hide */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public void broadcastDefaultVoiceSubIdChanged(int subId) { // Broadcast an Intent for default voice sub change if (DBG) logdl("[broadcastDefaultVoiceSubIdChanged] subId=" + subId); Intent intent = new Intent(TelephonyIntents.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED); Loading @@ -1669,7 +1678,7 @@ public class SubscriptionController extends ISub.Stub { int subId = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.MULTI_SIM_VOICE_CALL_SUBSCRIPTION, SubscriptionManager.INVALID_SUBSCRIPTION_ID); if (VDBG) logd("[getDefaultVoiceSubId] subId=" + subId); if (VDBG) slogd("[getDefaultVoiceSubId] subId=" + subId); return subId; } Loading Loading @@ -1989,6 +1998,17 @@ public class SubscriptionController extends ISub.Stub { enforceModifyPhoneState("setSubscriptionProperty"); final long token = Binder.clearCallingIdentity(); ContentResolver resolver = mContext.getContentResolver(); setSubscriptionPropertyIntoContentResolver(subId, propKey, propValue, resolver); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); Binder.restoreCallingIdentity(token); } private static void setSubscriptionPropertyIntoContentResolver( int subId, String propKey, String propValue, ContentResolver resolver) { ContentValues value = new ContentValues(); switch (propKey) { case SubscriptionManager.CB_EXTREME_THREAT_ALERT: Loading @@ -2003,21 +2023,22 @@ public class SubscriptionController extends ISub.Stub { case SubscriptionManager.CB_CHANNEL_50_ALERT: case SubscriptionManager.CB_CMAS_TEST_ALERT: case SubscriptionManager.CB_OPT_OUT_DIALOG: case SubscriptionManager.ENHANCED_4G_MODE_ENABLED: case SubscriptionManager.VT_IMS_ENABLED: case SubscriptionManager.WFC_IMS_ENABLED: case SubscriptionManager.WFC_IMS_MODE: case SubscriptionManager.WFC_IMS_ROAMING_MODE: case SubscriptionManager.WFC_IMS_ROAMING_ENABLED: value.put(propKey, Integer.parseInt(propValue)); break; default: if(DBG) logd("Invalid column name"); if (DBG) slogd("Invalid column name"); break; } resolver.update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Integer.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); Binder.restoreCallingIdentity(token); } /** Loading Loading @@ -2055,6 +2076,12 @@ public class SubscriptionController extends ISub.Stub { case SubscriptionManager.CB_CHANNEL_50_ALERT: case SubscriptionManager.CB_CMAS_TEST_ALERT: case SubscriptionManager.CB_OPT_OUT_DIALOG: case SubscriptionManager.ENHANCED_4G_MODE_ENABLED: case SubscriptionManager.VT_IMS_ENABLED: case SubscriptionManager.WFC_IMS_ENABLED: case SubscriptionManager.WFC_IMS_MODE: case SubscriptionManager.WFC_IMS_ROAMING_MODE: case SubscriptionManager.WFC_IMS_ROAMING_ENABLED: resultValue = cursor.getInt(0) + ""; break; default: Loading Loading @@ -2148,4 +2175,47 @@ public class SubscriptionController extends ISub.Stub { Binder.restoreCallingIdentity(token); } } /** * Migrating Ims settings from global setting to subscription DB, if not already done. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public void migrateImsSettings() { migrateImsSettingHelper( Settings.Global.ENHANCED_4G_MODE_ENABLED, SubscriptionManager.ENHANCED_4G_MODE_ENABLED); migrateImsSettingHelper( Settings.Global.VT_IMS_ENABLED, SubscriptionManager.VT_IMS_ENABLED); migrateImsSettingHelper( Settings.Global.WFC_IMS_ENABLED, SubscriptionManager.WFC_IMS_ENABLED); migrateImsSettingHelper( Settings.Global.WFC_IMS_MODE, SubscriptionManager.WFC_IMS_MODE); migrateImsSettingHelper( Settings.Global.WFC_IMS_ROAMING_MODE, SubscriptionManager.WFC_IMS_ROAMING_MODE); migrateImsSettingHelper( Settings.Global.WFC_IMS_ROAMING_ENABLED, SubscriptionManager.WFC_IMS_ROAMING_ENABLED); } private void migrateImsSettingHelper(String settingGlobal, String subscriptionProperty) { ContentResolver resolver = mContext.getContentResolver(); int defaultSubId = getDefaultVoiceSubId(); try { int prevSetting = Settings.Global.getInt(resolver, settingGlobal); if (prevSetting != DEPRECATED_SETTING) { // Write previous setting into Subscription DB. setSubscriptionPropertyIntoContentResolver(defaultSubId, subscriptionProperty, Integer.toString(prevSetting), resolver); // Write global setting value with DEPRECATED_SETTING making sure // migration only happen once. Settings.Global.putInt(resolver, settingGlobal, DEPRECATED_SETTING); } } catch (Settings.SettingNotFoundException e) { } } }
tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java +92 −8 Original line number Diff line number Diff line Loading @@ -73,25 +73,31 @@ public class SubscriptionControllerTest extends TelephonyTest { SubscriptionManager.CB_ETWS_TEST_ALERT, SubscriptionManager.CB_CHANNEL_50_ALERT, SubscriptionManager.CB_CMAS_TEST_ALERT, SubscriptionManager.CB_OPT_OUT_DIALOG, SubscriptionManager.SIM_PROVISIONING_STATUS, SubscriptionManager.IS_EMBEDDED, SubscriptionManager.ACCESS_RULES}; SubscriptionManager.ACCESS_RULES, SubscriptionManager.ENHANCED_4G_MODE_ENABLED, SubscriptionManager.VT_IMS_ENABLED, SubscriptionManager.WFC_IMS_ENABLED, SubscriptionManager.WFC_IMS_MODE, SubscriptionManager.WFC_IMS_ROAMING_MODE, SubscriptionManager.WFC_IMS_ROAMING_ENABLED}; /* internal util function */ private MatrixCursor convertFromContentToCursor(ContentValues initialValues) { private MatrixCursor convertFromContentToCursor(ContentValues initialValues, String[] projection) { MatrixCursor cursor = null; ArrayList<Object> values = new ArrayList<Object>(); if (initialValues != null && mKeyMappingSet.length != 0) { cursor = new MatrixCursor(mKeyMappingSet); if (projection == null) { projection = mKeyMappingSet; } if (initialValues != null && projection.length != 0) { cursor = new MatrixCursor(projection); /* push value from contentValues to matrixCursors */ for (String key : mKeyMappingSet) { for (String key : projection) { if (initialValues.containsKey(key)) { values.add(initialValues.get(key)); } else { values.add(null); } } cursor.addRow(values.toArray()); } cursor.addRow(values.toArray()); return cursor; } Loading @@ -115,7 +121,7 @@ public class SubscriptionControllerTest extends TelephonyTest { public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { if (mSubscriptionArray.size() > 0) { return convertFromContentToCursor(mSubscriptionArray.get(0)); return convertFromContentToCursor(mSubscriptionArray.get(0), projection); } return null; } Loading Loading @@ -337,4 +343,82 @@ public class SubscriptionControllerTest extends TelephonyTest { assertTrue(b.containsKey(PhoneConstants.SUBSCRIPTION_KEY)); assertEquals(1, b.getInt(PhoneConstants.SUBSCRIPTION_KEY)); } @Test @SmallTest public void testMigrateImsSettings() throws Exception { testInsertSim(); int[] subIds = mSubscriptionControllerUT.getActiveSubIdList(); assertTrue(subIds != null && subIds.length != 0); int subID = subIds[0]; // Set default void subId. Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.MULTI_SIM_VOICE_CALL_SUBSCRIPTION, subID); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ENHANCED_4G_MODE_ENABLED, 1); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.VT_IMS_ENABLED, 0); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_ENABLED, 1); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_MODE, 2); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_ROAMING_MODE, 3); mSubscriptionControllerUT.migrateImsSettings(); // Global settings should be all set. assertEquals(-1, Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.ENHANCED_4G_MODE_ENABLED)); assertEquals(-1, Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.VT_IMS_ENABLED)); assertEquals(-1, Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_ENABLED)); assertEquals(-1, Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_MODE)); assertEquals(-1, Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.WFC_IMS_ROAMING_MODE)); // The values should be migrated to its DB. assertEquals("1", mSubscriptionControllerUT.getSubscriptionProperty( subID, SubscriptionManager.ENHANCED_4G_MODE_ENABLED, mCallingPackage)); assertEquals("0", mSubscriptionControllerUT.getSubscriptionProperty( subID, SubscriptionManager.VT_IMS_ENABLED, mCallingPackage)); assertEquals("1", mSubscriptionControllerUT.getSubscriptionProperty( subID, SubscriptionManager.WFC_IMS_ENABLED, mCallingPackage)); assertEquals("2", mSubscriptionControllerUT.getSubscriptionProperty( subID, SubscriptionManager.WFC_IMS_MODE, mCallingPackage)); assertEquals("3", mSubscriptionControllerUT.getSubscriptionProperty( subID, SubscriptionManager.WFC_IMS_ROAMING_MODE, mCallingPackage)); } }
tests/telephonytests/src/com/android/internal/telephony/ims/ImsManagerTest.java 0 → 100644 +165 −0 Original line number Diff line number Diff line /* * Copyright 2017 The Android Open Source 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.internal.telephony.ims; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.os.IBinder; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.test.suitebuilder.annotation.SmallTest; import com.android.ims.ImsConfig; import com.android.ims.ImsManager; import com.android.internal.telephony.TelephonyTest; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; public class ImsManagerTest extends TelephonyTest { PersistableBundle mBundle; @Mock IBinder mBinder; @Before public void setUp() throws Exception { super.setUp("SubscriptionControllerTest"); mPhoneId = mPhone.getPhoneId(); mBundle = mContextFixture.getCarrierConfigBundle(); doReturn(mSubId).when(mSubscriptionController).getSubId(mPhoneId); doReturn(mSubscriptionController).when(mBinder).queryLocalInterface(anyString()); mServiceManagerMockedServices.put("isub", mBinder); mImsManagerInstances.remove(mPhoneId); } @After public void tearDown() throws Exception { super.tearDown(); } private void setDefaultValues() { mBundle.putBoolean(CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL, ENHANCED_4G_ENABLE_DEFAULT_VAL); mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL, WFC_IMS_ENABLE_DEFAULT_VAL); mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_ENABLED_BOOL, WFC_IMS_ROAMING_ENABLE_DEFAULT_VAL); mBundle.putInt(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT, WFC_IMS_MODE_DEFAULT_VAL); mBundle.putInt(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT, WFC_IMS_ROAMING_MODE_DEFAULT_VAL); } private static final boolean ENHANCED_4G_ENABLE_DEFAULT_VAL = true; private static final boolean WFC_IMS_ENABLE_DEFAULT_VAL = false; private static final boolean WFC_IMS_ROAMING_ENABLE_DEFAULT_VAL = true; private static final boolean VT_IMS_ENABLE_DEFAULT_VAL = true; private static final int WFC_IMS_MODE_DEFAULT_VAL = 2; private static final int WFC_IMS_ROAMING_MODE_DEFAULT_VAL = 3; private final int[] mSubId = {0}; private int mPhoneId; @Test @SmallTest public void testGetDefaultValues() { doReturn("-1").when(mSubscriptionController) .getSubscriptionProperty(anyInt(), anyString(), anyString()); setDefaultValues(); ImsManager imsManager = ImsManager.getInstance(mContext, mPhoneId); assertEquals(WFC_IMS_ENABLE_DEFAULT_VAL, imsManager.isWfcEnabledByUser()); verify(mSubscriptionController, times(1)).getSubscriptionProperty( anyInt(), eq(SubscriptionManager.WFC_IMS_ENABLED), anyString()); assertEquals(ENHANCED_4G_ENABLE_DEFAULT_VAL, imsManager.isEnhanced4gLteModeSettingEnabledByUser()); verify(mSubscriptionController, times(1)).getSubscriptionProperty( anyInt(), eq(SubscriptionManager.ENHANCED_4G_MODE_ENABLED), anyString()); assertEquals(WFC_IMS_MODE_DEFAULT_VAL, imsManager.getWfcMode(false)); verify(mSubscriptionController, times(1)).getSubscriptionProperty( anyInt(), eq(SubscriptionManager.WFC_IMS_MODE), anyString()); assertEquals(WFC_IMS_ROAMING_MODE_DEFAULT_VAL, imsManager.getWfcMode(true)); verify(mSubscriptionController, times(1)).getSubscriptionProperty( anyInt(), eq(SubscriptionManager.WFC_IMS_ROAMING_MODE), anyString()); assertEquals(VT_IMS_ENABLE_DEFAULT_VAL, imsManager.isVtEnabledByUser()); verify(mSubscriptionController, times(1)).getSubscriptionProperty( anyInt(), eq(SubscriptionManager.VT_IMS_ENABLED), anyString()); } @Test @SmallTest public void testSetValues() { ImsManager imsManager = ImsManager.getInstance(mContext, mPhoneId); imsManager.setWfcMode(ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED); verify(mSubscriptionController, times(1)).setSubscriptionProperty( eq(mSubId[0]), eq(SubscriptionManager.WFC_IMS_MODE), eq("1")); imsManager.setWfcMode(ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED, true); verify(mSubscriptionController, times(1)).setSubscriptionProperty( eq(mSubId[0]), eq(SubscriptionManager.WFC_IMS_ROAMING_MODE), eq("1")); imsManager.setVtSetting(false); verify(mSubscriptionController, times(1)).setSubscriptionProperty( eq(mSubId[0]), eq(SubscriptionManager.VT_IMS_ENABLED), eq("0")); imsManager.setEnhanced4gLteModeSetting(true); verify(mSubscriptionController, times(1)).setSubscriptionProperty( eq(mSubId[0]), eq(SubscriptionManager.ENHANCED_4G_MODE_ENABLED), eq("1")); imsManager.setWfcSetting(true); verify(mSubscriptionController, times(1)).setSubscriptionProperty( eq(mSubId[0]), eq(SubscriptionManager.WFC_IMS_ENABLED), eq("1")); } }
tests/telephonytests/src/com/android/internal/telephony/mocks/SubscriptionControllerMock.java +14 −7 Original line number Diff line number Diff line Loading @@ -16,19 +16,17 @@ package com.android.internal.telephony.mocks; import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; import static android.telephony.SubscriptionManager.INVALID_PHONE_INDEX; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; import android.content.Context; import android.content.Intent; import android.os.UserHandle; import android.os.RemoteException; import android.os.UserHandle; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.ISub; import com.android.internal.telephony.ITelephonyRegistry; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; Loading @@ -37,12 +35,13 @@ import com.android.internal.telephony.TelephonyIntents; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicInteger; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; // must extend SubscriptionController as some people use it directly within-process public class SubscriptionControllerMock extends SubscriptionController { final AtomicInteger mDefaultDataSubId = new AtomicInteger(INVALID_SUBSCRIPTION_ID); final AtomicInteger mDefaultVoiceSubId = new AtomicInteger(INVALID_SUBSCRIPTION_ID); final ITelephonyRegistry.Stub mTelephonyRegistry; final int[][] mSlotIndexToSubId; Loading Loading @@ -232,11 +231,19 @@ public class SubscriptionControllerMock extends SubscriptionController { } @Override public void setDefaultVoiceSubId(int subId) { throw new RuntimeException("not implemented"); if (subId == DEFAULT_SUBSCRIPTION_ID) { throw new RuntimeException("setDefaultDataSubId called with DEFAULT_SUB_ID"); } mDefaultVoiceSubId.set(subId); broadcastDefaultVoiceSubIdChanged(subId); } @Override public int getDefaultVoiceSubId() { throw new RuntimeException("not implemented"); if (mDefaultVoiceSubId != null) { return mDefaultVoiceSubId.get(); } else { return INVALID_SUBSCRIPTION_ID; } } @Override public void clearDefaultsForInactiveSubIds() { Loading