Loading src/java/com/android/internal/telephony/Phone.java +32 −17 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import android.telephony.RadioAccessFamily; import android.telephony.RadioAccessSpecifier; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyManager; Loading Loading @@ -829,12 +830,13 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { ar = (AsyncResult) msg.obj; if (ar.exception == null) { try { int mUsageSettingFromModem = ((int[]) ar.result)[0]; mUsageSettingFromModem = ((int[]) ar.result)[0]; } catch (NullPointerException | ClassCastException e) { Rlog.e(LOG_TAG, "Invalid response for usage setting " + ar.result); break; } logd("Received mUsageSettingFromModem=" + mUsageSettingFromModem); if (mUsageSettingFromModem != mPreferredUsageSetting) { mCi.setUsageSetting(obtainMessage(EVENT_SET_USAGE_SETTING_DONE), mPreferredUsageSetting); Loading Loading @@ -4512,17 +4514,27 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { updateUsageSetting(); } // Need a magic little helper function to avoid a static call via SubscriptionManager private int getPreferredUsageSetting() { String result = SubscriptionController.getInstance().getSubscriptionProperty( getSubId(), SubscriptionManager.USAGE_SETTING); try { return Integer.parseInt(result); } catch (NumberFormatException nfe) { } private int getResolvedUsageSetting(int subId) { SubscriptionInfo subInfo = SubscriptionController.getInstance().getSubscriptionInfo(subId); if (subInfo == null || subInfo.getUsageSetting() == SubscriptionManager.USAGE_SETTING_UNKNOWN) { loge("Failed to get SubscriptionInfo for subId=" + subId); return SubscriptionManager.USAGE_SETTING_UNKNOWN; } if (subInfo.getUsageSetting() != SubscriptionManager.USAGE_SETTING_DEFAULT) { return subInfo.getUsageSetting(); } if (subInfo.isOpportunistic()) { return SubscriptionManager.USAGE_SETTING_DATA_CENTRIC; } else { return mContext.getResources().getInteger( com.android.internal.R.integer.config_default_cellular_usage_setting); } } /** * Attempt to update the usage setting. * Loading @@ -4534,20 +4546,23 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { final int subId = getSubId(); if (!SubscriptionManager.isValidSubscriptionId(subId)) return false; int lastPreferredUsageSetting = mPreferredUsageSetting; final int lastPreferredUsageSetting = mPreferredUsageSetting; int mPreferredUsageSetting = getPreferredUsageSetting(); mPreferredUsageSetting = getResolvedUsageSetting(subId); if (mPreferredUsageSetting == SubscriptionManager.USAGE_SETTING_UNKNOWN) { loge("Usage Setting is Supported but Preferred Setting Unknown!"); return false; } // We might get a lot of requests to update, so definitely we don't want to hammer // the modem with multiple duplicate requests for usage setting updates if (mPreferredUsageSetting == lastPreferredUsageSetting) return false; // If the user prefers the default setting, we now need to resolve that into a concrete // value, since the modem will have a "concrete" value. if (mPreferredUsageSetting == SubscriptionManager.USAGE_SETTING_DEFAULT) { mPreferredUsageSetting = mContext.getResources().getInteger( com.android.internal.R.integer.config_default_cellular_usage_setting); } String logStr = "mPreferredUsageSetting=" + mPreferredUsageSetting + ", lastPreferredUsageSetting=" + lastPreferredUsageSetting + ", mUsageSettingFromModem=" + mUsageSettingFromModem; logd(logStr); mLocalLog.log(logStr); // If the modem value hasn't been updated, request it. if (mUsageSettingFromModem == SubscriptionManager.USAGE_SETTING_UNKNOWN) { Loading tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java +91 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ import android.telephony.CellIdentityGsm; import android.telephony.LinkCapacityEstimate; import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; Loading Loading @@ -1784,4 +1785,94 @@ public class GsmCdmaPhoneTest extends TelephonyTest { imsServiceState.setStateOutOfService(); assertEquals(ServiceState.STATE_OUT_OF_SERVICE, mPhoneUT.getServiceState().getState()); } private void setupUsageSettingResources() { // The most common case, request a voice-centric->data-centric change mContextFixture.putIntResource( com.android.internal.R.integer.config_default_cellular_usage_setting, SubscriptionManager.USAGE_SETTING_VOICE_CENTRIC); mContextFixture.putIntArrayResource( com.android.internal.R.array.config_supported_cellular_usage_settings, new int[]{ SubscriptionManager.USAGE_SETTING_VOICE_CENTRIC, SubscriptionManager.USAGE_SETTING_DATA_CENTRIC}); } private SubscriptionInfo makeSubscriptionInfo(boolean isOpportunistic, int usageSetting) { return new SubscriptionInfo( 1, "xxxxxxxxx", 1, "Android Test", "Android Test", 0, 0, "8675309", 0, null, "001", "01", "us", true, null, null, 0, isOpportunistic, null, false, 1, 1, 0, null, null, true, 0, usageSetting); } @Test @SmallTest public void testUsageSettingUpdate_DataCentric() { setupUsageSettingResources(); mPhoneUT.mCi = mMockCi; final SubscriptionInfo si = makeSubscriptionInfo( false, SubscriptionManager.USAGE_SETTING_DATA_CENTRIC); doReturn(si).when(mSubscriptionController).getSubscriptionInfo(anyInt()); mPhoneUT.updateUsageSetting(); processAllMessages(); verify(mMockCi).getUsageSetting(any()); mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_GET_USAGE_SETTING_DONE, new AsyncResult(null, new int[]{SubscriptionManager.USAGE_SETTING_VOICE_CENTRIC}, null))); processAllMessages(); verify(mMockCi).setUsageSetting(any(), eq(SubscriptionManager.USAGE_SETTING_DATA_CENTRIC)); mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_SET_USAGE_SETTING_DONE, new AsyncResult(null, null, null))); } @Test @SmallTest public void testUsageSettingUpdate_DefaultOpportunistic() { setupUsageSettingResources(); mPhoneUT.mCi = mMockCi; final SubscriptionInfo si = makeSubscriptionInfo( true, SubscriptionManager.USAGE_SETTING_DEFAULT); doReturn(si).when(mSubscriptionController).getSubscriptionInfo(anyInt()); mPhoneUT.updateUsageSetting(); processAllMessages(); verify(mMockCi).getUsageSetting(any()); mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_GET_USAGE_SETTING_DONE, new AsyncResult(null, new int[]{SubscriptionManager.USAGE_SETTING_VOICE_CENTRIC}, null))); processAllMessages(); verify(mMockCi).setUsageSetting(any(), eq(SubscriptionManager.USAGE_SETTING_DATA_CENTRIC)); mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_SET_USAGE_SETTING_DONE, new AsyncResult(null, null, null))); } @Test @SmallTest public void testUsageSettingUpdate_DefaultNonOpportunistic() { setupUsageSettingResources(); mPhoneUT.mCi = mMockCi; final SubscriptionInfo si = makeSubscriptionInfo( false, SubscriptionManager.USAGE_SETTING_DEFAULT); assertNotNull(si); doReturn(si).when(mSubscriptionController).getSubscriptionInfo(anyInt()); mPhoneUT.updateUsageSetting(); processAllMessages(); verify(mMockCi).getUsageSetting(any()); mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_GET_USAGE_SETTING_DONE, new AsyncResult(null, new int[]{SubscriptionManager.USAGE_SETTING_VOICE_CENTRIC}, null))); processAllMessages(); verify(mMockCi, never()).setUsageSetting(any(), anyInt()); } } Loading
src/java/com/android/internal/telephony/Phone.java +32 −17 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import android.telephony.RadioAccessFamily; import android.telephony.RadioAccessSpecifier; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyManager; Loading Loading @@ -829,12 +830,13 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { ar = (AsyncResult) msg.obj; if (ar.exception == null) { try { int mUsageSettingFromModem = ((int[]) ar.result)[0]; mUsageSettingFromModem = ((int[]) ar.result)[0]; } catch (NullPointerException | ClassCastException e) { Rlog.e(LOG_TAG, "Invalid response for usage setting " + ar.result); break; } logd("Received mUsageSettingFromModem=" + mUsageSettingFromModem); if (mUsageSettingFromModem != mPreferredUsageSetting) { mCi.setUsageSetting(obtainMessage(EVENT_SET_USAGE_SETTING_DONE), mPreferredUsageSetting); Loading Loading @@ -4512,17 +4514,27 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { updateUsageSetting(); } // Need a magic little helper function to avoid a static call via SubscriptionManager private int getPreferredUsageSetting() { String result = SubscriptionController.getInstance().getSubscriptionProperty( getSubId(), SubscriptionManager.USAGE_SETTING); try { return Integer.parseInt(result); } catch (NumberFormatException nfe) { } private int getResolvedUsageSetting(int subId) { SubscriptionInfo subInfo = SubscriptionController.getInstance().getSubscriptionInfo(subId); if (subInfo == null || subInfo.getUsageSetting() == SubscriptionManager.USAGE_SETTING_UNKNOWN) { loge("Failed to get SubscriptionInfo for subId=" + subId); return SubscriptionManager.USAGE_SETTING_UNKNOWN; } if (subInfo.getUsageSetting() != SubscriptionManager.USAGE_SETTING_DEFAULT) { return subInfo.getUsageSetting(); } if (subInfo.isOpportunistic()) { return SubscriptionManager.USAGE_SETTING_DATA_CENTRIC; } else { return mContext.getResources().getInteger( com.android.internal.R.integer.config_default_cellular_usage_setting); } } /** * Attempt to update the usage setting. * Loading @@ -4534,20 +4546,23 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { final int subId = getSubId(); if (!SubscriptionManager.isValidSubscriptionId(subId)) return false; int lastPreferredUsageSetting = mPreferredUsageSetting; final int lastPreferredUsageSetting = mPreferredUsageSetting; int mPreferredUsageSetting = getPreferredUsageSetting(); mPreferredUsageSetting = getResolvedUsageSetting(subId); if (mPreferredUsageSetting == SubscriptionManager.USAGE_SETTING_UNKNOWN) { loge("Usage Setting is Supported but Preferred Setting Unknown!"); return false; } // We might get a lot of requests to update, so definitely we don't want to hammer // the modem with multiple duplicate requests for usage setting updates if (mPreferredUsageSetting == lastPreferredUsageSetting) return false; // If the user prefers the default setting, we now need to resolve that into a concrete // value, since the modem will have a "concrete" value. if (mPreferredUsageSetting == SubscriptionManager.USAGE_SETTING_DEFAULT) { mPreferredUsageSetting = mContext.getResources().getInteger( com.android.internal.R.integer.config_default_cellular_usage_setting); } String logStr = "mPreferredUsageSetting=" + mPreferredUsageSetting + ", lastPreferredUsageSetting=" + lastPreferredUsageSetting + ", mUsageSettingFromModem=" + mUsageSettingFromModem; logd(logStr); mLocalLog.log(logStr); // If the modem value hasn't been updated, request it. if (mUsageSettingFromModem == SubscriptionManager.USAGE_SETTING_UNKNOWN) { Loading
tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java +91 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ import android.telephony.CellIdentityGsm; import android.telephony.LinkCapacityEstimate; import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; Loading Loading @@ -1784,4 +1785,94 @@ public class GsmCdmaPhoneTest extends TelephonyTest { imsServiceState.setStateOutOfService(); assertEquals(ServiceState.STATE_OUT_OF_SERVICE, mPhoneUT.getServiceState().getState()); } private void setupUsageSettingResources() { // The most common case, request a voice-centric->data-centric change mContextFixture.putIntResource( com.android.internal.R.integer.config_default_cellular_usage_setting, SubscriptionManager.USAGE_SETTING_VOICE_CENTRIC); mContextFixture.putIntArrayResource( com.android.internal.R.array.config_supported_cellular_usage_settings, new int[]{ SubscriptionManager.USAGE_SETTING_VOICE_CENTRIC, SubscriptionManager.USAGE_SETTING_DATA_CENTRIC}); } private SubscriptionInfo makeSubscriptionInfo(boolean isOpportunistic, int usageSetting) { return new SubscriptionInfo( 1, "xxxxxxxxx", 1, "Android Test", "Android Test", 0, 0, "8675309", 0, null, "001", "01", "us", true, null, null, 0, isOpportunistic, null, false, 1, 1, 0, null, null, true, 0, usageSetting); } @Test @SmallTest public void testUsageSettingUpdate_DataCentric() { setupUsageSettingResources(); mPhoneUT.mCi = mMockCi; final SubscriptionInfo si = makeSubscriptionInfo( false, SubscriptionManager.USAGE_SETTING_DATA_CENTRIC); doReturn(si).when(mSubscriptionController).getSubscriptionInfo(anyInt()); mPhoneUT.updateUsageSetting(); processAllMessages(); verify(mMockCi).getUsageSetting(any()); mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_GET_USAGE_SETTING_DONE, new AsyncResult(null, new int[]{SubscriptionManager.USAGE_SETTING_VOICE_CENTRIC}, null))); processAllMessages(); verify(mMockCi).setUsageSetting(any(), eq(SubscriptionManager.USAGE_SETTING_DATA_CENTRIC)); mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_SET_USAGE_SETTING_DONE, new AsyncResult(null, null, null))); } @Test @SmallTest public void testUsageSettingUpdate_DefaultOpportunistic() { setupUsageSettingResources(); mPhoneUT.mCi = mMockCi; final SubscriptionInfo si = makeSubscriptionInfo( true, SubscriptionManager.USAGE_SETTING_DEFAULT); doReturn(si).when(mSubscriptionController).getSubscriptionInfo(anyInt()); mPhoneUT.updateUsageSetting(); processAllMessages(); verify(mMockCi).getUsageSetting(any()); mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_GET_USAGE_SETTING_DONE, new AsyncResult(null, new int[]{SubscriptionManager.USAGE_SETTING_VOICE_CENTRIC}, null))); processAllMessages(); verify(mMockCi).setUsageSetting(any(), eq(SubscriptionManager.USAGE_SETTING_DATA_CENTRIC)); mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_SET_USAGE_SETTING_DONE, new AsyncResult(null, null, null))); } @Test @SmallTest public void testUsageSettingUpdate_DefaultNonOpportunistic() { setupUsageSettingResources(); mPhoneUT.mCi = mMockCi; final SubscriptionInfo si = makeSubscriptionInfo( false, SubscriptionManager.USAGE_SETTING_DEFAULT); assertNotNull(si); doReturn(si).when(mSubscriptionController).getSubscriptionInfo(anyInt()); mPhoneUT.updateUsageSetting(); processAllMessages(); verify(mMockCi).getUsageSetting(any()); mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_GET_USAGE_SETTING_DONE, new AsyncResult(null, new int[]{SubscriptionManager.USAGE_SETTING_VOICE_CENTRIC}, null))); processAllMessages(); verify(mMockCi, never()).setUsageSetting(any(), anyInt()); } }