Merge "Use video/webm mime type for WEBM files"
diff --git a/core/jni/android_server_BluetoothEventLoop.cpp b/core/jni/android_server_BluetoothEventLoop.cpp
index 8f84b81..45b7f27 100644
--- a/core/jni/android_server_BluetoothEventLoop.cpp
+++ b/core/jni/android_server_BluetoothEventLoop.cpp
@@ -229,6 +229,13 @@
         DBusError err;
         dbus_error_init(&err);
 
+        const char *agent_path = "/android/bluetooth/agent";
+        const char *capabilities = "DisplayYesNo";
+        if (register_agent(nat, agent_path, capabilities) < 0) {
+            dbus_connection_unregister_object_path (nat->conn, agent_path);
+            return JNI_FALSE;
+        }
+
         // Add a filter for all incoming messages
         if (!dbus_connection_add_filter(nat->conn, event_filter, nat, NULL)){
             return JNI_FALSE;
@@ -294,12 +301,6 @@
             return JNI_FALSE;
         }
 
-        const char *agent_path = "/android/bluetooth/agent";
-        const char *capabilities = "DisplayYesNo";
-        if (register_agent(nat, agent_path, capabilities) < 0) {
-            dbus_connection_unregister_object_path (nat->conn, agent_path);
-            return JNI_FALSE;
-        }
         return JNI_TRUE;
     }
     return JNI_FALSE;
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 4e9f752..9bf8b2d 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -55,7 +55,6 @@
 import java.io.FileDescriptor;
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.lang.ref.SoftReference;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -2159,7 +2158,7 @@
 
                 case MSG_RCDISPLAY_UPDATE:
                     synchronized(mCurrentRcLock) {
-                        if (mCurrentRcClientRef.get() == null) {
+                        if (mCurrentRcClient == null) {
                             // the remote control display owner has changed between the
                             // the message to update the display was sent, and the time it
                             // gets to be processed (now)
@@ -2848,11 +2847,10 @@
     private final Object mCurrentRcLock = new Object();
     /**
      * The one remote control client to be polled for display information.
-     * This object is never null, but its reference might.
+     * This object may be null.
      * Access protected by mCurrentRcLock.
      */
-    private SoftReference<IRemoteControlClient> mCurrentRcClientRef =
-            new SoftReference<IRemoteControlClient>(null);
+    private IRemoteControlClient mCurrentRcClient = null;
 
     private final static int RC_INFO_NONE = 0;
     private final static int RC_INFO_ALL =
@@ -2868,8 +2866,9 @@
     private int mCurrentRcClientInfoFlags = RC_INFO_ALL;
 
     /**
-     * A monotonically increasing generation counter for mCurrentRcClientRef.
+     * A monotonically increasing generation counter for mCurrentRcClient.
      * Only accessed with a lock on mCurrentRcLock.
+     * No value wrap-around issues as we only act on equal values.
      */
     private int mCurrentRcClientGen = 0;
 
@@ -2885,7 +2884,7 @@
     public IRemoteControlClient getRemoteControlClient(int rcClientId) {
         synchronized(mCurrentRcLock) {
             if (rcClientId == mCurrentRcClientGen) {
-                return mCurrentRcClientRef.get();
+                return mCurrentRcClient;
             } else {
                 return null;
             }
@@ -2945,13 +2944,13 @@
         public int mCallingUid;
 
         /** provides access to the information to display on the remote control */
-        public SoftReference<IRemoteControlClient> mRcClientRef;
+        public IRemoteControlClient mRcClient;
         public RcClientDeathHandler mRcClientDeathHandler;
 
         public RemoteControlStackEntry(ComponentName r) {
             mReceiverComponent = r;
             mCallingUid = -1;
-            mRcClientRef = new SoftReference<IRemoteControlClient>(null);
+            mRcClient = null;
         }
 
         public void unlinkToRcClientDeath() {
@@ -2986,7 +2985,7 @@
             while(stackIterator.hasNext()) {
                 RemoteControlStackEntry rcse = stackIterator.next();
                 pw.println("     receiver: " + rcse.mReceiverComponent +
-                        "  -- client: " + rcse.mRcClientRef.get() +
+                        "  -- client: " + rcse.mRcClient +
                         "  -- uid: " + rcse.mCallingUid);
             }
         }
@@ -3105,7 +3104,7 @@
      */
     private void clearRemoteControlDisplay() {
         synchronized(mCurrentRcLock) {
-            mCurrentRcClientRef.clear();
+            mCurrentRcClient = null;
             mCurrentRcClientInfoFlags = RC_INFO_NONE;
         }
         mAudioHandler.sendMessage( mAudioHandler.obtainMessage(MSG_RCDISPLAY_CLEAR) );
@@ -3120,18 +3119,17 @@
         RemoteControlStackEntry rcse = mRCStack.peek();
         // this is where we enforce opt-in for information display on the remote controls
         //   with the new AudioManager.registerRemoteControlClient() API
-        if (rcse.mRcClientRef.get() == null) {
-            // FIXME remove log before release: this warning will be displayed for every AF change
-            Log.w(TAG, "Can't update remote control display with null remote control client");
+        if (rcse.mRcClient == null) {
+            //Log.w(TAG, "Can't update remote control display with null remote control client");
             clearRemoteControlDisplay();
             return;
         }
         synchronized(mCurrentRcLock) {
-            if (!rcse.mRcClientRef.get().equals(mCurrentRcClientRef.get())) {
+            if (!rcse.mRcClient.equals(mCurrentRcClient)) {
                 // new RC client, assume every type of information shall be queried
                 mCurrentRcClientInfoFlags = RC_INFO_ALL;
             }
-            mCurrentRcClientRef = rcse.mRcClientRef;
+            mCurrentRcClient = rcse.mRcClient;
         }
         mAudioHandler.sendMessage( mAudioHandler.obtainMessage(MSG_RCDISPLAY_UPDATE, 0, 0, rcse) );
     }
@@ -3209,7 +3207,7 @@
                             rcse.unlinkToRcClientDeath();
                         }
                         // save the new remote control client
-                        rcse.mRcClientRef = new SoftReference<IRemoteControlClient>(rcClient);
+                        rcse.mRcClient = rcClient;
                         rcse.mCallingPackageName = callingPackageName;
                         rcse.mCallingUid = Binder.getCallingUid();
                         if (rcClient == null) {
@@ -3224,7 +3222,7 @@
                         } catch (RemoteException e) {
                             // remote control client is DOA, disqualify it
                             Log.w(TAG, "registerRemoteControlClient() has a dead client " + b);
-                            rcse.mRcClientRef.clear();
+                            rcse.mRcClient = null;
                         }
                         rcse.mRcClientDeathHandler = rcdh;
                         break;
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 1bacdbb..434ef14 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -607,13 +607,13 @@
 
     /**
      * Sets the {@link SurfaceHolder} to use for displaying the video
-     * portion of the media.  A surface must be set if a display is
-     * needed.  Not calling this method when playing back a video will
-     * result in only the audio track being played.
+     * portion of the media.
      *
      * Either a surface holder or surface must be set if a display or video sink
      * is needed.  Not calling this method or {@link #setTexture(SurfaceTexture)}
      * when playing back a video will result in only the audio track being played.
+     * A null surface holder or surface will result in only the audio track being
+     * played.
      *
      * @param sh the SurfaceHolder to use for video display
      */
@@ -634,6 +634,7 @@
      * the media. This is similar to {@link #setDisplay(SurfaceHolder)}, but does not
      * support {@link #setScreenOnWhilePlaying(boolean)} or {@link #updateSurfaceScreenOn()}.
      * Setting a Surface will un-set any Surface or SurfaceHolder that was previously set.
+     * A null surface will result in only the audio track being played.
      *
      * @param surface The {@link Surface} to be used for the video portion of the media.
      *
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index 5663683..9090daa 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -247,9 +247,8 @@
 static void setVideoSurfaceOrSurfaceTexture(
         const sp<MediaPlayer>& mp, JNIEnv *env, jobject thiz, const char *prefix)
 {
-    // The Java MediaPlayer class makes sure that at most one of mSurface and
-    // mParcelSurfaceTexture is non-null.  But just in case, we give priority to
-    // mSurface over mParcelSurfaceTexture.
+    // Both mSurface and mParcelSurfaceTexture could be null.
+    // We give priority to mSurface over mParcelSurfaceTexture.
     jobject surface = env->GetObjectField(thiz, fields.surface);
     if (surface != NULL) {
         sp<Surface> native_surface(get_surface(env, surface));
@@ -263,6 +262,8 @@
                     ParcelSurfaceTexture_getISurfaceTexture(env, parcelSurfaceTexture));
             LOGV("%s: texture=%p", prefix, native_surfaceTexture.get());
             mp->setVideoSurfaceTexture(native_surfaceTexture);
+        } else {
+            mp->setVideoSurfaceTexture(NULL);
         }
     }
 }
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 67f6c79..9c9bc2d 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -1157,6 +1157,8 @@
     mSurface.clear();
     if (surfaceTexture != NULL) {
         setNativeWindow_l(new SurfaceTextureClient(surfaceTexture));
+    } else {
+        setNativeWindow_l(NULL);
     }
 }
 
@@ -1769,7 +1771,8 @@
         }
     }
 
-    if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
+    if ((mNativeWindow != NULL)
+            && (mVideoRendererIsPreview || mVideoRenderer == NULL)) {
         mVideoRendererIsPreview = false;
 
         initRenderer_l();
diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java
index 9a51d5e..5b4bce2 100644
--- a/wifi/java/android/net/wifi/WifiConfigStore.java
+++ b/wifi/java/android/net/wifi/WifiConfigStore.java
@@ -954,7 +954,7 @@
                         netId,
                         WifiConfiguration.pskVarName,
                         config.preSharedKey)) {
-                Log.d(TAG, "failed to set psk: "+config.preSharedKey);
+                Log.d(TAG, "failed to set psk");
                 break setVariables;
             }