From f0cff0456258478ba768097f73d4367ab67fd7a3 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Wed, 14 Sep 2011 18:11:09 -0700 Subject: Bug 5300223 RemoteControlClient uses PendingIntent for media button events Update the implementation of the RemoteControlClient / Display feature rely on PendingIntent as provided in the construction of the RemoteControlClient instance. The ComponentName that describes the target of the media button events is set as the target of the Intent from which a PendingIntent is constructed. This ComponentName is still saved in the stack for persisting the last media button event receiver. This CL also updates the lockscreen IRemoteControlDisplay implementation to use the PendingIntent supplied by the application when sending transport control events. A (good) side effect of doing this is that intent will be directly targeted at the application. Restoration of the media button event receiver after reboot is not fully functional yet. Change-Id: I2be82f2839e9dee1de02512437b3fb41cc386cde --- .../internal/widget/TransportControlView.java | 27 ++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'core') diff --git a/core/java/com/android/internal/widget/TransportControlView.java b/core/java/com/android/internal/widget/TransportControlView.java index 29ad15b..f9c2cce 100644 --- a/core/java/com/android/internal/widget/TransportControlView.java +++ b/core/java/com/android/internal/widget/TransportControlView.java @@ -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) { -- cgit v1.1