summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author shubang <shubang@google.com> 2020-12-02 02:06:26 -0800
committer shubang <shubang@google.com> 2021-01-15 00:41:01 -0800
commit72b84695f31d86bfe7831bbce8c7702d87097e3e (patch)
tree8b45fc844a8939cb89229d2aaafea2aad1503904
parentf2e56d1f9f188ee8991403bad03197a972594a3b (diff)
Add playback network event.
Bug: 167036690 Test: mmm Change-Id: I1f3c6cabc6d2622a2cd50e7d0970642e0735747c
-rw-r--r--media/java/android/media/metrics/IPlaybackMetricsManager.aidl2
-rw-r--r--media/java/android/media/metrics/NetworkEvent.aidl19
-rw-r--r--media/java/android/media/metrics/NetworkEvent.java203
-rw-r--r--media/java/android/media/metrics/PlaybackMetricsManager.java11
-rw-r--r--media/java/android/media/metrics/PlaybackSession.java7
-rw-r--r--services/core/java/com/android/server/media/metrics/PlaybackMetricsManagerService.java13
6 files changed, 255 insertions, 0 deletions
diff --git a/media/java/android/media/metrics/IPlaybackMetricsManager.aidl b/media/java/android/media/metrics/IPlaybackMetricsManager.aidl
index 85c93612e7e2..a1b13ba31bef 100644
--- a/media/java/android/media/metrics/IPlaybackMetricsManager.aidl
+++ b/media/java/android/media/metrics/IPlaybackMetricsManager.aidl
@@ -16,6 +16,7 @@
package android.media.metrics;
+import android.media.metrics.NetworkEvent;
import android.media.metrics.PlaybackErrorEvent;
import android.media.metrics.PlaybackMetrics;
@@ -27,4 +28,5 @@ interface IPlaybackMetricsManager {
void reportPlaybackMetrics(in String sessionId, in PlaybackMetrics metrics, int userId);
String getSessionId(int userId);
void reportPlaybackErrorEvent(in String sessionId, in PlaybackErrorEvent event, int userId);
+ void reportNetworkEvent(in String sessionId, in NetworkEvent event, int userId);
} \ No newline at end of file
diff --git a/media/java/android/media/metrics/NetworkEvent.aidl b/media/java/android/media/metrics/NetworkEvent.aidl
new file mode 100644
index 000000000000..2b7fa02aae64
--- /dev/null
+++ b/media/java/android/media/metrics/NetworkEvent.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.metrics;
+
+parcelable NetworkEvent;
diff --git a/media/java/android/media/metrics/NetworkEvent.java b/media/java/android/media/metrics/NetworkEvent.java
new file mode 100644
index 000000000000..a330bc0b66df
--- /dev/null
+++ b/media/java/android/media/metrics/NetworkEvent.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.metrics;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
+
+/**
+ * Playback network event.
+ * @hide
+ */
+public final class NetworkEvent implements Parcelable {
+ public static final int NETWORK_TYPE_NONE = 0;
+ public static final int NETWORK_TYPE_OTHER = 1;
+ public static final int NETWORK_TYPE_WIFI = 2;
+ public static final int NETWORK_TYPE_ETHERNET = 3;
+ public static final int NETWORK_TYPE_2G = 4;
+ public static final int NETWORK_TYPE_3G = 5;
+ public static final int NETWORK_TYPE_4G = 6;
+ public static final int NETWORK_TYPE_5G_NSA = 7;
+ public static final int NETWORK_TYPE_5G_SA = 8;
+
+ private final int mType;
+ private final long mTimeSincePlaybackCreatedMillis;
+
+ /** @hide */
+ @IntDef(prefix = "NETWORK_TYPE_", value = {
+ NETWORK_TYPE_NONE,
+ NETWORK_TYPE_OTHER,
+ NETWORK_TYPE_WIFI,
+ NETWORK_TYPE_ETHERNET,
+ NETWORK_TYPE_2G,
+ NETWORK_TYPE_3G,
+ NETWORK_TYPE_4G,
+ NETWORK_TYPE_5G_NSA,
+ NETWORK_TYPE_5G_SA
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface NetworkType {}
+
+ /**
+ * Network type to string.
+ */
+ public static String networkTypeToString(@NetworkType int value) {
+ switch (value) {
+ case NETWORK_TYPE_NONE:
+ return "NETWORK_TYPE_NONE";
+ case NETWORK_TYPE_OTHER:
+ return "NETWORK_TYPE_OTHER";
+ case NETWORK_TYPE_WIFI:
+ return "NETWORK_TYPE_WIFI";
+ case NETWORK_TYPE_ETHERNET:
+ return "NETWORK_TYPE_ETHERNET";
+ case NETWORK_TYPE_2G:
+ return "NETWORK_TYPE_2G";
+ case NETWORK_TYPE_3G:
+ return "NETWORK_TYPE_3G";
+ case NETWORK_TYPE_4G:
+ return "NETWORK_TYPE_4G";
+ case NETWORK_TYPE_5G_NSA:
+ return "NETWORK_TYPE_5G_NSA";
+ case NETWORK_TYPE_5G_SA:
+ return "NETWORK_TYPE_5G_SA";
+ default:
+ return Integer.toHexString(value);
+ }
+ }
+
+ /**
+ * Creates a new NetworkEvent.
+ *
+ * @hide
+ */
+ public NetworkEvent(@NetworkType int type, long timeSincePlaybackCreatedMillis) {
+ this.mType = type;
+ this.mTimeSincePlaybackCreatedMillis = timeSincePlaybackCreatedMillis;
+ }
+
+ @NetworkType
+ public int getType() {
+ return mType;
+ }
+
+ public long getTimeSincePlaybackCreatedMillis() {
+ return mTimeSincePlaybackCreatedMillis;
+ }
+
+ @Override
+ public String toString() {
+ return "NetworkEvent { "
+ + "type = " + mType + ", "
+ + "timeSincePlaybackCreatedMillis = " + mTimeSincePlaybackCreatedMillis
+ + " }";
+ }
+
+ @Override
+ public boolean equals(@Nullable Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ NetworkEvent that = (NetworkEvent) o;
+ return mType == that.mType
+ && mTimeSincePlaybackCreatedMillis == that.mTimeSincePlaybackCreatedMillis;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mType, mTimeSincePlaybackCreatedMillis);
+ }
+
+ @Override
+ public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
+ dest.writeInt(mType);
+ dest.writeLong(mTimeSincePlaybackCreatedMillis);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** @hide */
+ /* package-private */ NetworkEvent(@NonNull android.os.Parcel in) {
+ int type = in.readInt();
+ long timeSincePlaybackCreatedMillis = in.readLong();
+
+ this.mType = type;
+ this.mTimeSincePlaybackCreatedMillis = timeSincePlaybackCreatedMillis;
+ }
+
+ public static final @NonNull Parcelable.Creator<NetworkEvent> CREATOR =
+ new Parcelable.Creator<NetworkEvent>() {
+ @Override
+ public NetworkEvent[] newArray(int size) {
+ return new NetworkEvent[size];
+ }
+
+ @Override
+ public NetworkEvent createFromParcel(@NonNull Parcel in) {
+ return new NetworkEvent(in);
+ }
+ };
+
+ /**
+ * A builder for {@link NetworkEvent}
+ */
+ public static final class Builder {
+ private int mType;
+ private long mTimeSincePlaybackCreatedMillis;
+
+ /**
+ * Creates a new Builder.
+ *
+ * @hide
+ */
+ public Builder() {
+ }
+
+ /**
+ * Sets network type.
+ */
+ public @NonNull Builder setType(@NetworkType int value) {
+ mType = value;
+ return this;
+ }
+
+ /**
+ * Sets timestamp since the creation in milliseconds.
+ */
+ public @NonNull Builder setTimeSincePlaybackCreatedMillis(long value) {
+ mTimeSincePlaybackCreatedMillis = value;
+ return this;
+ }
+
+ /** Builds the instance. */
+ public @NonNull NetworkEvent build() {
+ NetworkEvent o = new NetworkEvent(
+ mType,
+ mTimeSincePlaybackCreatedMillis);
+ return o;
+ }
+ }
+}
diff --git a/media/java/android/media/metrics/PlaybackMetricsManager.java b/media/java/android/media/metrics/PlaybackMetricsManager.java
index b778bbd6fa1d..95f64ea9f11e 100644
--- a/media/java/android/media/metrics/PlaybackMetricsManager.java
+++ b/media/java/android/media/metrics/PlaybackMetricsManager.java
@@ -48,6 +48,17 @@ public class PlaybackMetricsManager {
throw e.rethrowFromSystemServer();
}
}
+ /**
+ * Reports network event.
+ * @hide
+ */
+ public void reportNetworkEvent(@NonNull String sessionId, NetworkEvent event) {
+ try {
+ mService.reportNetworkEvent(sessionId, event, mUserId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
/**
* Creates a playback session.
diff --git a/media/java/android/media/metrics/PlaybackSession.java b/media/java/android/media/metrics/PlaybackSession.java
index 07f4fbc219c7..3e2f4e1f4c9a 100644
--- a/media/java/android/media/metrics/PlaybackSession.java
+++ b/media/java/android/media/metrics/PlaybackSession.java
@@ -57,6 +57,13 @@ public final class PlaybackSession implements AutoCloseable {
mManager.reportPlaybackErrorEvent(mId, event);
}
+ /**
+ * Reports network event.
+ */
+ public void reportNetworkEvent(NetworkEvent event) {
+ mManager.reportNetworkEvent(mId, event);
+ }
+
public @NonNull String getId() {
return mId;
}
diff --git a/services/core/java/com/android/server/media/metrics/PlaybackMetricsManagerService.java b/services/core/java/com/android/server/media/metrics/PlaybackMetricsManagerService.java
index 3e40b2756b10..b57681073e51 100644
--- a/services/core/java/com/android/server/media/metrics/PlaybackMetricsManagerService.java
+++ b/services/core/java/com/android/server/media/metrics/PlaybackMetricsManagerService.java
@@ -18,6 +18,7 @@ package com.android.server.media.metrics;
import android.content.Context;
import android.media.metrics.IPlaybackMetricsManager;
+import android.media.metrics.NetworkEvent;
import android.media.metrics.PlaybackErrorEvent;
import android.media.metrics.PlaybackMetrics;
import android.util.Base64;
@@ -78,5 +79,17 @@ public final class PlaybackMetricsManagerService extends SystemService {
.build();
StatsLog.write(statsEvent);
}
+
+ public void reportNetworkEvent(
+ String sessionId, NetworkEvent event, int userId) {
+ StatsEvent statsEvent = StatsEvent.newBuilder()
+ .setAtomId(321)
+ .writeString(sessionId)
+ .writeInt(event.getType())
+ .writeLong(event.getTimeSincePlaybackCreatedMillis())
+ .usePooledBuffer()
+ .build();
+ StatsLog.write(statsEvent);
+ }
}
}