Loading src/java/com/android/internal/telephony/data/DataSettingsManager.java +24 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading Loading @@ -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); } Loading Loading @@ -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); } } Loading tests/telephonytests/src/com/android/internal/telephony/data/DataSettingsManagerTest.java +47 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } Loading
src/java/com/android/internal/telephony/data/DataSettingsManager.java +24 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading Loading @@ -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); } Loading Loading @@ -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); } } Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataSettingsManagerTest.java +47 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } }