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<java.lang.Boolean>"
+ 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<java.lang.Boolean>">
+</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<java.lang.Boolean>"
- 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<java.lang.Boolean>">
-</parameter>
-<parameter name="handler" type="android.os.Handler">
-</parameter>
-</method>
<method name="updateCredentials"
return="android.accounts.AccountManagerFuture<android.os.Bundle>"
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);
}