1712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills/*
2712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Copyright (C) 2016 The Android Open Source Project
3712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills *
4712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Licensed under the Apache License, Version 2.0 (the "License");
5712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * you may not use this file except in compliance with the License.
6712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * You may obtain a copy of the License at
7712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills *
8712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills *      http://www.apache.org/licenses/LICENSE-2.0
9712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills *
10712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Unless required by applicable law or agreed to in writing, software
11712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * distributed under the License is distributed on an "AS IS" BASIS,
12712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * See the License for the specific language governing permissions and
14712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * limitations under the License.
15712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */
16712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills
17712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willspackage com.android.server.wifi.scanner;
18712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills
19712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willsimport android.net.wifi.WifiScanner;
20216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Piusimport android.util.ArraySet;
21712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills
22712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willsimport com.android.server.wifi.WifiNative;
23712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills
2439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Willsimport java.util.Set;
2539175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills
26712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills/**
27712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * ChannelHelper offers an abstraction for channel manipulation utilities allowing operation to be
28712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * adjusted based on the amount of information known about the available channels.
29712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */
30712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willspublic abstract class ChannelHelper {
31712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills
32798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills    // TODO: Currently this is simply an estimate and is used for both active and passive channels
33798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills    //       scans. Eventually it should be split between passive and active and perhaps retrieved
34798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills    //       from the driver.
35798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills    /**
36798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills     * The estimated period spent scanning each channel. This is used for estimating scan duration.
37798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills     */
38798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills    public static final int SCAN_PERIOD_PER_CHANNEL_MS = 200;
39798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills
40e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills    protected static final WifiScanner.ChannelSpec[] NO_CHANNELS = new WifiScanner.ChannelSpec[0];
41e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills
42712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills    /**
43712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills     * Create a new collection that can be used to store channels
44712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills     */
45712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills    public abstract ChannelCollection createChannelCollection();
46712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills
47712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills    /**
4839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills     * Return true if the specified channel is expected for a scan with the given settings
4939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills     */
5039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills    public abstract boolean settingsContainChannel(WifiScanner.ScanSettings settings, int channel);
5139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills
5239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills    /**
53798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills     * Get the channels that are available for scanning on the supplied band.
54798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills     * This method may return empty if the information is not available.
55798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills     */
56798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills    public abstract WifiScanner.ChannelSpec[] getAvailableScanChannels(int band);
57798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills
58798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills    /**
59798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills     * Estimates the duration that the chip will spend scanning with the given settings
60798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills     */
61798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills    public abstract int estimateScanDuration(WifiScanner.ScanSettings settings);
62798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills
63798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills    /**
64e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills     * Update the channel information that this object has. The source of the update is
65e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills     * implementation dependent and may result in no change. Warning the behavior of a
66e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills     * ChannelCollection created using {@link #createChannelCollection createChannelCollection} is
67e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills     * undefined after calling this method until the {@link ChannelColleciton#clear() clear} method
68e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills     * is called on it.
69e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills     */
70e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills    public void updateChannels() {
71e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills        // default implementation does nothing
72e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills    }
73e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills
74e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills    /**
75712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills     * Object that supports accumulation of channels and bands
76712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills     */
77712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills    public abstract class ChannelCollection {
78712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        /**
79712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         * Add a channel to the collection
80712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         */
81712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public abstract void addChannel(int channel);
82712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        /**
83712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         * Add all channels in the band to the collection
84712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         */
85712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public abstract void addBand(int band);
86712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        /**
8739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills         * @return true if the collection contains the supplied channel
8839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills         */
8939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills        public abstract boolean containsChannel(int channel);
9039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills        /**
91216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         * @return true if the collection contains all the channels of the supplied band
92216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         */
93216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        public abstract boolean containsBand(int band);
94216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        /**
95216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         * @return true if the collection contains some of the channels of the supplied band
96216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         */
97216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        public abstract boolean partiallyContainsBand(int band);
98216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        /**
9939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills         * @return true if the collection contains no channels
10039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills         */
10139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills        public abstract boolean isEmpty();
10239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills        /**
1033219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills         * @return true if the collection contains all available channels
1043219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills         */
1053219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills        public abstract boolean isAllChannels();
1063219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills        /**
107712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         * Remove all channels from the collection
108712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         */
109712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public abstract void clear();
110216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        /**
111216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         * Retrieves a list of channels from the band which are missing in the channel collection.
112216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         */
113216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        public abstract Set<Integer> getMissingChannelsFromBand(int band);
114216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        /**
115216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         * Retrieves a list of channels from the band which are contained in the channel collection.
116216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         */
117216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        public abstract Set<Integer> getContainingChannelsFromBand(int band);
118216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        /**
119216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         * Gets a list of channels specified in the current channel collection. This will return
120216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         * an empty set if an entire Band if specified or if the list is empty.
121216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         */
122216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        public abstract Set<Integer> getChannelSet();
123712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills
124712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        /**
125712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         * Add all channels in the ScanSetting to the collection
126712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         */
12739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills        public void addChannels(WifiScanner.ScanSettings scanSettings) {
12839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills            if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
12939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills                for (int j = 0; j < scanSettings.channels.length; ++j) {
13039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills                    addChannel(scanSettings.channels[j].frequency);
13139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills                }
13239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills            } else {
13339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills                addBand(scanSettings.band);
13439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills            }
13539175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills        }
13639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills
13739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills        /**
13839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills         * Add all channels in the BucketSettings to the collection
13939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills         */
14039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills        public void addChannels(WifiNative.BucketSettings bucketSettings) {
14139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills            if (bucketSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
14239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills                for (int j = 0; j < bucketSettings.channels.length; ++j) {
14339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills                    addChannel(bucketSettings.channels[j].frequency);
144712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills                }
145712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills            } else {
14639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills                addBand(bucketSettings.band);
147712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills            }
148712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        }
149712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills
150712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        /**
151216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         * Checks if all channels in ScanSetting is in the collection
152216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         */
153216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        public boolean containsSettings(WifiScanner.ScanSettings scanSettings) {
154216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
155216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                for (int j = 0; j < scanSettings.channels.length; ++j) {
156216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                    if (!containsChannel(scanSettings.channels[j].frequency)) {
157216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                        return false;
158216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                    }
159216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                }
160216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                return true;
161216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            } else {
162216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                return containsBand(scanSettings.band);
163216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            }
164216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        }
165216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius
166216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        /**
167216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         * Checks if at least some of the channels in ScanSetting is in the collection
168216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         */
169216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        public boolean partiallyContainsSettings(WifiScanner.ScanSettings scanSettings) {
170216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
171216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                for (int j = 0; j < scanSettings.channels.length; ++j) {
172216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                    if (containsChannel(scanSettings.channels[j].frequency)) {
173216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                        return true;
174216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                    }
175216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                }
176216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                return false;
177216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            } else {
178216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                return partiallyContainsBand(scanSettings.band);
179216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            }
180216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        }
181216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius
182216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        /**
183216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         * Retrieves a list of missing channels in the collection from the provided settings.
184216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         */
185216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        public Set<Integer> getMissingChannelsFromSettings(WifiScanner.ScanSettings scanSettings) {
186216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
187216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                ArraySet<Integer> missingChannels = new ArraySet<>();
188216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                for (int j = 0; j < scanSettings.channels.length; ++j) {
189216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                    if (!containsChannel(scanSettings.channels[j].frequency)) {
190216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                        missingChannels.add(scanSettings.channels[j].frequency);
191216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                    }
192216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                }
193216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                return missingChannels;
194216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            } else {
195216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                return getMissingChannelsFromBand(scanSettings.band);
196216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            }
197216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        }
198216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius
199216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        /**
200216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         * Retrieves a list of containing channels in the collection from the provided settings.
201216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius         */
202216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        public Set<Integer> getContainingChannelsFromSettings(
203216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                WifiScanner.ScanSettings scanSettings) {
204216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
205216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                ArraySet<Integer> containingChannels = new ArraySet<>();
206216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                for (int j = 0; j < scanSettings.channels.length; ++j) {
207216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                    if (containsChannel(scanSettings.channels[j].frequency)) {
208216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                        containingChannels.add(scanSettings.channels[j].frequency);
209216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                    }
210216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                }
211216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                return containingChannels;
212216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            } else {
213216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius                return getContainingChannelsFromBand(scanSettings.band);
214216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius            }
215216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        }
216216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius
217216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius        /**
218712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         * Store the channels in this collection in the supplied BucketSettings. If maxChannels is
219712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         * exceeded or a band better describes the channels then a band is specified instead of a
220712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         * channel list.
221712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills         */
222712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public abstract void fillBucketSettings(WifiNative.BucketSettings bucket, int maxChannels);
22339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills
22439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills        /**
2259dc9a8750ecd1ab25c5b4c7d17c8930ca2ffb6c3Ningyuan Wang         * Gets the list of channels scan. Will either be a collection of all channels or null
2269dc9a8750ecd1ab25c5b4c7d17c8930ca2ffb6c3Ningyuan Wang         * if all channels should be scanned.
22739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills         */
2289dc9a8750ecd1ab25c5b4c7d17c8930ca2ffb6c3Ningyuan Wang        public abstract Set<Integer> getScanFreqs();
229712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills    }
23054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills
23154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills
23254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    /*
23354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills     * Utility methods for converting band/channels to strings
23454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills     */
23554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills
23654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    /**
23754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills     * Create a string representation of the channels in the ScanSettings.
23854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills     * If it contains a list of channels then the channels are returned, otherwise a string name of
23954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills     * the band is returned.
24054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills     */
24154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    public static String toString(WifiScanner.ScanSettings scanSettings) {
24254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
24354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            return toString(scanSettings.channels);
24454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        } else {
24554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            return toString(scanSettings.band);
24654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        }
24754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    }
24854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills
24954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    /**
25054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills     * Create a string representation of the channels in the BucketSettings.
25154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills     * If it contains a list of channels then the channels are returned, otherwise a string name of
25254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills     * the band is returned.
25354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills     */
25454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    public static String toString(WifiNative.BucketSettings bucketSettings) {
25554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        if (bucketSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
25654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            return toString(bucketSettings.channels, bucketSettings.num_channels);
25754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        } else {
25854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            return toString(bucketSettings.band);
25954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        }
26054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    }
26154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills
26254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    private static String toString(WifiScanner.ChannelSpec[] channels) {
26354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        if (channels == null) {
26454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            return "null";
26554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        }
26654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills
26754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        StringBuilder sb = new StringBuilder();
26854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        sb.append("[");
26954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        for (int c = 0; c < channels.length; c++) {
27054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            sb.append(channels[c].frequency);
27154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            if (c != channels.length - 1) {
27254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills                sb.append(",");
27354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            }
27454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        }
27554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        sb.append("]");
27654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        return sb.toString();
27754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    }
27854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills
27954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    private static String toString(WifiNative.ChannelSettings[] channels, int numChannels) {
28054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        if (channels == null) {
28154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            return "null";
28254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        }
28354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills
28454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        StringBuilder sb = new StringBuilder();
28554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        sb.append("[");
28654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        for (int c = 0; c < numChannels; c++) {
28754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            sb.append(channels[c].frequency);
28854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            if (c != numChannels - 1) {
28954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills                sb.append(",");
29054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            }
29154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        }
29254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        sb.append("]");
29354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        return sb.toString();
29454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    }
29554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills
29654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    private static String toString(int band) {
29754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        switch (band) {
29854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            case WifiScanner.WIFI_BAND_UNSPECIFIED:
29954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills                return "unspecified";
30054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            case WifiScanner.WIFI_BAND_24_GHZ:
30154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills                return "24Ghz";
30254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            case WifiScanner.WIFI_BAND_5_GHZ:
30354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills                return "5Ghz (no DFS)";
30454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            case WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY:
30554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills                return "5Ghz (DFS only)";
30654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            case WifiScanner.WIFI_BAND_5_GHZ_WITH_DFS:
30754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills                return "5Ghz (DFS incl)";
30854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            case WifiScanner.WIFI_BAND_BOTH:
30954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills                return "24Ghz & 5Ghz (no DFS)";
31054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            case WifiScanner.WIFI_BAND_BOTH_WITH_DFS:
31154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills                return "24Ghz & 5Ghz (DFS incl)";
31254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        }
31354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills
31454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills        return "invalid band";
31554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills    }
316712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills}
317