diff options
| author | 2020-12-02 02:06:26 -0800 | |
|---|---|---|
| committer | 2021-01-15 00:41:01 -0800 | |
| commit | 72b84695f31d86bfe7831bbce8c7702d87097e3e (patch) | |
| tree | 8b45fc844a8939cb89229d2aaafea2aad1503904 | |
| parent | f2e56d1f9f188ee8991403bad03197a972594a3b (diff) | |
Add playback network event.
Bug: 167036690
Test: mmm
Change-Id: I1f3c6cabc6d2622a2cd50e7d0970642e0735747c
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); + } } } |