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

Commit d61d501a authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Player activity notification: move some intialization server-side"

parents 8a86825e 44a8f53f
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ public final class AudioPlaybackConfiguration implements Parcelable {

    /** @hide */
    public final static int PLAYER_PIID_INVALID = -1;
    /** @hide */
    public final static int PLAYER_UPID_INVALID = -1;

    // information about the implementation
    /**
@@ -159,11 +161,11 @@ public final class AudioPlaybackConfiguration implements Parcelable {
    /**
     * @hide
     */
    public AudioPlaybackConfiguration(PlayerBase.PlayerIdCard pic) {
        mPlayerIId = pic.mPIId;
    public AudioPlaybackConfiguration(PlayerBase.PlayerIdCard pic, int piid, int uid, int pid) {
        mPlayerIId = piid;
        mPlayerType = pic.mPlayerType;
        mClientUid = pic.mClientUid;
        mClientPid = pic.mClientPid;
        mClientUid = uid;
        mClientPid = pid;
        mPlayerState = PLAYER_STATE_IDLE;
        mPlayerAttr = pic.mAttributes;
    }
@@ -187,8 +189,8 @@ public final class AudioPlaybackConfiguration implements Parcelable {
                .build();
        // anonymized data
        anonymCopy.mPlayerType = PLAYER_TYPE_UNKNOWN;
        anonymCopy.mClientUid = 0;
        anonymCopy.mClientPid = 0;
        anonymCopy.mClientUid = PLAYER_UPID_INVALID;
        anonymCopy.mClientPid = PLAYER_UPID_INVALID;
        return anonymCopy;
    }

+1 −1
Original line number Diff line number Diff line
@@ -184,7 +184,7 @@ interface IAudioService {

    List<AudioPlaybackConfiguration> getActivePlaybackConfigurations();

    oneway void trackPlayer(in PlayerBase.PlayerIdCard pic);
    int trackPlayer(in PlayerBase.PlayerIdCard pic);

    oneway void playerAttributes(in int piid, in AudioAttributes attr);

+7 −17
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ public abstract class PlayerBase {
        }
        mAttributes = attr;
        mImplType = implType;
        mPlayerIId = AudioSystem.newAudioPlayerId();
        int newPiid = AudioPlaybackConfiguration.PLAYER_PIID_INVALID;
        IBinder b = ServiceManager.getService(Context.APP_OPS_SERVICE);
        mAppOps = IAppOpsService.Stub.asInterface(b);
        // initialize mHasAppOpsPlayAudio
@@ -100,10 +100,11 @@ public abstract class PlayerBase {
            mHasAppOpsPlayAudio = false;
        }
        try {
            getService().trackPlayer(new PlayerIdCard(mPlayerIId, mImplType, mAttributes));
            newPiid = getService().trackPlayer(new PlayerIdCard(mImplType, mAttributes));
        } catch (RemoteException e) {
            Log.e(TAG, "Error talking to audio service, player will not be tracked", e);
        }
        mPlayerIId = newPiid;
    }


@@ -311,26 +312,20 @@ public abstract class PlayerBase {
     * Class holding all the information about a player that needs to be known at registration time
     */
    public static class PlayerIdCard implements Parcelable {
        public final int mPIId;
        public final int mPlayerType;
        public final int mClientUid;
        public final int mClientPid;

        public final static int AUDIO_ATTRIBUTES_NONE = 0;
        public final static int AUDIO_ATTRIBUTES_DEFINED = 1;
        public final AudioAttributes mAttributes;

        PlayerIdCard(int piid, int type, @NonNull AudioAttributes attr) {
            mPIId = piid;
        PlayerIdCard(int type, @NonNull AudioAttributes attr) {
            mPlayerType = type;
            mClientUid = Binder.getCallingUid();
            mClientPid = Binder.getCallingPid();
            mAttributes = attr;
        }

        @Override
        public int hashCode() {
            return Objects.hash(mPIId, mPlayerType);
            return Objects.hash(mPlayerType);
        }

        @Override
@@ -340,10 +335,7 @@ public abstract class PlayerBase {

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(mPIId);
            dest.writeInt(mPlayerType);
            dest.writeInt(mClientUid);
            dest.writeInt(mClientPid);
            mAttributes.writeToParcel(dest, 0);
        }

@@ -363,10 +355,7 @@ public abstract class PlayerBase {
        };

        private PlayerIdCard(Parcel in) {
            mPIId = in.readInt();
            mPlayerType = in.readInt();
            mClientUid = in.readInt();
            mClientPid = in.readInt();
            mAttributes = AudioAttributes.CREATOR.createFromParcel(in);
        }

@@ -377,7 +366,8 @@ public abstract class PlayerBase {

            PlayerIdCard that = (PlayerIdCard) o;

            return (mPIId == that.mPIId);
            // FIXME change to the binder player interface once supported as a member
            return ((mPlayerType == that.mPlayerType) && mAttributes.equals(that.mAttributes));
        }
    }

+7 −4
Original line number Diff line number Diff line
@@ -6507,11 +6507,14 @@ public class AudioService extends IAudioService.Stub
    }

    public List<AudioPlaybackConfiguration> getActivePlaybackConfigurations() {
        return mPlaybackMonitor.getActivePlaybackConfigurations();
        final boolean isPrivileged =
                (PackageManager.PERMISSION_GRANTED == mContext.checkCallingPermission(
                        android.Manifest.permission.MODIFY_AUDIO_ROUTING));
        return mPlaybackMonitor.getActivePlaybackConfigurations(isPrivileged);
    }

    public void trackPlayer(PlayerBase.PlayerIdCard pic) {
        mPlaybackMonitor.trackPlayer(pic);
    public int trackPlayer(PlayerBase.PlayerIdCard pic) {
        return mPlaybackMonitor.trackPlayer(pic);
    }

    public void playerAttributes(int piid, AudioAttributes attr) {
+22 −8
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.media.AudioSystem;
import android.media.IPlaybackConfigDispatcher;
import android.media.MediaRecorder;
import android.media.PlayerBase;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
@@ -61,16 +62,20 @@ public final class PlaybackActivityMonitor {

    //=================================================================
    // Track players and their states
    // methods trackPlayer, playerAttributes, playerEvent, releasePlayer are all oneway calls
    // methods playerAttributes, playerEvent, releasePlayer are all oneway calls
    //  into AudioService. They trigger synchronous dispatchPlaybackChange() which updates
    //  all listeners as oneway calls.

    public void trackPlayer(PlayerBase.PlayerIdCard pic) {
        if (DEBUG) { Log.v(TAG, "trackPlayer() for piid=" + pic.mPIId); }
        final AudioPlaybackConfiguration apc = new AudioPlaybackConfiguration(pic);
    public int trackPlayer(PlayerBase.PlayerIdCard pic) {
        final int newPiid = AudioSystem.newAudioPlayerId();
        if (DEBUG) { Log.v(TAG, "trackPlayer() new piid=" + newPiid); }
        final AudioPlaybackConfiguration apc =
                new AudioPlaybackConfiguration(pic, newPiid,
                        Binder.getCallingUid(), Binder.getCallingPid());
        synchronized(mPlayerLock) {
            mPlayers.put(pic.mPIId, apc);
            mPlayers.put(newPiid, apc);
        }
        return newPiid;
    }

    public void playerAttributes(int piid, @NonNull AudioAttributes attr) {
@@ -90,7 +95,7 @@ public final class PlaybackActivityMonitor {
    }

    public void playerEvent(int piid, int event) {
        if (DEBUG) { Log.v(TAG, String.format("trackPlayer(piid=%d, event=%d)", piid, event)); }
        if (DEBUG) { Log.v(TAG, String.format("playerEvent(piid=%d, event=%d)", piid, event)); }
        final boolean change;
        synchronized(mPlayerLock) {
            final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid));
@@ -228,9 +233,18 @@ public final class PlaybackActivityMonitor {
        }
    }

    List<AudioPlaybackConfiguration> getActivePlaybackConfigurations() {
    List<AudioPlaybackConfiguration> getActivePlaybackConfigurations(boolean isPrivileged) {
        synchronized(mPlayers) {
            if (isPrivileged) {
                return new ArrayList<AudioPlaybackConfiguration>(mPlayers.values());
            } else {
                final List<AudioPlaybackConfiguration> configsPublic;
                synchronized (mPlayerLock) {
                    configsPublic = anonymizeForPublicConsumption(
                            new ArrayList<AudioPlaybackConfiguration>(mPlayers.values()));
                }
                return configsPublic;
            }
        }
    }