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

Commit a72a038b authored by Bonian Chen's avatar Bonian Chen
Browse files

[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
parent 8a9ad065
Loading
Loading
Loading
Loading
+16 −79
Original line number Diff line number Diff line
@@ -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);
        }
    }

}