Merge "Apps on SD card. Added support for retrieving and generating keys as Hex Strings."
diff --git a/api/current.xml b/api/current.xml
index 43f86bb..b690e42 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -14581,6 +14581,25 @@
 <parameter name="key" type="java.lang.String">
 </parameter>
 </method>
+<method name="hasFeatures"
+ return="android.accounts.AccountManagerFuture&lt;java.lang.Boolean&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="account" type="android.accounts.Account">
+</parameter>
+<parameter name="features" type="java.lang.String[]">
+</parameter>
+<parameter name="callback" type="android.accounts.AccountManagerCallback&lt;java.lang.Boolean&gt;">
+</parameter>
+<parameter name="handler" type="android.os.Handler">
+</parameter>
+</method>
 <method name="invalidateAuthToken"
  return="void"
  abstract="false"
@@ -14690,25 +14709,6 @@
 <parameter name="value" type="java.lang.String">
 </parameter>
 </method>
-<method name="testHasFeatures"
- return="android.accounts.AccountManagerFuture&lt;java.lang.Boolean&gt;"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="account" type="android.accounts.Account">
-</parameter>
-<parameter name="features" type="java.lang.String[]">
-</parameter>
-<parameter name="callback" type="android.accounts.AccountManagerCallback&lt;java.lang.Boolean&gt;">
-</parameter>
-<parameter name="handler" type="android.os.Handler">
-</parameter>
-</method>
 <method name="updateCredentials"
  return="android.accounts.AccountManagerFuture&lt;android.os.Bundle&gt;"
  abstract="false"
@@ -20739,6 +20739,19 @@
 <parameter name="onKeyListener" type="android.content.DialogInterface.OnKeyListener">
 </parameter>
 </method>
+<method name="setOnShowListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.content.DialogInterface.OnShowListener">
+</parameter>
+</method>
 <method name="setOwnerActivity"
  return="void"
  abstract="false"
@@ -34002,6 +34015,27 @@
 </parameter>
 </method>
 </interface>
+<interface name="DialogInterface.OnShowListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onShow"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="dialog" type="android.content.DialogInterface">
+</parameter>
+</method>
+</interface>
 <class name="Entity"
  extends="java.lang.Object"
  abstract="false"
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index 3bbfce8..414d963 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -254,12 +254,12 @@
      * The future result is a {@link Boolean} that is true if the account exists and has the
      * specified features.
      */
-    public AccountManagerFuture<Boolean> testHasFeatures(final Account account,
+    public AccountManagerFuture<Boolean> hasFeatures(final Account account,
             final String[] features,
             AccountManagerCallback<Boolean> callback, Handler handler) {
         return new Future2Task<Boolean>(handler, callback) {
             public void doWork() throws RemoteException {
-                mService.testHasFeatures(mResponse, account, features);
+                mService.hasFeatures(mResponse, account, features);
             }
             public Boolean bundleToResult(Bundle bundle) throws AuthenticatorException {
                 if (!bundle.containsKey(KEY_BOOLEAN_RESULT)) {
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index f5166c2..ee26d3c 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -449,7 +449,7 @@
         return db.insert(TABLE_EXTRAS, EXTRAS_KEY, values);
     }
 
-    public void testHasFeatures(IAccountManagerResponse response,
+    public void hasFeatures(IAccountManagerResponse response,
             Account account, String[] features) {
         checkReadAccountsPermission();
         long identityToken = clearCallingIdentity();
@@ -501,7 +501,7 @@
         }
 
         protected String toDebugString(long now) {
-            return super.toDebugString(now) + ", testHasFeatures"
+            return super.toDebugString(now) + ", hasFeatures"
                     + ", " + mAccount
                     + ", " + (mFeatures != null ? TextUtils.join(",", mFeatures) : null);
         }
diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl
index cbd26ee..36a5653 100644
--- a/core/java/android/accounts/IAccountManager.aidl
+++ b/core/java/android/accounts/IAccountManager.aidl
@@ -31,8 +31,7 @@
     String getUserData(in Account account, String key);
     AuthenticatorDescription[] getAuthenticatorTypes();
     Account[] getAccounts(String accountType);
-    void testHasFeatures(in IAccountManagerResponse response, in Account account,
-        in String[] features);
+    void hasFeatures(in IAccountManagerResponse response, in Account account, in String[] features);
     void getAccountsByFeatures(in IAccountManagerResponse response, String accountType, in String[] features);
     boolean addAccount(in Account account, String password, in Bundle extras);
     void removeAccount(in IAccountManagerResponse response, in Account account);
@@ -47,7 +46,7 @@
         String authTokenType, boolean notifyOnAuthFailure, boolean expectActivityLaunch,
         in Bundle options);
     void addAcount(in IAccountManagerResponse response, String accountType,
-        String authTokenType, in String[] requiredFeatures, boolean expectActivityLaunch, 
+        String authTokenType, in String[] requiredFeatures, boolean expectActivityLaunch,
         in Bundle options);
     void updateCredentials(in IAccountManagerResponse response, in Account account,
         String authTokenType, boolean expectActivityLaunch, in Bundle options);
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index fa5d4a88..ed38240 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -995,8 +995,7 @@
 
     /**
      * Sets a listener to be invoked when the dialog is shown.
-     *
-     * @hide Pending API council approval
+     * @param listener The {@link DialogInterface.OnShowListener} to use.
      */
     public void setOnShowListener(OnShowListener listener) {
         if (listener != null) {
diff --git a/core/java/android/content/DialogInterface.java b/core/java/android/content/DialogInterface.java
index 9f1036e..947eac6 100644
--- a/core/java/android/content/DialogInterface.java
+++ b/core/java/android/content/DialogInterface.java
@@ -94,7 +94,6 @@
     /**
      * Interface used to allow the creator of a dialog to run some code when the
      * dialog is shown.
-     * @hide Pending API council approval
      */
     interface OnShowListener {
         /**
diff --git a/core/java/android/provider/Downloads.java b/core/java/android/provider/Downloads.java
index a93cee7..3774156 100644
--- a/core/java/android/provider/Downloads.java
+++ b/core/java/android/provider/Downloads.java
@@ -27,7 +27,7 @@
  */
 // For 1.0 the download manager can't deal with abuse from untrusted apps, so
 // this API is hidden.
-public final class Downloads implements BaseColumns {
+public final class Downloads {
     private Downloads() {}
 
     /**
diff --git a/core/java/android/webkit/JWebCoreJavaBridge.java b/core/java/android/webkit/JWebCoreJavaBridge.java
index f350d13..e496d97 100644
--- a/core/java/android/webkit/JWebCoreJavaBridge.java
+++ b/core/java/android/webkit/JWebCoreJavaBridge.java
@@ -247,4 +247,5 @@
     private native void nativeUpdatePluginDirectories(String[] directories,
             boolean reload);
     public native void setNetworkOnLine(boolean online);
+    public native void setNetworkType(String type, String subtype);
 }
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 09ed931..db5641c 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -80,6 +80,7 @@
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.HashMap;
 import java.util.Map;
 
 import junit.framework.Assert;
@@ -1132,6 +1133,16 @@
     }
 
     /**
+     * Inform WebView about the current network type.
+     * {@hide}
+     */
+    public void setNetworkType(String type, String subtype) {
+        Map<String, String> map = new HashMap<String, String>();
+        map.put("type", type);
+        map.put("subtype", subtype);
+        mWebViewCore.sendMessage(EventHub.SET_NETWORK_TYPE, map);
+    }
+    /**
      * Save the state of this WebView used in
      * {@link android.app.Activity#onSaveInstanceState}. Please note that this
      * method no longer stores the display data for this WebView. The previous
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 949b318..d509bb4 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -878,6 +878,8 @@
 
         static final int HIDE_FULLSCREEN = 182;
 
+        static final int SET_NETWORK_TYPE = 183;
+
         // private message ids
         private static final int DESTROY =     200;
 
@@ -1110,6 +1112,16 @@
                                     .setNetworkOnLine(msg.arg1 == 1);
                             break;
 
+                        case SET_NETWORK_TYPE:
+                            if (BrowserFrame.sJavaBridge == null) {
+                                throw new IllegalStateException("No WebView " +
+                                        "has been created in this process!");
+                            }
+                            Map<String, String> map = (Map<String, String>) msg.obj;
+                            BrowserFrame.sJavaBridge
+                                    .setNetworkType(map.get("type"), map.get("subtype"));
+                            break;
+
                         case CLEAR_CACHE:
                             clearCache(msg.arg1 == 1);
                             break;
diff --git a/services/java/com/android/server/status/StatusBarPolicy.java b/services/java/com/android/server/status/StatusBarPolicy.java
index bee0930..42c0254 100644
--- a/services/java/com/android/server/status/StatusBarPolicy.java
+++ b/services/java/com/android/server/status/StatusBarPolicy.java
@@ -43,6 +43,9 @@
 import android.telephony.SignalStrength;
 import android.telephony.TelephonyManager;
 import android.text.format.DateFormat;
+import android.text.style.RelativeSizeSpan;
+import android.text.Spannable;
+import android.text.SpannableStringBuilder;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
@@ -61,6 +64,7 @@
 import com.android.internal.telephony.cdma.TtyIntent;
 import com.android.server.am.BatteryStatsService;
 
+import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.TimeZone;
 
@@ -532,10 +536,69 @@
         sInstance = new StatusBarPolicy(context, service);
     }
 
+    private final CharSequence getSmallTime() {
+        boolean b24 = DateFormat.is24HourFormat(mContext);
+        int res;
+
+        if (b24) {
+            res = R.string.twenty_four_hour_time_format;
+        } else {
+            res = R.string.twelve_hour_time_format;
+        }
+
+        String format = mContext.getString(res);
+
+        /*
+         * Search for an unquoted "a" in the format string, so we can
+         * add dummy characters around it to let us find it again after
+         * formatting and change its size.
+         */
+        int a = -1;
+        boolean quoted = false;
+        for (int i = 0; i < format.length(); i++) {
+            char c = format.charAt(i);
+
+            if (c == '\'') {
+                quoted = !quoted;
+            }
+
+            if (!quoted && c == 'a') {
+                a = i;
+                break;
+            }
+        }
+
+        final char MAGIC1 = '\uEF00';
+        final char MAGIC2 = '\uEF01';
+
+        if (a >= 0) {
+            format = format.substring(0, a) + MAGIC1 + "a" + MAGIC2 +
+                     format.substring(a + 1);
+        }
+
+        String result = new SimpleDateFormat(format).format(mCalendar.getTime());
+
+        int magic1 = result.indexOf(MAGIC1);
+        int magic2 = result.indexOf(MAGIC2);
+
+        if (magic1 >= 0 && magic2 > magic1) {
+            SpannableStringBuilder formatted = new SpannableStringBuilder(result);
+
+            formatted.setSpan(new RelativeSizeSpan(0.7f), magic1, magic2,
+                              Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
+
+            formatted.delete(magic2, magic2 + 1);
+            formatted.delete(magic1, magic1 + 1);
+
+            return formatted;
+        } else {
+            return result;
+        }
+    }
+
     private final void updateClock() {
         mCalendar.setTimeInMillis(System.currentTimeMillis());
-        mClockData.text = DateFormat.getTimeFormat(mContext)
-                .format(mCalendar.getTime());
+        mClockData.text = getSmallTime();
         mService.updateIcon(mClockIcon, mClockData, null);
     }