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

Commit 2f153169 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi Committed by Android (Google) Code Review
Browse files

Merge "Bug 5300223 RemoteControlClient uses PendingIntent for media button...

Merge "Bug 5300223 RemoteControlClient uses PendingIntent for media button events" into ics-factoryrom
parents 31f971b5 f0cff045
Loading
Loading
Loading
Loading
+20 −7
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import java.lang.ref.WeakReference;
import com.android.internal.widget.LockScreenWidgetCallback;
import com.android.internal.widget.LockScreenWidgetInterface;

import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -68,7 +70,7 @@ public class TransportControlView extends FrameLayout implements OnClickListener
    private int mClientGeneration;
    private Metadata mMetadata = new Metadata();
    private boolean mAttached;
    private ComponentName mClientName;
    private PendingIntent mClientIntent;
    private int mTransportControlFlags;
    private int mPlayState;
    private AudioManager mAudioManager;
@@ -116,7 +118,7 @@ public class TransportControlView extends FrameLayout implements OnClickListener
                    }
                }
                mClientGeneration = msg.arg1;
                mClientName = (ComponentName) msg.obj;
                mClientIntent = (PendingIntent) msg.obj;
                break;

            }
@@ -174,12 +176,12 @@ public class TransportControlView extends FrameLayout implements OnClickListener
            }
        }

        public void setCurrentClientId(int clientGeneration, ComponentName clientEventReceiver,
        public void setCurrentClientId(int clientGeneration, PendingIntent mediaIntent,
                boolean clearing) throws RemoteException {
            Handler handler = mLocalHandler.get();
            if (handler != null) {
                handler.obtainMessage(MSG_SET_GENERATION_ID,
                    clientGeneration, (clearing ? 1 : 0), clientEventReceiver).sendToTarget();
                    clientGeneration, (clearing ? 1 : 0), mediaIntent).sendToTarget();
            }
        }
    };
@@ -365,16 +367,27 @@ public class TransportControlView extends FrameLayout implements OnClickListener
    }

    private void sendMediaButtonClick(int keyCode) {
        // TODO: target to specific player based on mClientName
        // use the registered PendingIntent that will be processed by the registered
        //    media button event receiver, which is the component of mClientIntent
        KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
        Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
        intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
        getContext().sendOrderedBroadcast(intent, null);
        try {
            mClientIntent.send(getContext(), 0, intent);
        } catch (CanceledException e) {
            Log.e(TAG, "Error sending intent for media button down: "+e);
            e.printStackTrace();
        }

        keyEvent = new KeyEvent(KeyEvent.ACTION_UP, keyCode);
        intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
        intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
        getContext().sendOrderedBroadcast(intent, null);
        try {
            mClientIntent.send(getContext(), 0, intent);
        } catch (CanceledException e) {
            Log.e(TAG, "Error sending intent for media button up: "+e);
            e.printStackTrace();
        }
    }

    public void setCallback(LockScreenWidgetCallback callback) {
+50 −12
Original line number Diff line number Diff line
@@ -18,8 +18,10 @@ package android.media;

import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.graphics.Bitmap;
import android.os.Binder;
@@ -1684,17 +1686,42 @@ public class AudioManager {
     * Register a component to be the sole receiver of MEDIA_BUTTON intents.
     * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver}
     *      that will receive the media button intent. This broadcast receiver must be declared
     *      in the application manifest.
     *      in the application manifest. The package of the component must match that of
     *      the context you're registering from.
     */
    public void registerMediaButtonEventReceiver(ComponentName eventReceiver) {
        if (eventReceiver == null) {
            return;
        }
        if (!eventReceiver.getPackageName().equals(mContext.getPackageName())) {
            Log.e(TAG, "registerMediaButtonEventReceiver() error: " +
                    "receiver and context package names don't match");
            return;
        }
        // construct a PendingIntent for the media button and register it
        Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
        //     the associated intent will be handled by the component being registered
        mediaButtonIntent.setComponent(eventReceiver);
        PendingIntent pi = PendingIntent.getBroadcast(mContext,
                0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/);
        registerMediaButtonIntent(pi, eventReceiver);
    }

    /**
     * @hide
     * no-op if (pi == null) or (eventReceiver == null)
     */
    public void registerMediaButtonIntent(PendingIntent pi, ComponentName eventReceiver) {
        if ((pi == null) || (eventReceiver == null)) {
            Log.e(TAG, "Cannot call registerMediaButtonIntent() with a null parameter");
            return;
        }
        IAudioService service = getService();
        try {
            service.registerMediaButtonEventReceiver(eventReceiver);
            // pi != null
            service.registerMediaButtonIntent(pi, eventReceiver);
        } catch (RemoteException e) {
            Log.e(TAG, "Dead object in registerMediaButtonEventReceiver"+e);
            Log.e(TAG, "Dead object in registerMediaButtonIntent"+e);
        }
    }

@@ -1707,15 +1734,27 @@ public class AudioManager {
        if (eventReceiver == null) {
            return;
        }
        // construct a PendingIntent for the media button and unregister it
        Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
        //     the associated intent will be handled by the component being registered
        mediaButtonIntent.setComponent(eventReceiver);
        PendingIntent pi = PendingIntent.getBroadcast(mContext,
                0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/);
        unregisterMediaButtonIntent(pi, eventReceiver);
    }

    /**
     * @hide
     */
    public void unregisterMediaButtonIntent(PendingIntent pi, ComponentName eventReceiver) {
        IAudioService service = getService();
        try {
            service.unregisterMediaButtonEventReceiver(eventReceiver);
            service.unregisterMediaButtonIntent(pi, eventReceiver);
        } catch (RemoteException e) {
            Log.e(TAG, "Dead object in unregisterMediaButtonEventReceiver"+e);
            Log.e(TAG, "Dead object in unregisterMediaButtonIntent"+e);
        }
    }


    /**
     * Registers the remote control client for providing information to display on the remote
     * controls.
@@ -1724,14 +1763,13 @@ public class AudioManager {
     * @see RemoteControlClient
     */
    public void registerRemoteControlClient(RemoteControlClient rcClient) {
        if ((rcClient == null) || (rcClient.getRcEventReceiver() == null)) {
        if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) {
            return;
        }
        IAudioService service = getService();
        try {
            service.registerRemoteControlClient(rcClient.getRcEventReceiver(), /* eventReceiver */
            service.registerRemoteControlClient(rcClient.getRcMediaIntent(),   /* mediaIntent   */
                    rcClient.getIRemoteControlClient(),                        /* rcClient      */
                    rcClient.toString(),                                       /* clientName    */
                    // used to match media button event receiver and audio focus
                    mContext.getPackageName());                                /* packageName   */
        } catch (RemoteException e) {
@@ -1746,12 +1784,12 @@ public class AudioManager {
     * @see #registerRemoteControlClient(RemoteControlClient)
     */
    public void unregisterRemoteControlClient(RemoteControlClient rcClient) {
        if ((rcClient == null) || (rcClient.getRcEventReceiver() == null)) {
        if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) {
            return;
        }
        IAudioService service = getService();
        try {
            service.unregisterRemoteControlClient(rcClient.getRcEventReceiver(), /* eventReceiver */
            service.unregisterRemoteControlClient(rcClient.getRcMediaIntent(), /* mediaIntent   */
                    rcClient.getIRemoteControlClient());                       /* rcClient      */
        } catch (RemoteException e) {
            Log.e(TAG, "Dead object in unregisterRemoteControlClient"+e);
+97 −63

File changed.

Preview size limit exceeded, changes collapsed.

+6 −6
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.media;

import android.app.PendingIntent;
import android.content.ComponentName;
import android.media.IAudioFocusDispatcher;
import android.media.IRemoteControlClient;
@@ -85,13 +86,12 @@ interface IAudioService {
    
    void unregisterAudioFocusClient(String clientId);

    void registerMediaButtonEventReceiver(in ComponentName eventReceiver);
    oneway void registerMediaButtonIntent(in PendingIntent pi, in ComponentName c);
    oneway void unregisterMediaButtonIntent(in PendingIntent pi,  in ComponentName c);

    void unregisterMediaButtonEventReceiver(in ComponentName eventReceiver);

    oneway void registerRemoteControlClient(in ComponentName eventReceiver,
           in IRemoteControlClient rcClient, in String clientName, in String callingPackageName);
    oneway void unregisterRemoteControlClient(in ComponentName eventReceiver,
    oneway void registerRemoteControlClient(in PendingIntent mediaIntent,
           in IRemoteControlClient rcClient, in String callingPackageName);
    oneway void unregisterRemoteControlClient(in PendingIntent mediaIntent,
           in IRemoteControlClient rcClient);

    oneway void   registerRemoteControlDisplay(in IRemoteControlDisplay rcd);
+4 −5
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.media;

import android.app.PendingIntent;
import android.content.ComponentName;
import android.graphics.Bitmap;
import android.os.Bundle;
@@ -31,14 +32,12 @@ oneway interface IRemoteControlDisplay
    /**
     * Sets the generation counter of the current client that is displayed on the remote control.
     * @param clientGeneration the new RemoteControlClient generation
     * @param clientEventReceiver the media button event receiver associated with the client.
     *    May be null, which implies there is no registered media button event receiver. This
     *    parameter is supplied as an optimization so a display can directly target media button
     *    events to the client.
     * @param clientMediaIntent the PendingIntent associated with the client.
     *    May be null, which implies there is no registered media button event receiver.
     * @param clearing true if the new client generation value maps to a remote control update
     *    where the display should be cleared.
     */
    void setCurrentClientId(int clientGeneration, in ComponentName clientEventReceiver,
    void setCurrentClientId(int clientGeneration, in PendingIntent clientMediaIntent,
            boolean clearing);

    void setPlaybackState(int generationId, int state);
Loading