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

Commit 9888ad83 authored by Bonian Chen's avatar Bonian Chen Committed by Android (Google) Code Review
Browse files

Merge "[Settings] Remove dependency of TelephonyIntents"

parents 8b2b5ea3 6a6b416c
Loading
Loading
Loading
Loading
+61 −18
Original line number Diff line number Diff line
@@ -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();
    }

    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);
    }
}
+21 −2
Original line number Diff line number Diff line
@@ -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 */);
    }

+27 −0
Original line number Diff line number Diff line
@@ -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();
    }