Merge "Enable RTT End-to-end" into lmp-dev
diff --git a/api/current.txt b/api/current.txt
index 5b719bb..713b8d5 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -17438,6 +17438,7 @@
   public class Network implements android.os.Parcelable {
     method public int describeContents();
     method public java.net.InetAddress[] getAllByName(java.lang.String) throws java.net.UnknownHostException;
+    method public java.net.URL getBoundURL(java.net.URL) throws java.net.MalformedURLException;
     method public java.net.InetAddress getByName(java.lang.String) throws java.net.UnknownHostException;
     method public javax.net.SocketFactory getSocketFactory();
     method public void writeToParcel(android.os.Parcel, int);
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 2fef250..f18507e 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -1623,11 +1623,11 @@
             return new BitmapDrawable(getUserManager().getUserIcon(itemInfo.showUserIcon));
         }
         Drawable dr = getDrawable(itemInfo.packageName, itemInfo.icon, appInfo);
-        if (dr != null) {
-            dr = getUserManager().getBadgedDrawableForUser(dr,
-                    new UserHandle(mContext.getUserId()));
+        if (dr == null) {
+            dr = getDefaultActivityIcon();
         }
-        return dr;
+        return getUserManager().getBadgedDrawableForUser(dr,
+                new UserHandle(mContext.getUserId()));
     }
 
     private static class LegacyPackageInstallObserver extends PackageInstallObserver {
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index 9f79a89..4b5bdda 100644
--- a/core/java/android/content/pm/PackageItemInfo.java
+++ b/core/java/android/content/pm/PackageItemInfo.java
@@ -152,15 +152,9 @@
      * such as the default activity icon.
      */
     public Drawable loadIcon(PackageManager pm) {
-        if (icon != 0 || showUserIcon != UserHandle.USER_NULL) {
-            Drawable dr = pm.loadItemIcon(this, getApplicationInfo());
-            if (dr != null) {
-                return dr;
-            }
-        }
-        return loadDefaultIcon(pm);
+        return pm.loadItemIcon(this, getApplicationInfo());
     }
-    
+
     /**
      * Retrieve the current graphical banner associated with this item.  This
      * will call back on the given PackageManager to load the banner from
diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java
index 9a22d78..97238f1 100644
--- a/core/java/android/net/Network.java
+++ b/core/java/android/net/Network.java
@@ -23,11 +23,16 @@
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.MalformedURLException;
 import java.net.Socket;
 import java.net.SocketException;
 import java.net.UnknownHostException;
+import java.net.URL;
 import javax.net.SocketFactory;
 
+import com.android.okhttp.HostResolver;
+import com.android.okhttp.OkHttpClient;
+
 /**
  * Identifies a {@code Network}.  This is supplied to applications via
  * {@link ConnectivityManager.NetworkCallback} in response to the active
@@ -44,7 +49,11 @@
      */
     public final int netId;
 
+    // Objects used to perform per-network operations such as getSocketFactory
+    // and getBoundURL, and a lock to protect access to them.
     private NetworkBoundSocketFactory mNetworkBoundSocketFactory = null;
+    private OkHttpClient mOkHttpClient = null;
+    private Object mLock = new Object();
 
     /**
      * @hide
@@ -166,12 +175,38 @@
      *         {@code Network}.
      */
     public SocketFactory getSocketFactory() {
-        if (mNetworkBoundSocketFactory == null) {
-            mNetworkBoundSocketFactory = new NetworkBoundSocketFactory(netId);
+        synchronized (mLock) {
+            if (mNetworkBoundSocketFactory == null) {
+                mNetworkBoundSocketFactory = new NetworkBoundSocketFactory(netId);
+            }
         }
         return mNetworkBoundSocketFactory;
     }
 
+    /**
+     * Returns a {@link URL} based on the given URL but bound to this {@code Network}.
+     * Note that if this {@code Network} ever disconnects, this factory and any URL object it
+     * produced in the past or future will cease to work.
+     *
+     * @return a {@link URL} bound to this {@code Network}.
+     */
+    public URL getBoundURL(URL url) throws MalformedURLException {
+        synchronized (mLock) {
+            if (mOkHttpClient == null) {
+                HostResolver hostResolver = new HostResolver() {
+                    @Override
+                    public InetAddress[] getAllByName(String host) throws UnknownHostException {
+                        return Network.this.getAllByName(host);
+                    }
+                };
+                mOkHttpClient = new OkHttpClient()
+                        .setSocketFactory(getSocketFactory())
+                        .setHostResolver(hostResolver);
+            }
+        }
+        return new URL(url, "", mOkHttpClient.createURLStreamHandler(url.getProtocol()));
+    }
+
     // implement the Parcelable interface
     public int describeContents() {
         return 0;
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java
index 8aba8af..2d54acb 100644
--- a/core/java/android/view/RenderNode.java
+++ b/core/java/android/view/RenderNode.java
@@ -597,6 +597,9 @@
      * @see #getScaleX()
      */
     public boolean setScaleX(float scaleX) {
+        if (scaleX > 1000000) {
+            throw new IllegalArgumentException("Invalid scale: " + scaleX);
+        }
         return nSetScaleX(mNativeRenderNode, scaleX);
     }
 
@@ -618,6 +621,9 @@
      * @see #getScaleY()
      */
     public boolean setScaleY(float scaleY) {
+        if (scaleY > 1000000) {
+            throw new IllegalArgumentException("Invalid scale: " + scaleY);
+        }
         return nSetScaleY(mNativeRenderNode, scaleY);
     }
 
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index c4c3242..27f493a 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3327,7 +3327,7 @@
                     child.mRenderNode.setClipToBounds(clipChildren);
                 }
             }
-            invalidate();
+            invalidate(true);
         }
     }
 
@@ -3342,7 +3342,7 @@
     public void setClipToPadding(boolean clipToPadding) {
         if (hasBooleanFlag(FLAG_CLIP_TO_PADDING) != clipToPadding) {
             setBooleanFlag(FLAG_CLIP_TO_PADDING, clipToPadding);
-            invalidate();
+            invalidate(true);
         }
     }
 
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index 7e2448e..e0431a7 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -290,7 +290,7 @@
     case MODE_STREAM:
 
         status = lpTrack->set(
-                AUDIO_STREAM_DEFAULT,// stream type
+                AUDIO_STREAM_DEFAULT,// stream type, but more info conveyed in paa (last argument)
                 sampleRateInHertz,
                 format,// word length, PCM
                 nativeChannelMask,
@@ -301,7 +301,7 @@
                 0,// shared mem
                 true,// thread can call Java
                 sessionId,// audio session ID
-                AudioTrack::TRANSFER_DEFAULT, // default transfer mode
+                AudioTrack::TRANSFER_SYNC,
                 NULL,                         // default offloadInfo
                 -1, -1,                       // default uid, pid values
                 paa);
@@ -316,7 +316,7 @@
         }
 
         status = lpTrack->set(
-                AUDIO_STREAM_DEFAULT,// stream type
+                AUDIO_STREAM_DEFAULT,// stream type, but more info conveyed in paa (last argument)
                 sampleRateInHertz,
                 format,// word length, PCM
                 nativeChannelMask,
@@ -327,7 +327,7 @@
                 lpJniStorage->mMemBase,// shared mem
                 true,// thread can call Java
                 sessionId,// audio session ID
-                AudioTrack::TRANSFER_DEFAULT, // default transfer mode
+                AudioTrack::TRANSFER_SHARED,
                 NULL,                         // default offloadInfo
                 -1, -1,                       // default uid, pid values
                 paa);