summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2018-07-24 01:08:31 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-07-24 01:08:31 +0000
commit5b5d0bd0a180b2100a241104f720cc3f7ce486f4 (patch)
tree353f75fb24e08ca267dd778c62591980de0df1e6 /service
parentc463f5688296f22449b9c61090a6c01011e2388e (diff)
parent2a41eab4494b917886f3ab50d98905c7f384f354 (diff)
Merge "WifiScanningService: Scanner enable/disable"
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/ActiveModeManager.java25
-rw-r--r--service/java/com/android/server/wifi/ActiveModeWarden.java35
-rw-r--r--service/java/com/android/server/wifi/ClientModeImpl.java6
-rw-r--r--service/java/com/android/server/wifi/ClientModeManager.java24
-rw-r--r--service/java/com/android/server/wifi/ScanOnlyModeManager.java17
-rw-r--r--service/java/com/android/server/wifi/ScanRequestProxy.java64
-rw-r--r--service/java/com/android/server/wifi/WifiInjector.java4
-rw-r--r--service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java46
8 files changed, 110 insertions, 111 deletions
diff --git a/service/java/com/android/server/wifi/ActiveModeManager.java b/service/java/com/android/server/wifi/ActiveModeManager.java
index 7427123c6..7c50726f9 100644
--- a/service/java/com/android/server/wifi/ActiveModeManager.java
+++ b/service/java/com/android/server/wifi/ActiveModeManager.java
@@ -17,11 +17,6 @@
package com.android.server.wifi;
import android.annotation.IntDef;
-import android.content.Context;
-import android.content.Intent;
-import android.net.wifi.WifiManager;
-import android.os.UserHandle;
-import android.util.Log;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -34,8 +29,6 @@ import java.lang.annotation.RetentionPolicy;
* Currently supported modes include Client, ScanOnly and SoftAp.
*/
public interface ActiveModeManager {
- String TAG = "ActiveModeManager";
-
/**
* Method used to start the Manager for a given Wifi operational mode.
*/
@@ -65,22 +58,4 @@ public interface ActiveModeManager {
* Method to dump for logging state.
*/
void dump(FileDescriptor fd, PrintWriter pw, String[] args);
-
- /**
- * Method that allows Mode Managers to update WifiScanner about the current state.
- *
- * @param context Context to use for the notification
- * @param available boolean indicating if scanning is available
- */
- default void sendScanAvailableBroadcast(Context context, boolean available) {
- Log.d(TAG, "sending scan available broadcast: " + available);
- final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- if (available) {
- intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_ENABLED);
- } else {
- intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_DISABLED);
- }
- context.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
- }
}
diff --git a/service/java/com/android/server/wifi/ActiveModeWarden.java b/service/java/com/android/server/wifi/ActiveModeWarden.java
index 69959502e..06b0013d7 100644
--- a/service/java/com/android/server/wifi/ActiveModeWarden.java
+++ b/service/java/com/android/server/wifi/ActiveModeWarden.java
@@ -317,18 +317,45 @@ public class ActiveModeWarden {
if (mManager != null) {
mManager.stop();
mActiveModeManagers.remove(mManager);
+ updateScanMode();
}
updateBatteryStatsWifiState(false);
}
+
+ // Hook to be used by sub-classes of ModeActiveState to indicate the completion of
+ // bringup of the corresponding mode.
+ public void onModeActivationComplete() {
+ updateScanMode();
+ }
+
+ // Update the scan state based on all active mode managers.
+ // Note: This is an overkill currently because there is only 1 of scan-only or client
+ // mode present today.
+ private void updateScanMode() {
+ boolean scanEnabled = false;
+ boolean scanningForHiddenNetworksEnabled = false;
+ for (ActiveModeManager modeManager : mActiveModeManagers) {
+ @ActiveModeManager.ScanMode int scanState = modeManager.getScanMode();
+ switch (scanState) {
+ case ActiveModeManager.SCAN_NONE:
+ break;
+ case ActiveModeManager.SCAN_WITHOUT_HIDDEN_NETWORKS:
+ scanEnabled = true;
+ break;
+ case ActiveModeManager.SCAN_WITH_HIDDEN_NETWORKS:
+ scanEnabled = true;
+ scanningForHiddenNetworksEnabled = true;
+ break;
+ }
+ }
+ mScanRequestProxy.enableScanning(scanEnabled, scanningForHiddenNetworksEnabled);
+ }
}
class WifiDisabledState extends ModeActiveState {
@Override
public void enter() {
Log.d(TAG, "Entering WifiDisabledState");
- mDefaultModeManager.sendScanAvailableBroadcast(mContext, false);
- mScanRequestProxy.enableScanningForHiddenNetworks(false);
- mScanRequestProxy.clearScanResults();
}
@Override
@@ -369,6 +396,7 @@ public class ActiveModeWarden {
} else if (state == WifiManager.WIFI_STATE_ENABLED) {
// client mode is ready to go
Log.d(TAG, "client mode active");
+ onModeActivationComplete();
} else {
// only care if client mode stopped or started, dropping
}
@@ -452,6 +480,7 @@ public class ActiveModeWarden {
} else if (state == WifiManager.WIFI_STATE_ENABLED) {
// scan mode is ready to go
Log.d(TAG, "scan mode active");
+ onModeActivationComplete();
} else {
Log.d(TAG, "unexpected state update: " + state);
}
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java
index ce4b7045c..23e3f4755 100644
--- a/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -181,7 +181,6 @@ public class ClientModeImpl extends StateMachine {
private WifiConnectivityManager mWifiConnectivityManager;
private ConnectivityManager mCm;
private BaseWifiDiagnostics mWifiDiagnostics;
- private ScanRequestProxy mScanRequestProxy;
private final boolean mP2pSupported;
private final AtomicBoolean mP2pConnected = new AtomicBoolean(false);
private boolean mTemporarilyDisconnectWifi = false;
@@ -794,7 +793,6 @@ public class ClientModeImpl extends StateMachine {
mWifiMonitor = mWifiInjector.getWifiMonitor();
mWifiDiagnostics = mWifiInjector.getWifiDiagnostics();
- mScanRequestProxy = mWifiInjector.getScanRequestProxy();
mWifiPermissionsWrapper = mWifiInjector.getWifiPermissionsWrapper();
mWifiDataStall = mWifiInjector.getWifiDataStall();
@@ -3875,7 +3873,6 @@ public class ClientModeImpl extends StateMachine {
if (!mWifiNative.removeAllNetworks(mInterfaceName)) {
loge("Failed to remove networks on entering connect mode");
}
- mScanRequestProxy.enableScanningForHiddenNetworks(true);
mWifiInfo.reset();
mWifiInfo.setSupplicantState(SupplicantState.DISCONNECTED);
@@ -3914,9 +3911,6 @@ public class ClientModeImpl extends StateMachine {
if (!mWifiNative.removeAllNetworks(mInterfaceName)) {
loge("Failed to remove networks on exiting connect mode");
}
- mScanRequestProxy.enableScanningForHiddenNetworks(false);
- // Do we want to optimize when we move from client mode to scan only mode.
- mScanRequestProxy.clearScanResults();
mWifiInfo.reset();
mWifiInfo.setSupplicantState(SupplicantState.DISCONNECTED);
stopClientMode();
diff --git a/service/java/com/android/server/wifi/ClientModeManager.java b/service/java/com/android/server/wifi/ClientModeManager.java
index 5f523ced7..883b16a61 100644
--- a/service/java/com/android/server/wifi/ClientModeManager.java
+++ b/service/java/com/android/server/wifi/ClientModeManager.java
@@ -47,7 +47,6 @@ public class ClientModeManager implements ActiveModeManager {
private final WifiMetrics mWifiMetrics;
private final Listener mListener;
- private final ScanRequestProxy mScanRequestProxy;
private final ClientModeImpl mClientModeImpl;
private String mClientInterfaceName;
@@ -56,13 +55,11 @@ public class ClientModeManager implements ActiveModeManager {
private boolean mExpectedStop = false;
ClientModeManager(Context context, @NonNull Looper looper, WifiNative wifiNative,
- Listener listener, WifiMetrics wifiMetrics, ScanRequestProxy scanRequestProxy,
- ClientModeImpl clientModeImpl) {
+ Listener listener, WifiMetrics wifiMetrics, ClientModeImpl clientModeImpl) {
mContext = context;
mWifiNative = wifiNative;
mListener = listener;
mWifiMetrics = wifiMetrics;
- mScanRequestProxy = scanRequestProxy;
mClientModeImpl = clientModeImpl;
mStateMachine = new ClientModeStateMachine(looper);
}
@@ -238,9 +235,6 @@ public class ClientModeManager implements ActiveModeManager {
WifiManager.WIFI_STATE_UNKNOWN);
break;
}
- sendScanAvailableBroadcast(false);
- mScanRequestProxy.enableScanningForHiddenNetworks(false);
- mScanRequestProxy.clearScanResults();
transitionTo(mStartedState);
break;
default:
@@ -260,9 +254,8 @@ public class ClientModeManager implements ActiveModeManager {
mIfaceIsUp = isUp;
if (isUp) {
Log.d(TAG, "Wifi is ready to use for client mode");
- sendScanAvailableBroadcast(true);
mClientModeImpl.setOperationalMode(ClientModeImpl.CONNECT_MODE,
- mClientInterfaceName);
+ mClientInterfaceName);
updateWifiState(WifiManager.WIFI_STATE_ENABLED,
WifiManager.WIFI_STATE_ENABLING);
} else {
@@ -284,7 +277,6 @@ public class ClientModeManager implements ActiveModeManager {
Log.d(TAG, "entering StartedState");
mIfaceIsUp = false;
onUpChanged(mWifiNative.isInterfaceUp(mClientInterfaceName));
- mScanRequestProxy.enableScanningForHiddenNetworks(true);
}
@Override
@@ -339,17 +331,5 @@ public class ClientModeManager implements ActiveModeManager {
mStateMachine.quitNow();
}
}
-
- private void sendScanAvailableBroadcast(boolean available) {
- Log.d(TAG, "sending scan available broadcast: " + available);
- final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- if (available) {
- intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_ENABLED);
- } else {
- intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_DISABLED);
- }
- mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
- }
}
}
diff --git a/service/java/com/android/server/wifi/ScanOnlyModeManager.java b/service/java/com/android/server/wifi/ScanOnlyModeManager.java
index 353de9859..c3547be5d 100644
--- a/service/java/com/android/server/wifi/ScanOnlyModeManager.java
+++ b/service/java/com/android/server/wifi/ScanOnlyModeManager.java
@@ -46,7 +46,6 @@ public class ScanOnlyModeManager implements ActiveModeManager {
private final WifiMetrics mWifiMetrics;
private final Listener mListener;
- private final ScanRequestProxy mScanRequestProxy;
private final WakeupController mWakeupController;
private final SarManager mSarManager;
@@ -58,14 +57,12 @@ public class ScanOnlyModeManager implements ActiveModeManager {
ScanOnlyModeManager(@NonNull Context context, @NonNull Looper looper,
@NonNull WifiNative wifiNative, @NonNull Listener listener,
@NonNull WifiMetrics wifiMetrics,
- @NonNull ScanRequestProxy scanRequestProxy,
@NonNull WakeupController wakeupController,
@NonNull SarManager sarManager) {
mContext = context;
mWifiNative = wifiNative;
mListener = listener;
mWifiMetrics = wifiMetrics;
- mScanRequestProxy = scanRequestProxy;
mWakeupController = wakeupController;
mSarManager = sarManager;
mStateMachine = new ScanOnlyModeStateMachine(looper);
@@ -205,14 +202,6 @@ public class ScanOnlyModeManager implements ActiveModeManager {
updateWifiState(WifiManager.WIFI_STATE_UNKNOWN);
break;
}
- // we have a new scanning interface, make sure scanner knows we aren't
- // ready yet and clear out the ScanRequestProxy
- sendScanAvailableBroadcast(false);
- // explicitly disable scanning for hidden networks in case we were
- // previously in client mode
- mScanRequestProxy.enableScanningForHiddenNetworks(false);
- mScanRequestProxy.clearScanResults();
-
transitionTo(mStartedState);
break;
default:
@@ -233,7 +222,6 @@ public class ScanOnlyModeManager implements ActiveModeManager {
if (isUp) {
Log.d(TAG, "Wifi is ready to use for scanning");
mWakeupController.start();
- sendScanAvailableBroadcast(true);
updateWifiState(WifiManager.WIFI_STATE_ENABLED);
} else {
// if the interface goes down we should exit and go back to idle state.
@@ -245,7 +233,6 @@ public class ScanOnlyModeManager implements ActiveModeManager {
@Override
public void enter() {
Log.d(TAG, "entering StartedState");
- mScanRequestProxy.enableScanningForHiddenNetworks(false);
mIfaceIsUp = false;
onUpChanged(mWifiNative.isInterfaceUp(mClientInterfaceName));
@@ -296,8 +283,4 @@ public class ScanOnlyModeManager implements ActiveModeManager {
}
}
}
-
- private void sendScanAvailableBroadcast(boolean available) {
- sendScanAvailableBroadcast(mContext, available);
- }
}
diff --git a/service/java/com/android/server/wifi/ScanRequestProxy.java b/service/java/com/android/server/wifi/ScanRequestProxy.java
index da2fd3e46..900d85095 100644
--- a/service/java/com/android/server/wifi/ScanRequestProxy.java
+++ b/service/java/com/android/server/wifi/ScanRequestProxy.java
@@ -47,6 +47,7 @@ import javax.annotation.concurrent.NotThreadSafe;
* {@link WifiManager#startScan()}.
*
* This class is responsible for:
+ * a) Enable/Disable scanning based on the request from {@link ActiveModeWarden}.
* a) Forwarding scan requests from {@link WifiManager#startScan()} to
* {@link WifiScanner#startScan(WifiScanner.ScanSettings, WifiScanner.ScanListener)}.
* Will essentially proxy scan requests from WifiService to WifiScanningService.
@@ -85,6 +86,8 @@ public class ScanRequestProxy {
// Verbose logging flag.
private boolean mVerboseLoggingEnabled = false;
+ // Flag to decide if we need to scan or not.
+ private boolean mScanningEnabled = false;
// Flag to decide if we need to scan for hidden networks or not.
private boolean mScanningForHiddenNetworksEnabled = false;
// Flag to indicate that we're waiting for scan results from an existing request.
@@ -168,17 +171,6 @@ public class ScanRequestProxy {
}
/**
- * Enable/disable scanning for hidden networks.
- * @param enable true to enable, false to disable.
- */
- public void enableScanningForHiddenNetworks(boolean enable) {
- if (mVerboseLoggingEnabled) {
- Log.d(TAG, "Scanning for hidden networks is " + (enable ? "enabled" : "disabled"));
- }
- mScanningForHiddenNetworksEnabled = enable;
- }
-
- /**
* Helper method to populate WifiScanner handle. This is done lazily because
* WifiScanningService is started after WifiService.
*/
@@ -190,6 +182,54 @@ public class ScanRequestProxy {
}
/**
+ * Method that lets public apps know that scans are available.
+ *
+ * @param context Context to use for the notification
+ * @param available boolean indicating if scanning is available
+ */
+ private void sendScanAvailableBroadcast(Context context, boolean available) {
+ Log.d(TAG, "Sending scan available broadcast: " + available);
+ final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ if (available) {
+ intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_ENABLED);
+ } else {
+ intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_DISABLED);
+ }
+ context.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
+ }
+
+ private void enableScanningInternal(boolean enable) {
+ if (!retrieveWifiScannerIfNecessary()) {
+ Log.e(TAG, "Failed to retrieve wifiscanner");
+ return;
+ }
+ mWifiScanner.setScanningEnabled(enable);
+ sendScanAvailableBroadcast(mContext, enable);
+ clearScanResults();
+ Log.i(TAG, "Scanning is " + (enable ? "enabled" : "disabled"));
+ }
+
+ /**
+ * Enable/disable scanning.
+ *
+ * @param enable true to enable, false to disable.
+ * @param enableScanningForHiddenNetworks true to enable scanning for hidden networks,
+ * false to disable.
+ */
+ public void enableScanning(boolean enable, boolean enableScanningForHiddenNetworks) {
+ if (enable) {
+ enableScanningInternal(true);
+ mScanningForHiddenNetworksEnabled = enableScanningForHiddenNetworks;
+ Log.i(TAG, "Scanning for hidden networks is "
+ + (enableScanningForHiddenNetworks ? "enabled" : "disabled"));
+ } else {
+ enableScanningInternal(false);
+ }
+ mScanningEnabled = enable;
+ }
+
+ /**
* Helper method to send the scan request status broadcast, if there is a scan ongoing.
*/
private void sendScanResultBroadcastIfScanProcessingNotComplete(boolean scanSucceeded) {
@@ -406,7 +446,7 @@ public class ScanRequestProxy {
/**
* Clear the stored scan results.
*/
- public void clearScanResults() {
+ private void clearScanResults() {
mLastScanResults.clear();
mLastScanTimestampForBgApps = 0;
mLastScanTimestampsForFgApps.clear();
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index 7a60104a9..fb8d9eb41 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -485,7 +485,7 @@ public class WifiInjector {
public ScanOnlyModeManager makeScanOnlyModeManager(
@NonNull ScanOnlyModeManager.Listener listener) {
return new ScanOnlyModeManager(mContext, mWifiCoreHandlerThread.getLooper(),
- mWifiNative, listener, mWifiMetrics, mScanRequestProxy, mWakeupController,
+ mWifiNative, listener, mWifiMetrics, mWakeupController,
mSarManager);
}
@@ -497,7 +497,7 @@ public class WifiInjector {
*/
public ClientModeManager makeClientModeManager(ClientModeManager.Listener listener) {
return new ClientModeManager(mContext, mWifiCoreHandlerThread.getLooper(),
- mWifiNative, listener, mWifiMetrics, mScanRequestProxy, mClientModeImpl);
+ mWifiNative, listener, mWifiMetrics, mClientModeImpl);
}
/**
diff --git a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
index d2c4d5af8..4b89c327b 100644
--- a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
+++ b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
@@ -21,13 +21,9 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import android.Manifest;
import android.app.AlarmManager;
-import android.content.BroadcastReceiver;
import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
import android.net.wifi.IWifiScanner;
import android.net.wifi.ScanResult;
-import android.net.wifi.WifiManager;
import android.net.wifi.WifiScanner;
import android.net.wifi.WifiScanner.ChannelSpec;
import android.net.wifi.WifiScanner.PnoSettings;
@@ -130,6 +126,13 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
"LocationHardware");
}
+ private void enforceNetworkStack(int uid) {
+ mContext.enforcePermission(
+ Manifest.permission.NETWORK_STACK,
+ UNKNOWN_PID, uid,
+ "NetworkStack");
+ }
+
private class ClientHandler extends WifiHandler {
ClientHandler(String tag, Looper looper) {
@@ -185,7 +188,11 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
}
try {
- enforceLocationHardwarePermission(msg.sendingUid);
+ if (msg.what == WifiScanner.CMD_ENABLE || msg.what == WifiScanner.CMD_DISABLE) {
+ enforceNetworkStack(msg.sendingUid);
+ } else {
+ enforceLocationHardwarePermission(msg.sendingUid);
+ }
} catch (SecurityException e) {
localLog("failed to authorize app: " + e);
replyFailed(msg, WifiScanner.REASON_NOT_AUTHORIZED, "Not authorized");
@@ -213,6 +220,16 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
}
switch (msg.what) {
+ case WifiScanner.CMD_ENABLE:
+ mBackgroundScanStateMachine.sendMessage(CMD_DRIVER_LOADED);
+ mSingleScanStateMachine.sendMessage(CMD_DRIVER_LOADED);
+ mPnoScanStateMachine.sendMessage(CMD_DRIVER_LOADED);
+ break;
+ case WifiScanner.CMD_DISABLE:
+ mBackgroundScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
+ mSingleScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
+ mPnoScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
+ break;
case WifiScanner.CMD_START_BACKGROUND_SCAN:
case WifiScanner.CMD_STOP_BACKGROUND_SCAN:
mBackgroundScanStateMachine.sendMessage(Message.obtain(msg));
@@ -295,25 +312,6 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
mSingleScanStateMachine = new WifiSingleScanStateMachine(mLooper);
mPnoScanStateMachine = new WifiPnoScanStateMachine(mLooper);
- mContext.registerReceiver(
- new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- int state = intent.getIntExtra(
- WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_DISABLED);
- if (DBG) localLog("SCAN_AVAILABLE : " + state);
- if (state == WifiManager.WIFI_STATE_ENABLED) {
- mBackgroundScanStateMachine.sendMessage(CMD_DRIVER_LOADED);
- mSingleScanStateMachine.sendMessage(CMD_DRIVER_LOADED);
- mPnoScanStateMachine.sendMessage(CMD_DRIVER_LOADED);
- } else if (state == WifiManager.WIFI_STATE_DISABLED) {
- mBackgroundScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
- mSingleScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
- mPnoScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
- }
- }
- }, new IntentFilter(WifiManager.WIFI_SCAN_AVAILABLE));
-
mBackgroundScanStateMachine.start();
mSingleScanStateMachine.start();
mPnoScanStateMachine.start();