blob: 08a4727924721c30d4f67ce663f321b0d01341c5 [file] [log] [blame]
/*
* Copyright (C) 2022 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;
import android.annotation.NonNull;
import android.hardware.wifi.V1_6.IWifiChip;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
/**
* Utility methods for HalDeviceManager.
*/
public class HalDeviceManagerUtil {
static class StaticChipInfo {
private int mChipId;
private long mChipCapabilities;
private @NonNull ArrayList<android.hardware.wifi.V1_6.IWifiChip.ChipMode> mAvailableModes =
new ArrayList<>();
StaticChipInfo(
int chipId,
long chipCapabilities,
@NonNull ArrayList<android.hardware.wifi.V1_6.IWifiChip.ChipMode> availableModes) {
mChipId = chipId;
mChipCapabilities = chipCapabilities;
if (availableModes != null) {
mAvailableModes = availableModes;
}
}
int getChipId() {
return mChipId;
}
long getChipCapabilities() {
return mChipCapabilities;
}
ArrayList<android.hardware.wifi.V1_6.IWifiChip.ChipMode> getAvailableModes() {
return mAvailableModes;
}
}
private static final String KEY_CHIP_ID = "chipId";
private static final String KEY_CHIP_CAPABILITIES = "chipCapabilities";
private static final String KEY_AVAILABLE_MODES = "availableModes";
static JSONObject staticChipInfoToJson(@NonNull StaticChipInfo staticChipInfo)
throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put(KEY_CHIP_ID, staticChipInfo.getChipId());
jsonObject.put(KEY_CHIP_CAPABILITIES, staticChipInfo.getChipCapabilities());
JSONArray availableModesJson = new JSONArray();
for (android.hardware.wifi.V1_6.IWifiChip.ChipMode mode
: staticChipInfo.getAvailableModes()) {
availableModesJson.put(chipModeToJson(mode));
}
jsonObject.put(KEY_AVAILABLE_MODES, availableModesJson);
return jsonObject;
}
static StaticChipInfo jsonToStaticChipInfo(JSONObject jsonObject) throws JSONException {
ArrayList<IWifiChip.ChipMode> availableModes =
new ArrayList<>();
int chipId = jsonObject.getInt(KEY_CHIP_ID);
long chipCapabilities = jsonObject.getLong(KEY_CHIP_CAPABILITIES);
JSONArray modesJson = jsonObject.getJSONArray(KEY_AVAILABLE_MODES);
for (int i = 0; i < modesJson.length(); i++) {
availableModes.add(jsonToChipMode(modesJson.getJSONObject(i)));
}
return new StaticChipInfo(chipId, chipCapabilities, availableModes);
}
private static final String KEY_ID = "id";
private static final String KEY_AVAILABLE_COMBINATIONS = "availableCombinations";
private static JSONObject chipModeToJson(android.hardware.wifi.V1_6.IWifiChip.ChipMode chipMode)
throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put(KEY_ID, chipMode.id);
JSONArray availableCombinationsJson = new JSONArray();
for (IWifiChip.ChipConcurrencyCombination combo
: chipMode.availableCombinations) {
availableCombinationsJson.put(chipConcurrencyCombinationToJson(combo));
}
jsonObject.put(KEY_AVAILABLE_COMBINATIONS, availableCombinationsJson);
return jsonObject;
}
private static android.hardware.wifi.V1_6.IWifiChip.ChipMode jsonToChipMode(
JSONObject jsonObject) throws JSONException {
android.hardware.wifi.V1_6.IWifiChip.ChipMode chipMode =
new android.hardware.wifi.V1_6.IWifiChip.ChipMode();
chipMode.id = jsonObject.getInt(KEY_ID);
JSONArray availableCombinationsJson =
jsonObject.getJSONArray(KEY_AVAILABLE_COMBINATIONS);
for (int i = 0; i < availableCombinationsJson.length(); i++) {
chipMode.availableCombinations.add(jsonToChipConcurrencyCombination(
availableCombinationsJson.getJSONObject(i)));
}
return chipMode;
}
private static final String KEY_CONCURRENCY_LIMITS = "limits";
private static JSONObject chipConcurrencyCombinationToJson(
IWifiChip.ChipConcurrencyCombination combo) throws JSONException {
JSONObject jsonObject = new JSONObject();
JSONArray limitsJson = new JSONArray();
for (IWifiChip.ChipConcurrencyCombinationLimit limit : combo.limits) {
limitsJson.put(chipConcurrencyCombinationLimitToJson(limit));
}
jsonObject.put(KEY_CONCURRENCY_LIMITS, limitsJson);
return jsonObject;
}
private static IWifiChip.ChipConcurrencyCombination jsonToChipConcurrencyCombination(
JSONObject jsonObject) throws JSONException {
IWifiChip.ChipConcurrencyCombination combo = new IWifiChip.ChipConcurrencyCombination();
combo.limits = new ArrayList<>();
JSONArray limitsJson = jsonObject.getJSONArray(KEY_CONCURRENCY_LIMITS);
for (int i = 0; i < limitsJson.length(); i++) {
combo.limits.add(
jsonToChipConcurrencyCombinationLimit(limitsJson.getJSONObject(i)));
}
return combo;
}
private static final String KEY_MAX_IFACES = "maxIfaces";
private static final String KEY_TYPES = "types";
private static JSONObject chipConcurrencyCombinationLimitToJson(
IWifiChip.ChipConcurrencyCombinationLimit limit) throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put(KEY_MAX_IFACES, limit.maxIfaces);
jsonObject.put(KEY_TYPES, new JSONArray(limit.types));
return jsonObject;
}
private static IWifiChip.ChipConcurrencyCombinationLimit jsonToChipConcurrencyCombinationLimit(
JSONObject jsonObject) throws JSONException {
IWifiChip.ChipConcurrencyCombinationLimit
limit = new IWifiChip.ChipConcurrencyCombinationLimit();
limit.maxIfaces = jsonObject.getInt(KEY_MAX_IFACES);
limit.types = new ArrayList<>();
JSONArray limitsJson = jsonObject.getJSONArray(KEY_TYPES);
for (int i = 0; i < limitsJson.length(); i++) {
limit.types.add(limitsJson.getInt(i));
}
return limit;
}
}