OSDN Git Service

Add scan results to scan stats
authorAjay Panicker <apanicke@google.com>
Wed, 9 Mar 2016 03:54:18 +0000 (19:54 -0800)
committerAndre Eisenbach <eisenbach@google.com>
Wed, 23 Mar 2016 19:21:58 +0000 (19:21 +0000)
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

src/com/android/bluetooth/gatt/AppScanStats.java
src/com/android/bluetooth/gatt/ContextMap.java
src/com/android/bluetooth/gatt/GattService.java

index a65e803..a6257f4 100644 (file)
@@ -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");
             }
         }
index 41b34e3..6f9025d 100644 (file)
@@ -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);
-            }
-        }
-    }
 }
index 60d5e3f..7aea6ec 100644 (file)
@@ -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);
+            }
+        }
     }
 
     /**************************************************************************