Loading src/com/android/settings/homepage/contextualcards/conditional/CellularDataConditionController.java +61 −18 Original line number Diff line number Diff line Loading @@ -17,17 +17,18 @@ package com.android.settings.homepage.contextualcards.conditional; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.telephony.PhoneStateListener; import android.telephony.PreciseDataConnectionState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import com.android.internal.telephony.TelephonyIntents; import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.network.GlobalSettingsChangeListener; import java.util.Objects; Loading @@ -35,22 +36,35 @@ public class CellularDataConditionController implements ConditionalCardControlle static final int ID = Objects.hash("CellularDataConditionController"); private static final IntentFilter DATA_CONNECTION_FILTER = new IntentFilter(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED); private final Context mAppContext; private final ConditionManager mConditionManager; private final Receiver mReceiver; private final TelephonyManager mTelephonyManager; private final GlobalSettingsChangeListener mDefaultDataSubscriptionIdListener; private final ConnectivityManager mConnectivityManager; private int mSubId; private TelephonyManager mTelephonyManager; private boolean mIsListeningConnectionChange; public CellularDataConditionController(Context appContext, ConditionManager conditionManager) { mAppContext = appContext; mConditionManager = conditionManager; mReceiver = new Receiver(); mSubId = getDefaultDataSubscriptionId(appContext); mTelephonyManager = getTelephonyManager(appContext, mSubId); mDefaultDataSubscriptionIdListener = new GlobalSettingsChangeListener(appContext, android.provider.Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION) { public void onChanged(String field) { final int subId = getDefaultDataSubscriptionId(mAppContext); if (subId == mSubId) { return; } mSubId = subId; if (mIsListeningConnectionChange) { restartPhoneStateListener(mAppContext, subId); } } }; mConnectivityManager = appContext.getSystemService( ConnectivityManager.class); mTelephonyManager = appContext.getSystemService(TelephonyManager.class); } @Override Loading Loading @@ -95,21 +109,50 @@ public class CellularDataConditionController implements ConditionalCardControlle @Override public void startMonitoringStateChange() { mAppContext.registerReceiver(mReceiver, DATA_CONNECTION_FILTER); restartPhoneStateListener(mAppContext, mSubId); } @Override public void stopMonitoringStateChange() { mAppContext.unregisterReceiver(mReceiver); stopPhoneStateListener(); } private int getDefaultDataSubscriptionId(Context context) { final SubscriptionManager subscriptionManager = context.getSystemService(SubscriptionManager.class); return subscriptionManager.getDefaultDataSubscriptionId(); } public class Receiver extends BroadcastReceiver { private TelephonyManager getTelephonyManager(Context context, int subId) { final TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class); return telephonyManager.createForSubscriptionId(subId); } private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() { @Override public void onReceive(Context context, Intent intent) { if (TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED.equals( intent.getAction())) { public void onPreciseDataConnectionStateChanged( PreciseDataConnectionState dataConnectionState) { mConditionManager.onConditionChanged(); } }; private void stopPhoneStateListener() { mIsListeningConnectionChange = false; mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); } // restart monitoring when subscription has been changed private void restartPhoneStateListener(Context context, int subId) { stopPhoneStateListener(); mIsListeningConnectionChange = true; // switch mTelephonyManager only when subscription been updated to valid ones if (SubscriptionManager.isValidSubscriptionId(subId)) { mTelephonyManager = getTelephonyManager(context, subId); } mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE); } } tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java +21 −2 Original line number Diff line number Diff line Loading @@ -33,14 +33,19 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.robolectric.Shadows.shadowOf; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.ArrayMap; import android.util.FeatureFlagUtils; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.core.FeatureFlags; import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardController; import com.android.settings.homepage.contextualcards.conditional.ConditionFooterContextualCard; Loading @@ -58,8 +63,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.ShadowSubscriptionManager; import org.robolectric.shadows.ShadowTelephonyManager; import java.util.ArrayList; import java.util.Arrays; Loading @@ -67,8 +73,9 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; @RunWith(RobolectricTestRunner.class) @RunWith(AndroidJUnit4.class) public class ContextualCardManagerTest { private static final int SUB_ID = 2; private static final String TEST_SLICE_URI = "context://test/test"; private static final String TEST_SLICE_NAME = "test_name"; Loading @@ -79,6 +86,8 @@ public class ContextualCardManagerTest { Lifecycle mLifecycle; private Context mContext; private ShadowSubscriptionManager mShadowSubscriptionManager; private ShadowTelephonyManager mShadowTelephonyManager; private ContextualCardManager mManager; @Before Loading @@ -86,6 +95,16 @@ public class ContextualCardManagerTest { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONDITIONAL_CARDS, true); mShadowSubscriptionManager = shadowOf( mContext.getSystemService(SubscriptionManager.class)); mShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID); final TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class); mShadowTelephonyManager = shadowOf(telephonyManager); mShadowTelephonyManager.setTelephonyManagerForSubscriptionId(SUB_ID, telephonyManager); mManager = new ContextualCardManager(mContext, mLifecycle, null /* bundle */); } Loading tests/robotests/src/com/android/settings/homepage/contextualcards/ControllerRendererPoolTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -18,7 +18,13 @@ package com.android.settings.homepage.contextualcards; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; import android.content.Context; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import androidx.lifecycle.LifecycleOwner; Loading @@ -27,11 +33,17 @@ import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowSubscriptionManager; import org.robolectric.shadows.ShadowTelephonyManager; @RunWith(RobolectricTestRunner.class) public class ControllerRendererPoolTest { private static final int SUB_ID = 1; private static final int UNSUPPORTED_CARD_TYPE = -99999; private static final int UNSUPPORTED_VIEW_TYPE = -99999; Loading @@ -41,12 +53,27 @@ public class ControllerRendererPoolTest { private Lifecycle mLifecycle; private LifecycleOwner mLifecycleOwner; @Mock private TelephonyManager mTelephonyMgr; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); // SubscriptionManager and TelephonyManager for CellularDataConditionController ShadowSubscriptionManager shadowSubscriptionMgr = shadowOf( mContext.getSystemService(SubscriptionManager.class)); shadowSubscriptionMgr.setDefaultDataSubscriptionId(SUB_ID); ShadowTelephonyManager shadowTelephonyMgr = Shadow.extract( mContext.getSystemService(TelephonyManager.class)); shadowTelephonyMgr.setTelephonyManagerForSubscriptionId(SUB_ID, mTelephonyMgr); when(mTelephonyMgr.createForSubscriptionId(anyInt())).thenReturn(mTelephonyMgr); mPool = new ControllerRendererPool(); } Loading Loading
src/com/android/settings/homepage/contextualcards/conditional/CellularDataConditionController.java +61 −18 Original line number Diff line number Diff line Loading @@ -17,17 +17,18 @@ package com.android.settings.homepage.contextualcards.conditional; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.telephony.PhoneStateListener; import android.telephony.PreciseDataConnectionState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import com.android.internal.telephony.TelephonyIntents; import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.network.GlobalSettingsChangeListener; import java.util.Objects; Loading @@ -35,22 +36,35 @@ public class CellularDataConditionController implements ConditionalCardControlle static final int ID = Objects.hash("CellularDataConditionController"); private static final IntentFilter DATA_CONNECTION_FILTER = new IntentFilter(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED); private final Context mAppContext; private final ConditionManager mConditionManager; private final Receiver mReceiver; private final TelephonyManager mTelephonyManager; private final GlobalSettingsChangeListener mDefaultDataSubscriptionIdListener; private final ConnectivityManager mConnectivityManager; private int mSubId; private TelephonyManager mTelephonyManager; private boolean mIsListeningConnectionChange; public CellularDataConditionController(Context appContext, ConditionManager conditionManager) { mAppContext = appContext; mConditionManager = conditionManager; mReceiver = new Receiver(); mSubId = getDefaultDataSubscriptionId(appContext); mTelephonyManager = getTelephonyManager(appContext, mSubId); mDefaultDataSubscriptionIdListener = new GlobalSettingsChangeListener(appContext, android.provider.Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION) { public void onChanged(String field) { final int subId = getDefaultDataSubscriptionId(mAppContext); if (subId == mSubId) { return; } mSubId = subId; if (mIsListeningConnectionChange) { restartPhoneStateListener(mAppContext, subId); } } }; mConnectivityManager = appContext.getSystemService( ConnectivityManager.class); mTelephonyManager = appContext.getSystemService(TelephonyManager.class); } @Override Loading Loading @@ -95,21 +109,50 @@ public class CellularDataConditionController implements ConditionalCardControlle @Override public void startMonitoringStateChange() { mAppContext.registerReceiver(mReceiver, DATA_CONNECTION_FILTER); restartPhoneStateListener(mAppContext, mSubId); } @Override public void stopMonitoringStateChange() { mAppContext.unregisterReceiver(mReceiver); stopPhoneStateListener(); } private int getDefaultDataSubscriptionId(Context context) { final SubscriptionManager subscriptionManager = context.getSystemService(SubscriptionManager.class); return subscriptionManager.getDefaultDataSubscriptionId(); } public class Receiver extends BroadcastReceiver { private TelephonyManager getTelephonyManager(Context context, int subId) { final TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class); return telephonyManager.createForSubscriptionId(subId); } private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() { @Override public void onReceive(Context context, Intent intent) { if (TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED.equals( intent.getAction())) { public void onPreciseDataConnectionStateChanged( PreciseDataConnectionState dataConnectionState) { mConditionManager.onConditionChanged(); } }; private void stopPhoneStateListener() { mIsListeningConnectionChange = false; mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); } // restart monitoring when subscription has been changed private void restartPhoneStateListener(Context context, int subId) { stopPhoneStateListener(); mIsListeningConnectionChange = true; // switch mTelephonyManager only when subscription been updated to valid ones if (SubscriptionManager.isValidSubscriptionId(subId)) { mTelephonyManager = getTelephonyManager(context, subId); } mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE); } }
tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java +21 −2 Original line number Diff line number Diff line Loading @@ -33,14 +33,19 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.robolectric.Shadows.shadowOf; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.ArrayMap; import android.util.FeatureFlagUtils; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.core.FeatureFlags; import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardController; import com.android.settings.homepage.contextualcards.conditional.ConditionFooterContextualCard; Loading @@ -58,8 +63,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.ShadowSubscriptionManager; import org.robolectric.shadows.ShadowTelephonyManager; import java.util.ArrayList; import java.util.Arrays; Loading @@ -67,8 +73,9 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; @RunWith(RobolectricTestRunner.class) @RunWith(AndroidJUnit4.class) public class ContextualCardManagerTest { private static final int SUB_ID = 2; private static final String TEST_SLICE_URI = "context://test/test"; private static final String TEST_SLICE_NAME = "test_name"; Loading @@ -79,6 +86,8 @@ public class ContextualCardManagerTest { Lifecycle mLifecycle; private Context mContext; private ShadowSubscriptionManager mShadowSubscriptionManager; private ShadowTelephonyManager mShadowTelephonyManager; private ContextualCardManager mManager; @Before Loading @@ -86,6 +95,16 @@ public class ContextualCardManagerTest { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONDITIONAL_CARDS, true); mShadowSubscriptionManager = shadowOf( mContext.getSystemService(SubscriptionManager.class)); mShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID); final TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class); mShadowTelephonyManager = shadowOf(telephonyManager); mShadowTelephonyManager.setTelephonyManagerForSubscriptionId(SUB_ID, telephonyManager); mManager = new ContextualCardManager(mContext, mLifecycle, null /* bundle */); } Loading
tests/robotests/src/com/android/settings/homepage/contextualcards/ControllerRendererPoolTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -18,7 +18,13 @@ package com.android.settings.homepage.contextualcards; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; import android.content.Context; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import androidx.lifecycle.LifecycleOwner; Loading @@ -27,11 +33,17 @@ import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowSubscriptionManager; import org.robolectric.shadows.ShadowTelephonyManager; @RunWith(RobolectricTestRunner.class) public class ControllerRendererPoolTest { private static final int SUB_ID = 1; private static final int UNSUPPORTED_CARD_TYPE = -99999; private static final int UNSUPPORTED_VIEW_TYPE = -99999; Loading @@ -41,12 +53,27 @@ public class ControllerRendererPoolTest { private Lifecycle mLifecycle; private LifecycleOwner mLifecycleOwner; @Mock private TelephonyManager mTelephonyMgr; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); // SubscriptionManager and TelephonyManager for CellularDataConditionController ShadowSubscriptionManager shadowSubscriptionMgr = shadowOf( mContext.getSystemService(SubscriptionManager.class)); shadowSubscriptionMgr.setDefaultDataSubscriptionId(SUB_ID); ShadowTelephonyManager shadowTelephonyMgr = Shadow.extract( mContext.getSystemService(TelephonyManager.class)); shadowTelephonyMgr.setTelephonyManagerForSubscriptionId(SUB_ID, mTelephonyMgr); when(mTelephonyMgr.createForSubscriptionId(anyInt())).thenReturn(mTelephonyMgr); mPool = new ControllerRendererPool(); } Loading