/*
 * Copyright (C) 2016 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 com.android.server.wifi.scanner;

import android.net.wifi.WifiScanner;
import android.util.Log;

import com.android.server.wifi.WifiNative;

/**
 * KnownBandsChannelHelper that uses band to channel mappings retrieved from wificond.
 * Also supporting updating the channel list from the wificond on demand.
 */
public class WificondChannelHelper extends KnownBandsChannelHelper {
    private static final String TAG = "WificondChannelHelper";

    private final WifiNative mWifiNative;

    public WificondChannelHelper(WifiNative wifiNative) {
        mWifiNative = wifiNative;
        final int[] emptyFreqList = new int[0];
        setBandChannels(emptyFreqList, emptyFreqList, emptyFreqList, emptyFreqList, emptyFreqList);
        updateChannels();
    }

    @Override
    public void updateChannels() {
        int[] channels24G =
                mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_24_GHZ);
        if (channels24G == null) Log.e(TAG, "Failed to get channels for 2.4GHz band");
        int[] channels5G = mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ);
        if (channels5G == null) Log.e(TAG, "Failed to get channels for 5GHz band");
        int[] channelsDfs =
                mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY);
        if (channelsDfs == null) Log.e(TAG, "Failed to get channels for 5GHz DFS only band");
        int[] channels6G =
                mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_6_GHZ);
        if (channels6G == null) Log.e(TAG, "Failed to get channels for 6GHz band");
        int[] channels60G =
                mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_60_GHZ);
        if (channels60G == null) Log.e(TAG, "Failed to get channels for 60GHz band");

        if (channels24G == null || channels5G == null || channelsDfs == null
                || channels6G == null || channels60G == null) {
            Log.e(TAG, "Failed to get all channels for band, not updating band channel lists");
        } else if (channels24G.length > 0 || channels5G.length > 0 || channelsDfs.length > 0
                || channels6G.length > 0 || channels60G.length > 0) {
            setBandChannels(channels24G, channels5G, channelsDfs, channels6G, channels60G);
        } else {
            Log.e(TAG, "Got zero length for all channel lists");
        }
    }
}
