Merge "fix indentation for coding rule"
diff --git a/media/libmediaplayer2/JAudioTrack.cpp b/media/libmediaplayer2/JAudioTrack.cpp
index 3d6879e..7c2191b 100644
--- a/media/libmediaplayer2/JAudioTrack.cpp
+++ b/media/libmediaplayer2/JAudioTrack.cpp
@@ -34,7 +34,7 @@
         callback_t cbf,                               // Offload
         void* user,                                   // Offload
         size_t frameCount,                            // bufferSizeInBytes
-        int32_t sessionId,                    // AudioTrack
+        int32_t sessionId,                            // AudioTrack
         const jobject attributes,                     // AudioAttributes
         float maxRequiredSpeed) {                     // bufferSizeInBytes
 
@@ -65,18 +65,20 @@
     jmethodID jBuilderCtor = env->GetMethodID(jBuilderCls, "<init>", "()V");
     jobject jBuilderObj = env->NewObject(jBuilderCls, jBuilderCtor);
 
-    if (attributes != NULL) {
-        mAudioAttributesObj = new JObjectHolder(attributes);
-    } else {
-        mAudioAttributesObj = new JObjectHolder(
-                JAudioAttributes::createAudioAttributesObj(env, NULL));
+    {
+        sp<JObjectHolder> audioAttributesObj;
+        if (attributes != NULL) {
+            audioAttributesObj = new JObjectHolder(attributes);
+        } else {
+            audioAttributesObj = new JObjectHolder(
+                    JAudioAttributes::createAudioAttributesObj(env, NULL));
+        }
+        jmethodID jSetAudioAttributes = env->GetMethodID(jBuilderCls, "setAudioAttributes",
+                "(Landroid/media/AudioAttributes;)Landroid/media/AudioTrack$Builder;");
+        jBuilderObj = env->CallObjectMethod(jBuilderObj,
+                jSetAudioAttributes, audioAttributesObj->getJObject());
     }
 
-    jmethodID jSetAudioAttributes = env->GetMethodID(jBuilderCls, "setAudioAttributes",
-            "(Landroid/media/AudioAttributes;)Landroid/media/AudioTrack$Builder;");
-    jBuilderObj = env->CallObjectMethod(jBuilderObj,
-            jSetAudioAttributes, mAudioAttributesObj->getJObject());
-
     jmethodID jSetAudioFormat = env->GetMethodID(jBuilderCls, "setAudioFormat",
             "(Landroid/media/AudioFormat;)Landroid/media/AudioTrack$Builder;");
     jBuilderObj = env->CallObjectMethod(jBuilderObj, jSetAudioFormat,
@@ -513,15 +515,14 @@
 }
 
 audio_stream_type_t JAudioTrack::getAudioStreamType() {
-    if (mAudioAttributesObj == NULL) {
-        return AUDIO_STREAM_DEFAULT;
-    }
     JNIEnv *env = JavaVMHelper::getJNIEnv();
+    jmethodID jGetAudioAttributes = env->GetMethodID(mAudioTrackCls, "getAudioAttributes",
+            "()Landroid/media/AudioAttributes;");
+    jobject jAudioAttributes = env->CallObjectMethod(mAudioTrackObj, jGetAudioAttributes);
     jclass jAudioAttributesCls = env->FindClass("android/media/AudioAttributes");
     jmethodID jGetVolumeControlStream = env->GetMethodID(jAudioAttributesCls,
             "getVolumeControlStream", "()I");
-    int javaAudioStreamType = env->CallIntMethod(
-            mAudioAttributesObj->getJObject(), jGetVolumeControlStream);
+    int javaAudioStreamType = env->CallIntMethod(jAudioAttributes, jGetVolumeControlStream);
     return (audio_stream_type_t)javaAudioStreamType;
 }
 
@@ -755,7 +756,7 @@
 
 jobject JAudioTrack::createStreamEventCallback(callback_t cbf, void* user) {
     JNIEnv *env = JavaVMHelper::getJNIEnv();
-    jclass jCallbackCls = env->FindClass("android/media/MediaPlayer2Impl$StreamEventCallback");
+    jclass jCallbackCls = env->FindClass("android/media/MediaPlayer2$StreamEventCallback");
     jmethodID jCallbackCtor = env->GetMethodID(jCallbackCls, "<init>", "(JJJ)V");
     jobject jCallbackObj = env->NewObject(jCallbackCls, jCallbackCtor, this, cbf, user);
     return jCallbackObj;
diff --git a/media/libmediaplayer2/include/mediaplayer2/JAudioTrack.h b/media/libmediaplayer2/include/mediaplayer2/JAudioTrack.h
index 8ea70ef..87dc889 100644
--- a/media/libmediaplayer2/include/mediaplayer2/JAudioTrack.h
+++ b/media/libmediaplayer2/include/mediaplayer2/JAudioTrack.h
@@ -446,7 +446,6 @@
 
     jclass mAudioTrackCls;
     jobject mAudioTrackObj;
-    sp<JObjectHolder> mAudioAttributesObj;
 
     /* Creates a Java VolumeShaper.Configuration object from VolumeShaper::Configuration */
     jobject createVolumeShaperConfigurationObj(
diff --git a/packages/MediaComponents/apex/java/android/media/MediaUtils.java b/packages/MediaComponents/apex/java/android/media/MediaUtils.java
new file mode 100644
index 0000000..0f0cb00
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/MediaUtils.java
@@ -0,0 +1,34 @@
+package android.media;
+
+import android.view.KeyEvent;
+
+/**
+ * @hide
+ */
+public class MediaUtils {
+
+    /**
+     * Adjusting the volume due to a hardware key press.
+     * (Copied version of hidden AudioManager.FLAG_FROM_KEY)
+     */
+    public static final int AUDIO_MANAGER_FLAG_FROM_KEY = 1 << 12;
+
+    // Keep sync with KeyEvent#isMediaKey().
+    public static boolean isMediaKey(int keyCode) {
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_MEDIA_PLAY:
+            case KeyEvent.KEYCODE_MEDIA_PAUSE:
+            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+            case KeyEvent.KEYCODE_MUTE:
+            case KeyEvent.KEYCODE_HEADSETHOOK:
+            case KeyEvent.KEYCODE_MEDIA_STOP:
+            case KeyEvent.KEYCODE_MEDIA_NEXT:
+            case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
+            case KeyEvent.KEYCODE_MEDIA_REWIND:
+            case KeyEvent.KEYCODE_MEDIA_RECORD:
+            case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
+                return true;
+        }
+        return false;
+    }
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/MediaController.java b/packages/MediaComponents/apex/java/android/media/session/MediaController.java
index 1f29185..fab57e3 100644
--- a/packages/MediaComponents/apex/java/android/media/session/MediaController.java
+++ b/packages/MediaComponents/apex/java/android/media/session/MediaController.java
@@ -25,6 +25,7 @@
 import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.media.MediaMetadata;
+import android.media.MediaUtils;
 import android.media.Rating;
 import android.media.VolumeProvider;
 import android.net.Uri;
@@ -149,12 +150,9 @@
         if (keyEvent == null) {
             throw new IllegalArgumentException("KeyEvent may not be null");
         }
-        //TODO(b/119789707): Resolve hidden API usage: KeyEvent#isMediaKey
-        /*
-        if (!KeyEvent.isMediaKey(keyEvent.getKeyCode())) {
+        if (!MediaUtils.isMediaKey(keyEvent.getKeyCode())) {
             return false;
         }
-        */
         try {
             //TODO(b/119748678): Resolve mContext.getOpPackageName() through this file.
             // Temporarilly it's replaced with "mContext.getOpPackageName()" for compiling.
@@ -199,9 +197,8 @@
             }
 
             case KeyEvent.ACTION_UP: {
-                //TODO(b/119790339): Resolve hidden API usage. AudioManager.FLAG_FROM_KEY
-                final int flags = AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_VIBRATE;
-                        //| AudioManager.FLAG_FROM_KEY;
+                final int flags = AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_VIBRATE
+                        | MediaUtils.AUDIO_MANAGER_FLAG_FROM_KEY;
                 try {
                     mSessionBinder.adjustVolume("mContext.getOpPackageName()", mCbStub, true, 0,
                             flags);
diff --git a/packages/MediaComponents/tests/src/com/android/media/SessionPlaylistAgentTest.java b/packages/MediaComponents/tests/src/com/android/media/SessionPlaylistAgentTest.java
index beb0848..0807600 100644
--- a/packages/MediaComponents/tests/src/com/android/media/SessionPlaylistAgentTest.java
+++ b/packages/MediaComponents/tests/src/com/android/media/SessionPlaylistAgentTest.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.media.AudioAttributes;
 import android.media.DataSourceDesc;
+import android.media.UriDataSourceDesc;
 import android.media.MediaItem2;
 import android.media.MediaMetadata2;
 import android.media.MediaPlayerBase;
@@ -119,7 +120,7 @@
             if (item.getMediaId().contains("WITHOUT_DSD")) {
                 return null;
             }
-            return new DataSourceDesc.Builder()
+            return new UriDataSourceDesc.Builder()
                     .setDataSource(getContext(), Uri.parse("dsd://test"))
                     .setMediaId(item.getMediaId())
                     .build();
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 58acad3..d118459 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -1257,13 +1257,12 @@
     for (audio_io_handle_t output : outputs) {
         sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueFor(output);
         if (!outputDesc->isDuplicated()) {
+            if (outputDesc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) {
+                continue;
+            }
             // if a valid format is specified, skip output if not compatible
             if (format != AUDIO_FORMAT_INVALID) {
-                if (outputDesc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) {
-                    if (format != outputDesc->mFormat) {
-                        continue;
-                    }
-                } else if (!audio_is_linear_pcm(format)) {
+                if (!audio_is_linear_pcm(format)) {
                     continue;
                 }
                 if (AudioPort::isBetterFormatMatch(