diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2020-02-04 17:56:39 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-02-04 17:56:39 +0000 |
commit | 1bfa4a82450a59dbaae546ef29f44934622e294a (patch) | |
tree | 1550f8f7f8e0badc168f9a1019e224a97f1b25d1 | |
parent | e337835c19bbde00fc9b87738c0c90bb49a2bf92 (diff) | |
parent | 106e52e02134d227dc18eceb3477f2b6d3361b30 (diff) | |
download | packages_apps_Settings-1bfa4a82450a59dbaae546ef29f44934622e294a.tar.gz packages_apps_Settings-1bfa4a82450a59dbaae546ef29f44934622e294a.tar.bz2 packages_apps_Settings-1bfa4a82450a59dbaae546ef29f44934622e294a.zip |
Merge "Revert "Revert "[Settings] Remove dependency of TelephonyIntents"""
3 files changed, 109 insertions, 20 deletions
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/CellularDataConditionController.java b/src/com/android/settings/homepage/contextualcards/conditional/CellularDataConditionController.java index 93b937b59a..4c0ddc9aa9 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/CellularDataConditionController.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/CellularDataConditionController.java @@ -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; @@ -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 @@ -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(); + } + + private TelephonyManager getTelephonyManager(Context context, int subId) { + final TelephonyManager telephonyManager = + context.getSystemService(TelephonyManager.class); + return telephonyManager.createForSubscriptionId(subId); } - public class Receiver extends BroadcastReceiver { + 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())) { - mConditionManager.onConditionChanged(); - } + 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); } } diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java index be3c6855a2..d179cae023 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java @@ -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; @@ -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; @@ -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"; @@ -79,6 +86,8 @@ public class ContextualCardManagerTest { Lifecycle mLifecycle; private Context mContext; + private ShadowSubscriptionManager mShadowSubscriptionManager; + private ShadowTelephonyManager mShadowTelephonyManager; private ContextualCardManager mManager; @Before @@ -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 */); } diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ControllerRendererPoolTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ControllerRendererPoolTest.java index 0cb0598906..ad2dd2adc8 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ControllerRendererPoolTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ControllerRendererPoolTest.java @@ -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; @@ -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; @@ -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(); } |