Merge "Fix EmergencyCallback in NetworkController" into mnc-dev
This commit is contained in:
@@ -812,12 +812,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
|
||||
signalClusterQs.setNetworkController(mNetworkController);
|
||||
final boolean isAPhone = mNetworkController.hasVoiceCallingFeature();
|
||||
if (isAPhone) {
|
||||
mNetworkController.addEmergencyListener(new NetworkControllerImpl.EmergencyListener() {
|
||||
@Override
|
||||
public void setEmergencyCallsOnly(boolean emergencyOnly) {
|
||||
mHeader.setShowEmergencyCallsOnly(emergencyOnly);
|
||||
}
|
||||
});
|
||||
mNetworkController.addEmergencyListener(mHeader);
|
||||
}
|
||||
|
||||
mFlashlightController = new FlashlightController(mContext);
|
||||
|
||||
@@ -45,6 +45,7 @@ import com.android.systemui.R;
|
||||
import com.android.systemui.qs.QSPanel;
|
||||
import com.android.systemui.qs.QSTile;
|
||||
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.UserInfoController;
|
||||
|
||||
@@ -54,7 +55,8 @@ import java.text.NumberFormat;
|
||||
* The view to manage the header area in the expanded status bar.
|
||||
*/
|
||||
public class StatusBarHeaderView extends RelativeLayout implements View.OnClickListener,
|
||||
BatteryController.BatteryStateChangeCallback, NextAlarmController.NextAlarmChangeCallback {
|
||||
BatteryController.BatteryStateChangeCallback, NextAlarmController.NextAlarmChangeCallback,
|
||||
EmergencyListener {
|
||||
|
||||
private boolean mExpanded;
|
||||
private boolean mListening;
|
||||
@@ -527,7 +529,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setShowEmergencyCallsOnly(boolean show) {
|
||||
@Override
|
||||
public void setEmergencyCallsOnly(boolean show) {
|
||||
boolean changed = show != mShowEmergencyCallsOnly;
|
||||
if (changed) {
|
||||
mShowEmergencyCallsOnly = show;
|
||||
|
||||
@@ -34,6 +34,7 @@ import com.android.internal.telephony.cdma.EriInfo;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.policy.NetworkController.IconState;
|
||||
import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
|
||||
import com.android.systemui.statusbar.policy.NetworkControllerImpl.SubscriptionDefaults;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.BitSet;
|
||||
@@ -43,6 +44,7 @@ import java.util.Objects;
|
||||
public class MobileSignalController extends SignalController<
|
||||
MobileSignalController.MobileState, MobileSignalController.MobileIconGroup> {
|
||||
private final TelephonyManager mPhone;
|
||||
private final SubscriptionDefaults mDefaults;
|
||||
private final String mNetworkNameDefault;
|
||||
private final String mNetworkNameSeparator;
|
||||
@VisibleForTesting
|
||||
@@ -67,13 +69,15 @@ public class MobileSignalController extends SignalController<
|
||||
// need listener lists anymore.
|
||||
public MobileSignalController(Context context, Config config, boolean hasMobileData,
|
||||
TelephonyManager phone, CallbackHandler callbackHandler,
|
||||
NetworkControllerImpl networkController, SubscriptionInfo info, Looper receiverLooper) {
|
||||
NetworkControllerImpl networkController, SubscriptionInfo info,
|
||||
SubscriptionDefaults defaults, Looper receiverLooper) {
|
||||
super("MobileSignalController(" + info.getSubscriptionId() + ")", context,
|
||||
NetworkCapabilities.TRANSPORT_CELLULAR, callbackHandler,
|
||||
networkController);
|
||||
mNetworkToIconLookup = new SparseArray<>();
|
||||
mConfig = config;
|
||||
mPhone = phone;
|
||||
mDefaults = defaults;
|
||||
mSubscriptionInfo = info;
|
||||
mPhoneStateListener = new MobilePhoneStateListener(info.getSubscriptionId(),
|
||||
receiverLooper);
|
||||
@@ -290,7 +294,7 @@ public class MobileSignalController extends SignalController<
|
||||
}
|
||||
|
||||
private void updateDataSim() {
|
||||
int defaultDataSub = SubscriptionManager.getDefaultDataSubId();
|
||||
int defaultDataSub = mDefaults.getDefaultDataSubId();
|
||||
if (SubscriptionManager.isValidSubscriptionId(defaultDataSub)) {
|
||||
mCurrentState.dataSim = defaultDataSub == mSubscriptionInfo.getSubscriptionId();
|
||||
} else {
|
||||
|
||||
@@ -71,6 +71,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
private final ConnectivityManager mConnectivityManager;
|
||||
private final SubscriptionManager mSubscriptionManager;
|
||||
private final boolean mHasMobileDataFeature;
|
||||
private final SubscriptionDefaults mSubDefaults;
|
||||
private Config mConfig;
|
||||
|
||||
// Subcontrollers.
|
||||
@@ -124,7 +125,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
SubscriptionManager.from(context), Config.readConfig(context), bgLooper,
|
||||
new CallbackHandler(),
|
||||
new AccessPointControllerImpl(context, bgLooper),
|
||||
new MobileDataControllerImpl(context));
|
||||
new MobileDataControllerImpl(context),
|
||||
new SubscriptionDefaults());
|
||||
mReceiverHandler.post(mRegisterListeners);
|
||||
}
|
||||
|
||||
@@ -134,13 +136,15 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
SubscriptionManager subManager, Config config, Looper bgLooper,
|
||||
CallbackHandler callbackHandler,
|
||||
AccessPointControllerImpl accessPointController,
|
||||
MobileDataControllerImpl mobileDataController) {
|
||||
MobileDataControllerImpl mobileDataController,
|
||||
SubscriptionDefaults defaultsHandler) {
|
||||
mContext = context;
|
||||
mConfig = config;
|
||||
mReceiverHandler = new Handler(bgLooper);
|
||||
mCallbackHandler = callbackHandler;
|
||||
|
||||
mSubscriptionManager = subManager;
|
||||
mSubDefaults = defaultsHandler;
|
||||
mConnectivityManager = connectivityManager;
|
||||
mHasMobileDataFeature =
|
||||
mConnectivityManager.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
|
||||
@@ -233,7 +237,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
}
|
||||
|
||||
private MobileSignalController getDataController() {
|
||||
int dataSubId = SubscriptionManager.getDefaultDataSubId();
|
||||
int dataSubId = mSubDefaults.getDefaultDataSubId();
|
||||
if (!SubscriptionManager.isValidSubscriptionId(dataSubId)) {
|
||||
if (DEBUG) Log.e(TAG, "No data sim selected");
|
||||
return mDefaultSignalController;
|
||||
@@ -251,17 +255,19 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
}
|
||||
|
||||
public boolean isEmergencyOnly() {
|
||||
int voiceSubId = SubscriptionManager.getDefaultVoiceSubId();
|
||||
int voiceSubId = mSubDefaults.getDefaultVoiceSubId();
|
||||
if (!SubscriptionManager.isValidSubscriptionId(voiceSubId)) {
|
||||
for (MobileSignalController mobileSignalController :
|
||||
mMobileSignalControllers.values()) {
|
||||
if (!mobileSignalController.isEmergencyOnly()) {
|
||||
if (!mobileSignalController.getState().isEmergency) {
|
||||
if (DEBUG) Log.d(TAG, "Found emergency " + mobileSignalController.mTag);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
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);
|
||||
// Something is wrong, better assume we can't make calls...
|
||||
@@ -375,6 +381,11 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
if (!mListening) {
|
||||
return;
|
||||
}
|
||||
doUpdateMobileControllers();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void doUpdateMobileControllers() {
|
||||
List<SubscriptionInfo> subscriptions = mSubscriptionManager.getActiveSubscriptionInfoList();
|
||||
if (subscriptions == null) {
|
||||
subscriptions = Collections.emptyList();
|
||||
@@ -389,6 +400,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
}
|
||||
setCurrentSubscriptions(subscriptions);
|
||||
updateNoSims();
|
||||
recalculateEmergency();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -425,7 +437,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
} else {
|
||||
MobileSignalController controller = new MobileSignalController(mContext, mConfig,
|
||||
mHasMobileDataFeature, mPhone, mCallbackHandler,
|
||||
this, subscriptions.get(i), mReceiverHandler.getLooper());
|
||||
this, subscriptions.get(i), mSubDefaults, mReceiverHandler.getLooper());
|
||||
mMobileSignalControllers.put(subId, controller);
|
||||
if (subscriptions.get(i).getSimSlotIndex() == 0) {
|
||||
mDefaultSignalController = controller;
|
||||
@@ -708,7 +720,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
null, 0, 0, "");
|
||||
mMobileSignalControllers.put(id, new MobileSignalController(mContext,
|
||||
mConfig, mHasMobileDataFeature, mPhone, mCallbackHandler, this, info,
|
||||
mReceiverHandler.getLooper()));
|
||||
mSubDefaults, mReceiverHandler.getLooper()));
|
||||
return info;
|
||||
}
|
||||
|
||||
@@ -735,6 +747,16 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
void setEmergencyCallsOnly(boolean emergencyOnly);
|
||||
}
|
||||
|
||||
public static class SubscriptionDefaults {
|
||||
public int getDefaultVoiceSubId() {
|
||||
return SubscriptionManager.getDefaultVoiceSubId();
|
||||
}
|
||||
|
||||
public int getDefaultDataSubId() {
|
||||
return SubscriptionManager.getDefaultDataSubId();
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static class Config {
|
||||
boolean showAtLeast3G = false;
|
||||
|
||||
@@ -36,6 +36,7 @@ import com.android.internal.telephony.cdma.EriInfo;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.statusbar.policy.NetworkController.IconState;
|
||||
import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
|
||||
import com.android.systemui.statusbar.policy.NetworkControllerImpl.SubscriptionDefaults;
|
||||
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mockito;
|
||||
@@ -66,6 +67,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
|
||||
protected TelephonyManager mMockTm;
|
||||
protected Config mConfig;
|
||||
protected CallbackHandler mCallbackHandler;
|
||||
protected SubscriptionDefaults mMockSubDefaults;
|
||||
|
||||
protected int mSubId;
|
||||
|
||||
@@ -79,6 +81,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
|
||||
mMockTm = mock(TelephonyManager.class);
|
||||
mMockSm = mock(SubscriptionManager.class);
|
||||
mMockCm = mock(ConnectivityManager.class);
|
||||
mMockSubDefaults = mock(SubscriptionDefaults.class);
|
||||
mNetCapabilities = new NetworkCapabilities();
|
||||
when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true);
|
||||
when(mMockCm.getDefaultNetworkCapabilitiesForUser(0)).thenReturn(
|
||||
@@ -92,25 +95,39 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
|
||||
mCallbackHandler = mock(CallbackHandler.class);
|
||||
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
|
||||
mConfig, Looper.getMainLooper(), mCallbackHandler,
|
||||
mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class));
|
||||
mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class),
|
||||
mMockSubDefaults);
|
||||
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() {
|
||||
// For now just pretend to be the data sim, so we can test that too.
|
||||
mSubId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
|
||||
SubscriptionInfo subscription = mock(SubscriptionInfo.class);
|
||||
List<SubscriptionInfo> subs = new ArrayList<SubscriptionInfo>();
|
||||
when(subscription.getSubscriptionId()).thenReturn(mSubId);
|
||||
subs.add(subscription);
|
||||
mNetworkController.setCurrentSubscriptions(subs);
|
||||
setDefaultSubId(mSubId);
|
||||
setSubscriptions(mSubId);
|
||||
mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId);
|
||||
mMobileSignalController.getState().dataSim = true;
|
||||
mPhoneStateListener = mMobileSignalController.mPhoneStateListener;
|
||||
}
|
||||
|
||||
// Trigger blank callbacks to always get the current state (some tests don't trigger
|
||||
// changes from default state).
|
||||
mNetworkController.addSignalCallback(null);
|
||||
protected void setDefaultSubId(int subId) {
|
||||
when(mMockSubDefaults.getDefaultDataSubId()).thenReturn(subId);
|
||||
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() {
|
||||
@@ -119,7 +136,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
|
||||
= new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
|
||||
mConfig, Looper.getMainLooper(), mCallbackHandler,
|
||||
mock(AccessPointControllerImpl.class),
|
||||
mock(MobileDataControllerImpl.class));
|
||||
mock(MobileDataControllerImpl.class), mMockSubDefaults);
|
||||
|
||||
setupNetworkController();
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
|
||||
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
|
||||
mConfig, Looper.getMainLooper(), mCallbackHandler,
|
||||
Mockito.mock(AccessPointControllerImpl.class),
|
||||
Mockito.mock(MobileDataControllerImpl.class));
|
||||
Mockito.mock(MobileDataControllerImpl.class), mMockSubDefaults);
|
||||
setupNetworkController();
|
||||
|
||||
setupDefaultSignal();
|
||||
|
||||
@@ -21,7 +21,6 @@ import android.content.Intent;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.os.Looper;
|
||||
import android.telephony.ServiceState;
|
||||
import android.telephony.SignalStrength;
|
||||
import android.telephony.SubscriptionInfo;
|
||||
import android.telephony.TelephonyManager;
|
||||
@@ -30,6 +29,7 @@ import com.android.internal.telephony.PhoneConstants;
|
||||
import com.android.internal.telephony.TelephonyIntents;
|
||||
import com.android.systemui.R;
|
||||
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -43,7 +43,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
|
||||
// Create a new NetworkController as this is currently handled in constructor.
|
||||
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
|
||||
mConfig, Looper.getMainLooper(), mCallbackHandler,
|
||||
mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class));
|
||||
mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class),
|
||||
mMockSubDefaults);
|
||||
setupNetworkController();
|
||||
|
||||
verifyLastMobileDataIndicators(false, 0, 0);
|
||||
@@ -57,13 +58,33 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
|
||||
verifyHasNoSims(true);
|
||||
}
|
||||
|
||||
public void testEmergencyOnly() {
|
||||
setupDefaultSignal();
|
||||
mNetworkController.recalculateEmergency();
|
||||
verifyEmergencyOnly(false);
|
||||
|
||||
mMobileSignalController.getState().isEmergency = true;
|
||||
mNetworkController.recalculateEmergency();
|
||||
verifyEmergencyOnly(true);
|
||||
}
|
||||
|
||||
public void testEmergencyOnlyNoSubscriptions() {
|
||||
setupDefaultSignal();
|
||||
mNetworkController.recalculateEmergency();
|
||||
verifyEmergencyOnly(false);
|
||||
|
||||
setSubscriptions();
|
||||
verifyEmergencyOnly(true);
|
||||
}
|
||||
|
||||
public void testNoSimlessIconWithoutMobile() {
|
||||
// Turn off mobile network support.
|
||||
Mockito.when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false);
|
||||
// Create a new NetworkController as this is currently handled in constructor.
|
||||
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
|
||||
mConfig, Looper.getMainLooper(), mCallbackHandler,
|
||||
mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class));
|
||||
mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class),
|
||||
mMockSubDefaults);
|
||||
setupNetworkController();
|
||||
|
||||
// No Subscriptions.
|
||||
@@ -418,4 +439,11 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
|
||||
TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][strength] /* strengthIcon */,
|
||||
DEFAULT_ICON /* typeIcon */);
|
||||
}
|
||||
|
||||
private void verifyEmergencyOnly(boolean isEmergencyOnly) {
|
||||
ArgumentCaptor<Boolean> emergencyOnly = ArgumentCaptor.forClass(Boolean.class);
|
||||
Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setEmergencyCallsOnly(
|
||||
emergencyOnly.capture());
|
||||
assertEquals(isEmergencyOnly, (boolean) emergencyOnly.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user