Merge "Adds speakerphone extra to ACTION_DIAL (2/2)."
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 55abdb6..b94fd41 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -2867,16 +2867,16 @@
     /**
      * Helper class for generating large-format notifications that include a large image attachment.
      *
-     * This class is a "rebuilder": It consumes a Builder object and modifies its behavior, like so:
+     * Here's how you'd set the <code>BigPictureStyle</code> on a notification:
      * <pre class="prettyprint">
-     * Notification noti = new Notification.BigPictureStyle(
-     *      new Notification.Builder()
-     *         .setContentTitle(&quot;New photo from &quot; + sender.toString())
-     *         .setContentText(subject)
-     *         .setSmallIcon(R.drawable.new_post)
-     *         .setLargeIcon(aBitmap))
-     *      .bigPicture(aBigBitmap)
-     *      .build();
+     * Notification notif = new Notification.Builder(mContext)
+     *     .setContentTitle(&quot;New photo from &quot; + sender.toString())
+     *     .setContentText(subject)
+     *     .setSmallIcon(R.drawable.new_post)
+     *     .setLargeIcon(aBitmap)
+     *     .setStyle(new Notification.BigPictureStyle()
+     *         .bigPicture(aBigBitmap))
+     *     .build();
      * </pre>
      *
      * @see Notification#bigContentView
@@ -2963,16 +2963,16 @@
     /**
      * Helper class for generating large-format notifications that include a lot of text.
      *
-     * This class is a "rebuilder": It consumes a Builder object and modifies its behavior, like so:
+     * Here's how you'd set the <code>BigTextStyle</code> on a notification:
      * <pre class="prettyprint">
-     * Notification noti = new Notification.BigTextStyle(
-     *      new Notification.Builder()
-     *         .setContentTitle(&quot;New mail from &quot; + sender.toString())
-     *         .setContentText(subject)
-     *         .setSmallIcon(R.drawable.new_mail)
-     *         .setLargeIcon(aBitmap))
-     *      .bigText(aVeryLongString)
-     *      .build();
+     * Notification notif = new Notification.Builder(mContext)
+     *     .setContentTitle(&quot;New mail from &quot; + sender.toString())
+     *     .setContentText(subject)
+     *     .setSmallIcon(R.drawable.new_mail)
+     *     .setLargeIcon(aBitmap)
+     *     .setStyle(new Notification.BigTextStyle()
+     *         .bigText(aVeryLongString))
+     *     .build();
      * </pre>
      *
      * @see Notification#bigContentView
@@ -3057,19 +3057,19 @@
     /**
      * Helper class for generating large-format notifications that include a list of (up to 5) strings.
      *
-     * This class is a "rebuilder": It consumes a Builder object and modifies its behavior, like so:
+     * Here's how you'd set the <code>InboxStyle</code> on a notification:
      * <pre class="prettyprint">
-     * Notification noti = new Notification.InboxStyle(
-     *      new Notification.Builder()
-     *         .setContentTitle(&quot;5 New mails from &quot; + sender.toString())
-     *         .setContentText(subject)
-     *         .setSmallIcon(R.drawable.new_mail)
-     *         .setLargeIcon(aBitmap))
-     *      .addLine(str1)
-     *      .addLine(str2)
-     *      .setContentTitle("")
-     *      .setSummaryText(&quot;+3 more&quot;)
-     *      .build();
+     * Notification notif = new Notification.Builder(mContext)
+     *     .setContentTitle(&quot;5 New mails from &quot; + sender.toString())
+     *     .setContentText(subject)
+     *     .setSmallIcon(R.drawable.new_mail)
+     *     .setLargeIcon(aBitmap)
+     *     .setStyle(new Notification.InboxStyle()
+     *         .addLine(str1)
+     *         .addLine(str2)
+     *         .setContentTitle(&quot;&quot;)
+     *         .setSummaryText(&quot;+3 more&quot;))
+     *     .build();
      * </pre>
      *
      * @see Notification#bigContentView
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index 1e40d94..d07b154 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -936,32 +936,62 @@
         return paint->getLooper() && paint->getLooper()->asABlurShadow(NULL);
     }
 
-    static int breakText(JNIEnv* env, SkPaint& paint, const jchar text[],
+    static int breakText(JNIEnv* env, const SkPaint& paint, TypefaceImpl* typeface, const jchar text[],
                          int count, float maxWidth, jint bidiFlags, jfloatArray jmeasured,
-                         SkPaint::TextBufferDirection tbd) {
+                         SkPaint::TextBufferDirection textBufferDirection) {
+        size_t measuredCount = 0;
+        float measured = 0;
+
+#ifdef USE_MINIKIN
+        Layout layout;
+        std::string css = MinikinUtils::setLayoutProperties(&layout, &paint, bidiFlags, typeface);
+        layout.doLayout(text, 0, count, count, css);
+        float* advances = new float[count];
+        layout.getAdvances(advances);
+        const bool forwardScan = (textBufferDirection == SkPaint::kForward_TextBufferDirection);
+        for (int i = 0; i < count; i++) {
+            // traverse in the given direction
+            int index = forwardScan ? i : (count - i - 1);
+            float width = advances[index];
+            if (measured + width > maxWidth) {
+                break;
+            }
+            // properly handle clusters when scanning backwards
+            if (forwardScan || width != 0.0f) {
+                measuredCount = i + 1;
+            }
+            measured += width;
+        }
+        delete[] advances;
+#else
         sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(&paint,
                 text, 0, count, count, bidiFlags);
         if (value == NULL) {
             return 0;
         }
-        SkScalar     measured;
-        size_t       bytes = paint.breakText(value->getGlyphs(), value->getGlyphsCount() << 1,
-                maxWidth, &measured, tbd);
+        SkScalar m;
+        size_t bytes = paint.breakText(value->getGlyphs(), value->getGlyphsCount() << 1,
+                maxWidth, &m, textBufferDirection);
         SkASSERT((bytes & 1) == 0);
+        measuredCount = bytes >> 1;
+        measured = SkScalarToFloat(m);
+#endif
 
         if (jmeasured && env->GetArrayLength(jmeasured) > 0) {
             AutoJavaFloatArray autoMeasured(env, jmeasured, 1);
             jfloat* array = autoMeasured.ptr();
-            array[0] = SkScalarToFloat(measured);
+            array[0] = measured;
         }
-        return bytes >> 1;
+        return measuredCount;
     }
 
-    static jint breakTextC(JNIEnv* env, jobject jpaint, jcharArray jtext,
+    static jint breakTextC(JNIEnv* env, jobject clazz, jlong paintHandle, jlong typefaceHandle, jcharArray jtext,
             jint index, jint count, jfloat maxWidth, jint bidiFlags, jfloatArray jmeasuredWidth) {
-        NPE_CHECK_RETURN_ZERO(env, jpaint);
         NPE_CHECK_RETURN_ZERO(env, jtext);
 
+        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
+        TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle);
+
         SkPaint::TextBufferDirection tbd;
         if (count < 0) {
             tbd = SkPaint::kBackward_TextBufferDirection;
@@ -976,28 +1006,28 @@
             return 0;
         }
 
-        SkPaint*     paint = GraphicsJNI::getNativePaint(env, jpaint);
         const jchar* text = env->GetCharArrayElements(jtext, NULL);
-        count = breakText(env, *paint, text + index, count, maxWidth,
+        count = breakText(env, *paint, typeface, text + index, count, maxWidth,
                           bidiFlags, jmeasuredWidth, tbd);
         env->ReleaseCharArrayElements(jtext, const_cast<jchar*>(text),
                                       JNI_ABORT);
         return count;
     }
 
-    static jint breakTextS(JNIEnv* env, jobject jpaint, jstring jtext,
+    static jint breakTextS(JNIEnv* env, jobject clazz, jlong paintHandle, jlong typefaceHandle, jstring jtext,
                 jboolean forwards, jfloat maxWidth, jint bidiFlags, jfloatArray jmeasuredWidth) {
-        NPE_CHECK_RETURN_ZERO(env, jpaint);
         NPE_CHECK_RETURN_ZERO(env, jtext);
 
+        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
+        TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle);
+
         SkPaint::TextBufferDirection tbd = forwards ?
                                         SkPaint::kForward_TextBufferDirection :
                                         SkPaint::kBackward_TextBufferDirection;
 
-        SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint);
         int count = env->GetStringLength(jtext);
         const jchar* text = env->GetStringChars(jtext, NULL);
-        count = breakText(env, *paint, text, count, maxWidth, bidiFlags, jmeasuredWidth, tbd);
+        count = breakText(env, *paint, typeface, text, count, maxWidth, bidiFlags, jmeasuredWidth, tbd);
         env->ReleaseStringChars(jtext, text);
         return count;
     }
@@ -1108,8 +1138,8 @@
     {"native_measureText","([CIII)F", (void*) SkPaintGlue::measureText_CIII},
     {"native_measureText","(Ljava/lang/String;I)F", (void*) SkPaintGlue::measureText_StringI},
     {"native_measureText","(Ljava/lang/String;III)F", (void*) SkPaintGlue::measureText_StringIII},
-    {"native_breakText","([CIIFI[F)I", (void*) SkPaintGlue::breakTextC},
-    {"native_breakText","(Ljava/lang/String;ZFI[F)I", (void*) SkPaintGlue::breakTextS},
+    {"native_breakText","(JJ[CIIFI[F)I", (void*) SkPaintGlue::breakTextC},
+    {"native_breakText","(JJLjava/lang/String;ZFI[F)I", (void*) SkPaintGlue::breakTextS},
     {"native_getTextWidths","(JJ[CIII[F)I", (void*) SkPaintGlue::getTextWidths___CIII_F},
     {"native_getTextWidths","(JJLjava/lang/String;III[F)I", (void*) SkPaintGlue::getTextWidths__StringIII_F},
     {"native_getTextRunAdvances","(JJ[CIIIIZ[FI)F",
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 8837955..17ce026 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -1532,20 +1532,22 @@
             return 0;
         }
         if (!mHasCompatScaling) {
-            return native_breakText(text, index, count, maxWidth, mBidiFlags, measuredWidth);
+            return native_breakText(mNativePaint, mNativeTypeface, text, index, count, maxWidth,
+                    mBidiFlags, measuredWidth);
         }
 
         final float oldSize = getTextSize();
-        setTextSize(oldSize*mCompatScaling);
-        int res = native_breakText(text, index, count, maxWidth*mCompatScaling, mBidiFlags,
-                measuredWidth);
+        setTextSize(oldSize * mCompatScaling);
+        int res = native_breakText(mNativePaint, mNativeTypeface, text, index, count,
+                maxWidth * mCompatScaling, mBidiFlags, measuredWidth);
         setTextSize(oldSize);
         if (measuredWidth != null) measuredWidth[0] *= mInvCompatScaling;
         return res;
     }
 
-    private native int native_breakText(char[] text, int index, int count,
-                                        float maxWidth, int bidiFlags, float[] measuredWidth);
+    private static native int native_breakText(long native_object, long native_typeface,
+                                               char[] text, int index, int count,
+                                               float maxWidth, int bidiFlags, float[] measuredWidth);
 
     /**
      * Measure the text, stopping early if the measured width exceeds maxWidth.
@@ -1622,19 +1624,21 @@
             return 0;
         }
         if (!mHasCompatScaling) {
-            return native_breakText(text, measureForwards, maxWidth, mBidiFlags, measuredWidth);
+            return native_breakText(mNativePaint, mNativeTypeface, text, measureForwards,
+                    maxWidth, mBidiFlags, measuredWidth);
         }
 
         final float oldSize = getTextSize();
         setTextSize(oldSize*mCompatScaling);
-        int res = native_breakText(text, measureForwards, maxWidth*mCompatScaling, mBidiFlags,
-                measuredWidth);
+        int res = native_breakText(mNativePaint, mNativeTypeface, text, measureForwards,
+                maxWidth*mCompatScaling, mBidiFlags, measuredWidth);
         setTextSize(oldSize);
         if (measuredWidth != null) measuredWidth[0] *= mInvCompatScaling;
         return res;
     }
 
-    private native int native_breakText(String text, boolean measureForwards,
+    private static native int native_breakText(long native_object, long native_typeface,
+                                        String text, boolean measureForwards,
                                         float maxWidth, int bidiFlags, float[] measuredWidth);
 
     /**
diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp
index 91dda75..1b3f1fd 100644
--- a/libs/androidfw/AssetManager.cpp
+++ b/libs/androidfw/AssetManager.cpp
@@ -1768,6 +1768,7 @@
     }
 
     mergeInfoLocked(pMergedInfo, pContents);
+    delete pContents;
     return true;
 }
 
diff --git a/wifi/java/android/net/wifi/passpoint/WifiPasspointInfo.java b/wifi/java/android/net/wifi/passpoint/WifiPasspointInfo.java
index aec8797..33db3f5 100644
--- a/wifi/java/android/net/wifi/passpoint/WifiPasspointInfo.java
+++ b/wifi/java/android/net/wifi/passpoint/WifiPasspointInfo.java
@@ -213,22 +213,22 @@
     public String venueName;
 
     /** list of network authentication types */
-    public List<NetworkAuthType> networkAuthType;
+    public List<NetworkAuthType> networkAuthTypeList;
 
     /** list of roaming consortium OIs */
-    public List<String> roamingConsortium;
+    public List<String> roamingConsortiumList;
 
     /** IP address availability */
     public IpAddressType ipAddrTypeAvailability;
 
-    /** NAI realm */
-    public List<NaiRealm> naiRealm;
+    /** list of NAI realm */
+    public List<NaiRealm> naiRealmList;
 
-    /** 3GPP cellular network */
-    public List<CellularNetwork> cellularNetwork;
+    /** list of 3GPP cellular network */
+    public List<CellularNetwork> cellularNetworkList;
 
-    /** fully qualified domain name (FQDN) */
-    public List<String> domainName;
+    /** list of fully qualified domain name (FQDN) */
+    public List<String> domainNameList;
 
     /** HS 2.0 operator friendly name */
     public String operatorFriendlyName;
@@ -236,10 +236,10 @@
     /** HS 2.0 wan metrics */
     public WanMetrics wanMetrics;
 
-    /** HS 2.0 list of IP proto port */
-    public List<IpProtoPort> connectionCapability;
+    /** list of HS 2.0 IP proto port */
+    public List<IpProtoPort> connectionCapabilityList;
 
-    /** HS 2.0 list of OSU providers */
+    /** list of HS 2.0 OSU providers */
     public List<WifiPasspointOsuProvider> osuProviderList;
 
     /**
@@ -292,15 +292,15 @@
             sb.append(" venueName: ").append("(")
               .append(venueName.replace("\n", "\\n")).append(")");
 
-        if (networkAuthType != null) {
+        if (networkAuthTypeList != null) {
             sb.append(" networkAuthType: ");
-            for (NetworkAuthType auth : networkAuthType)
+            for (NetworkAuthType auth : networkAuthTypeList)
                 sb.append("(").append(auth.toString()).append(")");
         }
 
-        if (roamingConsortium != null) {
+        if (roamingConsortiumList != null) {
             sb.append(" roamingConsortium: ");
-            for (String oi : roamingConsortium)
+            for (String oi : roamingConsortiumList)
                 sb.append("(").append(oi).append(")");
         }
 
@@ -309,21 +309,21 @@
               .append(ipAddrTypeAvailability.toString()).append(")");
         }
 
-        if (naiRealm != null) {
+        if (naiRealmList != null) {
             sb.append(" naiRealm: ");
-            for (NaiRealm realm : naiRealm)
+            for (NaiRealm realm : naiRealmList)
                 sb.append("(").append(realm.toString()).append(")");
         }
 
-        if (cellularNetwork != null) {
+        if (cellularNetworkList != null) {
             sb.append(" cellularNetwork: ");
-            for (CellularNetwork plmn : cellularNetwork)
+            for (CellularNetwork plmn : cellularNetworkList)
                 sb.append("(").append(plmn.toString()).append(")");
         }
 
-        if (domainName != null) {
+        if (domainNameList != null) {
             sb.append(" domainName: ");
-            for (String fqdn : domainName)
+            for (String fqdn : domainNameList)
                 sb.append("(").append(fqdn).append(")");
         }
 
@@ -335,9 +335,9 @@
             sb.append(" wanMetrics: ").append("(")
               .append(wanMetrics.toString()).append(")");
 
-        if (connectionCapability != null) {
+        if (connectionCapabilityList != null) {
             sb.append(" connectionCapability: ");
-            for (IpProtoPort ip : connectionCapability)
+            for (IpProtoPort ip : connectionCapabilityList)
                 sb.append("(").append(ip.toString()).append(")");
         }
 
@@ -356,21 +356,21 @@
         out.writeString(bssid);
         out.writeString(venueName);
 
-        if (networkAuthType == null) {
+        if (networkAuthTypeList == null) {
             out.writeInt(0);
         } else {
-            out.writeInt(networkAuthType.size());
-            for (NetworkAuthType auth : networkAuthType) {
+            out.writeInt(networkAuthTypeList.size());
+            for (NetworkAuthType auth : networkAuthTypeList) {
                 out.writeInt(auth.type);
                 out.writeString(auth.redirectUrl);
             }
         }
 
-        if (roamingConsortium == null) {
+        if (roamingConsortiumList == null) {
             out.writeInt(0);
         } else {
-            out.writeInt(roamingConsortium.size());
-            for (String oi : roamingConsortium)
+            out.writeInt(roamingConsortiumList.size());
+            for (String oi : roamingConsortiumList)
                 out.writeString(oi);
         }
 
@@ -380,32 +380,32 @@
             out.writeInt(ipAddrTypeAvailability.availability);
         }
 
-        if (naiRealm == null) {
+        if (naiRealmList == null) {
             out.writeInt(0);
         } else {
-            out.writeInt(naiRealm.size());
-            for (NaiRealm realm : naiRealm) {
+            out.writeInt(naiRealmList.size());
+            for (NaiRealm realm : naiRealmList) {
                 out.writeInt(realm.encoding);
                 out.writeString(realm.realm);
             }
         }
 
-        if (cellularNetwork == null) {
+        if (cellularNetworkList == null) {
             out.writeInt(0);
         } else {
-            out.writeInt(cellularNetwork.size());
-            for (CellularNetwork plmn : cellularNetwork) {
+            out.writeInt(cellularNetworkList.size());
+            for (CellularNetwork plmn : cellularNetworkList) {
                 out.writeString(plmn.mcc);
                 out.writeString(plmn.mnc);
             }
         }
 
 
-        if (domainName == null) {
+        if (domainNameList == null) {
             out.writeInt(0);
         } else {
-            out.writeInt(domainName.size());
-            for (String fqdn : domainName)
+            out.writeInt(domainNameList.size());
+            for (String fqdn : domainNameList)
                 out.writeString(fqdn);
         }
 
@@ -423,11 +423,11 @@
             out.writeInt(wanMetrics.lmd);
         }
 
-        if (connectionCapability == null) {
+        if (connectionCapabilityList == null) {
             out.writeInt(0);
         } else {
-            out.writeInt(connectionCapability.size());
-            for (IpProtoPort ip : connectionCapability) {
+            out.writeInt(connectionCapabilityList.size());
+            for (IpProtoPort ip : connectionCapabilityList) {
                 out.writeInt(ip.proto);
                 out.writeInt(ip.port);
                 out.writeInt(ip.status);
@@ -462,20 +462,20 @@
 
                     n = in.readInt();
                     if (n > 0) {
-                        p.networkAuthType = new ArrayList<NetworkAuthType>();
+                        p.networkAuthTypeList = new ArrayList<NetworkAuthType>();
                         for (int i = 0; i < n; i++) {
                             NetworkAuthType auth = new NetworkAuthType();
                             auth.type = in.readInt();
                             auth.redirectUrl = in.readString();
-                            p.networkAuthType.add(auth);
+                            p.networkAuthTypeList.add(auth);
                         }
                     }
 
                     n = in.readInt();
                     if (n > 0) {
-                        p.roamingConsortium = new ArrayList<String>();
+                        p.roamingConsortiumList = new ArrayList<String>();
                         for (int i = 0; i < n; i++)
-                            p.roamingConsortium.add(in.readString());
+                            p.roamingConsortiumList.add(in.readString());
                     }
 
                     n = in.readInt();
@@ -486,31 +486,31 @@
 
                     n = in.readInt();
                     if (n > 0) {
-                        p.naiRealm = new ArrayList<NaiRealm>();
+                        p.naiRealmList = new ArrayList<NaiRealm>();
                         for (int i = 0; i < n; i++) {
                             NaiRealm realm = new NaiRealm();
                             realm.encoding = in.readInt();
                             realm.realm = in.readString();
-                            p.naiRealm.add(realm);
+                            p.naiRealmList.add(realm);
                         }
                     }
 
                     n = in.readInt();
                     if (n > 0) {
-                        p.cellularNetwork = new ArrayList<CellularNetwork>();
+                        p.cellularNetworkList = new ArrayList<CellularNetwork>();
                         for (int i = 0; i < n; i++) {
                             CellularNetwork plmn = new CellularNetwork();
                             plmn.mcc = in.readString();
                             plmn.mnc = in.readString();
-                            p.cellularNetwork.add(plmn);
+                            p.cellularNetworkList.add(plmn);
                         }
                     }
 
                     n = in.readInt();
                     if (n > 0) {
-                        p.domainName = new ArrayList<String>();
+                        p.domainNameList = new ArrayList<String>();
                         for (int i = 0; i < n; i++)
-                            p.domainName.add(in.readString());
+                            p.domainNameList.add(in.readString());
                     }
 
                     p.operatorFriendlyName = in.readString();
@@ -528,13 +528,13 @@
 
                     n = in.readInt();
                     if (n > 0) {
-                        p.connectionCapability = new ArrayList<IpProtoPort>();
+                        p.connectionCapabilityList = new ArrayList<IpProtoPort>();
                         for (int i = 0; i < n; i++) {
                             IpProtoPort ip = new IpProtoPort();
                             ip.proto = in.readInt();
                             ip.port = in.readInt();
                             ip.status = in.readInt();
-                            p.connectionCapability.add(ip);
+                            p.connectionCapabilityList.add(ip);
                         }
                     }
 
diff --git a/wifi/java/android/net/wifi/passpoint/WifiPasspointManager.java b/wifi/java/android/net/wifi/passpoint/WifiPasspointManager.java
index 2f158c2..e7e6767 100644
--- a/wifi/java/android/net/wifi/passpoint/WifiPasspointManager.java
+++ b/wifi/java/android/net/wifi/passpoint/WifiPasspointManager.java
@@ -325,7 +325,7 @@
                         listener = getListener(message.arg2, true);
                         if (listener != null) {
                             ParcelableString str = (ParcelableString) message.obj;
-                            if (str.string == null)
+                            if (str == null || str.string == null)
                                 ((OsuRemListener) listener).onBrowserDismiss();
                             else
                                 ((OsuRemListener) listener).onBrowserLaunch(str.string);
@@ -485,7 +485,7 @@
      *
      * @return The list of credentials
      */
-    public List<WifiPasspointCredential> getSavedCredentials() {
+    public List<WifiPasspointCredential> getCredentials() {
         return null;
     }
 
@@ -529,7 +529,7 @@
         Log.d(TAG, "startOsu end");
     }
 
-    public void startUserRemediation(Channel c, OsuRemListener listener) {
+    public void startRemediation(Channel c, OsuRemListener listener) {
     }
 
     public void connect(WifiPasspointPolicy policy) {