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

Commit b3e6eab1 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi Committed by Android Git Automerger
Browse files

am 2f153169: Merge "Bug 5300223 RemoteControlClient uses PendingIntent for...

am 2f153169: Merge "Bug 5300223 RemoteControlClient uses PendingIntent for media button events" into ics-factoryrom

* commit '2f153169':
  Bug 5300223 RemoteControlClient uses PendingIntent for media button events
parents bd1bb1d0 2f153169
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