diff options
Diffstat (limited to 'service')
6 files changed, 124 insertions, 99 deletions
diff --git a/service/java/com/android/server/wifi/ClientModeManager.java b/service/java/com/android/server/wifi/ClientModeManager.java index 14d55de1e..22db07a8f 100644 --- a/service/java/com/android/server/wifi/ClientModeManager.java +++ b/service/java/com/android/server/wifi/ClientModeManager.java @@ -26,6 +26,7 @@ import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; +import com.android.internal.util.IState; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.server.wifi.WifiNative.InterfaceCallback; @@ -46,7 +47,7 @@ public class ClientModeManager implements ActiveModeManager { private final ScanRequestProxy mScanRequestProxy; private String mClientInterfaceName; - + private boolean mIfaceIsUp; ClientModeManager(Context context, @NonNull Looper looper, WifiNative wifiNative, Listener listener, WifiMetrics wifiMetrics, ScanRequestProxy scanRequestProxy) { @@ -69,7 +70,20 @@ public class ClientModeManager implements ActiveModeManager { * Disconnect from any currently connected networks and stop client mode. */ public void stop() { - mStateMachine.sendMessage(ClientModeStateMachine.CMD_STOP); + IState currentState = mStateMachine.getCurrentState(); + Log.d(TAG, " currentstate: " + currentState); + if (mClientInterfaceName != null) { + if (mIfaceIsUp) { + updateWifiState(WifiManager.WIFI_STATE_DISABLING, + WifiManager.WIFI_STATE_ENABLED); + } else { + updateWifiState(WifiManager.WIFI_STATE_DISABLING, + WifiManager.WIFI_STATE_ENABLING); + } + } + if (currentState != null) { + currentState.exit(); + } } /** @@ -106,17 +120,11 @@ public class ClientModeManager implements ActiveModeManager { private class ClientModeStateMachine extends StateMachine { // Commands for the state machine. public static final int CMD_START = 0; - public static final int CMD_STOP = 1; - public static final int CMD_WIFINATIVE_FAILURE = 2; public static final int CMD_INTERFACE_STATUS_CHANGED = 3; public static final int CMD_INTERFACE_DESTROYED = 4; + public static final int CMD_INTERFACE_DOWN = 5; private final State mIdleState = new IdleState(); private final State mStartedState = new StartedState(); - private WifiNative.StatusListener mWifiNativeStatusListener = (boolean isReady) -> { - if (!isReady) { - sendMessage(CMD_WIFINATIVE_FAILURE); - } - }; private final InterfaceCallback mWifiNativeInterfaceCallback = new InterfaceCallback() { @Override @@ -135,8 +143,6 @@ public class ClientModeManager implements ActiveModeManager { } }; - private boolean mIfaceIsUp = false; - ClientModeStateMachine(Looper looper) { super(TAG, looper); @@ -152,8 +158,8 @@ public class ClientModeManager implements ActiveModeManager { @Override public void enter() { Log.d(TAG, "entering IdleState"); - mWifiNative.registerStatusListener(mWifiNativeStatusListener); mClientInterfaceName = null; + mIfaceIsUp = false; } @Override @@ -174,10 +180,6 @@ public class ClientModeManager implements ActiveModeManager { } transitionTo(mStartedState); break; - case CMD_STOP: - // This should be safe to ignore. - Log.d(TAG, "received CMD_STOP when idle, ignoring"); - break; default: Log.d(TAG, "received an invalid message: " + message); return NOT_HANDLED; @@ -200,10 +202,10 @@ public class ClientModeManager implements ActiveModeManager { WifiManager.WIFI_STATE_ENABLING); } else { // if the interface goes down we should exit and go back to idle state. - Log.d(TAG, "interface down! may need to restart ClientMode"); + Log.d(TAG, "interface down!"); updateWifiState(WifiManager.WIFI_STATE_UNKNOWN, - WifiManager.WIFI_STATE_UNKNOWN); - mStateMachine.sendMessage(CMD_STOP); + WifiManager.WIFI_STATE_ENABLED); + mStateMachine.sendMessage(CMD_INTERFACE_DOWN); } } @@ -221,25 +223,16 @@ public class ClientModeManager implements ActiveModeManager { case CMD_START: // Already started, ignore this command. break; - case CMD_STOP: - Log.d(TAG, "Stopping client mode."); + case CMD_INTERFACE_DOWN: + Log.d(TAG, "Interface down! stop mode"); updateWifiState(WifiManager.WIFI_STATE_DISABLING, - WifiManager.WIFI_STATE_ENABLED); - mWifiNative.teardownInterface(mClientInterfaceName); + WifiManager.WIFI_STATE_UNKNOWN); transitionTo(mIdleState); break; case CMD_INTERFACE_STATUS_CHANGED: boolean isUp = message.arg1 == 1; onUpChanged(isUp); break; - case CMD_WIFINATIVE_FAILURE: - Log.d(TAG, "WifiNative failure - may need to restart ClientMode!"); - updateWifiState(WifiManager.WIFI_STATE_UNKNOWN, - WifiManager.WIFI_STATE_UNKNOWN); - updateWifiState(WifiManager.WIFI_STATE_DISABLING, - WifiManager.WIFI_STATE_ENABLED); - transitionTo(mIdleState); - break; case CMD_INTERFACE_DESTROYED: Log.d(TAG, "interface destroyed - client mode stopping"); @@ -259,12 +252,18 @@ public class ClientModeManager implements ActiveModeManager { */ @Override public void exit() { + if (mClientInterfaceName == null) { + return; + } + mWifiNative.teardownInterface(mClientInterfaceName); // let WifiScanner know that wifi is down. sendScanAvailableBroadcast(false); updateWifiState(WifiManager.WIFI_STATE_DISABLED, WifiManager.WIFI_STATE_DISABLING); mScanRequestProxy.enableScanningForHiddenNetworks(false); mScanRequestProxy.clearScanResults(); + mClientInterfaceName = null; + mIfaceIsUp = false; } } diff --git a/service/java/com/android/server/wifi/ScanOnlyModeManager.java b/service/java/com/android/server/wifi/ScanOnlyModeManager.java index f1351b24f..3e7f96b1b 100644 --- a/service/java/com/android/server/wifi/ScanOnlyModeManager.java +++ b/service/java/com/android/server/wifi/ScanOnlyModeManager.java @@ -26,6 +26,7 @@ import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; +import com.android.internal.util.IState; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.server.wifi.WifiNative.InterfaceCallback; @@ -49,7 +50,6 @@ public class ScanOnlyModeManager implements ActiveModeManager { private String mClientInterfaceName; - ScanOnlyModeManager(@NonNull Context context, @NonNull Looper looper, @NonNull WifiNative wifiNative, @NonNull Listener listener, @NonNull WifiMetrics wifiMetrics, @@ -75,7 +75,11 @@ public class ScanOnlyModeManager implements ActiveModeManager { * Cancel any pending scans and stop scan mode. */ public void stop() { - mStateMachine.sendMessage(ScanOnlyModeStateMachine.CMD_STOP); + IState currentState = mStateMachine.getCurrentState(); + Log.d(TAG, " currentstate: " + currentState); + if (currentState != null) { + currentState.exit(); + } } /** @@ -100,8 +104,6 @@ public class ScanOnlyModeManager implements ActiveModeManager { private class ScanOnlyModeStateMachine extends StateMachine { // Commands for the state machine. public static final int CMD_START = 0; - public static final int CMD_STOP = 1; - public static final int CMD_WIFINATIVE_FAILURE = 2; public static final int CMD_INTERFACE_STATUS_CHANGED = 3; public static final int CMD_INTERFACE_DESTROYED = 4; public static final int CMD_INTERFACE_DOWN = 5; @@ -109,12 +111,6 @@ public class ScanOnlyModeManager implements ActiveModeManager { private final State mIdleState = new IdleState(); private final State mStartedState = new StartedState(); - private final WifiNative.StatusListener mWifiNativeStatusListener = (boolean isReady) -> { - if (!isReady) { - sendMessage(CMD_WIFINATIVE_FAILURE); - } - }; - private final InterfaceCallback mWifiNativeInterfaceCallback = new InterfaceCallback() { @Override public void onDestroyed(String ifaceName) { @@ -154,7 +150,6 @@ public class ScanOnlyModeManager implements ActiveModeManager { @Override public void enter() { Log.d(TAG, "entering IdleState"); - mWifiNative.registerStatusListener(mWifiNativeStatusListener); mClientInterfaceName = null; } @@ -172,10 +167,6 @@ public class ScanOnlyModeManager implements ActiveModeManager { } transitionTo(mStartedState); break; - case CMD_STOP: - // This should be safe to ignore. - Log.d(TAG, "received CMD_STOP when idle, ignoring"); - break; default: Log.d(TAG, "received an invalid message: " + message); return NOT_HANDLED; @@ -218,10 +209,6 @@ public class ScanOnlyModeManager implements ActiveModeManager { case CMD_START: // Already started, ignore this command. break; - case CMD_STOP: - Log.d(TAG, "Stopping scan mode."); - transitionTo(mIdleState); - break; case CMD_INTERFACE_DESTROYED: Log.d(TAG, "Interface cleanly destroyed, report scan mode stop."); transitionTo(mIdleState); @@ -231,8 +218,7 @@ public class ScanOnlyModeManager implements ActiveModeManager { onUpChanged(isUp); break; case CMD_INTERFACE_DOWN: - case CMD_WIFINATIVE_FAILURE: - Log.d(TAG, "native/interface failure! restart services?"); + Log.d(TAG, "interface down! stop mode"); updateWifiState(WifiManager.WIFI_STATE_UNKNOWN); transitionTo(mIdleState); break; @@ -248,8 +234,12 @@ public class ScanOnlyModeManager implements ActiveModeManager { */ @Override public void exit() { + if (mClientInterfaceName == null) { + return; + } mWakeupController.stop(); - //mWifiNative.teardownInterface(mClientInterfaceName); + mWifiNative.teardownInterface(mClientInterfaceName); + mClientInterfaceName = null; // let WifiScanner know that wifi is down. sendScanAvailableBroadcast(false); updateWifiState(WifiManager.WIFI_STATE_DISABLED); diff --git a/service/java/com/android/server/wifi/SoftApManager.java b/service/java/com/android/server/wifi/SoftApManager.java index d2d0c4a37..77c217ab2 100644 --- a/service/java/com/android/server/wifi/SoftApManager.java +++ b/service/java/com/android/server/wifi/SoftApManager.java @@ -37,12 +37,12 @@ import android.util.Log; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.IState; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.internal.util.WakeupMessage; import com.android.server.wifi.WifiNative.InterfaceCallback; import com.android.server.wifi.WifiNative.SoftApListener; -import com.android.server.wifi.WifiNative.StatusListener; import com.android.server.wifi.util.ApConfigUtil; import java.util.Locale; @@ -72,6 +72,7 @@ public class SoftApManager implements ActiveModeManager { private final WifiManager.SoftApCallback mCallback; private String mApInterfaceName; + private boolean mIfaceIsUp; private final WifiApConfigStore mWifiApConfigStore; @@ -134,7 +135,20 @@ public class SoftApManager implements ActiveModeManager { * Stop soft AP. */ public void stop() { - mStateMachine.sendMessage(SoftApStateMachine.CMD_STOP); + IState currentState = mStateMachine.getCurrentState(); + Log.d(TAG, " currentstate: " + currentState); + if (mApInterfaceName != null) { + if (mIfaceIsUp) { + updateApState(WifiManager.WIFI_AP_STATE_DISABLING, + WifiManager.WIFI_AP_STATE_ENABLED, 0); + } else { + updateApState(WifiManager.WIFI_AP_STATE_DISABLING, + WifiManager.WIFI_AP_STATE_ENABLING, 0); + } + } + if (currentState != null) { + currentState.exit(); + } } /** @@ -219,8 +233,6 @@ public class SoftApManager implements ActiveModeManager { private class SoftApStateMachine extends StateMachine { // Commands for the state machine. public static final int CMD_START = 0; - public static final int CMD_STOP = 1; - public static final int CMD_WIFINATIVE_FAILURE = 2; public static final int CMD_INTERFACE_STATUS_CHANGED = 3; public static final int CMD_NUM_ASSOCIATED_STATIONS_CHANGED = 4; public static final int CMD_NO_ASSOCIATED_STATIONS_TIMEOUT = 5; @@ -232,12 +244,6 @@ public class SoftApManager implements ActiveModeManager { private final State mIdleState = new IdleState(); private final State mStartedState = new StartedState(); - private final StatusListener mWifiNativeStatusListener = (boolean isReady) -> { - if (!isReady) { - sendMessage(CMD_WIFINATIVE_FAILURE); - } - }; - private final InterfaceCallback mWifiNativeInterfaceCallback = new InterfaceCallback() { @Override public void onDestroyed(String ifaceName) { @@ -274,8 +280,8 @@ public class SoftApManager implements ActiveModeManager { private class IdleState extends State { @Override public void enter() { - mWifiNative.registerStatusListener(mWifiNativeStatusListener); mApInterfaceName = null; + mIfaceIsUp = false; } @Override @@ -320,8 +326,6 @@ public class SoftApManager implements ActiveModeManager { } private class StartedState extends State { - private boolean mIfaceIsUp; - private int mNumAssociatedStations; private boolean mTimeoutEnabled; @@ -454,8 +458,10 @@ public class SoftApManager implements ActiveModeManager { @Override public void exit() { - // will trigger interface teardown when interface management is dynamic - // stopSoftAp(); + if (mApInterfaceName == null) { + return; + } + stopSoftAp(); if (mSettingObserver != null) { mSettingObserver.unregister(); } @@ -467,6 +473,8 @@ public class SoftApManager implements ActiveModeManager { mWifiMetrics.addSoftApUpChangedEvent(false, mMode); updateApState(WifiManager.WIFI_AP_STATE_DISABLED, WifiManager.WIFI_AP_STATE_DISABLING, 0); + mApInterfaceName = null; + mIfaceIsUp = false; } @Override @@ -517,12 +525,6 @@ public class SoftApManager implements ActiveModeManager { break; } Log.i(TAG, "Timeout message received. Stopping soft AP."); - stopSoftAp(); - updateApState(WifiManager.WIFI_AP_STATE_DISABLING, - WifiManager.WIFI_AP_STATE_ENABLED, 0); - transitionTo(mIdleState); - break; - case CMD_STOP: updateApState(WifiManager.WIFI_AP_STATE_DISABLING, WifiManager.WIFI_AP_STATE_ENABLED, 0); transitionTo(mIdleState); @@ -533,9 +535,8 @@ public class SoftApManager implements ActiveModeManager { WifiManager.WIFI_AP_STATE_ENABLED, 0); transitionTo(mIdleState); break; - case CMD_WIFINATIVE_FAILURE: case CMD_INTERFACE_DOWN: - Log.w(TAG, "native/interface error, stop and report failure"); + Log.w(TAG, "interface error, stop and report failure"); updateApState(WifiManager.WIFI_AP_STATE_FAILED, WifiManager.WIFI_AP_STATE_ENABLED, WifiManager.SAP_START_FAILURE_GENERAL); diff --git a/service/java/com/android/server/wifi/WifiController.java b/service/java/com/android/server/wifi/WifiController.java index 76b44c82f..607d86341 100644 --- a/service/java/com/android/server/wifi/WifiController.java +++ b/service/java/com/android/server/wifi/WifiController.java @@ -217,10 +217,15 @@ public class WifiController extends StateMachine { case CMD_AP_START_FAILURE: case CMD_AP_STOPPED: case CMD_STA_START_FAILURE: - case CMD_RECOVERY_RESTART_WIFI: case CMD_RECOVERY_RESTART_WIFI_CONTINUE: case CMD_RECOVERY_DISABLE_WIFI: break; + case CMD_RECOVERY_RESTART_WIFI: + // TODO:b/72850700 : when softap is split out, we need to fully disable wifi + // here (like airplane mode toggle). + deferMessage(obtainMessage(CMD_RECOVERY_RESTART_WIFI_CONTINUE)); + transitionTo(mApStaDisabledState); + break; case CMD_USER_PRESENT: mFirstUserSignOnSeen = true; break; @@ -301,7 +306,15 @@ public class WifiController extends StateMachine { sendMessage((Message)(msg.obj)); break; case CMD_RECOVERY_RESTART_WIFI_CONTINUE: - transitionTo(mDeviceActiveState); + if (mSettingsStore.isWifiToggleEnabled()) { + // wifi is currently disabled but the toggle is on, must have had an + // interface down before the recovery triggered + transitionTo(mDeviceActiveState); + break; + } else if (checkScanOnlyModeAvailable()) { + transitionTo(mStaDisabledWithScanState); + break; + } break; default: return NOT_HANDLED; @@ -563,6 +576,14 @@ public class WifiController extends StateMachine { mWifiStateMachine.setHostApRunning(null, false); transitionTo(getNextWifiState()); break; + case CMD_RECOVERY_RESTART_WIFI: + case CMD_RECOVERY_DISABLE_WIFI: + // note: this will need to fully shutdown wifi when softap mode is removed from + // the state machine + loge("Recovery triggered while in softap active, disable"); + mWifiStateMachinePrime.disableWifi(); + transitionTo(getNextWifiState()); + break; default: return NOT_HANDLED; } @@ -605,6 +626,10 @@ public class WifiController extends StateMachine { decrementCountAndReturnToAppropriateState(); } return HANDLED; + } else if (msg.what == CMD_RECOVERY_RESTART_WIFI + || msg.what == CMD_RECOVERY_DISABLE_WIFI) { + // do not want to restart wifi if we are in emergency mode + return HANDLED; } else { return NOT_HANDLED; } diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index dbb83609b..c44384f40 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -97,7 +97,6 @@ import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.server.wifi.WifiNative.InterfaceCallback; -import com.android.server.wifi.WifiNative.StatusListener; import com.android.server.wifi.hotspot2.AnqpEvent; import com.android.server.wifi.hotspot2.IconEvent; import com.android.server.wifi.hotspot2.NetworkDetail; @@ -221,12 +220,6 @@ public class WifiStateMachine extends StateMachine { private String mLastBssid; private int mLastNetworkId; // The network Id we successfully joined - private final StatusListener mWifiNativeStatusListener = (boolean isReady) -> { - if (!isReady) { - sendMessage(CMD_WIFINATIVE_FAILURE); - } - }; - private final InterfaceCallback mWifiNativeInterfaceCallback = new InterfaceCallback() { @Override public void onDestroyed(String ifaceName) { @@ -698,9 +691,6 @@ public class WifiStateMachine extends StateMachine { /* used to indicate that the foreground user was switched */ static final int CMD_USER_STOP = BASE + 207; - /* Signals that one of the native daemons is dead. */ - private static final int CMD_WIFINATIVE_FAILURE = BASE + 250; - /* Indicates that diagnostics should time out a connection start event. */ private static final int CMD_DIAGS_CONNECT_TIMEOUT = BASE + 252; @@ -3530,7 +3520,6 @@ public class WifiStateMachine extends StateMachine { case CMD_DISABLE_P2P_WATCHDOG_TIMER: case CMD_DISABLE_EPHEMERAL_NETWORK: case CMD_SELECT_TX_POWER_SCENARIO: - case CMD_WIFINATIVE_FAILURE: case CMD_INTERFACE_DESTROYED: case CMD_INTERFACE_DOWN: case CMD_INTERFACE_STATUS_CHANGED: @@ -3744,10 +3733,6 @@ public class WifiStateMachine extends StateMachine { // supplicant sendWifiScanAvailable(false); - mWifiNative.registerStatusListener(mWifiNativeStatusListener); - // TODO: This teardown should ideally be handled in STOP_SUPPLICANT to be consistent - // with other mode managers. But, client mode is not yet controlled by - // WifiStateMachinePrime. // TODO: Remove this big hammer. We cannot support concurrent interfaces with this! mWifiNative.teardownAllInterfaces(); mInterfaceName = null; @@ -3794,12 +3779,6 @@ public class WifiStateMachine extends StateMachine { } else { return NOT_HANDLED; } - case CMD_WIFINATIVE_FAILURE: - Log.e(TAG, "One of the native daemons died unexpectedly. Triggering recovery"); - mWifiDiagnostics.captureBugReportData( - WifiDiagnostics.REPORT_REASON_WIFINATIVE_FAILURE); - mWifiInjector.getSelfRecovery().trigger(SelfRecovery.REASON_WIFINATIVE_FAILURE); - break; case CMD_INTERFACE_STATUS_CHANGED: boolean isUp = message.arg1 == 1; // For now, this message can be triggered due to link state and/or interface diff --git a/service/java/com/android/server/wifi/WifiStateMachinePrime.java b/service/java/com/android/server/wifi/WifiStateMachinePrime.java index 8eb521cbb..8099066e5 100644 --- a/service/java/com/android/server/wifi/WifiStateMachinePrime.java +++ b/service/java/com/android/server/wifi/WifiStateMachinePrime.java @@ -19,6 +19,7 @@ package com.android.server.wifi; import android.annotation.NonNull; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; +import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.RemoteException; @@ -29,6 +30,7 @@ import com.android.internal.app.IBatteryStats; import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; +import com.android.server.wifi.WifiNative.StatusListener; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -53,6 +55,8 @@ public class WifiStateMachinePrime { private final Looper mLooper; private final WifiNative mWifiNative; private final IBatteryStats mBatteryStats; + private final SelfRecovery mSelfRecovery; + private BaseWifiDiagnostics mWifiDiagnostics; private Queue<SoftApModeConfiguration> mApConfigQueue = new ConcurrentLinkedQueue<>(); @@ -91,6 +95,8 @@ public class WifiStateMachinePrime { // Client mode failed static final int CMD_CLIENT_MODE_FAILED = BASE + 304; + private StatusListener mWifiNativeStatusListener; + private WifiManager.SoftApCallback mSoftApCallback; /** @@ -111,7 +117,11 @@ public class WifiStateMachinePrime { mActiveModeManagers = new ArraySet(); mDefaultModeManager = defaultModeManager; mBatteryStats = batteryStats; + mSelfRecovery = mWifiInjector.getSelfRecovery(); + mWifiDiagnostics = mWifiInjector.makeWifiDiagnostics(mWifiNative); mModeStateMachine = new ModeStateMachine(); + mWifiNativeStatusListener = new WifiNativeStatusListener(); + mWifiNative.registerStatusListener(mWifiNativeStatusListener); } /** @@ -325,9 +335,11 @@ public class WifiStateMachinePrime { public void onStateChanged(int state) { Log.d(TAG, "State changed from scan only mode."); if (state == WifiManager.WIFI_STATE_UNKNOWN) { + Log.d(TAG, "ScanOnly mode failed"); // error while setting up scan mode or an unexpected failure. mModeStateMachine.sendMessage(CMD_SCAN_ONLY_MODE_FAILED); } else if (state == WifiManager.WIFI_STATE_DISABLED) { + Log.d(TAG, "ScanOnly mode stopped"); //scan only mode stopped mModeStateMachine.sendMessage(CMD_SCAN_ONLY_MODE_STOPPED); } else if (state == WifiManager.WIFI_STATE_ENABLED) { @@ -473,4 +485,23 @@ public class WifiStateMachinePrime { } } + // callback used to receive callbacks about underlying native failures + private final class WifiNativeStatusListener implements StatusListener { + Handler mHandler = new Handler(mLooper); + + @Override + public void onStatusChanged(boolean isReady) { + if (!isReady) { + mHandler.post(() -> { + Log.e(TAG, "One of the native daemons died. Triggering recovery"); + mWifiDiagnostics.captureBugReportData( + WifiDiagnostics.REPORT_REASON_WIFINATIVE_FAILURE); + + // immediately trigger SelfRecovery if we receive a notice about an + // underlying daemon failure + mWifiInjector.getSelfRecovery().trigger(SelfRecovery.REASON_WIFINATIVE_FAILURE); + }); + } + } + }; } |