summaryrefslogtreecommitdiff
path: root/core/java/android/util/StatsLog.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/util/StatsLog.java')
-rw-r--r--core/java/android/util/StatsLog.java95
1 files changed, 84 insertions, 11 deletions
diff --git a/core/java/android/util/StatsLog.java b/core/java/android/util/StatsLog.java
index ace4bf477af6..29ced3eda4ec 100644
--- a/core/java/android/util/StatsLog.java
+++ b/core/java/android/util/StatsLog.java
@@ -16,7 +16,14 @@
package android.util;
+import static android.Manifest.permission.DUMP;
+import static android.Manifest.permission.PACKAGE_USAGE_STATS;
+
+import android.Manifest;
import android.annotation.NonNull;
+import android.annotation.RequiresPermission;
+import android.app.IActivityManager;
+import android.content.Context;
import android.os.IStatsManager;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -31,7 +38,10 @@ public final class StatsLog extends StatsLogInternal {
private static IStatsManager sService;
- private StatsLog() {}
+ private static Object sLogLock = new Object();
+
+ private StatsLog() {
+ }
/**
* Logs a start event.
@@ -40,11 +50,13 @@ public final class StatsLog extends StatsLogInternal {
* @return True if the log request was sent to statsd.
*/
public static boolean logStart(int label) {
- synchronized (StatsLog.class) {
+ synchronized (sLogLock) {
try {
IStatsManager service = getIStatsManagerLocked();
if (service == null) {
- if (DEBUG) Slog.d(TAG, "Failed to find statsd when logging start");
+ if (DEBUG) {
+ Slog.d(TAG, "Failed to find statsd when logging start");
+ }
return false;
}
service.sendAppBreadcrumbAtom(label,
@@ -52,7 +64,9 @@ public final class StatsLog extends StatsLogInternal {
return true;
} catch (RemoteException e) {
sService = null;
- if (DEBUG) Slog.d(TAG, "Failed to connect to statsd when logging start");
+ if (DEBUG) {
+ Slog.d(TAG, "Failed to connect to statsd when logging start");
+ }
return false;
}
}
@@ -65,18 +79,22 @@ public final class StatsLog extends StatsLogInternal {
* @return True if the log request was sent to statsd.
*/
public static boolean logStop(int label) {
- synchronized (StatsLog.class) {
+ synchronized (sLogLock) {
try {
IStatsManager service = getIStatsManagerLocked();
if (service == null) {
- if (DEBUG) Slog.d(TAG, "Failed to find statsd when logging stop");
+ if (DEBUG) {
+ Slog.d(TAG, "Failed to find statsd when logging stop");
+ }
return false;
}
service.sendAppBreadcrumbAtom(label, StatsLog.APP_BREADCRUMB_REPORTED__STATE__STOP);
return true;
} catch (RemoteException e) {
sService = null;
- if (DEBUG) Slog.d(TAG, "Failed to connect to statsd when logging stop");
+ if (DEBUG) {
+ Slog.d(TAG, "Failed to connect to statsd when logging stop");
+ }
return false;
}
}
@@ -89,11 +107,13 @@ public final class StatsLog extends StatsLogInternal {
* @return True if the log request was sent to statsd.
*/
public static boolean logEvent(int label) {
- synchronized (StatsLog.class) {
+ synchronized (sLogLock) {
try {
IStatsManager service = getIStatsManagerLocked();
if (service == null) {
- if (DEBUG) Slog.d(TAG, "Failed to find statsd when logging event");
+ if (DEBUG) {
+ Slog.d(TAG, "Failed to find statsd when logging event");
+ }
return false;
}
service.sendAppBreadcrumbAtom(
@@ -101,7 +121,51 @@ public final class StatsLog extends StatsLogInternal {
return true;
} catch (RemoteException e) {
sService = null;
- if (DEBUG) Slog.d(TAG, "Failed to connect to statsd when logging event");
+ if (DEBUG) {
+ Slog.d(TAG, "Failed to connect to statsd when logging event");
+ }
+ return false;
+ }
+ }
+ }
+
+ /**
+ * Logs an event for binary push for module updates.
+ *
+ * @param trainName name of install train.
+ * @param trainVersionCode version code of the train.
+ * @param options optional flags about this install.
+ * @param state current install state.
+ * @param experimentIds experiment ids.
+ * @return True if the log request was sent to statsd.
+ */
+ @RequiresPermission(allOf = {DUMP, PACKAGE_USAGE_STATS})
+ public static boolean logBinaryPushStateChanged(@NonNull String trainName,
+ long trainVersionCode, int options, int state,
+ @NonNull long[] experimentIds) {
+ synchronized (sLogLock) {
+ try {
+ IStatsManager service = getIStatsManagerLocked();
+ if (service == null) {
+ if (DEBUG) {
+ Slog.d(TAG, "Failed to find statsd when logging event");
+ }
+ return false;
+ }
+ int userId = IActivityManager.Stub.asInterface(
+ ServiceManager.getService("activity"))
+ .getCurrentUser()
+ .id;
+ service.sendBinaryPushStateChangedAtom(
+ trainName, trainVersionCode, options, state, experimentIds);
+ return true;
+ } catch (RemoteException e) {
+ sService = null;
+ if (DEBUG) {
+ Slog.d(TAG,
+ "Failed to connect to StatsCompanionService when logging "
+ + "BinaryPushStateChanged");
+ }
return false;
}
}
@@ -118,7 +182,7 @@ public final class StatsLog extends StatsLogInternal {
/**
* Add a log to the stats log.
*
- * @param id The id of the atom
+ * @param id The id of the atom
* @param params The parameters of the atom's message.
*/
public static void write(int id, @NonNull Object... params) {
@@ -128,4 +192,13 @@ public final class StatsLog extends StatsLogInternal {
(boolean) params[4], (int) params[5]);
}
}
+
+ private static void enforceDumpCallingPermission(Context context) {
+ context.enforceCallingPermission(android.Manifest.permission.DUMP, "Need DUMP permission.");
+ }
+
+ private static void enforcesageStatsCallingPermission(Context context) {
+ context.enforceCallingPermission(Manifest.permission.PACKAGE_USAGE_STATS,
+ "Need PACKAGE_USAGE_STATS permission.");
+ }
}