Merge "Added changes to allow single parameter to scan facade's method setScanFilterServiceData to accept single parameter serviceData. Cleaned up every instance of scan in advertise facade to avoid confusion in logs." into lmp-dev
diff --git a/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java b/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java
index f16ac30..6c461ae 100644
--- a/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java
@@ -813,4 +813,9 @@
     }
     return result;
   }
+
+  @Rpc(description = "Get the end-user-visible name for the end product.")
+  public String getDeviceModel() {
+      return android.os.Build.MODEL;
+  }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothGattFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothGattFacade.java
index cc8dfbb..fceb368 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothGattFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothGattFacade.java
@@ -238,7 +238,7 @@
             Integer mtu
             ) throws Exception {
         if (mBluetoothGattList.get(index) != null) {
-            return mBluetoothGattList.get(index).configureMTU(mtu);
+            return mBluetoothGattList.get(index).requestMtu(mtu);
         } else {
             throw new Exception("Invalid index input:" + index);
         }
@@ -554,8 +554,7 @@
             ) throws Exception {
         boolean result = false;
         if (mBluetoothGattList.get(index) != null) {
-            result = mBluetoothGattList.get(index).requestConnectionParameterUpdate(
-                    connectionPriority);
+            result = mBluetoothGattList.get(index).requestConnectionPriority(connectionPriority);
         } else {
             throw new Exception("Invalid index input:" + index);
         }
@@ -784,8 +783,8 @@
         }
 
         @Override
-        public void onConfigureMTU(BluetoothGatt gatt, int mtu, int status) {
-            Log.d("gatt_connect change onConfigureMTU " + mEventType + " " + index);
+        public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
+            Log.d("gatt_connect change onMtuChanged " + mEventType + " " + index);
             mResults.putString("Type", "onConfigureMTU");
             mResults.putInt("Status", status);
             mResults.putInt("MTU", mtu);
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java
index 13ab63e..e406f44 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java
@@ -337,7 +337,7 @@
             Integer index) throws Exception {
         if (mAdvertiseSettingsList.get(index) != null) {
             AdvertiseSettings mSettings = mAdvertiseSettingsList.get(index);
-            return mSettings.getIsConnectable();
+            return mSettings.isConnectable();
         } else {
             throw new Exception("Invalid index input:" + Integer.toString(index));
         }
@@ -546,7 +546,7 @@
             @RpcParameter(name = "value")
             Boolean value
             ) {
-        mAdvertiseSettingsBuilder.setIsConnectable(value);
+        mAdvertiseSettingsBuilder.setConnectable(value);
     }
 
     /**
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
index 4b2a4cd..e4bb748 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
@@ -386,7 +386,7 @@
         mScanSettingsBuilder.setCallbackType(callbackType);
         mScanSettingsBuilder.setScanMode(scanMode);
         mScanSettingsBuilder.setScanResultType(scanResultType);
-        mScanSettingsBuilder.setReportDelayMillis(reportDelayMillis);
+        mScanSettingsBuilder.setReportDelay(reportDelayMillis);
     }
 
     /**
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java b/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
index ff4c1db..8cc5041 100755
--- a/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
@@ -509,6 +509,32 @@
         return key;
     }
 
+    @Rpc(description = "Sets the preferred Network type")
+    public void setPreferredNetwork(Integer networktype) {
+        android.provider.Settings.Global.putInt(mService.getContentResolver(),
+                android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
+                networktype );
+        mTelephonyManager.setPreferredNetworkType(networktype);
+    }
+
+    @Rpc(description = "Returns the current data connection state")
+    public String getDataConnectionState() {
+        int state = mTelephonyManager.getDataState();
+
+        switch(state) {
+            case TelephonyManager.DATA_DISCONNECTED:
+                return "DATA_DISCONNECTED";
+            case TelephonyManager.DATA_CONNECTING:
+                return "DATA_CONNECTING";
+            case TelephonyManager.DATA_CONNECTED:
+                return "DATA_CONNECTED";
+            case TelephonyManager.DATA_SUSPENDED:
+                return "DATA_SUSPENDED";
+            default:
+                return "DATA_UNKNOWN";
+        }
+    }
+
     @Override
     public void shutdown() {
         phoneStopTrackingCallStateChange();
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/TelecommManagerFacade.java b/Common/src/com/googlecode/android_scripting/facade/tele/TelecommManagerFacade.java
index c9c544f..82da4c9 100644
--- a/Common/src/com/googlecode/android_scripting/facade/tele/TelecommManagerFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/TelecommManagerFacade.java
@@ -61,8 +61,8 @@
     }
 
     @Rpc(description = "Returns whether there is an ongoing phone call.")
-    public Boolean telecommIsInAPhoneCall() {
-        return mTelecommManager.isInAPhoneCall();
+    public Boolean telecommIsInCall() {
+        return mTelecommManager.isInCall();
     }
 
     @Rpc(description = "Silences the rigner if there's a ringing call.")
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java b/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
index 834d8cb..ede261d 100644
--- a/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
@@ -170,7 +170,12 @@
             }
             event.putString("OperatorName", serviceState.getOperatorAlphaLong());
             event.putString("OperatorId", serviceState.getOperatorNumeric());
-            mEventFacade.postEvent("onServiceStateChanged", event);
+            event.putBoolean("ManualNwSelection", serviceState.getIsManualSelection());
+            event.putBoolean("Roaming", serviceState.getRoaming());
+            event.putBoolean("isEmergencyOnly", serviceState.isEmergencyOnly());
+
+            mEventFacade.postEvent("onServiceStateChanged", event.clone());
+            event.clear();
         }
     }
 
diff --git a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java b/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java
index d1ef771..11d4e64 100644
--- a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java
@@ -7,6 +7,7 @@
 import android.content.IntentFilter;
 import android.net.NetworkInfo;
 import android.net.wifi.ScanResult;
+import android.net.wifi.WifiAdapter;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
@@ -33,15 +34,14 @@
 //TODO: make methods handle various wifi states properly
 //e.g. wifi connection result will be null when flight mode is on
 public class WifiManagerFacade extends RpcReceiver {
-  private final static String mEventType = "WiFiManager";
+  private final static String mEventType = "WifiManager";
   private final Service mService;
   private final WifiManager mWifi;
   private final EventFacade mEventFacade;
 
   private final IntentFilter mScanFilter;
   private final IntentFilter mStateChangeFilter;
-  private final WifiScanReceiver mScanFinishedReceiver;
-  private final WifiActionListener mWifiActionListener;
+  private final WifiScanReceiver mScanResultsAvailableReceiver;
   private final WifiStateChangeReceiver mStateChangeReceiver;
 
   private WifiLock mLock;
@@ -60,8 +60,7 @@
     mStateChangeFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
     mStateChangeFilter.setPriority(999);
 
-    mScanFinishedReceiver = new WifiScanReceiver(mEventFacade);
-    mWifiActionListener = new WifiActionListener(mEventFacade);
+    mScanResultsAvailableReceiver = new WifiScanReceiver(mEventFacade);
     mStateChangeReceiver = new WifiStateChangeReceiver();
   }
 
@@ -88,38 +87,37 @@
 
     @Override
     public void onReceive(Context c, Intent intent) {
-      Log.d("Wifi connection scan finished, results available.");
-      mResults.putLong("Timestamp", System.currentTimeMillis()/1000);
-      mResults.putString("Type", "onWifiScanReceive");
-      mEventFacade.postEvent("WifiScanFinished", mResults.clone());
-      mResults.clear();
-      mService.unregisterReceiver(mScanFinishedReceiver);
+      String action = intent.getAction();
+      if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
+          Log.d("Wifi connection scan finished, results available.");
+          mResults.putLong("Timestamp", System.currentTimeMillis()/1000);
+          mEventFacade.postEvent(mEventType + "ScanResultsAvailable", mResults);
+          mResults.clear();
+          mService.unregisterReceiver(mScanResultsAvailableReceiver);
+      }
     }
   }
 
   class WifiActionListener implements WifiManager.ActionListener{
     private final EventFacade mEventFacade;
-    private final Bundle mResults;
+    private final String TAG;
 
-    public WifiActionListener(EventFacade eventFacade) {
+    public WifiActionListener(EventFacade eventFacade, String tag) {
       mEventFacade = eventFacade;
-      mResults = new Bundle();
+      this.TAG = tag;
     }
 
     @Override
     public void onSuccess() {
-      Log.d("WifiActionListener  "+ mEventType);
-      mResults.putString("Type", "onSuccess");
-      mEventFacade.postEvent(mEventType, mResults.clone());
-      mResults.clear();
+      mEventFacade.postEvent(mEventType + TAG + "OnSuccess", null);
     }
 
     @Override
     public void onFailure(int reason) {
       Log.d("WifiActionListener  "+ mEventType);
-      mResults.putString("Type", "onFailure");
-      mEventFacade.postEvent(mEventType, mResults.clone());
-      mResults.clear();
+      Bundle msg = new Bundle();
+      msg.putInt("reason", reason);
+      mEventFacade.postEvent(mEventType + TAG + "OnFailure", msg);
     }
   }
 
@@ -129,8 +127,11 @@
         String action = intent.getAction();
         if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
             Log.d("Wifi network state changed.");
-            if (intent.hasExtra(WifiManager.EXTRA_WIFI_INFO)) {
-              WifiInfo wInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
+            NetworkInfo nInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
+            WifiInfo wInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
+            Log.d("NetworkInfo " + nInfo);
+            Log.d("WifiInfo " + wInfo);
+            if (wInfo != null) {
               Bundle msg = new Bundle();
               String ssid = wInfo.getSSID();
               if (ssid.charAt(0)=='"' && ssid.charAt(ssid.length()-1)=='"') {
@@ -139,12 +140,9 @@
                   msg.putString("ssid", ssid);
               }
               msg.putString("bssid", wInfo.getBSSID());
+              Log.d("WifiNetworkConnected");
               mEventFacade.postEvent("WifiNetworkConnected", msg);
             }
-            NetworkInfo nInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
-            WifiInfo wInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
-            Log.d("NetworkInfo " + nInfo);
-            Log.d("WifiInfo " + wInfo);
         } else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
             Log.d("Supplicant connection state changed.");
             mIsConnected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
@@ -164,7 +162,10 @@
           config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); //?
           config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
       }
-      if (result.capabilities.contains("PSK")) {
+      if (result.capabilities.contains("WPA2-PSK")) {
+          config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK);
+      }
+      if (result.capabilities.contains("WPA-PSK")) {
           config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
       }
       if (result.capabilities.contains("EAP")) {
@@ -173,7 +174,7 @@
           config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
       }
       if (result.capabilities.length() == 5 && result.capabilities.contains("ESS")) {
-          config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+          config.allowedKeyManagement.set(KeyMgmt.NONE);
       }
       config.BSSID = result.BSSID;
       config.scanResultCache = new HashMap<String, ScanResult>();
@@ -190,6 +191,18 @@
       return false;
   }
 
+  @Rpc(description = "Check if wifi scanner is supported on this device.")
+  public Boolean wifiIsScannerSupported() {
+      List<WifiAdapter> adapters = mWifi.getAdapters();
+      boolean s = false;
+      for(WifiAdapter a : adapters) {
+          if (a.isWifiScannerSupported()) {
+              s = true;
+          }
+      }
+      return s;
+  }
+
   @Rpc(description = "Add a network.")
   public Integer wifiAddNetwork(@RpcParameter(name = "wifiId") String wifiId) {
       ScanResult target = null;
@@ -272,7 +285,8 @@
    */
   @Rpc(description = "Forget a wifi network with priority")
   public void wifiForgetNetwork(@RpcParameter(name = "wifiSSID") Integer newtorkId ) {
-    mWifi.forget(newtorkId, mWifiActionListener);
+    WifiActionListener listener = new WifiActionListener(mEventFacade, "ForgetNetwork");
+    mWifi.forget(newtorkId, listener);
   }
 
   @Rpc(description = "Return a list of all the configured wifi networks.")
@@ -325,7 +339,8 @@
       wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
     else
       wifiConfig.preSharedKey = "\"" + wifiPassword + "\"";
-    mWifi.connect(wifiConfig, mWifiActionListener);
+    WifiActionListener listener = new WifiActionListener(mEventFacade, "PriorityConnect");
+    mWifi.connect(wifiConfig, listener);
   }
 
   @Rpc(description = "Reassociates with the currently active access point.",
@@ -349,7 +364,7 @@
   @Rpc(description = "Starts a scan for Wifi access points.",
            returns = "True if the scan was initiated successfully.")
   public Boolean wifiStartScan() {
-    mService.registerReceiver(mScanFinishedReceiver, mScanFilter);
+    mService.registerReceiver(mScanResultsAvailableReceiver, mScanFilter);
     return mWifi.startScan();
   }
 
diff --git a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiPasspointManagerFacade.java b/Common/src/com/googlecode/android_scripting/facade/wifi/WifiPasspointManagerFacade.java
deleted file mode 100644
index eddeb36..0000000
--- a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiPasspointManagerFacade.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2014 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade.wifi;
-
-import android.app.Service;
-import android.content.Context;
-import android.net.wifi.ScanResult;
-import android.net.wifi.passpoint.WifiPasspointManager;
-import android.net.wifi.passpoint.WifiPasspointManager.Channel;
-import android.net.wifi.passpoint.WifiPasspointManager.ChannelListener;
-import android.os.Bundle;
-import android.os.Looper;
-
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.MainThread;
-import com.googlecode.android_scripting.facade.EventFacade;
-import com.googlecode.android_scripting.facade.FacadeManager;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-import com.googlecode.android_scripting.rpc.RpcStartEvent;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.concurrent.Callable;
-
-/**
- * Exposes WifiPasspointManger functionality.
- */
-public class WifiPasspointManagerFacade extends RpcReceiver {
-
-  private final static String mEventType = "WifiPasspointManager";
-  private final Service mService;
-  private final EventFacade mEventFacade;
-  private final WifiPasspointManager mWifiPasspointMgr;
-  private static int mWifiPasspointChannelALCnt;
-  private Hashtable<Integer, WifiPasspointChannelActionListener> mWifiPasspointChannelAlList;
-  private List<ScanResult> mScanResults;
-
-  public WifiPasspointManagerFacade(FacadeManager facadeManager){
-    super(facadeManager);
-    mService = facadeManager.getService();
-    mEventFacade = facadeManager.getReceiver(EventFacade.class);
-    mWifiPasspointMgr = (WifiPasspointManager)mService.getSystemService(Context.WIFI_PASSPOINT_SERVICE);
-    mWifiPasspointChannelAlList = new Hashtable<Integer, WifiPasspointChannelActionListener>();
-    mScanResults = new ArrayList<ScanResult>();
-
-  }
-
-  public class WifiPasspointChannelActionListener implements WifiPasspointManager.ActionListener{
-
-    private ChannelListener mChannelListener;
-    private Channel mChannel;
-    private int mIndex;
-    private final Bundle mStatus;
-
-    public WifiPasspointChannelActionListener(){
-      mChannelListener = new WifiPasspointManager.ChannelListener() {
-        @Override
-        public void onChannelDisconnected() {
-          Log.e("Channel Disconnected with WifiPasspoint Framwork");
-        }
-      };
-      mChannel  = mWifiPasspointMgr.initialize(mService.getApplicationContext(), Looper.getMainLooper() , mChannelListener);
-      mIndex = ++mWifiPasspointChannelALCnt;
-      mStatus = new Bundle();
-    }
-
-    @Override
-    public void onSuccess() {
-      Log.d("onSuccess " + mEventType + " " + mIndex);
-      mStatus.putString("Type", "onSuccess");
-      mEventFacade.postEvent(mEventType + mIndex, mStatus.clone());
-      mStatus.clear();
-    }
-
-    @Override
-    public void onFailure(int reason){
-      Log.d("onFailure " + mEventType + " " + mIndex);
-      mStatus.putString("Type", "onFailure");
-      mStatus.putInt("Reason", reason);
-      mEventFacade.postEvent(mEventType + mIndex, mStatus.clone());
-      mStatus.clear();
-    }
-
-  }
-
-  /**
-   * Constructs a WifiPasspointChannelListener object and initialize it
-   * @return WifiPasspointChannelListener
-   */
-  private WifiPasspointChannelActionListener genWifiPasspointChannelAL() {
-    WifiPasspointChannelActionListener mWifiPpChannelAL =
-        MainThread.run(mService, new Callable<WifiPasspointChannelActionListener>() {
-      @Override
-      public WifiPasspointChannelActionListener call() throws Exception {
-        return new WifiPasspointChannelActionListener();
-      }
-    });
-    mWifiPasspointChannelAlList.put(mWifiPpChannelAL.mIndex, mWifiPpChannelAL);
-    return mWifiPpChannelAL;
-  }
-
-  /**
-   * Shuts down all activities associated with Passpoint
-   */
-  @Rpc(description = "Shuts down all Passpoint activities")
-  public void wifiPasspointShutdown() {
-    this.shutdown();
-  }
-
-  /** RPC Method Section */
-
-  /**
-   * Request ANQP Info of Passpoints
-   * @param mask
-   * @return the id of the Passpoint channel listener associated with this
-   */
-  @Rpc(description = "Request ANQP info.")
-  @RpcStartEvent("ANQPInfo")
-  public Integer requestAnqpInfoOfPasspoints(@RpcParameter(name = "scanIndex") Integer scanIndex,
-      @RpcParameter(name = "mask") Integer mask) {
-    WifiScannerFacade.getWifiScanResult(scanIndex, mScanResults);
-    if(mScanResults != null && mScanResults.size() >= 0) {
-      WifiPasspointChannelActionListener mWifiPpChannelAL = genWifiPasspointChannelAL();
-      mWifiPasspointMgr.requestAnqpInfo(mWifiPpChannelAL.mChannel,  mScanResults, mask, mWifiPpChannelAL);
-      return mWifiPpChannelAL.mIndex;
-    }
-    return -1;
-  }
-  /*
-   * Release all resource before closing down
-   */
-  @Override
-  public void shutdown() {
-    mWifiPasspointChannelAlList.clear();
-    mScanResults.clear();
-  }
-
-}
diff --git a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiRttManagerFacade.java b/Common/src/com/googlecode/android_scripting/facade/wifi/WifiRttManagerFacade.java
index 1acaf4b..d10b7a5 100644
--- a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiRttManagerFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/wifi/WifiRttManagerFacade.java
@@ -101,25 +101,25 @@
       JSONObject j = new JSONObject(rttParam);
       RttParams result = new RttParams();
       if (j.has("deviceType")) {
-          result.deviceType = (int) j.get("deviceType"); 
+          result.deviceType = j.getInt("deviceType");
       }
       if (j.has("requestType")) {
-          result.requestType = (int) j.get("requestType"); 
+          result.requestType = j.getInt("requestType");
       }
       if (j.has("bssid")) {
-          result.bssid = (String) j.get("bssid"); 
+          result.bssid = j.getString("bssid");
       }
       if (j.has("frequency")) {
-          result.frequency = (int) j.get("frequency"); 
+          result.frequency = j.getInt("frequency");
       }
       if (j.has("channelWidth")) {
-          result.channelWidth = (int) j.get("channelWidth"); 
+          result.channelWidth = j.getInt("channelWidth");
       }
       if (j.has("num_samples")) {
-          result.num_samples = (int) j.get("num_samples"); 
+          result.num_samples = j.getInt("num_samples");
       }
       if (j.has("num_retries")) {
-          result.num_retries = (int) j.get("num_retries"); 
+          result.num_retries = j.getInt("num_retries");
       }
       return result;
   }
diff --git a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiScannerFacade.java b/Common/src/com/googlecode/android_scripting/facade/wifi/WifiScannerFacade.java
index 470565b..28ebe3c 100644
--- a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiScannerFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/wifi/WifiScannerFacade.java
@@ -33,7 +33,10 @@
 import com.googlecode.android_scripting.rpc.Rpc;
 import com.googlecode.android_scripting.rpc.RpcParameter;
 
+import java.util.Arrays;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -54,9 +57,9 @@
   private static int WifiScanListenerCnt;
   private static int WifiChangeListenerCnt;
   private static int WifiBssidListenerCnt;
-  private final ConcurrentHashMap<Integer, WifiScanListener> wifiScannerListenerList;
-  private final ConcurrentHashMap<Integer, ChangeListener> wifiChangeListenerList;
-  private final ConcurrentHashMap<Integer, WifiBssidListener> wifiBssidListenerList;
+  private final ConcurrentHashMap<Integer, WifiScanListener> scanListeners;
+  private final ConcurrentHashMap<Integer, ChangeListener> trackChangeListeners;
+  private final ConcurrentHashMap<Integer, WifiBssidListener> trackBssidListeners;
   private static ConcurrentHashMap<Integer, ScanResult[]> wifiScannerResultList;
 
   public WifiScannerFacade(FacadeManager manager) {
@@ -64,22 +67,15 @@
     mService = manager.getService();
     mScan = (WifiScanner) mService.getSystemService(Context.WIFI_SCANNING_SERVICE);
     mEventFacade = manager.getReceiver(EventFacade.class);
-    wifiScannerListenerList = new ConcurrentHashMap<Integer, WifiScanListener>();
-    wifiChangeListenerList = new ConcurrentHashMap<Integer, ChangeListener>();
-    wifiBssidListenerList = new ConcurrentHashMap<Integer, WifiBssidListener>();
+    scanListeners = new ConcurrentHashMap<Integer, WifiScanListener>();
+    trackChangeListeners = new ConcurrentHashMap<Integer, ChangeListener>();
+    trackBssidListeners = new ConcurrentHashMap<Integer, WifiBssidListener>();
     wifiScannerResultList = new ConcurrentHashMap<Integer, ScanResult[]>();
   }
 
-  public static List<ScanResult> getWifiScanResult(Integer listener_index,
-                                                   List<ScanResult> scanResults){
-    synchronized (wifiScannerResultList) {
-      ScanResult[] scanArray = wifiScannerResultList.get(listener_index);
-      if (scanArray != null){
-        for(ScanResult scanresult :  scanArray)
-          scanResults.add(scanresult);
-      }
-      return scanResults;
-    }
+  public static List<ScanResult> getWifiScanResult(Integer listener_index){
+    ScanResult[] sr = wifiScannerResultList.get(listener_index);
+    return Arrays.asList(sr);
   }
 
   private class WifiActionListener implements WifiScanner.ActionListener {
@@ -134,7 +130,7 @@
           return new WifiScanListener();
         }
       });
-    wifiScannerListenerList.put(mWifiScannerListener.mIndex, mWifiScannerListener);
+    scanListeners.put(mWifiScannerListener.mIndex, mWifiScannerListener);
     return mWifiScannerListener;
   }
 
@@ -158,7 +154,7 @@
 
     @Override
     public void onFailure(int reason, String description) {
-      wifiScannerListenerList.remove(mIndex);
+      scanListeners.remove(mIndex);
       mWAL.onFailure(reason, description);
     }
 
@@ -188,7 +184,7 @@
    * Constructs a ChangeListener obj and returns it
    * @return ChangeListener
    */
-  public ChangeListener genWifiChangeListener() {
+  private ChangeListener genWifiChangeListener() {
     ChangeListener mWifiChangeListener = MainThread.run(mService,
                                                         new Callable<ChangeListener>() {
       @Override
@@ -196,7 +192,7 @@
         return new ChangeListener();
       }
     });
-    wifiChangeListenerList.put(mWifiChangeListener.mIndex, mWifiChangeListener);
+    trackChangeListeners.put(mWifiChangeListener.mIndex, mWifiChangeListener);
     return mWifiChangeListener;
   }
 
@@ -220,7 +216,7 @@
 
     @Override
     public void onFailure(int reason, String description) {
-      wifiChangeListenerList.remove(mIndex);
+      trackChangeListeners.remove(mIndex);
       mWAL.onFailure(reason, description);
     }
     /** indicates that changes were detected in wifi environment
@@ -239,7 +235,7 @@
     }
   }
 
-  public WifiBssidListener genWifiBssidListener() {
+  private WifiBssidListener genWifiBssidListener() {
     WifiBssidListener mWifiBssidListener = MainThread.run(mService,
                                                           new Callable<WifiBssidListener>() {
       @Override
@@ -247,7 +243,7 @@
         return new WifiBssidListener();
       }
     });
-    wifiBssidListenerList.put(mWifiBssidListener.mIndex, mWifiBssidListener);
+    trackBssidListeners.put(mWifiBssidListener.mIndex, mWifiBssidListener);
     return mWifiBssidListener;
   }
 
@@ -271,13 +267,13 @@
 
     @Override
     public void onFailure(int reason, String description) {
-      wifiBssidListenerList.remove(mIndex);
+      trackBssidListeners.remove(mIndex);
       mWAL.onFailure(reason, description);
     }
 
     @Override
     public void onFound(ScanResult[] results) {
-      mWAL.reportResult(results, "onBssidFound");
+      mWAL.reportResult(results, "onFound");
     }
   }
 
@@ -304,9 +300,17 @@
       return result;
   }
 
-  /** RPC Methods */
+  private BssidInfo parseBssidInfo(String info) throws JSONException {
+      JSONObject bi = new JSONObject(info);
+      BssidInfo bssidInfo = new BssidInfo();
+      bssidInfo.bssid = bi.getString("bssid");
+      bssidInfo.high = bi.getInt("high");
+      bssidInfo.low = bi.getInt("low");
+      bssidInfo.frequencyHint = bi.getInt("frequencyHint");
+      return bssidInfo;
+  }
 
-  /**
+/**
    * Starts periodic WifiScanner scan
    * @param periodInMs
    * @param channel_freqs frequencies of channels to scan
@@ -314,7 +318,7 @@
    * @throws JSONException
    */
   @Rpc(description = "Starts a periodic WifiScanner scan")
-  public Integer startWifiScannerScan(@RpcParameter(name = "scanSettings") String scanSettings)
+  public Integer wifiScannerStartScan(@RpcParameter(name = "scanSettings") String scanSettings)
           throws JSONException {
     ScanSettings ss = parseScanSettings(scanSettings);
     Log.d("startWifiScannerScan with " + ss.channels);
@@ -323,33 +327,106 @@
     return mListener.mIndex;
   }
 
-  /**
+
+/**
    * Stops a WifiScanner scan
    * @param listener_mIndex the id of the scan listener whose scan to stop
    * @throws Exception
    */
   @Rpc(description = "Stops an ongoing periodic WifiScanner scan")
-  public void stopWifiScannerScan(@RpcParameter(name = "listener") Integer listener_index)
+  public void wifiScannerStopScan(@RpcParameter(name = "listener") Integer listener_index)
           throws Exception {
-    if(!wifiScannerListenerList.containsKey(listener_index)) {
+    if(!scanListeners.containsKey(listener_index)) {
       throw new Exception("Background scan session " + listener_index + " does not exist");
     }
-    WifiScanListener mListener = wifiScannerListenerList.get(listener_index);
+    WifiScanListener mListener = scanListeners.get(listener_index);
     Log.d("stopWifiScannerScan mListener "+ mListener.mIndex );
     mScan.stopBackgroundScan(mListener);
     wifiScannerResultList.remove(listener_index);
-    wifiScannerListenerList.remove(listener_index);
+    scanListeners.remove(listener_index);
+  }
+
+
+/** RPC Methods */
+  @Rpc(description = "Returns the channels covered by the specified band number.")
+  public List<Integer> wifiScannerGetAvailableChannels(@RpcParameter(name = "band") Integer band) {
+    return mScan.getAvailableChannels(band);
+  }
+
+/**
+   * Starts tracking wifi changes
+   * @return the id of the change listener associated with this track
+   * @throws Exception
+   */
+  @Rpc(description = "Starts tracking wifi changes")
+  public Integer wifiScannerStartTrackingChange() throws Exception{
+    ChangeListener listener = genWifiChangeListener();
+    mScan.startTrackingWifiChange(listener);
+    return listener.mIndex;
+  }
+
+/**
+   * Stops tracking wifi changes
+   * @param listener_index the id of the change listener whose track to stop
+   * @throws Exception
+   */
+  @Rpc(description = "Stops tracking wifi changes")
+  public void wifiScannerStopTrackingChange(
+          @RpcParameter(name = "listener") Integer listener_index
+          )throws Exception {
+    if(!trackChangeListeners.containsKey(listener_index)) {
+      throw new Exception("Wifi change tracking session " + listener_index + " does not exist");
+    }
+    ChangeListener mListener = trackChangeListeners.get(listener_index);
+    mScan.stopTrackingWifiChange(mListener);
+    trackChangeListeners.remove(listener_index);
+  }
+
+
+/**
+   * Starts tracking changes of the specified bssids.
+   *
+   * @param bssidInfos An array of json strings, each representing a BssidInfo object.
+   * @param apLostThreshold
+   * @return The index of the listener used to start the tracking.
+   * @throws JSONException
+   */
+  @Rpc(description = "Starts tracking changes of the specified bssids.")
+  public Integer wifiScannerStartTrackingBssids(
+          @RpcParameter(name = "bssidInfos")
+          String[] bssidInfos,
+          @RpcParameter(name = "apLostThreshold")
+          Integer apLostThreshold
+          ) throws JSONException {
+      BssidInfo[] infos = new BssidInfo[bssidInfos.length];
+      for(int i=0; i<bssidInfos.length; i++) {
+          infos[i] = parseBssidInfo(bssidInfos[i]);
+      }
+      WifiBssidListener listener = genWifiBssidListener();
+      mScan.startTrackingBssids(infos, apLostThreshold, listener);
+      return listener.mIndex;
+  }
+
+/**
+   * Stops tracking the list of APs associated with the input listener
+   * @param listener_index the id of the bssid listener whose track to stop
+   * @throws Exception
+   */
+  @Rpc(description = "Stops tracking changes in the APs on the list")
+  public void wifiScannerStopTrackingBssids(
+          @RpcParameter(name = "listener") Integer listener_index
+          )throws Exception {
+    if(!trackBssidListeners.containsKey(listener_index)) {
+      throw new Exception("Bssid tracking session " + listener_index + " does not exist");
+    }
+    WifiBssidListener mListener = trackBssidListeners.get(listener_index);
+    mScan.stopTrackingBssids(mListener);
+    trackBssidListeners.remove(listener_index);
   }
 
   @Rpc(description = "Returns a list of mIndexes of existing listeners")
-  public Integer[] showWifiScanListeners() {
-    Integer[] result = new Integer[wifiScannerListenerList.size()];
-    int j = 0;
-    for(int i : wifiScannerListenerList.keySet()) {
-      result[j] = wifiScannerListenerList.get(i).mIndex;
-      j += 1;
-    }
-    return result;
+  public Set<Integer> wifiGetCurrentScanIndexes() {
+    return scanListeners.keySet();
   }
 
   /**
@@ -390,22 +467,6 @@
   }
 
   /**
-   * Stops tracking wifi changes
-   * @param listener_index the id of the change listener whose track to stop
-   * @throws Exception
-   */
-  @Rpc(description = "Stops tracking wifi changes")
-  public void stopTrackingChange(@RpcParameter(name = "listener") Integer listener_index)
-          throws Exception {
-    if(!wifiChangeListenerList.containsKey(listener_index)) {
-      throw new Exception("Wifi change tracking session " + listener_index + " does not exist");
-    }
-    ChangeListener mListener = wifiChangeListenerList.get(listener_index);
-    mScan.stopTrackingWifiChange(mListener);
-    wifiChangeListenerList.remove(listener_index);
-  }
-
-  /**
    * Starts tracking changes of the wifi networks specified in a list of bssid
    * @param bssidInfos a list specifying which wifi networks to track
    * @param apLostThreshold signal strength below which an AP is considered lost
@@ -438,25 +499,9 @@
   }
 
   /**
-   * Stops tracking the list of APs associated with the input listener
-   * @param listener_index the id of the bssid listener whose track to stop
-   * @throws Exception
-   */
-  @Rpc(description = "Stops tracking changes in the APs on the list")
-  public void stopTrackingBssids(@RpcParameter(name = "listener") Integer listener_index)
-          throws Exception {
-    if(!wifiBssidListenerList.containsKey(listener_index)) {
-      throw new Exception("Bssid tracking session " + listener_index + " does not exist");
-    }
-    WifiBssidListener mListener = wifiBssidListenerList.get(listener_index);
-    mScan.stopTrackingBssids(mListener);
-    wifiBssidListenerList.remove(listener_index);
-  }
-
-  /**
    * Shuts down all activities associated with WifiScanner
    */
-  @Rpc(description = "Shuts down all WifiScanner activities")
+  @Rpc(description = "Shuts down all WifiScanner activities and remove listeners.")
   public void wifiScannerShutdown() {
     this.shutdown();
   }
@@ -467,21 +512,30 @@
   @Override
   public void shutdown() {
     try {
-      if(!wifiScannerListenerList.isEmpty()) {
-        for(int i : wifiScannerListenerList.keySet()) {
-          this.stopWifiScannerScan(i);
+      if(!scanListeners.isEmpty()) {
+        Iterator<ConcurrentHashMap.Entry<Integer, WifiScanListener>> iter
+            = scanListeners.entrySet().iterator();
+        while(iter.hasNext()) {
+            ConcurrentHashMap.Entry<Integer, WifiScanListener> entry = iter.next();
+          this.wifiScannerStopScan(entry.getKey());
         }
       }
-      if(!wifiChangeListenerList.isEmpty()) {
-        for(int i : wifiChangeListenerList.keySet()) {
-          this.stopTrackingChange(i);
+      if(!trackChangeListeners.isEmpty()) {
+          Iterator<ConcurrentHashMap.Entry<Integer, ChangeListener>> iter
+              = trackChangeListeners.entrySet().iterator();
+          while(iter.hasNext()) {
+              ConcurrentHashMap.Entry<Integer, ChangeListener> entry = iter.next();
+            this.wifiScannerStopScan(entry.getKey());
+          }
         }
-      }
-      if(!wifiBssidListenerList.isEmpty()) {
-        for(int i : wifiBssidListenerList.keySet()) {
-          this.stopTrackingBssids(i);
+      if(!trackBssidListeners.isEmpty()) {
+          Iterator<ConcurrentHashMap.Entry<Integer, WifiBssidListener>> iter
+              = trackBssidListeners.entrySet().iterator();
+          while(iter.hasNext()) {
+              ConcurrentHashMap.Entry<Integer, WifiBssidListener> entry = iter.next();
+            this.wifiScannerStopScan(entry.getKey());
+          }
         }
-      }
     } catch (Exception e) {
       Log.e("Shutdown failed: " + e.toString());
     }
diff --git a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
index 184c490..eb444f0 100644
--- a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
+++ b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
@@ -360,7 +360,7 @@
         JSONObject result = new JSONObject();
         result.put("mode", advertiseSettings.getMode());
         result.put("txPowerLevel", advertiseSettings.getTxPowerLevel());
-        result.put("isConnectable", advertiseSettings.getIsConnectable());
+        result.put("isConnectable", advertiseSettings.isConnectable());
         return result;
     }
 
diff --git a/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java b/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java
index 236c870..612de94 100644
--- a/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java
+++ b/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java
@@ -113,7 +113,6 @@
       sFacadeClassList.add(ConnectivityManagerFacade.class);
       sFacadeClassList.add(DisplayFacade.class);
       sFacadeClassList.add(TelecommManagerFacade.class);
-      sFacadeClassList.add(WifiPasspointManagerFacade.class);
       sFacadeClassList.add(WifiRttManagerFacade.class);
       sFacadeClassList.add(WifiScannerFacade.class);
     }
diff --git a/ScriptingLayerForAndroid/Android.mk b/ScriptingLayerForAndroid/Android.mk
index f0c4c1f..63745b3 100644
--- a/ScriptingLayerForAndroid/Android.mk
+++ b/ScriptingLayerForAndroid/Android.mk
@@ -17,7 +17,6 @@
 LOCAL_STATIC_JAVA_LIBRARIES += sl4a.Utils sl4a.Common
 LOCAL_STATIC_JAVA_LIBRARIES += sl4a.InterpreterForAndroid sl4a.ScriptingLayer sl4a.QuickAction
 
-LOCAL_MODULE_TAGS := debug
 LOCAL_PRIVILEGED_MODULE := true
 LOCAL_PROGUARD_ENABLED := disabled
 
diff --git a/ScriptingLayerForAndroid/AndroidManifest.xml b/ScriptingLayerForAndroid/AndroidManifest.xml
index 09005ae..6f3ddb1 100644
--- a/ScriptingLayerForAndroid/AndroidManifest.xml
+++ b/ScriptingLayerForAndroid/AndroidManifest.xml
@@ -36,8 +36,6 @@
     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
     <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
-    <uses-permission android:name="android.permission.ACCESS_BLUETOOTH_SHARE" />
-    <uses-permission android:name="com.android.permission.WHITELIST_BLUETOOTH_DEVICE" />
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />