Merge change 26517 into eclair

* changes:
  Add a new IResourceValue that knows about the density.
diff --git a/api/current.xml b/api/current.xml
index 68a1c76..581d2c4 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -8259,6 +8259,17 @@
  visibility="public"
 >
 </field>
+<field name="thumbnail"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843429"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="tileMode"
  type="int"
  transient="false"
diff --git a/core/java/android/app/WallpaperInfo.java b/core/java/android/app/WallpaperInfo.java
index 5e44bc7..587e8f9 100644
--- a/core/java/android/app/WallpaperInfo.java
+++ b/core/java/android/app/WallpaperInfo.java
@@ -40,6 +40,11 @@
     final String mSettingsActivityName;
 
     /**
+     * Resource identifier for this wallpaper's thumbnail image.
+     */
+    final int mThumbnailResource;
+
+    /**
      * Constructor.
      * 
      * @param context The Context in which we are parsing the wallpaper.
@@ -53,6 +58,7 @@
         
         PackageManager pm = context.getPackageManager();
         String settingsActivityComponent = null;
+        int thumbnailRes = -1;
         
         XmlResourceParser parser = null;
         try {
@@ -79,16 +85,23 @@
                     com.android.internal.R.styleable.Wallpaper);
             settingsActivityComponent = sa.getString(
                     com.android.internal.R.styleable.Wallpaper_settingsActivity);
+            
+            thumbnailRes = sa.getResourceId(
+                    com.android.internal.R.styleable.Wallpaper_thumbnail,
+                    -1);
+
             sa.recycle();
         } finally {
             if (parser != null) parser.close();
         }
         
         mSettingsActivityName = settingsActivityComponent;
+        mThumbnailResource = thumbnailRes;
     }
 
     WallpaperInfo(Parcel source) {
         mSettingsActivityName = source.readString();
+        mThumbnailResource = source.readInt();
         mService = ResolveInfo.CREATOR.createFromParcel(source);
     }
     
@@ -144,6 +157,20 @@
     }
     
     /**
+     * Load the thumbnail image for this wallpaper.
+     * 
+     * @param pm Supply a PackageManager used to load the wallpaper's
+     * resources.
+     */
+    public Drawable loadThumbnail(PackageManager pm) {
+        if (mThumbnailResource < 0) return null;
+
+        return pm.getDrawable(mService.serviceInfo.packageName,
+                              mThumbnailResource,
+                              null);
+    }
+    
+    /**
      * Return the class name of an activity that provides a settings UI for
      * the wallpaper.  You can launch this activity be starting it with
      * an {@link android.content.Intent} whose action is MAIN and with an
@@ -178,6 +205,7 @@
      */
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeString(mSettingsActivityName);
+        dest.writeInt(mThumbnailResource);
         mService.writeToParcel(dest, flags);
     }
 
diff --git a/core/java/android/content/SyncStatusInfo.java b/core/java/android/content/SyncStatusInfo.java
index 6687fcb..b8fda03 100644
--- a/core/java/android/content/SyncStatusInfo.java
+++ b/core/java/android/content/SyncStatusInfo.java
@@ -38,6 +38,7 @@
     public String lastFailureMesg;
     public long initialFailureTime;
     public boolean pending;
+    public boolean initialize;
     
     SyncStatusInfo(int authorityId) {
         this.authorityId = authorityId;
@@ -73,6 +74,7 @@
         parcel.writeString(lastFailureMesg);
         parcel.writeLong(initialFailureTime);
         parcel.writeInt(pending ? 1 : 0);
+        parcel.writeInt(initialize ? 1 : 0);
     }
 
     SyncStatusInfo(Parcel parcel) {
@@ -94,6 +96,7 @@
         lastFailureMesg = parcel.readString();
         initialFailureTime = parcel.readLong();
         pending = parcel.readInt() != 0;
+        initialize = parcel.readInt() != 0;
     }
     
     public static final Creator<SyncStatusInfo> CREATOR = new Creator<SyncStatusInfo>() {
diff --git a/core/java/android/content/SyncStorageEngine.java b/core/java/android/content/SyncStorageEngine.java
index 6e312d2..fbdd5ae 100644
--- a/core/java/android/content/SyncStorageEngine.java
+++ b/core/java/android/content/SyncStorageEngine.java
@@ -511,6 +511,9 @@
 
             SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident);
             status.pending = true;
+            status.initialize = op.extras != null && 
+                 op.extras.containsKey(ContentResolver.SYNC_EXTRAS_INITIALIZE) &&
+                 op.extras.getBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE);
         }
 
         reportChange(ContentResolver.SYNC_OBSERVER_TYPE_PENDING);
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index 4e6f9ca..c782c8c 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -25,6 +25,7 @@
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemProperties;
+import android.os.Build;
 import android.server.data.CrashData;
 import android.util.Config;
 import android.util.Log;
@@ -111,6 +112,12 @@
         new AndroidConfig();
 
         /*
+         * Sets the default HTTP User-Agent used by HttpURLConnection.
+         */
+        String userAgent = getDefaultUserAgent();
+        System.setProperty("http.agent", userAgent);
+
+        /*
          * If we're running in an emulator launched with "-trace", put the
          * VM into emulator trace profiling mode so that the user can hit
          * F9/F10 at any time to capture traces.  This has performance
@@ -126,6 +133,36 @@
     }
 
     /**
+     * Returns an HTTP user agent of the form
+     * "Dalvik/1.1.0 (Linux; U; Android Eclair Build/MASTER)".
+     */
+    private static String getDefaultUserAgent() {
+        StringBuilder result = new StringBuilder(64);
+        result.append("Dalvik/");
+        result.append(System.getProperty("java.vm.version")); // such as 1.1.0
+        result.append(" (Linux; U; Android ");
+
+        String version = Build.VERSION.RELEASE; // "1.0" or "3.4b5"
+        result.append(version.length() > 0 ? version : "1.0");
+
+        // add the model for the release build
+        if ("REL".equals(Build.VERSION.CODENAME)) {
+            String model = Build.MODEL;
+            if (model.length() > 0) {
+                result.append("; ");
+                result.append(model);
+            }
+        }
+        String id = Build.ID; // "MASTER" or "M4-rc20"
+        if (id.length() > 0) {
+            result.append(" Build/");
+            result.append(id);
+        }
+        result.append(")");
+        return result.toString();
+    }
+
+    /**
      * Invokes a static "main(argv[]) method on class "className".
      * Converts various failing exceptions into RuntimeExceptions, with
      * the assumption that they will then cause the VM instance to exit.
diff --git a/core/java/com/google/android/mms/pdu/GenericPdu.java b/core/java/com/google/android/mms/pdu/GenericPdu.java
index 46c6e00..705de6a 100644
--- a/core/java/com/google/android/mms/pdu/GenericPdu.java
+++ b/core/java/com/google/android/mms/pdu/GenericPdu.java
@@ -89,4 +89,25 @@
     public void setMmsVersion(int value) throws InvalidHeaderValueException {
         mPduHeaders.setOctet(value, PduHeaders.MMS_VERSION);
     }
+
+    /**
+     * Get From value.
+     * From-value = Value-length
+     *      (Address-present-token Encoded-string-value | Insert-address-token)
+     *
+     * @return the value
+     */
+    public EncodedStringValue getFrom() {
+       return mPduHeaders.getEncodedStringValue(PduHeaders.FROM);
+    }
+
+    /**
+     * Set From value.
+     *
+     * @param value the value
+     * @throws NullPointerException if the value is null.
+     */
+    public void setFrom(EncodedStringValue value) {
+        mPduHeaders.setEncodedStringValue(value, PduHeaders.FROM);
+    }
 }
diff --git a/core/java/com/google/android/mms/pdu/PduComposer.java b/core/java/com/google/android/mms/pdu/PduComposer.java
index 094e992..8b31936 100644
--- a/core/java/com/google/android/mms/pdu/PduComposer.java
+++ b/core/java/com/google/android/mms/pdu/PduComposer.java
@@ -450,6 +450,29 @@
         appendQuotedString(str.getBytes());
     }
 
+    private EncodedStringValue appendAddressType(EncodedStringValue address) {
+        EncodedStringValue temp = null;
+
+        try {
+            int addressType = checkAddressType(address.getString());
+            temp = EncodedStringValue.copy(address);
+            if (PDU_PHONE_NUMBER_ADDRESS_TYPE == addressType) {
+                // Phone number.
+                temp.appendTextString(STRING_PHONE_NUMBER_ADDRESS_TYPE.getBytes());
+            } else if (PDU_IPV4_ADDRESS_TYPE == addressType) {
+                // Ipv4 address.
+                temp.appendTextString(STRING_IPV4_ADDRESS_TYPE.getBytes());
+            } else if (PDU_IPV6_ADDRESS_TYPE == addressType) {
+                // Ipv6 address.
+                temp.appendTextString(STRING_IPV6_ADDRESS_TYPE.getBytes());
+            }
+        } catch (NullPointerException e) {
+            return null;
+        }
+
+        return temp;
+    }
+
     /**
      * Append header to mMessage.
      */
@@ -489,21 +512,8 @@
 
                 EncodedStringValue temp;
                 for (int i = 0; i < addr.length; i++) {
-                    try {
-                        int addressType = checkAddressType(addr[i].getString());
-                        temp = EncodedStringValue.copy(addr[i]);
-                        if (PDU_PHONE_NUMBER_ADDRESS_TYPE == addressType) {
-                            // Phone number.
-                            temp.appendTextString(
-                                    STRING_PHONE_NUMBER_ADDRESS_TYPE.getBytes());
-                        } else if (PDU_IPV4_ADDRESS_TYPE == addressType) {
-                            // Ipv4 address.
-                            temp.appendTextString(STRING_IPV4_ADDRESS_TYPE.getBytes());
-                        } else if (PDU_IPV6_ADDRESS_TYPE == addressType) {
-                            // Ipv6 address.
-                            temp.appendTextString(STRING_IPV6_ADDRESS_TYPE.getBytes());
-                        }
-                    } catch (NullPointerException e) {
+                    temp = appendAddressType(addr[i]);
+                    if (temp == null) {
                         return PDU_COMPOSE_CONTENT_ERROR;
                     }
 
@@ -530,7 +540,13 @@
 
                     // Address-present-token = <Octet 128>
                     append(PduHeaders.FROM_ADDRESS_PRESENT_TOKEN);
-                    appendEncodedString(from);
+
+                    temp = appendAddressType(from);
+                    if (temp == null) {
+                        return PDU_COMPOSE_CONTENT_ERROR;
+                    }
+
+                    appendEncodedString(temp);
 
                     int flen = fstart.getLength();
                     mStack.pop();
diff --git a/core/java/com/google/android/mms/pdu/ReadRecInd.java b/core/java/com/google/android/mms/pdu/ReadRecInd.java
index 0a4dbf0..880e3ac 100644
--- a/core/java/com/google/android/mms/pdu/ReadRecInd.java
+++ b/core/java/com/google/android/mms/pdu/ReadRecInd.java
@@ -73,27 +73,6 @@
     }
 
     /**
-     * Get From value.
-     * From-value = Value-length
-     *      (Address-present-token Encoded-string-value | Insert-address-token)
-     *
-     * @return the value
-     */
-    public EncodedStringValue getFrom() {
-       return mPduHeaders.getEncodedStringValue(PduHeaders.FROM);
-    }
-
-    /**
-     * Set From value.
-     *
-     * @param value the value
-     * @throws NullPointerException if the value is null.
-     */
-    public void setFrom(EncodedStringValue value) {
-        mPduHeaders.setEncodedStringValue(value, PduHeaders.FROM);
-    }
-
-    /**
      * Get Message-ID value.
      *
      * @return the value
diff --git a/core/java/com/google/android/mms/pdu/SendReq.java b/core/java/com/google/android/mms/pdu/SendReq.java
index 9ea6e47..597cd00 100644
--- a/core/java/com/google/android/mms/pdu/SendReq.java
+++ b/core/java/com/google/android/mms/pdu/SendReq.java
@@ -226,27 +226,6 @@
     }
 
     /**
-     * Get From value.
-     * From-value = Value-length
-     *      (Address-present-token Encoded-string-value | Insert-address-token)
-     *
-     * @return the value
-     */
-    public EncodedStringValue getFrom() {
-       return mPduHeaders.getEncodedStringValue(PduHeaders.FROM);
-    }
-
-    /**
-     * Set From value.
-     *
-     * @param value the value
-     * @throws NullPointerException if the value is null.
-     */
-    public void setFrom(EncodedStringValue value) {
-        mPduHeaders.setEncodedStringValue(value, PduHeaders.FROM);
-    }
-
-    /**
      * Get X-Mms-Message-Class value.
      * Message-class-value = Class-identifier | Token-text
      * Class-identifier = Personal | Advertisement | Informational | Auto
diff --git a/core/res/res/drawable-hdpi/fasttrack_badge.9.png b/core/res/res/drawable-hdpi/fasttrack_badge.9.png
new file mode 100644
index 0000000..1eeabf4
--- /dev/null
+++ b/core/res/res/drawable-hdpi/fasttrack_badge.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fasttrack_badge_pressed.9.png b/core/res/res/drawable-hdpi/fasttrack_badge_pressed.9.png
new file mode 100644
index 0000000..0cfd09d
--- /dev/null
+++ b/core/res/res/drawable-hdpi/fasttrack_badge_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fasttrack_badge_small.9.png b/core/res/res/drawable-hdpi/fasttrack_badge_small.9.png
new file mode 100644
index 0000000..7140957
--- /dev/null
+++ b/core/res/res/drawable-hdpi/fasttrack_badge_small.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fasttrack_badge_small_pressed.9.png b/core/res/res/drawable-hdpi/fasttrack_badge_small_pressed.9.png
new file mode 100644
index 0000000..ee030fbe
--- /dev/null
+++ b/core/res/res/drawable-hdpi/fasttrack_badge_small_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fasttrack_badge.9.png b/core/res/res/drawable-mdpi/fasttrack_badge.9.png
new file mode 100644
index 0000000..d8dff34
--- /dev/null
+++ b/core/res/res/drawable-mdpi/fasttrack_badge.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fasttrack_badge_pressed.9.png b/core/res/res/drawable-mdpi/fasttrack_badge_pressed.9.png
new file mode 100644
index 0000000..c8ca33a
--- /dev/null
+++ b/core/res/res/drawable-mdpi/fasttrack_badge_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fasttrack_badge_small.9.png b/core/res/res/drawable-mdpi/fasttrack_badge_small.9.png
new file mode 100644
index 0000000..38f14f7
--- /dev/null
+++ b/core/res/res/drawable-mdpi/fasttrack_badge_small.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fasttrack_badge_small_pressed.9.png b/core/res/res/drawable-mdpi/fasttrack_badge_small_pressed.9.png
new file mode 100644
index 0000000..b23e921
--- /dev/null
+++ b/core/res/res/drawable-mdpi/fasttrack_badge_small_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable/fasttrack_badge_dark.xml b/core/res/res/drawable/fasttrack_badge.xml
similarity index 86%
rename from core/res/res/drawable/fasttrack_badge_dark.xml
rename to core/res/res/drawable/fasttrack_badge.xml
index c60d403..89c63a1 100644
--- a/core/res/res/drawable/fasttrack_badge_dark.xml
+++ b/core/res/res/drawable/fasttrack_badge.xml
@@ -19,10 +19,10 @@
         android:state_focused="false"
         android:state_selected="false"
         android:state_pressed="false"
-        android:drawable="@drawable/fasttrack_badge_dark_normal" />
+        android:drawable="@drawable/fasttrack_badge" />
 
     <item
         android:state_pressed="true"
-        android:drawable="@drawable/fasttrack_badge_dark_pressed" />
+        android:drawable="@drawable/fasttrack_badge_pressed" />
 
 </selector>
diff --git a/core/res/res/drawable/fasttrack_badge_dark_normal.9.png b/core/res/res/drawable/fasttrack_badge_dark_normal.9.png
deleted file mode 100644
index 52bb08c..0000000
--- a/core/res/res/drawable/fasttrack_badge_dark_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/fasttrack_badge_dark_pressed.9.png b/core/res/res/drawable/fasttrack_badge_dark_pressed.9.png
deleted file mode 100644
index 84a6783..0000000
--- a/core/res/res/drawable/fasttrack_badge_dark_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/fasttrack_badge_light_normal.9.png b/core/res/res/drawable/fasttrack_badge_light_normal.9.png
deleted file mode 100644
index 595b179..0000000
--- a/core/res/res/drawable/fasttrack_badge_light_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/fasttrack_badge_light_pressed.9.png b/core/res/res/drawable/fasttrack_badge_light_pressed.9.png
deleted file mode 100644
index 8e3f557..0000000
--- a/core/res/res/drawable/fasttrack_badge_light_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/fasttrack_badge_middle_large.xml b/core/res/res/drawable/fasttrack_badge_middle_large.xml
deleted file mode 100644
index dd591bd..0000000
--- a/core/res/res/drawable/fasttrack_badge_middle_large.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_focused="false"
-        android:state_selected="false"
-        android:state_pressed="false"
-        android:drawable="@drawable/fasttrack_badge_middle_large_normal" />
-
-    <item
-        android:state_pressed="true"
-        android:drawable="@drawable/fasttrack_badge_middle_large_pressed" />
-
-</selector>
\ No newline at end of file
diff --git a/core/res/res/drawable/fasttrack_badge_middle_large_normal.9.png b/core/res/res/drawable/fasttrack_badge_middle_large_normal.9.png
deleted file mode 100644
index ca275cd..0000000
--- a/core/res/res/drawable/fasttrack_badge_middle_large_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/fasttrack_badge_middle_large_pressed.9.png b/core/res/res/drawable/fasttrack_badge_middle_large_pressed.9.png
deleted file mode 100644
index b69ccbd..0000000
--- a/core/res/res/drawable/fasttrack_badge_middle_large_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/fasttrack_badge_light.xml b/core/res/res/drawable/fasttrack_badge_small.xml
similarity index 87%
rename from core/res/res/drawable/fasttrack_badge_light.xml
rename to core/res/res/drawable/fasttrack_badge_small.xml
index fd81258..269e936 100644
--- a/core/res/res/drawable/fasttrack_badge_light.xml
+++ b/core/res/res/drawable/fasttrack_badge_small.xml
@@ -19,10 +19,10 @@
         android:state_focused="false"
         android:state_selected="false"
         android:state_pressed="false"
-        android:drawable="@drawable/fasttrack_badge_light_normal" />
+        android:drawable="@drawable/fasttrack_badge_small" />
 
     <item
         android:state_pressed="true"
-        android:drawable="@drawable/fasttrack_badge_light_pressed" />
+        android:drawable="@drawable/fasttrack_badge_small_pressed" />
 
 </selector>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index c3b7a2c9..193fdb2 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -396,14 +396,20 @@
         <attr name="spinnerItemStyle" format="reference" />
         <!-- Default MapView style. -->
         <attr name="mapViewStyle" format="reference" />
-        <!-- Dark Fasttrack badge style. -->
+        <!-- Default Fasttrack badge style. -->
         <attr name="fasttrackBadgeWidgetStyle" format="reference" />
-        <!-- Dark Fasttrack badge style with small fasttrack window. -->
+        <!-- Default Fasttrack badge style with small fasttrack window. -->
         <attr name="fasttrackBadgeWidgetStyleWindowSmall" format="reference" />
-        <!-- Dark Fasttrack badge style with medium fasttrack window. -->
+        <!-- Default Fasttrack badge style with medium fasttrack window. -->
         <attr name="fasttrackBadgeWidgetStyleWindowMedium" format="reference" />
-        <!-- Dark Fasttrack badge style with large fasttrack window. -->
+        <!-- Default Fasttrack badge style with large fasttrack window. -->
         <attr name="fasttrackBadgeWidgetStyleWindowLarge" format="reference" />
+        <!-- Default Fasttrack badge style with small fasttrack window. -->
+        <attr name="fasttrackBadgeWidgetStyleSmallWindowSmall" format="reference" />
+        <!-- Default Fasttrack badge style with medium fasttrack window. -->
+        <attr name="fasttrackBadgeWidgetStyleSmallWindowMedium" format="reference" />
+        <!-- Default Fasttrack badge style with large fasttrack window. -->
+        <attr name="fasttrackBadgeWidgetStyleSmallWindowLarge" format="reference" />
 
         <!-- =================== -->
         <!-- Preference styles   -->
@@ -3445,6 +3451,9 @@
         <!-- Component name of an activity that allows the user to modify
              the current settings for this wallpaper. -->
         <attr name="settingsActivity" />
+
+        <!-- Reference to a the wallpaper's thumbnail bitmap. -->
+        <attr name="thumbnail" format="reference" />
     </declare-styleable>
 
     <!-- =============================== -->
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 7aeaec4..a32f519 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -79,12 +79,16 @@
     <integer name="config_carDockRotation">-1</integer>
 
     <!-- Control whether being in the desk dock (and powered) always
-         keeps the screen on.  By default it doesn't.  Set to true to make it. -->
-    <bool name="config_deskDockKeepsScreenOn">false</bool>
+         keeps the screen on.  By default it stays on when plugged in to
+         AC.  0 will not keep it on; or together 1 to stay on when plugged
+         in to AC and 2 to stay on when plugged in to USB.  (So 3 for both.) -->
+    <integer name="config_deskDockKeepsScreenOn">1</integer>
 
     <!-- Control whether being in the car dock (and powered) always
-         keeps the screen on.  By default it does.  Set to false to not keep on. -->
-    <bool name="config_carDockKeepsScreenOn">true</bool>
+         keeps the screen on.  By default it stays on when plugged in to
+         AC.  0 will not keep it on; or together 1 to stay on when plugged
+         in to AC and 2 to stay on when plugged in to USB.  (So 3 for both.) -->
+    <integer name="config_carDockKeepsScreenOn">1</integer>
 
     <!-- Control whether being in the desk dock should enable accelerometer based screen orientation -->
     <bool name="config_deskDockEnablesAccelerometer">false</bool>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index b08a58a..4d23ef4 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1169,6 +1169,7 @@
   <public type="attr" name="summaryColumn" />
   <public type="attr" name="detailColumn" />
   <public type="attr" name="detailSocialSummary" />
+  <public type="attr" name="thumbnail" />
 
   <public type="style" name="Theme.Wallpaper" />
   <public type="style" name="Theme.Wallpaper.NoTitleBar" />
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index bc8ec45..e78c213 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -538,9 +538,17 @@
     </style>
 
     <style name="Widget.FasttrackBadgeWidget">
-        <item name="android:layout_width">48dip</item>
-        <item name="android:layout_height">52dip</item>
-        <item name="android:background">@android:drawable/fasttrack_badge_dark</item>
+        <item name="android:layout_width">50dip</item>
+        <item name="android:layout_height">56dip</item>
+        <item name="android:background">@android:drawable/fasttrack_badge</item>
+        <item name="android:clickable">true</item>
+        <item name="android:scaleType">fitCenter</item>
+    </style>
+    
+    <style name="Widget.FasttrackBadgeWidgetSmall">
+        <item name="android:layout_width">39dip</item>
+        <item name="android:layout_height">42dip</item>
+        <item name="android:background">@android:drawable/fasttrack_badge_small</item>
         <item name="android:clickable">true</item>
         <item name="android:scaleType">fitCenter</item>
     </style>
@@ -556,6 +564,18 @@
     <style name="Widget.FasttrackBadgeWidget.WindowLarge">
         <item name="android:fasttrackWindowSize">modeLarge</item>
     </style>
+    
+    <style name="Widget.FasttrackBadgeWidgetSmall.WindowSmall">
+        <item name="android:fasttrackWindowSize">modeSmall</item>
+    </style>
+
+    <style name="Widget.FasttrackBadgeWidgetSmall.WindowMedium">
+        <item name="android:fasttrackWindowSize">modeMedium</item>
+    </style>
+
+    <style name="Widget.FasttrackBadgeWidgetSmall.WindowLarge">
+        <item name="android:fasttrackWindowSize">modeLarge</item>
+    </style>
 
     <!-- Text Appearances -->
     <eat-comment />
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index fbdd247..c0ca21b 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -175,6 +175,9 @@
         <item name="fasttrackBadgeWidgetStyleWindowSmall">@android:style/Widget.FasttrackBadgeWidget.WindowSmall</item>
         <item name="fasttrackBadgeWidgetStyleWindowMedium">@android:style/Widget.FasttrackBadgeWidget.WindowMedium</item>
         <item name="fasttrackBadgeWidgetStyleWindowLarge">@android:style/Widget.FasttrackBadgeWidget.WindowLarge</item>
+        <item name="fasttrackBadgeWidgetStyleSmallWindowSmall">@android:style/Widget.FasttrackBadgeWidgetSmall.WindowSmall</item>
+        <item name="fasttrackBadgeWidgetStyleSmallWindowMedium">@android:style/Widget.FasttrackBadgeWidgetSmall.WindowMedium</item>
+        <item name="fasttrackBadgeWidgetStyleSmallWindowLarge">@android:style/Widget.FasttrackBadgeWidgetSmall.WindowLarge</item>
         
         <!-- Preference styles -->
         <item name="preferenceScreenStyle">@android:style/Preference.PreferenceScreen</item>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index c4acf33..fb5e4e6 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -50,6 +50,7 @@
  * List of settings that are backed up are stored in the Settings.java file
  */
 public class SettingsBackupAgent extends BackupHelperAgent {
+    // STOPSHIP: set DEBUG to false
     private static final boolean DEBUG = true;
 
     private static final String KEY_SYSTEM = "system";
@@ -227,6 +228,14 @@
     }
 
     private void restoreSettings(BackupDataInput data, Uri contentUri) {
+        if (DEBUG) Log.i(TAG, "restoreSettings: " + contentUri);
+        String[] whitelist = null;
+        if (contentUri.equals(Settings.Secure.CONTENT_URI)) {
+            whitelist = Settings.Secure.SETTINGS_TO_BACKUP;
+        } else if (contentUri.equals(Settings.System.CONTENT_URI)) {
+            whitelist = Settings.System.SETTINGS_TO_BACKUP;
+        }
+
         ContentValues cv = new ContentValues(2);
         byte[] settings = new byte[data.getDataSize()];
         try {
@@ -248,9 +257,8 @@
             if (!TextUtils.isEmpty(settingName) && !TextUtils.isEmpty(settingValue)) {
                 //Log.i(TAG, "Restore " + settingName + " = " + settingValue);
 
-                // TODO: versioning rather than just an ad hoc blacklist to handle
-                // older varieties of backed-up data
-                if (invalidSavedSetting(contentUri, settingName, settingValue)) {
+                // Only restore settings in our list of known-acceptable data
+                if (invalidSavedSetting(whitelist, settingName)) {
                     continue;
                 }
 
@@ -264,20 +272,23 @@
         }
     }
 
-    private boolean invalidSavedSetting(Uri contentUri, String settingName, String settingValue) {
-        // Even if these settings were stored, don't use them on restore
-        if (contentUri.equals(Settings.Secure.CONTENT_URI)) {
-            if (settingName.equals(Settings.Secure.PREFERRED_NETWORK_MODE)
-                    || settingName.equals(Settings.Secure.PREFERRED_TTY_MODE)
-                    || settingName.equals(Settings.Secure.CDMA_CELL_BROADCAST_SMS)
-                    || settingName.equals(Settings.Secure.PREFERRED_CDMA_SUBSCRIPTION)
-                    || settingName.equals(Settings.Secure.ENHANCED_VOICE_PRIVACY_ENABLED)) {
-                if (DEBUG) Log.v(TAG, "Ignoring restore datum: " + settingName);
-                return true;
+    // Returns 'true' if the given setting is one that we refuse to restore
+    private boolean invalidSavedSetting(String[] knownNames, String candidate) {
+        // no filter? allow everything
+        if (knownNames == null) {
+            return false;
+        }
+
+        // whitelisted setting?  allow it
+        for (String name : knownNames) {
+            if (name.equals(candidate)) {
+                return false;
             }
         }
 
-        return false;
+        // refuse everything else
+        if (DEBUG) Log.v(TAG, "Ignoring restore datum: " + candidate);
+        return true;
     }
 
     private String[] copyAndSort(String[] keys) {
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java
index d78d886..53edf31 100644
--- a/services/java/com/android/server/BatteryService.java
+++ b/services/java/com/android/server/BatteryService.java
@@ -267,6 +267,20 @@
                 logOutlier = true;
             }
             
+            final boolean plugged = mPlugType != BATTERY_PLUGGED_NONE;
+            final boolean oldPlugged = mLastPlugType != BATTERY_PLUGGED_NONE;
+
+            /* The ACTION_BATTERY_LOW broadcast is sent in these situations:
+             * - is just un-plugged (previously was plugged) and battery level is under WARNING, or
+             * - is not plugged and battery level crosses the WARNING boundary (becomes < 15).
+             */
+            final boolean sendBatteryLow = !plugged
+                && mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
+                && mBatteryLevel < BATTERY_LEVEL_WARNING
+                && (oldPlugged || mLastBatteryLevel >= BATTERY_LEVEL_WARNING);
+            
+            sendIntent();
+            
             // Separate broadcast is sent for power connected / not connected
             // since the standard intent will not wake any applications and some
             // applications may want to have smart behavior based on this.
@@ -281,28 +295,6 @@
                 mContext.sendBroadcast(statusIntent);
             }
 
-            final boolean plugged = mPlugType != BATTERY_PLUGGED_NONE;
-            final boolean oldPlugged = mLastPlugType != BATTERY_PLUGGED_NONE;
-
-            /* The ACTION_BATTERY_LOW broadcast is sent in these situations:
-             * - is just un-plugged (previously was plugged) and battery level is under WARNING, or
-             * - is not plugged and battery level crosses the WARNING boundary (becomes < 15).
-             */
-            final boolean sendBatteryLow = !plugged
-                && mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
-                && mBatteryLevel < BATTERY_LEVEL_WARNING
-                && (oldPlugged || mLastBatteryLevel >= BATTERY_LEVEL_WARNING);
-            
-            mLastBatteryStatus = mBatteryStatus;
-            mLastBatteryHealth = mBatteryHealth;
-            mLastBatteryPresent = mBatteryPresent;
-            mLastBatteryLevel = mBatteryLevel;
-            mLastPlugType = mPlugType;
-            mLastBatteryVoltage = mBatteryVoltage;
-            mLastBatteryTemperature = mBatteryTemperature;
-            mLastBatteryLevelCritical = mBatteryLevelCritical;
-
-            sendIntent();
             if (sendBatteryLow) {
                 mSentLowBatteryBroadcast = true;
                 statusIntent.setAction(Intent.ACTION_BATTERY_LOW);
@@ -317,6 +309,15 @@
             if (logOutlier && dischargeDuration != 0) {
                 logOutlier(dischargeDuration);
             }
+            
+            mLastBatteryStatus = mBatteryStatus;
+            mLastBatteryHealth = mBatteryHealth;
+            mLastBatteryPresent = mBatteryPresent;
+            mLastBatteryLevel = mBatteryLevel;
+            mLastPlugType = mPlugType;
+            mLastBatteryVoltage = mBatteryVoltage;
+            mLastBatteryTemperature = mBatteryTemperature;
+            mLastBatteryLevelCritical = mBatteryLevelCritical;
         }
     }
 
diff --git a/tests/CoreTests/android/core/URLTest.java b/tests/CoreTests/android/core/URLTest.java
index 56f9f7b..5efcd5b 100644
--- a/tests/CoreTests/android/core/URLTest.java
+++ b/tests/CoreTests/android/core/URLTest.java
@@ -16,6 +16,7 @@
 
 package android.core;
 
+import android.test.suitebuilder.annotation.Suppress;
 import junit.framework.TestCase;
 
 import java.io.BufferedReader;
@@ -29,10 +30,9 @@
 import java.net.Socket;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.HashMap;
+import java.util.Map;
 
-import android.test.suitebuilder.annotation.Suppress;
-
-@Suppress
 public class URLTest extends TestCase {
 
     private static void get(String u) throws IOException {
@@ -63,10 +63,12 @@
         assertTrue(new String(data).indexOf("<html>") >= 0);
     }
 
+    @Suppress
     public void testGetHTTP() throws Exception {
         get("http://www.google.com");
     }
 
+    @Suppress
     public void testGetHTTPS() throws Exception {
         get("https://www.fortify.net/cgi/ssl_2.pl");
     }
@@ -79,6 +81,7 @@
     private static class DummyServer implements Runnable {
 
         private int keepAliveCount;
+        private Map<String, String> headers = new HashMap<String, String>();
 
         public DummyServer(int keepAliveCount) {
             this.keepAliveCount = keepAliveCount;
@@ -93,9 +96,17 @@
                 BufferedReader reader = new BufferedReader(new InputStreamReader(input));
                 try {
                     for (int i = 0; i < keepAliveCount; i++) {
-                        String header = reader.readLine();
-                        while (header != null && header.length() != 0) {
-                            header = reader.readLine();
+                        reader.readLine();
+                        headers.clear();
+                        while (true) {
+                            String header = reader.readLine();
+                            if (header.length() == 0) {
+                                break;
+                            }
+                            int colon = header.indexOf(":");
+                            String key = header.substring(0, colon);
+                            String value = header.substring(colon + 1).trim();
+                            headers.put(key, value);
                         }
 
                         OutputStream output = socket.getOutputStream();
@@ -142,6 +153,7 @@
     /**
      * Test case for HTTP keep-alive behavior.
      */
+    @Suppress
     public void testGetKeepAlive() throws Exception {
         new Thread(new DummyServer(3)).start();
         Thread.sleep(100);
@@ -160,9 +172,24 @@
         }
     }
 
+    @Suppress
+    public void testUserAgentHeader() throws Exception {
+        DummyServer server = new DummyServer(1);
+        new Thread(server).start();
+        Thread.sleep(100);
+
+        // We expect the request to work three times, then it fails.
+        request(new URL("http://localhost:8182"));
+
+        String userAgent = server.headers.get("User-Agent");
+        assertTrue("Unexpected User-Agent: " + userAgent, userAgent.matches(
+                "Dalvik/[\\d.]+ \\(Linux; U; Android \\w+(;.*)?( Build/\\w+)?\\)"));
+    }
+
     /**
      * Regression for issue 1001814.
      */
+    @Suppress
     public void testHttpConnectionTimeout() throws Exception {
         int timeout = 5000;
         HttpURLConnection cn = null;
@@ -190,7 +217,8 @@
     /** 
      * Regression test for issue 1158780 where using '{' and '}' in an URL threw
      * an NPE. The RI accepts this URL and returns the status 404.
-     */ 
+     */
+    @Suppress
     public void testMalformedUrl() throws Exception {
         URL url = new URL("http://www.google.com/cgi-bin/myscript?g={United+States}+Borders+Mexico+{Climate+change}+Marketing+{Automotive+industry}+News+Health+Internet");
         HttpURLConnection conn = (HttpURLConnection)url.openConnection();