1 /* 2 * Copyright (C) 2022 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 17 package com.android.server.wifi; 18 19 import android.annotation.NonNull; 20 import android.hardware.wifi.V1_6.IWifiChip; 21 22 import org.json.JSONArray; 23 import org.json.JSONException; 24 import org.json.JSONObject; 25 26 import java.util.ArrayList; 27 28 /** 29 * Utility methods for HalDeviceManager. 30 */ 31 public class HalDeviceManagerUtil { 32 static class StaticChipInfo { 33 private int mChipId; 34 private long mChipCapabilities; 35 private @NonNull ArrayList<android.hardware.wifi.V1_6.IWifiChip.ChipMode> mAvailableModes = 36 new ArrayList<>(); 37 StaticChipInfo( int chipId, long chipCapabilities, @NonNull ArrayList<android.hardware.wifi.V1_6.IWifiChip.ChipMode> availableModes)38 StaticChipInfo( 39 int chipId, 40 long chipCapabilities, 41 @NonNull ArrayList<android.hardware.wifi.V1_6.IWifiChip.ChipMode> availableModes) { 42 mChipId = chipId; 43 mChipCapabilities = chipCapabilities; 44 if (availableModes != null) { 45 mAvailableModes = availableModes; 46 } 47 } 48 getChipId()49 int getChipId() { 50 return mChipId; 51 } 52 getChipCapabilities()53 long getChipCapabilities() { 54 return mChipCapabilities; 55 } 56 getAvailableModes()57 ArrayList<android.hardware.wifi.V1_6.IWifiChip.ChipMode> getAvailableModes() { 58 return mAvailableModes; 59 } 60 } 61 62 private static final String KEY_CHIP_ID = "chipId"; 63 private static final String KEY_CHIP_CAPABILITIES = "chipCapabilities"; 64 private static final String KEY_AVAILABLE_MODES = "availableModes"; 65 staticChipInfoToJson(@onNull StaticChipInfo staticChipInfo)66 static JSONObject staticChipInfoToJson(@NonNull StaticChipInfo staticChipInfo) 67 throws JSONException { 68 JSONObject jsonObject = new JSONObject(); 69 jsonObject.put(KEY_CHIP_ID, staticChipInfo.getChipId()); 70 jsonObject.put(KEY_CHIP_CAPABILITIES, staticChipInfo.getChipCapabilities()); 71 JSONArray availableModesJson = new JSONArray(); 72 for (android.hardware.wifi.V1_6.IWifiChip.ChipMode mode 73 : staticChipInfo.getAvailableModes()) { 74 availableModesJson.put(chipModeToJson(mode)); 75 } 76 jsonObject.put(KEY_AVAILABLE_MODES, availableModesJson); 77 return jsonObject; 78 } 79 jsonToStaticChipInfo(JSONObject jsonObject)80 static StaticChipInfo jsonToStaticChipInfo(JSONObject jsonObject) throws JSONException { 81 ArrayList<IWifiChip.ChipMode> availableModes = 82 new ArrayList<>(); 83 int chipId = jsonObject.getInt(KEY_CHIP_ID); 84 long chipCapabilities = jsonObject.getLong(KEY_CHIP_CAPABILITIES); 85 JSONArray modesJson = jsonObject.getJSONArray(KEY_AVAILABLE_MODES); 86 for (int i = 0; i < modesJson.length(); i++) { 87 availableModes.add(jsonToChipMode(modesJson.getJSONObject(i))); 88 } 89 return new StaticChipInfo(chipId, chipCapabilities, availableModes); 90 } 91 92 private static final String KEY_ID = "id"; 93 private static final String KEY_AVAILABLE_COMBINATIONS = "availableCombinations"; 94 chipModeToJson(android.hardware.wifi.V1_6.IWifiChip.ChipMode chipMode)95 private static JSONObject chipModeToJson(android.hardware.wifi.V1_6.IWifiChip.ChipMode chipMode) 96 throws JSONException { 97 JSONObject jsonObject = new JSONObject(); 98 jsonObject.put(KEY_ID, chipMode.id); 99 JSONArray availableCombinationsJson = new JSONArray(); 100 for (IWifiChip.ChipConcurrencyCombination combo 101 : chipMode.availableCombinations) { 102 availableCombinationsJson.put(chipConcurrencyCombinationToJson(combo)); 103 } 104 jsonObject.put(KEY_AVAILABLE_COMBINATIONS, availableCombinationsJson); 105 return jsonObject; 106 } 107 jsonToChipMode( JSONObject jsonObject)108 private static android.hardware.wifi.V1_6.IWifiChip.ChipMode jsonToChipMode( 109 JSONObject jsonObject) throws JSONException { 110 android.hardware.wifi.V1_6.IWifiChip.ChipMode chipMode = 111 new android.hardware.wifi.V1_6.IWifiChip.ChipMode(); 112 chipMode.id = jsonObject.getInt(KEY_ID); 113 JSONArray availableCombinationsJson = 114 jsonObject.getJSONArray(KEY_AVAILABLE_COMBINATIONS); 115 for (int i = 0; i < availableCombinationsJson.length(); i++) { 116 chipMode.availableCombinations.add(jsonToChipConcurrencyCombination( 117 availableCombinationsJson.getJSONObject(i))); 118 } 119 return chipMode; 120 } 121 122 private static final String KEY_CONCURRENCY_LIMITS = "limits"; 123 chipConcurrencyCombinationToJson( IWifiChip.ChipConcurrencyCombination combo)124 private static JSONObject chipConcurrencyCombinationToJson( 125 IWifiChip.ChipConcurrencyCombination combo) throws JSONException { 126 JSONObject jsonObject = new JSONObject(); 127 JSONArray limitsJson = new JSONArray(); 128 for (IWifiChip.ChipConcurrencyCombinationLimit limit : combo.limits) { 129 limitsJson.put(chipConcurrencyCombinationLimitToJson(limit)); 130 } 131 jsonObject.put(KEY_CONCURRENCY_LIMITS, limitsJson); 132 return jsonObject; 133 } 134 jsonToChipConcurrencyCombination( JSONObject jsonObject)135 private static IWifiChip.ChipConcurrencyCombination jsonToChipConcurrencyCombination( 136 JSONObject jsonObject) throws JSONException { 137 IWifiChip.ChipConcurrencyCombination combo = new IWifiChip.ChipConcurrencyCombination(); 138 combo.limits = new ArrayList<>(); 139 JSONArray limitsJson = jsonObject.getJSONArray(KEY_CONCURRENCY_LIMITS); 140 for (int i = 0; i < limitsJson.length(); i++) { 141 combo.limits.add( 142 jsonToChipConcurrencyCombinationLimit(limitsJson.getJSONObject(i))); 143 } 144 return combo; 145 } 146 147 private static final String KEY_MAX_IFACES = "maxIfaces"; 148 private static final String KEY_TYPES = "types"; 149 chipConcurrencyCombinationLimitToJson( IWifiChip.ChipConcurrencyCombinationLimit limit)150 private static JSONObject chipConcurrencyCombinationLimitToJson( 151 IWifiChip.ChipConcurrencyCombinationLimit limit) throws JSONException { 152 JSONObject jsonObject = new JSONObject(); 153 jsonObject.put(KEY_MAX_IFACES, limit.maxIfaces); 154 jsonObject.put(KEY_TYPES, new JSONArray(limit.types)); 155 return jsonObject; 156 } 157 jsonToChipConcurrencyCombinationLimit( JSONObject jsonObject)158 private static IWifiChip.ChipConcurrencyCombinationLimit jsonToChipConcurrencyCombinationLimit( 159 JSONObject jsonObject) throws JSONException { 160 IWifiChip.ChipConcurrencyCombinationLimit 161 limit = new IWifiChip.ChipConcurrencyCombinationLimit(); 162 limit.maxIfaces = jsonObject.getInt(KEY_MAX_IFACES); 163 limit.types = new ArrayList<>(); 164 JSONArray limitsJson = jsonObject.getJSONArray(KEY_TYPES); 165 for (int i = 0; i < limitsJson.length(); i++) { 166 limit.types.add(limitsJson.getInt(i)); 167 } 168 return limit; 169 } 170 } 171 172