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

Commit a26f4a38 authored by Etan Cohen's avatar Etan Cohen
Browse files

[SettingsLib] Update "fix" shim to use new Wifi subsystem restart callbacks

Wi-Fi subsystem restart callbacks have been added to the framework.
Modify the shim to use these callbacks rather than indirectly monitor
whether the WiFi subsystem has restarted.

Bug: 175084231
Test: TBD - pending UI test integration
Change-Id: I9c127532d7cefbf2ff6612562ab46865e456b43a
parent 4f7c0b8a
Loading
Loading
Loading
Loading
+15 −32
Original line number Diff line number Diff line
@@ -23,12 +23,12 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.SubsystemRestartTrackingCallback;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.provider.Settings;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;

/**
@@ -58,36 +58,19 @@ public class ConnectivitySubsystemsRecoveryManager {
    private boolean mWifiRestartInProgress = false;
    private boolean mTelephonyRestartInProgress = false;
    private RecoveryStatusCallback mCurrentRecoveryCallback = null;
    private final BroadcastReceiver mWifiMonitor = new BroadcastReceiver() {
    private final SubsystemRestartTrackingCallback mWifiSubsystemRestartTrackingCallback =
            new SubsystemRestartTrackingCallback() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (!mWifiRestartInProgress || mCurrentRecoveryCallback == null) {
                stopTrackingWifiRestart();
            }

            // TODO: harden this code to avoid race condition. What if WiFi toggled just before
            // recovery triggered. Either use new broadcasts from framework or detect more state
            // changes.
            boolean recoveryDone = false;
            if (TextUtils.equals(intent.getAction(), WifiManager.WIFI_STATE_CHANGED_ACTION)) {
                if (intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
                        WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED) {
                    recoveryDone = true;
                }
            } else if (TextUtils.equals(intent.getAction(),
                    WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
                if (intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE,
                        WifiManager.WIFI_AP_STATE_FAILED) == WifiManager.WIFI_AP_STATE_ENABLED) {
                    recoveryDone = true;
                }
        public void onSubsystemRestarting() {
            // going to do nothing on this - already assuming that subsystem is restarting
        }

            if (recoveryDone) {
        @Override
        public void onSubsystemRestarted() {
            mWifiRestartInProgress = false;
            stopTrackingWifiRestart();
            checkIfAllSubsystemsRestartsAreDone();
        }
        }
    };
    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
        @Override
@@ -208,13 +191,13 @@ public class ConnectivitySubsystemsRecoveryManager {
    }

    private void startTrackingWifiRestart() {
        IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
        mContext.registerReceiver(mWifiMonitor, filter, null, mHandler);
        mWifiManager.registerSubsystemRestartTrackingCallback(new HandlerExecutor(mHandler),
                mWifiSubsystemRestartTrackingCallback);
    }

    private void stopTrackingWifiRestart() {
        mContext.unregisterReceiver(mWifiMonitor);
        mWifiManager.unregisterWifiSubsystemRestartTrackingCallback(
                mWifiSubsystemRestartTrackingCallback);
    }

    private void startTrackingTelephonyRestart() {