Merge "revert a change in the SyncManager that caused it to not cancel long running syncs if the next sync had the same account and authority." into froyo
diff --git a/api/8.xml b/api/8.xml
index 8cffff1b..e757db2 100644
--- a/api/8.xml
+++ b/api/8.xml
@@ -27144,7 +27144,7 @@
  deprecated="not deprecated"
  visibility="public"
 >
-<parameter name="fd" type="android.os.ParcelFileDescriptor">
+<parameter name="newState" type="android.os.ParcelFileDescriptor">
 </parameter>
 </method>
 </interface>
@@ -37923,6 +37923,28 @@
  visibility="public"
 >
 </field>
+<field name="ACTION_EXTERNAL_APPLICATIONS_AVAILABLE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="ACTION_FACTORY_TEST"
  type="java.lang.String"
  transient="false"
@@ -38890,6 +38912,28 @@
  visibility="public"
 >
 </field>
+<field name="EXTRA_CHANGED_PACKAGE_LIST"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.intent.extra.changed_package_list&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_CHANGED_UID_LIST"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.intent.extra.changed_uid_list&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="EXTRA_DATA_REMOVED"
  type="java.lang.String"
  transient="false"
@@ -42658,6 +42702,17 @@
  visibility="public"
 >
 </field>
+<field name="FLAG_EXTERNAL_STORAGE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="262144"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="FLAG_FACTORY_TEST"
  type="int"
  transient="false"
diff --git a/api/current.xml b/api/current.xml
index db28cba..e757db2 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -42702,6 +42702,17 @@
  visibility="public"
 >
 </field>
+<field name="FLAG_EXTERNAL_STORAGE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="262144"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="FLAG_FACTORY_TEST"
  type="int"
  transient="false"
diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c
index e8b5eaf..082e704 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -138,6 +138,8 @@
     dump_file("LAST PANIC CONSOLE", "/data/dontpanic/apanic_console");
     dump_file("LAST PANIC THREADS", "/data/dontpanic/apanic_threads");
 
+    for_each_pid(show_wchan, "BLOCKED PROCESS WAIT-CHANNELS");
+
     printf("------ BACKLIGHTS ------\n");
     printf("LCD brightness=");
     dump_file(NULL, "/sys/class/leds/lcd-backlight/brightness");
@@ -161,7 +163,6 @@
     run_command("DUMPSYS", 60, "dumpsys", NULL);
 }
 
-
 static void usage() {
     fprintf(stderr, "usage: dumpstate [-d] [-o file] [-s] [-z]\n"
             "  -d: append date to filename (requires -o)\n"
diff --git a/cmds/dumpstate/dumpstate.h b/cmds/dumpstate/dumpstate.h
index 6d48a85..682eafd 100644
--- a/cmds/dumpstate/dumpstate.h
+++ b/cmds/dumpstate/dumpstate.h
@@ -38,4 +38,10 @@
 /* dump Dalvik stack traces, return the trace file location (NULL if none) */
 const char *dump_vm_traces();
 
+/* for each process in the system, run the specified function */
+void for_each_pid(void (*func)(int, const char *), const char *header);
+
+/* Displays a blocked processes in-kernel wait channel */
+void show_wchan(int pid, const char *name);
+
 #endif /* _DUMPSTATE_H_ */
diff --git a/cmds/dumpstate/utils.c b/cmds/dumpstate/utils.c
index c21dace..c7a78cc 100644
--- a/cmds/dumpstate/utils.c
+++ b/cmds/dumpstate/utils.c
@@ -37,6 +37,64 @@
 
 #include "dumpstate.h"
 
+void for_each_pid(void (*func)(int, const char *), const char *header) {
+    DIR *d;
+    struct dirent *de;
+
+    if (!(d = opendir("/proc"))) {
+        printf("Failed to open /proc (%s)\n", strerror(errno));
+        return;
+    }
+
+    printf("\n------ %s ------\n", header);
+    while ((de = readdir(d))) {
+        int pid;
+        int fd;
+        char cmdpath[255];
+        char cmdline[255];
+
+        if (!(pid = atoi(de->d_name))) {
+            continue;
+        }
+
+        sprintf(cmdpath,"/proc/%d/cmdline", pid);
+        memset(cmdline, 0, sizeof(cmdline));
+        if ((fd = open(cmdpath, O_RDONLY)) < 0) {
+            strcpy(cmdline, "N/A");
+        } else {
+            read(fd, cmdline, sizeof(cmdline));
+            close(fd);
+        }
+        func(pid, cmdline);
+    }
+
+    closedir(d);
+}
+
+void show_wchan(int pid, const char *name) {
+    char path[255];
+    char buffer[255];
+    int fd;
+
+    memset(buffer, 0, sizeof(buffer));
+
+    sprintf(path, "/proc/%d/wchan", pid);
+    if ((fd = open(path, O_RDONLY)) < 0) {
+        printf("Failed to open '%s' (%s)\n", path, strerror(errno));
+        return;
+    }
+
+    if (read(fd, buffer, sizeof(buffer)) < 0) {
+        printf("Failed to read '%s' (%s)\n", path, strerror(errno));
+        goto out_close;
+    }
+
+    printf("%-7d %-32s %s\n", pid, name, buffer);
+
+out_close:
+    close(fd);
+    return;
+}
 
 /* prints the contents of a file */
 int dump_file(const char *title, const char* path) {
diff --git a/core/java/android/content/SyncResult.java b/core/java/android/content/SyncResult.java
index 18abebe..8b0afbd 100644
--- a/core/java/android/content/SyncResult.java
+++ b/core/java/android/content/SyncResult.java
@@ -20,30 +20,110 @@
 import android.os.Parcelable;
 
 /**
- * This class is used to store information about the result of a sync
+ * This class is used to communicate the results of a sync operation to the SyncManager.
+ * Based on the values here the SyncManager will determine the disposition of the
+ * sync and whether or not a new sync operation needs to be scheduled in the future.
+ *
  */
 public final class SyncResult implements Parcelable {
+    /**
+     * Used to indicate that the SyncAdapter is already performing a sync operation, though
+     * not necessarily for the requested account and authority and that it wasn't able to
+     * process this request. The SyncManager will reschedule the request to run later.
+     */
     public final boolean syncAlreadyInProgress;
+
+    /**
+     * Used to indicate that the SyncAdapter determined that it would need to issue
+     * too many delete operations to the server in order to satisfy the request
+     * (as defined by the SyncAdapter). The SyncManager will record
+     * that the sync request failed and will cause a System Notification to be created
+     * asking the user what they want to do about this. It will give the user a chance to
+     * choose between (1) go ahead even with those deletes, (2) revert the deletes,
+     * or (3) take no action. If the user decides (1) or (2) the SyncManager will issue another
+     * sync request with either {@link ContentResolver#SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS}
+     * or {@link ContentResolver#SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS} set in the extras.
+     * It is then up to the SyncAdapter to decide how to honor that request.
+     */
     public boolean tooManyDeletions;
+
+    /**
+     * Used to indicate that the SyncAdapter experienced a hard error due to trying the same
+     * operation too many times (as defined by the SyncAdapter). The SyncManager will record
+     * that the sync request failed and it will not reschedule the request.
+     */
     public boolean tooManyRetries;
+
+    /**
+     * Used to indicate that the SyncAdapter experienced a hard error due to an error it
+     * received from interacting with the storage later. The SyncManager will record that
+     * the sync request failed and it will not reschedule the request.
+     */
     public boolean databaseError;
+
+    /**
+     * If set the SyncManager will request an immediate sync with the same Account and authority
+     * (but empty extras Bundle) as was used in the sync request.
+     */
     public boolean fullSyncRequested;
+
+    /**
+     * This field is ignored by the SyncManager.
+     */
     public boolean partialSyncUnavailable;
+
+    /**
+     * This field is ignored by the SyncManager.
+     */
     public boolean moreRecordsToGet;
 
-    // in seconds since epoch
+    /**
+     * Used to indicate to the SyncManager that future sync requests that match the request's
+     * Account and authority should be delayed at least this many seconds.
+     */
     public long delayUntil;
+
+    /**
+     * Used to hold extras statistics about the sync operation. Some of these indicate that
+     * the sync request resulted in a hard or soft error, others are for purely informational
+     * purposes.
+     */
     public final SyncStats stats;
+
+    /**
+     * This instance of a SyncResult is returned by the SyncAdapter in response to a
+     * sync request when a sync is already underway. The SyncManager will reschedule the
+     * sync request to try again later.
+     */
     public static final SyncResult ALREADY_IN_PROGRESS;
 
     static {
         ALREADY_IN_PROGRESS = new SyncResult(true);
     }
 
+    /**
+     * Create a "clean" SyncResult. If this is returned without any changes then the
+     * SyncManager will consider the sync to have completed successfully. The various fields
+     * can be set by the SyncAdapter in order to give the SyncManager more information as to
+     * the disposition of the sync.
+     * <p>
+     * The errors are classified into two broad categories: hard errors and soft errors.
+     * Soft errors are retried with exponential backoff. Hard errors are not retried (except
+     * when the hard error is for a {@link ContentResolver#SYNC_EXTRAS_UPLOAD} request,
+     * in which the request is retryed without the {@link ContentResolver#SYNC_EXTRAS_UPLOAD}
+     * extra set). The SyncManager checks the type of error by calling
+     * {@link SyncResult#hasHardError()} and  {@link SyncResult#hasSoftError()}. If both are
+     * true then the SyncManager treats it as a hard error, not a soft error.
+     */
     public SyncResult() {
         this(false);
     }
 
+    /**
+     * Internal helper for creating a clean SyncResult or one that indicated that
+     * a sync is already in progress.
+     * @param syncAlreadyInProgress if true then set the {@link #syncAlreadyInProgress} flag
+     */
     private SyncResult(boolean syncAlreadyInProgress) {
         this.syncAlreadyInProgress = syncAlreadyInProgress;
         this.tooManyDeletions = false;
@@ -67,6 +147,21 @@
         stats = new SyncStats(parcel);
     }
 
+    /**
+     * Convenience method for determining if the SyncResult indicates that a hard error
+     * occurred. See {@link #SyncResult()} for an explanation of what the SyncManager does
+     * when it sees a hard error.
+     * <p>
+     * A hard error is indicated when any of the following is true:
+     * <ul>
+     * <li> {@link SyncStats#numParseExceptions} > 0
+     * <li> {@link SyncStats#numConflictDetectedExceptions} > 0
+     * <li> {@link SyncStats#numAuthExceptions} > 0
+     * <li> {@link #tooManyDeletions}
+     * <li> {@link #tooManyRetries}
+     * <li> {@link #databaseError}
+     * @return true if a hard error is indicated
+     */
     public boolean hasHardError() {
         return stats.numParseExceptions > 0
                 || stats.numConflictDetectedExceptions > 0
@@ -76,10 +171,26 @@
                 || databaseError;
     }
 
+    /**
+     * Convenience method for determining if the SyncResult indicates that a soft error
+     * occurred. See {@link #SyncResult()} for an explanation of what the SyncManager does
+     * when it sees a soft error.
+     * <p>
+     * A soft error is indicated when any of the following is true:
+     * <ul>
+     * <li> {@link SyncStats#numIoExceptions} > 0
+     * <li> {@link #syncAlreadyInProgress}
+     * </ul>
+     * @return true if a hard error is indicated
+     */
     public boolean hasSoftError() {
         return syncAlreadyInProgress || stats.numIoExceptions > 0;
     }
 
+    /**
+     * A convenience method for determining of the SyncResult indicates that an error occurred.
+     * @return true if either a soft or hard error occurred
+     */
     public boolean hasError() {
         return hasSoftError() || hasHardError();
     }
@@ -90,6 +201,10 @@
                 || stats.numUpdates > 0;
     }
 
+    /**
+     * Clears the SyncResult to a clean state. Throws an {@link UnsupportedOperationException}
+     * if this is called when {@link #syncAlreadyInProgress} is set.
+     */
     public void clear() {
         if (syncAlreadyInProgress) {
             throw new UnsupportedOperationException(
diff --git a/core/java/android/content/SyncStats.java b/core/java/android/content/SyncStats.java
index cc544c0..b7f2a85 100644
--- a/core/java/android/content/SyncStats.java
+++ b/core/java/android/content/SyncStats.java
@@ -20,17 +20,77 @@
 import android.os.Parcel;
 
 /**
- * @hide
+ * Used to record various statistics about the result of a sync operation. The SyncManager
+ * gets access to these via a {@link SyncResult} and uses some of them to determine the
+ * disposition of the sync. See {@link SyncResult} for further dicussion on how the
+ * SyncManager uses these values.
  */
 public class SyncStats implements Parcelable {
+    /**
+     * The SyncAdapter was unable to authenticate the {@link android.accounts.Account}
+     * that was specified in the request. The user needs to take some action to resolve
+     * before a future request can expect to succeed. This is considered a hard error.
+     */
     public long numAuthExceptions;
+
+    /**
+     * The SyncAdapter had a problem, most likely with the network connectivity or a timeout
+     * while waiting for a network response. The request may succeed if it is tried again
+     * later. This is considered a soft error.
+     */
     public long numIoExceptions;
+
+    /**
+     * The SyncAdapter had a problem with the data it received from the server or the storage
+     * later. This problem will likely repeat if the request is tried again. The problem
+     * will need to be cleared up by either the server or the storage layer (likely with help
+     * from the user). If the SyncAdapter cleans up the data itself then it typically won't
+     * increment this value although it may still do so in order to record that it had to
+     * perform some cleanup. E.g., if the SyncAdapter received a bad entry from the server
+     * when processing a feed of entries, it may choose to drop the entry and thus make
+     * progress and still increment this value just so the SyncAdapter can record that an
+     * error occurred. This is considered a hard error.
+     */
     public long numParseExceptions;
+
+    /**
+     * The SyncAdapter detected that there was an unrecoverable version conflict when it
+     * attempted to update or delete a version of a resource on the server. This is expected
+     * to clear itself automatically once the new state is retrieved from the server,
+     * though it may remain until the user intervenes manually, perhaps by clearing the
+     * local storage and starting over frmo scratch. This is considered a hard error.
+     */
     public long numConflictDetectedExceptions;
+
+    /**
+     * Counter for tracking how many inserts were performed by the sync operation, as defined
+     * by the SyncAdapter.
+     */
     public long numInserts;
+
+    /**
+     * Counter for tracking how many updates were performed by the sync operation, as defined
+     * by the SyncAdapter.
+     */
     public long numUpdates;
+
+    /**
+     * Counter for tracking how many deletes were performed by the sync operation, as defined
+     * by the SyncAdapter.
+     */
     public long numDeletes;
+
+    /**
+     * Counter for tracking how many entries were affected by the sync operation, as defined
+     * by the SyncAdapter.
+     */
     public long numEntries;
+
+    /**
+     * Counter for tracking how many entries, either from the server or the local store, were
+     * ignored during the sync operation. This could happen if the SyncAdapter detected some
+     * unparsable data but decided to skip it and move on rather than failing immediately.
+     */
     public long numSkippedEntries;
 
     public SyncStats() {
@@ -75,6 +135,9 @@
         return sb.toString();
     }
 
+    /**
+     * Reset all the counters to 0.
+     */
     public void clear() {
         numAuthExceptions = 0;
         numIoExceptions = 0;
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 0a04e5b..1577f9e 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -252,20 +252,22 @@
     public static final int FLAG_RESTORE_ANY_VERSION = 1<<17;
 
     /**
+     * Value for {@link #flags}: Set to true if the application is
+     * currently installed on external/removable/unprotected storage.  Such
+     * applications may not be available if their storage is not currently
+     * mounted.  When the storage it is on is not available, it will look like
+     * the application has been uninstalled (its .apk is no longer available)
+     * but its persistent data is not removed.
+     */
+    public static final int FLAG_EXTERNAL_STORAGE = 1<<18;
+
+    /**
      * Value for {@link #flags}: Set to true if the application has been
      * installed using the forward lock option.
      *
      * {@hide}
      */
-    public static final int FLAG_FORWARD_LOCK = 1<<19;
-
-    /**
-     * Value for {@link #flags}: Set to true if the application is
-     * currently installed on the sdcard.
-     *
-     * {@hide}
-     */
-    public static final int FLAG_EXTERNAL_STORAGE = 1<<20;
+    public static final int FLAG_FORWARD_LOCK = 1<<20;
 
     /**
      * Value for {@link #flags}: Set to true if the application is
diff --git a/core/java/android/database/sqlite/SQLiteDebug.java b/core/java/android/database/sqlite/SQLiteDebug.java
index a4db6d9..89c3f96 100644
--- a/core/java/android/database/sqlite/SQLiteDebug.java
+++ b/core/java/android/database/sqlite/SQLiteDebug.java
@@ -118,8 +118,6 @@
 
     /**
      * contains statistics about a database
-     * @author vnori@google.com (Your Name Here)
-     *
      */
     public static class DbStats {
         /** name of the database */
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 7f202a7..3d1d7d6 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -127,6 +127,7 @@
         
         // Current window state.
         boolean mCreated;
+        boolean mSurfaceCreated;
         boolean mIsCreating;
         boolean mDrawingAllowed;
         int mWidth;
@@ -137,7 +138,6 @@
         int mCurHeight;
         int mWindowFlags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
         int mCurWindowFlags = mWindowFlags;
-        boolean mDestroyReportNeeded;
         final Rect mVisibleInsets = new Rect();
         final Rect mWinFrame = new Rect();
         final Rect mContentInsets = new Rect();
@@ -447,11 +447,12 @@
             if (myHeight <= 0) myHeight = ViewGroup.LayoutParams.MATCH_PARENT;
             
             final boolean creating = !mCreated;
+            final boolean surfaceCreating = !mSurfaceCreated;
             final boolean formatChanged = mFormat != mSurfaceHolder.getRequestedFormat();
             boolean sizeChanged = mWidth != myWidth || mHeight != myHeight;
             final boolean typeChanged = mType != mSurfaceHolder.getRequestedType();
             final boolean flagsChanged = mCurWindowFlags != mWindowFlags;
-            if (forceRelayout || creating || formatChanged || sizeChanged
+            if (forceRelayout || creating || surfaceCreating || formatChanged || sizeChanged
                     || typeChanged || flagsChanged) {
 
                 if (DEBUG) Log.v(TAG, "Changes: creating=" + creating
@@ -487,6 +488,7 @@
                         mLayout.windowAnimations =
                                 com.android.internal.R.style.Animation_Wallpaper;
                         mSession.add(mWindow, mLayout, View.VISIBLE, mContentInsets);
+                        mCreated = true;
                     }
                     
                     mSurfaceHolder.mSurfaceLock.lock();
@@ -513,9 +515,13 @@
                     
                     mSurfaceHolder.mSurfaceLock.unlock();
 
+                    if (!mSurfaceHolder.mSurface.isValid()) {
+                        reportSurfaceDestroyed();
+                        if (DEBUG) Log.v(TAG, "Layout: Surface destroyed");
+                        return;
+                    }
+                    
                     try {
-                        mDestroyReportNeeded = true;
-
                         SurfaceHolder.Callback callbacks[] = null;
                         synchronized (mSurfaceHolder.mCallbacks) {
                             final int N = mSurfaceHolder.mCallbacks.size();
@@ -525,7 +531,7 @@
                             }
                         }
 
-                        if (!mCreated) {
+                        if (surfaceCreating) {
                             mIsCreating = true;
                             if (DEBUG) Log.v(TAG, "onSurfaceCreated("
                                     + mSurfaceHolder + "): " + this);
@@ -536,7 +542,8 @@
                                 }
                             }
                         }
-                        if (forceReport || creating || formatChanged || sizeChanged) {
+                        if (forceReport || creating || surfaceCreating
+                                || formatChanged || sizeChanged) {
                             if (DEBUG) {
                                 RuntimeException e = new RuntimeException();
                                 e.fillInStackTrace();
@@ -559,7 +566,7 @@
                         }
                     } finally {
                         mIsCreating = false;
-                        mCreated = true;
+                        mSurfaceCreated = true;
                         if (creating || (relayoutResult&WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) {
                             mSession.finishDrawing(mWindow);
                         }
@@ -621,6 +628,12 @@
                     mReportedVisible = visible;
                     if (DEBUG) Log.v(TAG, "onVisibilityChanged(" + visible
                             + "): " + this);
+                    if (visible) {
+                        // If becoming visible, in preview mode the surface
+                        // may have been destroyed so now we need to make
+                        // sure it is re-created.
+                        updateSurface(false, false);
+                    }
                     onVisibilityChanged(visible);
                 }
             }
@@ -645,13 +658,16 @@
                 mPendingSync = false;
                 mOffsetMessageEnqueued = false;
             }
-            if (DEBUG) Log.v(TAG, "Offsets change in " + this
-                    + ": " + xOffset + "," + yOffset);
-            final int availw = mIWallpaperEngine.mReqWidth-mCurWidth;
-            final int xPixels = availw > 0 ? -(int)(availw*xOffset+.5f) : 0;
-            final int availh = mIWallpaperEngine.mReqHeight-mCurHeight;
-            final int yPixels = availh > 0 ? -(int)(availh*yOffset+.5f) : 0;
-            onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixels, yPixels);
+            
+            if (mSurfaceCreated) {
+                if (DEBUG) Log.v(TAG, "Offsets change in " + this
+                        + ": " + xOffset + "," + yOffset);
+                final int availw = mIWallpaperEngine.mReqWidth-mCurWidth;
+                final int xPixels = availw > 0 ? -(int)(availw*xOffset+.5f) : 0;
+                final int availh = mIWallpaperEngine.mReqHeight-mCurHeight;
+                final int yPixels = availh > 0 ? -(int)(availh*yOffset+.5f) : 0;
+                onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixels, yPixels);
+            }
             
             if (sync) {
                 try {
@@ -679,21 +695,9 @@
             }
         }
         
-        void detach() {
-            if (mDestroyed) {
-                return;
-            }
-            
-            mDestroyed = true;
-            
-            if (mVisible) {
-                mVisible = false;
-                if (DEBUG) Log.v(TAG, "onVisibilityChanged(false): " + this);
-                onVisibilityChanged(false);
-            }
-            
-            if (mDestroyReportNeeded) {
-                mDestroyReportNeeded = false;
+        void reportSurfaceDestroyed() {
+            if (mSurfaceCreated) {
+                mSurfaceCreated = false;
                 SurfaceHolder.Callback callbacks[];
                 synchronized (mSurfaceHolder.mCallbacks) {
                     callbacks = new SurfaceHolder.Callback[
@@ -707,6 +711,22 @@
                         + mSurfaceHolder + "): " + this);
                 onSurfaceDestroyed(mSurfaceHolder);
             }
+        }
+        
+        void detach() {
+            if (mDestroyed) {
+                return;
+            }
+            
+            mDestroyed = true;
+            
+            if (mVisible) {
+                mVisible = false;
+                if (DEBUG) Log.v(TAG, "onVisibilityChanged(false): " + this);
+                onVisibilityChanged(false);
+            }
+            
+            reportSurfaceDestroyed();
             
             if (DEBUG) Log.v(TAG, "onDestroy(): " + this);
             onDestroy();
diff --git a/core/java/android/util/Patterns.java b/core/java/android/util/Patterns.java
index 2ee6e8a..5cbfd29 100644
--- a/core/java/android/util/Patterns.java
+++ b/core/java/android/util/Patterns.java
@@ -124,7 +124,7 @@
         + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"
         + "|[1-9][0-9]|[0-9])))"
         + "(?:\\:\\d{1,5})?)" // plus option port number
-        + "(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~"  // plus option query params
+        + "(\\/(?:(?:[" + GOOD_IRI_CHAR + "\\;\\/\\?\\:\\@\\&\\=\\#\\~"  // plus option query params
         + "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?"
         + "(?:\\b|$)"); // and finally, a word boundary or end of
                         // input.  This is to stop foo.sure from
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 6a9218a..83ef8ba 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -147,6 +147,7 @@
     private int mSaveCount;
     @SuppressWarnings("unused")
     private Canvas mCanvas;
+    private String mName;
 
     // The display metrics used to provide the pseudo canvas size for applications
     // running in compatibility mode. This is set to null for non compatibility mode.
@@ -204,6 +205,7 @@
         }
         mCanvas = new CompatibleCanvas();
         init(s,pid,name,display,w,h,format,flags);
+        mName = name;
     }
 
     /**
@@ -386,7 +388,7 @@
 
     @Override
     public String toString() {
-        return "Surface(native-token=" + mSurface + ")";
+        return "Surface(name=" + mName + ", identity=" + getIdentity() + ")";
     }
 
     private Surface(Parcel source) throws OutOfResourcesException {
@@ -437,4 +439,6 @@
             throws OutOfResourcesException;
 
     private native void init(Parcel source);
+
+    private native int getIdentity();
 }
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 6f4c6ff..6b316ce 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -4814,6 +4814,8 @@
                 boolean done = false;
                 boolean keepScrollBarsVisible = false;
                 if (Math.abs(fDeltaX) < 1.0f && Math.abs(fDeltaY) < 1.0f) {
+                    mLastTouchX = x;
+                    mLastTouchY = y;
                     keepScrollBarsVisible = done = true;
                 } else {
                     if (mSnapScrollMode == SNAP_X || mSnapScrollMode == SNAP_Y) {
@@ -4865,6 +4867,8 @@
                     } else {
                         // keep the scrollbar on the screen even there is no
                         // scroll
+                        mLastTouchX = x;
+                        mLastTouchY = y;
                         keepScrollBarsVisible = true;
                     }
                     mLastTouchTime = eventTime;
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index ed26cbe..788374b 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -229,6 +229,15 @@
     setSurface(env, clazz, rhs);
 }
 
+static jint Surface_getIdentity(JNIEnv* env, jobject clazz)
+{
+    const sp<SurfaceControl>& control(getSurfaceControl(env, clazz));
+    if (control != 0) return (jint) control->getIdentity();
+    const sp<Surface>& surface(getSurface(env, clazz));
+    if (surface != 0) return (jint) surface->getIdentity();
+    return -1;
+}
+
 static void Surface_destroy(JNIEnv* env, jobject clazz, uintptr_t *ostack)
 {
     const sp<SurfaceControl>& surface(getSurfaceControl(env, clazz));
@@ -261,14 +270,14 @@
         we can map to SkBitmap::kARGB_8888_Config, and optionally call
         bitmap.setIsOpaque(true) on the resulting SkBitmap (as an accelerator)
     */
-	switch (format) {
-	case PIXEL_FORMAT_RGBX_8888:    return SkBitmap::kARGB_8888_Config;
+    switch (format) {
+    case PIXEL_FORMAT_RGBX_8888:    return SkBitmap::kARGB_8888_Config;
     case PIXEL_FORMAT_RGBA_8888:    return SkBitmap::kARGB_8888_Config;
     case PIXEL_FORMAT_RGBA_4444:    return SkBitmap::kARGB_4444_Config;
-	case PIXEL_FORMAT_RGB_565:		return SkBitmap::kRGB_565_Config;
-	case PIXEL_FORMAT_A_8:          return SkBitmap::kA8_Config;
-	default:                        return SkBitmap::kNo_Config;
-	}
+    case PIXEL_FORMAT_RGB_565:      return SkBitmap::kRGB_565_Config;
+    case PIXEL_FORMAT_A_8:          return SkBitmap::kA8_Config;
+    default:                        return SkBitmap::kNo_Config;
+    }
 }
 
 static jobject Surface_lockCanvas(JNIEnv* env, jobject clazz, jobject dirtyRect)
@@ -347,7 +356,7 @@
         env->SetIntField(dirtyRect, ro.b, bounds.bottom);
     }
     
-	return canvas;
+    return canvas;
 }
 
 static void Surface_unlockCanvasAndPost(
@@ -631,8 +640,8 @@
 static void nativeClassInit(JNIEnv* env, jclass clazz);
 
 static JNINativeMethod gSurfaceSessionMethods[] = {
-	{"init",     "()V",  (void*)SurfaceSession_init },
-	{"destroy",  "()V",  (void*)SurfaceSession_destroy },
+    {"init",     "()V",  (void*)SurfaceSession_init },
+    {"destroy",  "()V",  (void*)SurfaceSession_destroy },
     {"kill",     "()V",  (void*)SurfaceSession_kill },
 };
 
@@ -640,43 +649,44 @@
     {"nativeClassInit",     "()V",  (void*)nativeClassInit },
     {"init",                "(Landroid/view/SurfaceSession;ILjava/lang/String;IIIII)V",  (void*)Surface_init },
     {"init",                "(Landroid/os/Parcel;)V",  (void*)Surface_initParcel },
+    {"getIdentity",         "()I",  (void*)Surface_getIdentity },
     {"destroy",             "()V",  (void*)Surface_destroy },
     {"release",             "()V",  (void*)Surface_release },
-	{"copyFrom",            "(Landroid/view/Surface;)V",  (void*)Surface_copyFrom },
-	{"isValid",             "()Z",  (void*)Surface_isValid },
-	{"lockCanvasNative",    "(Landroid/graphics/Rect;)Landroid/graphics/Canvas;",  (void*)Surface_lockCanvas },
-	{"unlockCanvasAndPost", "(Landroid/graphics/Canvas;)V", (void*)Surface_unlockCanvasAndPost },
-	{"unlockCanvas",        "(Landroid/graphics/Canvas;)V", (void*)Surface_unlockCanvas },
-	{"openTransaction",     "()V",  (void*)Surface_openTransaction },
+    {"copyFrom",            "(Landroid/view/Surface;)V",  (void*)Surface_copyFrom },
+    {"isValid",             "()Z",  (void*)Surface_isValid },
+    {"lockCanvasNative",    "(Landroid/graphics/Rect;)Landroid/graphics/Canvas;",  (void*)Surface_lockCanvas },
+    {"unlockCanvasAndPost", "(Landroid/graphics/Canvas;)V", (void*)Surface_unlockCanvasAndPost },
+    {"unlockCanvas",        "(Landroid/graphics/Canvas;)V", (void*)Surface_unlockCanvas },
+    {"openTransaction",     "()V",  (void*)Surface_openTransaction },
     {"closeTransaction",    "()V",  (void*)Surface_closeTransaction },
     {"setOrientation",      "(III)V", (void*)Surface_setOrientation },
     {"freezeDisplay",       "(I)V", (void*)Surface_freezeDisplay },
     {"unfreezeDisplay",     "(I)V", (void*)Surface_unfreezeDisplay },
     {"setLayer",            "(I)V", (void*)Surface_setLayer },
-	{"setPosition",         "(II)V",(void*)Surface_setPosition },
-	{"setSize",             "(II)V",(void*)Surface_setSize },
-	{"hide",                "()V",  (void*)Surface_hide },
-	{"show",                "()V",  (void*)Surface_show },
-	{"freeze",              "()V",  (void*)Surface_freeze },
-	{"unfreeze",            "()V",  (void*)Surface_unfreeze },
-	{"setFlags",            "(II)V",(void*)Surface_setFlags },
-	{"setTransparentRegionHint","(Landroid/graphics/Region;)V", (void*)Surface_setTransparentRegion },
-	{"setAlpha",            "(F)V", (void*)Surface_setAlpha },
-	{"setMatrix",           "(FFFF)V",  (void*)Surface_setMatrix },
-	{"setFreezeTint",       "(I)V",  (void*)Surface_setFreezeTint },
-	{"readFromParcel",      "(Landroid/os/Parcel;)V", (void*)Surface_readFromParcel },
-	{"writeToParcel",       "(Landroid/os/Parcel;I)V", (void*)Surface_writeToParcel },
+    {"setPosition",         "(II)V",(void*)Surface_setPosition },
+    {"setSize",             "(II)V",(void*)Surface_setSize },
+    {"hide",                "()V",  (void*)Surface_hide },
+    {"show",                "()V",  (void*)Surface_show },
+    {"freeze",              "()V",  (void*)Surface_freeze },
+    {"unfreeze",            "()V",  (void*)Surface_unfreeze },
+    {"setFlags",            "(II)V",(void*)Surface_setFlags },
+    {"setTransparentRegionHint","(Landroid/graphics/Region;)V", (void*)Surface_setTransparentRegion },
+    {"setAlpha",            "(F)V", (void*)Surface_setAlpha },
+    {"setMatrix",           "(FFFF)V",  (void*)Surface_setMatrix },
+    {"setFreezeTint",       "(I)V",  (void*)Surface_setFreezeTint },
+    {"readFromParcel",      "(Landroid/os/Parcel;)V", (void*)Surface_readFromParcel },
+    {"writeToParcel",       "(Landroid/os/Parcel;I)V", (void*)Surface_writeToParcel },
 };
 
 void nativeClassInit(JNIEnv* env, jclass clazz)
 {
     so.surface = env->GetFieldID(clazz, "mSurface", "I");
     so.surfaceControl = env->GetFieldID(clazz, "mSurfaceControl", "I");
-	so.saveCount = env->GetFieldID(clazz, "mSaveCount", "I");
-	so.canvas    = env->GetFieldID(clazz, "mCanvas", "Landroid/graphics/Canvas;");
+    so.saveCount = env->GetFieldID(clazz, "mSaveCount", "I");
+    so.canvas    = env->GetFieldID(clazz, "mCanvas", "Landroid/graphics/Canvas;");
 
     jclass surfaceSession = env->FindClass("android/view/SurfaceSession");
- 	sso.client = env->GetFieldID(surfaceSession, "mClient", "I");
+    sso.client = env->GetFieldID(surfaceSession, "mClient", "I");
 
     jclass canvas = env->FindClass("android/graphics/Canvas");
     no.native_canvas = env->GetFieldID(canvas, "mNativeCanvas", "I");
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index ae43bae..a4b3bdd 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Vypnout"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Vypínání..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Váš telefon bude vypnut."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Žádné nedávno použité aplikace."</string>
     <string name="global_actions" msgid="2406416831541615258">"Možnosti telefonu"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Zámek obrazovky"</string>
@@ -853,7 +855,7 @@
     <string name="submit" msgid="1602335572089911941">"Odeslat"</string>
     <string name="description_star" msgid="2654319874908576133">"oblíbené"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Aktivován režim V autě"</string>
-    <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Vyberte, chcete-li ukončit režim V autě."</string>
+    <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Vyberte, chcete-li ukončit režim Na cestě."</string>
     <string name="tethered_notification_title" msgid="8146103971290167718">"Sdílení je aktivní"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Dotykem zahájíte konfiguraci"</string>
     <!-- no translation found for throttle_warning_notification_title (4890894267454867276) -->
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 8a6c42b..fa0c7e8 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Sluk"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Lukker ned ..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"lydstyrke for opkald"</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Der er ingen nye programmer."</string>
     <string name="global_actions" msgid="2406416831541615258">"Indstillinger for telefon"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Skærmlås"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index a3ffccc..dbcde54 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Ausschalten"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Herunterfahren..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Ihr Telefon wird heruntergefahren."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Keine neuen Anwendungen."</string>
     <string name="global_actions" msgid="2406416831541615258">"Telefonoptionen"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Bildschirmsperre"</string>
@@ -543,8 +545,8 @@
     <string name="lockscreen_charged" msgid="4938930459620989972">"Aufgeladen"</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="lockscreen_low_battery" msgid="1482873981919249740">"Bitte Ladegerät anschließen"</string>
-    <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Keine SIM-Karte."</string>
-    <string name="lockscreen_missing_sim_message" msgid="2186920585695169078">"Keine SIM-Karte im Telefon."</string>
+    <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Keine SIM-Karte"</string>
+    <string name="lockscreen_missing_sim_message" msgid="2186920585695169078">"Keine SIM-Karte im Telefon"</string>
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Bitte legen Sie eine SIM-Karte ein."</string>
     <string name="emergency_calls_only" msgid="6733978304386365407">"Nur Notrufe"</string>
     <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Netzwerk gesperrt"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index c5ac624..4bc1c35 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Απενεργοποίηση"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Απενεργοποίηση..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Το τηλέφωνό σας θα απενεργοποιηθεί."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Δεν υπάρχουν πρόσφατες εφαρμογές."</string>
     <string name="global_actions" msgid="2406416831541615258">"Επιλογές τηλεφώνου"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Κλείδωμα οθόνης"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 1dc89a2..deb9f8f 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Apagar"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Apagando…"</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Tu teléfono se apagará."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"No hay aplicaciones recientes."</string>
     <string name="global_actions" msgid="2406416831541615258">"Opciones de teléfono"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Bloqueo de pantalla"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index a7fd001..ae8b251 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Apagar"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Apagando..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"El teléfono se apagará."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"No hay aplicaciones recientes"</string>
     <string name="global_actions" msgid="2406416831541615258">"Opciones del teléfono"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Bloqueo de pantalla"</string>
@@ -326,8 +328,8 @@
     <string name="permdesc_asec_create" msgid="7041802322759014035">"Permite que la aplicación cree un almacenamiento seguro."</string>
     <string name="permlab_asec_destroy" msgid="7787322878955261006">"destruir almacenamiento seguro"</string>
     <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Permite que la aplicación destruya el almacenamiento seguro."</string>
-    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"montar/desmontar almacenamiento seguro"</string>
-    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Permite que la aplicación monte o desmonte el almacenamiento seguro."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"activar/desactivar almacenamiento seguro"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Permite que la aplicación active o desactive el almacenamiento seguro."</string>
     <string name="permlab_asec_rename" msgid="5685344390439934495">"cambiar nombre de almacenamiento seguro"</string>
     <string name="permdesc_asec_rename" msgid="1387881770708872470">"Permite que la aplicación cambie el nombre del almacenamiento seguro."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"controlar vibración"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index fc6a177..670bcdf 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Éteindre"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Arrêt en cours..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Votre téléphone va s\'éteindre."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Aucune application récente"</string>
     <string name="global_actions" msgid="2406416831541615258">"Options du téléphone"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Verrouillage de l\'écran"</string>
@@ -746,10 +748,10 @@
     <string name="sendText" msgid="5132506121645618310">"Sélectionner une action pour le texte"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Volume de la sonnerie"</string>
     <string name="volume_music" msgid="5421651157138628171">"Volume"</string>
-    <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Lecture via Bluetooth"</string>
+    <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Lecture via le Bluetooth"</string>
     <string name="volume_music_hint_silent_ringtone_selected" msgid="6158339745293431194">"Sonnerie silencieuse sélectionnée"</string>
     <string name="volume_call" msgid="3941680041282788711">"Volume des appels entrants"</string>
-    <string name="volume_bluetooth_call" msgid="2002891926351151534">"Volume d\'appels entrants sur Bluetooth"</string>
+    <string name="volume_bluetooth_call" msgid="2002891926351151534">"Volume d\'appels entrants sur le Bluetooth"</string>
     <string name="volume_alarm" msgid="1985191616042689100">"Volume"</string>
     <string name="volume_notification" msgid="2422265656744276715">"Volume des notifications"</string>
     <string name="volume_unknown" msgid="1400219669770445902">"Volume"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 2e8fe83..acc8f2b 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Spegni"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Spegnimento..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Il telefono verrà spento."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Nessuna applicazione recente."</string>
     <string name="global_actions" msgid="2406416831541615258">"Opzioni telefono"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Blocco schermo"</string>
@@ -143,7 +145,7 @@
     <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Audio attivo"</string>
     <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modalità aereo"</string>
     <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modalità aereo attiva"</string>
-    <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Disattiva modalità aeereo"</string>
+    <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modalità aereo non attiva"</string>
     <string name="safeMode" msgid="2788228061547930246">"Modalità provvisoria"</string>
     <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
     <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servizi che prevedono un costo"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index c278e65..40757b1 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"電源を切る"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"シャットダウン中..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"携帯電話の電源を切ります。"</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"最近使ったアプリケーションはありません。"</string>
     <string name="global_actions" msgid="2406416831541615258">"携帯電話オプション"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"画面ロック"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 7ad261d..7c5b392 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -47,8 +47,8 @@
     <string name="invalidPin" msgid="3850018445187475377">"4~ 8자리 숫자로 된 PIN을 입력하세요."</string>
     <string name="needPuk" msgid="919668385956251611">"SIM 카드의 PUK가 잠겨 있습니다. 잠금해제하려면 PUK 코드를 입력하세요."</string>
     <string name="needPuk2" msgid="4526033371987193070">"SIM 카드 잠금을 해제하려면 PUK2를 입력하세요."</string>
-    <string name="ClipMmi" msgid="6952821216480289285">"수신 발신자 번호"</string>
-    <string name="ClirMmi" msgid="7784673673446833091">"발신 발신자 번호"</string>
+    <string name="ClipMmi" msgid="6952821216480289285">"발신자 번호"</string>
+    <string name="ClirMmi" msgid="7784673673446833091">"내 발신 번호"</string>
     <string name="CfMmi" msgid="5123218989141573515">"착신전환"</string>
     <string name="CwMmi" msgid="9129678056795016867">"통화중 대기"</string>
     <string name="BaMmi" msgid="455193067926770581">"착발신 제한"</string>
@@ -79,8 +79,8 @@
     <string name="serviceClassData" msgid="872456782077937893">"데이터"</string>
     <string name="serviceClassFAX" msgid="5566624998840486475">"팩스"</string>
     <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
-    <string name="serviceClassDataAsync" msgid="4523454783498551468">"비동기"</string>
-    <string name="serviceClassDataSync" msgid="7530000519646054776">"동기화"</string>
+    <string name="serviceClassDataAsync" msgid="4523454783498551468">"비동기식"</string>
+    <string name="serviceClassDataSync" msgid="7530000519646054776">"동기식"</string>
     <string name="serviceClassPacket" msgid="6991006557993423453">"패킷"</string>
     <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
     <string name="roamingText0" msgid="7170335472198694945">"로밍 표시기 사용"</string>
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"종료"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"종료 중..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"휴대전화가 종료됩니다."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"최신 응용프로그램이 아닙니다."</string>
     <string name="global_actions" msgid="2406416831541615258">"휴대전화 옵션"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"화면 잠금"</string>
@@ -141,9 +143,9 @@
     <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"무음 모드"</string>
     <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"소리 꺼짐"</string>
     <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"소리 켜짐"</string>
-    <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"비행 모드"</string>
-    <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"비행 모드 사용"</string>
-    <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"비행 모드 사용 안함"</string>
+    <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"비행기 모드"</string>
+    <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"비행기 모드 사용"</string>
+    <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"비행기 모드 사용 안함"</string>
     <string name="safeMode" msgid="2788228061547930246">"안전 모드"</string>
     <string name="android_system_label" msgid="6577375335728551336">"Android 시스템"</string>
     <string name="permgrouplab_costMoney" msgid="5429808217861460401">"요금이 부과되는 서비스"</string>
@@ -201,11 +203,11 @@
     <string name="permlab_forceStopPackages" msgid="1447830113260156236">"다른 응용프로그램 강제 종료"</string>
     <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"응용프로그램이 다른 응용프로그램을 강제로 종료할 수 있도록 합니다."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"강제로 응용프로그램 닫기"</string>
-    <string name="permdesc_forceBack" msgid="6534109744159919013">"응용프로그램이 포그라운드에 있는 활동을 강제로 닫고 되돌아갈 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_forceBack" msgid="6534109744159919013">"응용프로그램이 포그라운드에 있는 활동을 강제로 닫고 되돌아갈 수 있도록 합니다. 일반 응용프로그램에는 절대로 필요하지 않습니다."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"시스템 내부 상태 검색"</string>
     <string name="permdesc_dump" msgid="2198776174276275220">"응용프로그램이 시스템의 내부 상태를 검색할 수 있도록 합니다. 단, 악성 응용프로그램이 이 기능을 이용하여 일반적으로 필요하지 않은 다양한 개인정보와 보안정보를 검색할 수 있습니다."</string>
     <string name="permlab_shutdown" msgid="7185747824038909016">"부분 종료"</string>
-    <string name="permdesc_shutdown" msgid="7046500838746291775">"작업 관리자를 종료 상태로 설정하며 전체 종료를 수행하지 않습니다."</string>
+    <string name="permdesc_shutdown" msgid="7046500838746291775">"작업 관리자를 종료 상태로 설정합니다. 전체 종료를 수행하지는 않습니다."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"응용프로그램 전환 방지"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"사용자가 다른 응용프로그램으로 전환하지 못하게 합니다."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"실행 중인 모든 응용프로그램 모니터링 및 제어"</string>
@@ -213,15 +215,15 @@
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"패키지 제거 브로드캐스트 보내기"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"응용프로그램이 응용프로그램 패키지가 삭제되었다는 알림을 브로드캐스트할 수 있도록 합니다. 이 경우 악성 응용프로그램이 실행 중인 다른 응용프로그램을 중지시킬 수 있습니다."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS 수신 브로드캐스트 보내기"</string>
-    <string name="permdesc_broadcastSmsReceived" msgid="9122419277306740155">"응용프로그램이 SMS 메시지를 받았다는 알림을 브로드캐스트할 수 있도록 합니다. 이 경우 악성 응용프로그램이 들어오는 SMS 메시지처럼 위장할 수 있습니다."</string>
+    <string name="permdesc_broadcastSmsReceived" msgid="9122419277306740155">"응용프로그램이 SMS 메시지를 받았다는 알림을 브로드캐스트할 수 있도록 합니다. 이 경우 악성 응용프로그램이 수신된 SMS 메시지처럼 위장할 수 있습니다."</string>
     <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-수신 브로드캐스트 보내기"</string>
     <string name="permdesc_broadcastWapPush" msgid="3955303669461378091">"응용프로그램이 WAP PUSH 메시지를 받았다는 알림을 브로드캐스트할 수 있도록 합니다. 이 경우 악성 응용프로그램이 MMS 메시지를 받은 것처럼 위장하거나 웹페이지의 콘텐츠를 악성 변종으로 몰래 바꿀 수 있습니다."</string>
     <string name="permlab_setProcessLimit" msgid="2451873664363662666">"실행 중인 프로세스 수 제한"</string>
-    <string name="permdesc_setProcessLimit" msgid="7824786028557379539">"응용프로그램이 실행할 최대 프로세스 수를 제어할 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_setProcessLimit" msgid="7824786028557379539">"응용프로그램이 실행할 최대 프로세스 수를 제어할 수 있도록 합니다. 일반 응용프로그램에는 절대로 필요하지 않습니다."</string>
     <string name="permlab_setAlwaysFinish" msgid="5342837862439543783">"모든 백그라운드 응용프로그램이 닫히도록 하기"</string>
-    <string name="permdesc_setAlwaysFinish" msgid="8773936403987091620">"응용프로그램이 백그라운드로 이동한 활동을 항상 바로 종료할지 여부를 제어할 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_setAlwaysFinish" msgid="8773936403987091620">"응용프로그램이 백그라운드로 이동한 활동을 항상 바로 종료할지 여부를 제어할 수 있도록 합니다. 일반 응용프로그램에는 절대로 필요하지 않습니다."</string>
     <string name="permlab_batteryStats" msgid="7863923071360031652">"배터리 통계 수정"</string>
-    <string name="permdesc_batteryStats" msgid="5847319823772230560">"수집된 배터리 통계를 수정할 수 있도록 합니다. 일반 응용프로그램에서는 사용할 수 없습니다."</string>
+    <string name="permdesc_batteryStats" msgid="5847319823772230560">"수집된 배터리 통계를 수정할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_backup" msgid="470013022865453920">"시스템 백업 및 복원 관리"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"응용프로그램이 시스템의 백업 및 복원 매커니즘을 제어할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"인증되지 않은 창 표시"</string>
@@ -231,23 +233,23 @@
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"전체 애니메이션 속도 수정"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"응용프로그램이 언제든지 전체 애니메이션 속도를 빠르게 또는 느리게 변경할 수 있도록 합니다."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"응용프로그램 토큰 관리"</string>
-    <string name="permdesc_manageAppTokens" msgid="977127907524195988">"응용프로그램이 일반적인 Z-순서를 무시하여 자체 토큰을 만들고 관리할 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_manageAppTokens" msgid="977127907524195988">"응용프로그램이 일반적인 Z-순서를 무시하여 자체 토큰을 만들고 관리할 수 있도록 합니다. 일반 응용프로그램에는 절대로 필요하지 않습니다."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"키 및 컨트롤 버튼 누르기"</string>
     <string name="permdesc_injectEvents" msgid="3946098050410874715">"응용프로그램이 입력 이벤트(예: 키 누름)를 다른 응용프로그램에 전달할 수 있도록 합니다. 이 경우 악성 응용프로그램이 휴대전화를 완전히 제어할 수 있습니다."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"사용자가 입력한 내용 및 수행한 작업 기록"</string>
-    <string name="permdesc_readInputState" msgid="5132879321450325445">"응용프로그램이 다른 응용프로그램과 상호작용할 때에도 사용자가 누르는 키(예: 비밀번호 입력)를 볼 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
-    <string name="permlab_bindInputMethod" msgid="3360064620230515776">"입력 방법 고정"</string>
-    <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"보유자가 입력 방법의 최상위 인터페이스만 사용하도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
-    <string name="permlab_bindWallpaper" msgid="8716400279937856462">"배경화면만 사용"</string>
-    <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"보유자가 배경화면의 최상위 인터페이스만 사용하도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_readInputState" msgid="5132879321450325445">"응용프로그램이 다른 응용프로그램과 상호작용할 때에도 사용자가 누르는 키(예: 비밀번호 입력)를 볼 수 있도록 합니다. 일반 응용프로그램에는 절대로 필요하지 않습니다."</string>
+    <string name="permlab_bindInputMethod" msgid="3360064620230515776">"입력 방법 연결"</string>
+    <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"권한을 가진 프로그램이 입력 방법에 대한 최상위 인터페이스를 사용하도록 합니다. 일반 응용프로그램에는 절대로 필요하지 않습니다."</string>
+    <string name="permlab_bindWallpaper" msgid="8716400279937856462">"배경화면 연결"</string>
+    <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"권한을 가진 프로그램이 배경화면에 대한 최상위 인터페이스를 사용하도록 합니다. 일반 응용프로그램에는 절대로 필요하지 않습니다."</string>
     <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"기기 관리자와 상호 작용"</string>
-    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"보유자가 기기 관리자에게 인텐트를 보낼 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"보유자가 기기 관리자에게 인텐트를 보낼 수 있도록 합니다. 일반 응용프로그램에는 절대로 필요하지 않습니다."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"화면 방향 변경"</string>
-    <string name="permdesc_setOrientation" msgid="6335814461615851863">"응용프로그램이 언제든지 화면 회전을 변경할 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
-    <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"응용프로그램에 Linux 신호 보내기"</string>
-    <string name="permdesc_signalPersistentProcesses" msgid="3565530463215015289">"응용프로그램이 제공된 신호를 모든 영구 프로세스로 보내도록 요청할 수 있도록 합니다."</string>
+    <string name="permdesc_setOrientation" msgid="6335814461615851863">"응용프로그램이 언제든지 화면 회전을 변경할 수 있도록 합니다. 일반 응용프로그램에는 절대로 필요하지 않습니다."</string>
+    <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"응용프로그램에 Linux 시그널 보내기"</string>
+    <string name="permdesc_signalPersistentProcesses" msgid="3565530463215015289">"응용프로그램이 제공된 시그널을 모든 영구 프로세스로 보내도록 요청할 수 있도록 합니다."</string>
     <string name="permlab_persistentActivity" msgid="8659652042401085862">"응용프로그램이 항상 실행되도록 설정"</string>
-    <string name="permdesc_persistentActivity" msgid="5037199778265006008">"응용프로그램이 연결된 일부 구성 요소를 지속하여 다른 응용프로그램에 사용할 수 없도록 합니다."</string>
+    <string name="permdesc_persistentActivity" msgid="5037199778265006008">"응용프로그램이 자신의 일부 구성 요소를 지속가능으로 설정하여 다른 응용프로그램에 사용할 수 없도록 합니다."</string>
     <string name="permlab_deletePackages" msgid="3343439331576348805">"응용프로그램 삭제"</string>
     <string name="permdesc_deletePackages" msgid="3634943677518723314">"응용프로그램이 Android 패키지를 삭제할 수 있도록 합니다. 이 경우 악성 응용프로그램이 중요한 응용프로그램을 삭제할 수 있습니다."</string>
     <string name="permlab_clearAppUserData" msgid="2192134353540277878">"다른 응용프로그램의 데이터 삭제"</string>
@@ -263,13 +265,13 @@
     <string name="permlab_movePackage" msgid="728454979946503926">"응용프로그램 리소스 이동"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"응용프로그램이 응용프로그램 리소스를 내부에서 외부 미디어로 또는 그 반대로 이동할 수 있도록 합니다."</string>
     <string name="permlab_readLogs" msgid="4811921703882532070">"시스템 로그 파일 읽기"</string>
-    <string name="permdesc_readLogs" msgid="2257937955580475902">"응용프로그램이 시스템의 다양한 로그 파일을 읽을 수 있도록 합니다. 이 경우 응용프로그램은 사용자가 휴대전화로 수행하는 작업에 대한 일반적인 정보를 검색할 수 있지만 여기에 개인정보는 포함되어서는 안 됩니다."</string>
-    <string name="permlab_diagnostic" msgid="8076743953908000342">"진단 그룹 소유의 리소스 읽기/작성"</string>
+    <string name="permdesc_readLogs" msgid="2257937955580475902">"응용프로그램이 시스템의 다양한 로그 파일을 읽을 수 있도록 합니다. 이 경우 응용프로그램은 사용자가 휴대전화로 수행하는 작업에 대한 일반적인 정보를 검색할 수 있습니다. 하지만 로그 파일에 어떠한 개인정보도 포함되어서는 안 됩니다."</string>
+    <string name="permlab_diagnostic" msgid="8076743953908000342">"진단 그룹 소유의 리소스 읽기/쓰기"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"응용프로그램이 진단 그룹 소유의 리소스(예: /dev에 있는 파일)를 읽고 쓸 수 있도록 합니다. 이 기능은 시스템 안정성 및 보안에 영향을 미칠 수 있으므로 제조업체 또는 사업자가 하드웨어 관련 진단을 수행하는 경우에만 사용해야 합니다."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"응용프로그램 구성 요소 사용 또는 사용 안함"</string>
     <string name="permdesc_changeComponentState" msgid="4569107043246700630">"응용프로그램이 다른 응용프로그램 구성 요소 사용 여부를 변경할 수 있도록 합니다. 이 경우 악성 응용프로그램이 중요한 휴대전화 기능을 사용하지 않도록 설정할 수 있습니다. 이 권한을 설정할 경우 응용프로그램 구성 요소가 사용 불가능하게 되거나 일관성이 맞지 않거나 불안정해질 수 있으므로 주의해야 합니다."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"기본 응용프로그램 설정"</string>
-    <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"응용프로그램이 기본 응용프로그램을 수정할 수 있도록 합니다. 이 경우 악성 응용프로그램이 사용자의 개인 정보를 수집하기 위해 기존 응용프로그램을 스푸핑하여 실행되는 응용프로그램을 몰래 변경할 수 있습니다."</string>
+    <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"응용프로그램이 기본 응용프로그램을 수정할 수 있도록 합니다. 이 경우 악성 응용프로그램이 사용자의 개인 정보를 수집하기 위해 기존 응용프로그램으로 위장하도록 실행되는 응용프로그램을 몰래 변경할 수 있습니다."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"전체 시스템 설정 수정"</string>
     <string name="permdesc_writeSettings" msgid="838789419871034696">"응용프로그램이 시스템의 설정 데이터를 수정할 수 있도록 합니다. 이 경우 악성 응용프로그램이 시스템 구성을 손상시킬 수 있습니다."</string>
     <string name="permlab_writeSecureSettings" msgid="204676251876718288">"보안 시스템 설정 수정"</string>
@@ -278,8 +280,8 @@
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"응용프로그램이 Google 서비스 지도를 수정할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"부팅할 때 자동 시작"</string>
     <string name="permdesc_receiveBootCompleted" msgid="698336728415008796">"응용프로그램이 시스템 부팅이 끝난 후 바로 시작할 수 있도록 합니다. 이 경우 휴대전화가 시작하는 데 시간이 오래 걸리고 응용프로그램이 항상 실행되어 전체 휴대전화 속도가 느려질 수 있습니다."</string>
-    <string name="permlab_broadcastSticky" msgid="7919126372606881614">"남은 브로드캐스트 보내기"</string>
-    <string name="permdesc_broadcastSticky" msgid="1920045289234052219">"응용프로그램이 브로드캐스트가 끝난 후에 남은 브로드캐스트를 보낼 수 있도록 합니다. 이 경우 악성 응용프로그램이 휴대전화가 메모리를 너무 많이 사용하도록 하여 속도를 저하시키거나 불안정하게 만들 수 있습니다."</string>
+    <string name="permlab_broadcastSticky" msgid="7919126372606881614">"스티키 브로드캐스트 보내기"</string>
+    <string name="permdesc_broadcastSticky" msgid="1920045289234052219">"응용프로그램이 브로드캐스트가 끝난 후에도 유지되는 스티키 브로드캐스트(Sticky Broadcast)를 보낼 수 있도록 합니다. 이 경우 악성 응용프로그램이 휴대전화가 메모리를 너무 많이 사용하도록 하여 속도를 저하시키거나 불안정하게 만들 수 있습니다."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"연락처 데이터 읽기"</string>
     <string name="permdesc_readContacts" msgid="3371591512896545975">"응용프로그램이 휴대전화에 저장된 모든 연락처(주소) 데이터를 읽을 수 있도록 합니다. 이 경우 악성 응용프로그램이 데이터를 다른 사람에게 보낼 수 있습니다."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"연락처 데이터 작성"</string>
@@ -292,26 +294,26 @@
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"응용프로그램이 휴대전화에 저장된 모든 캘린더 일정을 읽을 수 있도록 합니다. 이 경우 악성 응용프로그램이 캘린더 일정을 다른 사람에게 보낼 수 있습니다."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"캘린더 일정 추가/수정 및 참석자에게 이메일 전송"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"응용프로그램이 캘린더에 일정을 추가하거나 변경할 수 있도록 합니다. 이렇게 하면 참석자에게 이메일을 보낼 수 있습니다. 악성 응용프로그램이 이를 사용하여 캘린더 일정을 삭제, 수정하거나 참석자에게 이메일을 보낼 수 있습니다."</string>
-    <string name="permlab_accessMockLocation" msgid="8688334974036823330">"테스트를 위해 위치 소스로 가장"</string>
-    <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"테스트용 가짜 위치 소스를 만듭니다. 단, 악성 응용프로그램이 이 기능을 이용하여 GPS, 네트워크 제공업체 같은 실제 위치 소스에서 반환한 위치 및/또는 상태를 덮어쓸 수 있습니다."</string>
+    <string name="permlab_accessMockLocation" msgid="8688334974036823330">"테스트를 위해 위치 정보제공자로 가장"</string>
+    <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"테스트용 가짜 위치 정보 제공자를 만듭니다. 단, 악성 응용프로그램이 이 기능을 이용하여 GPS, 네트워크 공급자 같은 실제 위치 정보제공자에서 반환한 위치 및/또는 상태를 덮어쓸 수 있습니다."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"추가 위치 제공업체 명령에 액세스"</string>
-    <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"추가 위치 제공업체 명령에 액세스합니다. 단, 악성 응용프로그램이 이 기능을 이용하여 GPS 또는 기타 위치 소스의 작동을 방해할 수 있습니다."</string>
+    <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"추가적인 위치 제공 명령을 사용합니다. 단, 악성 응용프로그램이 이 기능을 이용하여 GPS 또는 기타 위치 소스의 작동을 방해할 수 있습니다."</string>
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"위치 정보 공급자 설치 권한"</string>
-    <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"테스트용 가짜 위치 소스를 만듭니다. 단, 악성 응용프로그램이 이 기능을 이용하여 GPS, 네트워크 제공업체 같은 실제 위치 소스에서 반환한 위치 및/또는 상태를 덮어쓰거나 사용자의 위치를 모니터링하여 외부 소스로 보고할 수 있습니다."</string>
+    <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"테스트용 가짜 위치 정보제공자를 만듭니다. 단, 악성 응용프로그램이 이 기능을 이용하여 GPS, 네트워크 공급업체 같은 실제 위치 소스에서 반환한 위치 및/또는 상태를 덮어쓰거나 사용자의 위치를 모니터링하여 외부 소스로 보고할 수 있습니다."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"자세한 (GPS) 위치"</string>
-    <string name="permdesc_accessFineLocation" msgid="7411213317434337331">"가능한 경우 휴대전화에서 GPS(범지구 위치 측정 시스템) 등의 자세한 위치 소스에 액세스합니다. 이 경우 악성 응용프로그램이 사용자의 위치를 확인하고 추가 배터리 전원을 소비할 수 있습니다."</string>
-    <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"광범위한 네트워크 기반 위치"</string>
-    <string name="permdesc_accessCoarseLocation" msgid="8235655958070862293">"휴대전화의 대략적인 위치를 측정하기 위해 셀룰러 네트워크 데이터베이스와 같은 광범위한 위치 소스에 액세스합니다. 이 경우 악성 응용프로그램이 사용자의 위치를 대략적으로 측정할 수 있습니다."</string>
+    <string name="permdesc_accessFineLocation" msgid="7411213317434337331">"GPS 등의 자세한 위치 정보가 사용 가능한 경우 휴대전화에서 이를 사용합니다. 이 경우 악성 응용프로그램이 사용자의 위치를 확인하고 추가 배터리 전원을 소비할 수 있습니다."</string>
+    <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"네트워크 기반의 대략적인 위치"</string>
+    <string name="permdesc_accessCoarseLocation" msgid="8235655958070862293">"휴대전화의 대략적인 위치를 측정하기 위해 셀룰러 네트워크 데이터베이스와 같은 광범위한 위치 정보를 사용합니다. 이 경우 악성 응용프로그램이 사용자의 위치를 대략적으로 측정할 수 있습니다."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger 액세스"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"응용프로그램이 SurfaceFlinger의 하위 수준 기능을 사용할 수 있도록 합니다."</string>
     <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"프레임 버퍼 읽기"</string>
-    <string name="permdesc_readFrameBuffer" msgid="7530020370469942528">"응용프로그램이 프레임 버퍼의 콘텐츠를 읽을 수 있도록 합니다."</string>
+    <string name="permdesc_readFrameBuffer" msgid="7530020370469942528">"응용프로그램이 프레임 버퍼의 내용을 읽을 수 있도록 합니다."</string>
     <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"오디오 설정 변경"</string>
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"응용프로그램이 볼륨 및 경로 지정 같은 전체 오디오 설정을 수정할 수 있도록 합니다."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"오디오 녹음"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"응용프로그램이 오디오 레코드 경로에 액세스할 수 있도록 합니다."</string>
     <string name="permlab_camera" msgid="8059288807274039014">"사진 촬영"</string>
-    <string name="permdesc_camera" msgid="9013476258810982546">"응용프로그램이 카메라로 사진을 찍을 수 있도록 합니다. 이 경우 응용프로그램이 카메라에 표시되는 이미지를 언제든지 수집할 수 있습니다."</string>
+    <string name="permdesc_camera" msgid="9013476258810982546">"응용프로그램이 카메라로 사진을 찍을 수 있도록 합니다. 이 경우 응용프로그램이 카메라에 보여지는 화면을 언제든지 수집할 수 있습니다."</string>
     <string name="permlab_brick" msgid="8337817093326370537">"휴대전화를 영구적으로 사용 중지"</string>
     <string name="permdesc_brick" msgid="5569526552607599221">"응용프로그램이 휴대전화를 영구적으로 사용 중지할 수 있게 합니다. 이 기능은 매우 위험합니다."</string>
     <string name="permlab_reboot" msgid="2898560872462638242">"휴대전화 강제로 다시 부팅"</string>
@@ -319,7 +321,7 @@
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"파일시스템 마운트 및 마운트 해제"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"응용프로그램이 이동식 저장소의 파일 시스템을 마운트하고 마운트 해제할 수 있도록 합니다."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"외부 저장소 포맷"</string>
-    <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"응용프로그램이 제거 가능한 저장소를 포맷하도록 합니다."</string>
+    <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"응용프로그램이 이동식 저장소를 포맷할 수 있도록 합니다."</string>
     <string name="permlab_asec_access" msgid="1070364079249834666">"보안 저장소에 대한 정보 가져오기"</string>
     <string name="permdesc_asec_access" msgid="7691616292170590244">"응용프로그램이 보안 저장소의 정보를 가져올 수 있도록 합니다."</string>
     <string name="permlab_asec_create" msgid="7312078032326928899">"보안 저장소 만들기"</string>
@@ -332,26 +334,26 @@
     <string name="permdesc_asec_rename" msgid="1387881770708872470">"응용프로그램이 보안 저장소의 이름을 바꿀 수 있도록 합니다."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"진동 제어"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"응용프로그램이 진동을 제어할 수 있도록 합니다."</string>
-    <string name="permlab_flashlight" msgid="2155920810121984215">"손전등 제어"</string>
-    <string name="permdesc_flashlight" msgid="6433045942283802309">"응용프로그램이 손전등을 제어할 수 있도록 합니다."</string>
+    <string name="permlab_flashlight" msgid="2155920810121984215">"카메라 플래시 제어"</string>
+    <string name="permdesc_flashlight" msgid="6433045942283802309">"응용프로그램이 카메라 플래시를 제어할 수 있도록 합니다."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"하드웨어 테스트"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"응용프로그램이 하드웨어를 테스트할 목적으로 다양한 주변장치를 제어할 수 있도록 합니다."</string>
-    <string name="permlab_callPhone" msgid="3925836347681847954">"전화번호로 직접 전화걸기"</string>
+    <string name="permlab_callPhone" msgid="3925836347681847954">"전화번호 자동 연결"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"응용프로그램이 사용자의 조작 없이 전화번호로 전화를 걸 수 있도록 합니다. 이 경우 악성 응용프로그램으로 인해 예상치 못한 통화 요금이 부과될 수 있습니다. 이 권한으로 응용프로그램이 비상 전화를 걸게 할 수는 없습니다."</string>
-    <string name="permlab_callPrivileged" msgid="4198349211108497879">"전화번호로 직접 전화걸기"</string>
-    <string name="permdesc_callPrivileged" msgid="244405067160028452">"응용프로그램이 사용자의 조작 없이 비상 번호를 포함한 전화번호로 전화를 걸 수 있도록 합니다. 이 경우 악성 응용프로그램이 응급 서비스를 불필요하거나 불법적으로 호출할 수 있습니다."</string>
+    <string name="permlab_callPrivileged" msgid="4198349211108497879">"모든 전화번호 자동 연결"</string>
+    <string name="permdesc_callPrivileged" msgid="244405067160028452">"응용프로그램이 사용자의 조작 없이 비상 번호를 포함한 전화번호로 전화를 걸 수 있도록 합니다. 이 경우 악성 응용프로그램이 응급 서비스를 불필요하게 또는 불법적으로 호출할 수 있습니다."</string>
     <string name="permlab_performCdmaProvisioning" msgid="5604848095315421425">"직접 CDMA 전화 설정 시작"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"응용프로그램이 CDMA 프로비저닝을 시작할 수 있도록 합니다. 이 경우 악성 응용프로그램이 불필요하게 CDMA 프로비저닝을 시작할 수 있습니다."</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"위치 업데이트 알림 제어"</string>
     <string name="permdesc_locationUpdates" msgid="2300018303720930256">"무선의 위치 업데이트 알림을 사용하거나 사용 중지할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_checkinProperties" msgid="7855259461268734914">"체크인 속성 액세스"</string>
-    <string name="permdesc_checkinProperties" msgid="7150307006141883832">"체크인 서비스에서 업로드한 속성에 대한 읽기/쓰기 액세스를 허용합니다. 일반 응용프로그램에서는 사용할 수 없습니다."</string>
+    <string name="permdesc_checkinProperties" msgid="7150307006141883832">"체크인 서비스에서 업로드한 속성에 대한 읽기/쓰기 접근을 허용합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_bindGadget" msgid="776905339015863471">"위젯 선택"</string>
-    <string name="permdesc_bindGadget" msgid="2098697834497452046">"응용프로그램이 응용프로그램에서 사용할 수 있는 위젯을 시스템에 알릴 수 있도록 합니다. 이 권한을 갖는 응용프로그램은 개인 정보에 대한 액세스 권한을 다른 응용프로그램에 부여할 수 있습니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
+    <string name="permdesc_bindGadget" msgid="2098697834497452046">"응용프로그램이 어떤 응용프로그램에서 어떤 위젯을 사용할 수 있는 지를 시스템에 알릴 수 있도록 합니다. 이 권한을 갖는 응용프로그램은 개인 정보에 대한 액세스 권한을 다른 응용프로그램에 부여할 수 있습니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"휴대전화 상태 수정"</string>
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"응용프로그램이 장치의 휴대전화 기능을 제어할 수 있도록 합니다. 이 권한을 갖는 응용프로그램은 사용자에게 알리지 않고 네트워크를 전환하거나 휴대전화 무선 기능을 켜고 끄는 등의 작업을 수행할 수 있습니다."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"휴대전화 상태 및 ID 읽기"</string>
-    <string name="permdesc_readPhoneState" msgid="188877305147626781">"응용프로그램이 장치의 휴대전화 기능에 액세스할 수 있도록 합니다. 이 권한을 갖는 응용프로그램은 휴대전화의 전화번호 및 일련번호, 통화가 활성인지 여부, 해당 통화가 연결된 번호 등을 확인할 수 있습니다."</string>
+    <string name="permdesc_readPhoneState" msgid="188877305147626781">"응용프로그램이 장치의 휴대전화 기능에 접근할 수 있도록 합니다. 이 권한을 갖는 응용프로그램은 휴대전화의 전화번호 및 일련번호, 통화가 활성인지 여부, 해당 통화가 연결된 번호 등을 확인할 수 있습니다."</string>
     <string name="permlab_wakeLock" msgid="573480187941496130">"휴대전화가 절전 모드로 전환되지 않도록 설정"</string>
     <string name="permdesc_wakeLock" msgid="7584036471227467099">"응용프로그램이 휴대전화가 절전 모드로 전환되지 않도록 합니다."</string>
     <string name="permlab_devicePower" msgid="4928622470980943206">"휴대전화 전원 켜고 끄기"</string>
@@ -380,14 +382,14 @@
     <string name="permdesc_useCredentials" msgid="7416570544619546974">"응용프로그램이 인증 토큰을 요청하도록 합니다."</string>
     <string name="permlab_accessNetworkState" msgid="6865575199464405769">"네트워크 상태 보기"</string>
     <string name="permdesc_accessNetworkState" msgid="558721128707712766">"응용프로그램이 모든 네트워크의 상태를 볼 수 있도록 합니다."</string>
-    <string name="permlab_createNetworkSockets" msgid="9121633680349549585">"인터넷에 완전히 액세스"</string>
+    <string name="permlab_createNetworkSockets" msgid="9121633680349549585">"인터넷에 최대한 액세스"</string>
     <string name="permdesc_createNetworkSockets" msgid="4593339106921772192">"응용프로그램이 네트워크 소켓을 만들 수 있도록 합니다."</string>
-    <string name="permlab_writeApnSettings" msgid="7823599210086622545">"액세스포인트 이름 설정 쓰기"</string>
+    <string name="permlab_writeApnSettings" msgid="7823599210086622545">"액세스포인트 이름(APN) 설정 쓰기"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"응용프로그램이 APN의 프록시 및 포트 같은 APN 설정을 수정할 수 있도록 합니다."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"네트워크 연결 변경"</string>
     <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"응용프로그램이 네트워크 연결 상태를 변경할 수 있도록 합니다."</string>
-    <string name="permlab_changeTetherState" msgid="2702121155761140799">"연결 변경"</string>
-    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"응용프로그램이 연결된 네트워크의 연결 상태를 변경할 수 있도록 합니다."</string>
+    <string name="permlab_changeTetherState" msgid="2702121155761140799">"테러링 연결 변경"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"응용프로그램이 테더링된 네트워크의 연결 상태를 변경할 수 있도록 합니다."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"백그라운드 데이터 사용 설정 변경"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"응용프로그램이 백그라운드 데이터 사용 설정을 변경할 수 있도록 합니다."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"Wi-Fi 상태 보기"</string>
@@ -414,7 +416,7 @@
     <string name="permdesc_subscribedFeedsWrite" msgid="8121607099326533878">"응용프로그램이 현재 동기화된 피드를 수정할 수 있도록 합니다. 이 경우 악성 응용프로그램이 동기화된 피드를 변경할 수 있습니다."</string>
     <string name="permlab_readDictionary" msgid="432535716804748781">"사용자 정의 사전 읽기"</string>
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"응용프로그램이 사용자 사전에 보관되어 있는 비공개 단어, 이름 및 구문을 읽도록 합니다."</string>
-    <string name="permlab_writeDictionary" msgid="6703109511836343341">"상용자 정의 사전에 작성"</string>
+    <string name="permlab_writeDictionary" msgid="6703109511836343341">"사용자정의 사전에 작성"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"응용프로그램이 사용자 사전에 새 단어를 입력할 수 있도록 합니다."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"SD 카드 콘텐츠 수정/삭제"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"응용프로그램이 SD 카드에 쓸 수 있도록 합니다."</string>
@@ -548,7 +550,7 @@
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"SIM 카드를 삽입하세요."</string>
     <string name="emergency_calls_only" msgid="6733978304386365407">"긴급 통화만"</string>
     <string name="lockscreen_network_locked_message" msgid="143389224986028501">"네트워크 잠김"</string>
-    <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM 카드의 PUK가 잠겨 있습니다."</string>
+    <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM 카드가 PUK 잠김 상태입니다."</string>
     <string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"사용자 가이드를 참조하거나 고객지원팀에 문의하세요."</string>
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM 카드가 잠겨 있습니다."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM 카드 잠금해제 중..."</string>
@@ -787,7 +789,7 @@
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB 저장소 끄기"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"USB 저장소 끄기를 선택하세요."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"USB 저장소 사용 중"</string>
-    <string name="usb_storage_stop_message" msgid="3613713396426604104">"USB 저장소를 사용하지 않도록 설정하기 전에 컴퓨터에서 Android의 SD 카드를 마운트 해제(\'방출\')했는지 확인하시기 바랍니다."</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"USB 저장소를 사용하지 않도록 설정하기 전에 컴퓨터에서 Android의 SD 카드를 마운트 해제했는지(꺼냈는지) 확인하시기 바랍니다."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB 저장소 사용 안함"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"USB 저장소를 사용하지 않도록 설정하는 동안 문제가 발생했습니다. USB 호스트와 연결을 해제했는지 확인한 다음 다시 시도하세요."</string>
     <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB 저장소 사용"</string>
@@ -811,17 +813,17 @@
     <string name="ext_media_unmountable_notification_message" msgid="6902531775948238989">"SD 카드가 손상되었습니다. 카드를 다시 포맷해야 할 수 있습니다."</string>
     <string name="ext_media_badremoval_notification_title" msgid="6872152882604407837">"SD 카드가 예상치 않게 제거되었습니다."</string>
     <string name="ext_media_badremoval_notification_message" msgid="7260183293747448241">"데이터 손실을 피하려면 SD 카드를 제거하기 전에 마운트 해제합니다."</string>
-    <string name="ext_media_safe_unmount_notification_title" msgid="6729801130790616200">"SD 카드를 안전하게 제거할 수 있습니다."</string>
+    <string name="ext_media_safe_unmount_notification_title" msgid="6729801130790616200">"SD 카드 제거 가능"</string>
     <string name="ext_media_safe_unmount_notification_message" msgid="568841278138377604">"안전하게 SD 카드를 제거할 수 있습니다."</string>
-    <string name="ext_media_nomedia_notification_title" msgid="8902518030404381318">"SD 카드를 제거했습니다."</string>
-    <string name="ext_media_nomedia_notification_message" msgid="3870120652983659641">"SD 카드가 제거되었습니다. 새 카드를 넣으세요."</string>
+    <string name="ext_media_nomedia_notification_title" msgid="8902518030404381318">"SD 카드 없음"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="3870120652983659641">"SD 카드가 없습니다.  SD 카드를 넣으세요."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"일치하는 활동이 없습니다."</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"구성 요소 사용 통계 업데이트"</string>
-    <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"수집된 구성요소 사용 통계를 수정할 수 있는 권한을 부여합니다. 일반 응용프로그램은 이 권한을 사용할 수 없습니다."</string>
+    <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"수집된 구성요소 사용 통계를 수정할 수 있는 권한을 부여합니다. 일반 응용프로그램은 이 권한을 사용하지 않습니다."</string>
     <string name="permlab_copyProtectedData" msgid="1660908117394854464">"기본 컨테이너 서비스를 호출하여 콘텐츠를 복사할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permdesc_copyProtectedData" msgid="537780957633976401">"기본 컨테이너 서비스를 호출하여 콘텐츠를 복사할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"확대/축소하려면 두 번 탭하세요."</string>
-    <string name="gadget_host_error_inflating" msgid="2613287218853846830">"위젯을 확장하는 동안 오류가 발생했습니다."</string>
+    <string name="gadget_host_error_inflating" msgid="2613287218853846830">"위젯을 생성하는 과정(inflate)에 오류가 발생했습니다."</string>
     <string name="ime_action_go" msgid="8320845651737369027">"이동"</string>
     <string name="ime_action_search" msgid="658110271822807811">"검색"</string>
     <string name="ime_action_send" msgid="2316166556349314424">"전송"</string>
@@ -854,14 +856,10 @@
     <string name="description_star" msgid="2654319874908576133">"즐겨찾기"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"차량 모드 사용"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"차량 모드를 종료하려면 선택하세요."</string>
-    <string name="tethered_notification_title" msgid="8146103971290167718">"연결 사용중"</string>
+    <string name="tethered_notification_title" msgid="8146103971290167718">"테더링 사용중"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"구성하려면 터치하세요."</string>
-    <!-- no translation found for throttle_warning_notification_title (4890894267454867276) -->
-    <skip />
-    <!-- no translation found for throttle_warning_notification_message (2609734763845705708) -->
-    <skip />
-    <!-- no translation found for throttled_notification_title (6269541897729781332) -->
-    <skip />
-    <!-- no translation found for throttled_notification_message (4712369856601275146) -->
-    <skip />
+    <string name="throttle_warning_notification_title" msgid="4890894267454867276">"대용량의 무선 데이터 사용"</string>
+    <string name="throttle_warning_notification_message" msgid="2609734763845705708">"무선 데이터 사용량에 대해 알고 싶으면 터치하세요."</string>
+    <string name="throttled_notification_title" msgid="6269541897729781332">"무선 데이터 제한용량 초과"</string>
+    <string name="throttled_notification_message" msgid="4712369856601275146">"무선 데이터 사용량에 대해 알고 싶으면 터치하세요."</string>
 </resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 67910c6..62b7f67 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Slå av"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Avslutter…"</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Telefonen vil bli slått av."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Ingen nylig brukte applikasjoner."</string>
     <string name="global_actions" msgid="2406416831541615258">"Telefoninnstillinger"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Lås skjermen"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 741d942..04531ef 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Uitschakelen"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Uitschakelen..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Uw telefoon wordt uitgeschakeld."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Geen recente toepassingen."</string>
     <string name="global_actions" msgid="2406416831541615258">"Telefoonopties"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Schermvergrendeling"</string>
@@ -341,7 +343,7 @@
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"alle telefoonnummers rechtstreeks bellen"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Hiermee kan een toepassing elk telefoonnummer, inclusief alarmnummers, bellen zonder uw tussenkomst. Schadelijke toepassingen kunnen onnodige en illegale oproepen uitvoeren naar alarmdiensten."</string>
     <string name="permlab_performCdmaProvisioning" msgid="5604848095315421425">"meteen starten met CDMA-telefooninstelling"</string>
-    <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Hiermee kan de toepassing starten met CDMA-levering. Schadelijke toepassingen kunnen de CDMA-levering onnodig starten"</string>
+    <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Hiermee kan de toepassing starten met CDMA-provisioning. Schadelijke applicaties kunnen de CDMA-provisioning onnodig starten"</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"meldingen over locatie-updates beheren"</string>
     <string name="permdesc_locationUpdates" msgid="2300018303720930256">"Hiermee kunnen updatemeldingen voor locaties van de radio worden ingeschakeld/uitgeschakeld. Niet voor gebruik door normale toepassingen."</string>
     <string name="permlab_checkinProperties" msgid="7855259461268734914">"toegang tot checkin-eigenschappen"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index b2ee47d..93cce1f 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Wyłącz"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Wyłączanie..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Telefon zostanie wyłączony"</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Brak ostatnio używanych aplikacji."</string>
     <string name="global_actions" msgid="2406416831541615258">"Opcje telefonu"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Blokada ekranu"</string>
@@ -524,7 +526,7 @@
     <string name="orgTypeOther" msgid="3951781131570124082">"Inny"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Niestandardowy"</string>
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"przez <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
-    <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> za pośrednictwem: <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
+    <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> przez <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Wprowadź kod PIN"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Wprowadź hasło, aby odblokować"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Błędny kod PIN!"</string>
@@ -822,7 +824,7 @@
     <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Zezwala na wywoływanie domyślnej usługi kontenera w celu skopiowania zawartości. Opcja nie jest przeznaczona dla zwykłych aplikacji."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Dotknij dwukrotnie, aby sterować powiększeniem"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Błąd podczas wyodrębniania widżetu"</string>
-    <string name="ime_action_go" msgid="8320845651737369027">"Przejdź"</string>
+    <string name="ime_action_go" msgid="8320845651737369027">"OK"</string>
     <string name="ime_action_search" msgid="658110271822807811">"Szukaj"</string>
     <string name="ime_action_send" msgid="2316166556349314424">"Wyślij"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Dalej"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 6541ad3..251a82e 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Desligar"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"A encerrar..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"O seu telefone irá encerrar."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Nenhuma aplicação recente."</string>
     <string name="global_actions" msgid="2406416831541615258">"Opções do telefone"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Bloqueio de ecrã"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 3c350cc..79daeec 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Desligar"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Encerrando…"</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"O seu telefone será desligado."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Nenhum aplicativo recente."</string>
     <string name="global_actions" msgid="2406416831541615258">"Opções do telefone"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Bloquear tela"</string>
@@ -298,7 +300,7 @@
     <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"Acessa comandos extras do provedor de localização. Aplicativos maliciosos podem usar isso para interferir na operação do GPS ou de outras fontes de localização."</string>
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"autorização para instalar um provedor de localização"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Cria fontes de locais fictícios para teste. Aplicativos maliciosos podem usar isso para substituir o local e/ou o status retornado pelas fontes de locais reais como GPS ou provedores de rede ou para monitorar e informar sua localização para uma fonte externa."</string>
-    <string name="permlab_accessFineLocation" msgid="8116127007541369477">"Localização precisa (GPS)"</string>
+    <string name="permlab_accessFineLocation" msgid="8116127007541369477">"localização exata (GPS)"</string>
     <string name="permdesc_accessFineLocation" msgid="7411213317434337331">"Acessa fontes de localização precisa como o GPS (Global Positioning System) no telefone, onde disponível. Aplicativos maliciosos podem usar isso para determinar onde você está e podem consumir energia adicional da bateria."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"local aproximado (com base na rede)"</string>
     <string name="permdesc_accessCoarseLocation" msgid="8235655958070862293">"Acessa fontes de localização aproximada como o banco de dados de rede celular para determinar a localização aproximada de um telefone, onde disponível. Aplicativos maliciosos podem usar isso para determinar aproximadamente onde você está."</string>
@@ -358,10 +360,10 @@
     <string name="permdesc_devicePower" msgid="4577331933252444818">"Permite que o aplicativo ative ou desative o telefone."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"executar no modo de teste de fábrica"</string>
     <string name="permdesc_factoryTest" msgid="8136644990319244802">"Executa como um teste do fabricante de nível inferior, permitindo o acesso completo ao hardware do telefone. Disponível apenas quando um telefone está em execução no modo de teste do fabricante."</string>
-    <string name="permlab_setWallpaper" msgid="6627192333373465143">"definir papel de parede"</string>
-    <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Permite que o aplicativo defina o papel de parede do sistema."</string>
-    <string name="permlab_setWallpaperHints" msgid="3600721069353106851">"definir dicas de tamanho do papel de parede"</string>
-    <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Permite que o aplicativo defina as dicas de tamanho do papel de parede do sistema."</string>
+    <string name="permlab_setWallpaper" msgid="6627192333373465143">"definir plano de fundo"</string>
+    <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Permite que o aplicativo defina o plano de fundo do sistema."</string>
+    <string name="permlab_setWallpaperHints" msgid="3600721069353106851">"definir sugestões de tamanho do plano de fundo"</string>
+    <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Permite que o aplicativo defina as dimensões do tamanho do plano de fundo do sistema."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"redefinir o sistema para os padrões de fábrica"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Permite que um aplicativo redefina completamente o sistema para as configurações de fábrica, apagando todos os dados, configuração e aplicativos instalados."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"definir hora"</string>
@@ -562,7 +564,7 @@
     <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Nome de usuário (e-mail)"</string>
     <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Senha"</string>
     <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Fazer login"</string>
-    <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nome de usuário ou senha inválida."</string>
+    <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nome de usuário ou senha inválidos."</string>
     <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Verificando..."</string>
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Som ativado"</string>
@@ -842,8 +844,8 @@
     <string name="input_method_binding_label" msgid="1283557179944992649">"Método de entrada"</string>
     <string name="sync_binding_label" msgid="3687969138375092423">"Sincronizar"</string>
     <string name="accessibility_binding_label" msgid="4148120742096474641">"Acessibilidade"</string>
-    <string name="wallpaper_binding_label" msgid="1240087844304687662">"Papel de parede"</string>
-    <string name="chooser_wallpaper" msgid="7873476199295190279">"Alterar papel de parede"</string>
+    <string name="wallpaper_binding_label" msgid="1240087844304687662">"Plano de fundo"</string>
+    <string name="chooser_wallpaper" msgid="7873476199295190279">"Alterar plano de fundo"</string>
     <string name="pptp_vpn_description" msgid="2688045385181439401">"Protocolo de encapsulamento ponto a ponto"</string>
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Protocolo de encapsulamento de camada 2"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"VPN L2TP/IPSec com base em chave pré-compartilhada"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 03ce2b3..98f52548 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -127,18 +127,20 @@
     <string name="low_memory" msgid="6632412458436461203">"Память телефона заполнена! Удалите файлы, чтобы освободить место."</string>
     <string name="me" msgid="6545696007631404292">"Я"</string>
     <string name="power_dialog" msgid="1319919075463988638">"Параметры телефона"</string>
-    <string name="silent_mode" msgid="7167703389802618663">"Тихий режим"</string>
+    <string name="silent_mode" msgid="7167703389802618663">"Режим без звука"</string>
     <string name="turn_on_radio" msgid="3912793092339962371">"Включить беспроводную связь"</string>
     <string name="turn_off_radio" msgid="8198784949987062346">"Отключить беспроводное соединение"</string>
     <string name="screen_lock" msgid="799094655496098153">"Блокировка экрана"</string>
-    <string name="power_off" msgid="4266614107412865048">"Выключить связь"</string>
+    <string name="power_off" msgid="4266614107412865048">"Выключение"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Выключение..."</string>
-    <string name="shutdown_confirm" msgid="649792175242821353">"Телефон будет отключен."</string>
+    <string name="shutdown_confirm" msgid="649792175242821353">"Телефон будет выключен."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Нет последних приложений."</string>
     <string name="global_actions" msgid="2406416831541615258">"Параметры телефона"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Блокировка экрана"</string>
     <string name="global_action_power_off" msgid="4471879440839879722">"Отключить питание"</string>
-    <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Тихий режим"</string>
+    <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Режим без звука"</string>
     <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Звук ВЫКЛ"</string>
     <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Звук ВКЛЮЧЕН"</string>
     <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим полета"</string>
@@ -363,7 +365,7 @@
     <string name="permlab_setWallpaperHints" msgid="3600721069353106851">"давать рекомендации по размеру фоновых рисунков"</string>
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Позволяет данному приложению устанавливать советы по размеру фоновых рисунков."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"восстанавливать параметры системы по умолчанию, установленные на заводе-изготовителе"</string>
-    <string name="permdesc_masterClear" msgid="5033465107545174514">"Позволяет приложению восстановить стандартные настройки системы, удалив все данные, конфигурацию и установленные приложения."</string>
+    <string name="permdesc_masterClear" msgid="5033465107545174514">"Позволяет приложению восстановить заводские настройки системы, удалив все данные, конфигурацию и установленные приложения."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"установить время"</string>
     <string name="permdesc_setTime" msgid="667294309287080045">"Позволяет программе изменять время на телефоне."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"настраивать часовой пояс"</string>
@@ -414,8 +416,8 @@
     <string name="permdesc_subscribedFeedsWrite" msgid="8121607099326533878">"Позволяет приложению изменять синхронизированные каналы. Вредоносные приложения могут использовать эту возможность для изменения синхронизированных каналов."</string>
     <string name="permlab_readDictionary" msgid="432535716804748781">"выполнять чтение из пользовательского словаря"</string>
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Позволяет приложению считывать любые слова, имена и фразы личного пользования, которые могут храниться в пользовательском словаре."</string>
-    <string name="permlab_writeDictionary" msgid="6703109511836343341">"записывать в пользовательский словарь"</string>
-    <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Позволяет приложению записывать новые слова в пользовательский словарь."</string>
+    <string name="permlab_writeDictionary" msgid="6703109511836343341">"записывать в словарь пользователя"</string>
+    <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Позволяет приложению записывать новые слова в словарь пользователя."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"изменять/удалять содержание SD-карты"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Разрешает приложению запись на SD-карту"</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"получать доступ к кэшу файловой системы"</string>
@@ -487,11 +489,11 @@
     <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
     <string name="phoneTypeMain" msgid="6766137010628326916">"Основной"</string>
     <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Доп. факс"</string>
-    <string name="phoneTypeRadio" msgid="4093738079908667513">"Радио"</string>
+    <string name="phoneTypeRadio" msgid="4093738079908667513">"Радиотелефон"</string>
     <string name="phoneTypeTelex" msgid="3367879952476250512">"Телекс"</string>
     <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"Телетайп"</string>
-    <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Рабочий мобильный"</string>
-    <string name="phoneTypeWorkPager" msgid="649938731231157056">"Рабочий пейджер"</string>
+    <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Рабочий моб."</string>
+    <string name="phoneTypeWorkPager" msgid="649938731231157056">"Раб. пейджер"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Секретарь"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"День рождения"</string>
@@ -794,7 +796,7 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"При включении USB-накопителя некоторые используемые приложения могут прекратить работу и оставаться недоступными до отключения USB-накопителя."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Сбой операции USB-подключения"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"ОК"</string>
-    <string name="extmedia_format_title" msgid="8663247929551095854">"Форматировать карту SD"</string>
+    <string name="extmedia_format_title" msgid="8663247929551095854">"Очистить SD-карту"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Отформатировать карту SD? Все данные, находящиеся на карте, будут уничтожены."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Формат"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка по USB разрешена"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 6ea492f..9d8534f 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Stäng av"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Avslutar…"</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Din telefon stängs av."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Inga nya program."</string>
     <string name="global_actions" msgid="2406416831541615258">"Telefonalternativ"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Skärmlås"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index ee63b8e..50c0c12 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"Kapat"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Kapanıyor…"</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"Telefonunuz kapanacak."</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"Hiçbir yeni uygulama yok."</string>
     <string name="global_actions" msgid="2406416831541615258">"Telefon seçenekleri"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Ekran kilidi"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 002f62e..78b87e8 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"关机"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"正在关机..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"您的手机会关机。"</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"没有最近的应用程序。"</string>
     <string name="global_actions" msgid="2406416831541615258">"手机选项"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"屏幕锁定"</string>
@@ -498,7 +500,7 @@
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"周年纪念"</string>
     <string name="eventTypeOther" msgid="5834288791948564594">"活动"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"自定义"</string>
-    <string name="emailTypeHome" msgid="449227236140433919">"住宅"</string>
+    <string name="emailTypeHome" msgid="449227236140433919">"家用"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"单位"</string>
     <string name="emailTypeOther" msgid="2923008695272639549">"其他"</string>
     <string name="emailTypeMobile" msgid="119919005321166205">"手机"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 58b2ebb..1df18fa 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -134,6 +134,8 @@
     <string name="power_off" msgid="4266614107412865048">"關機"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"關機中..."</string>
     <string name="shutdown_confirm" msgid="649792175242821353">"手機即將關機。"</string>
+    <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+    <skip />
     <string name="no_recent_tasks" msgid="279702952298056674">"最近沒有存取應用程式。"</string>
     <string name="global_actions" msgid="2406416831541615258">"電話選項"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"螢幕鎖定"</string>
diff --git a/core/tests/coretests/src/android/util/PatternsTest.java b/core/tests/coretests/src/android/util/PatternsTest.java
index 957c593..b90c97b 100644
--- a/core/tests/coretests/src/android/util/PatternsTest.java
+++ b/core/tests/coretests/src/android/util/PatternsTest.java
@@ -74,6 +74,10 @@
         t = Patterns.WEB_URL.matcher("\uD604\uAE08\uC601\uC218\uC99D.kr").matches();
         assertTrue("Valid URL", t);
 
+        t = Patterns.WEB_URL.matcher("http://brainstormtech.blogs.fortune.cnn.com/2010/03/11/" +
+            "top-five-moments-from-eric-schmidt\u2019s-talk-in-abu-dhabi/").matches();
+        assertTrue("Valid URL", t);
+
         t = Patterns.WEB_URL.matcher("ftp://www.example.com").matches();
         assertFalse("Matched invalid protocol", t);
 
diff --git a/docs/html/guide/developing/device.jd b/docs/html/guide/developing/device.jd
index 22c099f..2e2d803 100644
--- a/docs/html/guide/developing/device.jd
+++ b/docs/html/guide/developing/device.jd
@@ -5,12 +5,6 @@
 <div id="qv">
   <h2>In this document</h2>
   <ol>
-    <li><a href="#devices">Available Devices</a>
-      <ol>
-        <li><a href="#consumer">Consumer devices</a></li>
-        <li><a href="#dev-phone-1">Android Dev Phone 1</a></li>
-      </ol>
-    </li>
     <li><a href="#setting-up">Setting up a Device for Development</a>
       <ol>
         <li><a href="#VendorIds">USB Vendor IDs</a></li>
@@ -21,101 +15,50 @@
   <ol>
     <li><a
     href="{@docRoot}sdk/win-usb.html">USB Driver for Windows</a></li>
+    <li><a
+href="{@docRoot}guide/developing/eclipse-adt.html">Developing in Eclipse, with ADT</a></li>
+    <li><a
+href="{@docRoot}guide/developing/other-ide.html">Developing in other IDEs</a></li>
   </ol>
 </div>
 </div>
 
-<p>When building mobile applications, it's vital to test them on real
-devices prior to releasing them to users. This page covers what you need to know, 
-including the types of devices that you can use, and how to set one up for
-developing and debugging.</p>
+<p>When building a mobile application, it's important that you always test your application on a
+real device before releasing it to users. This page describes how to set up your development
+environment and Android-powered device for testing and debugging on the device.</p>
 
+<p>You can use any Android-powered device as an environment for running,
+debugging, and testing your applications. The tools included in the SDK make it easy to install and
+run your application on the device each time you compile. You can install your application on the
+device <a
+href="{@docRoot}guide/developing/eclipse-adt.html#RunningOnDevice">directly from
+Eclipse</a> or <a href="{@docRoot}guide/developing/other-ide.html#RunningOnDevice">from the
+command line</a>. If
+you don't yet have a device, check with the service providers in your area to determine which
+Android-powered devices are available.</p>
 
-<h2 id="devices">Available Devices</h2>
-<p>Here are some options for obtaining devices capable of testing your applications.</p>
+<p>If you want a SIM-unlocked phone, then you might consider either an Android Dev Phone or the
+Google Nexus One. Both are SIM-unlocked so that you can use them on any GSM network using a SIM
+card. The Android Dev Phones also feature an unlocked bootloader so you can install custom system
+images (great for developing and installing custom versions of the Android platform). To purchase a
+Nexus One, visit <a href="http://www.google.com/phone">google.com/phone</a>. To purchase an Android
+Dev Phone, see the <a href="http://market.android.com/publish">Android Market</a> site
+(requires a developer account).</p>
 
-
-<h3 id="consumer">Consumer devices</h3>
-
-<p>It's likely that one of your local mobile carriers offers an Android-powered device.
-Any Android-powered device (even one bought from your mobile carrier) is a perfectly good
-device for running and testing your own Android applications.
-You can write applications using the Android SDK and then install them 
-directly onto the device for testing.</p>
-
-<p>Check with the service providers in your area to determine which Android-powered 
-devices are available.</p>
-
-<p>Be aware that consumer devices are not designed to allow system image updates by the
-user. If you're interested in manually updating the device with custom system images, then
-you'll need a developer device such as the <a href="#dev-phone-1">Android Dev Phone 1</a>.</p>
-
-
-
-<h3 id="dev-phone-1">Android Dev Phone 1</h3>
-
-<div class="sidebox-wrapper">
-<div class="sidebox">
-<p>Selected specs for Android Dev Phone 1:</p>
-<ul>
-<li>Touch screen</li>
-<li>Trackball</li>
-<li>3.2 megapixel camera with autofocus</li>
-<li>Wi-Fi</li>
-<li>GPS-enabled</li>
-<li>Bluetooth v2.0
-    <ul><li>Handsfree profile v1.5</li>
-        <li>Headset profile v1.0</li></ul></li>
-<li>3G WCDMA (1700/2100 MHz)</li>
-<li>Quad-band GSM (850/900/1800/1900 MHz)</li>
-<li>QWERTY slider keyboard</li>
-<li>Includes 1GB MicroSD card (can be replaced with up to 16GB card)</li>
-</ul>
-</div> 
-</div>
-
-<p>The Android Dev Phone 1 is a SIM-unlocked and hardware-unlocked device that
-is designed for advanced developers. The device ships with a system image that
-is fully compatible with Android 1.0, so you can rely on it when developing your
-applications. You can use any SIM in the device and can flash custom Android
-builds that will work with the unlocked bootloader. Unlike the bootloader on
-retail devices, the bootloader on the Android Dev Phone 1 does not enforce
-signed system images. The Android Dev Phone 1 should also appeal to developers 
-who live in geographies where local mobile carriers do not currently offer Android-powered devices. </p>
-
-<p>To purchase an Android Dev Phone 1 device, you must first register as an
-Android developer on the Android Market site, if you haven't done so already.
-Once you've logged into your developer account on Android Market, you can
-purchase the device by following the link to "Development phones." To accommodate demand,
-there is a limit of 1 device per developer account, for now.</p>
-
-<p>The device currently costs $399 (USD) (including free shipping in the US),
-and is available for purchase in 18 international markets, including the
-US, UK, Germany, Japan, India, Canada, France, Taiwan, Spain, Australia,
-Singapore, Switzerland, Netherlands, Austria, Sweden, Finland, Poland, and
-Hungary.  We will continue to expand this program into new geographies over
-time.  Check this page for updated information.</p>
-
-<p>Android Dev Phone 1 devices are <em>not</em> intended for
-non-developer end-users. Because the device can be configured with system
-software not provided by or supported by Google or any other company, end-users
-operate these devices at their own risk.</p>
-
-<p>Note that your Android Dev Phone 1 will not receive automated 
-over-the-air (OTA) updates for the system image. System updates must be flashed manually.
-See the HTC site for a guide to <a href="http://www.htc.com/www/support/android/adp.html">Flashing 
-your Android Dev Phone with a Factory System Image</a>.</p>
-
-<p>For full device specs and more information about obtaining an Android Dev 
-Phone 1 device, see the <a href="http://market.android.com/publish">Android 
-Market</a> site.</p>
-
+<p class="note"><strong>Note:</strong> When developing on a device, keep in mind that you should
+still use the <a
+href="{@docRoot}guide/developing/tools/emulator.html">Android emulator</a> to test your application
+on configurations that are not equivalent to those of your real device. Although the emulator
+does not allow you to test every device feature (such as the accelerometer), it does
+allow you to verify that your application functions properly on different versions of the Android
+platform, in different screen sizes and orientations, and more.</p>
 
 
 <h2 id="setting-up">Setting up a Device for Development</h2>
 
 <p>With an Android-powered device, you can develop and debug your Android applications just as you
-would on the emulator. There are just a few things to do before you can start.</p>
+would on the emulator. Before you can start, there are just a few things to do:</p>
+
 <ol>
   <li>Declare your application as "debuggable" in your Android Manifest.
     <p>In Eclipse, you can do this from the <b>Application</b> tab when viewing the Manifest
@@ -159,37 +102,70 @@
     </ul>
   </li>
 </ol>
-<p>You can verify that your device is connected by executing <code>adb devices</code> from your 
-SDK tools/ directory. If connected, you'll see the device name listed as a "device."</p>
-<p>If using Eclipse, select run or debug as usual. You will be presented
-with a <b>Device Chooser</b> dialog that lists the available emulator(s) and connected device(s).
-Select the device to install and run the application there.</p>
 
-<p>If using the <a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a> (adb), 
+<p>You can verify that your device is connected by executing <code>adb devices</code> from your 
+SDK {@code tools/} directory. If connected, you'll see the device name listed as a "device."</p>
+
+<p>If using Eclipse, run or debug as usual. You will be presented
+with a <b>Device Chooser</b> dialog that lists the available emulator(s) and connected device(s).
+Select the device upon which you want to install and run the application.</p>
+
+<p>If using the <a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a> (adb),
 you can issue commands with the <code>-d</code> flag to target your
 connected device.</p>
 
 
 <h3 id="VendorIds">USB Vendor IDs</h3>
 <p>This table provides a reference to the vendor IDs needed in order to add
-device support on Linux. The USB Vendor ID is the value given to the
-<code>SYSFS{idVendor}</code> property in the rules file.</p>
+USB device support on Linux. The USB Vendor ID is the value given to the
+<code>SYSFS{idVendor}</code> property in the rules file, as described in step 3, above.</p>
+
 <table>
   <tr>
     <th>Manufacturer</th><th>USB Vendor ID</th></tr>
   <tr>
-    <td>Acer</td><td>0502</td></tr>
+    <td>Acer</td>
+    <td><code>0502</code></td></tr>
   <tr>
-    <td>HTC</td><td>0bb4</td></tr>
+    <td>Dell</td>
+    <td><code>413c</code></td></tr>
   <tr>
-    <td>Huawei</td><td>12d1</td></tr>
+    <td>Foxconn</td>
+    <td><code>0489</code></td></tr>
   <tr>
-    <td>LG</td><td>1004</td></tr>
+    <td>Garmin-Asus</td>
+    <td><code>091E</code></td></tr>
   <tr>
-    <td>Motorola</td><td>22b8</td></tr>
+    <td>HTC</td>
+    <td><code>0bb4</code></td></tr>
   <tr>
-    <td>Samsung</td><td>04e8</td></tr>
+    <td>Huawei</td>
+    <td><code>12d1</code></td></tr>
   <tr>
-    <td>Sony Ericsson</td><td>0fce</td></tr>
+    <td>Kyocera</td>
+    <td><code>0482</code></td></tr>
+  <tr>
+    <td>LG</td>
+    <td><code>1004</code></td></tr>
+  <tr>
+    <td>Motorola</td>
+    <td><code>22b8</code></td></tr>
+  <tr>
+    <td>Nvidia</td>
+    <td><code>0955</code></td></tr>
+  <tr>
+    <td>Pantech</td>
+    <td><code>10A9</code></td></tr>
+  <tr>
+    <td>Samsung</td>
+    <td><code>04e8</code></td></tr>
+  <tr>
+    <td>Sharp</td>
+    <td><code>04dd</code></td></tr>
+  <tr>
+    <td>Sony Ericsson</td>
+    <td><code>0fce</code></td></tr>
+  <tr>
+    <td>ZTE</td>
+    <td><code>19D2</code></td></tr>
 </table>
-
diff --git a/docs/html/guide/developing/eclipse-adt.jd b/docs/html/guide/developing/eclipse-adt.jd
index c01745e..549e093 100644
--- a/docs/html/guide/developing/eclipse-adt.jd
+++ b/docs/html/guide/developing/eclipse-adt.jd
@@ -6,10 +6,11 @@
   <h2>In this document</h2>
   <ol>
     <li><a href="#CreatingAProject">Creating an Android Project</a></li>
+    <li><a href="#AVD">Creating an AVD</a></li>
     <li><a href="#Running">Running Your Application</a>
       <ol>
-        <li><a href="#CreatingAnAvd">Creating an AVD</a></li>
-        <li><a href="#RunningAnApplication">Running an application</a></li>
+        <li><a href="#RunningOnEmulator">Running on the emulator</a></li>
+        <li><a href="#RunningOnDevice">Running on a device</a></li>
       </ol>
     </li>
     <li><a href="#RunConfig">Creating a Custom Run Configuration</a></li>
@@ -27,7 +28,8 @@
 <ul>
   <li>It gives you access to other Android development tools from inside the Eclipse IDE. For 
 example, ADT lets you access the many capabilities of the DDMS tool: take screenshots, manage 
-port-forwarding, set breakpoints, and view thread and process information directly from Eclipse.</li>
+port-forwarding, set breakpoints, and view thread and process information directly from
+Eclipse.</li>
   <li>It provides a New Project Wizard, which helps you quickly create and set up all of the 
 basic files you'll need for a new Android application.</li>
   <li>It automates and simplifies the process of building your Android application.</li>
@@ -70,7 +72,7 @@
         The Build Target
         specifies which Android platform you'd like your application built against.
         <p>Unless you know that you'll be using new APIs introduced in the latest SDK, you should
-        select a target with the lowest platform version possible, such as Android 1.1.</p>
+        select a target with the lowest platform version possible.</p>
         <p class="note"><strong>Note:</strong> You can change your the Build Target for your 
         project at any time: Right-click the project in the Package Explorer, select
         <strong>Properties</strong>, select <strong>Android</strong> and then check 
@@ -89,7 +91,8 @@
             the minimum API Level required to properly run your application. 
             Entering this here automatically sets the <code>minSdkVersion</code> attribute in the 
             <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">&lt;uses-sdk&gt;</a>
-            of your Android Manifest file. If you're unsure of the appropriate API Level to use,
+            of your Android Manifest file. If you're unsure of the appropriate <a
+href="{@docRoot}guide/appendix/api-levels.html">API Level</a> to use,
             copy the API Level listed for the Build Target you selected in the Target tab.</li>
         </ul>
       </li>
@@ -133,87 +136,117 @@
   </dl>
 
 
-<h2 id="Running">Running Your Application</h2>
+<h2 id="AVD">Creating an AVD</h2>
 
-<p>Before you can run your application on the Android Emulator, 
-you <strong>must</strong> create an Android Virtual Device (AVD). 
-An AVD is a configuration that specifies the Android platform to be used on the emulator.
-You can read more in the <a href="{@docRoot}guide/developing/tools/avd.html">Android Virtual
-Devices</a> document, but if you just want to get started, follow the simple guide below to
-create an AVD.</p>
+<p>An Android Virtual Device (AVD) is a device configuration for the emulator that
+allows you to model real world devices. In order to run an instance of the emulator, you must create
+an AVD.</p>
 
-<p>If you will be running your applications only on actual device hardware, you do not 
-need an AVD &mdash; see 
-<a href="{@docRoot}guide/developing/device.html">Developing On a Device</a> for information
-on running your application.</p>
-
-<h3 id="CreatingAnAvd">Creating an AVD</h3>
-
-<p>With ADT 0.9.3 and above, the Android SDK and AVD Manager provides a simple graphical interface
-for creating and managing AVDs. (If you're using ADT version 0.9.1 or older, you must 
-use the <code>android</code> tool to create your AVDs&mdash;read the AVD guide to
-<a href="{@docRoot}guide/developing/tools/avd.html#creating">Creating an AVD</a>.)
-
-<p>To create an AVD with the AVD Manager:</p>
+<p>To create an AVD from Eclipse:</p>
 
 <ol>
-  <li>Select <strong>Window > Android SDK and AVD Manager</strong>, or click the Android SDK and AVD Manager icon (a black device)
-    in the Eclipse toolbar.</p>
+  <li>Select <strong>Window > Android SDK and AVD Manager</strong>, or click the Android SDK and
+AVD Manager icon in the Eclipse toolbar.</p>
   </li>
-  <li>In the Virtual Devices panel, you'll see a list of existing AVDs. Click <strong>New</strong>
-  to create a new AVD.</li>
-  <li>Fill in the details for the AVD. 
-    <p>Give it a name, a platform target, an SD card image (optional), and
+  <li>In the <em>Virtual Devices</em> panel, you'll see a list of existing AVDs. Click
+<strong>New</strong> to create a new AVD.</li>
+  <li>Fill in the details for the AVD.
+    <p>Give it a name, a platform target, an SD card size, and
     a skin (HVGA is default).</p>
+    <p class="note"><strong>Note:</strong> Be sure to define
+    a target for your AVD that satisfies your application's Build Target (the AVD
+    platform target must have an API Level equal to or greater than the API Level that your
+application compiles against).</p>
   </li>
   <li>Click <strong>Create AVD</strong>.</li>
 </ol>
 
-<p>Your AVD is now ready and you can close the AVD Manager. 
-In the next section, you'll see how the AVD is used
-when launching your application on an emulator.</p>
+<p>Your AVD is now ready and you can either close the SDK and AVD Manager, create more AVDs, or
+launch an emulator with the AVD by selecting a device and clicking <strong>Start</strong>.</p>
 
-<p>For more information about AVDs, read the 
+<p>For more information about AVDs, read the
 <a href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a>
 documentation.</p>
 
 
-<h3 id="RunningYourApplication">Running your application</h3>
+<h2 id="Running">Running Your Application</h2>
 
-<p class="note"><strong>Note:</strong> Before you can run your application, be sure that
-you have created an AVD with a target that satisfies your application's Build Target. 
-If an AVD cannot be found that meets the requirements of your Build Target, you will see
-a console error telling you so and the launch will be aborted.</p>
+<div class="sidebox-wrapper">
+<div class="sidebox">
+<h2>Use the Emulator to Test Different Configurations</h2>
+<p>Create multiple AVDs that each define a different device configuration with which your
+application is compatible, then launch each AVD into a new emulator from the SDK and AVD Manager.
+Set the target mode in your app's run configuration to manual, so that when you run your
+application, you can select from the available virtual devices.</p>
+</div>
+</div>
 
-<p>To run (or debug) your application, select <strong>Run</strong> &gt; <strong>Run</strong> (or 
-<strong>Run</strong> &gt; <strong>Debug</strong>) from the Eclipse main menu. The ADT plugin
-will automatically create a default launch configuration for the project.</p>
+<p>Running your application from Eclipse will usually require just a couple clicks, whether you're
+running it on the emulator or on an attached device. The information below describes how to get
+set up and run your application from Eclipse.</p>
 
-<p>When you choose to run or debug your application, Eclipse will perform the following:</p>
+<h3 id="RunningOnEmulator">Running on the emulator</h3>
+
+<p>Before you can run your application on the Android Emulator,
+you <strong>must</strong> <a href="#AVD">create an AVD</a>.</p>
+
+<p>To run (or debug) your application, select <strong>Run</strong> &gt; <strong>Run</strong> (or
+<strong>Run</strong> &gt; <strong>Debug</strong>) from the Eclipse menu bar. The ADT plugin
+will automatically create a default launch configuration for the project. Eclipse will then perform
+the following:</p>
 
 <ol>
   <li>Compile the project (if there have been changes since the last build).</li>
-  <li>Create a default launch configuration (if one does not already exist for the project).</li>
-  <li>Install and start the application on an emulator or device (based on the Deployment Target
-    defined by the run configuration).
-    <p>By default, Android application run configurations use an "automatic target" mode for 
-    selecting a device target. For information on how automatic target mode selects a 
-    deployment target, see <a href="#AutoAndManualTargetModes">Automatic and manual 
+  <li>Create a default launch configuration (if one does not already exist for the
+project).</li>
+  <li>Install and start the application on an emulator (or device), based on the Deployment
+Target
+    defined by the run configuration.
+    <p>By default, Android run configurations use an "automatic target" mode for
+    selecting a device target. For information on how automatic target mode selects a
+    deployment target, see <a href="#AutoAndManualTargetModes">Automatic and manual
     target modes</a> below.</p>
   </li>
 </ol>
 
-<p>If debugging, the application will start in the "Waiting For Debugger" mode. Once the 
+<p>If debugging, the application will start in the "Waiting For Debugger" mode. Once the
 debugger is attached, Eclipse will open the Debug perspective.</p>
 
-<p>To set or change the launch configuration used for your project, use the launch configuration manager. 
+<p>To set or change the launch configuration used for your project, use the launch configuration
+manager.
 See <a href="#launchconfig">Creating a Launch Configuration</a> for information.</p>
 
+<p>Be certain to create multiple AVDs upon which to test your application. You should have one AVD
+for each platform and screen type with which your application is compatible. For
+instance, if your application compiles against the Android 1.5 (API Level 3) platform, you should
+create an AVD for each platform equal to and greater than 1.5 and an AVD for each <a
+href="{@docRoot}guide/practices/screens_support.html">screen type</a> you support, then test
+your application on each one.</p>
+
+
+<h3 id="RunningOnDevice">Running on a device</h3>
+
+<p>Before you can run your application on a device, you must perform some basic setup for your
+device:</p>
+
+<ul>
+  <li>Declare your application as debuggable in your manifest</li>
+  <li>Enable USB Debugging on your device</li>
+  <li>Ensure that your development computer can detect your device when connected via USB</li>
+</ul>
+<p>Read <a href="{@docRoot}guide/developing/device.html#setting-up">Setting up a Device for
+Development</a> for more information.</p>
+
+<p>Once set up and your device is connected via USB, install your application on the device by
+selecting <strong>Run</strong> &gt; <strong>Run</strong> (or
+<strong>Run</strong> &gt; <strong>Debug</strong>) from the Eclipse menu bar.</p>
+
+
 
 <h2 id="RunConfig">Creating a Run Configuration</h2>
 
 <p>The run configuration specifies the project to run, the Activity 
-to start, the emulator options to use, and so on. When you first run a project
+to start, the emulator or connected device to use, and so on. When you first run a project
 as an <em>Android Application</em>, ADT will automatically create a run configuration.
 The default run configuration will
 launch the default project Activity and use automatic target mode for device selection 
@@ -240,7 +273,8 @@
     <ul>
       <li>To create a new configuration:
         <ol>
-          <li>Select <strong>Android Application</strong> and click the <em>New launch configuration</em>
+          <li>Select <strong>Android Application</strong> and click the <em>New launch
+configuration</em>
           icon above the list (or, right-click  <strong>Android Application</strong> and click 
           <strong>New</strong>).</li>
           <li>Enter a Name for your configuration.</li>
@@ -268,7 +302,8 @@
 
 <h3 id="AutoAndManualTargetModes">Automatic and manual target modes</h3>
 
-<p>By default, a run configuration uses the <strong>automatic</strong> target mode in order to select
+<p>By default, a run configuration uses the <strong>automatic</strong> target mode in order to
+select
 an AVD. In this mode, ADT will select an AVD for the application in the following manner:</p>
 
 <ol>
@@ -323,8 +358,8 @@
     information about packages and call class methods. You can also invoke arbitrary
     static methods: for example, entering <code>android.os.Debug.startMethodTracing()</code> will
     start dmTrace. </p>
-<p>Open a code execution window, select <strong>Window</strong>&gt;<strong>Show
-        View</strong>&gt;<strong>Display</strong> from the main menu to open the
+<p>Open a code execution window, select <strong>Window</strong> &gt; <strong>Show
+        View</strong> &gt; <strong>Display</strong> from the main menu to open the
         Display window, a simple text editor. Type your expression, highlight the
         text, and click the 'J' icon (or CTRL + SHIFT + D) to run your
         code. The code runs in the context of the selected thread, which must be
diff --git a/docs/html/guide/developing/other-ide.jd b/docs/html/guide/developing/other-ide.jd
index d043a7d..76b2d9f 100644
--- a/docs/html/guide/developing/other-ide.jd
+++ b/docs/html/guide/developing/other-ide.jd
@@ -13,7 +13,13 @@
         <li><a href="#ReleaseMode">Building in release mode</a></li>
       </ol>
     </li>
-    <li><a href="#Running">Running Your Application</a></li>
+    <li><a href="#AVD">Creating an AVD</a></li>
+    <li><a href="#Running">Running Your Application</a>
+      <ol>
+        <li><a href="#RunningOnEmulator">Running on the emulator</a></li>
+        <li><a href="#RunningOnDevice">Running on a device</a></li>
+      </ol>
+    </li>
     <li><a href="#AttachingADebugger">Attaching a Debugger to Your Application</a></li>
   </ol>
 
@@ -97,15 +103,20 @@
   to an Android platform library (including any add-ons, such as Google APIs) that you would like to
   build your project against. To see a list of available targets and their corresponding IDs, 
   execute: <code>android list targets</code>.</li>
-  <li><code>name</code> is the name for your project. This is optional. If provided, this name will be used
+  <li><code>name</code> is the name for your project. This is optional. If provided, this name will
+be used
   for your .apk filename when you build your application.</li>
   <li><code>path</code> is the location of your project directory. If the directory does not exist,
   it will be created for you.</li>
-  <li><code>activity</code> is the name for your default {@link android.app.Activity} class. This class file
+  <li><code>activity</code> is the name for your default {@link android.app.Activity} class. This
+class file
   will be created for you inside 
-  <code><em>&lt;path_to_your_project&gt;</em>/src/<em>&lt;your_package_namespace_path&gt;</em>/</code>.
+ 
+<code><em>&lt;path_to_your_project&gt;</em>/src/<em>&lt;your_package_namespace_path&gt;</em>/</code>
+.
   This will also be used for your .apk filename unless you provide a the <code>name</code>.</li>
-  <li><code>package</code> is the package namespace for your project, following the same rules as for
+  <li><code>package</code> is the package namespace for your project, following the same rules as
+for
   packages in the Java programming language.</li>
 </ul>
 
@@ -127,13 +138,16 @@
   <li><code>build.xml</code> - Build file for Ant.</li>
   <li><code>default.properties</code> - Properties for the build system. <em>Do not modify 
   this file</em>.</li>
-  <li><code>build.properties</code> - Customizable properties for the build system. You can edit this 
-  file to override default build settings used by Ant and provide a pointer to your keystore and key alias
+  <li><code>build.properties</code> - Customizable properties for the build system. You can edit
+this
+  file to override default build settings used by Ant and provide a pointer to your keystore and key
+alias
   so that the build tools can sign your application when built in release mode.</li>
   <li><code>src<em>/your/package/namespace/ActivityName</em>.java</code> - The Activity class 
   you specified during project creation.</li>
   <li><code>bin/</code>  - Output directory for the build script.</li>
-  <li><code>gen/</code>  - Holds <code>Ant</code>-generated files, such as <code>R.java</code>. </li>
+  <li><code>gen/</code>  - Holds <code>Ant</code>-generated files, such as <code>R.java</code>.
+</li>
   <li><code>libs/</code>  - Holds private libraries.</li>
   <li><code>res/</code>  - Holds project resources.</li>
   <li><code>src/</code>  - Holds source code.</li>
@@ -167,13 +181,15 @@
 <p>To update an existing Android project, open a command-line
 and navigate to the <code>tools/</code> directory of your SDK. Now run:</p>
 <pre>
-android update project --name <em>&lt;project_name&gt;</em> --target <em>&lt;target_ID&gt;</em> --path <em>path/to/your/project/</em>
+android update project --name <em>&lt;project_name&gt;</em> --target <em>&lt;target_ID&gt;</em>
+--path <em>&lt;path_to_your_project&gt;</em>
 </pre>
 
 <ul>
   <li><code>target</code> is the "build target" for your application. It corresponds to 
   an Android platform library (including any add-ons, such as Google APIs) that you would 
-  like to build your project against. To see a list of available targets and their corresponding IDs, 
+  like to build your project against. To see a list of available targets and their corresponding
+IDs,
   execute: <code>android list targets</code>.</li>
   <li><code>path</code> is the location of your project directory.</li>
   <li><code>name</code> is the name for the project. This is optional&mdash;if you're not 
@@ -218,7 +234,8 @@
 <p>Whether you're building in debug mode or release mode, you
 need to use the Ant tool to compile and build your project. This will create the .apk file
 that is installed onto the emulator or device. When you build in debug mode, the .apk
-file is automatically signed by the SDK tools with a debug key, so it's instantly ready for installation
+file is automatically signed by the SDK tools with a debug key, so it's instantly ready for
+installation
 (but only onto an emulator or attached development device).
 When you build in release mode, the .apk file is <em>unsigned</em>, so you must manually
 sign it with your own private key, using Keytool and Jarsigner.</p>
@@ -239,7 +256,7 @@
 <p class="note"><strong>Note:</strong> When installing JDK on Windows, the default is to install 
 in the "Program Files" directory. This location will cause <code>ant</code> to fail, because of 
 the space. To fix the problem, you can specify the JAVA_HOME variable like this: 
-<code>set JAVA_HOME=c:\Progra~1\Java\<jdkdir></code>. The easiest solution, however, is to 
+<code>set JAVA_HOME=c:\Progra~1\Java\&lt;jdkdir&gt;</code>. The easiest solution, however, is to
 install JDK in a non-space directory, for example: <code>c:\java\jdk1.6.0_02</code>.</p>
 
 
@@ -322,8 +339,10 @@
 <p class="caution"><strong>Caution:</strong> Due to the way Ant handles input, the password that
 you enter during the build process <strong>will be visible</strong>. If you are
 concerned about your keystore and alias password being visible on screen, then you
-may prefer to perform the application signing manually, via Jarsigner (or a similar tool). To instead 
-perform the signing procedure manually, <a href="#ManualReleaseMode">buid unsigned</a> and then continue 
+may prefer to perform the application signing manually, via Jarsigner (or a similar tool). To
+instead
+perform the signing procedure manually, <a href="#ManualReleaseMode">build unsigned</a> and then
+continue
 with <a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>.</p>
 
 <p>To specify your keystore and alias, open the project {@code build.properties} file (found in the
@@ -366,87 +385,125 @@
 (On your device, be sure you have enabled <em>Settings > Applications > Unknown sources</em>.)</p>
 
 
-<h2 id="Running">Running Your Application</h2>
+<h2 id="AVD">Creating an AVD</h2>
 
-<p>Unless you'll be running your application on device hardware, 
-you need to launch an emulator upon which you will install your application.
-An instance of the Android emulator runs a specific Android platform with specific device configuration
-settings. The platform and configuration is defined with an Android Virtual Device (AVD). 
-So before you can launch your emulator, you must define an AVD.</p>
+<p>An Android Virtual Device (AVD) is a device configuration for the emulator that
+allows you to model real world devices. In order to run an instance of the emulator, you must create
+an AVD.</p>
 
-<p>If you'll be running your application on device hardware, please read about
-<a href="{@docRoot}guide/developing/device.html">Developing On a Device</a> instead.</p>
+<p>To create an AVD using the SDK tools:</p>
 
 <ol>
-  <li><strong>Create an AVD</strong>
-    <ol>
-      <li>Open a command-line and navigate to your SDK package's 
-      <code>tools/</code> directory.</li>
-      <li>First, you need to select a "deployment target." To view available targets, execute:
-        <pre>android list targets</pre>
-        <p>This will output a list of available Android targets, such as:</p>
-<pre>
-id:1
-    Name: Android 1.1
-    Type: platform
-    API level: 2
-    Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
-id:2
-    Name: Android 1.5
-    Type: platform
-    API level: 3
-    Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
-</pre>
-        <p>Find the target that matches the Android platform upon which you'd like
-        to run your application. Note the integer value of the <code>id</code> &mdash;
-        you'll use this in the next step.</p>
-      </li>
-      <li>Create a new AVD using your selected deployment target:
-        <pre>android create avd --name <em>&lt;your_avd_name&gt;</em> --target <em>&lt;target_ID&gt;</em></pre>
-      <li>Next, you'll be asked whether you'd like to create a custom hardware profile.
-      If you respond "yes," you'll be presented with a series of prompts to define various aspects of the
-      device hardware (leave entries blank to use default values, which are shown in brackets). Otherwise,
-      press return to use all default values ("no" is the default).</li>
-      </li>
-    </ol>
+  <li>Navigate to your SDK's <code>tools/</code> directory and execute the {@code android}
+tool with no arguments:
+    <pre>android</pre>
+    <p>This will launch the SDK and AVD Manager GUI.</p>
+  </li>
+  <li>In the <em>Virtual Devices</em> panel, you'll see a list of existing AVDs. Click
+<strong>New</strong>
+  to create a new AVD.</li>
+  <li>Fill in the details for the AVD.
+    <p>Give it a name, a platform target, an SD card size, and
+    a skin (HVGA is default).</p>
+    <p class="note"><strong>Note:</strong> Be sure to define
+    a target for your AVD that satisfies your application's build target (the AVD
+    platform target must have an API Level equal to or greater than the API Level that your
+application compiles against).</p>
+  </li>
+  <li>Click <strong>Create AVD</strong>.</li>
+</ol>
+
+<p>Your AVD is now ready and you can either close the AVD Manager, create more AVDs, or
+launch an emulator with the AVD by clicking <strong>Start</strong>.</p>
+
+<p>For more information about AVDs, read the
+<a href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a>
+documentation.</p>
+
+
+<h2 id="Running">Running Your Application</h2>
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+<h2>Use the Emulator to Test Different Configurations</h2>
+<p>Create multiple AVDs that each define a different device configuration with which your
+application is compatible, then launch each AVD into a new emulator from the SDK and AVD Manager.
+Set the target mode in your app's run configuration to manual, so that when you run your
+application, you can select from the available virtual devices.</p>
+</div>
+</div>
+
+<p>Running your application on a virtual or real device takes just a couple steps. Remember to
+first <a href="#Building">build your application</a>.</p>
+
+<h3 id="RunningOnEmulator">Running on the emulator</h3>
+
+<p>Before you can run your application on the Android Emulator,
+you must <a href="#AVD">create an AVD</a>.</p>
+
+<p>To run your application:</p>
+<ol>
+  <li><strong>Open the SDK and AVD Manager and launch a virtual device</strong></li>
+    <p>From your SDK's <code>tools/</code> directory, execute the {@code android} tool with no
+arguments:
+    <pre>android</pre>
+    <p>In the <em>Virtual Devices</em> view, select an AVD and click <strong>Start</strong>.</p>
   </li>
 
-  <li><strong>Launch an emulator</strong></li>
-    <p>From your SDK's <code>tools/</code> directory, launch an emulator 
-      using an existing AVD (created above):
-    <pre>emulator -avd <em>&lt;your_avd_name&gt;</em></pre>
-    <p>An instance of the emulator will now launch, running the target and configuration 
-      defined by your AVD.</p>
-  </li>
-  
   <li><strong>Install your application</strong>
-    <p>From your SDK's <code>tools/</code> directory, install the .apk on the emulator:
-    <pre>adb install <em>/path/to/your/application</em>.apk</pre>
-    <p>If there is more than one emulator running, you must specify the emulator upon which to install
-    the application, by its serial number, with the <code>-s</code> option. For example:</p>
-    <pre>adb -s emulator-5554 install /my/project/path/myapp.apk</pre>
-  </li>
-  <li><strong>Open your application</strong>
-    <p>In the emulator, open the list of available applications to find 
-    and open your application.</p>
+    <p>From your SDK's <code>tools/</code> directory, install the {@code .apk} on the
+emulator:
+    <pre>adb install <em>&lt;path_to_your_bin&gt;</em>.apk</pre>
+    <p>Your APK file (signed with either a release or debug key) is in your project {@code bin/}
+directory after you <a href="#Building">build your application</a>.</p>
+    <p>If there is more than one emulator running, you must specify the emulator upon which to
+install the application, by its serial number, with the <code>-s</code> option. For example:</p>
+    <pre>adb -s emulator-5554 install <em>/path/to/your/app</em>.apk</pre>
+    <p>To see a list of available device serial numbers, execute {@code adb devices}.</p>
   </li>
 </ol>
 
-<p>If you don't see your application on the emulator. Try restarting the emulator
-(with the same AVD). Sometimes when you install an Activity for the
+<p>If you don't see your application on the emulator. Try closing the emulator and launching the
+virtual device again from the SDK and AVD Manager. Sometimes when you install an Activity for the
 first time, it won't show up in the application launcher or be accessible by other 
 applications. This is because the package manager usually examines manifests 
 completely only on emulator startup.</p>
 
-<p class="note"><strong>Tip:</strong> If you have only one emulator running, 
+<p>Be certain to create multiple AVDs upon which to test your application. You should have one AVD
+for each platform and screen type with which your application is compatible. For
+instance, if your application compiles against the Android 1.5 (API Level 3) platform, you should
+create an AVD for each platform equal to and greater than 1.5 and an AVD for each <a
+href="{@docRoot}guide/practices/screens_support.html">screen type</a> you support, then test
+your application on each one.</p>
+
+<p class="note"><strong>Tip:</strong> If you have <em>only one</em> emulator running,
 you can build your application and install it on the emulator in one simple step. 
 Navigate to the root of your project directory and use Ant to compile the project 
 with <em>install mode</em>:
-<code>ant install</code>. This will build your application, sign it with the debug key, 
-and install it on the currently running emulator.
-If there is more than one emulator currently running
-when using the <code>install</code> command, it will fail &mdash; it can't select between the 
-multiple emulators.</p>
+<code>ant install</code>. This will build your application, sign it with the debug key,
+and install it on the currently running emulator.</p>
+
+
+<h3 id="RunningOnDevice">Running on a device</h3>
+
+<p>Before you can run your application on a device, you must perform some basic setup for your
+device:</p>
+
+<ul>
+  <li>Declare your application as debuggable in your manifest</li>
+  <li>Enable USB Debugging on your device</li>
+  <li>Ensure that your development computer can detect your device when connected via USB</li>
+</ul>
+<p>Read <a href="{@docRoot}guide/developing/device.html#setting-up">Setting up a Device for
+Development</a> for more information.</p>
+
+<p>Once your device is set up and connected via USB, navigate to your
+SDK's <code>tools/</code> directory and install the <code>.apk</code> on the device:
+    <pre>adb -d install <em>/path/to/your/app</em>.apk</pre>
+    <p>The {@code -d} flag specifies that you want to use the attached device (in case you also
+have an emulator running).</p>
+
+
 
 <p>For more information on the tools used above, please see the following documents:</p>
 <ul>
diff --git a/docs/html/sdk/installing.jd b/docs/html/sdk/installing.jd
index 1099c3c..73190a0 100644
--- a/docs/html/sdk/installing.jd
+++ b/docs/html/sdk/installing.jd
@@ -361,7 +361,7 @@
 </tr>
 <tr>
 <td style="width:2em;border-bottom-color:white;"></td>
-<td colspan="2"><code>&lt;platform&gt;/</code></td>
+<td colspan="2"><code><em>&lt;platform&gt;</em>/</code></td>
 <td>Platform version directory, for example "android-1.6". All platform version 
 directories contain a similar set of files and subdirectory structure.</td>
 </tr>
@@ -439,11 +439,11 @@
 
 <p><strong>Set up the Hello World application</strong></p>
 <ul>
-  <li>If you have just installed the SDK for the first time, <a 
-  href="{@docRoot}resources/tutorials/hello-world.html">go to the Hello
+  <li>If you have just installed the SDK for the first time, go to the <a
+  href="{@docRoot}resources/tutorials/hello-world.html">Hello
   World tutorial</a>. The tutorial takes you step-by-step through the process
   of setting up your first Android project, including setting up an Android
-  Virtual Device (AVD) on which to run the application. 
+  Virtual Device (AVD) on which to run the application.
 </li>
 </ul>
 
@@ -473,6 +473,8 @@
   href="{@docRoot}guide/developing/eclipse-adt.html">in Eclipse/ADT</a> or
   <a href="{@docRoot}guide/developing/other-ide.html">in other IDEs</a>
   </li>
+  <li>Read <a href="{@docRoot}guide/developing/device.html">Developing on a Device</a> to set up an
+Android-powered device to run and test your application.</li>
 </ul>
 
 <p><strong>Follow the Notepad tutorial</strong></p>
diff --git a/services/java/com/android/server/NotificationPlayer.java b/services/java/com/android/server/NotificationPlayer.java
index acc4c85..0b1a03b 100644
--- a/services/java/com/android/server/NotificationPlayer.java
+++ b/services/java/com/android/server/NotificationPlayer.java
@@ -69,9 +69,9 @@
      * OnCompletionListener, to be called at the end of the playback, the MediaPlayer needs to
      * be created with a looper running so its event handler is not null.
      */
-    private final class PlayerCreationThread extends Thread {
+    private final class CreationAndCompletionThread extends Thread {
         public Command mCmd;
-        public PlayerCreationThread(Command cmd) {
+        public CreationAndCompletionThread(Command cmd) {
             super();
             mCmd = cmd;
         }
@@ -121,10 +121,19 @@
             //-----------------------------------
             // This is were we deviate from the AsyncPlayer implementation and create the
             // MediaPlayer in a new thread with which we're synchronized
-            PlayerCreationThread t = new PlayerCreationThread(cmd);
-            synchronized(t) {
-                t.start();
-                t.wait();
+            synchronized(mCompletionHandlingLock) {
+                // if another sound was already playing, it doesn't matter we won't get notified
+                // of the completion, since only the completion notification of the last sound
+                // matters
+                if((mLooper != null)
+                        && (mLooper.getThread().getState() != Thread.State.TERMINATED)) {
+                    mLooper.quit();
+                }
+                mCompletionThread = new CreationAndCompletionThread(cmd);
+                synchronized(mCompletionThread) {
+                    mCompletionThread.start();
+                    mCompletionThread.wait();
+                }
             }
             //-----------------------------------
 
@@ -169,7 +178,10 @@
                         mPlayer = null;
                         mAudioManager.abandonAudioFocus(null);
                         mAudioManager = null;
-                        mLooper.quit();
+                        if((mLooper != null)
+                                && (mLooper.getThread().getState() != Thread.State.TERMINATED)) {
+                            mLooper.quit();
+                        }
                     } else {
                         Log.w(mTag, "STOP command without a player");
                     }
@@ -195,10 +207,23 @@
         if (mAudioManager != null) {
             mAudioManager.abandonAudioFocus(null);
         }
+        // if there are no more sounds to play, end the Looper to listen for media completion
+        synchronized (mCmdQueue) {
+            if (mCmdQueue.size() == 0) {
+                synchronized(mCompletionHandlingLock) {
+                    if(mLooper != null) {
+                        mLooper.quit();
+                    }
+                    mCompletionThread = null;
+                }
+            }
+        }
     }
 
     private String mTag;
     private CmdThread mThread;
+    private CreationAndCompletionThread mCompletionThread;
+    private final Object mCompletionHandlingLock = new Object();
     private MediaPlayer mPlayer;
     private PowerManager.WakeLock mWakeLock;
     private AudioManager mAudioManager;
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index e9e83d9..24d645d 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -989,7 +989,7 @@
                     + "; regranting permissions for internal storage");
             mSettings.mInternalSdkPlatform = mSdkVersion;
             
-            updatePermissionsLP(null, null, true, regrantPermissions);
+            updatePermissionsLP(null, null, true, regrantPermissions, regrantPermissions);
 
             mSettings.writeLP();
 
@@ -3982,7 +3982,8 @@
     }
     
     private void updatePermissionsLP(String changingPkg,
-            PackageParser.Package pkgInfo, boolean grantPermissions, boolean replace) {
+            PackageParser.Package pkgInfo, boolean grantPermissions,
+            boolean replace, boolean replaceAll) {
         // Make sure there are no dangling permission trees.
         Iterator<BasePermission> it = mSettings.mPermissionTrees
                 .values().iterator();
@@ -4052,7 +4053,7 @@
         if (grantPermissions) {
             for (PackageParser.Package pkg : mPackages.values()) {
                 if (pkg != pkgInfo) {
-                    grantPermissionsLP(pkg, false);
+                    grantPermissionsLP(pkg, replaceAll);
                 }
             }
         }
@@ -4668,7 +4669,7 @@
                         if (p != null) {
                             synchronized (mPackages) {
                                 updatePermissionsLP(p.packageName, p,
-                                        p.permissions.size() > 0, false);
+                                        p.permissions.size() > 0, false, false);
                             }
                             addedPackage = p.applicationInfo.packageName;
                             addedUid = p.applicationInfo.uid;
@@ -5705,7 +5706,7 @@
                 // Restore of old package succeeded. Update permissions.
                 synchronized (mPackages) {
                     updatePermissionsLP(deletedPackage.packageName, deletedPackage,
-                            true, false);
+                            true, false, false);
                     mSettings.writeLP();
                 }
                 Slog.i(TAG, "Successfully restored package : " + pkgName + " after failed upgrade");
@@ -5822,7 +5823,7 @@
         }
         synchronized (mPackages) {
             updatePermissionsLP(newPackage.packageName, newPackage,
-                    newPackage.permissions.size() > 0, true);
+                    newPackage.permissions.size() > 0, true, false);
             res.name = pkgName;
             res.uid = newPackage.applicationInfo.uid;
             res.pkg = newPackage;
@@ -6217,7 +6218,7 @@
                         outInfo.removedUid = mSettings.removePackageLP(packageName);
                     }
                     if (deletedPs != null) {
-                        updatePermissionsLP(deletedPs.name, null, false, false);
+                        updatePermissionsLP(deletedPs.name, null, false, false, false);
                         if (deletedPs.sharedUser != null) {
                             // remove permissions associated with package
                             mSettings.updateSharedUserPermsLP(deletedPs, mGlobalGids);
@@ -6299,7 +6300,7 @@
             return false;
         }
         synchronized (mPackages) {
-            updatePermissionsLP(newPkg.packageName, newPkg, true, true);
+            updatePermissionsLP(newPkg.packageName, newPkg, true, true, false);
             mSettings.writeLP();
         }
         return true;
@@ -9686,7 +9687,7 @@
            
            // Make sure group IDs have been assigned, and any permission
            // changes in other apps are accounted for
-           updatePermissionsLP(null, null, true, regrantPermissions);
+           updatePermissionsLP(null, null, true, regrantPermissions, regrantPermissions);
            // Persist settings
            mSettings.writeLP();
        }
diff --git a/services/java/com/android/server/ThrottleService.java b/services/java/com/android/server/ThrottleService.java
index a1aa555..6a5bbd2 100644
--- a/services/java/com/android/server/ThrottleService.java
+++ b/services/java/com/android/server/ThrottleService.java
@@ -732,23 +732,25 @@
             checkForSubscriberId();
             boolean startNewPeriod = true;
 
-            // if we rolled back in time, toss out
-            // if we rolled foward, advance to the next
-            if (end.before(mPeriodStart)) {
+            if (start.equals(mPeriodStart) && end.equals(mPeriodEnd)) {
+                // same endpoints - keep collecting
                 if (DBG) {
-                    Slog.d(TAG, "next period (" + start.getTimeInMillis() + "," +
-                        end.getTimeInMillis() + ") - old start was " +
-                        mPeriodStart.getTimeInMillis() + ", wiping");
+                    Slog.d(TAG, "same period (" + start.getTimeInMillis() + "," +
+                            end.getTimeInMillis() +") - ammending data");
                 }
-                synchronized (mParent) {
-                    mPeriodRxData[mCurrentPeriod] = 0;
-                    mPeriodTxData[mCurrentPeriod] = 0;
-                }
-            } else if(start.after(mPeriodEnd)) {
+                startNewPeriod = false;
+            } else {
                 if (DBG) {
-                    Slog.d(TAG, "next period (" + start.getTimeInMillis() + "," +
-                            end.getTimeInMillis() + ") - old end was " +
-                            mPeriodEnd.getTimeInMillis() + ", following");
+                    if(start.equals(mPeriodEnd) || start.after(mPeriodEnd)) {
+                        Slog.d(TAG, "next period (" + start.getTimeInMillis() + "," +
+                                end.getTimeInMillis() + ") - old end was " +
+                                mPeriodEnd.getTimeInMillis() + ", following");
+                    } else {
+                        Slog.d(TAG, "new period (" + start.getTimeInMillis() + "," +
+                                end.getTimeInMillis() + ") replacing old (" +
+                                mPeriodStart.getTimeInMillis() + "," +
+                                mPeriodEnd.getTimeInMillis() + ")");
+                    }
                 }
                 synchronized (mParent) {
                     ++mCurrentPeriod;
@@ -756,12 +758,6 @@
                     mPeriodRxData[mCurrentPeriod] = 0;
                     mPeriodTxData[mCurrentPeriod] = 0;
                 }
-            } else {
-                startNewPeriod = false;
-                if (DBG) {
-                    Slog.d(TAG, "next period (" + start.getTimeInMillis() + "," +
-                            end.getTimeInMillis() + ") - we fit - ammending to last period");
-                }
             }
             setPeriodStart(start);
             setPeriodEnd(end);