diff options
author | Ajay Panicker <apanicke@google.com> | 2016-03-08 19:54:18 -0800 |
---|---|---|
committer | Andre Eisenbach <eisenbach@google.com> | 2016-03-23 19:21:58 +0000 |
commit | e90db937c008f365f47e7199d6d86f9eb13bed1e (patch) | |
tree | 91815ee726c687e906258aa04cbf8537dbbf1017 | |
parent | 55296d1fb8e3daef4681205a9591f0af522b099e (diff) | |
download | android_packages_apps_Bluetooth-e90db937c008f365f47e7199d6d86f9eb13bed1e.tar.gz android_packages_apps_Bluetooth-e90db937c008f365f47e7199d6d86f9eb13bed1e.tar.bz2 android_packages_apps_Bluetooth-e90db937c008f365f47e7199d6d86f9eb13bed1e.zip |
Add scan results to scan stats
Ex:
GATT Client Map
Entries: 1
no.nordicsemi.android.mcp
LE scans (started/stopped) : 3 / 3
Scan time in ms (min/max/avg/total): 3050 / 6901 / 4815 / 14447
Total number of results : 338
Last 3 scans :
1970/01/01 08:20:06 - 6901ms 0 results
1970/01/01 08:20:13 - 4496ms 171 results
1970/01/01 08:20:39 - 3050ms 167 results
Bug: 27294154
Change-Id: I32fd6da035f2c37302a105733ac6a9817547b7a3
-rw-r--r-- | src/com/android/bluetooth/gatt/AppScanStats.java | 25 | ||||
-rw-r--r-- | src/com/android/bluetooth/gatt/ContextMap.java | 39 | ||||
-rw-r--r-- | src/com/android/bluetooth/gatt/GattService.java | 33 |
3 files changed, 63 insertions, 34 deletions
diff --git a/src/com/android/bluetooth/gatt/AppScanStats.java b/src/com/android/bluetooth/gatt/AppScanStats.java index a65e80302..a6257f441 100644 --- a/src/com/android/bluetooth/gatt/AppScanStats.java +++ b/src/com/android/bluetooth/gatt/AppScanStats.java @@ -35,11 +35,15 @@ import com.android.bluetooth.btservice.BluetoothProto; /* ContextMap here is needed to grab Apps and Connections */ ContextMap contextMap; + /* GattService is needed to add scan event protos to be dumped later */ + GattService gattService; + class LastScan { long duration; long timestamp; boolean opportunistic; boolean background; + int results; public LastScan(long timestamp, long duration, boolean opportunistic, boolean background) { @@ -47,6 +51,7 @@ import com.android.bluetooth.btservice.BluetoothProto; this.timestamp = timestamp; this.opportunistic = opportunistic; this.background = background; + this.results = 0; } } @@ -63,10 +68,19 @@ import com.android.bluetooth.btservice.BluetoothProto; List<LastScan> lastScans = new ArrayList<LastScan>(NUM_SCAN_DURATIONS_KEPT + 1); long startTime = 0; long stopTime = 0; + int results = 0; - public AppScanStats(String name, ContextMap map) { + public AppScanStats(String name, ContextMap map, GattService service) { appName = name; contextMap = map; + gattService = service; + } + + synchronized void addResult() { + if (!lastScans.isEmpty()) + lastScans.get(lastScans.size() - 1).results++; + + results++; } synchronized void recordScanStart(ScanSettings settings) { @@ -89,7 +103,7 @@ import com.android.bluetooth.btservice.BluetoothProto; scanEvent.setScanTechnologyType(BluetoothProto.ScanEvent.SCAN_TECH_TYPE_LE); scanEvent.setInitiator(appName); scanEvent.setEventTimeMillis(System.currentTimeMillis()); - contextMap.addScanEvent(scanEvent); + gattService.addScanEvent(scanEvent); } synchronized void recordScanStop() { @@ -117,7 +131,7 @@ import com.android.bluetooth.btservice.BluetoothProto; scanEvent.setScanTechnologyType(BluetoothProto.ScanEvent.SCAN_TECH_TYPE_LE); scanEvent.setInitiator(appName); scanEvent.setEventTimeMillis(System.currentTimeMillis()); - contextMap.addScanEvent(scanEvent); + gattService.addScanEvent(scanEvent); } synchronized void dumpToString(StringBuilder sb) { @@ -159,6 +173,8 @@ import com.android.bluetooth.btservice.BluetoothProto; maxScan + " / " + avgScan + " / " + totalScanTime + "\n"); + sb.append(" Total number of results : " + + results + "\n"); if (lastScans.size() != 0) { int lastScansSize = scansStopped < NUM_SCAN_DURATIONS_KEPT ? @@ -172,7 +188,8 @@ import com.android.bluetooth.btservice.BluetoothProto; sb.append(" " + dateFormat.format(timestamp) + " - "); sb.append(scan.duration + "ms "); if (scan.opportunistic) sb.append("Opp "); - if (scan.background) sb.append("Back"); + if (scan.background) sb.append("Back "); + sb.append(scan.results + " results"); sb.append("\n"); } } diff --git a/src/com/android/bluetooth/gatt/ContextMap.java b/src/com/android/bluetooth/gatt/ContextMap.java index 41b34e3e0..6f9025d6d 100644 --- a/src/com/android/bluetooth/gatt/ContextMap.java +++ b/src/com/android/bluetooth/gatt/ContextMap.java @@ -40,7 +40,6 @@ import com.android.bluetooth.btservice.BluetoothProto; */ /*package*/ class ContextMap<T> { private static final String TAG = GattServiceConfig.TAG_PREFIX + "ContextMap"; - static final int NUM_SCAN_EVENTS_KEPT = 20; /** * Connection class helps map connection IDs to device addresses. @@ -72,6 +71,9 @@ import com.android.bluetooth.btservice.BluetoothProto; /** The package name of the application */ String name; + /** Statistics for this app */ + AppScanStats appScanStats; + /** Application callbacks */ T callback; @@ -87,10 +89,11 @@ import com.android.bluetooth.btservice.BluetoothProto; /** * Creates a new app context. */ - App(UUID uuid, T callback, String name) { + App(UUID uuid, T callback, String name, AppScanStats appScanStats) { this.uuid = uuid; this.callback = callback; this.name = name; + this.appScanStats = appScanStats; } /** @@ -136,28 +139,24 @@ import com.android.bluetooth.btservice.BluetoothProto; /** Internal map to keep track of logging information by app name */ HashMap<String, AppScanStats> mAppScanStats = new HashMap<String, AppScanStats>(); - /** Internal list of scan events to use with the proto */ - ArrayList<BluetoothProto.ScanEvent> mScanEvents = - new ArrayList<BluetoothProto.ScanEvent>(NUM_SCAN_EVENTS_KEPT); - /** Internal list of connected devices **/ Set<Connection> mConnections = new HashSet<Connection>(); /** * Add an entry to the application context list. */ - void add(UUID uuid, T callback, Context context) { - String appName = context.getPackageManager().getNameForUid( + void add(UUID uuid, T callback, GattService service) { + String appName = service.getPackageManager().getNameForUid( Binder.getCallingUid()); if (appName == null) { // Assign an app name if one isn't found appName = "Unknown App (UID: " + Binder.getCallingUid() + ")"; } synchronized (mApps) { - mApps.add(new App(uuid, callback, appName)); AppScanStats appScanStats = mAppScanStats.get(appName); + mApps.add(new App(uuid, callback, appName, appScanStats)); if (appScanStats == null) { - appScanStats = new AppScanStats(appName, this); + appScanStats = new AppScanStats(appName, this, service); mAppScanStats.put(appName, appScanStats); } appScanStats.isRegistered = true; @@ -174,7 +173,7 @@ import com.android.bluetooth.btservice.BluetoothProto; App entry = i.next(); if (entry.uuid.equals(uuid)) { entry.unlinkToDeath(); - mAppScanStats.get(entry.name).isRegistered = false; + entry.appScanStats.isRegistered = false; i.remove(); break; } @@ -273,7 +272,7 @@ import com.android.bluetooth.btservice.BluetoothProto; AppScanStats getAppScanStatsById(int id) { App temp = getById(id); if (temp != null) { - return mAppScanStats.get(temp.name); + return temp.appScanStats; } return null; } @@ -380,14 +379,6 @@ import com.android.bluetooth.btservice.BluetoothProto; return connectedmap; } - void addScanEvent(BluetoothProto.ScanEvent event) { - synchronized(mScanEvents) { - if (mScanEvents.size() == NUM_SCAN_EVENTS_KEPT) - mScanEvents.remove(0); - mScanEvents.add(event); - } - } - /** * Logs debug information. */ @@ -403,12 +394,4 @@ import com.android.bluetooth.btservice.BluetoothProto; appScanStats.dumpToString(sb); } } - - void dumpProto(BluetoothProto.BluetoothLog proto) { - synchronized(mScanEvents) { - for (BluetoothProto.ScanEvent event : mScanEvents) { - proto.addScanEvent(event); - } - } - } } diff --git a/src/com/android/bluetooth/gatt/GattService.java b/src/com/android/bluetooth/gatt/GattService.java index 60d5e3fd0..7aea6ec5a 100644 --- a/src/com/android/bluetooth/gatt/GattService.java +++ b/src/com/android/bluetooth/gatt/GattService.java @@ -128,6 +128,13 @@ public class GattService extends ProfileService { private Map<Integer, List<BluetoothGattService>> gattClientDatabases = new HashMap<Integer, List<BluetoothGattService>>(); + static final int NUM_SCAN_EVENTS_KEPT = 20; + /** + * Internal list of scan events to use with the proto + */ + ArrayList<BluetoothProto.ScanEvent> mScanEvents = + new ArrayList<BluetoothProto.ScanEvent>(NUM_SCAN_EVENTS_KEPT); + private ServiceDeclaration addDeclaration() { synchronized (mServiceDeclarations) { mServiceDeclarations.add(new ServiceDeclaration()); @@ -592,6 +599,8 @@ public class GattService extends ProfileService { if (VDBG) Log.d(TAG, "onScanResult() - address=" + address + ", rssi=" + rssi); List<UUID> remoteUuids = parseUuids(adv_data); + addScanResult(); + for (ScanClient client : mScanManager.getRegularScanQueue()) { if (client.uuids.length > 0) { int matches = 0; @@ -621,6 +630,7 @@ public class GattService extends ProfileService { ScanSettings settings = client.settings; if ((settings.getCallbackType() & ScanSettings.CALLBACK_TYPE_ALL_MATCHES) != 0) { + app.appScanStats.addResult(); app.callback.onScanResult(result); } } catch (RemoteException e) { @@ -2228,10 +2238,29 @@ public class GattService extends ProfileService { mHandleMap.dump(sb); } + void addScanResult() { + if (mScanEvents.isEmpty()) + return; + + BluetoothProto.ScanEvent curr = mScanEvents.get(mScanEvents.size() - 1); + curr.setNumberResults(curr.getNumberResults() + 1); + } + + void addScanEvent(BluetoothProto.ScanEvent event) { + synchronized(mScanEvents) { + if (mScanEvents.size() == NUM_SCAN_EVENTS_KEPT) + mScanEvents.remove(0); + mScanEvents.add(event); + } + } + @Override public void dumpProto(BluetoothProto.BluetoothLog proto) { - mClientMap.dumpProto(proto); - mServerMap.dumpProto(proto); + synchronized(mScanEvents) { + for (BluetoothProto.ScanEvent event : mScanEvents) { + proto.addScanEvent(event); + } + } } /************************************************************************** |