Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e14b46a authored by Shubang Lu's avatar Shubang Lu
Browse files

[MQ feedback] Add ActivePictureListener APIs

Test: mmm
Flag: android.media.tv.flags.media_quality_fw
API-Coverage-Bug: 378154044
Bug: 381488919

Change-Id: I406d5b488b77b5a24be75de7f16a938fd79387b4
parent 0797aec7
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -27168,6 +27168,15 @@ package android.media.projection {
package android.media.quality {
  @FlaggedApi("android.media.tv.flags.media_quality_fw") public final class ActiveProcessingPicture implements android.os.Parcelable {
    ctor public ActiveProcessingPicture(int, @NonNull String);
    method public int describeContents();
    method public int getId();
    method @NonNull public String getProfileId();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.media.quality.ActiveProcessingPicture> CREATOR;
  }
  @FlaggedApi("android.media.tv.flags.media_quality_fw") public final class AmbientBacklightEvent implements android.os.Parcelable {
    ctor public AmbientBacklightEvent(int, @Nullable android.media.quality.AmbientBacklightMetadata);
    method public int describeContents();
@@ -27232,6 +27241,7 @@ package android.media.quality {
  }
  @FlaggedApi("android.media.tv.flags.media_quality_fw") public final class MediaQualityManager {
    method public void addActiveProcessingPictureListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.quality.MediaQualityManager.ActiveProcessingPictureListener);
    method public void createPictureProfile(@NonNull android.media.quality.PictureProfile);
    method public void createSoundProfile(@NonNull android.media.quality.SoundProfile);
    method @NonNull public java.util.List<android.media.quality.PictureProfile> getAvailablePictureProfiles();
@@ -27246,6 +27256,7 @@ package android.media.quality {
    method public void registerAmbientBacklightCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.quality.MediaQualityManager.AmbientBacklightCallback);
    method public void registerPictureProfileCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.quality.MediaQualityManager.PictureProfileCallback);
    method public void registerSoundProfileCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.quality.MediaQualityManager.SoundProfileCallback);
    method public void removeActiveProcessingPictureListener(@NonNull android.media.quality.MediaQualityManager.ActiveProcessingPictureListener);
    method public void removePictureProfile(@NonNull String);
    method public void removeSoundProfile(@NonNull String);
    method public void setAmbientBacklightEnabled(boolean);
@@ -27257,6 +27268,10 @@ package android.media.quality {
    method public void updateSoundProfile(@NonNull String, @NonNull android.media.quality.SoundProfile);
  }
  public static interface MediaQualityManager.ActiveProcessingPictureListener {
    method public void onActiveProcessingPicturesChanged(@NonNull java.util.List<android.media.quality.ActiveProcessingPicture>);
  }
  public abstract static class MediaQualityManager.AmbientBacklightCallback {
    ctor public MediaQualityManager.AmbientBacklightCallback();
    method public void onAmbientBacklightEvent(@NonNull android.media.quality.AmbientBacklightEvent);
+1 −0
Original line number Diff line number Diff line
@@ -8129,6 +8129,7 @@ package android.media.musicrecognition {
package android.media.quality {
  @FlaggedApi("android.media.tv.flags.media_quality_fw") public final class MediaQualityManager {
    method public void addGlobalActiveProcessingPictureListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.quality.MediaQualityManager.ActiveProcessingPictureListener);
    method @NonNull public java.util.List<java.lang.String> getPictureProfileAllowList();
    method @NonNull public java.util.List<java.lang.String> getPictureProfilePackageNames();
    method @NonNull public java.util.List<android.media.quality.PictureProfile> getPictureProfilesByPackage(@NonNull String);
+19 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.quality;

parcelable ActiveProcessingPicture;
 No newline at end of file
+86 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.quality;

import android.annotation.FlaggedApi;
import android.media.tv.flags.Flags;
import android.os.Parcel;
import android.os.Parcelable;

import androidx.annotation.NonNull;

/**
 * Active picture represents an image or video undergoing picture processing which uses a picture
 * profile. The picture profile is used to configure the picture processing parameters.
 */
@FlaggedApi(Flags.FLAG_MEDIA_QUALITY_FW)
public final class ActiveProcessingPicture implements Parcelable {
    private final int mId;
    private final String mProfileId;

    public ActiveProcessingPicture(int id, @NonNull String profileId) {
        mId = id;
        mProfileId = profileId;
    }

    /** @hide */
    ActiveProcessingPicture(Parcel in) {
        mId = in.readInt();
        mProfileId = in.readString();
    }

    @NonNull
    public static final Creator<ActiveProcessingPicture> CREATOR = new Creator<>() {
        @Override
        public ActiveProcessingPicture createFromParcel(Parcel in) {
            return new ActiveProcessingPicture(in);
        }

        @Override
        public ActiveProcessingPicture[] newArray(int size) {
            return new ActiveProcessingPicture[size];
        }
    };

    /**
     * An ID that uniquely identifies the active content.
     *
     * <p>The ID is assigned by the system to distinguish different active contents.
     */
    public int getId() {
        return mId;
    }

    /**
     * The ID of the picture profile used to configure the content.
     */
    @NonNull
    public String getProfileId() {
        return mProfileId;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(mId);
        dest.writeString(mProfileId);
    }
}
+86 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.CallbackExecutor;
import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.content.Context;
@@ -55,6 +56,9 @@ public final class MediaQualityManager {
    private final List<SoundProfileCallbackRecord> mSpCallbackRecords = new ArrayList<>();
    // @GuardedBy("mLock")
    private final List<AmbientBacklightCallbackRecord> mAbCallbackRecords = new ArrayList<>();
    // @GuardedBy("mLock")
    private final List<ActiveProcessingPictureListenerRecord> mApListenerRecords =
            new ArrayList<>();


    /**
@@ -1016,4 +1020,86 @@ public final class MediaQualityManager {
        public void onAmbientBacklightEvent(@NonNull AmbientBacklightEvent event) {
        }
    }

    /**
     * Listener used to monitor status of active pictures.
     */
    public interface ActiveProcessingPictureListener {
        /**
         * Called when active pictures are changed.
         *
         * @param activeProcessingPictures contents currently undergoing picture processing.
         */
        void onActiveProcessingPicturesChanged(
                @NonNull List<ActiveProcessingPicture> activeProcessingPictures);
    }

    /**
     * Adds an active picture listener for the contents owner by the caller.
     */
    public void addActiveProcessingPictureListener(
            @CallbackExecutor @NonNull Executor executor,
            @NonNull ActiveProcessingPictureListener listener) {
        Preconditions.checkNotNull(listener);
        Preconditions.checkNotNull(executor);
        synchronized (mLock) {
            mApListenerRecords.add(
                    new ActiveProcessingPictureListenerRecord(listener, executor, false));
        }
    }

    /**
     * Adds an active picture listener for all contents.
     *
     * @hide
     */
    @SuppressLint("PairedRegistration")
    @SystemApi
    @RequiresPermission(android.Manifest.permission.MANAGE_GLOBAL_PICTURE_QUALITY_SERVICE)
    public void addGlobalActiveProcessingPictureListener(
            @NonNull Executor executor,
            @NonNull ActiveProcessingPictureListener listener) {
        Preconditions.checkNotNull(listener);
        Preconditions.checkNotNull(executor);
        synchronized (mLock) {
            mApListenerRecords.add(
                    new ActiveProcessingPictureListenerRecord(listener, executor, true));
        }
    }


    /**
     * Removes an active picture listener for the contents.
     */
    public void removeActiveProcessingPictureListener(
            @NonNull ActiveProcessingPictureListener listener) {
        Preconditions.checkNotNull(listener);
        synchronized (mLock) {
            for (Iterator<ActiveProcessingPictureListenerRecord> it = mApListenerRecords.iterator();
                    it.hasNext(); ) {
                ActiveProcessingPictureListenerRecord record = it.next();
                if (record.getListener() == listener) {
                    it.remove();
                    break;
                }
            }
        }
    }

    private static final class ActiveProcessingPictureListenerRecord {
        private final ActiveProcessingPictureListener mListener;
        private final Executor mExecutor;
        private final boolean mIsGlobal;

        ActiveProcessingPictureListenerRecord(
                ActiveProcessingPictureListener listener, Executor executor, boolean isGlobal) {
            mListener = listener;
            mExecutor = executor;
            mIsGlobal = isGlobal;
        }

        public ActiveProcessingPictureListener getListener() {
            return mListener;
        }
    }
}