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

Commit 3746b533 authored by Nathan Harold's avatar Nathan Harold Committed by Automerger Merge Worker
Browse files

Merge "Set Opportunistic as data-centric" into tm-dev am: 0af30080

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/17074967

Change-Id: I7e765289c24587fb64dc62d3a148c7ee92041a15
parents 8d85b12e 0af30080
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;
@@ -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);
@@ -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.
     *
@@ -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) {
+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());
    }
}