WifiScannerImpl.java revision ee0ab818341d44614ffe56ae73ecc08b974c2cbb
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.server.wifi.scanner; 18 19import android.content.Context; 20import android.net.wifi.ScanResult; 21import android.net.wifi.WifiScanner; 22import android.os.Looper; 23 24import com.android.server.wifi.Clock; 25import com.android.server.wifi.WifiNative; 26 27import java.util.Comparator; 28 29/** 30 * Defines the interface to the Wifi hardware required for the WifiScanner API 31 */ 32public abstract class WifiScannerImpl { 33 34 /** 35 * A factory that create a {@link com.android.server.wifi.scanner.WifiScannerImpl} 36 */ 37 public static interface WifiScannerImplFactory { 38 WifiScannerImpl create(Context context, Looper looper, Clock clock); 39 } 40 41 /** 42 * Factory that create the implementation that is most appropriate for the system. 43 * This factory should only ever be used once. 44 */ 45 public static final WifiScannerImplFactory DEFAULT_FACTORY = new WifiScannerImplFactory() { 46 public WifiScannerImpl create(Context context, Looper looper, Clock clock) { 47 WifiNative wifiNative = WifiNative.getWlanNativeInterface(); 48 if (wifiNative.getScanCapabilities(new WifiNative.ScanCapabilities())) { 49 return new HalWifiScannerImpl(context, wifiNative, looper, clock); 50 } else { 51 return new SupplicantWifiScannerImpl(context, wifiNative, looper, clock); 52 } 53 } 54 }; 55 56 /** 57 * A comparator that implements the sort order that is expected for scan results 58 */ 59 protected static final Comparator<ScanResult> SCAN_RESULT_SORT_COMPARATOR = 60 new Comparator<ScanResult>() { 61 public int compare(ScanResult r1, ScanResult r2) { 62 return r2.level - r1.level; 63 } 64 }; 65 66 /** 67 * Cleanup any ongoing operations. This may be called when the driver is unloaded. 68 * There is no expectation that failure events are returned for ongoing operations. 69 */ 70 public abstract void cleanup(); 71 72 /** 73 * Get the supported scan capabilities. 74 * 75 * @param capabilities Object that will be filled with the supported capabilities if successful 76 * @return true if the scan capabilities were retrieved successfully 77 */ 78 public abstract boolean getScanCapabilities(WifiNative.ScanCapabilities capabilities); 79 80 /** 81 * Get a ChannelHelper that can be used to perform operations on scan channels 82 */ 83 public abstract ChannelHelper getChannelHelper(); 84 85 /** 86 * Start a one time scan. This method should only be called when there is no scan going on 87 * (after a callback indicating that the previous scan succeeded/failed). 88 * @return if the scan paramaters are valid 89 * Note this may return true even if the parameters are not accepted by the chip because the 90 * scan may be scheduled async. 91 */ 92 public abstract boolean startSingleScan(WifiNative.ScanSettings settings, 93 WifiNative.ScanEventHandler eventHandler); 94 /** 95 * Get the scan results of the most recent single scan. This should be called immediately when 96 * the scan success callback is receieved. 97 */ 98 public abstract WifiScanner.ScanData getLatestSingleScanResults(); 99 100 /** 101 * Start a background scan. Calling this method while a background scan is already in process 102 * will interrupt the previous scan settings and replace it with the new ones. 103 * @return if the scan paramaters are valid 104 * Note this may return true even if the parameters are not accepted by the chip because the 105 * scan may be scheduled async. 106 */ 107 public abstract boolean startBatchedScan(WifiNative.ScanSettings settings, 108 WifiNative.ScanEventHandler eventHandler); 109 /** 110 * Stop the currently active background scan 111 */ 112 public abstract void stopBatchedScan(); 113 114 /** 115 * Pause the currently active background scan 116 */ 117 public abstract void pauseBatchedScan(); 118 119 /** 120 * Restart the currently paused background scan 121 */ 122 public abstract void restartBatchedScan(); 123 124 /** 125 * Get the latest cached scan results from the last scan event. This should be called 126 * immediately when the scan success callback is receieved. 127 */ 128 public abstract WifiScanner.ScanData[] getLatestBatchedScanResults(boolean flush); 129 130 /** 131 * Set PNO list to start PNO background scan. 132 * @param settings PNO settings for this scan. 133 * @param eventHandler Event handler for notifying the scan results. 134 * @return true if success, false otherwise 135 */ 136 public abstract boolean setHwPnoList(WifiNative.PnoSettings settings, 137 WifiNative.PnoEventHandler eventHandler); 138 139 /** 140 * Reset PNO list to terminate PNO background scan. 141 * @return true if success, false otherwise 142 */ 143 public abstract boolean resetHwPnoList(); 144 145 /** 146 * This returns whether HW PNO is supported or not. 147 * @param isConnectedPno Whether this is connected PNO vs disconnected PNO. 148 * @return true if HW PNO is supported, false otherwise. 149 */ 150 public abstract boolean isHwPnoSupported(boolean isConnectedPno); 151 152 /** 153 * This returns whether a background scan should be running for HW PNO scan or not. 154 * @return true if background scan needs to be started, false otherwise. 155 */ 156 public abstract boolean shouldScheduleBackgroundScanForHwPno(); 157 158 /** 159 * Set a new hotlist 160 */ 161 public abstract boolean setHotlist(WifiScanner.HotlistSettings settings, 162 WifiNative.HotlistEventHandler eventHandler); 163 164 /** 165 * Reset any active hotlist 166 */ 167 public abstract void resetHotlist(); 168 169 /** 170 * Start tracking significant wifi changes 171 */ 172 public abstract boolean trackSignificantWifiChange(WifiScanner.WifiChangeSettings settings, 173 WifiNative.SignificantWifiChangeEventHandler handler); 174 175 /** 176 * Stop tracking significant wifi changes 177 */ 178 public abstract void untrackSignificantWifiChange(); 179} 180