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

Commit 3c8c1283 authored by Ling Ma's avatar Ling Ma
Browse files

Fix update overall data enabled status callback

Since the overall data enabled status depend on the user enabled status of the other phone, reevaluate the overall status upon the other phone toggle user mobile data.

Fix: 286355990
Change-Id: I585020705b01786d1a5d6706b5862b1891b6bbe5
Merged-In: I585020705b01786d1a5d6706b5862b1891b6bbe5
(cherry picked from commit 566d3f85)
parent 5169e9c8
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -129,6 +129,13 @@ public class DataSettingsManager extends Handler {
            super(executor);
        }

        /**
         * Called when user data enabled state changed.
         *
         * @param enabled {@code true} indicates user mobile data is enabled.
         */
        public void onUserDataEnabledChanged(boolean enabled) {}

        /**
         * Called when overall data enabled state changed.
         *
@@ -289,6 +296,21 @@ public class DataSettingsManager extends Handler {
                        }
                    }
                }, this::post);
        // some overall mobile data override policy depend on whether DDS is user data enabled.
        for (Phone phone : PhoneFactory.getPhones()) {
            if (phone.getPhoneId() != mPhone.getPhoneId()) {
                phone.getDataSettingsManager().registerCallback(new DataSettingsManagerCallback(
                        this::post) {
                    @Override
                    public void onUserDataEnabledChanged(boolean enabled) {
                        log("phone" + phone.getPhoneId() + " onUserDataEnabledChanged "
                                + enabled + ", reevaluating mobile data policies");
                        DataSettingsManager.this.updateDataEnabledAndNotify(
                                TelephonyManager.DATA_ENABLED_REASON_OVERRIDE);
                    }
                });
            }
        }
        updateDataEnabledAndNotify(TelephonyManager.DATA_ENABLED_REASON_UNKNOWN);
    }

@@ -416,6 +438,8 @@ public class DataSettingsManager extends Handler {
        if (changed) {
            logl("UserDataEnabled changed to " + enabled);
            mPhone.notifyUserMobileDataStateChanged(enabled);
            mDataSettingsManagerCallbacks.forEach(callback -> callback.invokeFromExecutor(
                    () -> callback.onUserDataEnabledChanged(enabled)));
            updateDataEnabledAndNotify(TelephonyManager.DATA_ENABLED_REASON_USER, callingPackage);
        }
    }
+47 −0
Original line number Diff line number Diff line
@@ -21,16 +21,22 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.os.Looper;
import android.os.PersistableBundle;
import android.telephony.TelephonyManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.data.DataSettingsManager.DataSettingsManagerCallback;
import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
@@ -131,4 +137,45 @@ public class DataSettingsManagerTest extends TelephonyTest {
        mDataSettingsManagerUT.setDefaultDataRoamingEnabled();
        assertFalse(mDataSettingsManagerUT.isDataRoamingEnabled());
    }

    @Test
    public void testUpdateDataEnabledAndNotifyOverride() throws Exception {
        // Mock another DDS phone.
        int ddsPhoneId = 1;
        int ddsSubId = 2;
        doReturn(ddsSubId).when(mSubscriptionManagerService).getDefaultDataSubId();
        Phone phone2 = Mockito.mock(Phone.class);
        doReturn(ddsPhoneId).when(phone2).getPhoneId();
        doReturn(ddsSubId).when(phone2).getSubId();
        doReturn(ddsPhoneId).when(mSubscriptionManagerService).getPhoneId(ddsSubId);
        DataSettingsManager dataSettingsManager2 = Mockito.mock(DataSettingsManager.class);
        doReturn(dataSettingsManager2).when(phone2).getDataSettingsManager();
        mPhones = new Phone[] {mPhone, phone2};
        replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
        ArgumentCaptor<DataSettingsManagerCallback> callbackArgumentCaptor = ArgumentCaptor
                .forClass(DataSettingsManagerCallback.class);

        mDataSettingsManagerUT.sendEmptyMessage(11 /* EVENT_INITIALIZE */);
        processAllMessages();

        // Verify listening to user enabled status of other phones.
        verify(dataSettingsManager2).registerCallback(callbackArgumentCaptor.capture());
        DataSettingsManagerCallback callback = callbackArgumentCaptor.getValue();

        // Mock the phone as nonDDS.
        mDataSettingsManagerUT.setDataEnabled(TelephonyManager.DATA_ENABLED_REASON_USER, false, "");
        processAllMessages();
        clearInvocations(mPhone);

        // Verify the override policy doesn't take effect because the DDS is user disabled.
        mDataSettingsManagerUT.setMobileDataPolicy(
                TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH, true);
        processAllMessages();
        verify(mPhone, never()).notifyDataEnabled(anyBoolean(), anyInt());

        // Verify the override takes effect upon DDS user enabled.
        doReturn(true).when(phone2).isUserDataEnabled();
        callback.onUserDataEnabledChanged(true);
        verify(mPhone).notifyDataEnabled(true, TelephonyManager.DATA_ENABLED_REASON_OVERRIDE);
    }
}