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 default: 129 return "Unknown"; 130 } 131 } 132 133 /** 134 * Print the last caller info for the APIs tracked 135 */ dump(PrintWriter pw)136 public void dump(PrintWriter pw) { 137 pw.println("Dump of LastCallerInfoManager"); 138 for (int i = 0; i < mLastCallerInfoMap.size(); i++) { 139 String apiName = convertApiName(mLastCallerInfoMap.keyAt(i)); 140 String callerInfo = mLastCallerInfoMap.valueAt(i).toString(); 141 pw.println(new StringBuilder() 142 .append("API key=") 143 .append(mLastCallerInfoMap.keyAt(i)).append(" API name=") 144 .append(apiName) 145 .append(": ") 146 .append(callerInfo)); 147 } 148 } 149 150 /** 151 * Last caller info 152 */ 153 public static class LastCallerInfo { 154 private int mTid; 155 private int mUid; 156 private int mPid; 157 private String mPackageName; 158 private boolean mToggleState; 159 LastCallerInfo(int tid, int uid, int pid, String packageName, boolean toggleState)160 public LastCallerInfo(int tid, int uid, int pid, String packageName, boolean toggleState) { 161 mTid = tid; 162 mUid = uid; 163 mPid = pid; 164 mPackageName = packageName; 165 mToggleState = toggleState; 166 } 167 168 /** 169 * Gets the packageName. 170 */ getPackageName()171 public String getPackageName() { 172 return mPackageName; 173 } 174 175 /** 176 * Gets the toggleState. 177 */ getToggleState()178 public boolean getToggleState() { 179 return mToggleState; 180 } 181 182 /** 183 * Convert the last caller info into String format 184 */ toString()185 public String toString() { 186 StringBuilder sb = new StringBuilder(); 187 sb.append("tid=").append(mTid).append(" uid=").append(mUid) 188 .append(" pid=").append(mPid).append(" packageName=").append(mPackageName) 189 .append(" toggleState=").append(mToggleState); 190 return sb.toString(); 191 } 192 } 193 } 194