diff --git a/core/api/current.txt b/core/api/current.txt index c4807bf304ef6..08eee0a0556ca 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -24377,6 +24377,12 @@ package android.media.effect { package android.media.metrics { + public final class BundleSession implements java.lang.AutoCloseable { + method public void close(); + method @NonNull public android.media.metrics.LogSessionId getSessionId(); + method public void reportBundleMetrics(@NonNull android.os.PersistableBundle); + } + public final class EditingSession implements java.lang.AutoCloseable { method public void close(); method @NonNull public android.media.metrics.LogSessionId getSessionId(); @@ -24393,6 +24399,7 @@ package android.media.metrics { } public final class MediaMetricsManager { + method @NonNull public android.media.metrics.BundleSession createBundleSession(); method @NonNull public android.media.metrics.EditingSession createEditingSession(); method @NonNull public android.media.metrics.PlaybackSession createPlaybackSession(); method @NonNull public android.media.metrics.RecordingSession createRecordingSession(); diff --git a/media/java/android/media/metrics/BundleSession.java b/media/java/android/media/metrics/BundleSession.java new file mode 100644 index 0000000000000..743d2338d69a3 --- /dev/null +++ b/media/java/android/media/metrics/BundleSession.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2021 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.NonNull; +import android.annotation.Nullable; +import android.os.PersistableBundle; + +import com.android.internal.util.AnnotationValidations; + +import java.util.Objects; + +/** + * An instances of this class represents a session with data stored in a bundle. + */ +public final class BundleSession implements AutoCloseable { + private final @NonNull String mId; + private final @NonNull MediaMetricsManager mManager; + private final @NonNull LogSessionId mLogSessionId; + + /** @hide */ + public BundleSession(@NonNull String id, @NonNull MediaMetricsManager manager) { + mId = id; + mManager = manager; + AnnotationValidations.validate(NonNull.class, null, mId); + AnnotationValidations.validate(NonNull.class, null, mManager); + mLogSessionId = new LogSessionId(mId); + } + + /** + * Reports metrics via bundle. + * + */ + public void reportBundleMetrics(@NonNull PersistableBundle metrics) { + mManager.reportBundleMetrics(mId, metrics); + } + + public @NonNull LogSessionId getSessionId() { + return mLogSessionId; + } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BundleSession that = (BundleSession) o; + return Objects.equals(mId, that.mId); + } + + @Override + public int hashCode() { + return Objects.hash(mId); + } + + @Override + public void close() { + } +} diff --git a/media/java/android/media/metrics/IMediaMetricsManager.aidl b/media/java/android/media/metrics/IMediaMetricsManager.aidl index 399e888a754db..a774403b48352 100644 --- a/media/java/android/media/metrics/IMediaMetricsManager.aidl +++ b/media/java/android/media/metrics/IMediaMetricsManager.aidl @@ -21,6 +21,7 @@ import android.media.metrics.PlaybackErrorEvent; import android.media.metrics.PlaybackMetrics; import android.media.metrics.PlaybackStateEvent; import android.media.metrics.TrackChangeEvent; +import android.os.PersistableBundle; /** * Interface to the playback manager service. @@ -38,4 +39,6 @@ interface IMediaMetricsManager { String getTranscodingSessionId(int userId); String getEditingSessionId(int userId); + String getBundleSessionId(int userId); + void reportBundleMetrics(in String sessionId, in PersistableBundle metrics, int userId); } diff --git a/media/java/android/media/metrics/MediaMetricsManager.java b/media/java/android/media/metrics/MediaMetricsManager.java index 74e760a2c57cd..7229c471c3b63 100644 --- a/media/java/android/media/metrics/MediaMetricsManager.java +++ b/media/java/android/media/metrics/MediaMetricsManager.java @@ -19,6 +19,7 @@ package android.media.metrics; import android.annotation.NonNull; import android.annotation.SystemService; import android.content.Context; +import android.os.PersistableBundle; import android.os.RemoteException; /** @@ -52,6 +53,17 @@ public final class MediaMetricsManager { throw e.rethrowFromSystemServer(); } } + /** + * Reports bundle metrics. + * @hide + */ + public void reportBundleMetrics(@NonNull String sessionId, PersistableBundle metrics) { + try { + mService.reportBundleMetrics(sessionId, metrics, mUserId); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } /** * Reports network event. * @hide @@ -144,6 +156,20 @@ public final class MediaMetricsManager { } } + /** + * Creates a generic bundle session. + */ + @NonNull + public BundleSession createBundleSession() { + try { + String id = mService.getBundleSessionId(mUserId); + BundleSession session = new BundleSession(id, this); + return session; + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Reports error event. * @hide diff --git a/services/core/java/com/android/server/media/metrics/MediaMetricsManagerService.java b/services/core/java/com/android/server/media/metrics/MediaMetricsManagerService.java index 272e577a8d732..1ae7ac07594b2 100644 --- a/services/core/java/com/android/server/media/metrics/MediaMetricsManagerService.java +++ b/services/core/java/com/android/server/media/metrics/MediaMetricsManagerService.java @@ -26,6 +26,7 @@ import android.media.metrics.PlaybackMetrics; import android.media.metrics.PlaybackStateEvent; import android.media.metrics.TrackChangeEvent; import android.os.Binder; +import android.os.PersistableBundle; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; import android.util.Base64; @@ -180,6 +181,20 @@ public final class MediaMetricsManagerService extends SystemService { StatsLog.write(statsEvent); } + public void reportBundleMetrics(String sessionId, PersistableBundle metrics, int userId) { + int level = loggingLevel(); + if (level == LOGGING_LEVEL_BLOCKED) { + return; + } + + int atomid = metrics.getInt("KEY_STATSD_ATOM_NUMBER"); + switch (atomid) { + default: + return; + // to be extended as we define statsd atoms + } + } + @Override public void reportPlaybackStateEvent( String sessionId, PlaybackStateEvent event, int userId) { @@ -231,6 +246,11 @@ public final class MediaMetricsManagerService extends SystemService { return getSessionIdInternal(userId); } + @Override + public String getBundleSessionId(int userId) { + return getSessionIdInternal(userId); + } + @Override public void reportPlaybackErrorEvent( String sessionId, PlaybackErrorEvent event, int userId) {