summaryrefslogtreecommitdiffstats
path: root/policy/src/com/android
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2012-04-30 11:15:03 -0700
committerJean-Michel Trivi <jmtrivi@google.com>2012-04-30 17:46:19 -0700
commitc68022258ebd3dd97a5079ba99f4f3cd12b223b0 (patch)
tree231a215ad8b0f72a41cc78bda847a24150ef79a2 /policy/src/com/android
parentd6be37d4d9d8427ed0eccf2a333e5589b88b0cf8 (diff)
downloadframeworks_base-c68022258ebd3dd97a5079ba99f4f3cd12b223b0.zip
frameworks_base-c68022258ebd3dd97a5079ba99f4f3cd12b223b0.tar.gz
frameworks_base-c68022258ebd3dd97a5079ba99f4f3cd12b223b0.tar.bz2
Optimize how AudioService receives media button events
AudioService maintains a stack of registered media button event receivers. This change modifies the broadcasters of ACTION_MEDIA_BUTTON intents let AudioService directly handle the corresponding key event instead of trapping the intent sent by PhoneWindowManager, KeyguardViewBase and PhoneFallbackEventHandler. Because the key event may be sent through a PendingIntent, AudioService now also implements the OnFinished interface to be notified when the event was consumed so it can release the wake lock held if it was held when the key event needed to be sent (see where PassHeadsetKey was instanciated in PhoneWindowManager). Change-Id: I2e8614df94af9d54edbf714ef443cc372d21827a
Diffstat (limited to 'policy/src/com/android')
-rw-r--r--policy/src/com/android/internal/policy/impl/KeyguardViewBase.java27
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneFallbackEventHandler.java26
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java19
3 files changed, 50 insertions, 22 deletions
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java b/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
index 39fdf92..5aa764b 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
@@ -24,12 +24,17 @@ import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
+import android.media.IAudioService;
+import android.os.RemoteException;
+import android.os.ServiceManager;
import android.telephony.TelephonyManager;
import android.view.KeyEvent;
import android.view.View;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Slog;
/**
* Base class for keyguard views. {@link #reset} is where you should
@@ -194,9 +199,7 @@ public abstract class KeyguardViewBase extends FrameLayout {
case KeyEvent.KEYCODE_MEDIA_REWIND:
case KeyEvent.KEYCODE_MEDIA_RECORD:
case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: {
- Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
- intent.putExtra(Intent.EXTRA_KEY_EVENT, event);
- getContext().sendOrderedBroadcast(intent, null);
+ handleMediaKeyEvent(event);
return true;
}
@@ -240,9 +243,7 @@ public abstract class KeyguardViewBase extends FrameLayout {
case KeyEvent.KEYCODE_MEDIA_REWIND:
case KeyEvent.KEYCODE_MEDIA_RECORD:
case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: {
- Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
- intent.putExtra(Intent.EXTRA_KEY_EVENT, event);
- getContext().sendOrderedBroadcast(intent, null);
+ handleMediaKeyEvent(event);
return true;
}
}
@@ -250,6 +251,20 @@ public abstract class KeyguardViewBase extends FrameLayout {
return false;
}
+ void handleMediaKeyEvent(KeyEvent keyEvent) {
+ IAudioService audioService = IAudioService.Stub.asInterface(
+ ServiceManager.checkService(Context.AUDIO_SERVICE));
+ if (audioService != null) {
+ try {
+ audioService.dispatchMediaKeyEvent(keyEvent);
+ } catch (RemoteException e) {
+ Log.e("KeyguardViewBase", "dispatchMediaKeyEvent threw exception " + e);
+ }
+ } else {
+ Slog.w("KeyguardViewBase", "Unable to find IAudioService for media key event");
+ }
+ }
+
@Override
public void dispatchSystemUiVisibilityChanged(int visibility) {
super.dispatchSystemUiVisibilityChanged(visibility);
diff --git a/policy/src/com/android/internal/policy/impl/PhoneFallbackEventHandler.java b/policy/src/com/android/internal/policy/impl/PhoneFallbackEventHandler.java
index 83f7788..b88d84b 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneFallbackEventHandler.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneFallbackEventHandler.java
@@ -23,8 +23,12 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.media.AudioManager;
+import android.media.IAudioService;
+import android.os.RemoteException;
+import android.os.ServiceManager;
import android.telephony.TelephonyManager;
import android.util.EventLog;
+import android.util.Log;
import android.util.Slog;
import android.view.View;
import android.view.HapticFeedbackConstants;
@@ -99,9 +103,7 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler {
case KeyEvent.KEYCODE_MEDIA_REWIND:
case KeyEvent.KEYCODE_MEDIA_RECORD:
case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: {
- Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
- intent.putExtra(Intent.EXTRA_KEY_EVENT, event);
- mContext.sendOrderedBroadcast(intent, null);
+ handleMediaKeyEvent(event);
return true;
}
@@ -213,9 +215,7 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler {
case KeyEvent.KEYCODE_MEDIA_REWIND:
case KeyEvent.KEYCODE_MEDIA_RECORD:
case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: {
- Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
- intent.putExtra(Intent.EXTRA_KEY_EVENT, event);
- mContext.sendOrderedBroadcast(intent, null);
+ handleMediaKeyEvent(event);
return true;
}
@@ -285,5 +285,19 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler {
void sendCloseSystemWindows() {
PhoneWindowManager.sendCloseSystemWindows(mContext, null);
}
+
+ private void handleMediaKeyEvent(KeyEvent keyEvent) {
+ IAudioService audioService = IAudioService.Stub.asInterface(
+ ServiceManager.checkService(Context.AUDIO_SERVICE));
+ if (audioService != null) {
+ try {
+ audioService.dispatchMediaKeyEvent(keyEvent);
+ } catch (RemoteException e) {
+ Log.e(TAG, "dispatchMediaKeyEvent threw exception " + e);
+ }
+ } else {
+ Slog.w(TAG, "Unable to find IAudioService for media key event.");
+ }
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index d2053ff..ed54a5d 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -3299,20 +3299,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public void run() {
if (ActivityManagerNative.isSystemReady()) {
- Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
- intent.putExtra(Intent.EXTRA_KEY_EVENT, mKeyEvent);
- mContext.sendOrderedBroadcast(intent, null, mBroadcastDone,
- mHandler, Activity.RESULT_OK, null, null);
+ IAudioService audioService = getAudioService();
+ if (audioService != null) {
+ try {
+ audioService.dispatchMediaKeyEventUnderWakelock(mKeyEvent);
+ } catch (RemoteException e) {
+ Log.e(TAG, "dispatchMediaKeyEvent threw exception " + e);
+ }
+ }
+ mBroadcastWakeLock.release();
}
}
}
- BroadcastReceiver mBroadcastDone = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- mBroadcastWakeLock.release();
- }
- };
-
BroadcastReceiver mDockReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_DOCK_EVENT.equals(intent.getAction())) {