[Settings] Refactor AirplaneModeEnabler

1. Multiple instance of PhoneStateListener is not required.
2. It will be better to monitor radio power state changed instead of service state.

Bug: 147029746
Test: Manual
Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=AirplaneModePreferenceControllerTest
Change-Id: I51465904ce2409b6c07c3ba80ea362d208989fbd
This commit is contained in:
Bonian Chen
2019-12-31 16:59:37 +08:00
parent 8a9ad06570
commit a72a038bb6

View File

@@ -22,9 +22,7 @@ import android.content.Intent;
import android.os.UserHandle;
import android.provider.Settings;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -34,7 +32,6 @@ import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.WirelessUtils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.ArrayList;
import java.util.List;
/**
@@ -61,12 +58,11 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener {
private TelephonyManager mTelephonyManager;
private ProxySubscriptionManager mProxySubscriptionMgr;
private List<ServiceStateListener> mServiceStateListeners;
private PhoneStateListener mPhoneStateListener;
private GlobalSettingsChangeListener mAirplaneModeObserver;
public AirplaneModeEnabler(Context context,
OnAirplaneModeChangedListener listener) {
public AirplaneModeEnabler(Context context, OnAirplaneModeChangedListener listener) {
super(context, Settings.Global.AIRPLANE_MODE_ON);
mContext = context;
@@ -75,6 +71,16 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener {
mTelephonyManager = context.getSystemService(TelephonyManager.class);
mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(context);
mPhoneStateListener = new PhoneStateListener() {
@Override
public void onRadioPowerStateChanged(int state) {
if (DEBUG) {
Log.d(LOG_TAG, "RadioPower: " + state);
}
onAirplaneModeChanged();
}
};
}
/**
@@ -88,35 +94,13 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener {
}
public void resume() {
final List<SubscriptionInfo> subInfoList =
mProxySubscriptionMgr.getActiveSubscriptionsInfo();
mServiceStateListeners = new ArrayList<ServiceStateListener>();
// add default listener
mServiceStateListeners.add(new ServiceStateListener(mTelephonyManager,
SubscriptionManager.INVALID_SUBSCRIPTION_ID, this));
if (subInfoList != null) {
for (SubscriptionInfo subInfo : subInfoList) {
mServiceStateListeners.add(new ServiceStateListener(mTelephonyManager,
subInfo.getSubscriptionId(), this));
}
}
for (ServiceStateListener listener : mServiceStateListeners) {
listener.start();
}
mTelephonyManager.listen(mPhoneStateListener,
PhoneStateListener.LISTEN_RADIO_POWER_STATE_CHANGED);
}
public void pause() {
if (mServiceStateListeners == null) {
return;
}
for (ServiceStateListener listener : mServiceStateListeners) {
listener.stop();
}
mServiceStateListeners = null;
mTelephonyManager.listen(mPhoneStateListener,
PhoneStateListener.LISTEN_NONE);
}
private void setAirplaneModeOn(boolean enabling) {
@@ -200,51 +184,4 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener {
public boolean isAirplaneModeOn() {
return WirelessUtils.isAirplaneModeOn(mContext);
}
private static class ServiceStateListener extends PhoneStateListener {
private ServiceStateListener(TelephonyManager telephonyManager, int subscriptionId,
AirplaneModeEnabler enabler) {
super();
mSubId = subscriptionId;
mTelephonyManager = getSubIdSpecificTelephonyManager(telephonyManager);
mEnabler = enabler;
}
private final int mSubId;
private final TelephonyManager mTelephonyManager;
private final AirplaneModeEnabler mEnabler;
int getSubscriptionId() {
return mSubId;
}
void start() {
if (mTelephonyManager != null) {
mTelephonyManager.listen(this, PhoneStateListener.LISTEN_SERVICE_STATE);
}
}
void stop() {
if (mTelephonyManager != null) {
mTelephonyManager.listen(this, PhoneStateListener.LISTEN_NONE);
}
}
@Override
public void onServiceStateChanged(ServiceState serviceState) {
if (DEBUG) {
Log.d(LOG_TAG, "ServiceState in sub" + mSubId + ": " + serviceState);
}
mEnabler.onAirplaneModeChanged();
}
private TelephonyManager getSubIdSpecificTelephonyManager(
TelephonyManager telephonyManager) {
if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
return telephonyManager;
}
return telephonyManager.createForSubscriptionId(mSubId);
}
}
}