1 /* 2 * Copyright (C) 2021 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.util; 18 19 import android.net.wifi.WifiManager; 20 import android.net.wifi.WifiManager.ApiType; 21 import android.util.SparseArray; 22 23 import java.io.PrintWriter; 24 25 /** 26 * Manage multiple last caller info 27 */ 28 public class LastCallerInfoManager { 29 private final SparseArray<LastCallerInfo> mLastCallerInfoMap = new SparseArray<>(); 30 31 /** 32 * Store the last caller information for the API 33 */ put(@piType int apiName, int tid, int uid, int pid, String packageName, boolean toggleState)34 public void put(@ApiType int apiName, int tid, int uid, int pid, String packageName, 35 boolean toggleState) { 36 synchronized (mLastCallerInfoMap) { 37 LastCallerInfo callerInfo = new LastCallerInfo(tid, uid, pid, packageName, toggleState); 38 mLastCallerInfoMap.put(apiName, callerInfo); 39 } 40 } 41 42 /** 43 * Get the LastCallerInfo for a particular api. 44 * @param apiName Name of the API 45 * @return The LastCallerInfo, or null if not available. 46 */ get(@piType int apiName)47 public LastCallerInfo get(@ApiType int apiName) { 48 synchronized (mLastCallerInfoMap) { 49 return mLastCallerInfoMap.get(apiName); 50 } 51 } 52 53 /** 54 * Convert int constant into API String name 55 */ convertApiName(@piType int key)56 private String convertApiName(@ApiType int key) { 57 switch (key) { 58 case WifiManager.API_SCANNING_ENABLED: 59 return "ScanningEnabled"; 60 case WifiManager.API_WIFI_ENABLED: 61 return "WifiEnabled"; 62 case WifiManager.API_SOFT_AP: 63 return "SoftAp"; 64 case WifiManager.API_TETHERED_HOTSPOT: 65 return "TetheredHotspot"; 66 case WifiManager.API_AUTOJOIN_GLOBAL: 67 return "AutojoinGlobal"; 68 case WifiManager.API_SET_SCAN_SCHEDULE: 69 return "SetScanScanSchedule"; 70 case WifiManager.API_SET_ONE_SHOT_SCREEN_ON_CONNECTIVITY_SCAN_DELAY: 71 return "API_SET_ONE_SHOT_SCREEN_ON_CONNECTIVITY_SCAN_DELAY"; 72 case WifiManager.API_SET_NETWORK_SELECTION_CONFIG: 73 return "API_SET_NETWORK_SELECTION_CONFIG"; 74 case WifiManager.API_SET_THIRD_PARTY_APPS_ENABLING_WIFI_CONFIRMATION_DIALOG: 75 return "API_SET_THIRD_PARTY_APPS_ENABLING_WIFI_CONFIRMATION_DIALOG"; 76 case WifiManager.API_ADD_NETWORK: 77 return "API_ADD_NETWORK"; 78 case WifiManager.API_UPDATE_NETWORK: 79 return "API_UPDATE_NETWORK"; 80 case WifiManager.API_ALLOW_AUTOJOIN: 81 return "API_ALLOW_AUTOJOIN"; 82 case WifiManager.API_CONNECT_CONFIG: 83 return "API_CONNECT_CONFIG"; 84 case WifiManager.API_CONNECT_NETWORK_ID: 85 return "API_CONNECT_NETWORK_ID"; 86 case WifiManager.API_DISABLE_NETWORK: 87 return "API_DISABLE_NETWORK"; 88 case WifiManager.API_ENABLE_NETWORK: 89 return "API_ENABLE_NETWORK"; 90 case WifiManager.API_FORGET: 91 return "API_FORGET"; 92 case WifiManager.API_SAVE: 93 return "API_SAVE"; 94 case WifiManager.API_START_SCAN: 95 return "API_START_SCAN"; 96 case WifiManager.API_START_LOCAL_ONLY_HOTSPOT: 97 return "API_START_LOCAL_ONLY_HOTSPOT"; 98 case WifiManager.API_P2P_DISCOVER_PEERS: 99 return "API_P2P_DISCOVER_PEERS"; 100 case WifiManager.API_P2P_DISCOVER_PEERS_ON_SOCIAL_CHANNELS: 101 return "API_P2P_DISCOVER_PEERS_ON_SOCIAL_CHANNELS"; 102 case WifiManager.API_P2P_DISCOVER_PEERS_ON_SPECIFIC_FREQUENCY: 103 return "API_P2P_DISCOVER_PEERS_ON_SPECIFIC_FREQUENCY"; 104 case WifiManager.API_P2P_STOP_PEER_DISCOVERY: 105 return "API_P2P_STOP_PEER_DISCOVERY"; 106 case WifiManager.API_P2P_CONNECT: 107 return "API_P2P_CONNECT"; 108 case WifiManager.API_P2P_CANCEL_CONNECT: 109 return "API_P2P_CANCEL_CONNECT"; 110 case WifiManager.API_P2P_CREATE_GROUP: 111 return "API_P2P_CREATE_GROUP"; 112 case WifiManager.API_P2P_CREATE_GROUP_P2P_CONFIG: 113 return "API_P2P_CREATE_GROUP_P2P_CONFIG"; 114 case WifiManager.API_P2P_REMOVE_GROUP: 115 return "API_P2P_REMOVE_GROUP"; 116 case WifiManager.API_P2P_START_LISTENING: 117 return "API_P2P_START_LISTENING"; 118 case WifiManager.API_P2P_STOP_LISTENING: 119 return "API_P2P_STOP_LISTENING"; 120 case WifiManager.API_P2P_SET_CHANNELS: 121 return "API_P2P_SET_CHANNELS"; 122 case WifiManager.API_WIFI_SCANNER_START_SCAN: 123 return "API_WIFI_SCANNER_START_SCAN"; 124 case WifiManager.API_SET_TDLS_ENABLED: 125 return "API_SET_TDLS_ENABLED"; 126 case WifiManager.API_SET_TDLS_ENABLED_WITH_MAC_ADDRESS: 127 return "API_SET_TDLS_ENABLED_WITH_MAC_ADDRESS"; 128 case WifiManager.API_SET_PNO_SCAN_ENABLED: 129 return "API_SET_PNO_SCAN_ENABLED"; 130 default: 131 return "Unknown"; 132 } 133 } 134 135 /** 136 * Print the last caller info for the APIs tracked 137 */ dump(PrintWriter pw)138 public void dump(PrintWriter pw) { 139 pw.println("Dump of LastCallerInfoManager"); 140 for (int i = 0; i < mLastCallerInfoMap.size(); i++) { 141 String apiName = convertApiName(mLastCallerInfoMap.keyAt(i)); 142 String callerInfo = mLastCallerInfoMap.valueAt(i).toString(); 143 pw.println(new StringBuilder() 144 .append("API key=") 145 .append(mLastCallerInfoMap.keyAt(i)).append(" API name=") 146 .append(apiName) 147 .append(": ") 148 .append(callerInfo)); 149 } 150 } 151 152 /** 153 * Last caller info 154 */ 155 public static class LastCallerInfo { 156 private int mTid; 157 private int mUid; 158 private int mPid; 159 private String mPackageName; 160 private boolean mToggleState; 161 LastCallerInfo(int tid, int uid, int pid, String packageName, boolean toggleState)162 public LastCallerInfo(int tid, int uid, int pid, String packageName, boolean toggleState) { 163 mTid = tid; 164 mUid = uid; 165 mPid = pid; 166 mPackageName = packageName; 167 mToggleState = toggleState; 168 } 169 170 /** 171 * Gets the packageName. 172 */ getPackageName()173 public String getPackageName() { 174 return mPackageName; 175 } 176 177 /** 178 * Gets the toggleState. 179 */ getToggleState()180 public boolean getToggleState() { 181 return mToggleState; 182 } 183 184 /** 185 * Convert the last caller info into String format 186 */ toString()187 public String toString() { 188 StringBuilder sb = new StringBuilder(); 189 sb.append("tid=").append(mTid).append(" uid=").append(mUid) 190 .append(" pid=").append(mPid).append(" packageName=").append(mPackageName) 191 .append(" toggleState=").append(mToggleState); 192 return sb.toString(); 193 } 194 } 195 } 196