Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c0f7358 authored by Nathan Harold's avatar Nathan Harold
Browse files

Set Opportunistic as data-centric

When a usage setting is set to "default", if the
subscription is opportunistic, it should be set to
data-centric to preserve backwards compatibility
with the assumption that all opportunistic subscriptions
are data-centric.

Bug: 211689395
Test: atest GsmCdmaPhoneTest#testUsageSettingUpdate_DataCentric
Test: atest GsmCdmaPhoneTest#testUsageSettingUpdate_DefaultOpportunistic
Test: atest GsmCdmaPhoneTest#testUsageSettingUpdate_DefaultNonOpportunistic
Change-Id: I3f996621ef18292598965708144a2b3ac70f3e58
parent 847d3647
Loading
Loading
Loading
Loading
+32 −17
Original line number Diff line number Diff line
@@ -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;
@@ -827,12 +828,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);
@@ -4510,17 +4512,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.
     *
@@ -4532,20 +4544,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) {
+91 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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());
    }
}