172 lines
6.8 KiB
Java
172 lines
6.8 KiB
Java
/*
|
|
* 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;
|
|
}
|
|
}
|
|
|