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

Commit c6cc6266 authored by Jason Monk's avatar Jason Monk
Browse files

Fix EmergencyCallback in NetworkController

 - Do some cleanup so that things are more testable
 - Test emergency callback since its possible
 - Fix emergency callback in no sims case

Bug: 16218652
Change-Id: Ic859eff732cc11c5ae8aa6ced3584905bbe215c7
parent fd9a2daf
Loading
Loading
Loading
Loading
+1 −6
Original line number Original line Diff line number Diff line
@@ -812,12 +812,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
        signalClusterQs.setNetworkController(mNetworkController);
        signalClusterQs.setNetworkController(mNetworkController);
        final boolean isAPhone = mNetworkController.hasVoiceCallingFeature();
        final boolean isAPhone = mNetworkController.hasVoiceCallingFeature();
        if (isAPhone) {
        if (isAPhone) {
            mNetworkController.addEmergencyListener(new NetworkControllerImpl.EmergencyListener() {
            mNetworkController.addEmergencyListener(mHeader);
                @Override
                public void setEmergencyCallsOnly(boolean emergencyOnly) {
                    mHeader.setShowEmergencyCallsOnly(emergencyOnly);
                }
            });
        }
        }


        mFlashlightController = new FlashlightController(mContext);
        mFlashlightController = new FlashlightController(mContext);
+5 −2
Original line number Original line Diff line number Diff line
@@ -45,6 +45,7 @@ import com.android.systemui.R;
import com.android.systemui.qs.QSPanel;
import com.android.systemui.qs.QSPanel;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.QSTile;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.UserInfoController;


@@ -54,7 +55,8 @@ import java.text.NumberFormat;
 * The view to manage the header area in the expanded status bar.
 * The view to manage the header area in the expanded status bar.
 */
 */
public class StatusBarHeaderView extends RelativeLayout implements View.OnClickListener,
public class StatusBarHeaderView extends RelativeLayout implements View.OnClickListener,
        BatteryController.BatteryStateChangeCallback, NextAlarmController.NextAlarmChangeCallback {
        BatteryController.BatteryStateChangeCallback, NextAlarmController.NextAlarmChangeCallback,
        EmergencyListener {


    private boolean mExpanded;
    private boolean mExpanded;
    private boolean mListening;
    private boolean mListening;
@@ -527,7 +529,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
        return true;
        return true;
    }
    }


    public void setShowEmergencyCallsOnly(boolean show) {
    @Override
    public void setEmergencyCallsOnly(boolean show) {
        boolean changed = show != mShowEmergencyCallsOnly;
        boolean changed = show != mShowEmergencyCallsOnly;
        if (changed) {
        if (changed) {
            mShowEmergencyCallsOnly = show;
            mShowEmergencyCallsOnly = show;
+6 −2
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@ import com.android.internal.telephony.cdma.EriInfo;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.SubscriptionDefaults;


import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.BitSet;
import java.util.BitSet;
@@ -43,6 +44,7 @@ import java.util.Objects;
public class MobileSignalController extends SignalController<
public class MobileSignalController extends SignalController<
        MobileSignalController.MobileState, MobileSignalController.MobileIconGroup> {
        MobileSignalController.MobileState, MobileSignalController.MobileIconGroup> {
    private final TelephonyManager mPhone;
    private final TelephonyManager mPhone;
    private final SubscriptionDefaults mDefaults;
    private final String mNetworkNameDefault;
    private final String mNetworkNameDefault;
    private final String mNetworkNameSeparator;
    private final String mNetworkNameSeparator;
    @VisibleForTesting
    @VisibleForTesting
@@ -67,13 +69,15 @@ public class MobileSignalController extends SignalController<
    // need listener lists anymore.
    // need listener lists anymore.
    public MobileSignalController(Context context, Config config, boolean hasMobileData,
    public MobileSignalController(Context context, Config config, boolean hasMobileData,
            TelephonyManager phone, CallbackHandler callbackHandler,
            TelephonyManager phone, CallbackHandler callbackHandler,
            NetworkControllerImpl networkController, SubscriptionInfo info, Looper receiverLooper) {
            NetworkControllerImpl networkController, SubscriptionInfo info,
            SubscriptionDefaults defaults, Looper receiverLooper) {
        super("MobileSignalController(" + info.getSubscriptionId() + ")", context,
        super("MobileSignalController(" + info.getSubscriptionId() + ")", context,
                NetworkCapabilities.TRANSPORT_CELLULAR, callbackHandler,
                NetworkCapabilities.TRANSPORT_CELLULAR, callbackHandler,
                networkController);
                networkController);
        mNetworkToIconLookup = new SparseArray<>();
        mNetworkToIconLookup = new SparseArray<>();
        mConfig = config;
        mConfig = config;
        mPhone = phone;
        mPhone = phone;
        mDefaults = defaults;
        mSubscriptionInfo = info;
        mSubscriptionInfo = info;
        mPhoneStateListener = new MobilePhoneStateListener(info.getSubscriptionId(),
        mPhoneStateListener = new MobilePhoneStateListener(info.getSubscriptionId(),
                receiverLooper);
                receiverLooper);
@@ -290,7 +294,7 @@ public class MobileSignalController extends SignalController<
    }
    }


    private void updateDataSim() {
    private void updateDataSim() {
        int defaultDataSub = SubscriptionManager.getDefaultDataSubId();
        int defaultDataSub = mDefaults.getDefaultDataSubId();
        if (SubscriptionManager.isValidSubscriptionId(defaultDataSub)) {
        if (SubscriptionManager.isValidSubscriptionId(defaultDataSub)) {
            mCurrentState.dataSim = defaultDataSub == mSubscriptionInfo.getSubscriptionId();
            mCurrentState.dataSim = defaultDataSub == mSubscriptionInfo.getSubscriptionId();
        } else {
        } else {
+30 −8
Original line number Original line Diff line number Diff line
@@ -71,6 +71,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
    private final ConnectivityManager mConnectivityManager;
    private final ConnectivityManager mConnectivityManager;
    private final SubscriptionManager mSubscriptionManager;
    private final SubscriptionManager mSubscriptionManager;
    private final boolean mHasMobileDataFeature;
    private final boolean mHasMobileDataFeature;
    private final SubscriptionDefaults mSubDefaults;
    private Config mConfig;
    private Config mConfig;


    // Subcontrollers.
    // Subcontrollers.
@@ -124,7 +125,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
                SubscriptionManager.from(context), Config.readConfig(context), bgLooper,
                SubscriptionManager.from(context), Config.readConfig(context), bgLooper,
                new CallbackHandler(),
                new CallbackHandler(),
                new AccessPointControllerImpl(context, bgLooper),
                new AccessPointControllerImpl(context, bgLooper),
                new MobileDataControllerImpl(context));
                new MobileDataControllerImpl(context),
                new SubscriptionDefaults());
        mReceiverHandler.post(mRegisterListeners);
        mReceiverHandler.post(mRegisterListeners);
    }
    }


@@ -134,13 +136,15 @@ public class NetworkControllerImpl extends BroadcastReceiver
            SubscriptionManager subManager, Config config, Looper bgLooper,
            SubscriptionManager subManager, Config config, Looper bgLooper,
            CallbackHandler callbackHandler,
            CallbackHandler callbackHandler,
            AccessPointControllerImpl accessPointController,
            AccessPointControllerImpl accessPointController,
            MobileDataControllerImpl mobileDataController) {
            MobileDataControllerImpl mobileDataController,
            SubscriptionDefaults defaultsHandler) {
        mContext = context;
        mContext = context;
        mConfig = config;
        mConfig = config;
        mReceiverHandler = new Handler(bgLooper);
        mReceiverHandler = new Handler(bgLooper);
        mCallbackHandler = callbackHandler;
        mCallbackHandler = callbackHandler;


        mSubscriptionManager = subManager;
        mSubscriptionManager = subManager;
        mSubDefaults = defaultsHandler;
        mConnectivityManager = connectivityManager;
        mConnectivityManager = connectivityManager;
        mHasMobileDataFeature =
        mHasMobileDataFeature =
                mConnectivityManager.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
                mConnectivityManager.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
@@ -233,7 +237,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
    }
    }


    private MobileSignalController getDataController() {
    private MobileSignalController getDataController() {
        int dataSubId = SubscriptionManager.getDefaultDataSubId();
        int dataSubId = mSubDefaults.getDefaultDataSubId();
        if (!SubscriptionManager.isValidSubscriptionId(dataSubId)) {
        if (!SubscriptionManager.isValidSubscriptionId(dataSubId)) {
            if (DEBUG) Log.e(TAG, "No data sim selected");
            if (DEBUG) Log.e(TAG, "No data sim selected");
            return mDefaultSignalController;
            return mDefaultSignalController;
@@ -251,17 +255,19 @@ public class NetworkControllerImpl extends BroadcastReceiver
    }
    }


    public boolean isEmergencyOnly() {
    public boolean isEmergencyOnly() {
        int voiceSubId = SubscriptionManager.getDefaultVoiceSubId();
        int voiceSubId = mSubDefaults.getDefaultVoiceSubId();
        if (!SubscriptionManager.isValidSubscriptionId(voiceSubId)) {
        if (!SubscriptionManager.isValidSubscriptionId(voiceSubId)) {
            for (MobileSignalController mobileSignalController :
            for (MobileSignalController mobileSignalController :
                                            mMobileSignalControllers.values()) {
                                            mMobileSignalControllers.values()) {
                if (!mobileSignalController.isEmergencyOnly()) {
                if (!mobileSignalController.getState().isEmergency) {
                    if (DEBUG) Log.d(TAG, "Found emergency " + mobileSignalController.mTag);
                    return false;
                    return false;
                }
                }
            }
            }
        }
        }
        if (mMobileSignalControllers.containsKey(voiceSubId)) {
        if (mMobileSignalControllers.containsKey(voiceSubId)) {
            return mMobileSignalControllers.get(voiceSubId).isEmergencyOnly();
            if (DEBUG) Log.d(TAG, "Getting emergency from " + voiceSubId);
            return mMobileSignalControllers.get(voiceSubId).getState().isEmergency;
        }
        }
        if (DEBUG) Log.e(TAG, "Cannot find controller for voice sub: " + voiceSubId);
        if (DEBUG) Log.e(TAG, "Cannot find controller for voice sub: " + voiceSubId);
        // Something is wrong, better assume we can't make calls...
        // Something is wrong, better assume we can't make calls...
@@ -375,6 +381,11 @@ public class NetworkControllerImpl extends BroadcastReceiver
        if (!mListening) {
        if (!mListening) {
            return;
            return;
        }
        }
        doUpdateMobileControllers();
    }

    @VisibleForTesting
    void doUpdateMobileControllers() {
        List<SubscriptionInfo> subscriptions = mSubscriptionManager.getActiveSubscriptionInfoList();
        List<SubscriptionInfo> subscriptions = mSubscriptionManager.getActiveSubscriptionInfoList();
        if (subscriptions == null) {
        if (subscriptions == null) {
            subscriptions = Collections.emptyList();
            subscriptions = Collections.emptyList();
@@ -389,6 +400,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
        }
        }
        setCurrentSubscriptions(subscriptions);
        setCurrentSubscriptions(subscriptions);
        updateNoSims();
        updateNoSims();
        recalculateEmergency();
    }
    }


    @VisibleForTesting
    @VisibleForTesting
@@ -425,7 +437,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
            } else {
            } else {
                MobileSignalController controller = new MobileSignalController(mContext, mConfig,
                MobileSignalController controller = new MobileSignalController(mContext, mConfig,
                        mHasMobileDataFeature, mPhone, mCallbackHandler,
                        mHasMobileDataFeature, mPhone, mCallbackHandler,
                        this, subscriptions.get(i), mReceiverHandler.getLooper());
                        this, subscriptions.get(i), mSubDefaults, mReceiverHandler.getLooper());
                mMobileSignalControllers.put(subId, controller);
                mMobileSignalControllers.put(subId, controller);
                if (subscriptions.get(i).getSimSlotIndex() == 0) {
                if (subscriptions.get(i).getSimSlotIndex() == 0) {
                    mDefaultSignalController = controller;
                    mDefaultSignalController = controller;
@@ -708,7 +720,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
                null, 0, 0, "");
                null, 0, 0, "");
        mMobileSignalControllers.put(id, new MobileSignalController(mContext,
        mMobileSignalControllers.put(id, new MobileSignalController(mContext,
                mConfig, mHasMobileDataFeature, mPhone, mCallbackHandler, this, info,
                mConfig, mHasMobileDataFeature, mPhone, mCallbackHandler, this, info,
                mReceiverHandler.getLooper()));
                mSubDefaults, mReceiverHandler.getLooper()));
        return info;
        return info;
    }
    }


@@ -735,6 +747,16 @@ public class NetworkControllerImpl extends BroadcastReceiver
        void setEmergencyCallsOnly(boolean emergencyOnly);
        void setEmergencyCallsOnly(boolean emergencyOnly);
    }
    }


    public static class SubscriptionDefaults {
        public int getDefaultVoiceSubId() {
            return SubscriptionManager.getDefaultVoiceSubId();
        }

        public int getDefaultDataSubId() {
            return SubscriptionManager.getDefaultDataSubId();
        }
    }

    @VisibleForTesting
    @VisibleForTesting
    static class Config {
    static class Config {
        boolean showAtLeast3G = false;
        boolean showAtLeast3G = false;
+28 −11
Original line number Original line Diff line number Diff line
@@ -36,6 +36,7 @@ import com.android.internal.telephony.cdma.EriInfo;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.SubscriptionDefaults;


import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.mockito.Mockito;
@@ -66,6 +67,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
    protected TelephonyManager mMockTm;
    protected TelephonyManager mMockTm;
    protected Config mConfig;
    protected Config mConfig;
    protected CallbackHandler mCallbackHandler;
    protected CallbackHandler mCallbackHandler;
    protected SubscriptionDefaults mMockSubDefaults;


    protected int mSubId;
    protected int mSubId;


@@ -79,6 +81,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
        mMockTm = mock(TelephonyManager.class);
        mMockTm = mock(TelephonyManager.class);
        mMockSm = mock(SubscriptionManager.class);
        mMockSm = mock(SubscriptionManager.class);
        mMockCm = mock(ConnectivityManager.class);
        mMockCm = mock(ConnectivityManager.class);
        mMockSubDefaults = mock(SubscriptionDefaults.class);
        mNetCapabilities = new NetworkCapabilities();
        mNetCapabilities = new NetworkCapabilities();
        when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true);
        when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true);
        when(mMockCm.getDefaultNetworkCapabilitiesForUser(0)).thenReturn(
        when(mMockCm.getDefaultNetworkCapabilitiesForUser(0)).thenReturn(
@@ -92,25 +95,39 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
        mCallbackHandler = mock(CallbackHandler.class);
        mCallbackHandler = mock(CallbackHandler.class);
        mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
        mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
                mConfig, Looper.getMainLooper(), mCallbackHandler,
                mConfig, Looper.getMainLooper(), mCallbackHandler,
                mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class));
                mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class),
                mMockSubDefaults);
        setupNetworkController();
        setupNetworkController();

        // Trigger blank callbacks to always get the current state (some tests don't trigger
        // changes from default state).
        mNetworkController.addSignalCallback(null);
        mNetworkController.addEmergencyListener(null);
    }
    }


    protected void setupNetworkController() {
    protected void setupNetworkController() {
        // For now just pretend to be the data sim, so we can test that too.
        // For now just pretend to be the data sim, so we can test that too.
        mSubId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
        mSubId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
        SubscriptionInfo subscription = mock(SubscriptionInfo.class);
        setDefaultSubId(mSubId);
        List<SubscriptionInfo> subs = new ArrayList<SubscriptionInfo>();
        setSubscriptions(mSubId);
        when(subscription.getSubscriptionId()).thenReturn(mSubId);
        subs.add(subscription);
        mNetworkController.setCurrentSubscriptions(subs);
        mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId);
        mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId);
        mMobileSignalController.getState().dataSim = true;
        mPhoneStateListener = mMobileSignalController.mPhoneStateListener;
        mPhoneStateListener = mMobileSignalController.mPhoneStateListener;
    }


        // Trigger blank callbacks to always get the current state (some tests don't trigger
    protected void setDefaultSubId(int subId) {
        // changes from default state).
        when(mMockSubDefaults.getDefaultDataSubId()).thenReturn(subId);
        mNetworkController.addSignalCallback(null);
        when(mMockSubDefaults.getDefaultVoiceSubId()).thenReturn(subId);
    }

    protected void setSubscriptions(int... subIds) {
        List<SubscriptionInfo> subs = new ArrayList<SubscriptionInfo>();
        for (int subId : subIds) {
            SubscriptionInfo subscription = mock(SubscriptionInfo.class);
            when(subscription.getSubscriptionId()).thenReturn(subId);
            subs.add(subscription);
        }
        when(mMockSm.getActiveSubscriptionInfoList()).thenReturn(subs);
        mNetworkController.doUpdateMobileControllers();
    }
    }


    protected NetworkControllerImpl setUpNoMobileData() {
    protected NetworkControllerImpl setUpNoMobileData() {
@@ -119,7 +136,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
              = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
              = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
                        mConfig, Looper.getMainLooper(), mCallbackHandler,
                        mConfig, Looper.getMainLooper(), mCallbackHandler,
                        mock(AccessPointControllerImpl.class),
                        mock(AccessPointControllerImpl.class),
                        mock(MobileDataControllerImpl.class));
                        mock(MobileDataControllerImpl.class), mMockSubDefaults);


      setupNetworkController();
      setupNetworkController();


Loading