summaryrefslogtreecommitdiffstats
path: root/wifi/java/android/net/wifi
diff options
context:
space:
mode:
authorYuhao Zheng <yuhaozheng@google.com>2014-02-05 19:20:23 -0800
committerYuhao Zheng <yuhaozheng@google.com>2014-02-18 15:26:29 -0800
commit738803fee62a98f244250996380820c4923e7f7b (patch)
tree3cda4da835fa6f5af50a3c17f7855e96032a7305 /wifi/java/android/net/wifi
parentf556adf45e7fd925259b5c6bc87d23f0400a51c1 (diff)
downloadframeworks_base-738803fee62a98f244250996380820c4923e7f7b.zip
frameworks_base-738803fee62a98f244250996380820c4923e7f7b.tar.gz
frameworks_base-738803fee62a98f244250996380820c4923e7f7b.tar.bz2
Add new API to scan a given channel set
Create new (hidden) APIs to scan a specified channel set. This is mainly for location service for now, as doing frequent full scans (including DFS channel) kills battery. This set of new APIs contains: - API to query available channel list for scanning, and DFS channels are marked - API to scan a specified channel set Selective scan results are returned in the same way as normal full scan ones. In order not to intrude full scan results, BSS_FLUSH is NOT performed before a selective scan. Therefore, selective scan results may contain results that's not in the given channel set, and post-filtering may be required for location service use. Bug: 12610436 Change-Id: Icced18dd9b54f6dd92c0c2874d31518d56af8163
Diffstat (limited to 'wifi/java/android/net/wifi')
-rw-r--r--wifi/java/android/net/wifi/IWifiManager.aidl6
-rw-r--r--wifi/java/android/net/wifi/ScanSettings.aidl19
-rw-r--r--wifi/java/android/net/wifi/ScanSettings.java87
-rw-r--r--wifi/java/android/net/wifi/WifiChannel.aidl19
-rw-r--r--wifi/java/android/net/wifi/WifiChannel.java87
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java58
6 files changed, 272 insertions, 4 deletions
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 4a6b1ff..84e933d 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -20,6 +20,8 @@ import android.net.wifi.BatchedScanResult;
import android.net.wifi.BatchedScanSettings;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
+import android.net.wifi.ScanSettings;
+import android.net.wifi.WifiChannel;
import android.net.wifi.ScanResult;
import android.net.DhcpInfo;
@@ -45,7 +47,9 @@ interface IWifiManager
boolean pingSupplicant();
- void startScan(in WorkSource ws);
+ List<WifiChannel> getChannelList();
+
+ void startScan(in ScanSettings requested, in WorkSource ws);
List<ScanResult> getScanResults(String callingPackage);
diff --git a/wifi/java/android/net/wifi/ScanSettings.aidl b/wifi/java/android/net/wifi/ScanSettings.aidl
new file mode 100644
index 0000000..ebd2a39
--- /dev/null
+++ b/wifi/java/android/net/wifi/ScanSettings.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2014, The Android Open Source Project
+ *
+ * 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 android.net.wifi;
+
+parcelable ScanSettings;
diff --git a/wifi/java/android/net/wifi/ScanSettings.java b/wifi/java/android/net/wifi/ScanSettings.java
new file mode 100644
index 0000000..094ce34
--- /dev/null
+++ b/wifi/java/android/net/wifi/ScanSettings.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2014, The Android Open Source Project
+ *
+ * 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 android.net.wifi;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Bundle of customized scan settings
+ *
+ * @see WifiManager#startCustomizedScan
+ *
+ * @hide
+ */
+public class ScanSettings implements Parcelable {
+
+ /** channel set to scan. this can be null or empty, indicating a full scan */
+ public Collection<WifiChannel> channelSet;
+
+ /** public constructor */
+ public ScanSettings() { }
+
+ /** copy constructor */
+ public ScanSettings(ScanSettings source) {
+ if (source.channelSet != null)
+ channelSet = new ArrayList<WifiChannel>(source.channelSet);
+ }
+
+ /** check for validity */
+ public boolean isValid() {
+ for (WifiChannel channel : channelSet)
+ if (!channel.isValid()) return false;
+ return true;
+ }
+
+ /** implement Parcelable interface */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** implement Parcelable interface */
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(channelSet == null ? 0 : channelSet.size());
+ if (channelSet != null)
+ for (WifiChannel channel : channelSet) channel.writeToParcel(out, flags);
+ }
+
+ /** implement Parcelable interface */
+ public static final Parcelable.Creator<ScanSettings> CREATOR =
+ new Parcelable.Creator<ScanSettings>() {
+ @Override
+ public ScanSettings createFromParcel(Parcel in) {
+ ScanSettings settings = new ScanSettings();
+ int size = in.readInt();
+ if (size > 0) {
+ settings.channelSet = new ArrayList<WifiChannel>(size);
+ while (size-- > 0)
+ settings.channelSet.add(WifiChannel.CREATOR.createFromParcel(in));
+ }
+ return settings;
+ }
+
+ @Override
+ public ScanSettings[] newArray(int size) {
+ return new ScanSettings[size];
+ }
+ };
+}
diff --git a/wifi/java/android/net/wifi/WifiChannel.aidl b/wifi/java/android/net/wifi/WifiChannel.aidl
new file mode 100644
index 0000000..c3d06bd
--- /dev/null
+++ b/wifi/java/android/net/wifi/WifiChannel.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2014, The Android Open Source Project
+ *
+ * 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 android.net.wifi;
+
+parcelable WifiChannel;
diff --git a/wifi/java/android/net/wifi/WifiChannel.java b/wifi/java/android/net/wifi/WifiChannel.java
new file mode 100644
index 0000000..640481e
--- /dev/null
+++ b/wifi/java/android/net/wifi/WifiChannel.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2014, The Android Open Source Project
+ *
+ * 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 android.net.wifi;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Wifi Channel
+ *
+ * @see ScanSettings
+ *
+ * @hide
+ */
+public class WifiChannel implements Parcelable {
+
+ private static final int MIN_FREQ_MHZ = 2412;
+ private static final int MAX_FREQ_MHZ = 5825;
+
+ private static final int MIN_CHANNEL_NUM = 1;
+ private static final int MAX_CHANNEL_NUM = 196;
+
+ /** frequency */
+ public int freqMHz;
+
+ /** channel number */
+ public int channelNum;
+
+ /** is it a DFS channel? */
+ public boolean isDFS;
+
+ /** public constructor */
+ public WifiChannel() { }
+
+ /** check for validity */
+ public boolean isValid() {
+ if (freqMHz < MIN_FREQ_MHZ || freqMHz > MAX_FREQ_MHZ) return false;
+ if (channelNum < MIN_CHANNEL_NUM || channelNum > MAX_CHANNEL_NUM) return false;
+ return true;
+ }
+
+ /** implement Parcelable interface */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** implement Parcelable interface */
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(freqMHz);
+ out.writeInt(channelNum);
+ out.writeInt(isDFS ? 1 : 0);
+ }
+
+ /** implement Parcelable interface */
+ public static final Parcelable.Creator<WifiChannel> CREATOR =
+ new Parcelable.Creator<WifiChannel>() {
+ @Override
+ public WifiChannel createFromParcel(Parcel in) {
+ WifiChannel channel = new WifiChannel();
+ channel.freqMHz = in.readInt();
+ channel.channelNum = in.readInt();
+ channel.isDFS = in.readInt() != 0;
+ return channel;
+ }
+
+ @Override
+ public WifiChannel[] newArray(int size) {
+ return new WifiChannel[size];
+ }
+ };
+}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index aabe007..0862b7e 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -20,6 +20,8 @@ import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.content.Context;
import android.net.DhcpInfo;
+import android.net.wifi.ScanSettings;
+import android.net.wifi.WifiChannel;
import android.os.Binder;
import android.os.IBinder;
import android.os.Handler;
@@ -763,6 +765,22 @@ public class WifiManager {
}
/**
+ * Get a list of available channels for customized scan.
+ *
+ * @see {@link WifiChannel}
+ *
+ * @return the channel list, or null if not available
+ * @hide
+ */
+ public List<WifiChannel> getChannelList() {
+ try {
+ return mService.getChannelList();
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ /**
* Request a scan for access points. Returns immediately. The availability
* of the results is made known later by means of an asynchronous event sent
* on completion of the scan.
@@ -770,8 +788,7 @@ public class WifiManager {
*/
public boolean startScan() {
try {
- final WorkSource workSource = null;
- mService.startScan(workSource);
+ mService.startScan(null, null);
return true;
} catch (RemoteException e) {
return false;
@@ -781,7 +798,42 @@ public class WifiManager {
/** @hide */
public boolean startScan(WorkSource workSource) {
try {
- mService.startScan(workSource);
+ mService.startScan(null, workSource);
+ return true;
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Request a scan for access points in specified channel list. Each channel is specified by its
+ * frequency in MHz, e.g. "5500" (do NOT include "DFS" even though it is). The availability of
+ * the results is made known later in the same way as {@link #startScan}.
+ *
+ * Note:
+ *
+ * 1. Customized scan is for non-connection purposes, i.e. it won't trigger a wifi connection
+ * even though it finds some known networks.
+ *
+ * 2. Customized scan result may include access points that is not specified in the channel
+ * list. An app will need to do frequency filtering if it wants to get pure results for the
+ * channel list it specified.
+ *
+ * @hide
+ */
+ public boolean startCustomizedScan(ScanSettings requested) {
+ try {
+ mService.startScan(requested, null);
+ return true;
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ /** @hide */
+ public boolean startCustomizedScan(ScanSettings requested, WorkSource workSource) {
+ try {
+ mService.startScan(requested, workSource);
return true;
} catch (RemoteException e) {
return false;